mysticsymbolic.github.io/browser-main.js.map

8 wiersze
6.4 MiB

{
"version": 3,
"sources": ["../node_modules/base64-js/index.js", "../node_modules/ieee754/index.js", "../node_modules/buffer/index.js", "../lib/esbuild-shims.js", "../node_modules/object-assign/index.js", "../node_modules/react/cjs/react.production.min.js", "../node_modules/react/index.js", "../node_modules/scheduler/cjs/scheduler.production.min.js", "../node_modules/scheduler/index.js", "../node_modules/react-dom/cjs/react-dom.production.min.js", "../node_modules/react-dom/index.js", "../node_modules/tslib/tslib.js", "../node_modules/prop-types/lib/ReactPropTypesSecret.js", "../node_modules/prop-types/factoryWithThrowingShims.js", "../node_modules/prop-types/index.js", "../node_modules/react-side-effect/lib/index.js", "../node_modules/react-fast-compare/index.js", "../node_modules/classnames/index.js", "../vendor/bezier-js/index.js", "../node_modules/react-dom/cjs/react-dom-server.browser.production.min.js", "../node_modules/react-dom/server.browser.js", "../vendor/gif.js/gif.js", "../node_modules/colorspaces/colorspaces.js", "../node_modules/hsluv/hsluv.js", "../node_modules/@justfixnyc/util/get-html-element.ts", "../node_modules/@justfixnyc/util/assertions.ts", "../node_modules/@justfixnyc/util/index.ts", "../node_modules/avro-js/etc/browser/crypto.js", "../node_modules/avro-js/lib/utils.js", "../node_modules/has-symbols/shams.js", "../node_modules/has-symbols/index.js", "../node_modules/function-bind/implementation.js", "../node_modules/function-bind/index.js", "../node_modules/has/src/index.js", "../node_modules/get-intrinsic/index.js", "../node_modules/call-bind/index.js", "../node_modules/call-bind/callBound.js", "../node_modules/is-arguments/index.js", "../node_modules/is-generator-function/index.js", "../node_modules/foreach/index.js", "../node_modules/available-typed-arrays/index.js", "../node_modules/es-abstract/helpers/getOwnPropertyDescriptor.js", "../node_modules/is-typed-array/index.js", "../node_modules/which-typed-array/index.js", "../node_modules/util/support/types.js", "../node_modules/util/support/isBufferBrowser.js", "../node_modules/inherits/inherits_browser.js", "../node_modules/util/util.js", "../node_modules/avro-js/lib/schemas.js", "../node_modules/underscore/modules/_setup.js", "../node_modules/underscore/modules/restArguments.js", "../node_modules/underscore/modules/isObject.js", "../node_modules/underscore/modules/isNull.js", "../node_modules/underscore/modules/isUndefined.js", "../node_modules/underscore/modules/isBoolean.js", "../node_modules/underscore/modules/isElement.js", "../node_modules/underscore/modules/_tagTester.js", "../node_modules/underscore/modules/isString.js", "../node_modules/underscore/modules/isNumber.js", "../node_modules/underscore/modules/isDate.js", "../node_modules/underscore/modules/isRegExp.js", "../node_modules/underscore/modules/isError.js", "../node_modules/underscore/modules/isSymbol.js", "../node_modules/underscore/modules/isArrayBuffer.js", "../node_modules/underscore/modules/isFunction.js", "../node_modules/underscore/modules/_hasObjectTag.js", "../node_modules/underscore/modules/_stringTagBug.js", "../node_modules/underscore/modules/isDataView.js", "../node_modules/underscore/modules/isArray.js", "../node_modules/underscore/modules/_has.js", "../node_modules/underscore/modules/isArguments.js", "../node_modules/underscore/modules/isFinite.js", "../node_modules/underscore/modules/isNaN.js", "../node_modules/underscore/modules/constant.js", "../node_modules/underscore/modules/_createSizePropertyCheck.js", "../node_modules/underscore/modules/_shallowProperty.js", "../node_modules/underscore/modules/_getByteLength.js", "../node_modules/underscore/modules/_isBufferLike.js", "../node_modules/underscore/modules/isTypedArray.js", "../node_modules/underscore/modules/_getLength.js", "../node_modules/underscore/modules/_collectNonEnumProps.js", "../node_modules/underscore/modules/keys.js", "../node_modules/underscore/modules/isEmpty.js", "../node_modules/underscore/modules/isMatch.js", "../node_modules/underscore/modules/underscore.js", "../node_modules/underscore/modules/_toBufferView.js", "../node_modules/underscore/modules/isEqual.js", "../node_modules/underscore/modules/allKeys.js", "../node_modules/underscore/modules/_methodFingerprint.js", "../node_modules/underscore/modules/isMap.js", "../node_modules/underscore/modules/isWeakMap.js", "../node_modules/underscore/modules/isSet.js", "../node_modules/underscore/modules/isWeakSet.js", "../node_modules/underscore/modules/values.js", "../node_modules/underscore/modules/pairs.js", "../node_modules/underscore/modules/invert.js", "../node_modules/underscore/modules/functions.js", "../node_modules/underscore/modules/_createAssigner.js", "../node_modules/underscore/modules/extend.js", "../node_modules/underscore/modules/extendOwn.js", "../node_modules/underscore/modules/defaults.js", "../node_modules/underscore/modules/_baseCreate.js", "../node_modules/underscore/modules/create.js", "../node_modules/underscore/modules/clone.js", "../node_modules/underscore/modules/tap.js", "../node_modules/underscore/modules/toPath.js", "../node_modules/underscore/modules/_toPath.js", "../node_modules/underscore/modules/_deepGet.js", "../node_modules/underscore/modules/get.js", "../node_modules/underscore/modules/has.js", "../node_modules/underscore/modules/identity.js", "../node_modules/underscore/modules/matcher.js", "../node_modules/underscore/modules/property.js", "../node_modules/underscore/modules/_optimizeCb.js", "../node_modules/underscore/modules/_baseIteratee.js", "../node_modules/underscore/modules/iteratee.js", "../node_modules/underscore/modules/_cb.js", "../node_modules/underscore/modules/mapObject.js", "../node_modules/underscore/modules/noop.js", "../node_modules/underscore/modules/propertyOf.js", "../node_modules/underscore/modules/times.js", "../node_modules/underscore/modules/random.js", "../node_modules/underscore/modules/now.js", "../node_modules/underscore/modules/_createEscaper.js", "../node_modules/underscore/modules/_escapeMap.js", "../node_modules/underscore/modules/escape.js", "../node_modules/underscore/modules/_unescapeMap.js", "../node_modules/underscore/modules/unescape.js", "../node_modules/underscore/modules/templateSettings.js", "../node_modules/underscore/modules/template.js", "../node_modules/underscore/modules/result.js", "../node_modules/underscore/modules/uniqueId.js", "../node_modules/underscore/modules/chain.js", "../node_modules/underscore/modules/_executeBound.js", "../node_modules/underscore/modules/partial.js", "../node_modules/underscore/modules/bind.js", "../node_modules/underscore/modules/_isArrayLike.js", "../node_modules/underscore/modules/_flatten.js", "../node_modules/underscore/modules/bindAll.js", "../node_modules/underscore/modules/memoize.js", "../node_modules/underscore/modules/delay.js", "../node_modules/underscore/modules/defer.js", "../node_modules/underscore/modules/throttle.js", "../node_modules/underscore/modules/debounce.js", "../node_modules/underscore/modules/wrap.js", "../node_modules/underscore/modules/negate.js", "../node_modules/underscore/modules/compose.js", "../node_modules/underscore/modules/after.js", "../node_modules/underscore/modules/before.js", "../node_modules/underscore/modules/once.js", "../node_modules/underscore/modules/findKey.js", "../node_modules/underscore/modules/_createPredicateIndexFinder.js", "../node_modules/underscore/modules/findIndex.js", "../node_modules/underscore/modules/findLastIndex.js", "../node_modules/underscore/modules/sortedIndex.js", "../node_modules/underscore/modules/_createIndexFinder.js", "../node_modules/underscore/modules/indexOf.js", "../node_modules/underscore/modules/lastIndexOf.js", "../node_modules/underscore/modules/find.js", "../node_modules/underscore/modules/findWhere.js", "../node_modules/underscore/modules/each.js", "../node_modules/underscore/modules/map.js", "../node_modules/underscore/modules/_createReduce.js", "../node_modules/underscore/modules/reduce.js", "../node_modules/underscore/modules/reduceRight.js", "../node_modules/underscore/modules/filter.js", "../node_modules/underscore/modules/reject.js", "../node_modules/underscore/modules/every.js", "../node_modules/underscore/modules/some.js", "../node_modules/underscore/modules/contains.js", "../node_modules/underscore/modules/invoke.js", "../node_modules/underscore/modules/pluck.js", "../node_modules/underscore/modules/where.js", "../node_modules/underscore/modules/max.js", "../node_modules/underscore/modules/min.js", "../node_modules/underscore/modules/sample.js", "../node_modules/underscore/modules/shuffle.js", "../node_modules/underscore/modules/sortBy.js", "../node_modules/underscore/modules/_group.js", "../node_modules/underscore/modules/groupBy.js", "../node_modules/underscore/modules/indexBy.js", "../node_modules/underscore/modules/countBy.js", "../node_modules/underscore/modules/partition.js", "../node_modules/underscore/modules/toArray.js", "../node_modules/underscore/modules/size.js", "../node_modules/underscore/modules/_keyInObj.js", "../node_modules/underscore/modules/pick.js", "../node_modules/underscore/modules/omit.js", "../node_modules/underscore/modules/initial.js", "../node_modules/underscore/modules/first.js", "../node_modules/underscore/modules/rest.js", "../node_modules/underscore/modules/last.js", "../node_modules/underscore/modules/compact.js", "../node_modules/underscore/modules/flatten.js", "../node_modules/underscore/modules/difference.js", "../node_modules/underscore/modules/without.js", "../node_modules/underscore/modules/uniq.js", "../node_modules/underscore/modules/union.js", "../node_modules/underscore/modules/intersection.js", "../node_modules/underscore/modules/unzip.js", "../node_modules/underscore/modules/zip.js", "../node_modules/underscore/modules/object.js", "../node_modules/underscore/modules/range.js", "../node_modules/underscore/modules/chunk.js", "../node_modules/underscore/modules/_chainResult.js", "../node_modules/underscore/modules/mixin.js", "../node_modules/underscore/modules/underscore-array-methods.js", "../node_modules/underscore/modules/index.js", "../node_modules/underscore/modules/index-default.js", "../node_modules/avro-js/etc/deprecated/validator.js", "../node_modules/avro-js/etc/browser/avro.js", "../lib/browser-main.tsx", "../lib/firebase.tsx", "../node_modules/tslib/modules/index.js", "../node_modules/@firebase/util/src/constants.ts", "../node_modules/@firebase/util/src/assert.ts", "../node_modules/@firebase/util/src/crypt.ts", "../node_modules/@firebase/util/src/deepCopy.ts", "../node_modules/@firebase/util/src/deferred.ts", "../node_modules/@firebase/util/src/emulator.ts", "../node_modules/@firebase/util/src/environment.ts", "../node_modules/@firebase/util/src/errors.ts", "../node_modules/@firebase/util/src/json.ts", "../node_modules/@firebase/util/src/jwt.ts", "../node_modules/@firebase/util/src/obj.ts", "../node_modules/@firebase/util/src/query.ts", "../node_modules/@firebase/util/src/sha1.ts", "../node_modules/@firebase/util/src/subscribe.ts", "../node_modules/@firebase/util/src/validation.ts", "../node_modules/@firebase/util/src/utf8.ts", "../node_modules/@firebase/util/src/exponential_backoff.ts", "../node_modules/@firebase/util/src/formatters.ts", "../node_modules/@firebase/util/src/compat.ts", "../node_modules/@firebase/component/src/component.ts", "../node_modules/@firebase/component/src/constants.ts", "../node_modules/@firebase/component/src/provider.ts", "../node_modules/@firebase/component/src/component_container.ts", "../node_modules/@firebase/logger/src/logger.ts", "../node_modules/@firebase/app/src/platformLoggerService.ts", "../node_modules/@firebase/app/src/logger.ts", "../node_modules/@firebase/app/src/constants.ts", "../node_modules/@firebase/app/src/internal.ts", "../node_modules/@firebase/app/src/errors.ts", "../node_modules/@firebase/app/src/firebaseApp.ts", "../node_modules/@firebase/app/src/api.ts", "../node_modules/@firebase/app/src/registerCoreComponents.ts", "../node_modules/@firebase/app/src/index.ts", "../node_modules/firebase/app/index.ts", "../node_modules/firebase/auth/dist/index.esm.js", "../node_modules/@firebase/auth/dist/esm2017/index.js", "../node_modules/@firebase/auth/src/core/errors.ts", "../node_modules/@firebase/auth/src/core/util/log.ts", "../node_modules/@firebase/auth/src/core/util/assert.ts", "../node_modules/@firebase/auth/src/core/util/instantiator.ts", "../node_modules/@firebase/auth/src/core/auth/initialize.ts", "../node_modules/@firebase/auth/src/core/util/location.ts", "../node_modules/@firebase/auth/src/core/util/navigator.ts", "../node_modules/@firebase/auth/src/core/util/delay.ts", "../node_modules/@firebase/auth/src/core/util/emulator.ts", "../node_modules/@firebase/auth/src/core/util/fetch_provider.ts", "../node_modules/@firebase/auth/src/api/errors.ts", "../node_modules/@firebase/auth/src/api/index.ts", "../node_modules/@firebase/auth/src/api/account_management/account.ts", "../node_modules/@firebase/auth/src/core/util/time.ts", "../node_modules/@firebase/auth/src/core/user/id_token_result.ts", "../node_modules/@firebase/auth/src/core/user/invalidation.ts", "../node_modules/@firebase/auth/src/core/user/proactive_refresh.ts", "../node_modules/@firebase/auth/src/core/user/user_metadata.ts", "../node_modules/@firebase/auth/src/core/user/reload.ts", "../node_modules/@firebase/auth/src/api/authentication/token.ts", "../node_modules/@firebase/auth/src/core/user/token_manager.ts", "../node_modules/@firebase/auth/src/core/user/user_impl.ts", "../node_modules/@firebase/auth/src/core/persistence/in_memory.ts", "../node_modules/@firebase/auth/src/core/persistence/persistence_user_manager.ts", "../node_modules/@firebase/auth/src/core/util/browser.ts", "../node_modules/@firebase/auth/src/core/util/version.ts", "../node_modules/@firebase/auth/src/core/auth/auth_impl.ts", "../node_modules/@firebase/auth/src/core/auth/emulator.ts", "../node_modules/@firebase/auth/src/core/credentials/auth_credential.ts", "../node_modules/@firebase/auth/src/api/account_management/email_and_password.ts", "../node_modules/@firebase/auth/src/api/authentication/email_and_password.ts", "../node_modules/@firebase/auth/src/api/authentication/email_link.ts", "../node_modules/@firebase/auth/src/core/credentials/email.ts", "../node_modules/@firebase/auth/src/api/authentication/idp.ts", "../node_modules/@firebase/auth/src/core/credentials/oauth.ts", "../node_modules/@firebase/auth/src/api/authentication/sms.ts", "../node_modules/@firebase/auth/src/core/credentials/phone.ts", "../node_modules/@firebase/auth/src/core/action_code_url.ts", "../node_modules/@firebase/auth/src/core/providers/email.ts", "../node_modules/@firebase/auth/src/core/providers/federated.ts", "../node_modules/@firebase/auth/src/core/providers/oauth.ts", "../node_modules/@firebase/auth/src/core/providers/facebook.ts", "../node_modules/@firebase/auth/src/core/providers/google.ts", "../node_modules/@firebase/auth/src/core/providers/github.ts", "../node_modules/@firebase/auth/src/core/credentials/saml.ts", "../node_modules/@firebase/auth/src/core/providers/saml.ts", "../node_modules/@firebase/auth/src/core/providers/twitter.ts", "../node_modules/@firebase/auth/src/api/authentication/sign_up.ts", "../node_modules/@firebase/auth/src/core/user/user_credential_impl.ts", "../node_modules/@firebase/auth/src/core/strategies/anonymous.ts", "../node_modules/@firebase/auth/src/mfa/mfa_error.ts", "../node_modules/@firebase/auth/src/core/util/providers.ts", "../node_modules/@firebase/auth/src/core/user/link_unlink.ts", "../node_modules/@firebase/auth/src/core/user/reauthenticate.ts", "../node_modules/@firebase/auth/src/core/strategies/credential.ts", "../node_modules/@firebase/auth/src/api/authentication/custom_token.ts", "../node_modules/@firebase/auth/src/core/strategies/custom_token.ts", "../node_modules/@firebase/auth/src/mfa/mfa_info.ts", "../node_modules/@firebase/auth/src/core/strategies/action_code_settings.ts", "../node_modules/@firebase/auth/src/core/strategies/email_and_password.ts", "../node_modules/@firebase/auth/src/core/strategies/email_link.ts", "../node_modules/@firebase/auth/src/api/authentication/create_auth_uri.ts", "../node_modules/@firebase/auth/src/core/strategies/email.ts", "../node_modules/@firebase/auth/src/api/account_management/profile.ts", "../node_modules/@firebase/auth/src/core/user/account_info.ts", "../node_modules/@firebase/auth/src/core/user/additional_user_info.ts", "../node_modules/@firebase/auth/src/core/index.ts", "../node_modules/@firebase/auth/src/mfa/mfa_session.ts", "../node_modules/@firebase/auth/src/mfa/mfa_resolver.ts", "../node_modules/@firebase/auth/src/api/account_management/mfa.ts", "../node_modules/@firebase/auth/src/mfa/mfa_user.ts", "../node_modules/@firebase/auth/src/core/auth/firebase_internal.ts", "../node_modules/@firebase/auth/src/core/auth/register.ts", "../node_modules/@firebase/auth/src/core/persistence/index.ts", "../node_modules/@firebase/auth/src/platform_browser/persistence/browser.ts", "../node_modules/@firebase/auth/src/platform_browser/persistence/local_storage.ts", "../node_modules/@firebase/auth/src/platform_browser/messagechannel/promise.ts", "../node_modules/@firebase/auth/src/platform_browser/messagechannel/receiver.ts", "../node_modules/@firebase/auth/src/core/util/event_id.ts", "../node_modules/@firebase/auth/src/platform_browser/messagechannel/sender.ts", "../node_modules/@firebase/auth/src/platform_browser/auth_window.ts", "../node_modules/@firebase/auth/src/platform_browser/util/worker.ts", "../node_modules/@firebase/auth/src/platform_browser/persistence/indexed_db.ts", "../node_modules/@firebase/auth/src/core/auth/auth_event_manager.ts", "../node_modules/@firebase/auth/src/api/project_config/get_project_config.ts", "../node_modules/@firebase/auth/src/core/util/validate_origin.ts", "../node_modules/@firebase/auth/src/platform_browser/load_js.ts", "../node_modules/@firebase/auth/src/platform_browser/iframe/gapi.ts", "../node_modules/@firebase/auth/src/platform_browser/iframe/iframe.ts", "../node_modules/@firebase/auth/src/platform_browser/persistence/session_storage.ts", "../node_modules/@firebase/auth/src/platform_browser/util/popup.ts", "../node_modules/@firebase/auth/src/core/util/resolver.ts", "../node_modules/@firebase/auth/src/core/strategies/idp.ts", "../node_modules/@firebase/auth/src/core/strategies/abstract_popup_redirect_operation.ts", "../node_modules/@firebase/auth/src/core/strategies/redirect.ts", "../node_modules/@firebase/auth/src/platform_browser/strategies/redirect.ts", "../node_modules/@firebase/auth/src/core/util/handler.ts", "../node_modules/@firebase/auth/src/platform_browser/popup_redirect.ts", "../node_modules/@firebase/auth/src/model/enum_maps.ts", "../node_modules/@firebase/auth/src/api/authentication/mfa.ts", "../node_modules/@firebase/auth/src/api/authentication/recaptcha.ts", "../node_modules/@firebase/auth/src/platform_browser/recaptcha/recaptcha_mock.ts", "../node_modules/@firebase/auth/src/platform_browser/recaptcha/recaptcha_loader.ts", "../node_modules/@firebase/auth/src/platform_browser/recaptcha/recaptcha_verifier.ts", "../node_modules/@firebase/auth/src/platform_browser/strategies/phone.ts", "../node_modules/@firebase/auth/src/platform_browser/providers/phone.ts", "../node_modules/@firebase/auth/src/platform_browser/strategies/popup.ts", "../node_modules/@firebase/auth/src/mfa/mfa_assertion.ts", "../node_modules/@firebase/auth/src/platform_browser/mfa/assertions/phone.ts", "../node_modules/@firebase/auth/index.ts", "../node_modules/firebase/firestore/dist/index.esm.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/base.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/disposable/disposable.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/array/array.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/net/xhrio.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/string/internal.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/useragent/util.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/object/object.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/reflect/reflect.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/useragent/useragent.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/useragent/browser.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/useragent/engine.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/browserfeature.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/event.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/browserevent.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/eventtype.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/listenable.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/listenablekey.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/listener.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/listenermap.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/events.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/eventtarget.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/json/json.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/async/workqueue.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/async/run.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/async/freelist.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/async/throwexception.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/timer/timer.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/async/throttle.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/events/eventhandler.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel/webchanneldebug.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel/requeststats.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/net/errorcode.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/net/eventtype.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/net/xmlhttpfactory.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/net/xmlhttp.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel/channelrequest.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel/environment.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel/webchannelbase.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/uri/uri.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/string/string.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/disposable/dispose.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel/wirev8.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel/forwardchannelrequestpool.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/structs/structs.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/structs/map.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/uri/utils.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel/wire.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/json/nativejsonprocessor.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel/netutils.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/net/fetchxmlhttpfactory.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/functions/functions.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/json/hybrid.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/net/httpstatus.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/net/rpc/httpcors.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchanneltransport.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchannel/webchannelbasetransport.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/src/index.js", "../node_modules/@firebase/webchannel-wrapper/dist/temp/node_modules/google-closure-library/closure/goog/labs/net/webchanneltransportfactory.js", "../node_modules/@firebase/firestore/src/core/version.ts", "../node_modules/@firebase/firestore/src/core/listen_sequence.ts", "../node_modules/@firebase/firestore/src/util/error.ts", "../node_modules/@firebase/firestore/src/util/log.ts", "../node_modules/@firebase/firestore/src/platform/browser/format_json.ts", "../node_modules/@firebase/firestore/src/util/assert.ts", "../node_modules/@firebase/firestore/src/platform/browser/random_bytes.ts", "../node_modules/@firebase/firestore/src/util/misc.ts", "../node_modules/@firebase/firestore/src/lite/timestamp.ts", "../node_modules/@firebase/firestore/src/core/snapshot_version.ts", "../node_modules/@firebase/firestore/src/util/obj.ts", "../node_modules/@firebase/firestore/src/model/path.ts", "../node_modules/@firebase/firestore/src/model/field_mask.ts", "../node_modules/@firebase/firestore/src/util/byte_string.ts", "../node_modules/@firebase/firestore/src/platform/browser/base64.ts", "../node_modules/@firebase/firestore/src/model/normalize.ts", "../node_modules/@firebase/firestore/src/model/server_timestamps.ts", "../node_modules/@firebase/firestore/src/util/types.ts", "../node_modules/@firebase/firestore/src/model/document_key.ts", "../node_modules/@firebase/firestore/src/model/values.ts", "../node_modules/@firebase/firestore/src/model/object_value.ts", "../node_modules/@firebase/firestore/src/model/document.ts", "../node_modules/@firebase/firestore/src/core/target.ts", "../node_modules/@firebase/firestore/src/core/query.ts", "../node_modules/@firebase/firestore/src/remote/number_serializer.ts", "../node_modules/@firebase/firestore/src/model/transform_operation.ts", "../node_modules/@firebase/firestore/src/model/mutation.ts", "../node_modules/@firebase/firestore/src/remote/existence_filter.ts", "../node_modules/@firebase/firestore/src/remote/rpc_error.ts", "../node_modules/@firebase/firestore/src/util/sorted_map.ts", "../node_modules/@firebase/firestore/src/util/sorted_set.ts", "../node_modules/@firebase/firestore/src/model/collections.ts", "../node_modules/@firebase/firestore/src/remote/remote_event.ts", "../node_modules/@firebase/firestore/src/remote/watch_change.ts", "../node_modules/@firebase/firestore/src/remote/serializer.ts", "../node_modules/@firebase/firestore/src/local/encoded_resource_path.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_schema.ts", "../node_modules/@firebase/firestore/src/local/persistence_transaction.ts", "../node_modules/@firebase/firestore/src/util/promise.ts", "../node_modules/@firebase/firestore/src/local/persistence_promise.ts", "../node_modules/@firebase/firestore/src/local/simple_db.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_transaction.ts", "../node_modules/@firebase/firestore/src/model/mutation_batch.ts", "../node_modules/@firebase/firestore/src/local/target_data.ts", "../node_modules/@firebase/firestore/src/local/local_serializer.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_bundle_cache.ts", "../node_modules/@firebase/firestore/src/local/memory_index_manager.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_index_manager.ts", "../node_modules/@firebase/firestore/src/local/lru_garbage_collector.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_mutation_batch_impl.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_mutation_queue.ts", "../node_modules/@firebase/firestore/src/core/target_id_generator.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_target_cache.ts", "../node_modules/@firebase/firestore/src/local/local_store.ts", "../node_modules/@firebase/firestore/src/local/lru_garbage_collector_impl.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_lru_delegate_impl.ts", "../node_modules/@firebase/firestore/src/util/obj_map.ts", "../node_modules/@firebase/firestore/src/local/remote_document_change_buffer.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_remote_document_cache.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_schema_converter.ts", "../node_modules/@firebase/firestore/src/local/indexeddb_persistence.ts", "../node_modules/@firebase/firestore/src/core/bundle.ts", "../node_modules/@firebase/firestore/src/local/local_documents_view.ts", "../node_modules/@firebase/firestore/src/local/local_view_changes.ts", "../node_modules/@firebase/firestore/src/local/query_engine.ts", "../node_modules/@firebase/firestore/src/local/local_store_impl.ts", "../node_modules/@firebase/firestore/src/local/memory_bundle_cache.ts", "../node_modules/@firebase/firestore/src/local/reference_set.ts", "../node_modules/@firebase/firestore/src/local/memory_mutation_queue.ts", "../node_modules/@firebase/firestore/src/local/memory_remote_document_cache.ts", "../node_modules/@firebase/firestore/src/local/memory_target_cache.ts", "../node_modules/@firebase/firestore/src/local/memory_persistence.ts", "../node_modules/@firebase/firestore/src/auth/user.ts", "../node_modules/@firebase/firestore/src/local/shared_client_state_schema.ts", "../node_modules/@firebase/firestore/src/local/shared_client_state.ts", "../node_modules/@firebase/firestore/src/remote/connectivity_monitor_noop.ts", "../node_modules/@firebase/firestore/src/platform/browser/connectivity_monitor.ts", "../node_modules/@firebase/firestore/src/remote/rest_connection.ts", "../node_modules/@firebase/firestore/src/remote/stream_bridge.ts", "../node_modules/@firebase/firestore/src/platform/browser/webchannel_connection.ts", "../node_modules/@firebase/firestore/src/platform/browser/dom.ts", "../node_modules/@firebase/firestore/src/platform/browser/serializer.ts", "../node_modules/@firebase/firestore/src/remote/backoff.ts", "../node_modules/@firebase/firestore/src/remote/persistent_stream.ts", "../node_modules/@firebase/firestore/src/remote/datastore.ts", "../node_modules/@firebase/firestore/src/remote/online_state_tracker.ts", "../node_modules/@firebase/firestore/src/remote/remote_store.ts", "../node_modules/@firebase/firestore/src/util/async_queue.ts", "../node_modules/@firebase/firestore/src/model/document_set.ts", "../node_modules/@firebase/firestore/src/core/view_snapshot.ts", "../node_modules/@firebase/firestore/src/core/event_manager.ts", "../node_modules/@firebase/firestore/src/util/bundle_reader.ts", "../node_modules/@firebase/firestore/src/core/bundle_impl.ts", "../node_modules/@firebase/firestore/src/core/view.ts", "../node_modules/@firebase/firestore/src/core/sync_engine_impl.ts", "../node_modules/@firebase/firestore/src/core/component_provider.ts", "../node_modules/@firebase/firestore/src/platform/browser/connection.ts", "../node_modules/@firebase/firestore/src/util/byte_stream.ts", "../node_modules/@firebase/firestore/src/util/async_observer.ts", "../node_modules/@firebase/firestore/src/util/bundle_reader_impl.ts", "../node_modules/@firebase/firestore/src/core/transaction.ts", "../node_modules/@firebase/firestore/src/core/transaction_runner.ts", "../node_modules/@firebase/firestore/src/core/firestore_client.ts", "../node_modules/@firebase/firestore/src/platform/browser/byte_stream_reader.ts", "../node_modules/@firebase/firestore/src/core/database_info.ts", "../node_modules/@firebase/firestore/src/lite/components.ts", "../node_modules/@firebase/firestore/src/api/credentials.ts", "../node_modules/@firebase/firestore/src/util/input_validation.ts", "../node_modules/@firebase/firestore/src/lite/settings.ts", "../node_modules/@firebase/firestore/src/lite/database.ts", "../node_modules/@firebase/firestore/src/lite/reference.ts", "../node_modules/@firebase/firestore/src/util/async_queue_impl.ts", "../node_modules/@firebase/firestore/src/api/observer.ts", "../node_modules/@firebase/firestore/src/exp/bundle.ts", "../node_modules/@firebase/firestore/src/exp/database.ts", "../node_modules/@firebase/firestore/src/lite/field_path.ts", "../node_modules/@firebase/firestore/src/lite/bytes.ts", "../node_modules/@firebase/firestore/src/lite/field_value.ts", "../node_modules/@firebase/firestore/src/lite/geo_point.ts", "../node_modules/@firebase/firestore/src/lite/user_data_reader.ts", "../node_modules/@firebase/firestore/src/lite/snapshot.ts", "../node_modules/@firebase/firestore/src/exp/snapshot.ts", "../node_modules/@firebase/firestore/src/lite/query.ts", "../node_modules/@firebase/firestore/src/lite/user_data_writer.ts", "../node_modules/@firebase/firestore/src/lite/reference_impl.ts", "../node_modules/@firebase/firestore/src/lite/write_batch.ts", "../node_modules/@firebase/firestore/src/exp/reference_impl.ts", "../node_modules/@firebase/firestore/src/exp/transaction.ts", "../node_modules/@firebase/firestore/src/lite/transaction.ts", "../node_modules/@firebase/firestore/src/lite/field_value_impl.ts", "../node_modules/@firebase/firestore/src/exp/write_batch.ts", "../node_modules/@firebase/firestore/exp/register.ts", "../lib/auth-context.tsx", "../lib/gallery-context.tsx", "../lib/page.tsx", "../node_modules/react-helmet/es/Helmet.js", "../lib/pages/friendly-page-names.ts", "../lib/pages/index.tsx", "../lib/pages/waves-page.tsx", "../lib/checkbox.tsx", "../lib/color-util.ts", "../lib/util.ts", "../lib/color-widget.tsx", "../lib/numeric-slider.tsx", "../lib/random.ts", "../lib/pages/vocabulary-page.tsx", "../lib/bounding-box.ts", "../lib/path.ts", "../lib/svg-symbol.tsx", "../lib/colors.ts", "../lib/unique-id.tsx", "../lib/visible-specs.tsx", "../lib/specs.ts", "../lib/point.ts", "../lib/svg-vocabulary.ts", "../lib/vocabulary.ts", "../lib/_svg-vocabulary.ts", "../lib/symbol-context-widget.tsx", "../lib/hover-debug-helper.tsx", "../lib/pages/creature-page/index.tsx", "../lib/page-with-shareable-state.tsx", "../lib/pages/creature-page/core.tsx", "../lib/auto-sizing-svg.tsx", "../lib/export-svg.tsx", "../lib/animated-gif.ts", "../vendor/gif.js/gif.worker.ts", "../lib/creature-symbol.tsx", "../lib/attach.tsx", "../lib/creature-animator.tsx", "../lib/svg-transform.tsx", "../lib/svg-composition-context.tsx", "../lib/randomizer-widget.tsx", "../lib/palette-algorithm-widget.tsx", "../lib/random-colors.ts", "../lib/use-remembered-state.ts", "../lib/vocabulary-widget.tsx", "../lib/distribution.ts", "../lib/use-debounced-effect.ts", "../lib/gallery-widget.tsx", "../lib/pages/creature-page/serialization.ts", "../lib/base64.ts", "../lib/serialization.ts", "../lib/pages/creature-page/creature-editor.tsx", "../lib/remembered-details.tsx", "../lib/animation.ts", "../lib/pages/mandala-page/index.tsx", "../lib/pages/mandala-page/core.tsx", "../lib/mandala-circle.tsx", "../lib/pages/mandala-page/serialization.ts", "../lib/pages/debug-page.tsx", "../lib/creature-symbol-factory.tsx", "../lib/pages/gallery-page.tsx", "../lib/loading-indicator.tsx"],
"sourcesContent": ["'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n", "/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n", "/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n", "import * as buf from \"buffer/\";\n\nexport let process = { env: {} };\n\nexport let Buffer = buf.Buffer;\n", "/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n", "/** @license React v17.0.2\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=require(\"object-assign\"),n=60103,p=60106;exports.Fragment=60107;exports.StrictMode=60108;exports.Profiler=60114;var q=60109,r=60110,t=60112;exports.Suspense=60113;var u=60115,v=60116;\nif(\"function\"===typeof Symbol&&Symbol.for){var w=Symbol.for;n=w(\"react.element\");p=w(\"react.portal\");exports.Fragment=w(\"react.fragment\");exports.StrictMode=w(\"react.strict_mode\");exports.Profiler=w(\"react.profiler\");q=w(\"react.provider\");r=w(\"react.context\");t=w(\"react.forward_ref\");exports.Suspense=w(\"react.suspense\");u=w(\"react.memo\");v=w(\"react.lazy\")}var x=\"function\"===typeof Symbol&&Symbol.iterator;\nfunction y(a){if(null===a||\"object\"!==typeof a)return null;a=x&&a[x]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}function z(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}\nvar A={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},B={};function C(a,b,c){this.props=a;this.context=b;this.refs=B;this.updater=c||A}C.prototype.isReactComponent={};C.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(z(85));this.updater.enqueueSetState(this,a,b,\"setState\")};C.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};\nfunction D(){}D.prototype=C.prototype;function E(a,b,c){this.props=a;this.context=b;this.refs=B;this.updater=c||A}var F=E.prototype=new D;F.constructor=E;l(F,C.prototype);F.isPureReactComponent=!0;var G={current:null},H=Object.prototype.hasOwnProperty,I={key:!0,ref:!0,__self:!0,__source:!0};\nfunction J(a,b,c){var e,d={},k=null,h=null;if(null!=b)for(e in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)H.call(b,e)&&!I.hasOwnProperty(e)&&(d[e]=b[e]);var g=arguments.length-2;if(1===g)d.children=c;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];d.children=f}if(a&&a.defaultProps)for(e in g=a.defaultProps,g)void 0===d[e]&&(d[e]=g[e]);return{$$typeof:n,type:a,key:k,ref:h,props:d,_owner:G.current}}\nfunction K(a,b){return{$$typeof:n,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function L(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===n}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+a.replace(/[=:]/g,function(a){return b[a]})}var M=/\\/+/g;function N(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(\"\"+a.key):b.toString(36)}\nfunction O(a,b,c,e,d){var k=typeof a;if(\"undefined\"===k||\"boolean\"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case \"string\":case \"number\":h=!0;break;case \"object\":switch(a.$$typeof){case n:case p:h=!0}}if(h)return h=a,d=d(h),a=\"\"===e?\".\"+N(h,0):e,Array.isArray(d)?(c=\"\",null!=a&&(c=a.replace(M,\"$&/\")+\"/\"),O(d,b,c,\"\",function(a){return a})):null!=d&&(L(d)&&(d=K(d,c+(!d.key||h&&h.key===d.key?\"\":(\"\"+d.key).replace(M,\"$&/\")+\"/\")+a)),b.push(d)),1;h=0;e=\"\"===e?\".\":e+\":\";if(Array.isArray(a))for(var g=\n0;g<a.length;g++){k=a[g];var f=e+N(k,g);h+=O(k,b,c,f,d)}else if(f=y(a),\"function\"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=e+N(k,g++),h+=O(k,b,c,f,d);else if(\"object\"===k)throw b=\"\"+a,Error(z(31,\"[object Object]\"===b?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":b));return h}function P(a,b,c){if(null==a)return a;var e=[],d=0;O(a,e,\"\",\"\",function(a){return b.call(c,a,d++)});return e}\nfunction Q(a){if(-1===a._status){var b=a._result;b=b();a._status=0;a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}if(1===a._status)return a._result;throw a._result;}var R={current:null};function S(){var a=R.current;if(null===a)throw Error(z(321));return a}var T={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:G,IsSomeRendererActing:{current:!1},assign:l};\nexports.Children={map:P,forEach:function(a,b,c){P(a,function(){b.apply(this,arguments)},c)},count:function(a){var b=0;P(a,function(){b++});return b},toArray:function(a){return P(a,function(a){return a})||[]},only:function(a){if(!L(a))throw Error(z(143));return a}};exports.Component=C;exports.PureComponent=E;exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=T;\nexports.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(z(267,a));var e=l({},a.props),d=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=G.current);void 0!==b.key&&(d=\"\"+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)H.call(b,f)&&!I.hasOwnProperty(f)&&(e[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)e.children=c;else if(1<f){g=Array(f);for(var m=0;m<f;m++)g[m]=arguments[m+2];e.children=g}return{$$typeof:n,type:a.type,\nkey:d,ref:k,props:e,_owner:h}};exports.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:r,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:q,_context:a};return a.Consumer=a};exports.createElement=J;exports.createFactory=function(a){var b=J.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};exports.forwardRef=function(a){return{$$typeof:t,render:a}};exports.isValidElement=L;\nexports.lazy=function(a){return{$$typeof:v,_payload:{_status:-1,_result:a},_init:Q}};exports.memo=function(a,b){return{$$typeof:u,type:a,compare:void 0===b?null:b}};exports.useCallback=function(a,b){return S().useCallback(a,b)};exports.useContext=function(a,b){return S().useContext(a,b)};exports.useDebugValue=function(){};exports.useEffect=function(a,b){return S().useEffect(a,b)};exports.useImperativeHandle=function(a,b,c){return S().useImperativeHandle(a,b,c)};\nexports.useLayoutEffect=function(a,b){return S().useLayoutEffect(a,b)};exports.useMemo=function(a,b){return S().useMemo(a,b)};exports.useReducer=function(a,b,c){return S().useReducer(a,b,c)};exports.useRef=function(a){return S().useRef(a)};exports.useState=function(a){return S().useState(a)};exports.version=\"17.0.2\";\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n", "/** @license React v0.20.2\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f,g,h,k;if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}\nif(\"undefined\"===typeof window||\"function\"!==typeof MessageChannel){var t=null,u=null,w=function(){if(null!==t)try{var a=exports.unstable_now();t(!0,a);t=null}catch(b){throw setTimeout(w,0),b;}};f=function(a){null!==t?setTimeout(f,0,a):(t=a,setTimeout(w,0))};g=function(a,b){u=setTimeout(a,b)};h=function(){clearTimeout(u)};exports.unstable_shouldYield=function(){return!1};k=exports.unstable_forceFrameRate=function(){}}else{var x=window.setTimeout,y=window.clearTimeout;if(\"undefined\"!==typeof console){var z=\nwindow.cancelAnimationFrame;\"function\"!==typeof window.requestAnimationFrame&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills\");\"function\"!==typeof z&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills\")}var A=!1,B=null,C=-1,D=5,E=0;exports.unstable_shouldYield=function(){return exports.unstable_now()>=\nE};k=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):D=0<a?Math.floor(1E3/a):5};var F=new MessageChannel,G=F.port2;F.port1.onmessage=function(){if(null!==B){var a=exports.unstable_now();E=a+D;try{B(!0,a)?G.postMessage(null):(A=!1,B=null)}catch(b){throw G.postMessage(null),b;}}else A=!1};f=function(a){B=a;A||(A=!0,G.postMessage(null))};g=function(a,b){C=\nx(function(){a(exports.unstable_now())},b)};h=function(){y(C);C=-1}}function H(a,b){var c=a.length;a.push(b);a:for(;;){var d=c-1>>>1,e=a[d];if(void 0!==e&&0<I(e,b))a[d]=b,a[c]=e,c=d;else break a}}function J(a){a=a[0];return void 0===a?null:a}\nfunction K(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var m=2*(d+1)-1,n=a[m],v=m+1,r=a[v];if(void 0!==n&&0>I(n,c))void 0!==r&&0>I(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>I(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function I(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var L=[],M=[],N=1,O=null,P=3,Q=!1,R=!1,S=!1;\nfunction T(a){for(var b=J(M);null!==b;){if(null===b.callback)K(M);else if(b.startTime<=a)K(M),b.sortIndex=b.expirationTime,H(L,b);else break;b=J(M)}}function U(a){S=!1;T(a);if(!R)if(null!==J(L))R=!0,f(V);else{var b=J(M);null!==b&&g(U,b.startTime-a)}}\nfunction V(a,b){R=!1;S&&(S=!1,h());Q=!0;var c=P;try{T(b);for(O=J(L);null!==O&&(!(O.expirationTime>b)||a&&!exports.unstable_shouldYield());){var d=O.callback;if(\"function\"===typeof d){O.callback=null;P=O.priorityLevel;var e=d(O.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?O.callback=e:O===J(L)&&K(L);T(b)}else K(L);O=J(L)}if(null!==O)var m=!0;else{var n=J(M);null!==n&&g(U,n.startTime-b);m=!1}return m}finally{O=null,P=c,Q=!1}}var W=k;exports.unstable_IdlePriority=5;\nexports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){R||Q||(R=!0,f(V))};exports.unstable_getCurrentPriorityLevel=function(){return P};exports.unstable_getFirstCallbackNode=function(){return J(L)};\nexports.unstable_next=function(a){switch(P){case 1:case 2:case 3:var b=3;break;default:b=P}var c=P;P=b;try{return a()}finally{P=c}};exports.unstable_pauseExecution=function(){};exports.unstable_requestPaint=W;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=P;P=a;try{return b()}finally{P=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();\"object\"===typeof c&&null!==c?(c=c.delay,c=\"number\"===typeof c&&0<c?d+c:d):c=d;switch(a){case 1:var e=-1;break;case 2:e=250;break;case 5:e=1073741823;break;case 4:e=1E4;break;default:e=5E3}e=c+e;a={id:N++,callback:b,priorityLevel:a,startTime:c,expirationTime:e,sortIndex:-1};c>d?(a.sortIndex=c,H(M,a),null===J(L)&&a===J(M)&&(S?h():S=!0,g(U,c-d))):(a.sortIndex=e,H(L,a),R||Q||(R=!0,f(V)));return a};\nexports.unstable_wrapCallback=function(a){var b=P;return function(){var c=P;P=b;try{return a.apply(this,arguments)}finally{P=c}}};\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n", "/** @license React v17.0.2\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),m=require(\"object-assign\"),r=require(\"scheduler\");function y(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}if(!aa)throw Error(y(227));var ba=new Set,ca={};function da(a,b){ea(a,b);ea(a+\"Capture\",b)}\nfunction ea(a,b){ca[a]=b;for(a=0;a<b.length;a++)ba.add(b[a])}\nvar fa=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),ha=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,ia=Object.prototype.hasOwnProperty,\nja={},ka={};function la(a){if(ia.call(ka,a))return!0;if(ia.call(ja,a))return!1;if(ha.test(a))return ka[a]=!0;ja[a]=!0;return!1}function ma(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction na(a,b,c,d){if(null===b||\"undefined\"===typeof b||ma(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function B(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var D={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){D[a]=new B(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];D[b]=new B(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){D[a]=new B(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){D[a]=new B(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){D[a]=new B(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){D[a]=new B(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){D[a]=new B(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){D[a]=new B(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){D[a]=new B(a,5,!1,a.toLowerCase(),null,!1,!1)});var oa=/[\\-:]([a-z])/g;function pa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(oa,\npa);D[b]=new B(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(oa,pa);D[b]=new B(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(oa,pa);D[b]=new B(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!1,!1)});\nD.xlinkHref=new B(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction qa(a,b,c,d){var e=D.hasOwnProperty(b)?D[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(na(b,c,e,d)&&(c=null),d||null===e?la(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nvar ra=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,sa=60103,ta=60106,ua=60107,wa=60108,xa=60114,ya=60109,za=60110,Aa=60112,Ba=60113,Ca=60120,Da=60115,Ea=60116,Fa=60121,Ga=60128,Ha=60129,Ia=60130,Ja=60131;\nif(\"function\"===typeof Symbol&&Symbol.for){var E=Symbol.for;sa=E(\"react.element\");ta=E(\"react.portal\");ua=E(\"react.fragment\");wa=E(\"react.strict_mode\");xa=E(\"react.profiler\");ya=E(\"react.provider\");za=E(\"react.context\");Aa=E(\"react.forward_ref\");Ba=E(\"react.suspense\");Ca=E(\"react.suspense_list\");Da=E(\"react.memo\");Ea=E(\"react.lazy\");Fa=E(\"react.block\");E(\"react.scope\");Ga=E(\"react.opaque.id\");Ha=E(\"react.debug_trace_mode\");Ia=E(\"react.offscreen\");Ja=E(\"react.legacy_hidden\")}\nvar Ka=\"function\"===typeof Symbol&&Symbol.iterator;function La(a){if(null===a||\"object\"!==typeof a)return null;a=Ka&&a[Ka]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}var Ma;function Na(a){if(void 0===Ma)try{throw Error();}catch(c){var b=c.stack.trim().match(/\\n( *(at )?)/);Ma=b&&b[1]||\"\"}return\"\\n\"+Ma+a}var Oa=!1;\nfunction Pa(a,b){if(!a||Oa)return\"\";Oa=!0;var c=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(b)if(b=function(){throw Error();},Object.defineProperty(b.prototype,\"props\",{set:function(){throw Error();}}),\"object\"===typeof Reflect&&Reflect.construct){try{Reflect.construct(b,[])}catch(k){var d=k}Reflect.construct(a,[],b)}else{try{b.call()}catch(k){d=k}a.call(b.prototype)}else{try{throw Error();}catch(k){d=k}a()}}catch(k){if(k&&d&&\"string\"===typeof k.stack){for(var e=k.stack.split(\"\\n\"),\nf=d.stack.split(\"\\n\"),g=e.length-1,h=f.length-1;1<=g&&0<=h&&e[g]!==f[h];)h--;for(;1<=g&&0<=h;g--,h--)if(e[g]!==f[h]){if(1!==g||1!==h){do if(g--,h--,0>h||e[g]!==f[h])return\"\\n\"+e[g].replace(\" at new \",\" at \");while(1<=g&&0<=h)}break}}}finally{Oa=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Na(a):\"\"}\nfunction Qa(a){switch(a.tag){case 5:return Na(a.type);case 16:return Na(\"Lazy\");case 13:return Na(\"Suspense\");case 19:return Na(\"SuspenseList\");case 0:case 2:case 15:return a=Pa(a.type,!1),a;case 11:return a=Pa(a.type.render,!1),a;case 22:return a=Pa(a.type._render,!1),a;case 1:return a=Pa(a.type,!0),a;default:return\"\"}}\nfunction Ra(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ua:return\"Fragment\";case ta:return\"Portal\";case xa:return\"Profiler\";case wa:return\"StrictMode\";case Ba:return\"Suspense\";case Ca:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case za:return(a.displayName||\"Context\")+\".Consumer\";case ya:return(a._context.displayName||\"Context\")+\".Provider\";case Aa:var b=a.render;b=b.displayName||b.name||\"\";\nreturn a.displayName||(\"\"!==b?\"ForwardRef(\"+b+\")\":\"ForwardRef\");case Da:return Ra(a.type);case Fa:return Ra(a._render);case Ea:b=a._payload;a=a._init;try{return Ra(a(b))}catch(c){}}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}function Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return m({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function $a(a,b){b=b.checked;null!=b&&qa(a,\"checked\",b,!1)}\nfunction ab(a,b){$a(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?bb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&bb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction cb(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction bb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}function db(a){var b=\"\";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function eb(a,b){a=m({children:void 0},b);if(b=db(b.children))a.children=b;return a}\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+Sa(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction gb(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(y(91));return m({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function hb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(y(92));if(Array.isArray(c)){if(!(1>=c.length))throw Error(y(93));c=c[0]}b=c}null==b&&(b=\"\");c=b}a._wrapperState={initialValue:Sa(c)}}\nfunction ib(a,b){var c=Sa(b.value),d=Sa(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function jb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}var kb={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction lb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function mb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?lb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar nb,ob=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==kb.svg||\"innerHTML\"in a)a.innerHTML=b;else{nb=nb||document.createElement(\"div\");nb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=nb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction pb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar qb={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},rb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(qb).forEach(function(a){rb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);qb[b]=qb[a]})});function sb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||qb.hasOwnProperty(a)&&qb[a]?(\"\"+b).trim():b+\"px\"}\nfunction tb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=sb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var ub=m({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction vb(a,b){if(b){if(ub[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(y(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(y(60));if(!(\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML))throw Error(y(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(y(62));}}\nfunction wb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(y(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a<b.length;a++)Bb(b[a])}}function Gb(a,b){return a(b)}function Hb(a,b,c,d,e){return a(b,c,d,e)}function Ib(){}var Jb=Gb,Kb=!1,Lb=!1;function Mb(){if(null!==zb||null!==Ab)Ib(),Fb()}\nfunction Nb(a,b,c){if(Lb)return a(b,c);Lb=!0;try{return Jb(a,b,c)}finally{Lb=!1,Mb()}}\nfunction Ob(a,b){var c=a.stateNode;if(null===c)return null;var d=Db(c);if(null===d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":case \"onMouseEnter\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==\ntypeof c)throw Error(y(231,b,typeof c));return c}var Pb=!1;if(fa)try{var Qb={};Object.defineProperty(Qb,\"passive\",{get:function(){Pb=!0}});window.addEventListener(\"test\",Qb,Qb);window.removeEventListener(\"test\",Qb,Qb)}catch(a){Pb=!1}function Rb(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(n){this.onError(n)}}var Sb=!1,Tb=null,Ub=!1,Vb=null,Wb={onError:function(a){Sb=!0;Tb=a}};function Xb(a,b,c,d,e,f,g,h,k){Sb=!1;Tb=null;Rb.apply(Wb,arguments)}\nfunction Yb(a,b,c,d,e,f,g,h,k){Xb.apply(this,arguments);if(Sb){if(Sb){var l=Tb;Sb=!1;Tb=null}else throw Error(y(198));Ub||(Ub=!0,Vb=l)}}function Zb(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.flags&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function $b(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function ac(a){if(Zb(a)!==a)throw Error(y(188));}\nfunction bc(a){var b=a.alternate;if(!b){b=Zb(a);if(null===b)throw Error(y(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return ac(e),a;if(f===d)return ac(e),b;f=f.sibling}throw Error(y(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(y(189));}}if(c.alternate!==d)throw Error(y(190));}if(3!==c.tag)throw Error(y(188));return c.stateNode.current===c?a:b}function cc(a){a=bc(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\nfunction dc(a,b){for(var c=a.alternate;null!==b;){if(b===a||b===c)return!0;b=b.return}return!1}var ec,fc,gc,hc,ic=!1,jc=[],kc=null,lc=null,mc=null,nc=new Map,oc=new Map,pc=[],qc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit\".split(\" \");\nfunction rc(a,b,c,d,e){return{blockedOn:a,domEventName:b,eventSystemFlags:c|16,nativeEvent:e,targetContainers:[d]}}function sc(a,b){switch(a){case \"focusin\":case \"focusout\":kc=null;break;case \"dragenter\":case \"dragleave\":lc=null;break;case \"mouseover\":case \"mouseout\":mc=null;break;case \"pointerover\":case \"pointerout\":nc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":oc.delete(b.pointerId)}}\nfunction tc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a=rc(b,c,d,e,f),null!==b&&(b=Cb(b),null!==b&&fc(b)),a;a.eventSystemFlags|=d;b=a.targetContainers;null!==e&&-1===b.indexOf(e)&&b.push(e);return a}\nfunction uc(a,b,c,d,e){switch(b){case \"focusin\":return kc=tc(kc,a,b,c,d,e),!0;case \"dragenter\":return lc=tc(lc,a,b,c,d,e),!0;case \"mouseover\":return mc=tc(mc,a,b,c,d,e),!0;case \"pointerover\":var f=e.pointerId;nc.set(f,tc(nc.get(f)||null,a,b,c,d,e));return!0;case \"gotpointercapture\":return f=e.pointerId,oc.set(f,tc(oc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction vc(a){var b=wc(a.target);if(null!==b){var c=Zb(b);if(null!==c)if(b=c.tag,13===b){if(b=$b(c),null!==b){a.blockedOn=b;hc(a.lanePriority,function(){r.unstable_runWithPriority(a.priority,function(){gc(c)})});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}\nfunction xc(a){if(null!==a.blockedOn)return!1;for(var b=a.targetContainers;0<b.length;){var c=yc(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null!==c)return b=Cb(c),null!==b&&fc(b),a.blockedOn=c,!1;b.shift()}return!0}function zc(a,b,c){xc(a)&&c.delete(b)}\nfunction Ac(){for(ic=!1;0<jc.length;){var a=jc[0];if(null!==a.blockedOn){a=Cb(a.blockedOn);null!==a&&ec(a);break}for(var b=a.targetContainers;0<b.length;){var c=yc(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null!==c){a.blockedOn=c;break}b.shift()}null===a.blockedOn&&jc.shift()}null!==kc&&xc(kc)&&(kc=null);null!==lc&&xc(lc)&&(lc=null);null!==mc&&xc(mc)&&(mc=null);nc.forEach(zc);oc.forEach(zc)}\nfunction Bc(a,b){a.blockedOn===b&&(a.blockedOn=null,ic||(ic=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Ac)))}\nfunction Cc(a){function b(b){return Bc(b,a)}if(0<jc.length){Bc(jc[0],a);for(var c=1;c<jc.length;c++){var d=jc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==kc&&Bc(kc,a);null!==lc&&Bc(lc,a);null!==mc&&Bc(mc,a);nc.forEach(b);oc.forEach(b);for(c=0;c<pc.length;c++)d=pc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<pc.length&&(c=pc[0],null===c.blockedOn);)vc(c),null===c.blockedOn&&pc.shift()}\nfunction Dc(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var Ec={animationend:Dc(\"Animation\",\"AnimationEnd\"),animationiteration:Dc(\"Animation\",\"AnimationIteration\"),animationstart:Dc(\"Animation\",\"AnimationStart\"),transitionend:Dc(\"Transition\",\"TransitionEnd\")},Fc={},Gc={};\nfa&&(Gc=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Ec.animationend.animation,delete Ec.animationiteration.animation,delete Ec.animationstart.animation),\"TransitionEvent\"in window||delete Ec.transitionend.transition);function Hc(a){if(Fc[a])return Fc[a];if(!Ec[a])return a;var b=Ec[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Gc)return Fc[a]=b[c];return a}\nvar Ic=Hc(\"animationend\"),Jc=Hc(\"animationiteration\"),Kc=Hc(\"animationstart\"),Lc=Hc(\"transitionend\"),Mc=new Map,Nc=new Map,Oc=[\"abort\",\"abort\",Ic,\"animationEnd\",Jc,\"animationIteration\",Kc,\"animationStart\",\"canplay\",\"canPlay\",\"canplaythrough\",\"canPlayThrough\",\"durationchange\",\"durationChange\",\"emptied\",\"emptied\",\"encrypted\",\"encrypted\",\"ended\",\"ended\",\"error\",\"error\",\"gotpointercapture\",\"gotPointerCapture\",\"load\",\"load\",\"loadeddata\",\"loadedData\",\"loadedmetadata\",\"loadedMetadata\",\"loadstart\",\"loadStart\",\n\"lostpointercapture\",\"lostPointerCapture\",\"playing\",\"playing\",\"progress\",\"progress\",\"seeking\",\"seeking\",\"stalled\",\"stalled\",\"suspend\",\"suspend\",\"timeupdate\",\"timeUpdate\",Lc,\"transitionEnd\",\"waiting\",\"waiting\"];function Pc(a,b){for(var c=0;c<a.length;c+=2){var d=a[c],e=a[c+1];e=\"on\"+(e[0].toUpperCase()+e.slice(1));Nc.set(d,b);Mc.set(d,e);da(e,[d])}}var Qc=r.unstable_now;Qc();var F=8;\nfunction Rc(a){if(0!==(1&a))return F=15,1;if(0!==(2&a))return F=14,2;if(0!==(4&a))return F=13,4;var b=24&a;if(0!==b)return F=12,b;if(0!==(a&32))return F=11,32;b=192&a;if(0!==b)return F=10,b;if(0!==(a&256))return F=9,256;b=3584&a;if(0!==b)return F=8,b;if(0!==(a&4096))return F=7,4096;b=4186112&a;if(0!==b)return F=6,b;b=62914560&a;if(0!==b)return F=5,b;if(a&67108864)return F=4,67108864;if(0!==(a&134217728))return F=3,134217728;b=805306368&a;if(0!==b)return F=2,b;if(0!==(1073741824&a))return F=1,1073741824;\nF=8;return a}function Sc(a){switch(a){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}function Tc(a){switch(a){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(y(358,a));}}\nfunction Uc(a,b){var c=a.pendingLanes;if(0===c)return F=0;var d=0,e=0,f=a.expiredLanes,g=a.suspendedLanes,h=a.pingedLanes;if(0!==f)d=f,e=F=15;else if(f=c&134217727,0!==f){var k=f&~g;0!==k?(d=Rc(k),e=F):(h&=f,0!==h&&(d=Rc(h),e=F))}else f=c&~g,0!==f?(d=Rc(f),e=F):0!==h&&(d=Rc(h),e=F);if(0===d)return 0;d=31-Vc(d);d=c&((0>d?0:1<<d)<<1)-1;if(0!==b&&b!==d&&0===(b&g)){Rc(b);if(e<=F)return b;F=e}b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0<b;)c=31-Vc(b),e=1<<c,d|=a[c],b&=~e;return d}\nfunction Wc(a){a=a.pendingLanes&-1073741825;return 0!==a?a:a&1073741824?1073741824:0}function Xc(a,b){switch(a){case 15:return 1;case 14:return 2;case 12:return a=Yc(24&~b),0===a?Xc(10,b):a;case 10:return a=Yc(192&~b),0===a?Xc(8,b):a;case 8:return a=Yc(3584&~b),0===a&&(a=Yc(4186112&~b),0===a&&(a=512)),a;case 2:return b=Yc(805306368&~b),0===b&&(b=268435456),b}throw Error(y(358,a));}function Yc(a){return a&-a}function Zc(a){for(var b=[],c=0;31>c;c++)b.push(a);return b}\nfunction $c(a,b,c){a.pendingLanes|=b;var d=b-1;a.suspendedLanes&=d;a.pingedLanes&=d;a=a.eventTimes;b=31-Vc(b);a[b]=c}var Vc=Math.clz32?Math.clz32:ad,bd=Math.log,cd=Math.LN2;function ad(a){return 0===a?32:31-(bd(a)/cd|0)|0}var dd=r.unstable_UserBlockingPriority,ed=r.unstable_runWithPriority,fd=!0;function gd(a,b,c,d){Kb||Ib();var e=hd,f=Kb;Kb=!0;try{Hb(e,a,b,c,d)}finally{(Kb=f)||Mb()}}function id(a,b,c,d){ed(dd,hd.bind(null,a,b,c,d))}\nfunction hd(a,b,c,d){if(fd){var e;if((e=0===(b&4))&&0<jc.length&&-1<qc.indexOf(a))a=rc(null,a,b,c,d),jc.push(a);else{var f=yc(a,b,c,d);if(null===f)e&&sc(a,d);else{if(e){if(-1<qc.indexOf(a)){a=rc(f,a,b,c,d);jc.push(a);return}if(uc(f,a,b,c,d))return;sc(a,d)}jd(a,b,d,null,c)}}}}\nfunction yc(a,b,c,d){var e=xb(d);e=wc(e);if(null!==e){var f=Zb(e);if(null===f)e=null;else{var g=f.tag;if(13===g){e=$b(f);if(null!==e)return e;e=null}else if(3===g){if(f.stateNode.hydrate)return 3===f.tag?f.stateNode.containerInfo:null;e=null}else f!==e&&(e=null)}}jd(a,b,d,e,c);return null}var kd=null,ld=null,md=null;\nfunction nd(){if(md)return md;var a,b=ld,c=b.length,d,e=\"value\"in kd?kd.value:kd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return md=e.slice(a,1<d?1-d:void 0)}function od(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function pd(){return!0}function qd(){return!1}\nfunction rd(a){function b(b,d,e,f,g){this._reactName=b;this._targetInst=e;this.type=d;this.nativeEvent=f;this.target=g;this.currentTarget=null;for(var c in a)a.hasOwnProperty(c)&&(b=a[c],this[c]=b?b(f):f[c]);this.isDefaultPrevented=(null!=f.defaultPrevented?f.defaultPrevented:!1===f.returnValue)?pd:qd;this.isPropagationStopped=qd;return this}m(b.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&\n(a.returnValue=!1),this.isDefaultPrevented=pd)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=pd)},persist:function(){},isPersistent:pd});return b}\nvar sd={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},td=rd(sd),ud=m({},sd,{view:0,detail:0}),vd=rd(ud),wd,xd,yd,Ad=m({},ud,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:zd,button:0,buttons:0,relatedTarget:function(a){return void 0===a.relatedTarget?a.fromElement===a.srcElement?a.toElement:a.fromElement:a.relatedTarget},movementX:function(a){if(\"movementX\"in\na)return a.movementX;a!==yd&&(yd&&\"mousemove\"===a.type?(wd=a.screenX-yd.screenX,xd=a.screenY-yd.screenY):xd=wd=0,yd=a);return wd},movementY:function(a){return\"movementY\"in a?a.movementY:xd}}),Bd=rd(Ad),Cd=m({},Ad,{dataTransfer:0}),Dd=rd(Cd),Ed=m({},ud,{relatedTarget:0}),Fd=rd(Ed),Gd=m({},sd,{animationName:0,elapsedTime:0,pseudoElement:0}),Hd=rd(Gd),Id=m({},sd,{clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Jd=rd(Id),Kd=m({},sd,{data:0}),Ld=rd(Kd),Md={Esc:\"Escape\",\nSpacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Nd={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",\n119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Od={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Pd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Od[a])?!!b[a]:!1}function zd(){return Pd}\nvar Qd=m({},ud,{key:function(a){if(a.key){var b=Md[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=od(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Nd[a.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:zd,charCode:function(a){return\"keypress\"===a.type?od(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?od(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),Rd=rd(Qd),Sd=m({},Ad,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Td=rd(Sd),Ud=m({},ud,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:zd}),Vd=rd(Ud),Wd=m({},sd,{propertyName:0,elapsedTime:0,pseudoElement:0}),Xd=rd(Wd),Yd=m({},Ad,{deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},\ndeltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:0,deltaMode:0}),Zd=rd(Yd),$d=[9,13,27,32],ae=fa&&\"CompositionEvent\"in window,be=null;fa&&\"documentMode\"in document&&(be=document.documentMode);var ce=fa&&\"TextEvent\"in window&&!be,de=fa&&(!ae||be&&8<be&&11>=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return de&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar le={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function me(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!le[a.type]:\"textarea\"===b?!0:!1}function ne(a,b,c,d){Eb(d);b=oe(b,\"onChange\");0<b.length&&(c=new td(\"onChange\",\"change\",null,c,d),a.push({event:c,listeners:b}))}var pe=null,qe=null;function re(a){se(a,0)}function te(a){var b=ue(a);if(Wa(b))return a}\nfunction ve(a,b){if(\"change\"===a)return b}var we=!1;if(fa){var xe;if(fa){var ye=\"oninput\"in document;if(!ye){var ze=document.createElement(\"div\");ze.setAttribute(\"oninput\",\"return;\");ye=\"function\"===typeof ze.oninput}xe=ye}else xe=!1;we=xe&&(!document.documentMode||9<document.documentMode)}function Ae(){pe&&(pe.detachEvent(\"onpropertychange\",Be),qe=pe=null)}function Be(a){if(\"value\"===a.propertyName&&te(qe)){var b=[];ne(b,qe,a,xb(a));a=re;if(Kb)a(b);else{Kb=!0;try{Gb(a,b)}finally{Kb=!1,Mb()}}}}\nfunction Ce(a,b,c){\"focusin\"===a?(Ae(),pe=b,qe=c,pe.attachEvent(\"onpropertychange\",Be)):\"focusout\"===a&&Ae()}function De(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return te(qe)}function Ee(a,b){if(\"click\"===a)return te(b)}function Fe(a,b){if(\"input\"===a||\"change\"===a)return te(b)}function Ge(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var He=\"function\"===typeof Object.is?Object.is:Ge,Ie=Object.prototype.hasOwnProperty;\nfunction Je(a,b){if(He(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!Ie.call(b,c[d])||!He(a[c[d]],b[c[d]]))return!1;return!0}function Ke(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Le(a,b){var c=Ke(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Ke(c)}}function Me(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Me(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Ne(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Oe(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nvar Pe=fa&&\"documentMode\"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Oe(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Je(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0<d.length&&(b=new td(\"onSelect\",\"select\",null,b,c),a.push({event:b,listeners:d}),b.target=Qe)))}\nPc(\"cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange\".split(\" \"),\n0);Pc(\"drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel\".split(\" \"),1);Pc(Oc,2);for(var Ve=\"change selectionchange textInput compositionstart compositionend compositionupdate\".split(\" \"),We=0;We<Ve.length;We++)Nc.set(Ve[We],0);ea(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]);\nea(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]);ea(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]);ea(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]);da(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \"));da(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \"));da(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]);da(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \"));\nda(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \"));da(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var Xe=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),Ye=new Set(\"cancel close invalid load scroll toggle\".split(\" \").concat(Xe));\nfunction Ze(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=c;Yb(d,b,void 0,a);a.currentTarget=null}\nfunction se(a,b){b=0!==(b&4);for(var c=0;c<a.length;c++){var d=a[c],e=d.event;d=d.listeners;a:{var f=void 0;if(b)for(var g=d.length-1;0<=g;g--){var h=d[g],k=h.instance,l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;Ze(e,h,l);f=k}else for(g=0;g<d.length;g++){h=d[g];k=h.instance;l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;Ze(e,h,l);f=k}}}if(Ub)throw a=Vb,Ub=!1,Vb=null,a;}\nfunction G(a,b){var c=$e(b),d=a+\"__bubble\";c.has(d)||(af(b,a,2,!1),c.add(d))}var bf=\"_reactListening\"+Math.random().toString(36).slice(2);function cf(a){a[bf]||(a[bf]=!0,ba.forEach(function(b){Ye.has(b)||df(b,!1,a,null);df(b,!0,a,null)}))}\nfunction df(a,b,c,d){var e=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,f=c;\"selectionchange\"===a&&9!==c.nodeType&&(f=c.ownerDocument);if(null!==d&&!b&&Ye.has(a)){if(\"scroll\"!==a)return;e|=2;f=d}var g=$e(f),h=a+\"__\"+(b?\"capture\":\"bubble\");g.has(h)||(b&&(e|=4),af(f,a,e,b),g.add(h))}\nfunction af(a,b,c,d){var e=Nc.get(b);switch(void 0===e?2:e){case 0:e=gd;break;case 1:e=id;break;default:e=hd}c=e.bind(null,b,c,a);e=void 0;!Pb||\"touchstart\"!==b&&\"touchmove\"!==b&&\"wheel\"!==b||(e=!0);d?void 0!==e?a.addEventListener(b,c,{capture:!0,passive:e}):a.addEventListener(b,c,!0):void 0!==e?a.addEventListener(b,c,{passive:e}):a.addEventListener(b,c,!1)}\nfunction jd(a,b,c,d,e){var f=d;if(0===(b&1)&&0===(b&2)&&null!==d)a:for(;;){if(null===d)return;var g=d.tag;if(3===g||4===g){var h=d.stateNode.containerInfo;if(h===e||8===h.nodeType&&h.parentNode===e)break;if(4===g)for(g=d.return;null!==g;){var k=g.tag;if(3===k||4===k)if(k=g.stateNode.containerInfo,k===e||8===k.nodeType&&k.parentNode===e)return;g=g.return}for(;null!==h;){g=wc(h);if(null===g)return;k=g.tag;if(5===k||6===k){d=f=g;continue a}h=h.parentNode}}d=d.return}Nb(function(){var d=f,e=xb(c),g=[];\na:{var h=Mc.get(a);if(void 0!==h){var k=td,x=a;switch(a){case \"keypress\":if(0===od(c))break a;case \"keydown\":case \"keyup\":k=Rd;break;case \"focusin\":x=\"focus\";k=Fd;break;case \"focusout\":x=\"blur\";k=Fd;break;case \"beforeblur\":case \"afterblur\":k=Fd;break;case \"click\":if(2===c.button)break a;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":k=Bd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":k=\nDd;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":k=Vd;break;case Ic:case Jc:case Kc:k=Hd;break;case Lc:k=Xd;break;case \"scroll\":k=vd;break;case \"wheel\":k=Zd;break;case \"copy\":case \"cut\":case \"paste\":k=Jd;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":k=Td}var w=0!==(b&4),z=!w&&\"scroll\"===a,u=w?null!==h?h+\"Capture\":null:h;w=[];for(var t=d,q;null!==\nt;){q=t;var v=q.stateNode;5===q.tag&&null!==v&&(q=v,null!==u&&(v=Ob(t,u),null!=v&&w.push(ef(t,v,q))));if(z)break;t=t.return}0<w.length&&(h=new k(h,x,null,c,e),g.push({event:h,listeners:w}))}}if(0===(b&7)){a:{h=\"mouseover\"===a||\"pointerover\"===a;k=\"mouseout\"===a||\"pointerout\"===a;if(h&&0===(b&16)&&(x=c.relatedTarget||c.fromElement)&&(wc(x)||x[ff]))break a;if(k||h){h=e.window===e?e:(h=e.ownerDocument)?h.defaultView||h.parentWindow:window;if(k){if(x=c.relatedTarget||c.toElement,k=d,x=x?wc(x):null,null!==\nx&&(z=Zb(x),x!==z||5!==x.tag&&6!==x.tag))x=null}else k=null,x=d;if(k!==x){w=Bd;v=\"onMouseLeave\";u=\"onMouseEnter\";t=\"mouse\";if(\"pointerout\"===a||\"pointerover\"===a)w=Td,v=\"onPointerLeave\",u=\"onPointerEnter\",t=\"pointer\";z=null==k?h:ue(k);q=null==x?h:ue(x);h=new w(v,t+\"leave\",k,c,e);h.target=z;h.relatedTarget=q;v=null;wc(e)===d&&(w=new w(u,t+\"enter\",x,c,e),w.target=q,w.relatedTarget=z,v=w);z=v;if(k&&x)b:{w=k;u=x;t=0;for(q=w;q;q=gf(q))t++;q=0;for(v=u;v;v=gf(v))q++;for(;0<t-q;)w=gf(w),t--;for(;0<q-t;)u=\ngf(u),q--;for(;t--;){if(w===u||null!==u&&w===u.alternate)break b;w=gf(w);u=gf(u)}w=null}else w=null;null!==k&&hf(g,h,k,w,!1);null!==x&&null!==z&&hf(g,z,x,w,!0)}}}a:{h=d?ue(d):window;k=h.nodeName&&h.nodeName.toLowerCase();if(\"select\"===k||\"input\"===k&&\"file\"===h.type)var J=ve;else if(me(h))if(we)J=Fe;else{J=De;var K=Ce}else(k=h.nodeName)&&\"input\"===k.toLowerCase()&&(\"checkbox\"===h.type||\"radio\"===h.type)&&(J=Ee);if(J&&(J=J(a,d))){ne(g,J,c,e);break a}K&&K(a,h,d);\"focusout\"===a&&(K=h._wrapperState)&&\nK.controlled&&\"number\"===h.type&&bb(h,\"number\",h.value)}K=d?ue(d):window;switch(a){case \"focusin\":if(me(K)||\"true\"===K.contentEditable)Qe=K,Re=d,Se=null;break;case \"focusout\":Se=Re=Qe=null;break;case \"mousedown\":Te=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":Te=!1;Ue(g,c,e);break;case \"selectionchange\":if(Pe)break;case \"keydown\":case \"keyup\":Ue(g,c,e)}var Q;if(ae)b:{switch(a){case \"compositionstart\":var L=\"onCompositionStart\";break b;case \"compositionend\":L=\"onCompositionEnd\";break b;\ncase \"compositionupdate\":L=\"onCompositionUpdate\";break b}L=void 0}else ie?ge(a,c)&&(L=\"onCompositionEnd\"):\"keydown\"===a&&229===c.keyCode&&(L=\"onCompositionStart\");L&&(de&&\"ko\"!==c.locale&&(ie||\"onCompositionStart\"!==L?\"onCompositionEnd\"===L&&ie&&(Q=nd()):(kd=e,ld=\"value\"in kd?kd.value:kd.textContent,ie=!0)),K=oe(d,L),0<K.length&&(L=new Ld(L,a,null,c,e),g.push({event:L,listeners:K}),Q?L.data=Q:(Q=he(c),null!==Q&&(L.data=Q))));if(Q=ce?je(a,c):ke(a,c))d=oe(d,\"onBeforeInput\"),0<d.length&&(e=new Ld(\"onBeforeInput\",\n\"beforeinput\",null,c,e),g.push({event:e,listeners:d}),e.data=Q)}se(g,b)})}function ef(a,b,c){return{instance:a,listener:b,currentTarget:c}}function oe(a,b){for(var c=b+\"Capture\",d=[];null!==a;){var e=a,f=e.stateNode;5===e.tag&&null!==f&&(e=f,f=Ob(a,c),null!=f&&d.unshift(ef(a,f,e)),f=Ob(a,b),null!=f&&d.push(ef(a,f,e)));a=a.return}return d}function gf(a){if(null===a)return null;do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction hf(a,b,c,d,e){for(var f=b._reactName,g=[];null!==c&&c!==d;){var h=c,k=h.alternate,l=h.stateNode;if(null!==k&&k===d)break;5===h.tag&&null!==l&&(h=l,e?(k=Ob(c,f),null!=k&&g.unshift(ef(c,k,h))):e||(k=Ob(c,f),null!=k&&g.push(ef(c,k,h))));c=c.return}0!==g.length&&a.push({event:b,listeners:g})}function jf(){}var kf=null,lf=null;function mf(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\nfunction nf(a,b){return\"textarea\"===a||\"option\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}var of=\"function\"===typeof setTimeout?setTimeout:void 0,pf=\"function\"===typeof clearTimeout?clearTimeout:void 0;function qf(a){1===a.nodeType?a.textContent=\"\":9===a.nodeType&&(a=a.body,null!=a&&(a.textContent=\"\"))}\nfunction rf(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}function sf(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(\"$\"===c||\"$!\"===c||\"$?\"===c){if(0===b)return a;b--}else\"/$\"===c&&b++}a=a.previousSibling}return null}var tf=0;function uf(a){return{$$typeof:Ga,toString:a,valueOf:a}}var vf=Math.random().toString(36).slice(2),wf=\"__reactFiber$\"+vf,xf=\"__reactProps$\"+vf,ff=\"__reactContainer$\"+vf,yf=\"__reactEvents$\"+vf;\nfunction wc(a){var b=a[wf];if(b)return b;for(var c=a.parentNode;c;){if(b=c[ff]||c[wf]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=sf(a);null!==a;){if(c=a[wf])return c;a=sf(a)}return b}a=c;c=a.parentNode}return null}function Cb(a){a=a[wf]||a[ff];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function ue(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(y(33));}function Db(a){return a[xf]||null}\nfunction $e(a){var b=a[yf];void 0===b&&(b=a[yf]=new Set);return b}var zf=[],Af=-1;function Bf(a){return{current:a}}function H(a){0>Af||(a.current=zf[Af],zf[Af]=null,Af--)}function I(a,b){Af++;zf[Af]=a.current;a.current=b}var Cf={},M=Bf(Cf),N=Bf(!1),Df=Cf;\nfunction Ef(a,b){var c=a.type.contextTypes;if(!c)return Cf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function Ff(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Gf(){H(N);H(M)}function Hf(a,b,c){if(M.current!==Cf)throw Error(y(168));I(M,b);I(N,c)}\nfunction If(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(y(108,Ra(b)||\"Unknown\",e));return m({},c,d)}function Jf(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Cf;Df=M.current;I(M,a);I(N,N.current);return!0}function Kf(a,b,c){var d=a.stateNode;if(!d)throw Error(y(169));c?(a=If(a,b,Df),d.__reactInternalMemoizedMergedChildContext=a,H(N),H(M),I(M,a)):H(N);I(N,c)}\nvar Lf=null,Mf=null,Nf=r.unstable_runWithPriority,Of=r.unstable_scheduleCallback,Pf=r.unstable_cancelCallback,Qf=r.unstable_shouldYield,Rf=r.unstable_requestPaint,Sf=r.unstable_now,Tf=r.unstable_getCurrentPriorityLevel,Uf=r.unstable_ImmediatePriority,Vf=r.unstable_UserBlockingPriority,Wf=r.unstable_NormalPriority,Xf=r.unstable_LowPriority,Yf=r.unstable_IdlePriority,Zf={},$f=void 0!==Rf?Rf:function(){},ag=null,bg=null,cg=!1,dg=Sf(),O=1E4>dg?Sf:function(){return Sf()-dg};\nfunction eg(){switch(Tf()){case Uf:return 99;case Vf:return 98;case Wf:return 97;case Xf:return 96;case Yf:return 95;default:throw Error(y(332));}}function fg(a){switch(a){case 99:return Uf;case 98:return Vf;case 97:return Wf;case 96:return Xf;case 95:return Yf;default:throw Error(y(332));}}function gg(a,b){a=fg(a);return Nf(a,b)}function hg(a,b,c){a=fg(a);return Of(a,b,c)}function ig(){if(null!==bg){var a=bg;bg=null;Pf(a)}jg()}\nfunction jg(){if(!cg&&null!==ag){cg=!0;var a=0;try{var b=ag;gg(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});ag=null}catch(c){throw null!==ag&&(ag=ag.slice(a+1)),Of(Uf,ig),c;}finally{cg=!1}}}var kg=ra.ReactCurrentBatchConfig;function lg(a,b){if(a&&a.defaultProps){b=m({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c]);return b}return b}var mg=Bf(null),ng=null,og=null,pg=null;function qg(){pg=og=ng=null}\nfunction rg(a){var b=mg.current;H(mg);a.type._context._currentValue=b}function sg(a,b){for(;null!==a;){var c=a.alternate;if((a.childLanes&b)===b)if(null===c||(c.childLanes&b)===b)break;else c.childLanes|=b;else a.childLanes|=b,null!==c&&(c.childLanes|=b);a=a.return}}function tg(a,b){ng=a;pg=og=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(ug=!0),a.firstContext=null)}\nfunction vg(a,b){if(pg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)pg=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===og){if(null===ng)throw Error(y(308));og=b;ng.dependencies={lanes:0,firstContext:b,responders:null}}else og=og.next=b}return a._currentValue}var wg=!1;function xg(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}\nfunction yg(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function zg(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}function Ag(a,b){a=a.updateQueue;if(null!==a){a=a.shared;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}}\nfunction Bg(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction Cg(a,b,c,d){var e=a.updateQueue;wg=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var n=a.alternate;if(null!==n){n=n.updateQueue;var A=n.lastBaseUpdate;A!==g&&(null===A?n.firstBaseUpdate=l:A.next=l,n.lastBaseUpdate=k)}}if(null!==f){A=e.baseState;g=0;n=l=k=null;do{h=f.lane;var p=f.eventTime;if((d&h)===h){null!==n&&(n=n.next={eventTime:p,lane:0,tag:f.tag,payload:f.payload,callback:f.callback,\nnext:null});a:{var C=a,x=f;h=b;p=c;switch(x.tag){case 1:C=x.payload;if(\"function\"===typeof C){A=C.call(p,A,h);break a}A=C;break a;case 3:C.flags=C.flags&-4097|64;case 0:C=x.payload;h=\"function\"===typeof C?C.call(p,A,h):C;if(null===h||void 0===h)break a;A=m({},A,h);break a;case 2:wg=!0}}null!==f.callback&&(a.flags|=32,h=e.effects,null===h?e.effects=[f]:h.push(f))}else p={eventTime:p,lane:h,tag:f.tag,payload:f.payload,callback:f.callback,next:null},null===n?(l=n=p,k=A):n=n.next=p,g|=h;f=f.next;if(null===\nf)if(h=e.shared.pending,null===h)break;else f=h.next,h.next=null,e.lastBaseUpdate=h,e.shared.pending=null}while(1);null===n&&(k=A);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=n;Dg|=g;a.lanes=g;a.memoizedState=A}}function Eg(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=c;if(\"function\"!==typeof e)throw Error(y(191,e));e.call(d)}}}var Fg=(new aa.Component).refs;\nfunction Gg(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:m({},b,c);a.memoizedState=c;0===a.lanes&&(a.updateQueue.baseState=c)}\nvar Kg={isMounted:function(a){return(a=a._reactInternals)?Zb(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternals;var d=Hg(),e=Ig(a),f=zg(d,e);f.payload=b;void 0!==c&&null!==c&&(f.callback=c);Ag(a,f);Jg(a,e,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternals;var d=Hg(),e=Ig(a),f=zg(d,e);f.tag=1;f.payload=b;void 0!==c&&null!==c&&(f.callback=c);Ag(a,f);Jg(a,e,d)},enqueueForceUpdate:function(a,b){a=a._reactInternals;var c=Hg(),d=Ig(a),e=zg(c,d);e.tag=2;void 0!==b&&null!==b&&(e.callback=\nb);Ag(a,e);Jg(a,d,c)}};function Lg(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!Je(c,d)||!Je(e,f):!0}\nfunction Mg(a,b,c){var d=!1,e=Cf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=vg(f):(e=Ff(b)?Df:M.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Ef(a,e):Cf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Kg;a.stateNode=b;b._reactInternals=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Ng(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Kg.enqueueReplaceState(b,b.state,null)}\nfunction Og(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=Fg;xg(a);var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=vg(f):(f=Ff(b)?Df:M.current,e.context=Ef(a,f));Cg(a,c,e,d);e.state=a.memoizedState;f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Gg(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||\n(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Kg.enqueueReplaceState(e,e.state,null),Cg(a,c,e,d),e.state=a.memoizedState);\"function\"===typeof e.componentDidMount&&(a.flags|=4)}var Pg=Array.isArray;\nfunction Qg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(y(309));var d=c.stateNode}if(!d)throw Error(y(147,a));var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Fg&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if(\"string\"!==typeof a)throw Error(y(284));if(!c._owner)throw Error(y(290,a));}return a}\nfunction Rg(a,b){if(\"textarea\"!==a.type)throw Error(y(31,\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b));}\nfunction Sg(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.flags=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=Tg(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.flags=2,\nc):d;b.flags=2;return c}function g(b){a&&null===b.alternate&&(b.flags=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Ug(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props),d.ref=Qg(a,b,c),d.return=a,d;d=Vg(c.type,c.key,c.props,null,a.mode,d);d.ref=Qg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=\nWg(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function n(a,b,c,d,f){if(null===b||7!==b.tag)return b=Xg(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function A(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=Ug(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case sa:return c=Vg(b.type,b.key,b.props,null,a.mode,c),c.ref=Qg(a,null,b),c.return=a,c;case ta:return b=Wg(b,a.mode,c),b.return=a,b}if(Pg(b)||La(b))return b=Xg(b,\na.mode,c,null),b.return=a,b;Rg(a,b)}return null}function p(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case sa:return c.key===e?c.type===ua?n(a,b,c.props.children,d,e):k(a,b,c,d):null;case ta:return c.key===e?l(a,b,c,d):null}if(Pg(c)||La(c))return null!==e?null:n(a,b,c,d,null);Rg(a,c)}return null}function C(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=a.get(c)||\nnull,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case sa:return a=a.get(null===d.key?c:d.key)||null,d.type===ua?n(b,a,d.props.children,e,d.key):k(b,a,d,e);case ta:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Pg(d)||La(d))return a=a.get(c)||null,n(b,a,d,e,null);Rg(b,d)}return null}function x(e,g,h,k){for(var l=null,t=null,u=g,z=g=0,q=null;null!==u&&z<h.length;z++){u.index>z?(q=u,u=null):q=u.sibling;var n=p(e,u,h[z],k);if(null===n){null===u&&(u=q);break}a&&u&&null===\nn.alternate&&b(e,u);g=f(n,g,z);null===t?l=n:t.sibling=n;t=n;u=q}if(z===h.length)return c(e,u),l;if(null===u){for(;z<h.length;z++)u=A(e,h[z],k),null!==u&&(g=f(u,g,z),null===t?l=u:t.sibling=u,t=u);return l}for(u=d(e,u);z<h.length;z++)q=C(u,e,z,h[z],k),null!==q&&(a&&null!==q.alternate&&u.delete(null===q.key?z:q.key),g=f(q,g,z),null===t?l=q:t.sibling=q,t=q);a&&u.forEach(function(a){return b(e,a)});return l}function w(e,g,h,k){var l=La(h);if(\"function\"!==typeof l)throw Error(y(150));h=l.call(h);if(null==\nh)throw Error(y(151));for(var t=l=null,u=g,z=g=0,q=null,n=h.next();null!==u&&!n.done;z++,n=h.next()){u.index>z?(q=u,u=null):q=u.sibling;var w=p(e,u,n.value,k);if(null===w){null===u&&(u=q);break}a&&u&&null===w.alternate&&b(e,u);g=f(w,g,z);null===t?l=w:t.sibling=w;t=w;u=q}if(n.done)return c(e,u),l;if(null===u){for(;!n.done;z++,n=h.next())n=A(e,n.value,k),null!==n&&(g=f(n,g,z),null===t?l=n:t.sibling=n,t=n);return l}for(u=d(e,u);!n.done;z++,n=h.next())n=C(u,e,z,n.value,k),null!==n&&(a&&null!==n.alternate&&\nu.delete(null===n.key?z:n.key),g=f(n,g,z),null===t?l=n:t.sibling=n,t=n);a&&u.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===ua&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case sa:a:{l=f.key;for(k=d;null!==k;){if(k.key===l){switch(k.tag){case 7:if(f.type===ua){c(a,k.sibling);d=e(k,f.props.children);d.return=a;a=d;break a}break;default:if(k.elementType===f.type){c(a,k.sibling);\nd=e(k,f.props);d.ref=Qg(a,k,f);d.return=a;a=d;break a}}c(a,k);break}else b(a,k);k=k.sibling}f.type===ua?(d=Xg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Vg(f.type,f.key,f.props,null,a.mode,h),h.ref=Qg(a,d,f),h.return=a,a=h)}return g(a);case ta:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=\nWg(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===typeof f||\"number\"===typeof f)return f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=Ug(f,a.mode,h),d.return=a,a=d),g(a);if(Pg(f))return x(a,d,f,h);if(La(f))return w(a,d,f,h);l&&Rg(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 22:case 0:case 11:case 15:throw Error(y(152,Ra(a.type)||\"Component\"));}return c(a,d)}}var Yg=Sg(!0),Zg=Sg(!1),$g={},ah=Bf($g),bh=Bf($g),ch=Bf($g);\nfunction dh(a){if(a===$g)throw Error(y(174));return a}function eh(a,b){I(ch,b);I(bh,a);I(ah,$g);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:mb(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=mb(b,a)}H(ah);I(ah,b)}function fh(){H(ah);H(bh);H(ch)}function gh(a){dh(ch.current);var b=dh(ah.current);var c=mb(b,a.type);b!==c&&(I(bh,a),I(ah,c))}function hh(a){bh.current===a&&(H(ah),H(bh))}var P=Bf(0);\nfunction ih(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||\"$?\"===c.data||\"$!\"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var jh=null,kh=null,lh=!1;\nfunction mh(a,b){var c=nh(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.flags=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function oh(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction ph(a){if(lh){var b=kh;if(b){var c=b;if(!oh(a,b)){b=rf(c.nextSibling);if(!b||!oh(a,b)){a.flags=a.flags&-1025|2;lh=!1;jh=a;return}mh(jh,c)}jh=a;kh=rf(b.firstChild)}else a.flags=a.flags&-1025|2,lh=!1,jh=a}}function qh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;jh=a}\nfunction rh(a){if(a!==jh)return!1;if(!lh)return qh(a),lh=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!nf(b,a.memoizedProps))for(b=kh;b;)mh(a,b),b=rf(b.nextSibling);qh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(y(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(\"/$\"===c){if(0===b){kh=rf(a.nextSibling);break a}b--}else\"$\"!==c&&\"$!\"!==c&&\"$?\"!==c||b++}a=a.nextSibling}kh=null}}else kh=jh?rf(a.stateNode.nextSibling):null;return!0}\nfunction sh(){kh=jh=null;lh=!1}var th=[];function uh(){for(var a=0;a<th.length;a++)th[a]._workInProgressVersionPrimary=null;th.length=0}var vh=ra.ReactCurrentDispatcher,wh=ra.ReactCurrentBatchConfig,xh=0,R=null,S=null,T=null,yh=!1,zh=!1;function Ah(){throw Error(y(321));}function Bh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!He(a[c],b[c]))return!1;return!0}\nfunction Ch(a,b,c,d,e,f){xh=f;R=b;b.memoizedState=null;b.updateQueue=null;b.lanes=0;vh.current=null===a||null===a.memoizedState?Dh:Eh;a=c(d,e);if(zh){f=0;do{zh=!1;if(!(25>f))throw Error(y(301));f+=1;T=S=null;b.updateQueue=null;vh.current=Fh;a=c(d,e)}while(zh)}vh.current=Gh;b=null!==S&&null!==S.next;xh=0;T=S=R=null;yh=!1;if(b)throw Error(y(300));return a}function Hh(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===T?R.memoizedState=T=a:T=T.next=a;return T}\nfunction Ih(){if(null===S){var a=R.alternate;a=null!==a?a.memoizedState:null}else a=S.next;var b=null===T?R.memoizedState:T.next;if(null!==b)T=b,S=a;else{if(null===a)throw Error(y(310));S=a;a={memoizedState:S.memoizedState,baseState:S.baseState,baseQueue:S.baseQueue,queue:S.queue,next:null};null===T?R.memoizedState=T=a:T=T.next=a}return T}function Jh(a,b){return\"function\"===typeof b?b(a):b}\nfunction Kh(a){var b=Ih(),c=b.queue;if(null===c)throw Error(y(311));c.lastRenderedReducer=a;var d=S,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,k=e;do{var l=k.lane;if((xh&l)===l)null!==h&&(h=h.next={lane:0,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null}),d=k.eagerReducer===a?k.eagerState:a(d,k.action);else{var n={lane:l,action:k.action,eagerReducer:k.eagerReducer,\neagerState:k.eagerState,next:null};null===h?(g=h=n,f=d):h=h.next=n;R.lanes|=l;Dg|=l}k=k.next}while(null!==k&&k!==e);null===h?f=d:h.next=g;He(d,b.memoizedState)||(ug=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,c.dispatch]}\nfunction Lh(a){var b=Ih(),c=b.queue;if(null===c)throw Error(y(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);He(f,b.memoizedState)||(ug=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}\nfunction Mh(a,b,c){var d=b._getVersion;d=d(b._source);var e=b._workInProgressVersionPrimary;if(null!==e)a=e===d;else if(a=a.mutableReadLanes,a=(xh&a)===a)b._workInProgressVersionPrimary=d,th.push(b);if(a)return c(b._source);th.push(b);throw Error(y(350));}\nfunction Nh(a,b,c,d){var e=U;if(null===e)throw Error(y(349));var f=b._getVersion,g=f(b._source),h=vh.current,k=h.useState(function(){return Mh(e,b,c)}),l=k[1],n=k[0];k=T;var A=a.memoizedState,p=A.refs,C=p.getSnapshot,x=A.source;A=A.subscribe;var w=R;a.memoizedState={refs:p,source:b,subscribe:d};h.useEffect(function(){p.getSnapshot=c;p.setSnapshot=l;var a=f(b._source);if(!He(g,a)){a=c(b._source);He(n,a)||(l(a),a=Ig(w),e.mutableReadLanes|=a&e.pendingLanes);a=e.mutableReadLanes;e.entangledLanes|=a;for(var d=\ne.entanglements,h=a;0<h;){var k=31-Vc(h),v=1<<k;d[k]|=a;h&=~v}}},[c,b,d]);h.useEffect(function(){return d(b._source,function(){var a=p.getSnapshot,c=p.setSnapshot;try{c(a(b._source));var d=Ig(w);e.mutableReadLanes|=d&e.pendingLanes}catch(q){c(function(){throw q;})}})},[b,d]);He(C,c)&&He(x,b)&&He(A,d)||(a={pending:null,dispatch:null,lastRenderedReducer:Jh,lastRenderedState:n},a.dispatch=l=Oh.bind(null,R,a),k.queue=a,k.baseQueue=null,n=Mh(e,b,c),k.memoizedState=k.baseState=n);return n}\nfunction Ph(a,b,c){var d=Ih();return Nh(d,a,b,c)}function Qh(a){var b=Hh();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={pending:null,dispatch:null,lastRenderedReducer:Jh,lastRenderedState:a};a=a.dispatch=Oh.bind(null,R,a);return[b.memoizedState,a]}\nfunction Rh(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=R.updateQueue;null===b?(b={lastEffect:null},R.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function Sh(a){var b=Hh();a={current:a};return b.memoizedState=a}function Th(){return Ih().memoizedState}function Uh(a,b,c,d){var e=Hh();R.flags|=a;e.memoizedState=Rh(1|b,c,void 0,void 0===d?null:d)}\nfunction Vh(a,b,c,d){var e=Ih();d=void 0===d?null:d;var f=void 0;if(null!==S){var g=S.memoizedState;f=g.destroy;if(null!==d&&Bh(d,g.deps)){Rh(b,c,f,d);return}}R.flags|=a;e.memoizedState=Rh(1|b,c,f,d)}function Wh(a,b){return Uh(516,4,a,b)}function Xh(a,b){return Vh(516,4,a,b)}function Yh(a,b){return Vh(4,2,a,b)}function Zh(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}\nfunction $h(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Vh(4,2,Zh.bind(null,b,a),c)}function ai(){}function bi(a,b){var c=Ih();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Bh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}function ci(a,b){var c=Ih();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Bh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}\nfunction di(a,b){var c=eg();gg(98>c?98:c,function(){a(!0)});gg(97<c?97:c,function(){var c=wh.transition;wh.transition=1;try{a(!1),b()}finally{wh.transition=c}})}\nfunction Oh(a,b,c){var d=Hg(),e=Ig(a),f={lane:e,action:c,eagerReducer:null,eagerState:null,next:null},g=b.pending;null===g?f.next=f:(f.next=g.next,g.next=f);b.pending=f;g=a.alternate;if(a===R||null!==g&&g===R)zh=yh=!0;else{if(0===a.lanes&&(null===g||0===g.lanes)&&(g=b.lastRenderedReducer,null!==g))try{var h=b.lastRenderedState,k=g(h,c);f.eagerReducer=g;f.eagerState=k;if(He(k,h))return}catch(l){}finally{}Jg(a,e,d)}}\nvar Gh={readContext:vg,useCallback:Ah,useContext:Ah,useEffect:Ah,useImperativeHandle:Ah,useLayoutEffect:Ah,useMemo:Ah,useReducer:Ah,useRef:Ah,useState:Ah,useDebugValue:Ah,useDeferredValue:Ah,useTransition:Ah,useMutableSource:Ah,useOpaqueIdentifier:Ah,unstable_isNewReconciler:!1},Dh={readContext:vg,useCallback:function(a,b){Hh().memoizedState=[a,void 0===b?null:b];return a},useContext:vg,useEffect:Wh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Uh(4,2,Zh.bind(null,\nb,a),c)},useLayoutEffect:function(a,b){return Uh(4,2,a,b)},useMemo:function(a,b){var c=Hh();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Hh();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={pending:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=Oh.bind(null,R,a);return[d.memoizedState,a]},useRef:Sh,useState:Qh,useDebugValue:ai,useDeferredValue:function(a){var b=Qh(a),c=b[0],d=b[1];Wh(function(){var b=wh.transition;\nwh.transition=1;try{d(a)}finally{wh.transition=b}},[a]);return c},useTransition:function(){var a=Qh(!1),b=a[0];a=di.bind(null,a[1]);Sh(a);return[a,b]},useMutableSource:function(a,b,c){var d=Hh();d.memoizedState={refs:{getSnapshot:b,setSnapshot:null},source:a,subscribe:c};return Nh(d,a,b,c)},useOpaqueIdentifier:function(){if(lh){var a=!1,b=uf(function(){a||(a=!0,c(\"r:\"+(tf++).toString(36)));throw Error(y(355));}),c=Qh(b)[1];0===(R.mode&2)&&(R.flags|=516,Rh(5,function(){c(\"r:\"+(tf++).toString(36))},\nvoid 0,null));return b}b=\"r:\"+(tf++).toString(36);Qh(b);return b},unstable_isNewReconciler:!1},Eh={readContext:vg,useCallback:bi,useContext:vg,useEffect:Xh,useImperativeHandle:$h,useLayoutEffect:Yh,useMemo:ci,useReducer:Kh,useRef:Th,useState:function(){return Kh(Jh)},useDebugValue:ai,useDeferredValue:function(a){var b=Kh(Jh),c=b[0],d=b[1];Xh(function(){var b=wh.transition;wh.transition=1;try{d(a)}finally{wh.transition=b}},[a]);return c},useTransition:function(){var a=Kh(Jh)[0];return[Th().current,\na]},useMutableSource:Ph,useOpaqueIdentifier:function(){return Kh(Jh)[0]},unstable_isNewReconciler:!1},Fh={readContext:vg,useCallback:bi,useContext:vg,useEffect:Xh,useImperativeHandle:$h,useLayoutEffect:Yh,useMemo:ci,useReducer:Lh,useRef:Th,useState:function(){return Lh(Jh)},useDebugValue:ai,useDeferredValue:function(a){var b=Lh(Jh),c=b[0],d=b[1];Xh(function(){var b=wh.transition;wh.transition=1;try{d(a)}finally{wh.transition=b}},[a]);return c},useTransition:function(){var a=Lh(Jh)[0];return[Th().current,\na]},useMutableSource:Ph,useOpaqueIdentifier:function(){return Lh(Jh)[0]},unstable_isNewReconciler:!1},ei=ra.ReactCurrentOwner,ug=!1;function fi(a,b,c,d){b.child=null===a?Zg(b,null,c,d):Yg(b,a.child,c,d)}function gi(a,b,c,d,e){c=c.render;var f=b.ref;tg(b,e);d=Ch(a,b,c,d,f,e);if(null!==a&&!ug)return b.updateQueue=a.updateQueue,b.flags&=-517,a.lanes&=~e,hi(a,b,e);b.flags|=1;fi(a,b,d,e);return b.child}\nfunction ii(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!ji(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ki(a,b,g,d,e,f);a=Vg(c.type,null,d,b,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(0===(e&f)&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:Je,c(e,d)&&a.ref===b.ref))return hi(a,b,f);b.flags|=1;a=Tg(g,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction ki(a,b,c,d,e,f){if(null!==a&&Je(a.memoizedProps,d)&&a.ref===b.ref)if(ug=!1,0!==(f&e))0!==(a.flags&16384)&&(ug=!0);else return b.lanes=a.lanes,hi(a,b,f);return li(a,b,c,d,f)}\nfunction mi(a,b,c){var d=b.pendingProps,e=d.children,f=null!==a?a.memoizedState:null;if(\"hidden\"===d.mode||\"unstable-defer-without-hiding\"===d.mode)if(0===(b.mode&4))b.memoizedState={baseLanes:0},ni(b,c);else if(0!==(c&1073741824))b.memoizedState={baseLanes:0},ni(b,null!==f?f.baseLanes:c);else return a=null!==f?f.baseLanes|c:c,b.lanes=b.childLanes=1073741824,b.memoizedState={baseLanes:a},ni(b,a),null;else null!==f?(d=f.baseLanes|c,b.memoizedState=null):d=c,ni(b,d);fi(a,b,e,c);return b.child}\nfunction oi(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.flags|=128}function li(a,b,c,d,e){var f=Ff(c)?Df:M.current;f=Ef(b,f);tg(b,e);c=Ch(a,b,c,d,f,e);if(null!==a&&!ug)return b.updateQueue=a.updateQueue,b.flags&=-517,a.lanes&=~e,hi(a,b,e);b.flags|=1;fi(a,b,c,e);return b.child}\nfunction pi(a,b,c,d,e){if(Ff(c)){var f=!0;Jf(b)}else f=!1;tg(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2),Mg(b,c,d),Og(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=vg(l):(l=Ff(c)?Df:M.current,l=Ef(b,l));var n=c.getDerivedStateFromProps,A=\"function\"===typeof n||\"function\"===typeof g.getSnapshotBeforeUpdate;A||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\n\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Ng(b,g,d,l);wg=!1;var p=b.memoizedState;g.state=p;Cg(b,d,g,e);k=b.memoizedState;h!==d||p!==k||N.current||wg?(\"function\"===typeof n&&(Gg(b,c,n,d),k=b.memoizedState),(h=wg||Lg(b,c,h,d,p,k,l))?(A||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===\ntypeof g.componentDidMount&&(b.flags|=4)):(\"function\"===typeof g.componentDidMount&&(b.flags|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.flags|=4),d=!1)}else{g=b.stateNode;yg(a,b);h=b.memoizedProps;l=b.type===b.elementType?h:lg(b.type,h);g.props=l;A=b.pendingProps;p=g.context;k=c.contextType;\"object\"===typeof k&&null!==k?k=vg(k):(k=Ff(c)?Df:M.current,k=Ef(b,k));var C=c.getDerivedStateFromProps;(n=\"function\"===typeof C||\n\"function\"===typeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==A||p!==k)&&Ng(b,g,d,k);wg=!1;p=b.memoizedState;g.state=p;Cg(b,d,g,e);var x=b.memoizedState;h!==A||p!==x||N.current||wg?(\"function\"===typeof C&&(Gg(b,c,C,d),x=b.memoizedState),(l=wg||Lg(b,c,l,d,p,x,k))?(n||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,\nx,k),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,x,k)),\"function\"===typeof g.componentDidUpdate&&(b.flags|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.flags|=256)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&p===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&p===a.memoizedState||(b.flags|=256),b.memoizedProps=d,b.memoizedState=x),g.props=d,g.state=x,g.context=k,d=l):(\"function\"!==typeof g.componentDidUpdate||\nh===a.memoizedProps&&p===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&p===a.memoizedState||(b.flags|=256),d=!1)}return qi(a,b,c,d,f,e)}\nfunction qi(a,b,c,d,e,f){oi(a,b);var g=0!==(b.flags&64);if(!d&&!g)return e&&Kf(b,c,!1),hi(a,b,f);d=b.stateNode;ei.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.flags|=1;null!==a&&g?(b.child=Yg(b,a.child,null,f),b.child=Yg(b,null,h,f)):fi(a,b,h,f);b.memoizedState=d.state;e&&Kf(b,c,!0);return b.child}function ri(a){var b=a.stateNode;b.pendingContext?Hf(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Hf(a,b.context,!1);eh(a,b.containerInfo)}\nvar si={dehydrated:null,retryLane:0};\nfunction ti(a,b,c){var d=b.pendingProps,e=P.current,f=!1,g;(g=0!==(b.flags&64))||(g=null!==a&&null===a.memoizedState?!1:0!==(e&2));g?(f=!0,b.flags&=-65):null!==a&&null===a.memoizedState||void 0===d.fallback||!0===d.unstable_avoidThisFallback||(e|=1);I(P,e&1);if(null===a){void 0!==d.fallback&&ph(b);a=d.children;e=d.fallback;if(f)return a=ui(b,a,e,c),b.child.memoizedState={baseLanes:c},b.memoizedState=si,a;if(\"number\"===typeof d.unstable_expectedLoadTime)return a=ui(b,a,e,c),b.child.memoizedState={baseLanes:c},\nb.memoizedState=si,b.lanes=33554432,a;c=vi({mode:\"visible\",children:a},b.mode,c,null);c.return=b;return b.child=c}if(null!==a.memoizedState){if(f)return d=wi(a,b,d.children,d.fallback,c),f=b.child,e=a.child.memoizedState,f.memoizedState=null===e?{baseLanes:c}:{baseLanes:e.baseLanes|c},f.childLanes=a.childLanes&~c,b.memoizedState=si,d;c=xi(a,b,d.children,c);b.memoizedState=null;return c}if(f)return d=wi(a,b,d.children,d.fallback,c),f=b.child,e=a.child.memoizedState,f.memoizedState=null===e?{baseLanes:c}:\n{baseLanes:e.baseLanes|c},f.childLanes=a.childLanes&~c,b.memoizedState=si,d;c=xi(a,b,d.children,c);b.memoizedState=null;return c}function ui(a,b,c,d){var e=a.mode,f=a.child;b={mode:\"hidden\",children:b};0===(e&2)&&null!==f?(f.childLanes=0,f.pendingProps=b):f=vi(b,e,0,null);c=Xg(c,e,d,null);f.return=a;c.return=a;f.sibling=c;a.child=f;return c}\nfunction xi(a,b,c,d){var e=a.child;a=e.sibling;c=Tg(e,{mode:\"visible\",children:c});0===(b.mode&2)&&(c.lanes=d);c.return=b;c.sibling=null;null!==a&&(a.nextEffect=null,a.flags=8,b.firstEffect=b.lastEffect=a);return b.child=c}\nfunction wi(a,b,c,d,e){var f=b.mode,g=a.child;a=g.sibling;var h={mode:\"hidden\",children:c};0===(f&2)&&b.child!==g?(c=b.child,c.childLanes=0,c.pendingProps=h,g=c.lastEffect,null!==g?(b.firstEffect=c.firstEffect,b.lastEffect=g,g.nextEffect=null):b.firstEffect=b.lastEffect=null):c=Tg(g,h);null!==a?d=Tg(a,d):(d=Xg(d,f,e,null),d.flags|=2);d.return=b;c.return=b;c.sibling=d;b.child=c;return d}function yi(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);sg(a.return,b)}\nfunction zi(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailMode:e,lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.renderingStartTime=0,g.last=d,g.tail=c,g.tailMode=e,g.lastEffect=f)}\nfunction Ai(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;fi(a,b,d.children,c);d=P.current;if(0!==(d&2))d=d&1|2,b.flags|=64;else{if(null!==a&&0!==(a.flags&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&yi(a,c);else if(19===a.tag)yi(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}I(P,d);if(0===(b.mode&2))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===ih(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);zi(b,!1,e,c,f,b.lastEffect);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===ih(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}zi(b,!0,c,null,f,b.lastEffect);break;case \"together\":zi(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}\nfunction hi(a,b,c){null!==a&&(b.dependencies=a.dependencies);Dg|=b.lanes;if(0!==(c&b.childLanes)){if(null!==a&&b.child!==a.child)throw Error(y(153));if(null!==b.child){a=b.child;c=Tg(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Tg(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}return null}var Bi,Ci,Di,Ei;\nBi=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};Ci=function(){};\nDi=function(a,b,c,d){var e=a.memoizedProps;if(e!==d){a=b.stateNode;dh(ah.current);var f=null;switch(c){case \"input\":e=Ya(a,e);d=Ya(a,d);f=[];break;case \"option\":e=eb(a,e);d=eb(a,d);f=[];break;case \"select\":e=m({},e,{value:void 0});d=m({},d,{value:void 0});f=[];break;case \"textarea\":e=gb(a,e);d=gb(a,d);f=[];break;default:\"function\"!==typeof e.onClick&&\"function\"===typeof d.onClick&&(a.onclick=jf)}vb(c,d);var g;c=null;for(l in e)if(!d.hasOwnProperty(l)&&e.hasOwnProperty(l)&&null!=e[l])if(\"style\"===\nl){var h=e[l];for(g in h)h.hasOwnProperty(g)&&(c||(c={}),c[g]=\"\")}else\"dangerouslySetInnerHTML\"!==l&&\"children\"!==l&&\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&\"autoFocus\"!==l&&(ca.hasOwnProperty(l)?f||(f=[]):(f=f||[]).push(l,null));for(l in d){var k=d[l];h=null!=e?e[l]:void 0;if(d.hasOwnProperty(l)&&k!==h&&(null!=k||null!=h))if(\"style\"===l)if(h){for(g in h)!h.hasOwnProperty(g)||k&&k.hasOwnProperty(g)||(c||(c={}),c[g]=\"\");for(g in k)k.hasOwnProperty(g)&&h[g]!==k[g]&&(c||\n(c={}),c[g]=k[g])}else c||(f||(f=[]),f.push(l,c)),c=k;else\"dangerouslySetInnerHTML\"===l?(k=k?k.__html:void 0,h=h?h.__html:void 0,null!=k&&h!==k&&(f=f||[]).push(l,k)):\"children\"===l?\"string\"!==typeof k&&\"number\"!==typeof k||(f=f||[]).push(l,\"\"+k):\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&(ca.hasOwnProperty(l)?(null!=k&&\"onScroll\"===l&&G(\"scroll\",a),f||h===k||(f=[])):\"object\"===typeof k&&null!==k&&k.$$typeof===Ga?k.toString():(f=f||[]).push(l,k))}c&&(f=f||[]).push(\"style\",\nc);var l=f;if(b.updateQueue=l)b.flags|=4}};Ei=function(a,b,c,d){c!==d&&(b.flags|=4)};function Fi(a,b){if(!lh)switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction Gi(a,b,c){var d=b.pendingProps;switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return Ff(b.type)&&Gf(),null;case 3:fh();H(N);H(M);uh();d=b.stateNode;d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)rh(b)?b.flags|=4:d.hydrate||(b.flags|=256);Ci(b);return null;case 5:hh(b);var e=dh(ch.current);c=b.type;if(null!==a&&null!=b.stateNode)Di(a,b,c,d,e),a.ref!==b.ref&&(b.flags|=128);else{if(!d){if(null===\nb.stateNode)throw Error(y(166));return null}a=dh(ah.current);if(rh(b)){d=b.stateNode;c=b.type;var f=b.memoizedProps;d[wf]=b;d[xf]=f;switch(c){case \"dialog\":G(\"cancel\",d);G(\"close\",d);break;case \"iframe\":case \"object\":case \"embed\":G(\"load\",d);break;case \"video\":case \"audio\":for(a=0;a<Xe.length;a++)G(Xe[a],d);break;case \"source\":G(\"error\",d);break;case \"img\":case \"image\":case \"link\":G(\"error\",d);G(\"load\",d);break;case \"details\":G(\"toggle\",d);break;case \"input\":Za(d,f);G(\"invalid\",d);break;case \"select\":d._wrapperState=\n{wasMultiple:!!f.multiple};G(\"invalid\",d);break;case \"textarea\":hb(d,f),G(\"invalid\",d)}vb(c,f);a=null;for(var g in f)f.hasOwnProperty(g)&&(e=f[g],\"children\"===g?\"string\"===typeof e?d.textContent!==e&&(a=[\"children\",e]):\"number\"===typeof e&&d.textContent!==\"\"+e&&(a=[\"children\",\"\"+e]):ca.hasOwnProperty(g)&&null!=e&&\"onScroll\"===g&&G(\"scroll\",d));switch(c){case \"input\":Va(d);cb(d,f,!0);break;case \"textarea\":Va(d);jb(d);break;case \"select\":case \"option\":break;default:\"function\"===typeof f.onClick&&(d.onclick=\njf)}d=a;b.updateQueue=d;null!==d&&(b.flags|=4)}else{g=9===e.nodeType?e:e.ownerDocument;a===kb.html&&(a=lb(c));a===kb.html?\"script\"===c?(a=g.createElement(\"div\"),a.innerHTML=\"<script>\\x3c/script>\",a=a.removeChild(a.firstChild)):\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[wf]=b;a[xf]=d;Bi(a,b,!1,!1);b.stateNode=a;g=wb(c,d);switch(c){case \"dialog\":G(\"cancel\",a);G(\"close\",a);\ne=d;break;case \"iframe\":case \"object\":case \"embed\":G(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;e<Xe.length;e++)G(Xe[e],a);e=d;break;case \"source\":G(\"error\",a);e=d;break;case \"img\":case \"image\":case \"link\":G(\"error\",a);G(\"load\",a);e=d;break;case \"details\":G(\"toggle\",a);e=d;break;case \"input\":Za(a,d);e=Ya(a,d);G(\"invalid\",a);break;case \"option\":e=eb(a,d);break;case \"select\":a._wrapperState={wasMultiple:!!d.multiple};e=m({},d,{value:void 0});G(\"invalid\",a);break;case \"textarea\":hb(a,d);e=\ngb(a,d);G(\"invalid\",a);break;default:e=d}vb(c,e);var h=e;for(f in h)if(h.hasOwnProperty(f)){var k=h[f];\"style\"===f?tb(a,k):\"dangerouslySetInnerHTML\"===f?(k=k?k.__html:void 0,null!=k&&ob(a,k)):\"children\"===f?\"string\"===typeof k?(\"textarea\"!==c||\"\"!==k)&&pb(a,k):\"number\"===typeof k&&pb(a,\"\"+k):\"suppressContentEditableWarning\"!==f&&\"suppressHydrationWarning\"!==f&&\"autoFocus\"!==f&&(ca.hasOwnProperty(f)?null!=k&&\"onScroll\"===f&&G(\"scroll\",a):null!=k&&qa(a,f,k,g))}switch(c){case \"input\":Va(a);cb(a,d,!1);\nbreak;case \"textarea\":Va(a);jb(a);break;case \"option\":null!=d.value&&a.setAttribute(\"value\",\"\"+Sa(d.value));break;case \"select\":a.multiple=!!d.multiple;f=d.value;null!=f?fb(a,!!d.multiple,f,!1):null!=d.defaultValue&&fb(a,!!d.multiple,d.defaultValue,!0);break;default:\"function\"===typeof e.onClick&&(a.onclick=jf)}mf(c,d)&&(b.flags|=4)}null!==b.ref&&(b.flags|=128)}return null;case 6:if(a&&null!=b.stateNode)Ei(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d&&null===b.stateNode)throw Error(y(166));\nc=dh(ch.current);dh(ah.current);rh(b)?(d=b.stateNode,c=b.memoizedProps,d[wf]=b,d.nodeValue!==c&&(b.flags|=4)):(d=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),d[wf]=b,b.stateNode=d)}return null;case 13:H(P);d=b.memoizedState;if(0!==(b.flags&64))return b.lanes=c,b;d=null!==d;c=!1;null===a?void 0!==b.memoizedProps.fallback&&rh(b):c=null!==a.memoizedState;if(d&&!c&&0!==(b.mode&2))if(null===a&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(P.current&1))0===V&&(V=3);else{if(0===V||3===V)V=\n4;null===U||0===(Dg&134217727)&&0===(Hi&134217727)||Ii(U,W)}if(d||c)b.flags|=4;return null;case 4:return fh(),Ci(b),null===a&&cf(b.stateNode.containerInfo),null;case 10:return rg(b),null;case 17:return Ff(b.type)&&Gf(),null;case 19:H(P);d=b.memoizedState;if(null===d)return null;f=0!==(b.flags&64);g=d.rendering;if(null===g)if(f)Fi(d,!1);else{if(0!==V||null!==a&&0!==(a.flags&64))for(a=b.child;null!==a;){g=ih(a);if(null!==g){b.flags|=64;Fi(d,!1);f=g.updateQueue;null!==f&&(b.updateQueue=f,b.flags|=4);\nnull===d.lastEffect&&(b.firstEffect=null);b.lastEffect=d.lastEffect;d=c;for(c=b.child;null!==c;)f=c,a=d,f.flags&=2,f.nextEffect=null,f.firstEffect=null,f.lastEffect=null,g=f.alternate,null===g?(f.childLanes=0,f.lanes=a,f.child=null,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null,f.stateNode=null):(f.childLanes=g.childLanes,f.lanes=g.lanes,f.child=g.child,f.memoizedProps=g.memoizedProps,f.memoizedState=g.memoizedState,f.updateQueue=g.updateQueue,f.type=g.type,a=g.dependencies,\nf.dependencies=null===a?null:{lanes:a.lanes,firstContext:a.firstContext}),c=c.sibling;I(P,P.current&1|2);return b.child}a=a.sibling}null!==d.tail&&O()>Ji&&(b.flags|=64,f=!0,Fi(d,!1),b.lanes=33554432)}else{if(!f)if(a=ih(g),null!==a){if(b.flags|=64,f=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Fi(d,!0),null===d.tail&&\"hidden\"===d.tailMode&&!g.alternate&&!lh)return b=b.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*O()-d.renderingStartTime>Ji&&1073741824!==c&&(b.flags|=\n64,f=!0,Fi(d,!1),b.lanes=33554432);d.isBackwards?(g.sibling=b.child,b.child=g):(c=d.last,null!==c?c.sibling=g:b.child=g,d.last=g)}return null!==d.tail?(c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=O(),c.sibling=null,b=P.current,I(P,f?b&1|2:b&1),c):null;case 23:case 24:return Ki(),null!==a&&null!==a.memoizedState!==(null!==b.memoizedState)&&\"unstable-defer-without-hiding\"!==d.mode&&(b.flags|=4),null}throw Error(y(156,b.tag));}\nfunction Li(a){switch(a.tag){case 1:Ff(a.type)&&Gf();var b=a.flags;return b&4096?(a.flags=b&-4097|64,a):null;case 3:fh();H(N);H(M);uh();b=a.flags;if(0!==(b&64))throw Error(y(285));a.flags=b&-4097|64;return a;case 5:return hh(a),null;case 13:return H(P),b=a.flags,b&4096?(a.flags=b&-4097|64,a):null;case 19:return H(P),null;case 4:return fh(),null;case 10:return rg(a),null;case 23:case 24:return Ki(),null;default:return null}}\nfunction Mi(a,b){try{var c=\"\",d=b;do c+=Qa(d),d=d.return;while(d);var e=c}catch(f){e=\"\\nError generating stack: \"+f.message+\"\\n\"+f.stack}return{value:a,source:b,stack:e}}function Ni(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}var Oi=\"function\"===typeof WeakMap?WeakMap:Map;function Pi(a,b,c){c=zg(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Qi||(Qi=!0,Ri=d);Ni(a,b)};return c}\nfunction Si(a,b,c){c=zg(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){Ni(a,b);return d(e)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){\"function\"!==typeof d&&(null===Ti?Ti=new Set([this]):Ti.add(this),Ni(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}var Ui=\"function\"===typeof WeakSet?WeakSet:Set;\nfunction Vi(a){var b=a.ref;if(null!==b)if(\"function\"===typeof b)try{b(null)}catch(c){Wi(a,c)}else b.current=null}function Xi(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.flags&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:lg(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:b.flags&256&&qf(b.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(y(163));}\nfunction Yi(a,b,c){switch(c.tag){case 0:case 11:case 15:case 22:b=c.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){a=b=b.next;do{if(3===(a.tag&3)){var d=a.create;a.destroy=d()}a=a.next}while(a!==b)}b=c.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){a=b=b.next;do{var e=a;d=e.next;e=e.tag;0!==(e&4)&&0!==(e&1)&&(Zi(c,a),$i(c,a));a=d}while(a!==b)}return;case 1:a=c.stateNode;c.flags&4&&(null===b?a.componentDidMount():(d=c.elementType===c.type?b.memoizedProps:lg(c.type,b.memoizedProps),a.componentDidUpdate(d,\nb.memoizedState,a.__reactInternalSnapshotBeforeUpdate)));b=c.updateQueue;null!==b&&Eg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Eg(c,b,a)}return;case 5:a=c.stateNode;null===b&&c.flags&4&&mf(c.type,c.memoizedProps)&&a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&Cc(c))));\nreturn;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(y(163));}\nfunction aj(a,b){for(var c=a;;){if(5===c.tag){var d=c.stateNode;if(b)d=d.style,\"function\"===typeof d.setProperty?d.setProperty(\"display\",\"none\",\"important\"):d.display=\"none\";else{d=c.stateNode;var e=c.memoizedProps.style;e=void 0!==e&&null!==e&&e.hasOwnProperty(\"display\")?e.display:null;d.style.display=sb(\"display\",e)}}else if(6===c.tag)c.stateNode.nodeValue=b?\"\":c.memoizedProps;else if((23!==c.tag&&24!==c.tag||null===c.memoizedState||c===a)&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===\na)break;for(;null===c.sibling;){if(null===c.return||c.return===a)return;c=c.return}c.sibling.return=c.return;c=c.sibling}}\nfunction bj(a,b){if(Mf&&\"function\"===typeof Mf.onCommitFiberUnmount)try{Mf.onCommitFiberUnmount(Lf,b)}catch(f){}switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var c=a=a.next;do{var d=c,e=d.destroy;d=d.tag;if(void 0!==e)if(0!==(d&4))Zi(b,c);else{d=b;try{e()}catch(f){Wi(d,f)}}c=c.next}while(c!==a)}break;case 1:Vi(b);a=b.stateNode;if(\"function\"===typeof a.componentWillUnmount)try{a.props=b.memoizedProps,a.state=b.memoizedState,a.componentWillUnmount()}catch(f){Wi(b,\nf)}break;case 5:Vi(b);break;case 4:cj(a,b)}}function dj(a){a.alternate=null;a.child=null;a.dependencies=null;a.firstEffect=null;a.lastEffect=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.return=null;a.updateQueue=null}function ej(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction fj(a){a:{for(var b=a.return;null!==b;){if(ej(b))break a;b=b.return}throw Error(y(160));}var c=b;b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(y(161));}c.flags&16&&(pb(b,\"\"),c.flags&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||ej(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.flags&2)continue b;if(null===\nc.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.flags&2)){c=c.stateNode;break a}}d?gj(a,c,b):hj(a,c,b)}\nfunction gj(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=jf));else if(4!==d&&(a=a.child,null!==a))for(gj(a,b,c),a=a.sibling;null!==a;)gj(a,b,c),a=a.sibling}\nfunction hj(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(hj(a,b,c),a=a.sibling;null!==a;)hj(a,b,c),a=a.sibling}\nfunction cj(a,b){for(var c=b,d=!1,e,f;;){if(!d){d=c.return;a:for(;;){if(null===d)throw Error(y(160));e=d.stateNode;switch(d.tag){case 5:f=!1;break a;case 3:e=e.containerInfo;f=!0;break a;case 4:e=e.containerInfo;f=!0;break a}d=d.return}d=!0}if(5===c.tag||6===c.tag){a:for(var g=a,h=c,k=h;;)if(bj(g,k),null!==k.child&&4!==k.tag)k.child.return=k,k=k.child;else{if(k===h)break a;for(;null===k.sibling;){if(null===k.return||k.return===h)break a;k=k.return}k.sibling.return=k.return;k=k.sibling}f?(g=e,h=c.stateNode,\n8===g.nodeType?g.parentNode.removeChild(h):g.removeChild(h)):e.removeChild(c.stateNode)}else if(4===c.tag){if(null!==c.child){e=c.stateNode.containerInfo;f=!0;c.child.return=c;c=c.child;continue}}else if(bj(a,c),null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return;4===c.tag&&(d=!1)}c.sibling.return=c.return;c=c.sibling}}\nfunction ij(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:var c=b.updateQueue;c=null!==c?c.lastEffect:null;if(null!==c){var d=c=c.next;do 3===(d.tag&3)&&(a=d.destroy,d.destroy=void 0,void 0!==a&&a()),d=d.next;while(d!==c)}return;case 1:return;case 5:c=b.stateNode;if(null!=c){d=b.memoizedProps;var e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[xf]=d;\"input\"===a&&\"radio\"===d.type&&null!=d.name&&$a(c,d);wb(a,e);b=wb(a,d);for(e=0;e<f.length;e+=\n2){var g=f[e],h=f[e+1];\"style\"===g?tb(c,h):\"dangerouslySetInnerHTML\"===g?ob(c,h):\"children\"===g?pb(c,h):qa(c,g,h,b)}switch(a){case \"input\":ab(c,d);break;case \"textarea\":ib(c,d);break;case \"select\":a=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,f=d.value,null!=f?fb(c,!!d.multiple,f,!1):a!==!!d.multiple&&(null!=d.defaultValue?fb(c,!!d.multiple,d.defaultValue,!0):fb(c,!!d.multiple,d.multiple?[]:\"\",!1))}}}return;case 6:if(null===b.stateNode)throw Error(y(162));b.stateNode.nodeValue=\nb.memoizedProps;return;case 3:c=b.stateNode;c.hydrate&&(c.hydrate=!1,Cc(c.containerInfo));return;case 12:return;case 13:null!==b.memoizedState&&(jj=O(),aj(b.child,!0));kj(b);return;case 19:kj(b);return;case 17:return;case 23:case 24:aj(b,null!==b.memoizedState);return}throw Error(y(163));}function kj(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Ui);b.forEach(function(b){var d=lj.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction mj(a,b){return null!==a&&(a=a.memoizedState,null===a||null!==a.dehydrated)?(b=b.memoizedState,null!==b&&null===b.dehydrated):!1}var nj=Math.ceil,oj=ra.ReactCurrentDispatcher,pj=ra.ReactCurrentOwner,X=0,U=null,Y=null,W=0,qj=0,rj=Bf(0),V=0,sj=null,tj=0,Dg=0,Hi=0,uj=0,vj=null,jj=0,Ji=Infinity;function wj(){Ji=O()+500}var Z=null,Qi=!1,Ri=null,Ti=null,xj=!1,yj=null,zj=90,Aj=[],Bj=[],Cj=null,Dj=0,Ej=null,Fj=-1,Gj=0,Hj=0,Ij=null,Jj=!1;function Hg(){return 0!==(X&48)?O():-1!==Fj?Fj:Fj=O()}\nfunction Ig(a){a=a.mode;if(0===(a&2))return 1;if(0===(a&4))return 99===eg()?1:2;0===Gj&&(Gj=tj);if(0!==kg.transition){0!==Hj&&(Hj=null!==vj?vj.pendingLanes:0);a=Gj;var b=4186112&~Hj;b&=-b;0===b&&(a=4186112&~a,b=a&-a,0===b&&(b=8192));return b}a=eg();0!==(X&4)&&98===a?a=Xc(12,Gj):(a=Sc(a),a=Xc(a,Gj));return a}\nfunction Jg(a,b,c){if(50<Dj)throw Dj=0,Ej=null,Error(y(185));a=Kj(a,b);if(null===a)return null;$c(a,b,c);a===U&&(Hi|=b,4===V&&Ii(a,W));var d=eg();1===b?0!==(X&8)&&0===(X&48)?Lj(a):(Mj(a,c),0===X&&(wj(),ig())):(0===(X&4)||98!==d&&99!==d||(null===Cj?Cj=new Set([a]):Cj.add(a)),Mj(a,c));vj=a}function Kj(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}\nfunction Mj(a,b){for(var c=a.callbackNode,d=a.suspendedLanes,e=a.pingedLanes,f=a.expirationTimes,g=a.pendingLanes;0<g;){var h=31-Vc(g),k=1<<h,l=f[h];if(-1===l){if(0===(k&d)||0!==(k&e)){l=b;Rc(k);var n=F;f[h]=10<=n?l+250:6<=n?l+5E3:-1}}else l<=b&&(a.expiredLanes|=k);g&=~k}d=Uc(a,a===U?W:0);b=F;if(0===d)null!==c&&(c!==Zf&&Pf(c),a.callbackNode=null,a.callbackPriority=0);else{if(null!==c){if(a.callbackPriority===b)return;c!==Zf&&Pf(c)}15===b?(c=Lj.bind(null,a),null===ag?(ag=[c],bg=Of(Uf,jg)):ag.push(c),\nc=Zf):14===b?c=hg(99,Lj.bind(null,a)):(c=Tc(b),c=hg(c,Nj.bind(null,a)));a.callbackPriority=b;a.callbackNode=c}}\nfunction Nj(a){Fj=-1;Hj=Gj=0;if(0!==(X&48))throw Error(y(327));var b=a.callbackNode;if(Oj()&&a.callbackNode!==b)return null;var c=Uc(a,a===U?W:0);if(0===c)return null;var d=c;var e=X;X|=16;var f=Pj();if(U!==a||W!==d)wj(),Qj(a,d);do try{Rj();break}catch(h){Sj(a,h)}while(1);qg();oj.current=f;X=e;null!==Y?d=0:(U=null,W=0,d=V);if(0!==(tj&Hi))Qj(a,0);else if(0!==d){2===d&&(X|=64,a.hydrate&&(a.hydrate=!1,qf(a.containerInfo)),c=Wc(a),0!==c&&(d=Tj(a,c)));if(1===d)throw b=sj,Qj(a,0),Ii(a,c),Mj(a,O()),b;a.finishedWork=\na.current.alternate;a.finishedLanes=c;switch(d){case 0:case 1:throw Error(y(345));case 2:Uj(a);break;case 3:Ii(a,c);if((c&62914560)===c&&(d=jj+500-O(),10<d)){if(0!==Uc(a,0))break;e=a.suspendedLanes;if((e&c)!==c){Hg();a.pingedLanes|=a.suspendedLanes&e;break}a.timeoutHandle=of(Uj.bind(null,a),d);break}Uj(a);break;case 4:Ii(a,c);if((c&4186112)===c)break;d=a.eventTimes;for(e=-1;0<c;){var g=31-Vc(c);f=1<<g;g=d[g];g>e&&(e=g);c&=~f}c=e;c=O()-c;c=(120>c?120:480>c?480:1080>c?1080:1920>c?1920:3E3>c?3E3:4320>\nc?4320:1960*nj(c/1960))-c;if(10<c){a.timeoutHandle=of(Uj.bind(null,a),c);break}Uj(a);break;case 5:Uj(a);break;default:throw Error(y(329));}}Mj(a,O());return a.callbackNode===b?Nj.bind(null,a):null}function Ii(a,b){b&=~uj;b&=~Hi;a.suspendedLanes|=b;a.pingedLanes&=~b;for(a=a.expirationTimes;0<b;){var c=31-Vc(b),d=1<<c;a[c]=-1;b&=~d}}\nfunction Lj(a){if(0!==(X&48))throw Error(y(327));Oj();if(a===U&&0!==(a.expiredLanes&W)){var b=W;var c=Tj(a,b);0!==(tj&Hi)&&(b=Uc(a,b),c=Tj(a,b))}else b=Uc(a,0),c=Tj(a,b);0!==a.tag&&2===c&&(X|=64,a.hydrate&&(a.hydrate=!1,qf(a.containerInfo)),b=Wc(a),0!==b&&(c=Tj(a,b)));if(1===c)throw c=sj,Qj(a,0),Ii(a,b),Mj(a,O()),c;a.finishedWork=a.current.alternate;a.finishedLanes=b;Uj(a);Mj(a,O());return null}\nfunction Vj(){if(null!==Cj){var a=Cj;Cj=null;a.forEach(function(a){a.expiredLanes|=24&a.pendingLanes;Mj(a,O())})}ig()}function Wj(a,b){var c=X;X|=1;try{return a(b)}finally{X=c,0===X&&(wj(),ig())}}function Xj(a,b){var c=X;X&=-2;X|=8;try{return a(b)}finally{X=c,0===X&&(wj(),ig())}}function ni(a,b){I(rj,qj);qj|=b;tj|=b}function Ki(){qj=rj.current;H(rj)}\nfunction Qj(a,b){a.finishedWork=null;a.finishedLanes=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,pf(c));if(null!==Y)for(c=Y.return;null!==c;){var d=c;switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&Gf();break;case 3:fh();H(N);H(M);uh();break;case 5:hh(d);break;case 4:fh();break;case 13:H(P);break;case 19:H(P);break;case 10:rg(d);break;case 23:case 24:Ki()}c=c.return}U=a;Y=Tg(a.current,null);W=qj=tj=b;V=0;sj=null;uj=Hi=Dg=0}\nfunction Sj(a,b){do{var c=Y;try{qg();vh.current=Gh;if(yh){for(var d=R.memoizedState;null!==d;){var e=d.queue;null!==e&&(e.pending=null);d=d.next}yh=!1}xh=0;T=S=R=null;zh=!1;pj.current=null;if(null===c||null===c.return){V=1;sj=b;Y=null;break}a:{var f=a,g=c.return,h=c,k=b;b=W;h.flags|=2048;h.firstEffect=h.lastEffect=null;if(null!==k&&\"object\"===typeof k&&\"function\"===typeof k.then){var l=k;if(0===(h.mode&2)){var n=h.alternate;n?(h.updateQueue=n.updateQueue,h.memoizedState=n.memoizedState,h.lanes=n.lanes):\n(h.updateQueue=null,h.memoizedState=null)}var A=0!==(P.current&1),p=g;do{var C;if(C=13===p.tag){var x=p.memoizedState;if(null!==x)C=null!==x.dehydrated?!0:!1;else{var w=p.memoizedProps;C=void 0===w.fallback?!1:!0!==w.unstable_avoidThisFallback?!0:A?!1:!0}}if(C){var z=p.updateQueue;if(null===z){var u=new Set;u.add(l);p.updateQueue=u}else z.add(l);if(0===(p.mode&2)){p.flags|=64;h.flags|=16384;h.flags&=-2981;if(1===h.tag)if(null===h.alternate)h.tag=17;else{var t=zg(-1,1);t.tag=2;Ag(h,t)}h.lanes|=1;break a}k=\nvoid 0;h=b;var q=f.pingCache;null===q?(q=f.pingCache=new Oi,k=new Set,q.set(l,k)):(k=q.get(l),void 0===k&&(k=new Set,q.set(l,k)));if(!k.has(h)){k.add(h);var v=Yj.bind(null,f,l,h);l.then(v,v)}p.flags|=4096;p.lanes=b;break a}p=p.return}while(null!==p);k=Error((Ra(h.type)||\"A React component\")+\" suspended while rendering, but no fallback UI was specified.\\n\\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.\")}5!==V&&(V=2);k=Mi(k,h);p=\ng;do{switch(p.tag){case 3:f=k;p.flags|=4096;b&=-b;p.lanes|=b;var J=Pi(p,f,b);Bg(p,J);break a;case 1:f=k;var K=p.type,Q=p.stateNode;if(0===(p.flags&64)&&(\"function\"===typeof K.getDerivedStateFromError||null!==Q&&\"function\"===typeof Q.componentDidCatch&&(null===Ti||!Ti.has(Q)))){p.flags|=4096;b&=-b;p.lanes|=b;var L=Si(p,f,b);Bg(p,L);break a}}p=p.return}while(null!==p)}Zj(c)}catch(va){b=va;Y===c&&null!==c&&(Y=c=c.return);continue}break}while(1)}\nfunction Pj(){var a=oj.current;oj.current=Gh;return null===a?Gh:a}function Tj(a,b){var c=X;X|=16;var d=Pj();U===a&&W===b||Qj(a,b);do try{ak();break}catch(e){Sj(a,e)}while(1);qg();X=c;oj.current=d;if(null!==Y)throw Error(y(261));U=null;W=0;return V}function ak(){for(;null!==Y;)bk(Y)}function Rj(){for(;null!==Y&&!Qf();)bk(Y)}function bk(a){var b=ck(a.alternate,a,qj);a.memoizedProps=a.pendingProps;null===b?Zj(a):Y=b;pj.current=null}\nfunction Zj(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&2048)){c=Gi(c,b,qj);if(null!==c){Y=c;return}c=b;if(24!==c.tag&&23!==c.tag||null===c.memoizedState||0!==(qj&1073741824)||0===(c.mode&4)){for(var d=0,e=c.child;null!==e;)d|=e.lanes|e.childLanes,e=e.sibling;c.childLanes=d}null!==a&&0===(a.flags&2048)&&(null===a.firstEffect&&(a.firstEffect=b.firstEffect),null!==b.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=b.firstEffect),a.lastEffect=b.lastEffect),1<b.flags&&(null!==\na.lastEffect?a.lastEffect.nextEffect=b:a.firstEffect=b,a.lastEffect=b))}else{c=Li(b);if(null!==c){c.flags&=2047;Y=c;return}null!==a&&(a.firstEffect=a.lastEffect=null,a.flags|=2048)}b=b.sibling;if(null!==b){Y=b;return}Y=b=a}while(null!==b);0===V&&(V=5)}function Uj(a){var b=eg();gg(99,dk.bind(null,a,b));return null}\nfunction dk(a,b){do Oj();while(null!==yj);if(0!==(X&48))throw Error(y(327));var c=a.finishedWork;if(null===c)return null;a.finishedWork=null;a.finishedLanes=0;if(c===a.current)throw Error(y(177));a.callbackNode=null;var d=c.lanes|c.childLanes,e=d,f=a.pendingLanes&~e;a.pendingLanes=e;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=e;a.mutableReadLanes&=e;a.entangledLanes&=e;e=a.entanglements;for(var g=a.eventTimes,h=a.expirationTimes;0<f;){var k=31-Vc(f),l=1<<k;e[k]=0;g[k]=-1;h[k]=-1;f&=~l}null!==\nCj&&0===(d&24)&&Cj.has(a)&&Cj.delete(a);a===U&&(Y=U=null,W=0);1<c.flags?null!==c.lastEffect?(c.lastEffect.nextEffect=c,d=c.firstEffect):d=c:d=c.firstEffect;if(null!==d){e=X;X|=32;pj.current=null;kf=fd;g=Ne();if(Oe(g)){if(\"selectionStart\"in g)h={start:g.selectionStart,end:g.selectionEnd};else a:if(h=(h=g.ownerDocument)&&h.defaultView||window,(l=h.getSelection&&h.getSelection())&&0!==l.rangeCount){h=l.anchorNode;f=l.anchorOffset;k=l.focusNode;l=l.focusOffset;try{h.nodeType,k.nodeType}catch(va){h=null;\nbreak a}var n=0,A=-1,p=-1,C=0,x=0,w=g,z=null;b:for(;;){for(var u;;){w!==h||0!==f&&3!==w.nodeType||(A=n+f);w!==k||0!==l&&3!==w.nodeType||(p=n+l);3===w.nodeType&&(n+=w.nodeValue.length);if(null===(u=w.firstChild))break;z=w;w=u}for(;;){if(w===g)break b;z===h&&++C===f&&(A=n);z===k&&++x===l&&(p=n);if(null!==(u=w.nextSibling))break;w=z;z=w.parentNode}w=u}h=-1===A||-1===p?null:{start:A,end:p}}else h=null;h=h||{start:0,end:0}}else h=null;lf={focusedElem:g,selectionRange:h};fd=!1;Ij=null;Jj=!1;Z=d;do try{ek()}catch(va){if(null===\nZ)throw Error(y(330));Wi(Z,va);Z=Z.nextEffect}while(null!==Z);Ij=null;Z=d;do try{for(g=a;null!==Z;){var t=Z.flags;t&16&&pb(Z.stateNode,\"\");if(t&128){var q=Z.alternate;if(null!==q){var v=q.ref;null!==v&&(\"function\"===typeof v?v(null):v.current=null)}}switch(t&1038){case 2:fj(Z);Z.flags&=-3;break;case 6:fj(Z);Z.flags&=-3;ij(Z.alternate,Z);break;case 1024:Z.flags&=-1025;break;case 1028:Z.flags&=-1025;ij(Z.alternate,Z);break;case 4:ij(Z.alternate,Z);break;case 8:h=Z;cj(g,h);var J=h.alternate;dj(h);null!==\nJ&&dj(J)}Z=Z.nextEffect}}catch(va){if(null===Z)throw Error(y(330));Wi(Z,va);Z=Z.nextEffect}while(null!==Z);v=lf;q=Ne();t=v.focusedElem;g=v.selectionRange;if(q!==t&&t&&t.ownerDocument&&Me(t.ownerDocument.documentElement,t)){null!==g&&Oe(t)&&(q=g.start,v=g.end,void 0===v&&(v=q),\"selectionStart\"in t?(t.selectionStart=q,t.selectionEnd=Math.min(v,t.value.length)):(v=(q=t.ownerDocument||document)&&q.defaultView||window,v.getSelection&&(v=v.getSelection(),h=t.textContent.length,J=Math.min(g.start,h),g=void 0===\ng.end?J:Math.min(g.end,h),!v.extend&&J>g&&(h=g,g=J,J=h),h=Le(t,J),f=Le(t,g),h&&f&&(1!==v.rangeCount||v.anchorNode!==h.node||v.anchorOffset!==h.offset||v.focusNode!==f.node||v.focusOffset!==f.offset)&&(q=q.createRange(),q.setStart(h.node,h.offset),v.removeAllRanges(),J>g?(v.addRange(q),v.extend(f.node,f.offset)):(q.setEnd(f.node,f.offset),v.addRange(q))))));q=[];for(v=t;v=v.parentNode;)1===v.nodeType&&q.push({element:v,left:v.scrollLeft,top:v.scrollTop});\"function\"===typeof t.focus&&t.focus();for(t=\n0;t<q.length;t++)v=q[t],v.element.scrollLeft=v.left,v.element.scrollTop=v.top}fd=!!kf;lf=kf=null;a.current=c;Z=d;do try{for(t=a;null!==Z;){var K=Z.flags;K&36&&Yi(t,Z.alternate,Z);if(K&128){q=void 0;var Q=Z.ref;if(null!==Q){var L=Z.stateNode;switch(Z.tag){case 5:q=L;break;default:q=L}\"function\"===typeof Q?Q(q):Q.current=q}}Z=Z.nextEffect}}catch(va){if(null===Z)throw Error(y(330));Wi(Z,va);Z=Z.nextEffect}while(null!==Z);Z=null;$f();X=e}else a.current=c;if(xj)xj=!1,yj=a,zj=b;else for(Z=d;null!==Z;)b=\nZ.nextEffect,Z.nextEffect=null,Z.flags&8&&(K=Z,K.sibling=null,K.stateNode=null),Z=b;d=a.pendingLanes;0===d&&(Ti=null);1===d?a===Ej?Dj++:(Dj=0,Ej=a):Dj=0;c=c.stateNode;if(Mf&&\"function\"===typeof Mf.onCommitFiberRoot)try{Mf.onCommitFiberRoot(Lf,c,void 0,64===(c.current.flags&64))}catch(va){}Mj(a,O());if(Qi)throw Qi=!1,a=Ri,Ri=null,a;if(0!==(X&8))return null;ig();return null}\nfunction ek(){for(;null!==Z;){var a=Z.alternate;Jj||null===Ij||(0!==(Z.flags&8)?dc(Z,Ij)&&(Jj=!0):13===Z.tag&&mj(a,Z)&&dc(Z,Ij)&&(Jj=!0));var b=Z.flags;0!==(b&256)&&Xi(a,Z);0===(b&512)||xj||(xj=!0,hg(97,function(){Oj();return null}));Z=Z.nextEffect}}function Oj(){if(90!==zj){var a=97<zj?97:zj;zj=90;return gg(a,fk)}return!1}function $i(a,b){Aj.push(b,a);xj||(xj=!0,hg(97,function(){Oj();return null}))}function Zi(a,b){Bj.push(b,a);xj||(xj=!0,hg(97,function(){Oj();return null}))}\nfunction fk(){if(null===yj)return!1;var a=yj;yj=null;if(0!==(X&48))throw Error(y(331));var b=X;X|=32;var c=Bj;Bj=[];for(var d=0;d<c.length;d+=2){var e=c[d],f=c[d+1],g=e.destroy;e.destroy=void 0;if(\"function\"===typeof g)try{g()}catch(k){if(null===f)throw Error(y(330));Wi(f,k)}}c=Aj;Aj=[];for(d=0;d<c.length;d+=2){e=c[d];f=c[d+1];try{var h=e.create;e.destroy=h()}catch(k){if(null===f)throw Error(y(330));Wi(f,k)}}for(h=a.current.firstEffect;null!==h;)a=h.nextEffect,h.nextEffect=null,h.flags&8&&(h.sibling=\nnull,h.stateNode=null),h=a;X=b;ig();return!0}function gk(a,b,c){b=Mi(c,b);b=Pi(a,b,1);Ag(a,b);b=Hg();a=Kj(a,1);null!==a&&($c(a,1,b),Mj(a,b))}\nfunction Wi(a,b){if(3===a.tag)gk(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){gk(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Ti||!Ti.has(d))){a=Mi(b,a);var e=Si(c,a,1);Ag(c,e);e=Hg();c=Kj(c,1);if(null!==c)$c(c,1,e),Mj(c,e);else if(\"function\"===typeof d.componentDidCatch&&(null===Ti||!Ti.has(d)))try{d.componentDidCatch(b,a)}catch(f){}break}}c=c.return}}\nfunction Yj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);b=Hg();a.pingedLanes|=a.suspendedLanes&c;U===a&&(W&c)===c&&(4===V||3===V&&(W&62914560)===W&&500>O()-jj?Qj(a,0):uj|=c);Mj(a,b)}function lj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=a.mode,0===(b&2)?b=1:0===(b&4)?b=99===eg()?1:2:(0===Gj&&(Gj=tj),b=Yc(62914560&~Gj),0===b&&(b=4194304)));c=Hg();a=Kj(a,b);null!==a&&($c(a,b,c),Mj(a,c))}var ck;\nck=function(a,b,c){var d=b.lanes;if(null!==a)if(a.memoizedProps!==b.pendingProps||N.current)ug=!0;else if(0!==(c&d))ug=0!==(a.flags&16384)?!0:!1;else{ug=!1;switch(b.tag){case 3:ri(b);sh();break;case 5:gh(b);break;case 1:Ff(b.type)&&Jf(b);break;case 4:eh(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;var e=b.type._context;I(mg,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){if(0!==(c&b.child.childLanes))return ti(a,b,c);I(P,P.current&1);b=hi(a,b,c);return null!==\nb?b.sibling:null}I(P,P.current&1);break;case 19:d=0!==(c&b.childLanes);if(0!==(a.flags&64)){if(d)return Ai(a,b,c);b.flags|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);I(P,P.current);if(d)break;else return null;case 23:case 24:return b.lanes=0,mi(a,b,c)}return hi(a,b,c)}else ug=!1;b.lanes=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2);a=b.pendingProps;e=Ef(b,M.current);tg(b,c);e=Ch(null,b,d,a,e,c);b.flags|=1;if(\"object\"===\ntypeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(Ff(d)){var f=!0;Jf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;xg(b);var g=d.getDerivedStateFromProps;\"function\"===typeof g&&Gg(b,d,g,a);e.updater=Kg;b.stateNode=e;e._reactInternals=b;Og(b,d,a,c);b=qi(null,b,d,!0,f,c)}else b.tag=0,fi(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;a:{null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2);\na=b.pendingProps;f=e._init;e=f(e._payload);b.type=e;f=b.tag=hk(e);a=lg(e,a);switch(f){case 0:b=li(null,b,e,a,c);break a;case 1:b=pi(null,b,e,a,c);break a;case 11:b=gi(null,b,e,a,c);break a;case 14:b=ii(null,b,e,lg(e.type,a),d,c);break a}throw Error(y(306,e,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),li(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),pi(a,b,d,e,c);case 3:ri(b);d=b.updateQueue;if(null===a||null===d)throw Error(y(282));\nd=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;yg(a,b);Cg(b,d,null,c);d=b.memoizedState.element;if(d===e)sh(),b=hi(a,b,c);else{e=b.stateNode;if(f=e.hydrate)kh=rf(b.stateNode.containerInfo.firstChild),jh=b,f=lh=!0;if(f){a=e.mutableSourceEagerHydrationData;if(null!=a)for(e=0;e<a.length;e+=2)f=a[e],f._workInProgressVersionPrimary=a[e+1],th.push(f);c=Zg(b,null,d,c);for(b.child=c;c;)c.flags=c.flags&-3|1024,c=c.sibling}else fi(a,b,d,c),sh();b=b.child}return b;case 5:return gh(b),null===a&&\nph(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,nf(d,e)?g=null:null!==f&&nf(d,f)&&(b.flags|=16),oi(a,b),fi(a,b,g,c),b.child;case 6:return null===a&&ph(b),null;case 13:return ti(a,b,c);case 4:return eh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Yg(b,null,d,c):fi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),gi(a,b,d,e,c);case 7:return fi(a,b,b.pendingProps,c),b.child;case 8:return fi(a,b,b.pendingProps.children,\nc),b.child;case 12:return fi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;var h=b.type._context;I(mg,h._currentValue);h._currentValue=f;if(null!==g)if(h=g.value,f=He(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0,0===f){if(g.children===e.children&&!N.current){b=hi(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==k){g=h.child;for(var l=\nk.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=zg(-1,c&-c),l.tag=2,Ag(h,l));h.lanes|=c;l=h.alternate;null!==l&&(l.lanes|=c);sg(h.return,c);k.lanes|=c;break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=g}fi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,tg(b,c),e=vg(e,\nf.unstable_observedBits),d=d(e),b.flags|=1,fi(a,b,d,c),b.child;case 14:return e=b.type,f=lg(e,b.pendingProps),f=lg(e.type,f),ii(a,b,e,f,d,c);case 15:return ki(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2),b.tag=1,Ff(d)?(a=!0,Jf(b)):a=!1,tg(b,c),Mg(b,d,e),Og(b,d,e,c),qi(null,b,d,!0,a,c);case 19:return Ai(a,b,c);case 23:return mi(a,b,c);case 24:return mi(a,b,c)}throw Error(y(156,b.tag));\n};function ik(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.flags=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childLanes=this.lanes=0;this.alternate=null}function nh(a,b,c,d){return new ik(a,b,c,d)}function ji(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction hk(a){if(\"function\"===typeof a)return ji(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Aa)return 11;if(a===Da)return 14}return 2}\nfunction Tg(a,b){var c=a.alternate;null===c?(c=nh(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Vg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)ji(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ua:return Xg(c.children,e,f,b);case Ha:g=8;e|=16;break;case wa:g=8;e|=1;break;case xa:return a=nh(12,c,b,e|8),a.elementType=xa,a.type=xa,a.lanes=f,a;case Ba:return a=nh(13,c,b,e),a.type=Ba,a.elementType=Ba,a.lanes=f,a;case Ca:return a=nh(19,c,b,e),a.elementType=Ca,a.lanes=f,a;case Ia:return vi(c,e,f,b);case Ja:return a=nh(24,c,b,e),a.elementType=Ja,a.lanes=f,a;default:if(\"object\"===\ntypeof a&&null!==a)switch(a.$$typeof){case ya:g=10;break a;case za:g=9;break a;case Aa:g=11;break a;case Da:g=14;break a;case Ea:g=16;d=null;break a;case Fa:g=22;break a}throw Error(y(130,null==a?a:typeof a,\"\"));}b=nh(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Xg(a,b,c,d){a=nh(7,a,d,b);a.lanes=c;return a}function vi(a,b,c,d){a=nh(23,a,d,b);a.elementType=Ia;a.lanes=c;return a}function Ug(a,b,c){a=nh(6,a,null,b);a.lanes=c;return a}\nfunction Wg(a,b,c){b=nh(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction jk(a,b,c){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=0;this.eventTimes=Zc(0);this.expirationTimes=Zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=Zc(0);this.mutableSourceEagerHydrationData=null}\nfunction kk(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:ta,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nfunction lk(a,b,c,d){var e=b.current,f=Hg(),g=Ig(e);a:if(c){c=c._reactInternals;b:{if(Zb(c)!==c||1!==c.tag)throw Error(y(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(Ff(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(y(171));}if(1===c.tag){var k=c.type;if(Ff(k)){c=If(c,k,h);break a}}c=h}else c=Cf;null===b.context?b.context=c:b.pendingContext=c;b=zg(f,g);b.payload={element:a};d=void 0===d?null:d;null!==\nd&&(b.callback=d);Ag(e,b);Jg(e,g,f);return g}function mk(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function nk(a,b){a=a.memoizedState;if(null!==a&&null!==a.dehydrated){var c=a.retryLane;a.retryLane=0!==c&&c<b?c:b}}function ok(a,b){nk(a,b);(a=a.alternate)&&nk(a,b)}function pk(){return null}\nfunction qk(a,b,c){var d=null!=c&&null!=c.hydrationOptions&&c.hydrationOptions.mutableSources||null;c=new jk(a,b,null!=c&&!0===c.hydrate);b=nh(3,null,null,2===b?7:1===b?3:0);c.current=b;b.stateNode=c;xg(b);a[ff]=c.current;cf(8===a.nodeType?a.parentNode:a);if(d)for(a=0;a<d.length;a++){b=d[a];var e=b._getVersion;e=e(b._source);null==c.mutableSourceEagerHydrationData?c.mutableSourceEagerHydrationData=[b,e]:c.mutableSourceEagerHydrationData.push(b,e)}this._internalRoot=c}\nqk.prototype.render=function(a){lk(a,this._internalRoot,null,null)};qk.prototype.unmount=function(){var a=this._internalRoot,b=a.containerInfo;lk(null,a,null,function(){b[ff]=null})};function rk(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}\nfunction sk(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new qk(a,0,b?{hydrate:!0}:void 0)}\nfunction tk(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if(\"function\"===typeof e){var h=e;e=function(){var a=mk(g);h.call(a)}}lk(b,g,a,e)}else{f=c._reactRootContainer=sk(c,d);g=f._internalRoot;if(\"function\"===typeof e){var k=e;e=function(){var a=mk(g);k.call(a)}}Xj(function(){lk(b,g,a,e)})}return mk(g)}ec=function(a){if(13===a.tag){var b=Hg();Jg(a,4,b);ok(a,4)}};fc=function(a){if(13===a.tag){var b=Hg();Jg(a,67108864,b);ok(a,67108864)}};\ngc=function(a){if(13===a.tag){var b=Hg(),c=Ig(a);Jg(a,c,b);ok(a,c)}};hc=function(a,b){return b()};\nyb=function(a,b,c){switch(b){case \"input\":ab(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Db(d);if(!e)throw Error(y(90));Wa(d);ab(d,e)}}}break;case \"textarea\":ib(a,c);break;case \"select\":b=c.value,null!=b&&fb(a,!!c.multiple,b,!1)}};Gb=Wj;\nHb=function(a,b,c,d,e){var f=X;X|=4;try{return gg(98,a.bind(null,b,c,d,e))}finally{X=f,0===X&&(wj(),ig())}};Ib=function(){0===(X&49)&&(Vj(),Oj())};Jb=function(a,b){var c=X;X|=2;try{return a(b)}finally{X=c,0===X&&(wj(),ig())}};function uk(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!rk(b))throw Error(y(200));return kk(a,b,null,c)}var vk={Events:[Cb,ue,Db,Eb,Fb,Oj,{current:!1}]},wk={findFiberByHostInstance:wc,bundleType:0,version:\"17.0.2\",rendererPackageName:\"react-dom\"};\nvar xk={bundleType:wk.bundleType,version:wk.version,rendererPackageName:wk.rendererPackageName,rendererConfig:wk.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:ra.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=cc(a);return null===a?null:a.stateNode},findFiberByHostInstance:wk.findFiberByHostInstance||\npk,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if(\"undefined\"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var yk=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!yk.isDisabled&&yk.supportsFiber)try{Lf=yk.inject(xk),Mf=yk}catch(a){}}exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=vk;exports.createPortal=uk;\nexports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternals;if(void 0===b){if(\"function\"===typeof a.render)throw Error(y(188));throw Error(y(268,Object.keys(a)));}a=cc(b);a=null===a?null:a.stateNode;return a};exports.flushSync=function(a,b){var c=X;if(0!==(c&48))return a(b);X|=1;try{if(a)return gg(99,a.bind(null,b))}finally{X=c,ig()}};exports.hydrate=function(a,b,c){if(!rk(b))throw Error(y(200));return tk(null,a,b,!0,c)};\nexports.render=function(a,b,c){if(!rk(b))throw Error(y(200));return tk(null,a,b,!1,c)};exports.unmountComponentAtNode=function(a){if(!rk(a))throw Error(y(40));return a._reactRootContainer?(Xj(function(){tk(null,null,a,!1,function(){a._reactRootContainer=null;a[ff]=null})}),!0):!1};exports.unstable_batchedUpdates=Wj;exports.unstable_createPortal=function(a,b){return uk(a,b,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)};\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!rk(c))throw Error(y(200));if(null==a||void 0===a._reactInternals)throw Error(y(38));return tk(a,b,c,!1,d)};exports.version=\"17.0.2\";\n", "'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || from);\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n", "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n", "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n", "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n", "'use strict';\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar React = require('react');\nvar React__default = _interopDefault(React);\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction withSideEffect(reducePropsToState, handleStateChangeOnClient, mapStateOnServer) {\n if (typeof reducePropsToState !== 'function') {\n throw new Error('Expected reducePropsToState to be a function.');\n }\n\n if (typeof handleStateChangeOnClient !== 'function') {\n throw new Error('Expected handleStateChangeOnClient to be a function.');\n }\n\n if (typeof mapStateOnServer !== 'undefined' && typeof mapStateOnServer !== 'function') {\n throw new Error('Expected mapStateOnServer to either be undefined or a function.');\n }\n\n function getDisplayName(WrappedComponent) {\n return WrappedComponent.displayName || WrappedComponent.name || 'Component';\n }\n\n return function wrap(WrappedComponent) {\n if (typeof WrappedComponent !== 'function') {\n throw new Error('Expected WrappedComponent to be a React component.');\n }\n\n var mountedInstances = [];\n var state;\n\n function emitChange() {\n state = reducePropsToState(mountedInstances.map(function (instance) {\n return instance.props;\n }));\n\n if (SideEffect.canUseDOM) {\n handleStateChangeOnClient(state);\n } else if (mapStateOnServer) {\n state = mapStateOnServer(state);\n }\n }\n\n var SideEffect = /*#__PURE__*/function (_PureComponent) {\n _inheritsLoose(SideEffect, _PureComponent);\n\n function SideEffect() {\n return _PureComponent.apply(this, arguments) || this;\n }\n\n // Try to use displayName of wrapped component\n // Expose canUseDOM so tests can monkeypatch it\n SideEffect.peek = function peek() {\n return state;\n };\n\n SideEffect.rewind = function rewind() {\n if (SideEffect.canUseDOM) {\n throw new Error('You may only call rewind() on the server. Call peek() to read the current state.');\n }\n\n var recordedState = state;\n state = undefined;\n mountedInstances = [];\n return recordedState;\n };\n\n var _proto = SideEffect.prototype;\n\n _proto.UNSAFE_componentWillMount = function UNSAFE_componentWillMount() {\n mountedInstances.push(this);\n emitChange();\n };\n\n _proto.componentDidUpdate = function componentDidUpdate() {\n emitChange();\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n var index = mountedInstances.indexOf(this);\n mountedInstances.splice(index, 1);\n emitChange();\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/React__default.createElement(WrappedComponent, this.props);\n };\n\n return SideEffect;\n }(React.PureComponent);\n\n _defineProperty(SideEffect, \"displayName\", \"SideEffect(\" + getDisplayName(WrappedComponent) + \")\");\n\n _defineProperty(SideEffect, \"canUseDOM\", canUseDOM);\n\n return SideEffect;\n };\n}\n\nmodule.exports = withSideEffect;\n", "/* global Map:readonly, Set:readonly, ArrayBuffer:readonly */\n\nvar hasElementType = typeof Element !== 'undefined';\nvar hasMap = typeof Map === 'function';\nvar hasSet = typeof Set === 'function';\nvar hasArrayBuffer = typeof ArrayBuffer === 'function' && !!ArrayBuffer.isView;\n\n// Note: We **don't** need `envHasBigInt64Array` in fde es6/index.js\n\nfunction equal(a, b) {\n // START: fast-deep-equal es6/index.js 3.1.1\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n // START: Modifications:\n // 1. Extra `has<Type> &&` helpers in initial condition allow es6 code\n // to co-exist with es5.\n // 2. Replace `for of` with es5 compliant iteration using `for`.\n // Basically, take:\n //\n // ```js\n // for (i of a.entries())\n // if (!b.has(i[0])) return false;\n // ```\n //\n // ... and convert to:\n //\n // ```js\n // it = a.entries();\n // while (!(i = it.next()).done)\n // if (!b.has(i.value[0])) return false;\n // ```\n //\n // **Note**: `i` access switches to `i.value`.\n var it;\n if (hasMap && (a instanceof Map) && (b instanceof Map)) {\n if (a.size !== b.size) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!b.has(i.value[0])) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!equal(i.value[1], b.get(i.value[0]))) return false;\n return true;\n }\n\n if (hasSet && (a instanceof Set) && (b instanceof Set)) {\n if (a.size !== b.size) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!b.has(i.value[0])) return false;\n return true;\n }\n // END: Modifications\n\n if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (a[i] !== b[i]) return false;\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n // END: fast-deep-equal\n\n // START: react-fast-compare\n // custom handling for DOM elements\n if (hasElementType && a instanceof Element) return false;\n\n // custom handling for React/Preact\n for (i = length; i-- !== 0;) {\n if ((keys[i] === '_owner' || keys[i] === '__v' || keys[i] === '__o') && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner\n // Preact-specific: avoid traversing Preact elements' __v and __o\n // __v = $_original / $_vnode\n // __o = $_owner\n // These properties contain circular references and are not needed when\n // comparing the actual elements (and not their owners)\n // .$$typeof and ._store on just reasonable markers of elements\n\n continue;\n }\n\n // all other properties should be traversed as usual\n if (!equal(a[keys[i]], b[keys[i]])) return false;\n }\n // END: react-fast-compare\n\n // START: fast-deep-equal\n return true;\n }\n\n return a !== a && b !== b;\n}\n// end fast-deep-equal\n\nmodule.exports = function isEqual(a, b) {\n try {\n return equal(a, b);\n } catch (error) {\n if (((error.message || '').match(/stack|recursion/i))) {\n // warn on circular references, don't crash\n // browsers give this different errors name and messages:\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\n // firefox: \"InternalError\", too much recursion\"\n // edge: \"Error\", \"Out of stack space\"\n console.warn('react-fast-compare cannot handle circular refs');\n return false;\n }\n // some other error. we should definitely know about these\n throw error;\n }\n};\n", "/*!\n Copyright (c) 2018 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString === Object.prototype.toString) {\n\t\t\t\t\tfor (var key in arg) {\n\t\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Bezier = void 0;\n// math-inlining.\nconst {\n abs,\n cos,\n sin,\n acos,\n atan2,\n sqrt,\n pow\n} = Math; // cube root function yielding real roots\n\nfunction crt(v) {\n return v < 0 ? -pow(-v, 1 / 3) : pow(v, 1 / 3);\n} // trig constants\n\n\nconst pi = Math.PI,\n tau = 2 * pi,\n quart = pi / 2,\n // float precision significant decimal\nepsilon = 0.000001,\n // extremas used in bbox calculation and similar algorithms\nnMax = Number.MAX_SAFE_INTEGER || 9007199254740991,\n nMin = Number.MIN_SAFE_INTEGER || -9007199254740991,\n // a zero coordinate, which is surprisingly useful\nZERO = {\n x: 0,\n y: 0,\n z: 0\n}; // Bezier utility functions\n\nconst utils = {\n // Legendre-Gauss abscissae with n=24 (x_i values, defined at i=n as the roots of the nth order Legendre polynomial Pn(x))\n Tvalues: [-0.0640568928626056260850430826247450385909, 0.0640568928626056260850430826247450385909, -0.1911188674736163091586398207570696318404, 0.1911188674736163091586398207570696318404, -0.3150426796961633743867932913198102407864, 0.3150426796961633743867932913198102407864, -0.4337935076260451384870842319133497124524, 0.4337935076260451384870842319133497124524, -0.5454214713888395356583756172183723700107, 0.5454214713888395356583756172183723700107, -0.6480936519369755692524957869107476266696, 0.6480936519369755692524957869107476266696, -0.7401241915785543642438281030999784255232, 0.7401241915785543642438281030999784255232, -0.8200019859739029219539498726697452080761, 0.8200019859739029219539498726697452080761, -0.8864155270044010342131543419821967550873, 0.8864155270044010342131543419821967550873, -0.9382745520027327585236490017087214496548, 0.9382745520027327585236490017087214496548, -0.9747285559713094981983919930081690617411, 0.9747285559713094981983919930081690617411, -0.9951872199970213601799974097007368118745, 0.9951872199970213601799974097007368118745],\n // Legendre-Gauss weights with n=24 (w_i values, defined by a function linked to in the Bezier primer article)\n Cvalues: [0.1279381953467521569740561652246953718517, 0.1279381953467521569740561652246953718517, 0.1258374563468282961213753825111836887264, 0.1258374563468282961213753825111836887264, 0.121670472927803391204463153476262425607, 0.121670472927803391204463153476262425607, 0.1155056680537256013533444839067835598622, 0.1155056680537256013533444839067835598622, 0.1074442701159656347825773424466062227946, 0.1074442701159656347825773424466062227946, 0.0976186521041138882698806644642471544279, 0.0976186521041138882698806644642471544279, 0.086190161531953275917185202983742667185, 0.086190161531953275917185202983742667185, 0.0733464814110803057340336152531165181193, 0.0733464814110803057340336152531165181193, 0.0592985849154367807463677585001085845412, 0.0592985849154367807463677585001085845412, 0.0442774388174198061686027482113382288593, 0.0442774388174198061686027482113382288593, 0.0285313886289336631813078159518782864491, 0.0285313886289336631813078159518782864491, 0.0123412297999871995468056670700372915759, 0.0123412297999871995468056670700372915759],\n arcfn: function (t, derivativeFn) {\n const d = derivativeFn(t);\n let l = d.x * d.x + d.y * d.y;\n\n if (typeof d.z !== \"undefined\") {\n l += d.z * d.z;\n }\n\n return sqrt(l);\n },\n compute: function (t, points, _3d) {\n // shortcuts\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points; // constant?\n\n if (order === 0) {\n points[0].t = t;\n return points[0];\n } // linear?\n\n\n if (order === 1) {\n const ret = {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t: t\n };\n\n if (_3d) {\n ret.z = mt * p[0].z + t * p[1].z;\n }\n\n return ret;\n } // quadratic/cubic curve?\n\n\n if (order < 4) {\n let mt2 = mt * mt,\n t2 = t * t,\n a,\n b,\n c,\n d = 0;\n\n if (order === 2) {\n p = [p[0], p[1], p[2], ZERO];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n\n const ret = {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t: t\n };\n\n if (_3d) {\n ret.z = a * p[0].z + b * p[1].z + c * p[2].z + d * p[3].z;\n }\n\n return ret;\n } // higher order curves: use de Casteljau's computation\n\n\n const dCpts = JSON.parse(JSON.stringify(points));\n\n while (dCpts.length > 1) {\n for (let i = 0; i < dCpts.length - 1; i++) {\n dCpts[i] = {\n x: dCpts[i].x + (dCpts[i + 1].x - dCpts[i].x) * t,\n y: dCpts[i].y + (dCpts[i + 1].y - dCpts[i].y) * t\n };\n\n if (typeof dCpts[i].z !== \"undefined\") {\n dCpts[i] = dCpts[i].z + (dCpts[i + 1].z - dCpts[i].z) * t;\n }\n }\n\n dCpts.splice(dCpts.length - 1, 1);\n }\n\n dCpts[0].t = t;\n return dCpts[0];\n },\n computeWithRatios: function (t, points, ratios, _3d) {\n const mt = 1 - t,\n r = ratios,\n p = points;\n let f1 = r[0],\n f2 = r[1],\n f3 = r[2],\n f4 = r[3],\n d; // spec for linear\n\n f1 *= mt;\n f2 *= t;\n\n if (p.length === 2) {\n d = f1 + f2;\n return {\n x: (f1 * p[0].x + f2 * p[1].x) / d,\n y: (f1 * p[0].y + f2 * p[1].y) / d,\n z: !_3d ? false : (f1 * p[0].z + f2 * p[1].z) / d,\n t: t\n };\n } // upgrade to quadratic\n\n\n f1 *= mt;\n f2 *= 2 * mt;\n f3 *= t * t;\n\n if (p.length === 3) {\n d = f1 + f2 + f3;\n return {\n x: (f1 * p[0].x + f2 * p[1].x + f3 * p[2].x) / d,\n y: (f1 * p[0].y + f2 * p[1].y + f3 * p[2].y) / d,\n z: !_3d ? false : (f1 * p[0].z + f2 * p[1].z + f3 * p[2].z) / d,\n t: t\n };\n } // upgrade to cubic\n\n\n f1 *= mt;\n f2 *= 1.5 * mt;\n f3 *= 3 * mt;\n f4 *= t * t * t;\n\n if (p.length === 4) {\n d = f1 + f2 + f3 + f4;\n return {\n x: (f1 * p[0].x + f2 * p[1].x + f3 * p[2].x + f4 * p[3].x) / d,\n y: (f1 * p[0].y + f2 * p[1].y + f3 * p[2].y + f4 * p[3].y) / d,\n z: !_3d ? false : (f1 * p[0].z + f2 * p[1].z + f3 * p[2].z + f4 * p[3].z) / d,\n t: t\n };\n }\n },\n derive: function (points, _3d) {\n const dpoints = [];\n\n for (let p = points, d = p.length, c = d - 1; d > 1; d--, c--) {\n const list = [];\n\n for (let j = 0, dpt; j < c; j++) {\n dpt = {\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y)\n };\n\n if (_3d) {\n dpt.z = c * (p[j + 1].z - p[j].z);\n }\n\n list.push(dpt);\n }\n\n dpoints.push(list);\n p = list;\n }\n\n return dpoints;\n },\n between: function (v, m, M) {\n return m <= v && v <= M || utils.approximately(v, m) || utils.approximately(v, M);\n },\n approximately: function (a, b, precision) {\n return abs(a - b) <= (precision || epsilon);\n },\n length: function (derivativeFn) {\n const z = 0.5,\n len = utils.Tvalues.length;\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * utils.Tvalues[i] + z;\n sum += utils.Cvalues[i] * utils.arcfn(t, derivativeFn);\n }\n\n return z * sum;\n },\n map: function (v, ds, de, ts, te) {\n const d1 = de - ds,\n d2 = te - ts,\n v2 = v - ds,\n r = v2 / d1;\n return ts + d2 * r;\n },\n lerp: function (r, v1, v2) {\n const ret = {\n x: v1.x + r * (v2.x - v1.x),\n y: v1.y + r * (v2.y - v1.y)\n };\n\n if (!!v1.z && !!v2.z) {\n ret.z = v1.z + r * (v2.z - v1.z);\n }\n\n return ret;\n },\n pointToString: function (p) {\n let s = p.x + \"/\" + p.y;\n\n if (typeof p.z !== \"undefined\") {\n s += \"/\" + p.z;\n }\n\n return s;\n },\n pointsToString: function (points) {\n return \"[\" + points.map(utils.pointToString).join(\", \") + \"]\";\n },\n copy: function (obj) {\n return JSON.parse(JSON.stringify(obj));\n },\n angle: function (o, v1, v2) {\n const dx1 = v1.x - o.x,\n dy1 = v1.y - o.y,\n dx2 = v2.x - o.x,\n dy2 = v2.y - o.y,\n cross = dx1 * dy2 - dy1 * dx2,\n dot = dx1 * dx2 + dy1 * dy2;\n return atan2(cross, dot);\n },\n // round as string, to avoid rounding errors\n round: function (v, d) {\n const s = \"\" + v;\n const pos = s.indexOf(\".\");\n return parseFloat(s.substring(0, pos + 1 + d));\n },\n dist: function (p1, p2) {\n const dx = p1.x - p2.x,\n dy = p1.y - p2.y;\n return sqrt(dx * dx + dy * dy);\n },\n closest: function (LUT, point) {\n let mdist = pow(2, 63),\n mpos,\n d;\n LUT.forEach(function (p, idx) {\n d = utils.dist(point, p);\n\n if (d < mdist) {\n mdist = d;\n mpos = idx;\n }\n });\n return {\n mdist: mdist,\n mpos: mpos\n };\n },\n abcratio: function (t, n) {\n // see ratio(t) note on http://pomax.github.io/bezierinfo/#abc\n if (n !== 2 && n !== 3) {\n return false;\n }\n\n if (typeof t === \"undefined\") {\n t = 0.5;\n } else if (t === 0 || t === 1) {\n return t;\n }\n\n const bottom = pow(t, n) + pow(1 - t, n),\n top = bottom - 1;\n return abs(top / bottom);\n },\n projectionratio: function (t, n) {\n // see u(t) note on http://pomax.github.io/bezierinfo/#abc\n if (n !== 2 && n !== 3) {\n return false;\n }\n\n if (typeof t === \"undefined\") {\n t = 0.5;\n } else if (t === 0 || t === 1) {\n return t;\n }\n\n const top = pow(1 - t, n),\n bottom = pow(t, n) + top;\n return top / bottom;\n },\n lli8: function (x1, y1, x2, y2, x3, y3, x4, y4) {\n const nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n if (d == 0) {\n return false;\n }\n\n return {\n x: nx / d,\n y: ny / d\n };\n },\n lli4: function (p1, p2, p3, p4) {\n const x1 = p1.x,\n y1 = p1.y,\n x2 = p2.x,\n y2 = p2.y,\n x3 = p3.x,\n y3 = p3.y,\n x4 = p4.x,\n y4 = p4.y;\n return utils.lli8(x1, y1, x2, y2, x3, y3, x4, y4);\n },\n lli: function (v1, v2) {\n return utils.lli4(v1, v1.c, v2, v2.c);\n },\n makeline: function (p1, p2) {\n const x1 = p1.x,\n y1 = p1.y,\n x2 = p2.x,\n y2 = p2.y,\n dx = (x2 - x1) / 3,\n dy = (y2 - y1) / 3;\n return new Bezier(x1, y1, x1 + dx, y1 + dy, x1 + 2 * dx, y1 + 2 * dy, x2, y2);\n },\n findbbox: function (sections) {\n let mx = nMax,\n my = nMax,\n MX = nMin,\n MY = nMin;\n sections.forEach(function (s) {\n const bbox = s.bbox();\n if (mx > bbox.x.min) mx = bbox.x.min;\n if (my > bbox.y.min) my = bbox.y.min;\n if (MX < bbox.x.max) MX = bbox.x.max;\n if (MY < bbox.y.max) MY = bbox.y.max;\n });\n return {\n x: {\n min: mx,\n mid: (mx + MX) / 2,\n max: MX,\n size: MX - mx\n },\n y: {\n min: my,\n mid: (my + MY) / 2,\n max: MY,\n size: MY - my\n }\n };\n },\n shapeintersections: function (s1, bbox1, s2, bbox2, curveIntersectionThreshold) {\n if (!utils.bboxoverlap(bbox1, bbox2)) return [];\n const intersections = [];\n const a1 = [s1.startcap, s1.forward, s1.back, s1.endcap];\n const a2 = [s2.startcap, s2.forward, s2.back, s2.endcap];\n a1.forEach(function (l1) {\n if (l1.virtual) return;\n a2.forEach(function (l2) {\n if (l2.virtual) return;\n const iss = l1.intersects(l2, curveIntersectionThreshold);\n\n if (iss.length > 0) {\n iss.c1 = l1;\n iss.c2 = l2;\n iss.s1 = s1;\n iss.s2 = s2;\n intersections.push(iss);\n }\n });\n });\n return intersections;\n },\n makeshape: function (forward, back, curveIntersectionThreshold) {\n const bpl = back.points.length;\n const fpl = forward.points.length;\n const start = utils.makeline(back.points[bpl - 1], forward.points[0]);\n const end = utils.makeline(forward.points[fpl - 1], back.points[0]);\n const shape = {\n startcap: start,\n forward: forward,\n back: back,\n endcap: end,\n bbox: utils.findbbox([start, forward, back, end])\n };\n\n shape.intersections = function (s2) {\n return utils.shapeintersections(shape, shape.bbox, s2, s2.bbox, curveIntersectionThreshold);\n };\n\n return shape;\n },\n getminmax: function (curve, d, list) {\n if (!list) return {\n min: 0,\n max: 0\n };\n let min = nMax,\n max = nMin,\n t,\n c;\n\n if (list.indexOf(0) === -1) {\n list = [0].concat(list);\n }\n\n if (list.indexOf(1) === -1) {\n list.push(1);\n }\n\n for (let i = 0, len = list.length; i < len; i++) {\n t = list[i];\n c = curve.get(t);\n\n if (c[d] < min) {\n min = c[d];\n }\n\n if (c[d] > max) {\n max = c[d];\n }\n }\n\n return {\n min: min,\n mid: (min + max) / 2,\n max: max,\n size: max - min\n };\n },\n align: function (points, line) {\n const tx = line.p1.x,\n ty = line.p1.y,\n a = -atan2(line.p2.y - ty, line.p2.x - tx),\n d = function (v) {\n return {\n x: (v.x - tx) * cos(a) - (v.y - ty) * sin(a),\n y: (v.x - tx) * sin(a) + (v.y - ty) * cos(a)\n };\n };\n\n return points.map(d);\n },\n roots: function (points, line) {\n line = line || {\n p1: {\n x: 0,\n y: 0\n },\n p2: {\n x: 1,\n y: 0\n }\n };\n const order = points.length - 1;\n const aligned = utils.align(points, line);\n\n const reduce = function (t) {\n return 0 <= t && t <= 1;\n };\n\n if (order === 2) {\n const a = aligned[0].y,\n b = aligned[1].y,\n c = aligned[2].y,\n d = a - 2 * b + c;\n\n if (d !== 0) {\n const m1 = -sqrt(b * b - a * c),\n m2 = -a + b,\n v1 = -(m1 + m2) / d,\n v2 = -(-m1 + m2) / d;\n return [v1, v2].filter(reduce);\n } else if (b !== c && d === 0) {\n return [(2 * b - c) / (2 * b - 2 * c)].filter(reduce);\n }\n\n return [];\n } // see http://www.trans4mind.com/personal_development/mathematics/polynomials/cubicAlgebra.htm\n\n\n const pa = aligned[0].y,\n pb = aligned[1].y,\n pc = aligned[2].y,\n pd = aligned[3].y;\n let d = -pa + 3 * pb - 3 * pc + pd,\n a = 3 * pa - 6 * pb + 3 * pc,\n b = -3 * pa + 3 * pb,\n c = pa;\n\n if (utils.approximately(d, 0)) {\n // this is not a cubic curve.\n if (utils.approximately(a, 0)) {\n // in fact, this is not a quadratic curve either.\n if (utils.approximately(b, 0)) {\n // in fact in fact, there are no solutions.\n return [];\n } // linear solution:\n\n\n return [-c / b].filter(reduce);\n } // quadratic solution:\n\n\n const q = sqrt(b * b - 4 * a * c),\n a2 = 2 * a;\n return [(q - b) / a2, (-b - q) / a2].filter(reduce);\n } // at this point, we know we need a cubic solution:\n\n\n a /= d;\n b /= d;\n c /= d;\n const p = (3 * b - a * a) / 3,\n p3 = p / 3,\n q = (2 * a * a * a - 9 * a * b + 27 * c) / 27,\n q2 = q / 2,\n discriminant = q2 * q2 + p3 * p3 * p3;\n let u1, v1, x1, x2, x3;\n\n if (discriminant < 0) {\n const mp3 = -p / 3,\n mp33 = mp3 * mp3 * mp3,\n r = sqrt(mp33),\n t = -q / (2 * r),\n cosphi = t < -1 ? -1 : t > 1 ? 1 : t,\n phi = acos(cosphi),\n crtr = crt(r),\n t1 = 2 * crtr;\n x1 = t1 * cos(phi / 3) - a / 3;\n x2 = t1 * cos((phi + tau) / 3) - a / 3;\n x3 = t1 * cos((phi + 2 * tau) / 3) - a / 3;\n return [x1, x2, x3].filter(reduce);\n } else if (discriminant === 0) {\n u1 = q2 < 0 ? crt(-q2) : -crt(q2);\n x1 = 2 * u1 - a / 3;\n x2 = -u1 - a / 3;\n return [x1, x2].filter(reduce);\n } else {\n const sd = sqrt(discriminant);\n u1 = crt(-q2 + sd);\n v1 = crt(q2 + sd);\n return [u1 - v1 - a / 3].filter(reduce);\n }\n },\n droots: function (p) {\n // quadratic roots are easy\n if (p.length === 3) {\n const a = p[0],\n b = p[1],\n c = p[2],\n d = a - 2 * b + c;\n\n if (d !== 0) {\n const m1 = -sqrt(b * b - a * c),\n m2 = -a + b,\n v1 = -(m1 + m2) / d,\n v2 = -(-m1 + m2) / d;\n return [v1, v2];\n } else if (b !== c && d === 0) {\n return [(2 * b - c) / (2 * (b - c))];\n }\n\n return [];\n } // linear roots are even easier\n\n\n if (p.length === 2) {\n const a = p[0],\n b = p[1];\n\n if (a !== b) {\n return [a / (a - b)];\n }\n\n return [];\n }\n\n return [];\n },\n curvature: function (t, d1, d2, _3d, kOnly) {\n let num,\n dnm,\n adk,\n dk,\n k = 0,\n r = 0; //\n // We're using the following formula for curvature:\n //\n // x'y\" - y'x\"\n // k(t) = ------------------\n // (x'\u00B2 + y'\u00B2)^(3/2)\n //\n // from https://en.wikipedia.org/wiki/Radius_of_curvature#Definition\n //\n // With it corresponding 3D counterpart:\n //\n // sqrt( (y'z\" - y\"z')\u00B2 + (z'x\" - z\"x')\u00B2 + (x'y\" - x\"y')\u00B2)\n // k(t) = -------------------------------------------------------\n // (x'\u00B2 + y'\u00B2 + z'\u00B2)^(3/2)\n //\n\n const d = utils.compute(t, d1);\n const dd = utils.compute(t, d2);\n const qdsum = d.x * d.x + d.y * d.y;\n\n if (_3d) {\n num = sqrt(pow(d.y * dd.z - dd.y * d.z, 2) + pow(d.z * dd.x - dd.z * d.x, 2) + pow(d.x * dd.y - dd.x * d.y, 2));\n dnm = pow(qdsum + d.z * d.z, 3 / 2);\n } else {\n num = d.x * dd.y - d.y * dd.x;\n dnm = pow(qdsum, 3 / 2);\n }\n\n if (num === 0 || dnm === 0) {\n return {\n k: 0,\n r: 0\n };\n }\n\n k = num / dnm;\n r = dnm / num; // We're also computing the derivative of kappa, because\n // there is value in knowing the rate of change for the\n // curvature along the curve. And we're just going to\n // ballpark it based on an epsilon.\n\n if (!kOnly) {\n // compute k'(t) based on the interval before, and after it,\n // to at least try to not introduce forward/backward pass bias.\n const pk = utils.curvature(t - 0.001, d1, d2, _3d, true).k;\n const nk = utils.curvature(t + 0.001, d1, d2, _3d, true).k;\n dk = (nk - k + (k - pk)) / 2;\n adk = (abs(nk - k) + abs(k - pk)) / 2;\n }\n\n return {\n k: k,\n r: r,\n dk: dk,\n adk: adk\n };\n },\n inflections: function (points) {\n if (points.length < 4) return []; // FIXME: TODO: add in inflection abstraction for quartic+ curves?\n\n const p = utils.align(points, {\n p1: points[0],\n p2: points.slice(-1)[0]\n }),\n a = p[2].x * p[1].y,\n b = p[3].x * p[1].y,\n c = p[1].x * p[2].y,\n d = p[3].x * p[2].y,\n v1 = 18 * (-3 * a + 2 * b + 3 * c - d),\n v2 = 18 * (3 * a - b - 3 * c),\n v3 = 18 * (c - a);\n\n if (utils.approximately(v1, 0)) {\n if (!utils.approximately(v2, 0)) {\n let t = -v3 / v2;\n if (0 <= t && t <= 1) return [t];\n }\n\n return [];\n }\n\n const trm = v2 * v2 - 4 * v1 * v3,\n sq = Math.sqrt(trm),\n d2 = 2 * v1;\n if (utils.approximately(d2, 0)) return [];\n return [(sq - v2) / d2, -(v2 + sq) / d2].filter(function (r) {\n return 0 <= r && r <= 1;\n });\n },\n bboxoverlap: function (b1, b2) {\n const dims = [\"x\", \"y\"],\n len = dims.length;\n\n for (let i = 0, dim, l, t, d; i < len; i++) {\n dim = dims[i];\n l = b1[dim].mid;\n t = b2[dim].mid;\n d = (b1[dim].size + b2[dim].size) / 2;\n if (abs(l - t) >= d) return false;\n }\n\n return true;\n },\n expandbox: function (bbox, _bbox) {\n if (_bbox.x.min < bbox.x.min) {\n bbox.x.min = _bbox.x.min;\n }\n\n if (_bbox.y.min < bbox.y.min) {\n bbox.y.min = _bbox.y.min;\n }\n\n if (_bbox.z && _bbox.z.min < bbox.z.min) {\n bbox.z.min = _bbox.z.min;\n }\n\n if (_bbox.x.max > bbox.x.max) {\n bbox.x.max = _bbox.x.max;\n }\n\n if (_bbox.y.max > bbox.y.max) {\n bbox.y.max = _bbox.y.max;\n }\n\n if (_bbox.z && _bbox.z.max > bbox.z.max) {\n bbox.z.max = _bbox.z.max;\n }\n\n bbox.x.mid = (bbox.x.min + bbox.x.max) / 2;\n bbox.y.mid = (bbox.y.min + bbox.y.max) / 2;\n\n if (bbox.z) {\n bbox.z.mid = (bbox.z.min + bbox.z.max) / 2;\n }\n\n bbox.x.size = bbox.x.max - bbox.x.min;\n bbox.y.size = bbox.y.max - bbox.y.min;\n\n if (bbox.z) {\n bbox.z.size = bbox.z.max - bbox.z.min;\n }\n },\n pairiteration: function (c1, c2, curveIntersectionThreshold) {\n const c1b = c1.bbox(),\n c2b = c2.bbox(),\n r = 100000,\n threshold = curveIntersectionThreshold || 0.5;\n\n if (c1b.x.size + c1b.y.size < threshold && c2b.x.size + c2b.y.size < threshold) {\n return [(r * (c1._t1 + c1._t2) / 2 | 0) / r + \"/\" + (r * (c2._t1 + c2._t2) / 2 | 0) / r];\n }\n\n let cc1 = c1.split(0.5),\n cc2 = c2.split(0.5),\n pairs = [{\n left: cc1.left,\n right: cc2.left\n }, {\n left: cc1.left,\n right: cc2.right\n }, {\n left: cc1.right,\n right: cc2.right\n }, {\n left: cc1.right,\n right: cc2.left\n }];\n pairs = pairs.filter(function (pair) {\n return utils.bboxoverlap(pair.left.bbox(), pair.right.bbox());\n });\n let results = [];\n if (pairs.length === 0) return results;\n pairs.forEach(function (pair) {\n results = results.concat(utils.pairiteration(pair.left, pair.right, threshold));\n });\n results = results.filter(function (v, i) {\n return results.indexOf(v) === i;\n });\n return results;\n },\n getccenter: function (p1, p2, p3) {\n const dx1 = p2.x - p1.x,\n dy1 = p2.y - p1.y,\n dx2 = p3.x - p2.x,\n dy2 = p3.y - p2.y,\n dx1p = dx1 * cos(quart) - dy1 * sin(quart),\n dy1p = dx1 * sin(quart) + dy1 * cos(quart),\n dx2p = dx2 * cos(quart) - dy2 * sin(quart),\n dy2p = dx2 * sin(quart) + dy2 * cos(quart),\n // chord midpoints\n mx1 = (p1.x + p2.x) / 2,\n my1 = (p1.y + p2.y) / 2,\n mx2 = (p2.x + p3.x) / 2,\n my2 = (p2.y + p3.y) / 2,\n // midpoint offsets\n mx1n = mx1 + dx1p,\n my1n = my1 + dy1p,\n mx2n = mx2 + dx2p,\n my2n = my2 + dy2p,\n // intersection of these lines:\n arc = utils.lli8(mx1, my1, mx1n, my1n, mx2, my2, mx2n, my2n),\n r = utils.dist(arc, p1); // arc start/end values, over mid point:\n\n let s = atan2(p1.y - arc.y, p1.x - arc.x),\n m = atan2(p2.y - arc.y, p2.x - arc.x),\n e = atan2(p3.y - arc.y, p3.x - arc.x),\n _; // determine arc direction (cw/ccw correction)\n\n\n if (s < e) {\n // if s<m<e, arc(s, e)\n // if m<s<e, arc(e, s + tau)\n // if s<e<m, arc(e, s + tau)\n if (s > m || m > e) {\n s += tau;\n }\n\n if (s > e) {\n _ = e;\n e = s;\n s = _;\n }\n } else {\n // if e<m<s, arc(e, s)\n // if m<e<s, arc(s, e + tau)\n // if e<s<m, arc(s, e + tau)\n if (e < m && m < s) {\n _ = e;\n e = s;\n s = _;\n } else {\n e += tau;\n }\n } // assign and done.\n\n\n arc.s = s;\n arc.e = e;\n arc.r = r;\n return arc;\n },\n numberSort: function (a, b) {\n return a - b;\n }\n};\n/**\n * Poly Bezier\n * @param {[type]} curves [description]\n */\n\nclass PolyBezier {\n constructor(curves) {\n this.curves = [];\n this._3d = false;\n\n if (!!curves) {\n this.curves = curves;\n this._3d = this.curves[0]._3d;\n }\n }\n\n valueOf() {\n return this.toString();\n }\n\n toString() {\n return \"[\" + this.curves.map(function (curve) {\n return utils.pointsToString(curve.points);\n }).join(\", \") + \"]\";\n }\n\n addCurve(curve) {\n this.curves.push(curve);\n this._3d = this._3d || curve._3d;\n }\n\n length() {\n return this.curves.map(function (v) {\n return v.length();\n }).reduce(function (a, b) {\n return a + b;\n });\n }\n\n curve(idx) {\n return this.curves[idx];\n }\n\n bbox() {\n const c = this.curves;\n var bbox = c[0].bbox();\n\n for (var i = 1; i < c.length; i++) {\n utils.expandbox(bbox, c[i].bbox());\n }\n\n return bbox;\n }\n\n offset(d) {\n const offset = [];\n this.curves.forEach(function (v) {\n offset.push(...v.offset(d));\n });\n return new PolyBezier(offset);\n }\n\n}\n/**\n A javascript Bezier curve library by Pomax.\n\n Based on http://pomax.github.io/bezierinfo\n\n This code is MIT licensed.\n**/\n// math-inlining.\n\n\nconst {\n abs: abs$1,\n min,\n max,\n cos: cos$1,\n sin: sin$1,\n acos: acos$1,\n sqrt: sqrt$1\n} = Math;\nconst pi$1 = Math.PI;\n/**\n * Bezier curve constructor.\n *\n * ...docs pending...\n */\n\nclass Bezier {\n constructor(coords) {\n let args = coords && coords.forEach ? coords : Array.from(arguments).slice();\n let coordlen = false;\n\n if (typeof args[0] === \"object\") {\n coordlen = args.length;\n const newargs = [];\n args.forEach(function (point) {\n [\"x\", \"y\", \"z\"].forEach(function (d) {\n if (typeof point[d] !== \"undefined\") {\n newargs.push(point[d]);\n }\n });\n });\n args = newargs;\n }\n\n let higher = false;\n const len = args.length;\n\n if (coordlen) {\n if (coordlen > 4) {\n if (arguments.length !== 1) {\n throw new Error(\"Only new Bezier(point[]) is accepted for 4th and higher order curves\");\n }\n\n higher = true;\n }\n } else {\n if (len !== 6 && len !== 8 && len !== 9 && len !== 12) {\n if (arguments.length !== 1) {\n throw new Error(\"Only new Bezier(point[]) is accepted for 4th and higher order curves\");\n }\n }\n }\n\n const _3d = this._3d = !higher && (len === 9 || len === 12) || coords && coords[0] && typeof coords[0].z !== \"undefined\";\n\n const points = this.points = [];\n\n for (let idx = 0, step = _3d ? 3 : 2; idx < len; idx += step) {\n var point = {\n x: args[idx],\n y: args[idx + 1]\n };\n\n if (_3d) {\n point.z = args[idx + 2];\n }\n\n points.push(point);\n }\n\n const order = this.order = points.length - 1;\n const dims = this.dims = [\"x\", \"y\"];\n if (_3d) dims.push(\"z\");\n this.dimlen = dims.length;\n const aligned = utils.align(points, {\n p1: points[0],\n p2: points[order]\n });\n this._linear = !aligned.some(p => abs$1(p.y) > 0.0001);\n this._lut = [];\n this._t1 = 0;\n this._t2 = 1;\n this.update();\n }\n\n static quadraticFromPoints(p1, p2, p3, t) {\n if (typeof t === \"undefined\") {\n t = 0.5;\n } // shortcuts, although they're really dumb\n\n\n if (t === 0) {\n return new Bezier(p2, p2, p3);\n }\n\n if (t === 1) {\n return new Bezier(p1, p2, p2);\n } // real fitting.\n\n\n const abc = Bezier.getABC(2, p1, p2, p3, t);\n return new Bezier(p1, abc.A, p3);\n }\n\n static cubicFromPoints(S, B, E, t, d1) {\n if (typeof t === \"undefined\") {\n t = 0.5;\n }\n\n const abc = Bezier.getABC(3, S, B, E, t);\n\n if (typeof d1 === \"undefined\") {\n d1 = utils.dist(B, abc.C);\n }\n\n const d2 = d1 * (1 - t) / t;\n const selen = utils.dist(S, E),\n lx = (E.x - S.x) / selen,\n ly = (E.y - S.y) / selen,\n bx1 = d1 * lx,\n by1 = d1 * ly,\n bx2 = d2 * lx,\n by2 = d2 * ly; // derivation of new hull coordinates\n\n const e1 = {\n x: B.x - bx1,\n y: B.y - by1\n },\n e2 = {\n x: B.x + bx2,\n y: B.y + by2\n },\n A = abc.A,\n v1 = {\n x: A.x + (e1.x - A.x) / (1 - t),\n y: A.y + (e1.y - A.y) / (1 - t)\n },\n v2 = {\n x: A.x + (e2.x - A.x) / t,\n y: A.y + (e2.y - A.y) / t\n },\n nc1 = {\n x: S.x + (v1.x - S.x) / t,\n y: S.y + (v1.y - S.y) / t\n },\n nc2 = {\n x: E.x + (v2.x - E.x) / (1 - t),\n y: E.y + (v2.y - E.y) / (1 - t)\n }; // ...done\n\n return new Bezier(S, nc1, nc2, E);\n }\n\n static getUtils() {\n return utils;\n }\n\n getUtils() {\n return Bezier.getUtils();\n }\n\n static get PolyBezier() {\n return PolyBezier;\n }\n\n valueOf() {\n return this.toString();\n }\n\n toString() {\n return utils.pointsToString(this.points);\n }\n\n toSVG() {\n if (this._3d) return false;\n const p = this.points,\n x = p[0].x,\n y = p[0].y,\n s = [\"M\", x, y, this.order === 2 ? \"Q\" : \"C\"];\n\n for (let i = 1, last = p.length; i < last; i++) {\n s.push(p[i].x);\n s.push(p[i].y);\n }\n\n return s.join(\" \");\n }\n\n setRatios(ratios) {\n if (ratios.length !== this.points.length) {\n throw new Error(\"incorrect number of ratio values\");\n }\n\n this.ratios = ratios;\n this._lut = []; // invalidate any precomputed LUT\n }\n\n verify() {\n const print = this.coordDigest();\n\n if (print !== this._print) {\n this._print = print;\n this.update();\n }\n }\n\n coordDigest() {\n return this.points.map(function (c, pos) {\n return \"\" + pos + c.x + c.y + (c.z ? c.z : 0);\n }).join(\"\");\n }\n\n update() {\n // invalidate any precomputed LUT\n this._lut = [];\n this.dpoints = utils.derive(this.points, this._3d);\n this.computedirection();\n }\n\n computedirection() {\n const points = this.points;\n const angle = utils.angle(points[0], points[this.order], points[1]);\n this.clockwise = angle > 0;\n }\n\n length() {\n return utils.length(this.derivative.bind(this));\n }\n\n static getABC(order = 2, S, B, E, t = 0.5) {\n const u = utils.projectionratio(t, order),\n um = 1 - u,\n C = {\n x: u * S.x + um * E.x,\n y: u * S.y + um * E.y\n },\n s = utils.abcratio(t, order),\n A = {\n x: B.x + (B.x - C.x) / s,\n y: B.y + (B.y - C.y) / s\n };\n return {\n A,\n B,\n C,\n S,\n E\n };\n }\n\n getABC(t, B) {\n B = B || this.get(t);\n let S = this.points[0];\n let E = this.points[this.order];\n return Bezier.getABC(this.order, S, B, E, t);\n }\n\n getLUT(steps) {\n this.verify();\n steps = steps || 100;\n\n if (this._lut.length === steps) {\n return this._lut;\n }\n\n this._lut = []; // We want a range from 0 to 1 inclusive, so\n // we decrement and then use <= rather than <:\n\n steps--;\n\n for (let i = 0, p, t; i < steps; i++) {\n t = i / (steps - 1);\n p = this.compute(t);\n p.t = t;\n\n this._lut.push(p);\n }\n\n return this._lut;\n }\n\n on(point, error) {\n error = error || 5;\n const lut = this.getLUT(),\n hits = [];\n\n for (let i = 0, c, t = 0; i < lut.length; i++) {\n c = lut[i];\n\n if (utils.dist(c, point) < error) {\n hits.push(c);\n t += i / lut.length;\n }\n }\n\n if (!hits.length) return false;\n return t /= hits.length;\n }\n\n project(point) {\n // step 1: coarse check\n const LUT = this.getLUT(),\n l = LUT.length - 1,\n closest = utils.closest(LUT, point),\n mpos = closest.mpos,\n t1 = (mpos - 1) / l,\n t2 = (mpos + 1) / l,\n step = 0.1 / l; // step 2: fine check\n\n let mdist = closest.mdist,\n t = t1,\n ft = t,\n p;\n mdist += 1;\n\n for (let d; t < t2 + step; t += step) {\n p = this.compute(t);\n d = utils.dist(point, p);\n\n if (d < mdist) {\n mdist = d;\n ft = t;\n }\n }\n\n ft = ft < 0 ? 0 : ft > 1 ? 1 : ft;\n p = this.compute(ft);\n p.t = ft;\n p.d = mdist;\n return p;\n }\n\n get(t) {\n return this.compute(t);\n }\n\n point(idx) {\n return this.points[idx];\n }\n\n compute(t) {\n if (this.ratios) {\n return utils.computeWithRatios(t, this.points, this.ratios, this._3d);\n }\n\n return utils.compute(t, this.points, this._3d, this.ratios);\n }\n\n raise() {\n const p = this.points,\n np = [p[0]],\n k = p.length;\n\n for (let i = 1, pi, pim; i < k; i++) {\n pi = p[i];\n pim = p[i - 1];\n np[i] = {\n x: (k - i) / k * pi.x + i / k * pim.x,\n y: (k - i) / k * pi.y + i / k * pim.y\n };\n }\n\n np[k] = p[k - 1];\n return new Bezier(np);\n }\n\n derivative(t) {\n return utils.compute(t, this.dpoints[0]);\n }\n\n dderivative(t) {\n return utils.compute(t, this.dpoints[1]);\n }\n\n align() {\n let p = this.points;\n return new Bezier(utils.align(p, {\n p1: p[0],\n p2: p[p.length - 1]\n }));\n }\n\n curvature(t) {\n return utils.curvature(t, this.dpoints[0], this.dpoints[1], this._3d);\n }\n\n inflections() {\n return utils.inflections(this.points);\n }\n\n normal(t) {\n return this._3d ? this.__normal3(t) : this.__normal2(t);\n }\n\n __normal2(t) {\n const d = this.derivative(t);\n const q = sqrt$1(d.x * d.x + d.y * d.y);\n return {\n x: -d.y / q,\n y: d.x / q\n };\n }\n\n __normal3(t) {\n // see http://stackoverflow.com/questions/25453159\n const r1 = this.derivative(t),\n r2 = this.derivative(t + 0.01),\n q1 = sqrt$1(r1.x * r1.x + r1.y * r1.y + r1.z * r1.z),\n q2 = sqrt$1(r2.x * r2.x + r2.y * r2.y + r2.z * r2.z);\n r1.x /= q1;\n r1.y /= q1;\n r1.z /= q1;\n r2.x /= q2;\n r2.y /= q2;\n r2.z /= q2; // cross product\n\n const c = {\n x: r2.y * r1.z - r2.z * r1.y,\n y: r2.z * r1.x - r2.x * r1.z,\n z: r2.x * r1.y - r2.y * r1.x\n };\n const m = sqrt$1(c.x * c.x + c.y * c.y + c.z * c.z);\n c.x /= m;\n c.y /= m;\n c.z /= m; // rotation matrix\n\n const R = [c.x * c.x, c.x * c.y - c.z, c.x * c.z + c.y, c.x * c.y + c.z, c.y * c.y, c.y * c.z - c.x, c.x * c.z - c.y, c.y * c.z + c.x, c.z * c.z]; // normal vector:\n\n const n = {\n x: R[0] * r1.x + R[1] * r1.y + R[2] * r1.z,\n y: R[3] * r1.x + R[4] * r1.y + R[5] * r1.z,\n z: R[6] * r1.x + R[7] * r1.y + R[8] * r1.z\n };\n return n;\n }\n\n hull(t) {\n let p = this.points,\n _p = [],\n q = [],\n idx = 0;\n q[idx++] = p[0];\n q[idx++] = p[1];\n q[idx++] = p[2];\n\n if (this.order === 3) {\n q[idx++] = p[3];\n } // we lerp between all points at each iteration, until we have 1 point left.\n\n\n while (p.length > 1) {\n _p = [];\n\n for (let i = 0, pt, l = p.length - 1; i < l; i++) {\n pt = utils.lerp(t, p[i], p[i + 1]);\n q[idx++] = pt;\n\n _p.push(pt);\n }\n\n p = _p;\n }\n\n return q;\n }\n\n split(t1, t2) {\n // shortcuts\n if (t1 === 0 && !!t2) {\n return this.split(t2).left;\n }\n\n if (t2 === 1) {\n return this.split(t1).right;\n } // no shortcut: use \"de Casteljau\" iteration.\n\n\n const q = this.hull(t1);\n const result = {\n left: this.order === 2 ? new Bezier([q[0], q[3], q[5]]) : new Bezier([q[0], q[4], q[7], q[9]]),\n right: this.order === 2 ? new Bezier([q[5], q[4], q[2]]) : new Bezier([q[9], q[8], q[6], q[3]]),\n span: q\n }; // make sure we bind _t1/_t2 information!\n\n result.left._t1 = utils.map(0, 0, 1, this._t1, this._t2);\n result.left._t2 = utils.map(t1, 0, 1, this._t1, this._t2);\n result.right._t1 = utils.map(t1, 0, 1, this._t1, this._t2);\n result.right._t2 = utils.map(1, 0, 1, this._t1, this._t2); // if we have no t2, we're done\n\n if (!t2) {\n return result;\n } // if we have a t2, split again:\n\n\n t2 = utils.map(t2, t1, 1, 0, 1);\n return result.right.split(t2).left;\n }\n\n extrema() {\n const result = {};\n let roots = [];\n this.dims.forEach(function (dim) {\n let mfn = function (v) {\n return v[dim];\n };\n\n let p = this.dpoints[0].map(mfn);\n result[dim] = utils.droots(p);\n\n if (this.order === 3) {\n p = this.dpoints[1].map(mfn);\n result[dim] = result[dim].concat(utils.droots(p));\n }\n\n result[dim] = result[dim].filter(function (t) {\n return t >= 0 && t <= 1;\n });\n roots = roots.concat(result[dim].sort(utils.numberSort));\n }.bind(this));\n result.values = roots.sort(utils.numberSort).filter(function (v, idx) {\n return roots.indexOf(v) === idx;\n });\n return result;\n }\n\n bbox() {\n const extrema = this.extrema(),\n result = {};\n this.dims.forEach(function (d) {\n result[d] = utils.getminmax(this, d, extrema[d]);\n }.bind(this));\n return result;\n }\n\n overlaps(curve) {\n const lbbox = this.bbox(),\n tbbox = curve.bbox();\n return utils.bboxoverlap(lbbox, tbbox);\n }\n\n offset(t, d) {\n if (typeof d !== \"undefined\") {\n const c = this.get(t),\n n = this.normal(t);\n const ret = {\n c: c,\n n: n,\n x: c.x + n.x * d,\n y: c.y + n.y * d\n };\n\n if (this._3d) {\n ret.z = c.z + n.z * d;\n }\n\n return ret;\n }\n\n if (this._linear) {\n const nv = this.normal(0),\n coords = this.points.map(function (p) {\n const ret = {\n x: p.x + t * nv.x,\n y: p.y + t * nv.y\n };\n\n if (p.z && nv.z) {\n ret.z = p.z + t * nv.z;\n }\n\n return ret;\n });\n return [new Bezier(coords)];\n }\n\n return this.reduce().map(function (s) {\n if (s._linear) {\n return s.offset(t)[0];\n }\n\n return s.scale(t);\n });\n }\n\n simple() {\n if (this.order === 3) {\n const a1 = utils.angle(this.points[0], this.points[3], this.points[1]);\n const a2 = utils.angle(this.points[0], this.points[3], this.points[2]);\n if (a1 > 0 && a2 < 0 || a1 < 0 && a2 > 0) return false;\n }\n\n const n1 = this.normal(0);\n const n2 = this.normal(1);\n let s = n1.x * n2.x + n1.y * n2.y;\n\n if (this._3d) {\n s += n1.z * n2.z;\n }\n\n return abs$1(acos$1(s)) < pi$1 / 3;\n }\n\n reduce() {\n // TODO: examine these var types in more detail...\n let i,\n t1 = 0,\n t2 = 0,\n step = 0.01,\n segment,\n pass1 = [],\n pass2 = []; // first pass: split on extrema\n\n let extrema = this.extrema().values;\n\n if (extrema.indexOf(0) === -1) {\n extrema = [0].concat(extrema);\n }\n\n if (extrema.indexOf(1) === -1) {\n extrema.push(1);\n }\n\n for (t1 = extrema[0], i = 1; i < extrema.length; i++) {\n t2 = extrema[i];\n segment = this.split(t1, t2);\n segment._t1 = t1;\n segment._t2 = t2;\n pass1.push(segment);\n t1 = t2;\n } // second pass: further reduce these segments to simple segments\n\n\n pass1.forEach(function (p1) {\n t1 = 0;\n t2 = 0;\n\n while (t2 <= 1) {\n for (t2 = t1 + step; t2 <= 1 + step; t2 += step) {\n segment = p1.split(t1, t2);\n\n if (!segment.simple()) {\n t2 -= step;\n\n if (abs$1(t1 - t2) < step) {\n // we can never form a reduction\n return [];\n }\n\n segment = p1.split(t1, t2);\n segment._t1 = utils.map(t1, 0, 1, p1._t1, p1._t2);\n segment._t2 = utils.map(t2, 0, 1, p1._t1, p1._t2);\n pass2.push(segment);\n t1 = t2;\n break;\n }\n }\n }\n\n if (t1 < 1) {\n segment = p1.split(t1, 1);\n segment._t1 = utils.map(t1, 0, 1, p1._t1, p1._t2);\n segment._t2 = p1._t2;\n pass2.push(segment);\n }\n });\n return pass2;\n }\n\n scale(d) {\n const order = this.order;\n let distanceFn = false;\n\n if (typeof d === \"function\") {\n distanceFn = d;\n }\n\n if (distanceFn && order === 2) {\n return this.raise().scale(distanceFn);\n } // TODO: add special handling for degenerate (=linear) curves.\n\n\n const clockwise = this.clockwise;\n const r1 = distanceFn ? distanceFn(0) : d;\n const r2 = distanceFn ? distanceFn(1) : d;\n const v = [this.offset(0, 10), this.offset(1, 10)];\n const points = this.points;\n const np = [];\n const o = utils.lli4(v[0], v[0].c, v[1], v[1].c);\n\n if (!o) {\n throw new Error(\"cannot scale this curve. Try reducing it first.\");\n } // move all points by distance 'd' wrt the origin 'o'\n // move end points by fixed distance along normal.\n\n\n [0, 1].forEach(function (t) {\n const p = np[t * order] = utils.copy(points[t * order]);\n p.x += (t ? r2 : r1) * v[t].n.x;\n p.y += (t ? r2 : r1) * v[t].n.y;\n });\n\n if (!distanceFn) {\n // move control points to lie on the intersection of the offset\n // derivative vector, and the origin-through-control vector\n [0, 1].forEach(t => {\n if (order === 2 && !!t) return;\n const p = np[t * order];\n const d = this.derivative(t);\n const p2 = {\n x: p.x + d.x,\n y: p.y + d.y\n };\n np[t + 1] = utils.lli4(p, p2, o, points[t + 1]);\n });\n return new Bezier(np);\n } // move control points by \"however much necessary to\n // ensure the correct tangent to endpoint\".\n\n\n [0, 1].forEach(function (t) {\n if (order === 2 && !!t) return;\n var p = points[t + 1];\n var ov = {\n x: p.x - o.x,\n y: p.y - o.y\n };\n var rc = distanceFn ? distanceFn((t + 1) / order) : d;\n if (distanceFn && !clockwise) rc = -rc;\n var m = sqrt$1(ov.x * ov.x + ov.y * ov.y);\n ov.x /= m;\n ov.y /= m;\n np[t + 1] = {\n x: p.x + rc * ov.x,\n y: p.y + rc * ov.y\n };\n });\n return new Bezier(np);\n }\n\n outline(d1, d2, d3, d4) {\n d2 = typeof d2 === \"undefined\" ? d1 : d2;\n const reduced = this.reduce(),\n len = reduced.length,\n fcurves = [];\n let bcurves = [],\n p,\n alen = 0,\n tlen = this.length();\n const graduated = typeof d3 !== \"undefined\" && typeof d4 !== \"undefined\";\n\n function linearDistanceFunction(s, e, tlen, alen, slen) {\n return function (v) {\n const f1 = alen / tlen,\n f2 = (alen + slen) / tlen,\n d = e - s;\n return utils.map(v, 0, 1, s + f1 * d, s + f2 * d);\n };\n } // form curve oulines\n\n\n reduced.forEach(function (segment) {\n const slen = segment.length();\n\n if (graduated) {\n fcurves.push(segment.scale(linearDistanceFunction(d1, d3, tlen, alen, slen)));\n bcurves.push(segment.scale(linearDistanceFunction(-d2, -d4, tlen, alen, slen)));\n } else {\n fcurves.push(segment.scale(d1));\n bcurves.push(segment.scale(-d2));\n }\n\n alen += slen;\n }); // reverse the \"return\" outline\n\n bcurves = bcurves.map(function (s) {\n p = s.points;\n\n if (p[3]) {\n s.points = [p[3], p[2], p[1], p[0]];\n } else {\n s.points = [p[2], p[1], p[0]];\n }\n\n return s;\n }).reverse(); // form the endcaps as lines\n\n const fs = fcurves[0].points[0],\n fe = fcurves[len - 1].points[fcurves[len - 1].points.length - 1],\n bs = bcurves[len - 1].points[bcurves[len - 1].points.length - 1],\n be = bcurves[0].points[0],\n ls = utils.makeline(bs, fs),\n le = utils.makeline(fe, be),\n segments = [ls].concat(fcurves).concat([le]).concat(bcurves);\n return new PolyBezier(segments);\n }\n\n outlineshapes(d1, d2, curveIntersectionThreshold) {\n d2 = d2 || d1;\n const outline = this.outline(d1, d2).curves;\n const shapes = [];\n\n for (let i = 1, len = outline.length; i < len / 2; i++) {\n const shape = utils.makeshape(outline[i], outline[len - i], curveIntersectionThreshold);\n shape.startcap.virtual = i > 1;\n shape.endcap.virtual = i < len / 2 - 1;\n shapes.push(shape);\n }\n\n return shapes;\n }\n\n intersects(curve, curveIntersectionThreshold) {\n if (!curve) return this.selfintersects(curveIntersectionThreshold);\n\n if (curve.p1 && curve.p2) {\n return this.lineIntersects(curve);\n }\n\n if (curve instanceof Bezier) {\n curve = curve.reduce();\n }\n\n return this.curveintersects(this.reduce(), curve, curveIntersectionThreshold);\n }\n\n lineIntersects(line) {\n const mx = min(line.p1.x, line.p2.x),\n my = min(line.p1.y, line.p2.y),\n MX = max(line.p1.x, line.p2.x),\n MY = max(line.p1.y, line.p2.y);\n return utils.roots(this.points, line).filter(t => {\n var p = this.get(t);\n return utils.between(p.x, mx, MX) && utils.between(p.y, my, MY);\n });\n }\n\n selfintersects(curveIntersectionThreshold) {\n // \"simple\" curves cannot intersect with their direct\n // neighbour, so for each segment X we check whether\n // it intersects [0:x-2][x+2:last].\n const reduced = this.reduce(),\n len = reduced.length - 2,\n results = [];\n\n for (let i = 0, result, left, right; i < len; i++) {\n left = reduced.slice(i, i + 1);\n right = reduced.slice(i + 2);\n result = this.curveintersects(left, right, curveIntersectionThreshold);\n results.push(...result);\n }\n\n return results;\n }\n\n curveintersects(c1, c2, curveIntersectionThreshold) {\n const pairs = []; // step 1: pair off any overlapping segments\n\n c1.forEach(function (l) {\n c2.forEach(function (r) {\n if (l.overlaps(r)) {\n pairs.push({\n left: l,\n right: r\n });\n }\n });\n }); // step 2: for each pairing, run through the convergence algorithm.\n\n let intersections = [];\n pairs.forEach(function (pair) {\n const result = utils.pairiteration(pair.left, pair.right, curveIntersectionThreshold);\n\n if (result.length > 0) {\n intersections = intersections.concat(result);\n }\n });\n return intersections;\n }\n\n arcs(errorThreshold) {\n errorThreshold = errorThreshold || 0.5;\n return this._iterate(errorThreshold, []);\n }\n\n _error(pc, np1, s, e) {\n const q = (e - s) / 4,\n c1 = this.get(s + q),\n c2 = this.get(e - q),\n ref = utils.dist(pc, np1),\n d1 = utils.dist(pc, c1),\n d2 = utils.dist(pc, c2);\n return abs$1(d1 - ref) + abs$1(d2 - ref);\n }\n\n _iterate(errorThreshold, circles) {\n let t_s = 0,\n t_e = 1,\n safety; // we do a binary search to find the \"good `t` closest to no-longer-good\"\n\n do {\n safety = 0; // step 1: start with the maximum possible arc\n\n t_e = 1; // points:\n\n let np1 = this.get(t_s),\n np2,\n np3,\n arc,\n prev_arc; // booleans:\n\n let curr_good = false,\n prev_good = false,\n done; // numbers:\n\n let t_m = t_e,\n prev_e = 1; // step 2: find the best possible arc\n\n do {\n prev_good = curr_good;\n prev_arc = arc;\n t_m = (t_s + t_e) / 2;\n np2 = this.get(t_m);\n np3 = this.get(t_e);\n arc = utils.getccenter(np1, np2, np3); //also save the t values\n\n arc.interval = {\n start: t_s,\n end: t_e\n };\n\n let error = this._error(arc, np1, t_s, t_e);\n\n curr_good = error <= errorThreshold;\n done = prev_good && !curr_good;\n if (!done) prev_e = t_e; // this arc is fine: we can move 'e' up to see if we can find a wider arc\n\n if (curr_good) {\n // if e is already at max, then we're done for this arc.\n if (t_e >= 1) {\n // make sure we cap at t=1\n arc.interval.end = prev_e = 1;\n prev_arc = arc; // if we capped the arc segment to t=1 we also need to make sure that\n // the arc's end angle is correct with respect to the bezier end point.\n\n if (t_e > 1) {\n let d = {\n x: arc.x + arc.r * cos$1(arc.e),\n y: arc.y + arc.r * sin$1(arc.e)\n };\n arc.e += utils.angle({\n x: arc.x,\n y: arc.y\n }, d, this.get(1));\n }\n\n break;\n } // if not, move it up by half the iteration distance\n\n\n t_e = t_e + (t_e - t_s) / 2;\n } else {\n // this is a bad arc: we need to move 'e' down to find a good arc\n t_e = t_m;\n }\n } while (!done && safety++ < 100);\n\n if (safety >= 100) {\n break;\n } // console.log(\"L835: [F] arc found\", t_s, prev_e, prev_arc.x, prev_arc.y, prev_arc.s, prev_arc.e);\n\n\n prev_arc = prev_arc ? prev_arc : arc;\n circles.push(prev_arc);\n t_s = prev_e;\n } while (t_e < 1);\n\n return circles;\n }\n\n}\n\nexports.Bezier = Bezier;\n", "/** @license React v17.0.2\n * react-dom-server.browser.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=require(\"object-assign\"),m=require(\"react\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}\nvar q=60106,r=60107,u=60108,z=60114,B=60109,aa=60110,ba=60112,D=60113,ca=60120,da=60115,ea=60116,fa=60121,ha=60117,ia=60119,ja=60129,ka=60131;\nif(\"function\"===typeof Symbol&&Symbol.for){var E=Symbol.for;q=E(\"react.portal\");r=E(\"react.fragment\");u=E(\"react.strict_mode\");z=E(\"react.profiler\");B=E(\"react.provider\");aa=E(\"react.context\");ba=E(\"react.forward_ref\");D=E(\"react.suspense\");ca=E(\"react.suspense_list\");da=E(\"react.memo\");ea=E(\"react.lazy\");fa=E(\"react.block\");ha=E(\"react.fundamental\");ia=E(\"react.scope\");ja=E(\"react.debug_trace_mode\");ka=E(\"react.legacy_hidden\")}\nfunction F(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case r:return\"Fragment\";case q:return\"Portal\";case z:return\"Profiler\";case u:return\"StrictMode\";case D:return\"Suspense\";case ca:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case aa:return(a.displayName||\"Context\")+\".Consumer\";case B:return(a._context.displayName||\"Context\")+\".Provider\";case ba:var b=a.render;b=b.displayName||b.name||\"\";return a.displayName||\n(\"\"!==b?\"ForwardRef(\"+b+\")\":\"ForwardRef\");case da:return F(a.type);case fa:return F(a._render);case ea:b=a._payload;a=a._init;try{return F(a(b))}catch(c){}}return null}var la=m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,ma={};function I(a,b){for(var c=a._threadCount|0;c<=b;c++)a[c]=a._currentValue2,a._threadCount=c+1}function na(a,b,c,d){if(d&&(d=a.contextType,\"object\"===typeof d&&null!==d))return I(d,c),d[c];if(a=a.contextTypes){c={};for(var f in a)c[f]=b[f];b=c}else b=ma;return b}\nfor(var J=new Uint16Array(16),K=0;15>K;K++)J[K]=K+1;J[15]=0;var oa=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,pa=Object.prototype.hasOwnProperty,qa={},ra={};\nfunction sa(a){if(pa.call(ra,a))return!0;if(pa.call(qa,a))return!1;if(oa.test(a))return ra[a]=!0;qa[a]=!0;return!1}function ta(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction ua(a,b,c,d){if(null===b||\"undefined\"===typeof b||ta(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function M(a,b,c,d,f,h,t){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=f;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=h;this.removeEmptyString=t}var N={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){N[a]=new M(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];N[b]=new M(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){N[a]=new M(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){N[a]=new M(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){N[a]=new M(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){N[a]=new M(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){N[a]=new M(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){N[a]=new M(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){N[a]=new M(a,5,!1,a.toLowerCase(),null,!1,!1)});var va=/[\\-:]([a-z])/g;function wa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(va,\nwa);N[b]=new M(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(va,wa);N[b]=new M(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(va,wa);N[b]=new M(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){N[a]=new M(a,1,!1,a.toLowerCase(),null,!1,!1)});\nN.xlinkHref=new M(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){N[a]=new M(a,1,!1,a.toLowerCase(),null,!0,!0)});var xa=/[\"'&<>]/;\nfunction O(a){if(\"boolean\"===typeof a||\"number\"===typeof a)return\"\"+a;a=\"\"+a;var b=xa.exec(a);if(b){var c=\"\",d,f=0;for(d=b.index;d<a.length;d++){switch(a.charCodeAt(d)){case 34:b=\"&quot;\";break;case 38:b=\"&amp;\";break;case 39:b=\"&#x27;\";break;case 60:b=\"&lt;\";break;case 62:b=\"&gt;\";break;default:continue}f!==d&&(c+=a.substring(f,d));f=d+1;c+=b}a=f!==d?c+a.substring(f,d):c}return a}\nfunction ya(a,b){var c=N.hasOwnProperty(a)?N[a]:null;var d;if(d=\"style\"!==a)d=null!==c?0===c.type:!(2<a.length)||\"o\"!==a[0]&&\"O\"!==a[0]||\"n\"!==a[1]&&\"N\"!==a[1]?!1:!0;if(d||ua(a,b,c,!1))return\"\";if(null!==c){a=c.attributeName;d=c.type;if(3===d||4===d&&!0===b)return a+'=\"\"';c.sanitizeURL&&(b=\"\"+b);return a+'=\"'+(O(b)+'\"')}return sa(a)?a+'=\"'+(O(b)+'\"'):\"\"}function za(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}\nvar Aa=\"function\"===typeof Object.is?Object.is:za,P=null,Q=null,R=null,S=!1,T=!1,U=null,V=0;function W(){if(null===P)throw Error(p(321));return P}function Ba(){if(0<V)throw Error(p(312));return{memoizedState:null,queue:null,next:null}}function Ca(){null===R?null===Q?(S=!1,Q=R=Ba()):(S=!0,R=Q):null===R.next?(S=!1,R=R.next=Ba()):(S=!0,R=R.next);return R}function Da(a,b,c,d){for(;T;)T=!1,V+=1,R=null,c=a(b,d);Ea();return c}function Ea(){P=null;T=!1;Q=null;V=0;R=U=null}\nfunction Fa(a,b){return\"function\"===typeof b?b(a):b}function Ga(a,b,c){P=W();R=Ca();if(S){var d=R.queue;b=d.dispatch;if(null!==U&&(c=U.get(d),void 0!==c)){U.delete(d);d=R.memoizedState;do d=a(d,c.action),c=c.next;while(null!==c);R.memoizedState=d;return[d,b]}return[R.memoizedState,b]}a=a===Fa?\"function\"===typeof b?b():b:void 0!==c?c(b):b;R.memoizedState=a;a=R.queue={last:null,dispatch:null};a=a.dispatch=Ha.bind(null,P,a);return[R.memoizedState,a]}\nfunction Ia(a,b){P=W();R=Ca();b=void 0===b?null:b;if(null!==R){var c=R.memoizedState;if(null!==c&&null!==b){var d=c[1];a:if(null===d)d=!1;else{for(var f=0;f<d.length&&f<b.length;f++)if(!Aa(b[f],d[f])){d=!1;break a}d=!0}if(d)return c[0]}}a=a();R.memoizedState=[a,b];return a}function Ha(a,b,c){if(!(25>V))throw Error(p(301));if(a===P)if(T=!0,a={action:c,next:null},null===U&&(U=new Map),c=U.get(b),void 0===c)U.set(b,a);else{for(b=c;null!==b.next;)b=b.next;b.next=a}}function Ja(){}\nvar X=null,Ka={readContext:function(a){var b=X.threadID;I(a,b);return a[b]},useContext:function(a){W();var b=X.threadID;I(a,b);return a[b]},useMemo:Ia,useReducer:Ga,useRef:function(a){P=W();R=Ca();var b=R.memoizedState;return null===b?(a={current:a},R.memoizedState=a):b},useState:function(a){return Ga(Fa,a)},useLayoutEffect:function(){},useCallback:function(a,b){return Ia(function(){return a},b)},useImperativeHandle:Ja,useEffect:Ja,useDebugValue:Ja,useDeferredValue:function(a){W();return a},useTransition:function(){W();\nreturn[function(a){a()},!1]},useOpaqueIdentifier:function(){return(X.identifierPrefix||\"\")+\"R:\"+(X.uniqueID++).toString(36)},useMutableSource:function(a,b){W();return b(a._source)}},La={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};function Ma(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}\nvar Na={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},Oa=l({menuitem:!0},Na),Y={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,\ngridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Pa=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(Y).forEach(function(a){Pa.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Y[b]=Y[a]})});\nvar Qa=/([A-Z])/g,Ra=/^ms-/,Z=m.Children.toArray,Sa=la.ReactCurrentDispatcher,Ta={listing:!0,pre:!0,textarea:!0},Ua=/^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/,Va={},Wa={};function Xa(a){if(void 0===a||null===a)return a;var b=\"\";m.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}var Ya=Object.prototype.hasOwnProperty,Za={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null,suppressHydrationWarning:null};function $a(a,b){if(void 0===a)throw Error(p(152,F(b)||\"Component\"));}\nfunction ab(a,b,c){function d(d,h){var e=h.prototype&&h.prototype.isReactComponent,f=na(h,b,c,e),t=[],g=!1,n={isMounted:function(){return!1},enqueueForceUpdate:function(){if(null===t)return null},enqueueReplaceState:function(a,c){g=!0;t=[c]},enqueueSetState:function(a,c){if(null===t)return null;t.push(c)}};if(e){if(e=new h(d.props,f,n),\"function\"===typeof h.getDerivedStateFromProps){var k=h.getDerivedStateFromProps.call(null,d.props,e.state);null!=k&&(e.state=l({},e.state,k))}}else if(P={},e=h(d.props,\nf,n),e=Da(h,d.props,e,f),null==e||null==e.render){a=e;$a(a,h);return}e.props=d.props;e.context=f;e.updater=n;n=e.state;void 0===n&&(e.state=n=null);if(\"function\"===typeof e.UNSAFE_componentWillMount||\"function\"===typeof e.componentWillMount)if(\"function\"===typeof e.componentWillMount&&\"function\"!==typeof h.getDerivedStateFromProps&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof h.getDerivedStateFromProps&&e.UNSAFE_componentWillMount(),t.length){n=t;var v=\ng;t=null;g=!1;if(v&&1===n.length)e.state=n[0];else{k=v?n[0]:e.state;var H=!0;for(v=v?1:0;v<n.length;v++){var x=n[v];x=\"function\"===typeof x?x.call(e,k,d.props,f):x;null!=x&&(H?(H=!1,k=l({},k,x)):l(k,x))}e.state=k}}else t=null;a=e.render();$a(a,h);if(\"function\"===typeof e.getChildContext&&(d=h.childContextTypes,\"object\"===typeof d)){var y=e.getChildContext();for(var A in y)if(!(A in d))throw Error(p(108,F(h)||\"Unknown\",A));}y&&(b=l({},b,y))}for(;m.isValidElement(a);){var f=a,h=f.type;if(\"function\"!==\ntypeof h)break;d(f,h)}return{child:a,context:b}}\nvar bb=function(){function a(a,b,f){m.isValidElement(a)?a.type!==r?a=[a]:(a=a.props.children,a=m.isValidElement(a)?[a]:Z(a)):a=Z(a);a={type:null,domNamespace:La.html,children:a,childIndex:0,context:ma,footer:\"\"};var c=J[0];if(0===c){var d=J;c=d.length;var g=2*c;if(!(65536>=g))throw Error(p(304));var e=new Uint16Array(g);e.set(d);J=e;J[0]=c+1;for(d=c;d<g-1;d++)J[d]=d+1;J[g-1]=0}else J[0]=J[c];this.threadID=c;this.stack=[a];this.exhausted=!1;this.currentSelectValue=null;this.previousWasTextNode=!1;\nthis.makeStaticMarkup=b;this.suspenseDepth=0;this.contextIndex=-1;this.contextStack=[];this.contextValueStack=[];this.uniqueID=0;this.identifierPrefix=f&&f.identifierPrefix||\"\"}var b=a.prototype;b.destroy=function(){if(!this.exhausted){this.exhausted=!0;this.clearProviders();var a=this.threadID;J[a]=J[0];J[0]=a}};b.pushProvider=function(a){var b=++this.contextIndex,c=a.type._context,h=this.threadID;I(c,h);var t=c[h];this.contextStack[b]=c;this.contextValueStack[b]=t;c[h]=a.props.value};b.popProvider=\nfunction(){var a=this.contextIndex,b=this.contextStack[a],f=this.contextValueStack[a];this.contextStack[a]=null;this.contextValueStack[a]=null;this.contextIndex--;b[this.threadID]=f};b.clearProviders=function(){for(var a=this.contextIndex;0<=a;a--)this.contextStack[a][this.threadID]=this.contextValueStack[a]};b.read=function(a){if(this.exhausted)return null;var b=X;X=this;var c=Sa.current;Sa.current=Ka;try{for(var h=[\"\"],t=!1;h[0].length<a;){if(0===this.stack.length){this.exhausted=!0;var g=this.threadID;\nJ[g]=J[0];J[0]=g;break}var e=this.stack[this.stack.length-1];if(t||e.childIndex>=e.children.length){var L=e.footer;\"\"!==L&&(this.previousWasTextNode=!1);this.stack.pop();if(\"select\"===e.type)this.currentSelectValue=null;else if(null!=e.type&&null!=e.type.type&&e.type.type.$$typeof===B)this.popProvider(e.type);else if(e.type===D){this.suspenseDepth--;var G=h.pop();if(t){t=!1;var C=e.fallbackFrame;if(!C)throw Error(p(303));this.stack.push(C);h[this.suspenseDepth]+=\"\\x3c!--$!--\\x3e\";continue}else h[this.suspenseDepth]+=\nG}h[this.suspenseDepth]+=L}else{var n=e.children[e.childIndex++],k=\"\";try{k+=this.render(n,e.context,e.domNamespace)}catch(v){if(null!=v&&\"function\"===typeof v.then)throw Error(p(294));throw v;}finally{}h.length<=this.suspenseDepth&&h.push(\"\");h[this.suspenseDepth]+=k}}return h[0]}finally{Sa.current=c,X=b,Ea()}};b.render=function(a,b,f){if(\"string\"===typeof a||\"number\"===typeof a){f=\"\"+a;if(\"\"===f)return\"\";if(this.makeStaticMarkup)return O(f);if(this.previousWasTextNode)return\"\\x3c!-- --\\x3e\"+O(f);\nthis.previousWasTextNode=!0;return O(f)}b=ab(a,b,this.threadID);a=b.child;b=b.context;if(null===a||!1===a)return\"\";if(!m.isValidElement(a)){if(null!=a&&null!=a.$$typeof){f=a.$$typeof;if(f===q)throw Error(p(257));throw Error(p(258,f.toString()));}a=Z(a);this.stack.push({type:null,domNamespace:f,children:a,childIndex:0,context:b,footer:\"\"});return\"\"}var c=a.type;if(\"string\"===typeof c)return this.renderDOM(a,b,f);switch(c){case ka:case ja:case u:case z:case ca:case r:return a=Z(a.props.children),this.stack.push({type:null,\ndomNamespace:f,children:a,childIndex:0,context:b,footer:\"\"}),\"\";case D:throw Error(p(294));case ia:throw Error(p(343));}if(\"object\"===typeof c&&null!==c)switch(c.$$typeof){case ba:P={};var d=c.render(a.props,a.ref);d=Da(c.render,a.props,d,a.ref);d=Z(d);this.stack.push({type:null,domNamespace:f,children:d,childIndex:0,context:b,footer:\"\"});return\"\";case da:return a=[m.createElement(c.type,l({ref:a.ref},a.props))],this.stack.push({type:null,domNamespace:f,children:a,childIndex:0,context:b,footer:\"\"}),\n\"\";case B:return c=Z(a.props.children),f={type:a,domNamespace:f,children:c,childIndex:0,context:b,footer:\"\"},this.pushProvider(a),this.stack.push(f),\"\";case aa:c=a.type;d=a.props;var g=this.threadID;I(c,g);c=Z(d.children(c[g]));this.stack.push({type:a,domNamespace:f,children:c,childIndex:0,context:b,footer:\"\"});return\"\";case ha:throw Error(p(338));case ea:return c=a.type,d=c._init,c=d(c._payload),a=[m.createElement(c,l({ref:a.ref},a.props))],this.stack.push({type:null,domNamespace:f,children:a,childIndex:0,\ncontext:b,footer:\"\"}),\"\"}throw Error(p(130,null==c?c:typeof c,\"\"));};b.renderDOM=function(a,b,f){var c=a.type.toLowerCase();f===La.html&&Ma(c);if(!Va.hasOwnProperty(c)){if(!Ua.test(c))throw Error(p(65,c));Va[c]=!0}var d=a.props;if(\"input\"===c)d=l({type:void 0},d,{defaultChecked:void 0,defaultValue:void 0,value:null!=d.value?d.value:d.defaultValue,checked:null!=d.checked?d.checked:d.defaultChecked});else if(\"textarea\"===c){var g=d.value;if(null==g){g=d.defaultValue;var e=d.children;if(null!=e){if(null!=\ng)throw Error(p(92));if(Array.isArray(e)){if(!(1>=e.length))throw Error(p(93));e=e[0]}g=\"\"+e}null==g&&(g=\"\")}d=l({},d,{value:void 0,children:\"\"+g})}else if(\"select\"===c)this.currentSelectValue=null!=d.value?d.value:d.defaultValue,d=l({},d,{value:void 0});else if(\"option\"===c){e=this.currentSelectValue;var L=Xa(d.children);if(null!=e){var G=null!=d.value?d.value+\"\":L;g=!1;if(Array.isArray(e))for(var C=0;C<e.length;C++){if(\"\"+e[C]===G){g=!0;break}}else g=\"\"+e===G;d=l({selected:void 0,children:void 0},\nd,{selected:g,children:L})}}if(g=d){if(Oa[c]&&(null!=g.children||null!=g.dangerouslySetInnerHTML))throw Error(p(137,c));if(null!=g.dangerouslySetInnerHTML){if(null!=g.children)throw Error(p(60));if(!(\"object\"===typeof g.dangerouslySetInnerHTML&&\"__html\"in g.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=g.style&&\"object\"!==typeof g.style)throw Error(p(62));}g=d;e=this.makeStaticMarkup;L=1===this.stack.length;G=\"<\"+a.type;b:if(-1===c.indexOf(\"-\"))C=\"string\"===typeof g.is;else switch(c){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":C=\n!1;break b;default:C=!0}for(w in g)if(Ya.call(g,w)){var n=g[w];if(null!=n){if(\"style\"===w){var k=void 0,v=\"\",H=\"\";for(k in n)if(n.hasOwnProperty(k)){var x=0===k.indexOf(\"--\"),y=n[k];if(null!=y){if(x)var A=k;else if(A=k,Wa.hasOwnProperty(A))A=Wa[A];else{var cb=A.replace(Qa,\"-$1\").toLowerCase().replace(Ra,\"-ms-\");A=Wa[A]=cb}v+=H+A+\":\";H=k;x=null==y||\"boolean\"===typeof y||\"\"===y?\"\":x||\"number\"!==typeof y||0===y||Y.hasOwnProperty(H)&&Y[H]?(\"\"+y).trim():y+\"px\";v+=x;H=\";\"}}n=v||null}k=null;C?Za.hasOwnProperty(w)||\n(k=w,k=sa(k)&&null!=n?k+'=\"'+(O(n)+'\"'):\"\"):k=ya(w,n);k&&(G+=\" \"+k)}}e||L&&(G+=' data-reactroot=\"\"');var w=G;g=\"\";Na.hasOwnProperty(c)?w+=\"/>\":(w+=\">\",g=\"</\"+a.type+\">\");a:{e=d.dangerouslySetInnerHTML;if(null!=e){if(null!=e.__html){e=e.__html;break a}}else if(e=d.children,\"string\"===typeof e||\"number\"===typeof e){e=O(e);break a}e=null}null!=e?(d=[],Ta.hasOwnProperty(c)&&\"\\n\"===e.charAt(0)&&(w+=\"\\n\"),w+=e):d=Z(d.children);a=a.type;f=null==f||\"http://www.w3.org/1999/xhtml\"===f?Ma(a):\"http://www.w3.org/2000/svg\"===\nf&&\"foreignObject\"===a?\"http://www.w3.org/1999/xhtml\":f;this.stack.push({domNamespace:f,type:c,children:d,childIndex:0,context:b,footer:g});this.previousWasTextNode=!1;return w};return a}();exports.renderToNodeStream=function(){throw Error(p(207));};exports.renderToStaticMarkup=function(a,b){a=new bb(a,!0,b);try{return a.read(Infinity)}finally{a.destroy()}};exports.renderToStaticNodeStream=function(){throw Error(p(208));};exports.renderToString=function(a,b){a=new bb(a,!1,b);try{return a.read(Infinity)}finally{a.destroy()}};\nexports.version=\"17.0.2\";\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-dom-server.browser.production.min.js');\n} else {\n module.exports = require('./cjs/react-dom-server.browser.development.js');\n}\n", "// gif.js 0.2.0 - https://github.com/jnordberg/gif.js\n(function (f) {\n if (typeof exports === \"object\" && typeof module !== \"undefined\") {\n module.exports = f();\n } else if (typeof define === \"function\" && define.amd) {\n define([], f);\n } else {\n var g;\n if (typeof window !== \"undefined\") {\n g = window;\n } else if (typeof global !== \"undefined\") {\n g = global;\n } else if (typeof self !== \"undefined\") {\n g = self;\n } else {\n g = this;\n }\n g.GIF = f();\n }\n})(function () {\n var define, module, exports;\n return (function e(t, n, r) {\n function s(o, u) {\n if (!n[o]) {\n if (!t[o]) {\n var a = typeof require == \"function\" && require;\n if (!u && a) return a(o, !0);\n if (i) return i(o, !0);\n var f = new Error(\"Cannot find module '\" + o + \"'\");\n throw ((f.code = \"MODULE_NOT_FOUND\"), f);\n }\n var l = (n[o] = { exports: {} });\n t[o][0].call(\n l.exports,\n function (e) {\n var n = t[o][1][e];\n return s(n ? n : e);\n },\n l,\n l.exports,\n e,\n t,\n n,\n r\n );\n }\n return n[o].exports;\n }\n var i = typeof require == \"function\" && require;\n for (var o = 0; o < r.length; o++) s(r[o]);\n return s;\n })(\n {\n 1: [\n function (require, module, exports) {\n function EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n }\n module.exports = EventEmitter;\n EventEmitter.EventEmitter = EventEmitter;\n EventEmitter.prototype._events = undefined;\n EventEmitter.prototype._maxListeners = undefined;\n EventEmitter.defaultMaxListeners = 10;\n EventEmitter.prototype.setMaxListeners = function (n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError(\"n must be a positive number\");\n this._maxListeners = n;\n return this;\n };\n EventEmitter.prototype.emit = function (type) {\n var er, handler, len, args, i, listeners;\n if (!this._events) this._events = {};\n if (type === \"error\") {\n if (\n !this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)\n ) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er;\n } else {\n var err = new Error(\n 'Uncaught, unspecified \"error\" event. (' + er + \")\"\n );\n err.context = er;\n throw err;\n }\n }\n }\n handler = this._events[type];\n if (isUndefined(handler)) return false;\n if (isFunction(handler)) {\n switch (arguments.length) {\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++) listeners[i].apply(this, args);\n }\n return true;\n };\n EventEmitter.prototype.addListener = function (type, listener) {\n var m;\n if (!isFunction(listener))\n throw TypeError(\"listener must be a function\");\n if (!this._events) this._events = {};\n if (this._events.newListener)\n this.emit(\n \"newListener\",\n type,\n isFunction(listener.listener) ? listener.listener : listener\n );\n if (!this._events[type]) this._events[type] = listener;\n else if (isObject(this._events[type]))\n this._events[type].push(listener);\n else this._events[type] = [this._events[type], listener];\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error(\n \"(node) warning: possible EventEmitter memory \" +\n \"leak detected. %d listeners added. \" +\n \"Use emitter.setMaxListeners() to increase limit.\",\n this._events[type].length\n );\n if (typeof console.trace === \"function\") {\n console.trace();\n }\n }\n }\n return this;\n };\n EventEmitter.prototype.on = EventEmitter.prototype.addListener;\n EventEmitter.prototype.once = function (type, listener) {\n if (!isFunction(listener))\n throw TypeError(\"listener must be a function\");\n var fired = false;\n function g() {\n this.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n g.listener = listener;\n this.on(type, g);\n return this;\n };\n EventEmitter.prototype.removeListener = function (type, listener) {\n var list, position, length, i;\n if (!isFunction(listener))\n throw TypeError(\"listener must be a function\");\n if (!this._events || !this._events[type]) return this;\n list = this._events[type];\n length = list.length;\n position = -1;\n if (\n list === listener ||\n (isFunction(list.listener) && list.listener === listener)\n ) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit(\"removeListener\", type, listener);\n } else if (isObject(list)) {\n for (i = length; i-- > 0; ) {\n if (\n list[i] === listener ||\n (list[i].listener && list[i].listener === listener)\n ) {\n position = i;\n break;\n }\n }\n if (position < 0) return this;\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n if (this._events.removeListener)\n this.emit(\"removeListener\", type, listener);\n }\n return this;\n };\n EventEmitter.prototype.removeAllListeners = function (type) {\n var key, listeners;\n if (!this._events) return this;\n if (!this._events.removeListener) {\n if (arguments.length === 0) this._events = {};\n else if (this._events[type]) delete this._events[type];\n return this;\n }\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === \"removeListener\") continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners(\"removeListener\");\n this._events = {};\n return this;\n }\n listeners = this._events[type];\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n return this;\n };\n EventEmitter.prototype.listeners = function (type) {\n var ret;\n if (!this._events || !this._events[type]) ret = [];\n else if (isFunction(this._events[type])) ret = [this._events[type]];\n else ret = this._events[type].slice();\n return ret;\n };\n EventEmitter.prototype.listenerCount = function (type) {\n if (this._events) {\n var evlistener = this._events[type];\n if (isFunction(evlistener)) return 1;\n else if (evlistener) return evlistener.length;\n }\n return 0;\n };\n EventEmitter.listenerCount = function (emitter, type) {\n return emitter.listenerCount(type);\n };\n function isFunction(arg) {\n return typeof arg === \"function\";\n }\n function isNumber(arg) {\n return typeof arg === \"number\";\n }\n function isObject(arg) {\n return typeof arg === \"object\" && arg !== null;\n }\n function isUndefined(arg) {\n return arg === void 0;\n }\n },\n {},\n ],\n 2: [\n function (require, module, exports) {\n var UA, browser, mode, platform, ua;\n ua = navigator.userAgent.toLowerCase();\n platform = navigator.platform.toLowerCase();\n UA = ua.match(\n /(opera|ie|firefox|chrome|version)[\\s\\/:]([\\w\\d\\.]+)?.*?(safari|version[\\s\\/:]([\\w\\d\\.]+)|$)/\n ) || [null, \"unknown\", 0];\n mode = UA[1] === \"ie\" && document.documentMode;\n browser = {\n name: UA[1] === \"version\" ? UA[3] : UA[1],\n version:\n mode || parseFloat(UA[1] === \"opera\" && UA[4] ? UA[4] : UA[2]),\n platform: {\n name: ua.match(/ip(?:ad|od|hone)/)\n ? \"ios\"\n : (ua.match(/(?:webos|android)/) ||\n platform.match(/mac|win|linux/) || [\"other\"])[0],\n },\n };\n browser[browser.name] = true;\n browser[browser.name + parseInt(browser.version, 10)] = true;\n browser.platform[browser.platform.name] = true;\n module.exports = browser;\n },\n {},\n ],\n 3: [\n function (require, module, exports) {\n var EventEmitter,\n GIF,\n browser,\n extend = function (child, parent) {\n for (var key in parent) {\n if (hasProp.call(parent, key)) child[key] = parent[key];\n }\n function ctor() {\n this.constructor = child;\n }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor();\n child.__super__ = parent.prototype;\n return child;\n },\n hasProp = {}.hasOwnProperty,\n indexOf =\n [].indexOf ||\n function (item) {\n for (var i = 0, l = this.length; i < l; i++) {\n if (i in this && this[i] === item) return i;\n }\n return -1;\n },\n slice = [].slice;\n EventEmitter = require(\"events\").EventEmitter;\n browser = require(\"./browser.coffee\");\n GIF = (function (superClass) {\n var defaults, frameDefaults;\n extend(GIF, superClass);\n defaults = {\n workerScript: \"gif.worker.js\",\n workers: 2,\n repeat: 0,\n background: \"#fff\",\n quality: 10,\n width: null,\n height: null,\n transparent: null,\n debug: false,\n dither: false,\n };\n frameDefaults = { delay: 500, copy: false };\n function GIF(options) {\n var base, key, value;\n this.running = false;\n this.options = {};\n this.frames = [];\n this.freeWorkers = [];\n this.activeWorkers = [];\n this.setOptions(options);\n for (key in defaults) {\n value = defaults[key];\n if ((base = this.options)[key] == null) {\n base[key] = value;\n }\n }\n }\n GIF.prototype.setOption = function (key, value) {\n this.options[key] = value;\n if (\n this._canvas != null &&\n (key === \"width\" || key === \"height\")\n ) {\n return (this._canvas[key] = value);\n }\n };\n GIF.prototype.setOptions = function (options) {\n var key, results, value;\n results = [];\n for (key in options) {\n if (!hasProp.call(options, key)) continue;\n value = options[key];\n results.push(this.setOption(key, value));\n }\n return results;\n };\n GIF.prototype.addFrame = function (image, options) {\n var frame, key;\n if (options == null) {\n options = {};\n }\n frame = {};\n frame.transparent = this.options.transparent;\n for (key in frameDefaults) {\n frame[key] = options[key] || frameDefaults[key];\n }\n if (this.options.width == null) {\n this.setOption(\"width\", image.width);\n }\n if (this.options.height == null) {\n this.setOption(\"height\", image.height);\n }\n if (\n typeof ImageData !== \"undefined\" &&\n ImageData !== null &&\n image instanceof ImageData\n ) {\n frame.data = image.data;\n } else if (\n (typeof CanvasRenderingContext2D !== \"undefined\" &&\n CanvasRenderingContext2D !== null &&\n image instanceof CanvasRenderingContext2D) ||\n (typeof WebGLRenderingContext !== \"undefined\" &&\n WebGLRenderingContext !== null &&\n image instanceof WebGLRenderingContext)\n ) {\n if (options.copy) {\n frame.data = this.getContextData(image);\n } else {\n frame.context = image;\n }\n } else if (image.childNodes != null) {\n if (options.copy) {\n frame.data = this.getImageData(image);\n } else {\n frame.image = image;\n }\n } else {\n throw new Error(\"Invalid image\");\n }\n return this.frames.push(frame);\n };\n GIF.prototype.render = function () {\n var i, j, numWorkers, ref;\n if (this.running) {\n throw new Error(\"Already running\");\n }\n if (this.options.width == null || this.options.height == null) {\n throw new Error(\n \"Width and height must be set prior to rendering\"\n );\n }\n this.running = true;\n this.nextFrame = 0;\n this.finishedFrames = 0;\n this.imageParts = function () {\n var j, ref, results;\n results = [];\n for (\n i = j = 0, ref = this.frames.length;\n 0 <= ref ? j < ref : j > ref;\n i = 0 <= ref ? ++j : --j\n ) {\n results.push(null);\n }\n return results;\n }.call(this);\n numWorkers = this.spawnWorkers();\n if (this.options.globalPalette === true) {\n this.renderNextFrame();\n } else {\n for (\n i = j = 0, ref = numWorkers;\n 0 <= ref ? j < ref : j > ref;\n i = 0 <= ref ? ++j : --j\n ) {\n this.renderNextFrame();\n }\n }\n this.emit(\"start\");\n return this.emit(\"progress\", 0);\n };\n GIF.prototype.abort = function () {\n var worker;\n while (true) {\n worker = this.activeWorkers.shift();\n if (worker == null) {\n break;\n }\n this.log(\"killing active worker\");\n worker.terminate();\n }\n this.running = false;\n return this.emit(\"abort\");\n };\n GIF.prototype.spawnWorkers = function () {\n var j, numWorkers, ref, results;\n numWorkers = Math.min(this.options.workers, this.frames.length);\n (function () {\n results = [];\n for (\n var j = (ref = this.freeWorkers.length);\n ref <= numWorkers ? j < numWorkers : j > numWorkers;\n ref <= numWorkers ? j++ : j--\n ) {\n results.push(j);\n }\n return results;\n }\n .apply(this)\n .forEach(\n (function (_this) {\n return function (i) {\n var worker;\n _this.log(\"spawning worker \" + i);\n worker = new Worker(_this.options.workerScript);\n worker.onmessage = function (event) {\n _this.activeWorkers.splice(\n _this.activeWorkers.indexOf(worker),\n 1\n );\n _this.freeWorkers.push(worker);\n return _this.frameFinished(event.data);\n };\n return _this.freeWorkers.push(worker);\n };\n })(this)\n ));\n return numWorkers;\n };\n GIF.prototype.frameFinished = function (frame) {\n var i, j, ref;\n this.log(\n \"frame \" +\n frame.index +\n \" finished - \" +\n this.activeWorkers.length +\n \" active\"\n );\n this.finishedFrames++;\n this.emit(\"progress\", this.finishedFrames / this.frames.length);\n this.imageParts[frame.index] = frame;\n if (this.options.globalPalette === true) {\n this.options.globalPalette = frame.globalPalette;\n this.log(\"global palette analyzed\");\n if (this.frames.length > 2) {\n for (\n i = j = 1, ref = this.freeWorkers.length;\n 1 <= ref ? j < ref : j > ref;\n i = 1 <= ref ? ++j : --j\n ) {\n this.renderNextFrame();\n }\n }\n }\n if (indexOf.call(this.imageParts, null) >= 0) {\n return this.renderNextFrame();\n } else {\n return this.finishRendering();\n }\n };\n GIF.prototype.finishRendering = function () {\n var data,\n frame,\n i,\n image,\n j,\n k,\n l,\n len,\n len1,\n len2,\n len3,\n offset,\n page,\n ref,\n ref1,\n ref2;\n len = 0;\n ref = this.imageParts;\n for (j = 0, len1 = ref.length; j < len1; j++) {\n frame = ref[j];\n len += (frame.data.length - 1) * frame.pageSize + frame.cursor;\n }\n len += frame.pageSize - frame.cursor;\n this.log(\n \"rendering finished - filesize \" + Math.round(len / 1e3) + \"kb\"\n );\n data = new Uint8Array(len);\n offset = 0;\n ref1 = this.imageParts;\n for (k = 0, len2 = ref1.length; k < len2; k++) {\n frame = ref1[k];\n ref2 = frame.data;\n for (i = l = 0, len3 = ref2.length; l < len3; i = ++l) {\n page = ref2[i];\n data.set(page, offset);\n if (i === frame.data.length - 1) {\n offset += frame.cursor;\n } else {\n offset += frame.pageSize;\n }\n }\n }\n image = new Blob([data], { type: \"image/gif\" });\n return this.emit(\"finished\", image, data);\n };\n GIF.prototype.renderNextFrame = function () {\n var frame, task, worker;\n if (this.freeWorkers.length === 0) {\n throw new Error(\"No free workers\");\n }\n if (this.nextFrame >= this.frames.length) {\n return;\n }\n frame = this.frames[this.nextFrame++];\n worker = this.freeWorkers.shift();\n task = this.getTask(frame);\n this.log(\n \"starting frame \" +\n (task.index + 1) +\n \" of \" +\n this.frames.length\n );\n this.activeWorkers.push(worker);\n return worker.postMessage(task);\n };\n GIF.prototype.getContextData = function (ctx) {\n return ctx.getImageData(\n 0,\n 0,\n this.options.width,\n this.options.height\n ).data;\n };\n GIF.prototype.getImageData = function (image) {\n var ctx;\n if (this._canvas == null) {\n this._canvas = document.createElement(\"canvas\");\n this._canvas.width = this.options.width;\n this._canvas.height = this.options.height;\n }\n ctx = this._canvas.getContext(\"2d\");\n ctx.setFill = this.options.background;\n ctx.fillRect(0, 0, this.options.width, this.options.height);\n ctx.drawImage(image, 0, 0);\n return this.getContextData(ctx);\n };\n GIF.prototype.getTask = function (frame) {\n var index, task;\n index = this.frames.indexOf(frame);\n task = {\n index: index,\n last: index === this.frames.length - 1,\n delay: frame.delay,\n transparent: frame.transparent,\n width: this.options.width,\n height: this.options.height,\n quality: this.options.quality,\n dither: this.options.dither,\n globalPalette: this.options.globalPalette,\n repeat: this.options.repeat,\n canTransfer: browser.name === \"chrome\",\n };\n if (frame.data != null) {\n task.data = frame.data;\n } else if (frame.context != null) {\n task.data = this.getContextData(frame.context);\n } else if (frame.image != null) {\n task.data = this.getImageData(frame.image);\n } else {\n throw new Error(\"Invalid frame\");\n }\n return task;\n };\n GIF.prototype.log = function () {\n var args;\n args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n if (!this.options.debug) {\n return;\n }\n return console.log.apply(console, args);\n };\n return GIF;\n })(EventEmitter);\n module.exports = GIF;\n },\n { \"./browser.coffee\": 2, events: 1 },\n ],\n },\n {},\n [3]\n )(3);\n});\n", "(function () {\n\n // All Math on this page comes from http://www.easyrgb.com\n var dot_product = function dot_product(a, b) {\n var ret = 0;\n var iterable = __range__(0, a.length - 1, true);\n for (var j = 0; j < iterable.length; j++) {\n var i = iterable[j];\n ret += a[i] * b[i];\n }\n return ret;\n };\n\n // Rounds number to a given number of decimal places\n var round = function round(num, places) {\n var m = Math.pow(10, places);\n return Math.round(num * m) / m;\n };\n\n // Returns whether given color coordinates fit within their valid range\n var within_range = function within_range(vector, ranges) {\n // Round to three decimal places to avoid rounding errors\n // e.g. R_rgb = -0.0000000001\n vector = vector.map(function (n) {\n return round(n, 3);\n });\n var iterable = __range__(0, vector.length - 1, true);\n for (var j = 0; j < iterable.length; j++) {\n var i = iterable[j];\n if (vector[i] < ranges[i][0] || vector[i] > ranges[i][1]) {\n return false;\n }\n }\n return true;\n };\n\n // The D65 standard illuminant\n var ref_X = 0.95047;\n var ref_Y = 1.00000;\n var ref_Z = 1.08883;\n var ref_U = 4 * ref_X / (ref_X + 15 * ref_Y + 3 * ref_Z);\n var ref_V = 9 * ref_Y / (ref_X + 15 * ref_Y + 3 * ref_Z);\n\n // CIE L*a*b* constants\n var lab_e = 0.008856;\n var lab_k = 903.3;\n\n // Used for Lab and Luv conversions\n var f = function f(t) {\n if (t > lab_e) {\n return Math.pow(t, 1 / 3);\n } else {\n return 7.787 * t + 16 / 116;\n }\n };\n var f_inv = function f_inv(t) {\n if (Math.pow(t, 3) > lab_e) {\n return Math.pow(t, 3);\n } else {\n return (116 * t - 16) / lab_k;\n }\n };\n\n // This map will contain our conversion functions\n // conv[from][to] = (tuple) -> ...\n var conv = {\n 'CIEXYZ': {},\n 'CIExyY': {},\n 'CIELAB': {},\n 'CIELCH': {},\n 'CIELUV': {},\n 'CIELCHuv': {},\n 'sRGB': {},\n 'hex': {}\n };\n\n conv['CIEXYZ']['sRGB'] = function (tuple) {\n var m = [[3.2406, -1.5372, -0.4986], [-0.9689, 1.8758, 0.0415], [0.0557, -0.2040, 1.0570]];\n var from_linear = function from_linear(c) {\n var a = 0.055;\n if (c <= 0.0031308) {\n return 12.92 * c;\n } else {\n return 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n }\n };\n var _R = from_linear(dot_product(m[0], tuple));\n var _G = from_linear(dot_product(m[1], tuple));\n var _B = from_linear(dot_product(m[2], tuple));\n return [_R, _G, _B];\n };\n\n conv['sRGB']['CIEXYZ'] = function (tuple) {\n var _R = tuple[0];\n var _G = tuple[1];\n var _B = tuple[2];\n var to_linear = function to_linear(c) {\n var a = 0.055;\n if (c > 0.04045) {\n return Math.pow((c + a) / (1 + a), 2.4);\n } else {\n return c / 12.92;\n }\n };\n var m = [[0.4124, 0.3576, 0.1805], [0.2126, 0.7152, 0.0722], [0.0193, 0.1192, 0.9505]];\n var rgbl = [to_linear(_R), to_linear(_G), to_linear(_B)];\n var _X = dot_product(m[0], rgbl);\n var _Y = dot_product(m[1], rgbl);\n var _Z = dot_product(m[2], rgbl);\n return [_X, _Y, _Z];\n };\n\n conv['CIEXYZ']['CIExyY'] = function (tuple) {\n var _X = tuple[0];\n var _Y = tuple[1];\n var _Z = tuple[2];\n var sum = _X + _Y + _Z;\n if (sum === 0) {\n return [0, 0, _Y];\n }\n return [_X / sum, _Y / sum, _Y];\n };\n\n conv['CIExyY']['CIEXYZ'] = function (tuple) {\n var _x = tuple[0];\n var _y = tuple[1];\n var _Y = tuple[2];\n if (_y === 0) {\n return [0, 0, 0];\n }\n var _X = _x * _Y / _y;\n var _Z = (1 - _x - _y) * _Y / _y;\n return [_X, _Y, _Z];\n };\n\n conv['CIEXYZ']['CIELAB'] = function (tuple) {\n var _X = tuple[0];\n var _Y = tuple[1];\n var _Z = tuple[2];\n var fx = f(_X / ref_X);\n var fy = f(_Y / ref_Y);\n var fz = f(_Z / ref_Z);\n var _L = 116 * fy - 16;\n var _a = 500 * (fx - fy);\n var _b = 200 * (fy - fz);\n return [_L, _a, _b];\n };\n\n conv['CIELAB']['CIEXYZ'] = function (tuple) {\n var _L = tuple[0];\n var _a = tuple[1];\n var _b = tuple[2];\n var var_y = (_L + 16) / 116;\n var var_z = var_y - _b / 200;\n var var_x = _a / 500 + var_y;\n var _X = ref_X * f_inv(var_x);\n var _Y = ref_Y * f_inv(var_y);\n var _Z = ref_Z * f_inv(var_z);\n return [_X, _Y, _Z];\n };\n\n conv['CIEXYZ']['CIELUV'] = function (tuple) {\n var _X = tuple[0];\n var _Y = tuple[1];\n var _Z = tuple[2];\n var var_U = 4 * _X / (_X + 15 * _Y + 3 * _Z);\n var var_V = 9 * _Y / (_X + 15 * _Y + 3 * _Z);\n var _L = 116 * f(_Y / ref_Y) - 16;\n // Black will create a divide-by-zero error\n if (_L === 0) {\n return [0, 0, 0];\n }\n var _U = 13 * _L * (var_U - ref_U);\n var _V = 13 * _L * (var_V - ref_V);\n return [_L, _U, _V];\n };\n\n conv['CIELUV']['CIEXYZ'] = function (tuple) {\n var _L = tuple[0];\n var _U = tuple[1];\n var _V = tuple[2];\n // Black will create a divide-by-zero error\n if (_L === 0) {\n return [0, 0, 0];\n }\n var var_Y = f_inv((_L + 16) / 116);\n var var_U = _U / (13 * _L) + ref_U;\n var var_V = _V / (13 * _L) + ref_V;\n var _Y = var_Y * ref_Y;\n var _X = 0 - 9 * _Y * var_U / ((var_U - 4) * var_V - var_U * var_V);\n var _Z = (9 * _Y - 15 * var_V * _Y - var_V * _X) / (3 * var_V);\n return [_X, _Y, _Z];\n };\n\n var scalar_to_polar = function scalar_to_polar(tuple) {\n var _L = tuple[0];\n var var1 = tuple[1];\n var var2 = tuple[2];\n var _C = Math.pow(Math.pow(var1, 2) + Math.pow(var2, 2), 1 / 2);\n var _h_rad = Math.atan2(var2, var1);\n var _h = _h_rad * 360 / 2 / Math.PI;\n if (_h < 0) {\n _h = 360 + _h;\n }\n return [_L, _C, _h];\n };\n conv['CIELAB']['CIELCH'] = scalar_to_polar;\n conv['CIELUV']['CIELCHuv'] = scalar_to_polar;\n\n var polar_to_scalar = function polar_to_scalar(tuple) {\n var _L = tuple[0];\n var _C = tuple[1];\n var _h = tuple[2];\n var _h_rad = _h / 360 * 2 * Math.PI;\n var var1 = Math.cos(_h_rad) * _C;\n var var2 = Math.sin(_h_rad) * _C;\n return [_L, var1, var2];\n };\n conv['CIELCH']['CIELAB'] = polar_to_scalar;\n conv['CIELCHuv']['CIELUV'] = polar_to_scalar;\n\n // Represents sRGB [0-1] values as [0-225] values. Errors out if value\n // out of the range\n var sRGB_prepare = function sRGB_prepare(tuple) {\n tuple = tuple.map(function (n) {\n return round(n, 3);\n });\n for (var i = 0; i < tuple.length; i++) {\n var ch = tuple[i];\n if (ch < 0 || ch > 1) {\n throw new Error(\"Illegal sRGB value\");\n }\n }\n return tuple.map(function (ch) {\n return Math.round(ch * 255);\n });\n };\n\n conv['sRGB']['hex'] = function (tuple) {\n var hex = \"#\";\n tuple = sRGB_prepare(tuple);\n for (var i = 0; i < tuple.length; i++) {\n var ch = tuple[i];\n ch = ch.toString(16);\n if (ch.length === 1) {\n ch = '0' + ch;\n }\n hex += ch;\n }\n return hex;\n };\n\n conv['hex']['sRGB'] = function (hex) {\n if (hex.charAt(0) === \"#\") {\n hex = hex.substring(1, 7);\n }\n var r = hex.substring(0, 2);\n var g = hex.substring(2, 4);\n var b = hex.substring(4, 6);\n return [r, g, b].map(function (n) {\n return parseInt(n, 16) / 255;\n });\n };\n\n var converter = function converter(from, to) {\n // The goal of this function is to find the shortest path\n // between `from` and `to` on this tree:\n //\n // - CIELAB - CIELCH\n // CIEXYZ - CIELUV - CIELCHuv\n // - sRGB - hex\n // - CIExyY\n //\n // Topologically sorted nodes (child, parent)\n var tree = [['CIELCH', 'CIELAB'], ['CIELCHuv', 'CIELUV'], ['hex', 'sRGB'], ['CIExyY', 'CIEXYZ'], ['CIELAB', 'CIEXYZ'], ['CIELUV', 'CIEXYZ'], ['sRGB', 'CIEXYZ']];\n // Recursively generate path. Each recursion makes the tree\n // smaller by elimination a leaf node. This leaf node is either\n // irrelevant to our conversion (trivial case) or it describes\n // an endpoint of our conversion, in which case we add a new \n // step to the conversion and recurse.\n var path = function path(tree, from, to) {\n if (from === to) {\n return function (t) {\n return t;\n };\n }\n var child = tree[0][0];\n var parent = tree[0][1];\n // If we start with hex (a leaf node), we know for a fact that \n // the next node is going to be sRGB (others by analogy)\n if (from === child) {\n // We discovered the first step, now find the rest of the path\n // and return their composition\n var p = path(tree.slice(1), parent, to);\n return function (t) {\n return p(conv[child][parent](t));\n };\n }\n // If we need to end with hex, we know for a fact that the node\n // before it is going to be sRGB (others by analogy)\n if (to === child) {\n // We found the last step, now find the rest of the path and\n // return their composition\n var p = path(tree.slice(1), from, parent);\n return function (t) {\n return conv[parent][child](p(t));\n };\n }\n // The current tree leaf is irrelevant to our path, ignore it and\n // recurse\n var p = path(tree.slice(1), from, to);\n return p;\n };\n // Main conversion function\n var func = path(tree, from, to);\n return func;\n };\n\n var root = {};\n\n // If Stylus is installed, make module.exports work as a plugin\n try {\n (function () {\n var stylus = require('stylus');\n root = function root() {\n var spaces = Object.keys(conv).filter(function (space) {\n return space !== 'sRGB' && space !== 'hex';\n }).map(function (space) {\n return space;\n });\n return function (style) {\n return spaces.map(function (space) {\n return style.define(space, function (space) {\n return function (a, b, c) {\n var g = void 0,\n r = void 0;\n var foo = converter(space, 'sRGB');\n var rgb = sRGB_prepare(foo([a.val, b.val, c.val]));\n return new stylus.nodes.RGBA(rgb[0], rgb[1], rgb[2], 1);\n };\n }(space));\n });\n };\n };\n })();\n } catch (error) {}\n\n root.converter = converter;\n root.make_color = function (space1, tuple) {\n return {\n as: function as(space2) {\n var val = converter(space1, space2)(tuple);\n return val;\n },\n is_displayable: function is_displayable() {\n var val = converter(space1, 'sRGB')(tuple);\n return within_range(val, [[0, 1], [0, 1], [0, 1]]);\n },\n is_visible: function is_visible() {\n var val = converter(space1, 'CIEXYZ')(tuple);\n return within_range(val, [[0, ref_X], [0, ref_Y], [0, ref_Z]]);\n }\n };\n };\n\n // Export to Node.js\n if (typeof module !== 'undefined' && module !== null) {\n module.exports = root;\n }\n // Export to jQuery\n if (typeof jQuery !== 'undefined' && jQuery !== null) {\n jQuery.colorspaces = root;\n }\n // Make a stylus plugin if stylus exists\n\n function __range__(left, right, inclusive) {\n var range = [];\n var ascending = left < right;\n var end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (var i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n }\n \n})();\n\n", "// Generated by Haxe 3.4.4\nvar hsluv = hsluv || {};\nhsluv.Geometry = function() { };\nhsluv.Geometry.intersectLineLine = function(a,b) {\n\tvar x = (a.intercept - b.intercept) / (b.slope - a.slope);\n\tvar y = a.slope * x + a.intercept;\n\treturn { x : x, y : y};\n};\nhsluv.Geometry.distanceFromOrigin = function(point) {\n\treturn Math.sqrt(Math.pow(point.x,2) + Math.pow(point.y,2));\n};\nhsluv.Geometry.distanceLineFromOrigin = function(line) {\n\treturn Math.abs(line.intercept) / Math.sqrt(Math.pow(line.slope,2) + 1);\n};\nhsluv.Geometry.perpendicularThroughPoint = function(line,point) {\n\tvar slope = -1 / line.slope;\n\tvar intercept = point.y - slope * point.x;\n\treturn { slope : slope, intercept : intercept};\n};\nhsluv.Geometry.angleFromOrigin = function(point) {\n\treturn Math.atan2(point.y,point.x);\n};\nhsluv.Geometry.normalizeAngle = function(angle) {\n\tvar m = 2 * Math.PI;\n\treturn (angle % m + m) % m;\n};\nhsluv.Geometry.lengthOfRayUntilIntersect = function(theta,line) {\n\treturn line.intercept / (Math.sin(theta) - line.slope * Math.cos(theta));\n};\nhsluv.Hsluv = function() { };\nhsluv.Hsluv.getBounds = function(L) {\n\tvar result = [];\n\tvar sub1 = Math.pow(L + 16,3) / 1560896;\n\tvar sub2 = sub1 > hsluv.Hsluv.epsilon ? sub1 : L / hsluv.Hsluv.kappa;\n\tvar _g = 0;\n\twhile(_g < 3) {\n\t\tvar c = _g++;\n\t\tvar m1 = hsluv.Hsluv.m[c][0];\n\t\tvar m2 = hsluv.Hsluv.m[c][1];\n\t\tvar m3 = hsluv.Hsluv.m[c][2];\n\t\tvar _g1 = 0;\n\t\twhile(_g1 < 2) {\n\t\t\tvar t = _g1++;\n\t\t\tvar top1 = (284517 * m1 - 94839 * m3) * sub2;\n\t\t\tvar top2 = (838422 * m3 + 769860 * m2 + 731718 * m1) * L * sub2 - 769860 * t * L;\n\t\t\tvar bottom = (632260 * m3 - 126452 * m2) * sub2 + 126452 * t;\n\t\t\tresult.push({ slope : top1 / bottom, intercept : top2 / bottom});\n\t\t}\n\t}\n\treturn result;\n};\nhsluv.Hsluv.maxSafeChromaForL = function(L) {\n\tvar bounds = hsluv.Hsluv.getBounds(L);\n\tvar min = Infinity;\n\tvar _g = 0;\n\twhile(_g < bounds.length) {\n\t\tvar bound = bounds[_g];\n\t\t++_g;\n\t\tvar length = hsluv.Geometry.distanceLineFromOrigin(bound);\n\t\tmin = Math.min(min,length);\n\t}\n\treturn min;\n};\nhsluv.Hsluv.maxChromaForLH = function(L,H) {\n\tvar hrad = H / 360 * Math.PI * 2;\n\tvar bounds = hsluv.Hsluv.getBounds(L);\n\tvar min = Infinity;\n\tvar _g = 0;\n\twhile(_g < bounds.length) {\n\t\tvar bound = bounds[_g];\n\t\t++_g;\n\t\tvar length = hsluv.Geometry.lengthOfRayUntilIntersect(hrad,bound);\n\t\tif(length >= 0) {\n\t\t\tmin = Math.min(min,length);\n\t\t}\n\t}\n\treturn min;\n};\nhsluv.Hsluv.dotProduct = function(a,b) {\n\tvar sum = 0;\n\tvar _g1 = 0;\n\tvar _g = a.length;\n\twhile(_g1 < _g) {\n\t\tvar i = _g1++;\n\t\tsum += a[i] * b[i];\n\t}\n\treturn sum;\n};\nhsluv.Hsluv.fromLinear = function(c) {\n\tif(c <= 0.0031308) {\n\t\treturn 12.92 * c;\n\t} else {\n\t\treturn 1.055 * Math.pow(c,0.416666666666666685) - 0.055;\n\t}\n};\nhsluv.Hsluv.toLinear = function(c) {\n\tif(c > 0.04045) {\n\t\treturn Math.pow((c + 0.055) / 1.055,2.4);\n\t} else {\n\t\treturn c / 12.92;\n\t}\n};\nhsluv.Hsluv.xyzToRgb = function(tuple) {\n\treturn [hsluv.Hsluv.fromLinear(hsluv.Hsluv.dotProduct(hsluv.Hsluv.m[0],tuple)),hsluv.Hsluv.fromLinear(hsluv.Hsluv.dotProduct(hsluv.Hsluv.m[1],tuple)),hsluv.Hsluv.fromLinear(hsluv.Hsluv.dotProduct(hsluv.Hsluv.m[2],tuple))];\n};\nhsluv.Hsluv.rgbToXyz = function(tuple) {\n\tvar rgbl = [hsluv.Hsluv.toLinear(tuple[0]),hsluv.Hsluv.toLinear(tuple[1]),hsluv.Hsluv.toLinear(tuple[2])];\n\treturn [hsluv.Hsluv.dotProduct(hsluv.Hsluv.minv[0],rgbl),hsluv.Hsluv.dotProduct(hsluv.Hsluv.minv[1],rgbl),hsluv.Hsluv.dotProduct(hsluv.Hsluv.minv[2],rgbl)];\n};\nhsluv.Hsluv.yToL = function(Y) {\n\tif(Y <= hsluv.Hsluv.epsilon) {\n\t\treturn Y / hsluv.Hsluv.refY * hsluv.Hsluv.kappa;\n\t} else {\n\t\treturn 116 * Math.pow(Y / hsluv.Hsluv.refY,0.333333333333333315) - 16;\n\t}\n};\nhsluv.Hsluv.lToY = function(L) {\n\tif(L <= 8) {\n\t\treturn hsluv.Hsluv.refY * L / hsluv.Hsluv.kappa;\n\t} else {\n\t\treturn hsluv.Hsluv.refY * Math.pow((L + 16) / 116,3);\n\t}\n};\nhsluv.Hsluv.xyzToLuv = function(tuple) {\n\tvar X = tuple[0];\n\tvar Y = tuple[1];\n\tvar Z = tuple[2];\n\tvar divider = X + 15 * Y + 3 * Z;\n\tvar varU = 4 * X;\n\tvar varV = 9 * Y;\n\tif(divider != 0) {\n\t\tvarU /= divider;\n\t\tvarV /= divider;\n\t} else {\n\t\tvarU = NaN;\n\t\tvarV = NaN;\n\t}\n\tvar L = hsluv.Hsluv.yToL(Y);\n\tif(L == 0) {\n\t\treturn [0,0,0];\n\t}\n\tvar U = 13 * L * (varU - hsluv.Hsluv.refU);\n\tvar V = 13 * L * (varV - hsluv.Hsluv.refV);\n\treturn [L,U,V];\n};\nhsluv.Hsluv.luvToXyz = function(tuple) {\n\tvar L = tuple[0];\n\tvar U = tuple[1];\n\tvar V = tuple[2];\n\tif(L == 0) {\n\t\treturn [0,0,0];\n\t}\n\tvar varU = U / (13 * L) + hsluv.Hsluv.refU;\n\tvar varV = V / (13 * L) + hsluv.Hsluv.refV;\n\tvar Y = hsluv.Hsluv.lToY(L);\n\tvar X = 0 - 9 * Y * varU / ((varU - 4) * varV - varU * varV);\n\tvar Z = (9 * Y - 15 * varV * Y - varV * X) / (3 * varV);\n\treturn [X,Y,Z];\n};\nhsluv.Hsluv.luvToLch = function(tuple) {\n\tvar L = tuple[0];\n\tvar U = tuple[1];\n\tvar V = tuple[2];\n\tvar C = Math.sqrt(U * U + V * V);\n\tvar H;\n\tif(C < 0.00000001) {\n\t\tH = 0;\n\t} else {\n\t\tvar Hrad = Math.atan2(V,U);\n\t\tH = Hrad * 180.0 / Math.PI;\n\t\tif(H < 0) {\n\t\t\tH = 360 + H;\n\t\t}\n\t}\n\treturn [L,C,H];\n};\nhsluv.Hsluv.lchToLuv = function(tuple) {\n\tvar L = tuple[0];\n\tvar C = tuple[1];\n\tvar H = tuple[2];\n\tvar Hrad = H / 360.0 * 2 * Math.PI;\n\tvar U = Math.cos(Hrad) * C;\n\tvar V = Math.sin(Hrad) * C;\n\treturn [L,U,V];\n};\nhsluv.Hsluv.hsluvToLch = function(tuple) {\n\tvar H = tuple[0];\n\tvar S = tuple[1];\n\tvar L = tuple[2];\n\tif(L > 99.9999999) {\n\t\treturn [100,0,H];\n\t}\n\tif(L < 0.00000001) {\n\t\treturn [0,0,H];\n\t}\n\tvar max = hsluv.Hsluv.maxChromaForLH(L,H);\n\tvar C = max / 100 * S;\n\treturn [L,C,H];\n};\nhsluv.Hsluv.lchToHsluv = function(tuple) {\n\tvar L = tuple[0];\n\tvar C = tuple[1];\n\tvar H = tuple[2];\n\tif(L > 99.9999999) {\n\t\treturn [H,0,100];\n\t}\n\tif(L < 0.00000001) {\n\t\treturn [H,0,0];\n\t}\n\tvar max = hsluv.Hsluv.maxChromaForLH(L,H);\n\tvar S = C / max * 100;\n\treturn [H,S,L];\n};\nhsluv.Hsluv.hpluvToLch = function(tuple) {\n\tvar H = tuple[0];\n\tvar S = tuple[1];\n\tvar L = tuple[2];\n\tif(L > 99.9999999) {\n\t\treturn [100,0,H];\n\t}\n\tif(L < 0.00000001) {\n\t\treturn [0,0,H];\n\t}\n\tvar max = hsluv.Hsluv.maxSafeChromaForL(L);\n\tvar C = max / 100 * S;\n\treturn [L,C,H];\n};\nhsluv.Hsluv.lchToHpluv = function(tuple) {\n\tvar L = tuple[0];\n\tvar C = tuple[1];\n\tvar H = tuple[2];\n\tif(L > 99.9999999) {\n\t\treturn [H,0,100];\n\t}\n\tif(L < 0.00000001) {\n\t\treturn [H,0,0];\n\t}\n\tvar max = hsluv.Hsluv.maxSafeChromaForL(L);\n\tvar S = C / max * 100;\n\treturn [H,S,L];\n};\nhsluv.Hsluv.rgbToHex = function(tuple) {\n\tvar h = \"#\";\n\tvar _g = 0;\n\twhile(_g < 3) {\n\t\tvar i = _g++;\n\t\tvar chan = tuple[i];\n\t\tvar c = Math.round(chan * 255);\n\t\tvar digit2 = c % 16;\n\t\tvar digit1 = (c - digit2) / 16 | 0;\n\t\th += hsluv.Hsluv.hexChars.charAt(digit1) + hsluv.Hsluv.hexChars.charAt(digit2);\n\t}\n\treturn h;\n};\nhsluv.Hsluv.hexToRgb = function(hex) {\n\thex = hex.toLowerCase();\n\tvar ret = [];\n\tvar _g = 0;\n\twhile(_g < 3) {\n\t\tvar i = _g++;\n\t\tvar digit1 = hsluv.Hsluv.hexChars.indexOf(hex.charAt(i * 2 + 1));\n\t\tvar digit2 = hsluv.Hsluv.hexChars.indexOf(hex.charAt(i * 2 + 2));\n\t\tvar n = digit1 * 16 + digit2;\n\t\tret.push(n / 255.0);\n\t}\n\treturn ret;\n};\nhsluv.Hsluv.lchToRgb = function(tuple) {\n\treturn hsluv.Hsluv.xyzToRgb(hsluv.Hsluv.luvToXyz(hsluv.Hsluv.lchToLuv(tuple)));\n};\nhsluv.Hsluv.rgbToLch = function(tuple) {\n\treturn hsluv.Hsluv.luvToLch(hsluv.Hsluv.xyzToLuv(hsluv.Hsluv.rgbToXyz(tuple)));\n};\nhsluv.Hsluv.hsluvToRgb = function(tuple) {\n\treturn hsluv.Hsluv.lchToRgb(hsluv.Hsluv.hsluvToLch(tuple));\n};\nhsluv.Hsluv.rgbToHsluv = function(tuple) {\n\treturn hsluv.Hsluv.lchToHsluv(hsluv.Hsluv.rgbToLch(tuple));\n};\nhsluv.Hsluv.hpluvToRgb = function(tuple) {\n\treturn hsluv.Hsluv.lchToRgb(hsluv.Hsluv.hpluvToLch(tuple));\n};\nhsluv.Hsluv.rgbToHpluv = function(tuple) {\n\treturn hsluv.Hsluv.lchToHpluv(hsluv.Hsluv.rgbToLch(tuple));\n};\nhsluv.Hsluv.hsluvToHex = function(tuple) {\n\treturn hsluv.Hsluv.rgbToHex(hsluv.Hsluv.hsluvToRgb(tuple));\n};\nhsluv.Hsluv.hpluvToHex = function(tuple) {\n\treturn hsluv.Hsluv.rgbToHex(hsluv.Hsluv.hpluvToRgb(tuple));\n};\nhsluv.Hsluv.hexToHsluv = function(s) {\n\treturn hsluv.Hsluv.rgbToHsluv(hsluv.Hsluv.hexToRgb(s));\n};\nhsluv.Hsluv.hexToHpluv = function(s) {\n\treturn hsluv.Hsluv.rgbToHpluv(hsluv.Hsluv.hexToRgb(s));\n};\nhsluv.Hsluv.m = [[3.240969941904521,-1.537383177570093,-0.498610760293],[-0.96924363628087,1.87596750150772,0.041555057407175],[0.055630079696993,-0.20397695888897,1.056971514242878]];\nhsluv.Hsluv.minv = [[0.41239079926595,0.35758433938387,0.18048078840183],[0.21263900587151,0.71516867876775,0.072192315360733],[0.019330818715591,0.11919477979462,0.95053215224966]];\nhsluv.Hsluv.refY = 1.0;\nhsluv.Hsluv.refU = 0.19783000664283;\nhsluv.Hsluv.refV = 0.46831999493879;\nhsluv.Hsluv.kappa = 903.2962962;\nhsluv.Hsluv.epsilon = 0.0088564516;\nhsluv.Hsluv.hexChars = \"0123456789abcdef\";\nvar root = {\n \"hsluvToRgb\": hsluv.Hsluv.hsluvToRgb,\n \"rgbToHsluv\": hsluv.Hsluv.rgbToHsluv,\n \"hpluvToRgb\": hsluv.Hsluv.hpluvToRgb,\n \"rgbToHpluv\": hsluv.Hsluv.rgbToHpluv,\n \"hsluvToHex\": hsluv.Hsluv.hsluvToHex,\n \"hexToHsluv\": hsluv.Hsluv.hexToHsluv,\n \"hpluvToHex\": hsluv.Hsluv.hpluvToHex,\n \"hexToHpluv\": hsluv.Hsluv.hexToHpluv,\n \"lchToHpluv\": hsluv.Hsluv.lchToHpluv,\n \"hpluvToLch\": hsluv.Hsluv.hpluvToLch,\n \"lchToHsluv\": hsluv.Hsluv.lchToHsluv,\n \"hsluvToLch\": hsluv.Hsluv.hsluvToLch,\n \"lchToLuv\": hsluv.Hsluv.lchToLuv,\n \"luvToLch\": hsluv.Hsluv.luvToLch,\n \"xyzToLuv\": hsluv.Hsluv.xyzToLuv,\n \"luvToXyz\": hsluv.Hsluv.luvToXyz,\n \"xyzToRgb\": hsluv.Hsluv.xyzToRgb,\n \"rgbToXyz\": hsluv.Hsluv.rgbToXyz,\n \"lchToRgb\": hsluv.Hsluv.lchToRgb,\n \"rgbToLch\": hsluv.Hsluv.rgbToLch\n};\n\nmodule.exports = root;\n", null, null, null, "/* jshint browserify: true */\n\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n'use strict';\n\n/**\n * Shim to disable schema fingerprint computation.\n *\n */\n\nfunction createHash() {\n throw new Error('fingerprinting not supported in the browser');\n}\n\n\nmodule.exports = {\n createHash: createHash\n};\n", "/* jshint node: true */\n\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n'use strict';\n\nvar crypto = require('crypto');\n\n\n/**\n * Uppercase the first letter of a string.\n *\n * @param s {String} The string.\n *\n */\nfunction capitalize(s) { return s.charAt(0).toUpperCase() + s.slice(1); }\n\n/**\n * Compare two numbers.\n *\n * @param n1 {Number} The first one.\n * @param n2 {Number} The second one.\n *\n */\nfunction compare(n1, n2) { return n1 === n2 ? 0 : (n1 < n2 ? -1 : 1); }\n\n/**\n * Compute a string's hash.\n *\n * @param str {String} The string to hash.\n * @param algorithm {String} The algorithm used. Defaults to MD5.\n *\n */\nfunction getHash(str, algorithm) {\n algorithm = algorithm || 'md5';\n var hash = crypto.createHash(algorithm);\n hash.end(str);\n return hash.read();\n}\n\n/**\n * Find index of value in array.\n *\n * @param arr {Array} Can also be a false-ish value.\n * @param v {Object} Value to find.\n *\n * Returns -1 if not found, -2 if found multiple times.\n *\n */\nfunction singleIndexOf(arr, v) {\n var pos = -1;\n var i, l;\n if (!arr) {\n return -1;\n }\n for (i = 0, l = arr.length; i < l; i++) {\n if (arr[i] === v) {\n if (pos >= 0) {\n return -2;\n }\n pos = i;\n }\n }\n return pos;\n}\n\n/**\n * Convert array to map.\n *\n * @param arr {Array} Elements.\n * @param fn {Function} Function returning an element's key.\n *\n */\nfunction toMap(arr, fn) {\n var obj = {};\n var i, elem;\n for (i = 0; i < arr.length; i++) {\n elem = arr[i];\n obj[fn(elem)] = elem;\n }\n return obj;\n}\n\n/**\n * Check whether an array has duplicates.\n *\n * @param arr {Array} The array.\n * @param fn {Function} Optional function to apply to each element.\n *\n */\nfunction hasDuplicates(arr, fn) {\n var obj = {};\n var i, l, elem;\n for (i = 0, l = arr.length; i < l; i++) {\n elem = arr[i];\n if (fn) {\n elem = fn(elem);\n }\n if (obj[elem]) {\n return true;\n }\n obj[elem] = true;\n }\n return false;\n}\n\n/**\n * \"Abstract\" function to help with \"subclassing\".\n *\n */\nfunction abstractFunction() { throw new Error('abstract'); }\n\n/**\n * Generator of random things.\n *\n * Inspired by: https://stackoverflow.com/a/424445/1062617\n *\n */\nfunction Lcg(seed) {\n var a = 1103515245;\n var c = 12345;\n var m = Math.pow(2, 31);\n var state = Math.floor(seed || Math.random() * (m - 1));\n\n this._max = m;\n this._nextInt = function () {\n state = (a * state + c) % m;\n return state;\n };\n}\n\nLcg.prototype.nextBoolean = function () {\n // jshint -W018\n return !!(this._nextInt() % 2);\n};\n\nLcg.prototype.nextInt = function (start, end) {\n if (end === undefined) {\n end = start;\n start = 0;\n }\n end = end === undefined ? this._max : end;\n return start + Math.floor(this.nextFloat() * (end - start));\n};\n\nLcg.prototype.nextFloat = function (start, end) {\n if (end === undefined) {\n end = start;\n start = 0;\n }\n end = end === undefined ? 1 : end;\n return start + (end - start) * this._nextInt() / this._max;\n};\n\nLcg.prototype.nextString = function(len, flags) {\n len |= 0;\n flags = flags || 'aA';\n var mask = '';\n if (flags.indexOf('a') > -1) {\n mask += 'abcdefghijklmnopqrstuvwxyz';\n }\n if (flags.indexOf('A') > -1) {\n mask += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n }\n if (flags.indexOf('#') > -1) {\n mask += '0123456789';\n }\n if (flags.indexOf('!') > -1) {\n mask += '~`!@#$%^&*()_+-={}[]:\";\\'<>?,./|\\\\';\n }\n var result = [];\n for (var i = 0; i < len; i++) {\n result.push(this.choice(mask));\n }\n return result.join('');\n};\n\nLcg.prototype.nextBuffer = function (len) {\n var arr = [];\n var i;\n for (i = 0; i < len; i++) {\n arr.push(this.nextInt(256));\n }\n return new Buffer(arr);\n};\n\nLcg.prototype.choice = function (arr) {\n var len = arr.length;\n if (!len) {\n throw new Error('choosing from empty array');\n }\n return arr[this.nextInt(len)];\n};\n\n/**\n * Ordered queue which returns items consecutively.\n *\n * This is actually a heap by index, with the added requirements that elements\n * can only be retrieved consecutively.\n *\n */\nfunction OrderedQueue() {\n this._index = 0;\n this._items = [];\n}\n\nOrderedQueue.prototype.push = function (item) {\n var items = this._items;\n var i = items.length | 0;\n var j;\n items.push(item);\n while (i > 0 && items[i].index < items[j = ((i - 1) >> 1)].index) {\n item = items[i];\n items[i] = items[j];\n items[j] = item;\n i = j;\n }\n};\n\nOrderedQueue.prototype.pop = function () {\n var items = this._items;\n var len = (items.length - 1) | 0;\n var first = items[0];\n if (!first || first.index > this._index) {\n return null;\n }\n this._index++;\n if (!len) {\n items.pop();\n return first;\n }\n items[0] = items.pop();\n var mid = len >> 1;\n var i = 0;\n var i1, i2, j, item, c, c1, c2;\n while (i < mid) {\n item = items[i];\n i1 = (i << 1) + 1;\n i2 = (i + 1) << 1;\n c1 = items[i1];\n c2 = items[i2];\n if (!c2 || c1.index <= c2.index) {\n c = c1;\n j = i1;\n } else {\n c = c2;\n j = i2;\n }\n if (c.index >= item.index) {\n break;\n }\n items[j] = item;\n items[i] = c;\n i = j;\n }\n return first;\n};\n\n/**\n * A tap is a buffer which remembers what has been already read.\n *\n * It is optimized for performance, at the cost of failing silently when\n * overflowing the buffer. This is a purposeful trade-off given the expected\n * rarity of this case and the large performance hit necessary to enforce\n * validity. See `isValid` below for more information.\n *\n */\nfunction Tap(buf, pos) {\n this.buf = buf;\n this.pos = pos | 0;\n}\n\n/**\n * Check that the tap is in a valid state.\n *\n * For efficiency reasons, none of the methods below will fail if an overflow\n * occurs (either read, skip, or write). For this reason, it is up to the\n * caller to always check that the read, skip, or write was valid by calling\n * this method.\n *\n */\nTap.prototype.isValid = function () { return this.pos <= this.buf.length; };\n\n/**\n * Returns the contents of the tap up to the current position.\n *\n */\nTap.prototype.getValue = function () { return this.buf.slice(0, this.pos); };\n\n// Read, skip, write methods.\n//\n// These should fail silently when the buffer overflows. Note this is only\n// required to be true when the functions are decoding valid objects. For\n// example errors will still be thrown if a bad count is read, leading to a\n// negative position offset (which will typically cause a failure in\n// `readFixed`).\n\nTap.prototype.readBoolean = function () { return !!this.buf[this.pos++]; };\n\nTap.prototype.skipBoolean = function () { this.pos++; };\n\nTap.prototype.writeBoolean = function (b) { this.buf[this.pos++] = !!b; };\n\nTap.prototype.readInt = Tap.prototype.readLong = function () {\n var n = 0;\n var k = 0;\n var buf = this.buf;\n var b, h, f, fk;\n\n do {\n b = buf[this.pos++];\n h = b & 0x80;\n n |= (b & 0x7f) << k;\n k += 7;\n } while (h && k < 28);\n\n if (h) {\n // Switch to float arithmetic, otherwise we might overflow.\n f = n;\n fk = 268435456; // 2 ** 28.\n do {\n b = buf[this.pos++];\n f += (b & 0x7f) * fk;\n fk *= 128;\n } while (b & 0x80);\n return (f % 2 ? -(f + 1) : f) / 2;\n }\n\n return (n >> 1) ^ -(n & 1);\n};\n\nTap.prototype.skipInt = Tap.prototype.skipLong = function () {\n var buf = this.buf;\n while (buf[this.pos++] & 0x80) {}\n};\n\nTap.prototype.writeInt = Tap.prototype.writeLong = function (n) {\n var buf = this.buf;\n var f, m;\n\n if (n >= -1073741824 && n < 1073741824) {\n // Won't overflow, we can use integer arithmetic.\n m = n >= 0 ? n << 1 : (~n << 1) | 1;\n do {\n buf[this.pos] = m & 0x7f;\n m >>= 7;\n } while (m && (buf[this.pos++] |= 0x80));\n } else {\n // We have to use slower floating arithmetic.\n f = n >= 0 ? n * 2 : (-n * 2) - 1;\n do {\n buf[this.pos] = f & 0x7f;\n f /= 128;\n } while (f >= 1 && (buf[this.pos++] |= 0x80));\n }\n this.pos++;\n};\n\nTap.prototype.readFloat = function () {\n var buf = this.buf;\n var pos = this.pos;\n this.pos += 4;\n if (this.pos > buf.length) {\n return;\n }\n return this.buf.readFloatLE(pos);\n};\n\nTap.prototype.skipFloat = function () { this.pos += 4; };\n\nTap.prototype.writeFloat = function (f) {\n var buf = this.buf;\n var pos = this.pos;\n this.pos += 4;\n if (this.pos > buf.length) {\n return;\n }\n return this.buf.writeFloatLE(f, pos);\n};\n\nTap.prototype.readDouble = function () {\n var buf = this.buf;\n var pos = this.pos;\n this.pos += 8;\n if (this.pos > buf.length) {\n return;\n }\n return this.buf.readDoubleLE(pos);\n};\n\nTap.prototype.skipDouble = function () { this.pos += 8; };\n\nTap.prototype.writeDouble = function (d) {\n var buf = this.buf;\n var pos = this.pos;\n this.pos += 8;\n if (this.pos > buf.length) {\n return;\n }\n return this.buf.writeDoubleLE(d, pos);\n};\n\nTap.prototype.readFixed = function (len) {\n var pos = this.pos;\n this.pos += len;\n if (this.pos > this.buf.length) {\n return;\n }\n var fixed = new Buffer(len);\n this.buf.copy(fixed, 0, pos, pos + len);\n return fixed;\n};\n\nTap.prototype.skipFixed = function (len) { this.pos += len; };\n\nTap.prototype.writeFixed = function (buf, len) {\n len = len || buf.length;\n var pos = this.pos;\n this.pos += len;\n if (this.pos > this.buf.length) {\n return;\n }\n buf.copy(this.buf, pos, 0, len);\n};\n\nTap.prototype.readBytes = function () {\n return this.readFixed(this.readLong());\n};\n\nTap.prototype.skipBytes = function () {\n var len = this.readLong();\n this.pos += len;\n};\n\nTap.prototype.writeBytes = function (buf) {\n var len = buf.length;\n this.writeLong(len);\n this.writeFixed(buf, len);\n};\n\nTap.prototype.readString = function () {\n var len = this.readLong();\n var pos = this.pos;\n var buf = this.buf;\n this.pos += len;\n if (this.pos > buf.length) {\n return;\n }\n return this.buf.utf8Slice(pos, pos + len);\n};\n\nTap.prototype.skipString = function () {\n var len = this.readLong();\n this.pos += len;\n};\n\nTap.prototype.writeString = function (s) {\n var len = Buffer.byteLength(s);\n this.writeLong(len);\n var pos = this.pos;\n this.pos += len;\n if (this.pos > this.buf.length) {\n return;\n }\n this.buf.utf8Write(s, pos, len);\n};\n\n// Helper used to speed up writing defaults.\n\nTap.prototype.writeBinary = function (str, len) {\n var pos = this.pos;\n this.pos += len;\n if (this.pos > this.buf.length) {\n return;\n }\n this.buf.write(str, pos, len, 'binary');\n};\n\n// Binary comparison methods.\n//\n// These are not guaranteed to consume the objects they are comparing when\n// returning a non-zero result (allowing for performance benefits), so no other\n// operations should be done on either tap after a compare returns a non-zero\n// value. Also, these methods do not have the same silent failure requirement\n// as read, skip, and write since they are assumed to be called on valid\n// buffers.\n\nTap.prototype.matchBoolean = function (tap) {\n return this.buf[this.pos++] - tap.buf[tap.pos++];\n};\n\nTap.prototype.matchInt = Tap.prototype.matchLong = function (tap) {\n var n1 = this.readLong();\n var n2 = tap.readLong();\n return n1 === n2 ? 0 : (n1 < n2 ? -1 : 1);\n};\n\nTap.prototype.matchFloat = function (tap) {\n var n1 = this.readFloat();\n var n2 = tap.readFloat();\n return n1 === n2 ? 0 : (n1 < n2 ? -1 : 1);\n};\n\nTap.prototype.matchDouble = function (tap) {\n var n1 = this.readDouble();\n var n2 = tap.readDouble();\n return n1 === n2 ? 0 : (n1 < n2 ? -1 : 1);\n};\n\nTap.prototype.matchFixed = function (tap, len) {\n return this.readFixed(len).compare(tap.readFixed(len));\n};\n\nTap.prototype.matchBytes = Tap.prototype.matchString = function (tap) {\n var l1 = this.readLong();\n var p1 = this.pos;\n this.pos += l1;\n var l2 = tap.readLong();\n var p2 = tap.pos;\n tap.pos += l2;\n var b1 = this.buf.slice(p1, this.pos);\n var b2 = tap.buf.slice(p2, tap.pos);\n return b1.compare(b2);\n};\n\n// Functions for supporting custom long classes.\n//\n// The two following methods allow the long implementations to not have to\n// worry about Avro's zigzag encoding, we directly expose longs as unpacked.\n\nTap.prototype.unpackLongBytes = function () {\n var res = new Buffer(8);\n var n = 0;\n var i = 0; // Byte index in target buffer.\n var j = 6; // Bit offset in current target buffer byte.\n var buf = this.buf;\n var b, neg;\n\n b = buf[this.pos++];\n neg = b & 1;\n res.fill(0);\n\n n |= (b & 0x7f) >> 1;\n while (b & 0x80) {\n b = buf[this.pos++];\n n |= (b & 0x7f) << j;\n j += 7;\n if (j >= 8) {\n // Flush byte.\n j -= 8;\n res[i++] = n;\n n >>= 8;\n }\n }\n res[i] = n;\n\n if (neg) {\n invert(res, 8);\n }\n\n return res;\n};\n\nTap.prototype.packLongBytes = function (buf) {\n var neg = (buf[7] & 0x80) >> 7;\n var res = this.buf;\n var j = 1;\n var k = 0;\n var m = 3;\n var n;\n\n if (neg) {\n invert(buf, 8);\n n = 1;\n } else {\n n = 0;\n }\n\n var parts = [\n buf.readUIntLE(0, 3),\n buf.readUIntLE(3, 3),\n buf.readUIntLE(6, 2)\n ];\n // Not reading more than 24 bits because we need to be able to combine the\n // \"carry\" bits from the previous part and JavaScript only supports bitwise\n // operations on 32 bit integers.\n while (m && !parts[--m]) {} // Skip trailing 0s.\n\n // Leading parts (if any), we never bail early here since we need the\n // continuation bit to be set.\n while (k < m) {\n n |= parts[k++] << j;\n j += 24;\n while (j > 7) {\n res[this.pos++] = (n & 0x7f) | 0x80;\n n >>= 7;\n j -= 7;\n }\n }\n\n // Final part, similar to normal packing aside from the initial offset.\n n |= parts[m] << j;\n do {\n res[this.pos] = n & 0x7f;\n n >>= 7;\n } while (n && (res[this.pos++] |= 0x80));\n this.pos++;\n\n // Restore original buffer (could make this optional?).\n if (neg) {\n invert(buf, 8);\n }\n};\n\n// Helpers.\n\n/**\n * Invert all bits in a buffer.\n *\n * @param buf {Buffer} Non-empty buffer to invert.\n * @param len {Number} Buffer length (must be positive).\n *\n */\nfunction invert(buf, len) {\n while (len--) {\n buf[len] = ~buf[len];\n }\n}\n\n\nmodule.exports = {\n abstractFunction: abstractFunction,\n capitalize: capitalize,\n compare: compare,\n getHash: getHash,\n toMap: toMap,\n singleIndexOf: singleIndexOf,\n hasDuplicates: hasDuplicates,\n Lcg: Lcg,\n OrderedQueue: OrderedQueue,\n Tap: Tap\n};\n", "'use strict';\n\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\tvar descriptor = Object.getOwnPropertyDescriptor(obj, sym);\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n", "'use strict';\n\nvar origSymbol = typeof Symbol !== 'undefined' && Symbol;\nvar hasSymbolSham = require('./shams');\n\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n", "'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slice.call(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n args.concat(slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n } else {\n return target.apply(\n that,\n args.concat(slice.call(arguments))\n );\n }\n };\n\n var boundLength = Math.max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs.push('$' + i);\n }\n\n bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n", "'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n", "'use strict';\n\nvar bind = require('function-bind');\n\nmodule.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);\n", "'use strict';\n\nvar undefined;\n\nvar $SyntaxError = SyntaxError;\nvar $Function = Function;\nvar $TypeError = TypeError;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\treturn $Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = Object.getOwnPropertyDescriptor;\nif ($gOPD) {\n\ttry {\n\t\t$gOPD({}, '');\n\t} catch (e) {\n\t\t$gOPD = null; // this is IE 8, which has a broken gOPD\n\t}\n}\n\nvar throwTypeError = function () {\n\tthrow new $TypeError();\n};\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto\n\nvar needsEval = {};\n\nvar TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': needsEval,\n\t'%AsyncGenerator%': needsEval,\n\t'%AsyncGeneratorFunction%': needsEval,\n\t'%AsyncIteratorPrototype%': needsEval,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': EvalError,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': needsEval,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': Object,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': RangeError,\n\t'%ReferenceError%': ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet\n};\n\nvar doEval = function doEval(name) {\n\tvar value;\n\tif (name === '%AsyncFunction%') {\n\t\tvalue = getEvalledConstructor('async function () {}');\n\t} else if (name === '%GeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('function* () {}');\n\t} else if (name === '%AsyncGeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('async function* () {}');\n\t} else if (name === '%AsyncGenerator%') {\n\t\tvar fn = doEval('%AsyncGeneratorFunction%');\n\t\tif (fn) {\n\t\t\tvalue = fn.prototype;\n\t\t}\n\t} else if (name === '%AsyncIteratorPrototype%') {\n\t\tvar gen = doEval('%AsyncGenerator%');\n\t\tif (gen) {\n\t\t\tvalue = getProto(gen.prototype);\n\t\t}\n\t}\n\n\tINTRINSICS[name] = value;\n\n\treturn value;\n};\n\nvar LEGACY_ALIASES = {\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = require('function-bind');\nvar hasOwn = require('has');\nvar $concat = bind.call(Function.call, Array.prototype.concat);\nvar $spliceApply = bind.call(Function.apply, Array.prototype.splice);\nvar $replace = bind.call(Function.call, String.prototype.replace);\nvar $strSlice = bind.call(Function.call, String.prototype.slice);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar first = $strSlice(string, 0, 1);\n\tvar last = $strSlice(string, -1);\n\tif (first === '%' && last !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected closing `%`');\n\t} else if (last === '%' && first !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected opening `%`');\n\t}\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (value === needsEval) {\n\t\t\tvalue = doEval(intrinsicName);\n\t\t}\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tvar first = $strSlice(part, 0, 1);\n\t\tvar last = $strSlice(part, -1);\n\t\tif (\n\t\t\t(\n\t\t\t\t(first === '\"' || first === \"'\" || first === '`')\n\t\t\t\t|| (last === '\"' || last === \"'\" || last === '`')\n\t\t\t)\n\t\t\t&& first !== last\n\t\t) {\n\t\t\tthrow new $SyntaxError('property names with quotes must have matching quotes');\n\t\t}\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif (!(part in value)) {\n\t\t\t\tif (!allowMissing) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\treturn void undefined;\n\t\t\t}\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n", "'use strict';\n\nvar bind = require('function-bind');\nvar GetIntrinsic = require('get-intrinsic');\n\nvar $apply = GetIntrinsic('%Function.prototype.apply%');\nvar $call = GetIntrinsic('%Function.prototype.call%');\nvar $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);\n\nvar $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\nvar $max = GetIntrinsic('%Math.max%');\n\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = null;\n\t}\n}\n\nmodule.exports = function callBind(originalFunction) {\n\tvar func = $reflectApply(bind, $call, arguments);\n\tif ($gOPD && $defineProperty) {\n\t\tvar desc = $gOPD(func, 'length');\n\t\tif (desc.configurable) {\n\t\t\t// original length, plus the receiver, minus any additional arguments (after the receiver)\n\t\t\t$defineProperty(\n\t\t\t\tfunc,\n\t\t\t\t'length',\n\t\t\t\t{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }\n\t\t\t);\n\t\t}\n\t}\n\treturn func;\n};\n\nvar applyBind = function applyBind() {\n\treturn $reflectApply(bind, $apply, arguments);\n};\n\nif ($defineProperty) {\n\t$defineProperty(module.exports, 'apply', { value: applyBind });\n} else {\n\tmodule.exports.apply = applyBind;\n}\n", "'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBind = require('./');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n", "'use strict';\n\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\nvar callBound = require('call-bind/callBound');\n\nvar $toString = callBound('Object.prototype.toString');\n\nvar isStandardArguments = function isArguments(value) {\n\tif (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {\n\t\treturn false;\n\t}\n\treturn $toString(value) === '[object Arguments]';\n};\n\nvar isLegacyArguments = function isArguments(value) {\n\tif (isStandardArguments(value)) {\n\t\treturn true;\n\t}\n\treturn value !== null &&\n\t\ttypeof value === 'object' &&\n\t\ttypeof value.length === 'number' &&\n\t\tvalue.length >= 0 &&\n\t\t$toString(value) !== '[object Array]' &&\n\t\t$toString(value.callee) === '[object Function]';\n};\n\nvar supportsStandardArguments = (function () {\n\treturn isStandardArguments(arguments);\n}());\n\nisStandardArguments.isLegacyArguments = isLegacyArguments; // for tests\n\nmodule.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;\n", "'use strict';\n\nvar toStr = Object.prototype.toString;\nvar fnToStr = Function.prototype.toString;\nvar isFnRegex = /^\\s*(?:function)?\\*/;\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\nvar getProto = Object.getPrototypeOf;\nvar getGeneratorFunc = function () { // eslint-disable-line consistent-return\n\tif (!hasToStringTag) {\n\t\treturn false;\n\t}\n\ttry {\n\t\treturn Function('return function*() {}')();\n\t} catch (e) {\n\t}\n};\nvar GeneratorFunction;\n\nmodule.exports = function isGeneratorFunction(fn) {\n\tif (typeof fn !== 'function') {\n\t\treturn false;\n\t}\n\tif (isFnRegex.test(fnToStr.call(fn))) {\n\t\treturn true;\n\t}\n\tif (!hasToStringTag) {\n\t\tvar str = toStr.call(fn);\n\t\treturn str === '[object GeneratorFunction]';\n\t}\n\tif (!getProto) {\n\t\treturn false;\n\t}\n\tif (typeof GeneratorFunction === 'undefined') {\n\t\tvar generatorFunc = getGeneratorFunc();\n\t\tGeneratorFunction = generatorFunc ? getProto(generatorFunc) : false;\n\t}\n\treturn getProto(fn) === GeneratorFunction;\n};\n", "\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toString = Object.prototype.toString;\n\nmodule.exports = function forEach (obj, fn, ctx) {\n if (toString.call(fn) !== '[object Function]') {\n throw new TypeError('iterator must be a function');\n }\n var l = obj.length;\n if (l === +l) {\n for (var i = 0; i < l; i++) {\n fn.call(ctx, obj[i], i, obj);\n }\n } else {\n for (var k in obj) {\n if (hasOwn.call(obj, k)) {\n fn.call(ctx, obj[k], k, obj);\n }\n }\n }\n};\n\n", "'use strict';\n\nvar possibleNames = [\n\t'BigInt64Array',\n\t'BigUint64Array',\n\t'Float32Array',\n\t'Float64Array',\n\t'Int16Array',\n\t'Int32Array',\n\t'Int8Array',\n\t'Uint16Array',\n\t'Uint32Array',\n\t'Uint8Array',\n\t'Uint8ClampedArray'\n];\n\nmodule.exports = function availableTypedArrays() {\n\tvar out = [];\n\tfor (var i = 0; i < possibleNames.length; i++) {\n\t\tif (typeof global[possibleNames[i]] === 'function') {\n\t\t\tout[out.length] = possibleNames[i];\n\t\t}\n\t}\n\treturn out;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%');\nif ($gOPD) {\n\ttry {\n\t\t$gOPD([], 'length');\n\t} catch (e) {\n\t\t// IE 8 has a broken gOPD\n\t\t$gOPD = null;\n\t}\n}\n\nmodule.exports = $gOPD;\n", "'use strict';\n\nvar forEach = require('foreach');\nvar availableTypedArrays = require('available-typed-arrays');\nvar callBound = require('call-bind/callBound');\n\nvar $toString = callBound('Object.prototype.toString');\nvar hasSymbols = require('has-symbols')();\nvar hasToStringTag = hasSymbols && typeof Symbol.toStringTag === 'symbol';\n\nvar typedArrays = availableTypedArrays();\n\nvar $indexOf = callBound('Array.prototype.indexOf', true) || function indexOf(array, value) {\n\tfor (var i = 0; i < array.length; i += 1) {\n\t\tif (array[i] === value) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n};\nvar $slice = callBound('String.prototype.slice');\nvar toStrTags = {};\nvar gOPD = require('es-abstract/helpers/getOwnPropertyDescriptor');\nvar getPrototypeOf = Object.getPrototypeOf; // require('getprototypeof');\nif (hasToStringTag && gOPD && getPrototypeOf) {\n\tforEach(typedArrays, function (typedArray) {\n\t\tvar arr = new global[typedArray]();\n\t\tif (!(Symbol.toStringTag in arr)) {\n\t\t\tthrow new EvalError('this engine has support for Symbol.toStringTag, but ' + typedArray + ' does not have the property! Please report this.');\n\t\t}\n\t\tvar proto = getPrototypeOf(arr);\n\t\tvar descriptor = gOPD(proto, Symbol.toStringTag);\n\t\tif (!descriptor) {\n\t\t\tvar superProto = getPrototypeOf(proto);\n\t\t\tdescriptor = gOPD(superProto, Symbol.toStringTag);\n\t\t}\n\t\ttoStrTags[typedArray] = descriptor.get;\n\t});\n}\n\nvar tryTypedArrays = function tryAllTypedArrays(value) {\n\tvar anyTrue = false;\n\tforEach(toStrTags, function (getter, typedArray) {\n\t\tif (!anyTrue) {\n\t\t\ttry {\n\t\t\t\tanyTrue = getter.call(value) === typedArray;\n\t\t\t} catch (e) { /**/ }\n\t\t}\n\t});\n\treturn anyTrue;\n};\n\nmodule.exports = function isTypedArray(value) {\n\tif (!value || typeof value !== 'object') { return false; }\n\tif (!hasToStringTag) {\n\t\tvar tag = $slice($toString(value), 8, -1);\n\t\treturn $indexOf(typedArrays, tag) > -1;\n\t}\n\tif (!gOPD) { return false; }\n\treturn tryTypedArrays(value);\n};\n", "'use strict';\n\nvar forEach = require('foreach');\nvar availableTypedArrays = require('available-typed-arrays');\nvar callBound = require('call-bind/callBound');\n\nvar $toString = callBound('Object.prototype.toString');\nvar hasSymbols = require('has-symbols')();\nvar hasToStringTag = hasSymbols && typeof Symbol.toStringTag === 'symbol';\n\nvar typedArrays = availableTypedArrays();\n\nvar $slice = callBound('String.prototype.slice');\nvar toStrTags = {};\nvar gOPD = require('es-abstract/helpers/getOwnPropertyDescriptor');\nvar getPrototypeOf = Object.getPrototypeOf; // require('getprototypeof');\nif (hasToStringTag && gOPD && getPrototypeOf) {\n\tforEach(typedArrays, function (typedArray) {\n\t\tif (typeof global[typedArray] === 'function') {\n\t\t\tvar arr = new global[typedArray]();\n\t\t\tif (!(Symbol.toStringTag in arr)) {\n\t\t\t\tthrow new EvalError('this engine has support for Symbol.toStringTag, but ' + typedArray + ' does not have the property! Please report this.');\n\t\t\t}\n\t\t\tvar proto = getPrototypeOf(arr);\n\t\t\tvar descriptor = gOPD(proto, Symbol.toStringTag);\n\t\t\tif (!descriptor) {\n\t\t\t\tvar superProto = getPrototypeOf(proto);\n\t\t\t\tdescriptor = gOPD(superProto, Symbol.toStringTag);\n\t\t\t}\n\t\t\ttoStrTags[typedArray] = descriptor.get;\n\t\t}\n\t});\n}\n\nvar tryTypedArrays = function tryAllTypedArrays(value) {\n\tvar foundName = false;\n\tforEach(toStrTags, function (getter, typedArray) {\n\t\tif (!foundName) {\n\t\t\ttry {\n\t\t\t\tvar name = getter.call(value);\n\t\t\t\tif (name === typedArray) {\n\t\t\t\t\tfoundName = name;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t}\n\t});\n\treturn foundName;\n};\n\nvar isTypedArray = require('is-typed-array');\n\nmodule.exports = function whichTypedArray(value) {\n\tif (!isTypedArray(value)) { return false; }\n\tif (!hasToStringTag) { return $slice($toString(value), 8, -1); }\n\treturn tryTypedArrays(value);\n};\n", "// Currently in sync with Node.js lib/internal/util/types.js\n// https://github.com/nodejs/node/commit/112cc7c27551254aa2b17098fb774867f05ed0d9\n\n'use strict';\n\nvar isArgumentsObject = require('is-arguments');\nvar isGeneratorFunction = require('is-generator-function');\nvar whichTypedArray = require('which-typed-array');\nvar isTypedArray = require('is-typed-array');\n\nfunction uncurryThis(f) {\n return f.call.bind(f);\n}\n\nvar BigIntSupported = typeof BigInt !== 'undefined';\nvar SymbolSupported = typeof Symbol !== 'undefined';\n\nvar ObjectToString = uncurryThis(Object.prototype.toString);\n\nvar numberValue = uncurryThis(Number.prototype.valueOf);\nvar stringValue = uncurryThis(String.prototype.valueOf);\nvar booleanValue = uncurryThis(Boolean.prototype.valueOf);\n\nif (BigIntSupported) {\n var bigIntValue = uncurryThis(BigInt.prototype.valueOf);\n}\n\nif (SymbolSupported) {\n var symbolValue = uncurryThis(Symbol.prototype.valueOf);\n}\n\nfunction checkBoxedPrimitive(value, prototypeValueOf) {\n if (typeof value !== 'object') {\n return false;\n }\n try {\n prototypeValueOf(value);\n return true;\n } catch(e) {\n return false;\n }\n}\n\nexports.isArgumentsObject = isArgumentsObject;\nexports.isGeneratorFunction = isGeneratorFunction;\nexports.isTypedArray = isTypedArray;\n\n// Taken from here and modified for better browser support\n// https://github.com/sindresorhus/p-is-promise/blob/cda35a513bda03f977ad5cde3a079d237e82d7ef/index.js\nfunction isPromise(input) {\n\treturn (\n\t\t(\n\t\t\ttypeof Promise !== 'undefined' &&\n\t\t\tinput instanceof Promise\n\t\t) ||\n\t\t(\n\t\t\tinput !== null &&\n\t\t\ttypeof input === 'object' &&\n\t\t\ttypeof input.then === 'function' &&\n\t\t\ttypeof input.catch === 'function'\n\t\t)\n\t);\n}\nexports.isPromise = isPromise;\n\nfunction isArrayBufferView(value) {\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {\n return ArrayBuffer.isView(value);\n }\n\n return (\n isTypedArray(value) ||\n isDataView(value)\n );\n}\nexports.isArrayBufferView = isArrayBufferView;\n\n\nfunction isUint8Array(value) {\n return whichTypedArray(value) === 'Uint8Array';\n}\nexports.isUint8Array = isUint8Array;\n\nfunction isUint8ClampedArray(value) {\n return whichTypedArray(value) === 'Uint8ClampedArray';\n}\nexports.isUint8ClampedArray = isUint8ClampedArray;\n\nfunction isUint16Array(value) {\n return whichTypedArray(value) === 'Uint16Array';\n}\nexports.isUint16Array = isUint16Array;\n\nfunction isUint32Array(value) {\n return whichTypedArray(value) === 'Uint32Array';\n}\nexports.isUint32Array = isUint32Array;\n\nfunction isInt8Array(value) {\n return whichTypedArray(value) === 'Int8Array';\n}\nexports.isInt8Array = isInt8Array;\n\nfunction isInt16Array(value) {\n return whichTypedArray(value) === 'Int16Array';\n}\nexports.isInt16Array = isInt16Array;\n\nfunction isInt32Array(value) {\n return whichTypedArray(value) === 'Int32Array';\n}\nexports.isInt32Array = isInt32Array;\n\nfunction isFloat32Array(value) {\n return whichTypedArray(value) === 'Float32Array';\n}\nexports.isFloat32Array = isFloat32Array;\n\nfunction isFloat64Array(value) {\n return whichTypedArray(value) === 'Float64Array';\n}\nexports.isFloat64Array = isFloat64Array;\n\nfunction isBigInt64Array(value) {\n return whichTypedArray(value) === 'BigInt64Array';\n}\nexports.isBigInt64Array = isBigInt64Array;\n\nfunction isBigUint64Array(value) {\n return whichTypedArray(value) === 'BigUint64Array';\n}\nexports.isBigUint64Array = isBigUint64Array;\n\nfunction isMapToString(value) {\n return ObjectToString(value) === '[object Map]';\n}\nisMapToString.working = (\n typeof Map !== 'undefined' &&\n isMapToString(new Map())\n);\n\nfunction isMap(value) {\n if (typeof Map === 'undefined') {\n return false;\n }\n\n return isMapToString.working\n ? isMapToString(value)\n : value instanceof Map;\n}\nexports.isMap = isMap;\n\nfunction isSetToString(value) {\n return ObjectToString(value) === '[object Set]';\n}\nisSetToString.working = (\n typeof Set !== 'undefined' &&\n isSetToString(new Set())\n);\nfunction isSet(value) {\n if (typeof Set === 'undefined') {\n return false;\n }\n\n return isSetToString.working\n ? isSetToString(value)\n : value instanceof Set;\n}\nexports.isSet = isSet;\n\nfunction isWeakMapToString(value) {\n return ObjectToString(value) === '[object WeakMap]';\n}\nisWeakMapToString.working = (\n typeof WeakMap !== 'undefined' &&\n isWeakMapToString(new WeakMap())\n);\nfunction isWeakMap(value) {\n if (typeof WeakMap === 'undefined') {\n return false;\n }\n\n return isWeakMapToString.working\n ? isWeakMapToString(value)\n : value instanceof WeakMap;\n}\nexports.isWeakMap = isWeakMap;\n\nfunction isWeakSetToString(value) {\n return ObjectToString(value) === '[object WeakSet]';\n}\nisWeakSetToString.working = (\n typeof WeakSet !== 'undefined' &&\n isWeakSetToString(new WeakSet())\n);\nfunction isWeakSet(value) {\n return isWeakSetToString(value);\n}\nexports.isWeakSet = isWeakSet;\n\nfunction isArrayBufferToString(value) {\n return ObjectToString(value) === '[object ArrayBuffer]';\n}\nisArrayBufferToString.working = (\n typeof ArrayBuffer !== 'undefined' &&\n isArrayBufferToString(new ArrayBuffer())\n);\nfunction isArrayBuffer(value) {\n if (typeof ArrayBuffer === 'undefined') {\n return false;\n }\n\n return isArrayBufferToString.working\n ? isArrayBufferToString(value)\n : value instanceof ArrayBuffer;\n}\nexports.isArrayBuffer = isArrayBuffer;\n\nfunction isDataViewToString(value) {\n return ObjectToString(value) === '[object DataView]';\n}\nisDataViewToString.working = (\n typeof ArrayBuffer !== 'undefined' &&\n typeof DataView !== 'undefined' &&\n isDataViewToString(new DataView(new ArrayBuffer(1), 0, 1))\n);\nfunction isDataView(value) {\n if (typeof DataView === 'undefined') {\n return false;\n }\n\n return isDataViewToString.working\n ? isDataViewToString(value)\n : value instanceof DataView;\n}\nexports.isDataView = isDataView;\n\n// Store a copy of SharedArrayBuffer in case it's deleted elsewhere\nvar SharedArrayBufferCopy = typeof SharedArrayBuffer !== 'undefined' ? SharedArrayBuffer : undefined;\nfunction isSharedArrayBufferToString(value) {\n return ObjectToString(value) === '[object SharedArrayBuffer]';\n}\nfunction isSharedArrayBuffer(value) {\n if (typeof SharedArrayBufferCopy === 'undefined') {\n return false;\n }\n\n if (typeof isSharedArrayBufferToString.working === 'undefined') {\n isSharedArrayBufferToString.working = isSharedArrayBufferToString(new SharedArrayBufferCopy());\n }\n\n return isSharedArrayBufferToString.working\n ? isSharedArrayBufferToString(value)\n : value instanceof SharedArrayBufferCopy;\n}\nexports.isSharedArrayBuffer = isSharedArrayBuffer;\n\nfunction isAsyncFunction(value) {\n return ObjectToString(value) === '[object AsyncFunction]';\n}\nexports.isAsyncFunction = isAsyncFunction;\n\nfunction isMapIterator(value) {\n return ObjectToString(value) === '[object Map Iterator]';\n}\nexports.isMapIterator = isMapIterator;\n\nfunction isSetIterator(value) {\n return ObjectToString(value) === '[object Set Iterator]';\n}\nexports.isSetIterator = isSetIterator;\n\nfunction isGeneratorObject(value) {\n return ObjectToString(value) === '[object Generator]';\n}\nexports.isGeneratorObject = isGeneratorObject;\n\nfunction isWebAssemblyCompiledModule(value) {\n return ObjectToString(value) === '[object WebAssembly.Module]';\n}\nexports.isWebAssemblyCompiledModule = isWebAssemblyCompiledModule;\n\nfunction isNumberObject(value) {\n return checkBoxedPrimitive(value, numberValue);\n}\nexports.isNumberObject = isNumberObject;\n\nfunction isStringObject(value) {\n return checkBoxedPrimitive(value, stringValue);\n}\nexports.isStringObject = isStringObject;\n\nfunction isBooleanObject(value) {\n return checkBoxedPrimitive(value, booleanValue);\n}\nexports.isBooleanObject = isBooleanObject;\n\nfunction isBigIntObject(value) {\n return BigIntSupported && checkBoxedPrimitive(value, bigIntValue);\n}\nexports.isBigIntObject = isBigIntObject;\n\nfunction isSymbolObject(value) {\n return SymbolSupported && checkBoxedPrimitive(value, symbolValue);\n}\nexports.isSymbolObject = isSymbolObject;\n\nfunction isBoxedPrimitive(value) {\n return (\n isNumberObject(value) ||\n isStringObject(value) ||\n isBooleanObject(value) ||\n isBigIntObject(value) ||\n isSymbolObject(value)\n );\n}\nexports.isBoxedPrimitive = isBoxedPrimitive;\n\nfunction isAnyArrayBuffer(value) {\n return typeof Uint8Array !== 'undefined' && (\n isArrayBuffer(value) ||\n isSharedArrayBuffer(value)\n );\n}\nexports.isAnyArrayBuffer = isAnyArrayBuffer;\n\n['isProxy', 'isExternal', 'isModuleNamespaceObject'].forEach(function(method) {\n Object.defineProperty(exports, method, {\n enumerable: false,\n value: function() {\n throw new Error(method + ' is not supported in userland');\n }\n });\n});\n", "module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}", "if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n", "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors ||\n function getOwnPropertyDescriptors(obj) {\n var keys = Object.keys(obj);\n var descriptors = {};\n for (var i = 0; i < keys.length; i++) {\n descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]);\n }\n return descriptors;\n };\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n if (typeof process !== 'undefined' && process.noDeprecation === true) {\n return fn;\n }\n\n // Allow for deprecating things in the process of starting up.\n if (typeof process === 'undefined') {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnvRegex = /^$/;\n\nif (process.env.NODE_DEBUG) {\n var debugEnv = process.env.NODE_DEBUG;\n debugEnv = debugEnv.replace(/[|\\\\{}()[\\]^$+?.]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/,/g, '$|^')\n .toUpperCase();\n debugEnvRegex = new RegExp('^' + debugEnv + '$', 'i');\n}\nexports.debuglog = function(set) {\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (debugEnvRegex.test(set)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nexports.types = require('./support/types');\n\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\nexports.types.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\nexports.types.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\nexports.types.isNativeError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nvar kCustomPromisifiedSymbol = typeof Symbol !== 'undefined' ? Symbol('util.promisify.custom') : undefined;\n\nexports.promisify = function promisify(original) {\n if (typeof original !== 'function')\n throw new TypeError('The \"original\" argument must be of type Function');\n\n if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) {\n var fn = original[kCustomPromisifiedSymbol];\n if (typeof fn !== 'function') {\n throw new TypeError('The \"util.promisify.custom\" argument must be of type Function');\n }\n Object.defineProperty(fn, kCustomPromisifiedSymbol, {\n value: fn, enumerable: false, writable: false, configurable: true\n });\n return fn;\n }\n\n function fn() {\n var promiseResolve, promiseReject;\n var promise = new Promise(function (resolve, reject) {\n promiseResolve = resolve;\n promiseReject = reject;\n });\n\n var args = [];\n for (var i = 0; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n args.push(function (err, value) {\n if (err) {\n promiseReject(err);\n } else {\n promiseResolve(value);\n }\n });\n\n try {\n original.apply(this, args);\n } catch (err) {\n promiseReject(err);\n }\n\n return promise;\n }\n\n Object.setPrototypeOf(fn, Object.getPrototypeOf(original));\n\n if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, {\n value: fn, enumerable: false, writable: false, configurable: true\n });\n return Object.defineProperties(\n fn,\n getOwnPropertyDescriptors(original)\n );\n}\n\nexports.promisify.custom = kCustomPromisifiedSymbol\n\nfunction callbackifyOnRejected(reason, cb) {\n // `!reason` guard inspired by bluebird (Ref: https://goo.gl/t5IS6M).\n // Because `null` is a special error value in callbacks which means \"no error\n // occurred\", we error-wrap so the callback consumer can distinguish between\n // \"the promise rejected with null\" or \"the promise fulfilled with undefined\".\n if (!reason) {\n var newReason = new Error('Promise was rejected with a falsy value');\n newReason.reason = reason;\n reason = newReason;\n }\n return cb(reason);\n}\n\nfunction callbackify(original) {\n if (typeof original !== 'function') {\n throw new TypeError('The \"original\" argument must be of type Function');\n }\n\n // We DO NOT return the promise as it gives the user a false sense that\n // the promise is actually somehow related to the callback's execution\n // and that the callback throwing will reject the promise.\n function callbackified() {\n var args = [];\n for (var i = 0; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n\n var maybeCb = args.pop();\n if (typeof maybeCb !== 'function') {\n throw new TypeError('The last argument must be of type Function');\n }\n var self = this;\n var cb = function() {\n return maybeCb.apply(self, arguments);\n };\n // In true node style we process the callback on `nextTick` with all the\n // implications (stack, `uncaughtException`, `async_hooks`)\n original.apply(this, args)\n .then(function(ret) { process.nextTick(cb.bind(null, null, ret)) },\n function(rej) { process.nextTick(callbackifyOnRejected.bind(null, rej, cb)) });\n }\n\n Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original));\n Object.defineProperties(callbackified,\n getOwnPropertyDescriptors(original));\n return callbackified;\n}\nexports.callbackify = callbackify;\n", "/* jshint node: true */\n\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n'use strict';\n\nvar utils = require('./utils'),\n buffer = require('buffer'), // For `SlowBuffer`.\n util = require('util');\n\n// Convenience imports.\nvar Tap = utils.Tap;\nvar f = util.format;\n\n// All Avro types.\nvar TYPES = {\n 'array': ArrayType,\n 'boolean': BooleanType,\n 'bytes': BytesType,\n 'double': DoubleType,\n 'enum': EnumType,\n 'error': RecordType,\n 'fixed': FixedType,\n 'float': FloatType,\n 'int': IntType,\n 'long': LongType,\n 'map': MapType,\n 'null': NullType,\n 'record': RecordType,\n 'request': RecordType,\n 'string': StringType,\n 'union': UnionType\n};\n\n// Valid (field, type, and symbol) name regex.\nvar NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n// Random generator.\nvar RANDOM = new utils.Lcg();\n\n// Encoding tap (shared for performance).\nvar TAP = new Tap(new buffer.SlowBuffer(1024));\n\n// Path prefix for validity checks (shared for performance).\nvar PATH = [];\n\n// Currently active logical type, used for name redirection.\nvar LOGICAL_TYPE = null;\n\n\n/**\n * Schema parsing entry point.\n *\n * It isn't exposed directly but called from `parse` inside `index.js` (node)\n * or `avro.js` (browserify) which each add convenience functionality.\n *\n */\nfunction createType(attrs, opts) {\n if (attrs instanceof Type) {\n return attrs;\n }\n\n opts = getOpts(attrs, opts);\n\n var type;\n if (typeof attrs == 'string') { // Type reference.\n if (opts.namespace && !~attrs.indexOf('.') && !isPrimitive(attrs)) {\n attrs = opts.namespace + '.' + attrs;\n }\n type = opts.registry[attrs];\n if (type) {\n // Type was already defined, return it.\n return type;\n }\n if (isPrimitive(attrs)) {\n // Reference to a primitive type. These are also defined names by default\n // so we create the appropriate type and it to the registry for future\n // reference.\n type = opts.registry[attrs] = createType({type: attrs}, opts);\n return type;\n }\n throw new Error(f('undefined type name: %s', attrs));\n }\n\n if (opts.typeHook && (type = opts.typeHook(attrs, opts))) {\n if (!(type instanceof Type)) {\n throw new Error(f('invalid typehook return value: %j', type));\n }\n return type;\n }\n\n if (attrs.logicalType && !LOGICAL_TYPE) {\n var DerivedType = opts.logicalTypes[attrs.logicalType];\n if (DerivedType) {\n var registry = {};\n Object.keys(opts.registry).forEach(function (key) {\n registry[key] = opts.registry[key];\n });\n try {\n return new DerivedType(attrs, opts);\n } catch (err) {\n if (opts.assertLogicalTypes) {\n throw err;\n }\n LOGICAL_TYPE = null;\n opts.registry = registry; // In case any names were registered.\n }\n }\n }\n\n if (attrs instanceof Array) { // Union.\n type = new UnionType(attrs, opts);\n } else { // New type definition.\n type = (function (typeName) {\n var Type = TYPES[typeName];\n if (Type === undefined) {\n throw new Error(f('unknown type: %j', typeName));\n }\n return new Type(attrs, opts);\n })(attrs.type);\n }\n return type;\n}\n\n/**\n * \"Abstract\" base Avro type class.\n *\n * This class' constructor will register any named types to support\n * recursive schemas.\n *\n * All type values are represented in memory similarly to their JSON\n * representation, except for `bytes` and `fixed` which are represented as\n * `Buffer`s. See individual subclasses for details.\n *\n */\nfunction Type(registry) {\n var name = this._name;\n var type = LOGICAL_TYPE || this;\n LOGICAL_TYPE = null;\n\n if (registry === undefined || name === undefined) {\n return;\n }\n\n var prev = registry[name];\n if (prev !== undefined) {\n throw new Error(f('duplicate type name: %s', name));\n }\n registry[name] = type;\n}\n\nType.__reset = function (size) { TAP.buf = new buffer.SlowBuffer(size); };\n\nType.prototype.createResolver = function (type, opts) {\n if (!(type instanceof Type)) {\n // More explicit error message than the \"incompatible type\" thrown\n // otherwise (especially because of the overridden `toJSON` method).\n throw new Error(f('not a type: %j', type));\n }\n\n if (type instanceof LogicalType && !(this instanceof LogicalType)) {\n // Trying to read a logical type as a built-in: unwrap the logical type.\n return this.createResolver(type._underlyingType, opts);\n }\n\n opts = opts || {};\n opts.registry = opts.registry || {};\n\n var resolver, key;\n if (this instanceof RecordType && type instanceof RecordType) {\n key = this._name + ':' + type._name; // ':' is illegal in Avro type names.\n resolver = opts.registry[key];\n if (resolver) {\n return resolver;\n }\n }\n\n resolver = new Resolver(this);\n if (key) { // Register resolver early for recursive schemas.\n opts.registry[key] = resolver;\n }\n\n if (type instanceof UnionType) {\n var resolvers = type._types.map(function (t) {\n return this.createResolver(t, opts);\n }, this);\n resolver._read = function (tap) {\n var index = tap.readLong();\n var resolver = resolvers[index];\n if (resolver === undefined) {\n throw new Error(f('invalid union index: %s', index));\n }\n return resolvers[index]._read(tap);\n };\n } else {\n this._updateResolver(resolver, type, opts);\n }\n\n if (!resolver._read) {\n throw new Error(f('cannot read %s as %s', type, this));\n }\n return resolver;\n};\n\nType.prototype.decode = function (buf, pos, resolver) {\n var tap = new Tap(buf);\n tap.pos = pos | 0;\n var val = readValue(this, tap, resolver);\n if (!tap.isValid()) {\n return {value: undefined, offset: -1};\n }\n return {value: val, offset: tap.pos};\n};\n\nType.prototype.encode = function (val, buf, pos) {\n var tap = new Tap(buf);\n tap.pos = pos | 0;\n this._write(tap, val);\n if (!tap.isValid()) {\n // Don't throw as there is no way to predict this. We also return the\n // number of missing bytes to ease resizing.\n return buf.length - tap.pos;\n }\n return tap.pos;\n};\n\nType.prototype.fromBuffer = function (buf, resolver, noCheck) {\n var tap = new Tap(buf);\n var val = readValue(this, tap, resolver, noCheck);\n if (!tap.isValid()) {\n throw new Error('truncated buffer');\n }\n if (!noCheck && tap.pos < buf.length) {\n throw new Error('trailing data');\n }\n return val;\n};\n\nType.prototype.toBuffer = function (val) {\n TAP.pos = 0;\n this._write(TAP, val);\n if (!TAP.isValid()) {\n Type.__reset(2 * TAP.pos);\n TAP.pos = 0;\n this._write(TAP, val);\n }\n var buf = new Buffer(TAP.pos);\n TAP.buf.copy(buf, 0, 0, TAP.pos);\n return buf;\n};\n\nType.prototype.fromString = function (str) {\n return this._copy(JSON.parse(str), {coerce: 2});\n};\n\nType.prototype.toString = function (val) {\n if (val === undefined) {\n // Consistent behavior with standard `toString` expectations.\n return this.getSchema(true);\n }\n return JSON.stringify(this._copy(val, {coerce: 3}));\n};\n\nType.prototype.clone = function (val, opts) {\n if (opts) {\n opts = {\n coerce: !!opts.coerceBuffers | 0, // Coerce JSON to Buffer.\n fieldHook: opts.fieldHook,\n wrap: !!opts.wrapUnions | 0 // Wrap first match into union.\n };\n }\n return this._copy(val, opts);\n};\n\nType.prototype.isValid = function (val, opts) {\n while (PATH.length) {\n // In case the previous `isValid` call didn't complete successfully (e.g.\n // if an exception was thrown, but then caught in client code), `PATH`\n // might be non-empty, we must manually clear it.\n PATH.pop();\n }\n return this._check(val, opts && opts.errorHook);\n};\n\nType.prototype.compareBuffers = function (buf1, buf2) {\n return this._match(new Tap(buf1), new Tap(buf2));\n};\n\nType.prototype.getName = function (noRef) {\n return noRef ? getTypeName(this) : this._name;\n};\n\nType.prototype.getSchema = function (noDeref) {\n return stringify(this, noDeref);\n};\n\nType.prototype.getFingerprint = function (algorithm) {\n return utils.getHash(this.getSchema(), algorithm);\n};\n\nType.prototype.inspect = function () {\n if (this instanceof PrimitiveType) {\n return f('<%s>', this.constructor.name);\n } else {\n var obj = JSON.parse(this.getSchema(true)); // Slow, only for debugging.\n if (typeof obj == 'object') {\n obj.type = undefined; // Would be redundant with constructor name.\n }\n return f('<%s %j>', this.constructor.name, obj);\n }\n};\n\nType.prototype._check = utils.abstractFunction;\nType.prototype._copy = utils.abstractFunction;\nType.prototype._match = utils.abstractFunction;\nType.prototype._read = utils.abstractFunction;\nType.prototype._skip = utils.abstractFunction;\nType.prototype._updateResolver = utils.abstractFunction;\nType.prototype._write = utils.abstractFunction;\nType.prototype.compare = utils.abstractFunction;\nType.prototype.random = utils.abstractFunction;\n\n// Implementations.\n\n/**\n * Base primitive Avro type.\n *\n * Most of the primitive types share the same cloning and resolution\n * mechanisms, provided by this class. This class also lets us conveniently\n * check whether a type is a primitive using `instanceof`.\n *\n */\nfunction PrimitiveType() { Type.call(this); }\nutil.inherits(PrimitiveType, Type);\nPrimitiveType.prototype._updateResolver = function (resolver, type) {\n if (type.constructor === this.constructor) {\n resolver._read = this._read;\n }\n};\nPrimitiveType.prototype._copy = function (val) {\n this._check(val, throwInvalidError);\n return val;\n};\nPrimitiveType.prototype.compare = utils.compare;\n\n/**\n * Nulls.\n *\n */\nfunction NullType() { PrimitiveType.call(this); }\nutil.inherits(NullType, PrimitiveType);\nNullType.prototype._check = function (val, cb) {\n var b = val === null;\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\nNullType.prototype._read = function () { return null; };\nNullType.prototype._skip = function () {};\nNullType.prototype._write = function (tap, val) {\n if (val !== null) {\n throwInvalidError(null, val, this);\n }\n};\nNullType.prototype._match = function () { return 0; };\nNullType.prototype.compare = NullType.prototype._match;\nNullType.prototype.random = NullType.prototype._read;\nNullType.prototype.toJSON = function () { return 'null'; };\n\n/**\n * Booleans.\n *\n */\nfunction BooleanType() { PrimitiveType.call(this); }\nutil.inherits(BooleanType, PrimitiveType);\nBooleanType.prototype._check = function (val, cb) {\n var b = typeof val == 'boolean';\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\nBooleanType.prototype._read = function (tap) { return tap.readBoolean(); };\nBooleanType.prototype._skip = function (tap) { tap.skipBoolean(); };\nBooleanType.prototype._write = function (tap, val) {\n if (typeof val != 'boolean') {\n throwInvalidError(null, val, this);\n }\n tap.writeBoolean(val);\n};\nBooleanType.prototype._match = function (tap1, tap2) {\n return tap1.matchBoolean(tap2);\n};\nBooleanType.prototype.random = function () { return RANDOM.nextBoolean(); };\nBooleanType.prototype.toJSON = function () { return 'boolean'; };\n\n/**\n * Integers.\n *\n */\nfunction IntType() { PrimitiveType.call(this); }\nutil.inherits(IntType, PrimitiveType);\nIntType.prototype._check = function (val, cb) {\n var b = val === (val | 0);\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\nIntType.prototype._read = function (tap) { return tap.readInt(); };\nIntType.prototype._skip = function (tap) { tap.skipInt(); };\nIntType.prototype._write = function (tap, val) {\n if (val !== (val | 0)) {\n throwInvalidError(null, val, this);\n }\n tap.writeInt(val);\n};\nIntType.prototype._match = function (tap1, tap2) {\n return tap1.matchInt(tap2);\n};\nIntType.prototype.random = function () { return RANDOM.nextInt(1000) | 0; };\nIntType.prototype.toJSON = function () { return 'int'; };\n\n/**\n * Longs.\n *\n * We can't capture all the range unfortunately since JavaScript represents all\n * numbers internally as `double`s, so the default implementation plays safe\n * and throws rather than potentially silently change the data. See `using` or\n * `AbstractLongType` below for a way to implement a custom long type.\n *\n */\nfunction LongType() { PrimitiveType.call(this); }\nutil.inherits(LongType, PrimitiveType);\nLongType.prototype._check = function (val, cb) {\n var b = typeof val == 'number' && val % 1 === 0 && isSafeLong(val);\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\nLongType.prototype._read = function (tap) {\n var n = tap.readLong();\n if (!isSafeLong(n)) {\n throw new Error('potential precision loss');\n }\n return n;\n};\nLongType.prototype._skip = function (tap) { tap.skipLong(); };\nLongType.prototype._write = function (tap, val) {\n if (typeof val != 'number' || val % 1 || !isSafeLong(val)) {\n throwInvalidError(null, val, this);\n }\n tap.writeLong(val);\n};\nLongType.prototype._match = function (tap1, tap2) {\n return tap1.matchLong(tap2);\n};\nLongType.prototype._updateResolver = function (resolver, type) {\n if (type instanceof LongType || type instanceof IntType) {\n resolver._read = type._read;\n }\n};\nLongType.prototype.random = function () { return RANDOM.nextInt(); };\nLongType.prototype.toJSON = function () { return 'long'; };\nLongType.using = function (methods, noUnpack) {\n methods = methods || {}; // Will give a more helpful error message.\n // We map some of the methods to a different name to be able to intercept\n // their input and output (otherwise we wouldn't be able to perform any\n // unpacking logic, and the type wouldn't work when nested).\n var mapping = {\n toBuffer: '_toBuffer',\n fromBuffer: '_fromBuffer',\n fromJSON: '_fromJSON',\n toJSON: '_toJSON',\n isValid: '_isValid',\n compare: 'compare'\n };\n var type = new AbstractLongType(noUnpack);\n Object.keys(mapping).forEach(function (name) {\n if (methods[name] === undefined) {\n throw new Error(f('missing method implementation: %s', name));\n }\n type[mapping[name]] = methods[name];\n });\n return type;\n};\n\n/**\n * Floats.\n *\n */\nfunction FloatType() { PrimitiveType.call(this); }\nutil.inherits(FloatType, PrimitiveType);\nFloatType.prototype._check = function (val, cb) {\n var b = typeof val == 'number';\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\nFloatType.prototype._read = function (tap) { return tap.readFloat(); };\nFloatType.prototype._skip = function (tap) { tap.skipFloat(); };\nFloatType.prototype._write = function (tap, val) {\n if (typeof val != 'number') {\n throwInvalidError(null, val, this);\n }\n tap.writeFloat(val);\n};\nFloatType.prototype._match = function (tap1, tap2) {\n return tap1.matchFloat(tap2);\n};\nFloatType.prototype._updateResolver = function (resolver, type) {\n if (\n type instanceof FloatType ||\n type instanceof LongType ||\n type instanceof IntType\n ) {\n resolver._read = type._read;\n }\n};\nFloatType.prototype.random = function () { return RANDOM.nextFloat(1e3); };\nFloatType.prototype.toJSON = function () { return 'float'; };\n\n/**\n * Doubles.\n *\n */\nfunction DoubleType() { PrimitiveType.call(this); }\nutil.inherits(DoubleType, PrimitiveType);\nDoubleType.prototype._check = function (val, cb) {\n var b = typeof val == 'number';\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\nDoubleType.prototype._read = function (tap) { return tap.readDouble(); };\nDoubleType.prototype._skip = function (tap) { tap.skipDouble(); };\nDoubleType.prototype._write = function (tap, val) {\n if (typeof val != 'number') {\n throwInvalidError(null, val, this);\n }\n tap.writeDouble(val);\n};\nDoubleType.prototype._match = function (tap1, tap2) {\n return tap1.matchDouble(tap2);\n};\nDoubleType.prototype._updateResolver = function (resolver, type) {\n if (\n type instanceof DoubleType ||\n type instanceof FloatType ||\n type instanceof LongType ||\n type instanceof IntType\n ) {\n resolver._read = type._read;\n }\n};\nDoubleType.prototype.random = function () { return RANDOM.nextFloat(); };\nDoubleType.prototype.toJSON = function () { return 'double'; };\n\n/**\n * Strings.\n *\n */\nfunction StringType() { PrimitiveType.call(this); }\nutil.inherits(StringType, PrimitiveType);\nStringType.prototype._check = function (val, cb) {\n var b = typeof val == 'string';\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\nStringType.prototype._read = function (tap) { return tap.readString(); };\nStringType.prototype._skip = function (tap) { tap.skipString(); };\nStringType.prototype._write = function (tap, val) {\n if (typeof val != 'string') {\n throwInvalidError(null, val, this);\n }\n tap.writeString(val);\n};\nStringType.prototype._match = function (tap1, tap2) {\n return tap1.matchString(tap2);\n};\nStringType.prototype._updateResolver = function (resolver, type) {\n if (type instanceof StringType || type instanceof BytesType) {\n resolver._read = this._read;\n }\n};\nStringType.prototype.random = function () {\n return RANDOM.nextString(RANDOM.nextInt(32));\n};\nStringType.prototype.toJSON = function () { return 'string'; };\n\n/**\n * Bytes.\n *\n * These are represented in memory as `Buffer`s rather than binary-encoded\n * strings. This is more efficient (when decoding/encoding from bytes, the\n * common use-case), idiomatic, and convenient.\n *\n * Note the coercion in `_copy`.\n *\n */\nfunction BytesType() { PrimitiveType.call(this); }\nutil.inherits(BytesType, PrimitiveType);\nBytesType.prototype._check = function (val, cb) {\n var b = Buffer.isBuffer(val);\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\nBytesType.prototype._read = function (tap) { return tap.readBytes(); };\nBytesType.prototype._skip = function (tap) { tap.skipBytes(); };\nBytesType.prototype._write = function (tap, val) {\n if (!Buffer.isBuffer(val)) {\n throwInvalidError(null, val, this);\n }\n tap.writeBytes(val);\n};\nBytesType.prototype._match = function (tap1, tap2) {\n return tap1.matchBytes(tap2);\n};\nBytesType.prototype._updateResolver = StringType.prototype._updateResolver;\nBytesType.prototype._copy = function (obj, opts) {\n var buf;\n switch ((opts && opts.coerce) | 0) {\n case 3: // Coerce buffers to strings.\n this._check(obj, throwInvalidError);\n return obj.toString('binary');\n case 2: // Coerce strings to buffers.\n if (typeof obj != 'string') {\n throw new Error(f('cannot coerce to buffer: %j', obj));\n }\n buf = new Buffer(obj, 'binary');\n this._check(buf, throwInvalidError);\n return buf;\n case 1: // Coerce buffer JSON representation to buffers.\n if (!obj || obj.type !== 'Buffer' || !(obj.data instanceof Array)) {\n throw new Error(f('cannot coerce to buffer: %j', obj));\n }\n buf = new Buffer(obj.data);\n this._check(buf, throwInvalidError);\n return buf;\n default: // Copy buffer.\n this._check(obj, throwInvalidError);\n return new Buffer(obj);\n }\n};\nBytesType.prototype.compare = Buffer.compare;\nBytesType.prototype.random = function () {\n return RANDOM.nextBuffer(RANDOM.nextInt(32));\n};\nBytesType.prototype.toJSON = function () { return 'bytes'; };\n\n/**\n * Avro unions.\n *\n * Unions are represented in memory similarly to their JSON representation\n * (i.e. inside an object with single key the name of the contained type).\n *\n * This is not ideal, but is the most efficient way to unambiguously support\n * all unions. Here are a few reasons why the wrapping object is necessary:\n *\n * + Unions with multiple number types would have undefined behavior, unless\n * numbers are wrapped (either everywhere, leading to large performance and\n * convenience costs; or only when necessary inside unions, making it hard to\n * understand when numbers are wrapped or not).\n * + Fixed types would have to be wrapped to be distinguished from bytes.\n * + Using record's constructor names would work (after a slight change to use\n * the fully qualified name), but would mean that generic objects could no\n * longer be valid records (making it inconvenient to do simple things like\n * creating new records).\n *\n * Lore: In the past (until d304cab), there used to be an \"unwrapped union\n * type\" which directly exposed its values, without the wrapping object\n * (similarly to Avro's python implementation). It was removed to keep all\n * representations consistent and make this library simpler to understand\n * (conversions, e.g. for schema evolution, between representations were\n * particularly confusing). Encoding was also much slower (worst case\n * complexity linear in the number of types in the union).\n *\n */\nfunction UnionType(attrs, opts) {\n if (!(attrs instanceof Array)) {\n throw new Error(f('non-array union schema: %j', attrs));\n }\n if (!attrs.length) {\n throw new Error('empty union');\n }\n\n opts = getOpts(attrs, opts);\n Type.call(this);\n this._types = attrs.map(function (obj) { return createType(obj, opts); });\n\n this._indices = {};\n this._types.forEach(function (type, i) {\n if (type instanceof UnionType) {\n throw new Error('unions cannot be directly nested');\n }\n var name = type._name || getTypeName(type);\n if (this._indices[name] !== undefined) {\n throw new Error(f('duplicate union name: %j', name));\n }\n this._indices[name] = i;\n }, this);\n\n this._constructors = this._types.map(function (type) {\n // jshint -W054\n var name = type._name || getTypeName(type);\n if (name === 'null') {\n return null;\n }\n var body;\n if (~name.indexOf('.')) { // Qualified name.\n body = 'this[\\'' + name + '\\'] = val;';\n } else {\n body = 'this.' + name + ' = val;';\n }\n return new Function('val', body);\n });\n}\nutil.inherits(UnionType, Type);\n\nUnionType.prototype._check = function (val, cb) {\n var b = false;\n if (val === null) {\n // Shortcut type lookup in this case.\n b = this._indices['null'] !== undefined;\n } else if (typeof val == 'object') {\n var keys = Object.keys(val);\n if (keys.length === 1) {\n // We require a single key here to ensure that writes are correct and\n // efficient as soon as a record passes this check.\n var name = keys[0];\n var index = this._indices[name];\n if (index !== undefined) {\n PATH.push(name);\n b = this._types[index]._check(val[name], cb);\n PATH.pop();\n return b;\n }\n }\n }\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\n\nUnionType.prototype._read = function (tap) {\n var index = tap.readLong();\n var Class = this._constructors[index];\n if (Class) {\n return new Class(this._types[index]._read(tap));\n } else if (Class === null) {\n return null;\n } else {\n throw new Error(f('invalid union index: %s', index));\n }\n};\n\nUnionType.prototype._skip = function (tap) {\n this._types[tap.readLong()]._skip(tap);\n};\n\nUnionType.prototype._write = function (tap, val) {\n var index, keys, name;\n if (val === null) {\n index = this._indices['null'];\n if (index === undefined) {\n throwInvalidError(null, val, this);\n }\n tap.writeLong(index);\n } else {\n keys = Object.keys(val);\n if (keys.length === 1) {\n name = keys[0];\n index = this._indices[name];\n }\n if (index === undefined) {\n throwInvalidError(null, val, this);\n }\n tap.writeLong(index);\n this._types[index]._write(tap, val[name]);\n }\n};\n\nUnionType.prototype._match = function (tap1, tap2) {\n var n1 = tap1.readLong();\n var n2 = tap2.readLong();\n if (n1 === n2) {\n return this._types[n1]._match(tap1, tap2);\n } else {\n return n1 < n2 ? -1 : 1;\n }\n};\n\nUnionType.prototype._updateResolver = function (resolver, type, opts) {\n // jshint -W083\n // (The loop exits after the first function is created.)\n var i, l, typeResolver, Class;\n for (i = 0, l = this._types.length; i < l; i++) {\n try {\n typeResolver = this._types[i].createResolver(type, opts);\n } catch (err) {\n continue;\n }\n Class = this._constructors[i];\n if (Class) {\n resolver._read = function (tap) {\n return new Class(typeResolver._read(tap));\n };\n } else {\n resolver._read = function () { return null; };\n }\n return;\n }\n};\n\nUnionType.prototype._copy = function (val, opts) {\n var wrap = opts && opts.wrap | 0;\n if (wrap === 2) {\n // Promote into first type (used for schema defaults).\n if (val === null && this._constructors[0] === null) {\n return null;\n }\n return new this._constructors[0](this._types[0]._copy(val, opts));\n }\n if (val === null && this._indices['null'] !== undefined) {\n return null;\n }\n\n var i, l, obj;\n if (typeof val == 'object') {\n var keys = Object.keys(val);\n if (keys.length === 1) {\n var name = keys[0];\n i = this._indices[name];\n if (i === undefined) {\n // We are a bit more flexible than in `_check` here since we have\n // to deal with other serializers being less strict, so we fall\n // back to looking up unqualified names.\n var j, type;\n for (j = 0, l = this._types.length; j < l; j++) {\n type = this._types[j];\n if (type._name && name === unqualify(type._name)) {\n i = j;\n break;\n }\n }\n }\n if (i !== undefined) {\n obj = this._types[i]._copy(val[name], opts);\n }\n }\n }\n if (wrap === 1 && obj === undefined) {\n // Try promoting into first match (convenience, slow).\n i = 0;\n l = this._types.length;\n while (i < l && obj === undefined) {\n try {\n obj = this._types[i]._copy(val, opts);\n } catch (err) {\n i++;\n }\n }\n }\n if (obj !== undefined) {\n return new this._constructors[i](obj);\n }\n throwInvalidError(null, val, this);\n};\n\nUnionType.prototype.compare = function (val1, val2) {\n var name1 = val1 === null ? 'null' : Object.keys(val1)[0];\n var name2 = val2 === null ? 'null' : Object.keys(val2)[0];\n var index = this._indices[name1];\n if (name1 === name2) {\n return name1 === 'null' ?\n 0 :\n this._types[index].compare(val1[name1], val2[name1]);\n } else {\n return utils.compare(index, this._indices[name2]);\n }\n};\n\nUnionType.prototype.getTypes = function () { return this._types.slice(); };\n\nUnionType.prototype.random = function () {\n var index = RANDOM.nextInt(this._types.length);\n var Class = this._constructors[index];\n if (!Class) {\n return null;\n }\n return new Class(this._types[index].random());\n};\n\nUnionType.prototype.toJSON = function () { return this._types; };\n\n/**\n * Avro enum type.\n *\n * Represented as strings (with allowed values from the set of symbols). Using\n * integers would be a reasonable option, but the performance boost is arguably\n * offset by the legibility cost and the extra deviation from the JSON encoding\n * convention.\n *\n * An integer representation can still be used (e.g. for compatibility with\n * TypeScript `enum`s) by overriding the `EnumType` with a `LongType` (e.g. via\n * `parse`'s registry).\n *\n */\nfunction EnumType(attrs, opts) {\n if (!(attrs.symbols instanceof Array) || !attrs.symbols.length) {\n throw new Error(f('invalid %j enum symbols: %j', attrs.name, attrs));\n }\n\n opts = getOpts(attrs, opts);\n var resolutions = resolveNames(attrs, opts.namespace);\n this._name = resolutions.name;\n this._symbols = attrs.symbols;\n this._aliases = resolutions.aliases;\n Type.call(this, opts.registry);\n\n this._indices = {};\n this._symbols.forEach(function (symbol, i) {\n if (!NAME_PATTERN.test(symbol)) {\n throw new Error(f('invalid %s symbol: %j', this, symbol));\n }\n if (this._indices[symbol] !== undefined) {\n throw new Error(f('duplicate %s symbol: %j', this, symbol));\n }\n this._indices[symbol] = i;\n }, this);\n}\nutil.inherits(EnumType, Type);\n\nEnumType.prototype._check = function (val, cb) {\n var b = this._indices[val] !== undefined;\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\n\nEnumType.prototype._read = function (tap) {\n var index = tap.readLong();\n var symbol = this._symbols[index];\n if (symbol === undefined) {\n throw new Error(f('invalid %s enum index: %s', this._name, index));\n }\n return symbol;\n};\n\nEnumType.prototype._skip = function (tap) { tap.skipLong(); };\n\nEnumType.prototype._write = function (tap, val) {\n var index = this._indices[val];\n if (index === undefined) {\n throwInvalidError(null, val, this);\n }\n tap.writeLong(index);\n};\n\nEnumType.prototype._match = function (tap1, tap2) {\n return tap1.matchLong(tap2);\n};\n\nEnumType.prototype.compare = function (val1, val2) {\n return utils.compare(this._indices[val1], this._indices[val2]);\n};\n\nEnumType.prototype._updateResolver = function (resolver, type) {\n var symbols = this._symbols;\n if (\n type instanceof EnumType &&\n ~getAliases(this).indexOf(type._name) &&\n type._symbols.every(function (s) { return ~symbols.indexOf(s); })\n ) {\n resolver._symbols = type._symbols;\n resolver._read = type._read;\n }\n};\n\nEnumType.prototype._copy = function (val) {\n this._check(val, throwInvalidError);\n return val;\n};\n\nEnumType.prototype.getAliases = function () { return this._aliases; };\n\nEnumType.prototype.getSymbols = function () { return this._symbols.slice(); };\n\nEnumType.prototype.random = function () {\n return RANDOM.choice(this._symbols);\n};\n\nEnumType.prototype.toJSON = function () {\n return {name: this._name, type: 'enum', symbols: this._symbols};\n};\n\n/**\n * Avro fixed type.\n *\n * Represented simply as a `Buffer`.\n *\n */\nfunction FixedType(attrs, opts) {\n if (attrs.size !== (attrs.size | 0) || attrs.size < 1) {\n throw new Error(f('invalid %j fixed size: %j', attrs.name, attrs.size));\n }\n\n opts = getOpts(attrs, opts);\n var resolutions = resolveNames(attrs, opts.namespace);\n this._name = resolutions.name;\n this._size = attrs.size | 0;\n this._aliases = resolutions.aliases;\n Type.call(this, opts.registry);\n}\nutil.inherits(FixedType, Type);\n\nFixedType.prototype._check = function (val, cb) {\n var b = Buffer.isBuffer(val) && val.length === this._size;\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\n\nFixedType.prototype._read = function (tap) {\n return tap.readFixed(this._size);\n};\n\nFixedType.prototype._skip = function (tap) {\n tap.skipFixed(this._size);\n};\n\nFixedType.prototype._write = function (tap, val) {\n if (!Buffer.isBuffer(val) || val.length !== this._size) {\n throwInvalidError(null, val, this);\n }\n tap.writeFixed(val, this._size);\n};\n\nFixedType.prototype._match = function (tap1, tap2) {\n return tap1.matchFixed(tap2, this._size);\n};\n\nFixedType.prototype.compare = Buffer.compare;\n\nFixedType.prototype._updateResolver = function (resolver, type) {\n if (\n type instanceof FixedType &&\n this._size === type._size &&\n ~getAliases(this).indexOf(type._name)\n ) {\n resolver._size = this._size;\n resolver._read = this._read;\n }\n};\n\nFixedType.prototype._copy = BytesType.prototype._copy;\n\nFixedType.prototype.getAliases = function () { return this._aliases; };\n\nFixedType.prototype.getSize = function () { return this._size; };\n\nFixedType.prototype.random = function () {\n return RANDOM.nextBuffer(this._size);\n};\n\nFixedType.prototype.toJSON = function () {\n return {name: this._name, type: 'fixed', size: this._size};\n};\n\n/**\n * Avro map.\n *\n * Represented as vanilla objects.\n *\n */\nfunction MapType(attrs, opts) {\n if (!attrs.values) {\n throw new Error(f('missing map values: %j', attrs));\n }\n\n opts = getOpts(attrs, opts);\n Type.call(this);\n this._values = createType(attrs.values, opts);\n}\nutil.inherits(MapType, Type);\n\nMapType.prototype.getValuesType = function () { return this._values; };\n\nMapType.prototype._check = function (val, cb) {\n if (!val || typeof val != 'object' || val instanceof Array) {\n if (cb) {\n cb(PATH.slice(), val, this);\n }\n return false;\n }\n\n var keys = Object.keys(val);\n var b = true;\n var i, l, j, key;\n if (cb) {\n // Slow path.\n j = PATH.length;\n PATH.push('');\n for (i = 0, l = keys.length; i < l; i++) {\n key = PATH[j] = keys[i];\n if (!this._values._check(val[key], cb)) {\n b = false;\n }\n }\n PATH.pop();\n } else {\n for (i = 0, l = keys.length; i < l; i++) {\n if (!this._values._check(val[keys[i]], cb)) {\n return false;\n }\n }\n }\n return b;\n};\n\nMapType.prototype._read = function (tap) {\n var values = this._values;\n var val = {};\n var n;\n while ((n = readArraySize(tap))) {\n while (n--) {\n var key = tap.readString();\n val[key] = values._read(tap);\n }\n }\n return val;\n};\n\nMapType.prototype._skip = function (tap) {\n var values = this._values;\n var len, n;\n while ((n = tap.readLong())) {\n if (n < 0) {\n len = tap.readLong();\n tap.pos += len;\n } else {\n while (n--) {\n tap.skipString();\n values._skip(tap);\n }\n }\n }\n};\n\nMapType.prototype._write = function (tap, val) {\n if (!val || typeof val != 'object' || val instanceof Array) {\n throwInvalidError(null, val, this);\n }\n\n var values = this._values;\n var keys = Object.keys(val);\n var n = keys.length;\n var i, key;\n if (n) {\n tap.writeLong(n);\n for (i = 0; i < n; i++) {\n key = keys[i];\n tap.writeString(key);\n values._write(tap, val[key]);\n }\n }\n tap.writeLong(0);\n};\n\nMapType.prototype._match = function () {\n throw new Error('maps cannot be compared');\n};\n\nMapType.prototype._updateResolver = function (resolver, type, opts) {\n if (type instanceof MapType) {\n resolver._values = this._values.createResolver(type._values, opts);\n resolver._read = this._read;\n }\n};\n\nMapType.prototype._copy = function (val, opts) {\n if (val && typeof val == 'object' && !(val instanceof Array)) {\n var values = this._values;\n var keys = Object.keys(val);\n var i, l, key;\n var copy = {};\n for (i = 0, l = keys.length; i < l; i++) {\n key = keys[i];\n copy[key] = values._copy(val[key], opts);\n }\n return copy;\n }\n throwInvalidError(null, val, this);\n};\n\nMapType.prototype.compare = MapType.prototype._match;\n\nMapType.prototype.random = function () {\n var val = {};\n var i, l;\n for (i = 0, l = RANDOM.nextInt(10); i < l; i++) {\n val[RANDOM.nextString(RANDOM.nextInt(20))] = this._values.random();\n }\n return val;\n};\n\nMapType.prototype.toJSON = function () {\n return {type: 'map', values: this._values};\n};\n\n/**\n * Avro array.\n *\n * Represented as vanilla arrays.\n *\n */\nfunction ArrayType(attrs, opts) {\n if (!attrs.items) {\n throw new Error(f('missing array items: %j', attrs));\n }\n\n opts = getOpts(attrs, opts);\n\n this._items = createType(attrs.items, opts);\n Type.call(this);\n}\nutil.inherits(ArrayType, Type);\n\nArrayType.prototype._check = function (val, cb) {\n if (!(val instanceof Array)) {\n if (cb) {\n cb(PATH.slice(), val, this);\n }\n return false;\n }\n\n var b = true;\n var i, l, j;\n if (cb) {\n // Slow path.\n j = PATH.length;\n PATH.push('');\n for (i = 0, l = val.length; i < l; i++) {\n PATH[j] = '' + i;\n if (!this._items._check(val[i], cb)) {\n b = false;\n }\n }\n PATH.pop();\n } else {\n for (i = 0, l = val.length; i < l; i++) {\n if (!this._items._check(val[i], cb)) {\n return false;\n }\n }\n }\n return b;\n};\n\nArrayType.prototype._read = function (tap) {\n var items = this._items;\n var val = [];\n var n;\n while ((n = tap.readLong())) {\n if (n < 0) {\n n = -n;\n tap.skipLong(); // Skip size.\n }\n while (n--) {\n val.push(items._read(tap));\n }\n }\n return val;\n};\n\nArrayType.prototype._skip = function (tap) {\n var len, n;\n while ((n = tap.readLong())) {\n if (n < 0) {\n len = tap.readLong();\n tap.pos += len;\n } else {\n while (n--) {\n this._items._skip(tap);\n }\n }\n }\n};\n\nArrayType.prototype._write = function (tap, val) {\n if (!(val instanceof Array)) {\n throwInvalidError(null, val, this);\n }\n\n var n = val.length;\n var i;\n if (n) {\n tap.writeLong(n);\n for (i = 0; i < n; i++) {\n this._items._write(tap, val[i]);\n }\n }\n tap.writeLong(0);\n};\n\nArrayType.prototype._match = function (tap1, tap2) {\n var n1 = tap1.readLong();\n var n2 = tap2.readLong();\n var f;\n while (n1 && n2) {\n f = this._items._match(tap1, tap2);\n if (f) {\n return f;\n }\n if (!--n1) {\n n1 = readArraySize(tap1);\n }\n if (!--n2) {\n n2 = readArraySize(tap2);\n }\n }\n return utils.compare(n1, n2);\n};\n\nArrayType.prototype._updateResolver = function (resolver, type, opts) {\n if (type instanceof ArrayType) {\n resolver._items = this._items.createResolver(type._items, opts);\n resolver._read = this._read;\n }\n};\n\nArrayType.prototype._copy = function (val, opts) {\n if (!(val instanceof Array)) {\n throwInvalidError(null, val, this);\n }\n var items = [];\n var i, l;\n for (i = 0, l = val.length; i < l; i++) {\n items.push(this._items._copy(val[i], opts));\n }\n return items;\n};\n\nArrayType.prototype.compare = function (val1, val2) {\n var n1 = val1.length;\n var n2 = val2.length;\n var i, l, f;\n for (i = 0, l = Math.min(n1, n2); i < l; i++) {\n if ((f = this._items.compare(val1[i], val2[i]))) {\n return f;\n }\n }\n return utils.compare(n1, n2);\n};\n\nArrayType.prototype.getItemsType = function () { return this._items; };\n\nArrayType.prototype.random = function () {\n var arr = [];\n var i, l;\n for (i = 0, l = RANDOM.nextInt(10); i < l; i++) {\n arr.push(this._items.random());\n }\n return arr;\n};\n\nArrayType.prototype.toJSON = function () {\n return {type: 'array', items: this._items};\n};\n\n/**\n * Avro record.\n *\n * Values are represented as instances of a programmatically generated\n * constructor (similar to a \"specific record\"), available via the\n * `getRecordConstructor` method. This \"specific record class\" gives\n * significant speedups over using generics objects.\n *\n * Note that vanilla objects are still accepted as valid as long as their\n * fields match (this makes it much more convenient to do simple things like\n * update nested records).\n *\n */\nfunction RecordType(attrs, opts) {\n opts = getOpts(attrs, opts);\n\n var resolutions = resolveNames(attrs, opts.namespace);\n this._name = resolutions.name;\n this._aliases = resolutions.aliases;\n this._type = attrs.type;\n // Requests shouldn't be registered since their name is only a placeholder.\n Type.call(this, this._type === 'request' ? undefined : opts.registry);\n\n if (!(attrs.fields instanceof Array)) {\n throw new Error(f('non-array %s fields', this._name));\n }\n this._fields = attrs.fields.map(function (f) {\n return new Field(f, opts);\n });\n if (utils.hasDuplicates(attrs.fields, function (f) { return f.name; })) {\n throw new Error(f('duplicate %s field name', this._name));\n }\n\n var isError = attrs.type === 'error';\n this._constructor = this._createConstructor(isError);\n this._read = this._createReader();\n this._skip = this._createSkipper();\n this._write = this._createWriter();\n this._check = this._createChecker();\n}\nutil.inherits(RecordType, Type);\n\nRecordType.prototype._createConstructor = function (isError) {\n // jshint -W054\n var outerArgs = [];\n var innerArgs = [];\n var ds = []; // Defaults.\n var innerBody = isError ? ' Error.call(this);\\n' : '';\n // Not calling `Error.captureStackTrace` because this wouldn't be compatible\n // with browsers other than Chrome.\n var i, l, field, name, getDefault;\n for (i = 0, l = this._fields.length; i < l; i++) {\n field = this._fields[i];\n getDefault = field.getDefault;\n name = field._name;\n innerArgs.push('v' + i);\n innerBody += ' ';\n if (getDefault() === undefined) {\n innerBody += 'this.' + name + ' = v' + i + ';\\n';\n } else {\n innerBody += 'if (v' + i + ' === undefined) { ';\n innerBody += 'this.' + name + ' = d' + ds.length + '(); ';\n innerBody += '} else { this.' + name + ' = v' + i + '; }\\n';\n outerArgs.push('d' + ds.length);\n ds.push(getDefault);\n }\n }\n var outerBody = 'return function ' + unqualify(this._name) + '(';\n outerBody += innerArgs.join() + ') {\\n' + innerBody + '};';\n var Record = new Function(outerArgs.join(), outerBody).apply(undefined, ds);\n\n var self = this;\n Record.getType = function () { return self; };\n Record.prototype = {\n constructor: Record,\n $clone: function (opts) { return self.clone(this, opts); },\n $compare: function (val) { return self.compare(this, val); },\n $getType: Record.getType,\n $isValid: function (opts) { return self.isValid(this, opts); },\n $toBuffer: function () { return self.toBuffer(this); },\n $toString: function (noCheck) { return self.toString(this, noCheck); }\n };\n // The names of these properties added to the prototype are prefixed with `$`\n // because it is an invalid property name in Avro but not in JavaScript.\n // (This way we are guaranteed not to be stepped over!)\n if (isError) {\n util.inherits(Record, Error);\n // Not setting the name on the prototype to be consistent with how object\n // fields are mapped to (only if defined in the schema as a field).\n }\n\n return Record;\n};\n\nRecordType.prototype._createChecker = function () {\n // jshint -W054\n var names = ['t', 'P'];\n var values = [this, PATH];\n var body = 'return function check' + unqualify(this._name) + '(val, cb) {\\n';\n body += ' if (val === null || typeof val != \\'object\\') {\\n';\n body += ' if (cb) { cb(P.slice(), val, t); }\\n';\n body += ' return false;\\n';\n body += ' }\\n';\n if (!this._fields.length) {\n // Special case, empty record. We handle this directly.\n body += ' return true;\\n';\n } else {\n for (i = 0, l = this._fields.length; i < l; i++) {\n field = this._fields[i];\n names.push('t' + i);\n values.push(field._type);\n if (field.getDefault() !== undefined) {\n body += ' var v' + i + ' = val.' + field._name + ';\\n';\n }\n }\n body += ' if (cb) {\\n';\n body += ' var b = 1;\\n';\n body += ' var j = P.length;\\n';\n body += ' P.push(\\'\\');\\n';\n var i, l, field;\n for (i = 0, l = this._fields.length; i < l; i++) {\n field = this._fields[i];\n body += ' P[j] = \\'' + field._name + '\\';\\n';\n if (field.getDefault() === undefined) {\n body += ' b &= t' + i + '._check(val.' + field._name + ', cb);\\n';\n } else {\n body += ' b &= v' + i + ' === undefined || ';\n body += 't' + i + '._check(v' + i + ', cb);\\n';\n }\n }\n body += ' P.pop();\\n';\n body += ' return !!b;\\n';\n body += ' } else {\\n return (\\n ';\n body += this._fields.map(function (field, i) {\n if (field.getDefault() === undefined) {\n return 't' + i + '._check(val.' + field._name + ')';\n } else {\n return '(v' + i + ' === undefined || t' + i + '._check(v' + i + '))';\n }\n }).join(' &&\\n ');\n body += '\\n );\\n }\\n';\n }\n body += '};';\n return new Function(names.join(), body).apply(undefined, values);\n};\n\nRecordType.prototype._createReader = function () {\n // jshint -W054\n var uname = unqualify(this._name);\n var names = [];\n var values = [this._constructor];\n var i, l;\n for (i = 0, l = this._fields.length; i < l; i++) {\n names.push('t' + i);\n values.push(this._fields[i]._type);\n }\n var body = 'return function read' + uname + '(tap) {\\n';\n body += ' return new ' + uname + '(';\n body += names.map(function (t) { return t + '._read(tap)'; }).join();\n body += ');\\n};';\n names.unshift(uname);\n // We can do this since the JS spec guarantees that function arguments are\n // evaluated from left to right.\n return new Function(names.join(), body).apply(undefined, values);\n};\n\nRecordType.prototype._createSkipper = function () {\n // jshint -W054\n var args = [];\n var body = 'return function skip' + unqualify(this._name) + '(tap) {\\n';\n var values = [];\n var i, l;\n for (i = 0, l = this._fields.length; i < l; i++) {\n args.push('t' + i);\n values.push(this._fields[i]._type);\n body += ' t' + i + '._skip(tap);\\n';\n }\n body += '}';\n return new Function(args.join(), body).apply(undefined, values);\n};\n\nRecordType.prototype._createWriter = function () {\n // jshint -W054\n // We still do default handling here, in case a normal JS object is passed.\n var args = [];\n var body = 'return function write' + unqualify(this._name) + '(tap, val) {\\n';\n var values = [];\n var i, l, field, value;\n for (i = 0, l = this._fields.length; i < l; i++) {\n field = this._fields[i];\n args.push('t' + i);\n values.push(field._type);\n body += ' ';\n if (field.getDefault() === undefined) {\n body += 't' + i + '._write(tap, val.' + field._name + ');\\n';\n } else {\n value = field._type.toBuffer(field.getDefault()).toString('binary');\n // Convert the default value to a binary string ahead of time. We aren't\n // converting it to a buffer to avoid retaining too much memory. If we\n // had our own buffer pool, this could be an idea in the future.\n args.push('d' + i);\n values.push(value);\n body += 'var v' + i + ' = val.' + field._name + '; ';\n body += 'if (v' + i + ' === undefined) { ';\n body += 'tap.writeBinary(d' + i + ', ' + value.length + ');';\n body += ' } else { t' + i + '._write(tap, v' + i + '); }\\n';\n }\n }\n body += '}';\n return new Function(args.join(), body).apply(undefined, values);\n};\n\nRecordType.prototype._updateResolver = function (resolver, type, opts) {\n // jshint -W054\n if (!~getAliases(this).indexOf(type._name)) {\n throw new Error(f('no alias for %s in %s', type._name, this._name));\n }\n\n var rFields = this._fields;\n var wFields = type._fields;\n var wFieldsMap = utils.toMap(wFields, function (f) { return f._name; });\n\n var innerArgs = []; // Arguments for reader constructor.\n var resolvers = {}; // Resolvers keyed by writer field name.\n var i, j, field, name, names, matches;\n for (i = 0; i < rFields.length; i++) {\n field = rFields[i];\n names = getAliases(field);\n matches = [];\n for (j = 0; j < names.length; j++) {\n name = names[j];\n if (wFieldsMap[name]) {\n matches.push(name);\n }\n }\n if (matches.length > 1) {\n throw new Error(f('multiple matches for %s', field.name));\n }\n if (!matches.length) {\n if (field.getDefault() === undefined) {\n throw new Error(f('no match for default-less %s', field.name));\n }\n innerArgs.push('undefined');\n } else {\n name = matches[0];\n resolvers[name] = {\n resolver: field._type.createResolver(wFieldsMap[name]._type, opts),\n name: field._name // Reader field name.\n };\n innerArgs.push(field._name);\n }\n }\n\n // See if we can add a bypass for unused fields at the end of the record.\n var lazyIndex = -1;\n i = wFields.length;\n while (i && resolvers[wFields[--i]._name] === undefined) {\n lazyIndex = i;\n }\n\n var uname = unqualify(this._name);\n var args = [uname];\n var values = [this._constructor];\n var body = ' return function read' + uname + '(tap,lazy) {\\n';\n for (i = 0; i < wFields.length; i++) {\n if (i === lazyIndex) {\n body += ' if (!lazy) {\\n';\n }\n field = type._fields[i];\n name = field._name;\n body += (~lazyIndex && i >= lazyIndex) ? ' ' : ' ';\n if (resolvers[name] === undefined) {\n args.push('t' + i);\n values.push(field._type);\n body += 't' + i + '._skip(tap);\\n';\n } else {\n args.push('t' + i);\n values.push(resolvers[name].resolver);\n body += 'var ' + resolvers[name].name + ' = ';\n body += 't' + i + '._read(tap);\\n';\n }\n }\n if (~lazyIndex) {\n body += ' }\\n';\n }\n body += ' return new ' + uname + '(' + innerArgs.join() + ');\\n};';\n\n resolver._read = new Function(args.join(), body).apply(undefined, values);\n};\n\nRecordType.prototype._match = function (tap1, tap2) {\n var fields = this._fields;\n var i, l, field, order, type;\n for (i = 0, l = fields.length; i < l; i++) {\n field = fields[i];\n order = field._order;\n type = field._type;\n if (order) {\n order *= type._match(tap1, tap2);\n if (order) {\n return order;\n }\n } else {\n type._skip(tap1);\n type._skip(tap2);\n }\n }\n return 0;\n};\n\nRecordType.prototype._copy = function (val, opts) {\n // jshint -W058\n var hook = opts && opts.fieldHook;\n var values = [undefined];\n var i, l, field, value;\n for (i = 0, l = this._fields.length; i < l; i++) {\n field = this._fields[i];\n value = field._type._copy(typeof val[field._name] == 'undefined' ? field.getDefault() : val[field._name], opts);\n if (hook) {\n value = hook(field, value, this);\n }\n values.push(value);\n }\n return new (this._constructor.bind.apply(this._constructor, values));\n};\n\nRecordType.prototype.compare = function (val1, val2) {\n var fields = this._fields;\n var i, l, field, name, order, type;\n for (i = 0, l = fields.length; i < l; i++) {\n field = fields[i];\n name = field._name;\n order = field._order;\n type = field._type;\n if (order) {\n order *= type.compare(val1[name], val2[name]);\n if (order) {\n return order;\n }\n }\n }\n return 0;\n};\n\nRecordType.prototype.random = function () {\n // jshint -W058\n var fields = this._fields.map(function (f) { return f._type.random(); });\n fields.unshift(undefined);\n return new (this._constructor.bind.apply(this._constructor, fields));\n};\n\nRecordType.prototype.getAliases = function () { return this._aliases; };\n\nRecordType.prototype.getFields = function () { return this._fields.slice(); };\n\nRecordType.prototype.getRecordConstructor = function () {\n return this._constructor;\n};\n\nRecordType.prototype.toJSON = function () {\n return {name: this._name, type: 'record', fields: this._fields};\n};\n\n/**\n * Derived type abstract class.\n *\n */\nfunction LogicalType(attrs, opts, Types) {\n Type.call(this);\n LOGICAL_TYPE = this;\n this._underlyingType = createType(attrs, opts);\n\n // Convenience type check.\n if (Types && !~Types.indexOf(this._underlyingType.constructor)) {\n var lType = attrs.logicalType;\n var uType = this._underlyingType;\n throw new Error(f('invalid underlying type for %s: %s', lType, uType));\n }\n}\nutil.inherits(LogicalType, Type);\n\nLogicalType.prototype.getUnderlyingType = function () {\n return this._underlyingType;\n};\n\nLogicalType.prototype._read = function (tap) {\n return this._fromValue(this._underlyingType._read(tap));\n};\n\nLogicalType.prototype._write = function (tap, any) {\n this._underlyingType._write(tap, this._toValue(any));\n};\n\nLogicalType.prototype._check = function (any, cb) {\n var val;\n try {\n val = this._toValue(any);\n } catch (err) {\n if (cb) {\n cb(PATH.slice(), any, this);\n }\n return false;\n }\n return this._underlyingType._check(val, cb);\n};\n\nLogicalType.prototype._copy = function (any, opts) {\n var type = this._underlyingType;\n switch (opts && opts.coerce) {\n case 3: // To string.\n return type._copy(this._toValue(any), opts);\n case 2: // From string.\n return this._fromValue(type._copy(any, opts));\n default: // Normal copy.\n return this._fromValue(type._copy(this._toValue(any), opts));\n }\n};\n\nLogicalType.prototype._updateResolver = function (resolver, type, opts) {\n var _fromValue = this._resolve(type, opts);\n if (_fromValue) {\n resolver._read = function (tap) { return _fromValue(type._read(tap)); };\n }\n};\n\nLogicalType.prototype.random = function () {\n return this._fromValue(this._underlyingType.random());\n};\n\nLogicalType.prototype.compare = function (obj1, obj2) {\n var val1 = this._toValue(obj1);\n var val2 = this._toValue(obj2);\n return this._underlyingType.compare(val1, val2);\n};\n\nLogicalType.prototype.toJSON = function () {\n return this._underlyingType.toJSON();\n};\n\n// Methods to be implemented.\nLogicalType.prototype._fromValue = utils.abstractFunction;\nLogicalType.prototype._toValue = utils.abstractFunction;\nLogicalType.prototype._resolve = utils.abstractFunction;\n\n\n// General helpers.\n\n/**\n * Customizable long.\n *\n * This allows support of arbitrarily large long (e.g. larger than\n * `Number.MAX_SAFE_INTEGER`). See `LongType.using` method above.\n *\n */\nfunction AbstractLongType(noUnpack) {\n LongType.call(this);\n this._noUnpack = !!noUnpack;\n}\nutil.inherits(AbstractLongType, LongType);\n\nAbstractLongType.prototype._check = function (val, cb) {\n var b = this._isValid(val);\n if (!b && cb) {\n cb(PATH.slice(), val, this);\n }\n return b;\n};\n\nAbstractLongType.prototype._read = function (tap) {\n var buf, pos;\n if (this._noUnpack) {\n pos = tap.pos;\n tap.skipLong();\n buf = tap.buf.slice(pos, tap.pos);\n } else {\n buf = tap.unpackLongBytes(tap);\n }\n if (tap.isValid()) {\n return this._fromBuffer(buf);\n }\n};\n\nAbstractLongType.prototype._write = function (tap, val) {\n if (!this._isValid(val)) {\n throwInvalidError(null, val, this);\n }\n var buf = this._toBuffer(val);\n if (this._noUnpack) {\n tap.writeFixed(buf);\n } else {\n tap.packLongBytes(buf);\n }\n};\n\nAbstractLongType.prototype._copy = function (val, opts) {\n switch (opts && opts.coerce) {\n case 3: // To string.\n return this._toJSON(val);\n case 2: // From string.\n return this._fromJSON(val);\n default: // Normal copy.\n // Slow but guarantees most consistent results. Faster alternatives would\n // require assumptions on the long class used (e.g. immutability).\n return this._fromJSON(JSON.parse(JSON.stringify(this._toJSON(val))));\n }\n};\n\nAbstractLongType.prototype.random = function () {\n return this._fromJSON(LongType.prototype.random());\n};\n\n// Methods to be implemented by the user.\nAbstractLongType.prototype._fromBuffer = utils.abstractFunction;\nAbstractLongType.prototype._toBuffer = utils.abstractFunction;\nAbstractLongType.prototype._fromJSON = utils.abstractFunction;\nAbstractLongType.prototype._toJSON = utils.abstractFunction;\nAbstractLongType.prototype._isValid = utils.abstractFunction;\nAbstractLongType.prototype.compare = utils.abstractFunction;\n\n/**\n * Field.\n *\n * @param attrs {Object} The field's schema.\n * @para opts {Object} Schema parsing options (the same as `Type`s').\n *\n */\nfunction Field(attrs, opts) {\n var name = attrs.name;\n if (typeof name != 'string' || !NAME_PATTERN.test(name)) {\n throw new Error(f('invalid field name: %s', name));\n }\n\n this._name = name;\n this._type = createType(attrs.type, opts);\n this._aliases = attrs.aliases || [];\n\n this._order = (function (order) {\n switch (order) {\n case 'ascending':\n return 1;\n case 'descending':\n return -1;\n case 'ignore':\n return 0;\n default:\n throw new Error(f('invalid order: %j', order));\n }\n })(attrs.order === undefined ? 'ascending' : attrs.order);\n\n var value = attrs['default'];\n if (value !== undefined) {\n // We need to convert defaults back to a valid format (unions are\n // disallowed in default definitions, only the first type of each union is\n // allowed instead).\n // http://apache-avro.679487.n3.nabble.com/field-union-default-in-Java-td1175327.html\n var type = this._type;\n var val = type._copy(value, {coerce: 2, wrap: 2});\n // The clone call above will throw an error if the default is invalid.\n if (type instanceof PrimitiveType && !(type instanceof BytesType)) {\n // These are immutable.\n this.getDefault = function () { return val; };\n } else {\n this.getDefault = function () { return type._copy(val); };\n }\n }\n}\n\nField.prototype.getAliases = function () { return this._aliases; };\n\nField.prototype.getDefault = function () {}; // Undefined default.\n\nField.prototype.getName = function () { return this._name; };\n\nField.prototype.getOrder = function () {\n return ['descending', 'ignore', 'ascending'][this._order + 1];\n};\n\nField.prototype.getType = function () { return this._type; };\n\nField.prototype.inspect = function () { return f('<Field %j>', this._name); };\n\n/**\n * Resolver to read a writer's schema as a new schema.\n *\n * @param readerType {Type} The type to convert to.\n *\n */\nfunction Resolver(readerType) {\n // Add all fields here so that all resolvers share the same hidden class.\n this._readerType = readerType;\n this._items = null;\n this._read = null;\n this._size = 0;\n this._symbols = null;\n this._values = null;\n}\n\nResolver.prototype.inspect = function () { return '<Resolver>'; };\n\n/**\n * Read a value from a tap.\n *\n * @param type {Type} The type to decode.\n * @param tap {Tap} The tap to read from. No checks are performed here.\n * @param resolver {Resolver} Optional resolver. It must match the input type.\n * @param lazy {Boolean} Skip trailing fields when using a resolver.\n *\n */\nfunction readValue(type, tap, resolver, lazy) {\n if (resolver) {\n if (resolver._readerType !== type) {\n throw new Error('invalid resolver');\n }\n return resolver._read(tap, lazy);\n } else {\n return type._read(tap);\n }\n}\n\n/**\n * Create default parsing options.\n *\n * @param attrs {Object} Schema to populate options with.\n * @param opts {Object} Base options.\n *\n */\nfunction getOpts(attrs, opts) {\n if (attrs === null) {\n // Let's be helpful for this common error.\n throw new Error('invalid type: null (did you mean \"null\"?)');\n }\n opts = opts || {};\n opts.registry = opts.registry || {};\n opts.namespace = attrs.namespace || opts.namespace;\n opts.logicalTypes = opts.logicalTypes || {};\n return opts;\n}\n\n/**\n * Resolve a schema's name and aliases.\n *\n * @param attrs {Object} True schema (can't be a string).\n * @param namespace {String} Optional parent namespace.\n * @param key {String} Key where the name should be looked up (defaults to\n * `name`).\n *\n */\nfunction resolveNames(attrs, namespace, key) {\n namespace = attrs.namespace || namespace;\n key = key || 'name';\n\n var name = attrs[key];\n if (!name) {\n throw new Error(f('missing %s property in schema: %j', key, attrs));\n }\n return {\n name: qualify(name),\n aliases: attrs.aliases ? attrs.aliases.map(qualify) : []\n };\n\n function qualify(name) {\n if (!~name.indexOf('.') && namespace) {\n name = namespace + '.' + name;\n }\n var tail = unqualify(name);\n if (isPrimitive(tail)) {\n // Primitive types cannot be defined in any namespace.\n throw new Error(f('cannot rename primitive type: %j', tail));\n }\n name.split('.').forEach(function (part) {\n if (!NAME_PATTERN.test(part)) {\n throw new Error(f('invalid name: %j', name));\n }\n });\n return name;\n }\n}\n\n/**\n * Remove namespace from a name.\n *\n * @param name {String} Full or short name.\n *\n */\nfunction unqualify(name) {\n var parts = name.split('.');\n return parts[parts.length - 1];\n}\n\n/**\n * Get all aliases for a type (including its name).\n *\n * @param obj {Type|Object} Typically a type or a field. Its aliases property\n * must exist and be an array.\n *\n */\nfunction getAliases(obj) {\n var names = [obj._name];\n var aliases = obj._aliases;\n var i, l;\n for (i = 0, l = aliases.length; i < l; i++) {\n names.push(aliases[i]);\n }\n return names;\n}\n\n/**\n * Get a type's \"type\" (as a string, e.g. `'record'`, `'string'`).\n *\n * @param type {Type} Any type.\n *\n */\nfunction getTypeName(type) {\n var obj = type.toJSON();\n return typeof obj == 'string' ? obj : obj.type;\n}\n\n/**\n * Check whether a type's name is a primitive.\n *\n * @param name {String} Type name (e.g. `'string'`, `'array'`).\n *\n */\nfunction isPrimitive(name) {\n var type = TYPES[name];\n return type !== undefined && type.prototype instanceof PrimitiveType;\n}\n\n/**\n * Get the number of elements in an array block.\n *\n * @param tap {Tap} A tap positioned at the beginning of an array block.\n *\n */\nfunction readArraySize(tap) {\n var n = tap.readLong();\n if (n < 0) {\n n = -n;\n tap.skipLong(); // Skip size.\n }\n return n;\n}\n\n/**\n * Correctly stringify an object which contains types.\n *\n * @param obj {Object} The object to stringify. Typically, a type itself or an\n * object containing types. Any types inside will be expanded only once then\n * referenced by name.\n * @param noDeref {Boolean} Always reference types by name when possible,\n * rather than expand it the first time it is encountered.\n *\n */\nfunction stringify(obj, noDeref) {\n // Since JS objects are unordered, this implementation (unfortunately)\n // relies on engines returning properties in the same order that they are\n // inserted in. This is not in the JS spec, but can be \"somewhat\" safely\n // assumed (more here: https://stackoverflow.com/q/5525795/1062617).\n return (function (registry) {\n return JSON.stringify(obj, function (key, value) {\n if (value instanceof Field) {\n return {name: value._name, type: value._type};\n } else if (value && value.name) {\n var name = value.name;\n if (noDeref || registry[name]) {\n return name;\n }\n registry[name] = true;\n }\n return value;\n });\n })({});\n}\n\n/**\n * Check whether a long can be represented without precision loss.\n *\n * @param n {Number} The number.\n *\n * Two things to note:\n *\n * + We are not using the `Number` constants for compatibility with older\n * browsers.\n * + We must remove one from each bound because of rounding errors.\n *\n */\nfunction isSafeLong(n) {\n return n >= -9007199254740990 && n <= 9007199254740990;\n}\n\n/**\n * Throw a somewhat helpful error on invalid object.\n *\n * @param path {Array} Passed from hook, but unused (because empty where this\n * function is used, since we aren't keeping track of it for effiency).\n * @param val {...} The object to reject.\n * @param type {Type} The type to check against.\n *\n * This method is mostly used from `_write` to signal an invalid object for a\n * given type. Note that this provides less information than calling `isValid`\n * with a hook since the path is not propagated (for efficiency reasons).\n *\n */\nfunction throwInvalidError(path, val, type) {\n throw new Error(f('invalid %s: %j', type, val));\n}\n\n\nmodule.exports = {\n createType: createType,\n resolveNames: resolveNames, // Protocols use the same name resolution logic.\n stringify: stringify,\n types: (function () {\n // Export the base types along with all concrete implementations.\n var obj = {Type: Type, LogicalType: LogicalType};\n var types = Object.keys(TYPES);\n var i, l, Class;\n for (i = 0, l = types.length; i < l; i++) {\n Class = TYPES[types[i]];\n obj[Class.name] = Class;\n }\n return obj;\n })()\n};\n", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "// Licensed to the Apache Software Foundation (ASF) under one or more\n// contributor license agreements. See the NOTICE file distributed with\n// this work for additional information regarding copyright ownership.\n// The ASF licenses this file to You under the Apache License, Version 2.0\n// (the \"License\"); you may not use this file except in compliance with\n// the License. You may obtain a copy of the License at\n//\n// https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nvar _ = require(\"underscore\"),\n util = require('util');\n\nvar WARNING = 'Validator API is deprecated. Please use the type API instead.';\nValidator = util.deprecate(Validator, WARNING);\nProtocolValidator = util.deprecate(ProtocolValidator, WARNING);\n\nvar AvroSpec = {\n PrimitiveTypes: ['null', 'boolean', 'int', 'long', 'float', 'double', 'bytes', 'string'],\n ComplexTypes: ['record', 'enum', 'array', 'map', 'union', 'fixed']\n};\nAvroSpec.Types = AvroSpec.PrimitiveTypes.concat(AvroSpec.ComplexTypes);\n\nvar InvalidSchemaError = function(msg) { return new Error('InvalidSchemaError: ' + msg); };\nvar InvalidProtocolError = function(msg) { return new Error('InvalidProtocolError: ' + msg); };\nvar ValidationError = function(msg) { return new Error('ValidationError: ' + msg); };\nvar ProtocolValidationError = function(msg) { return new Error('ProtocolValidationError: ' + msg); };\n\n\nfunction Record(name, namespace, fields) {\n function validateArgs(name, namespace, fields) {\n if (!_.isString(name)) {\n throw new InvalidSchemaError('Record name must be string');\n }\n\n if (!_.isNull(namespace) && !_.isUndefined(namespace) && !_.isString(namespace)) {\n throw new InvalidSchemaError('Record namespace must be string or null');\n }\n\n if (!_.isArray(fields)) {\n throw new InvalidSchemaError('Record name must be string');\n }\n }\n\n validateArgs(name, namespace, fields);\n\n this.name = name;\n this.namespace = namespace;\n this.fields = fields;\n}\n\nfunction makeFullyQualifiedTypeName(schema, namespace) {\n var typeName = null;\n if (_.isString(schema)) {\n typeName = schema;\n } else if (_.isObject(schema)) {\n if (_.isString(schema.namespace)) {\n namespace = schema.namespace;\n }\n if (_.isString(schema.name)) {\n typeName = schema.name;\n } else if (_.isString(schema.type)) {\n typeName = schema.type;\n }\n } else {\n throw new InvalidSchemaError('unable to determine fully qualified type name from schema ' + JSON.stringify(schema) + ' in namespace ' + namespace);\n }\n\n if (!_.isString(typeName)) {\n throw new InvalidSchemaError('unable to determine type name from schema ' + JSON.stringify(schema) + ' in namespace ' + namespace);\n }\n\n if (typeName.indexOf('.') !== -1) {\n return typeName;\n } else if (_.contains(AvroSpec.PrimitiveTypes, typeName)) {\n return typeName;\n } else if (_.isString(namespace)) {\n return namespace + '.' + typeName;\n } else {\n return typeName;\n }\n}\n\nfunction Union(typeSchemas, namespace) {\n this.branchNames = function() {\n return _.map(typeSchemas, function(typeSchema) { return makeFullyQualifiedTypeName(typeSchema, namespace); });\n };\n\n function validateArgs(typeSchemas) {\n if (!_.isArray(typeSchemas) || _.isEmpty(typeSchemas)) {\n throw new InvalidSchemaError('Union must have at least 1 branch');\n }\n }\n\n validateArgs(typeSchemas);\n\n this.typeSchemas = typeSchemas;\n this.namespace = namespace;\n}\n\nfunction Enum(symbols) {\n\n function validateArgs(symbols) {\n if (!_.isArray(symbols)) {\n throw new InvalidSchemaError('Enum must have array of symbols, got ' + JSON.stringify(symbols));\n }\n if (!_.all(symbols, function(symbol) { return _.isString(symbol); })) {\n throw new InvalidSchemaError('Enum symbols must be strings, got ' + JSON.stringify(symbols));\n }\n }\n\n validateArgs(symbols);\n\n this.symbols = symbols;\n}\n\nfunction AvroArray(itemSchema) {\n\n function validateArgs(itemSchema) {\n if (_.isNull(itemSchema) || _.isUndefined(itemSchema)) {\n throw new InvalidSchemaError('Array \"items\" schema should not be null or undefined');\n }\n }\n\n validateArgs(itemSchema);\n\n this.itemSchema = itemSchema;\n}\n\nfunction Map(valueSchema) {\n\n function validateArgs(valueSchema) {\n if (_.isNull(valueSchema) || _.isUndefined(valueSchema)) {\n throw new InvalidSchemaError('Map \"values\" schema should not be null or undefined');\n }\n }\n\n validateArgs(valueSchema);\n\n this.valueSchema = valueSchema;\n}\n\nfunction Field(name, schema) {\n function validateArgs(name, schema) {\n if (!_.isString(name)) {\n throw new InvalidSchemaError('Field name must be string');\n }\n }\n\n this.name = name;\n this.schema = schema;\n}\n\nfunction Primitive(type) {\n function validateArgs(type) {\n if (!_.isString(type)) {\n throw new InvalidSchemaError('Primitive type name must be a string');\n }\n\n if (!_.contains(AvroSpec.PrimitiveTypes, type)) {\n throw new InvalidSchemaError('Primitive type must be one of: ' + JSON.stringify(AvroSpec.PrimitiveTypes) + '; got ' + type);\n }\n }\n\n validateArgs(type);\n\n this.type = type;\n}\n\nfunction Validator(schema, namespace, namedTypes) {\n this.validate = function(obj) {\n return _validate(this.schema, obj);\n };\n\n var _validate = function(schema, obj) {\n if (schema instanceof Record) {\n return _validateRecord(schema, obj);\n } else if (schema instanceof Union) {\n return _validateUnion(schema, obj);\n } else if (schema instanceof Enum) {\n return _validateEnum(schema, obj);\n } else if (schema instanceof AvroArray) {\n return _validateArray(schema, obj);\n } else if (schema instanceof Map) {\n return _validateMap(schema, obj);\n } else if (schema instanceof Primitive) {\n return _validatePrimitive(schema, obj);\n } else {\n throw new InvalidSchemaError('validation not yet implemented: ' + JSON.stringify(schema));\n }\n };\n\n var _validateRecord = function(schema, obj) {\n if (!_.isObject(obj) || _.isArray(obj)) {\n throw new ValidationError('Expected record Javascript type to be non-array object, got ' + JSON.stringify(obj));\n }\n\n var schemaFieldNames = _.pluck(schema.fields, 'name').sort();\n var objFieldNames = _.keys(obj).sort();\n if (!_.isEqual(schemaFieldNames, objFieldNames)) {\n throw new ValidationError('Expected record fields ' + JSON.stringify(schemaFieldNames) + '; got ' + JSON.stringify(objFieldNames));\n }\n\n return _.all(schema.fields, function(field) {\n return _validate(field.schema, obj[field.name]);\n });\n };\n\n var _validateUnion = function(schema, obj) {\n if (_.isObject(obj)) {\n if (_.isArray(obj)) {\n throw new ValidationError('Expected union Javascript type to be non-array object (or null), got ' + JSON.stringify(obj));\n } else if (_.size(obj) !== 1) {\n throw new ValidationError('Expected union Javascript object to be object with exactly 1 key (or null), got ' + JSON.stringify(obj));\n } else {\n var unionBranch = _.keys(obj)[0];\n if (unionBranch === \"\") {\n throw new ValidationError('Expected union Javascript object to contain non-empty string branch, got ' + JSON.stringify(obj));\n }\n if (_.contains(schema.branchNames(), unionBranch)) {\n return true;\n } else {\n throw new ValidationError('Expected union branch to be one of ' + JSON.stringify(schema.branchNames()) + '; got ' + JSON.stringify(unionBranch));\n }\n }\n } else if (_.isNull(obj)) {\n if (_.contains(schema.branchNames(), 'null')) {\n return true;\n } else {\n throw new ValidationError('Expected union branch to be one of ' + JSON.stringify(schema.branchNames()) + '; got ' + JSON.stringify(obj));\n }\n } else {\n throw new ValidationError('Expected union Javascript object to be non-array object of size 1 or null, got ' + JSON.stringify(obj));\n }\n };\n\n var _validateEnum = function(schema, obj) {\n if (_.isString(obj)) {\n if (_.contains(schema.symbols, obj)) {\n return true;\n } else {\n throw new ValidationError('Expected enum value to be one of ' + JSON.stringify(schema.symbols) + '; got ' + JSON.stringify(obj));\n }\n } else {\n throw new ValidationError('Expected enum Javascript object to be string, got ' + JSON.stringify(obj));\n }\n };\n\n var _validateArray = function(schema, obj) {\n if (_.isArray(obj)) {\n return _.all(obj, function(member) { return _validate(schema.itemSchema, member); });\n } else {\n throw new ValidationError('Expected array Javascript object to be array, got ' + JSON.stringify(obj));\n }\n };\n\n var _validateMap = function(schema, obj) {\n if (_.isObject(obj) && !_.isArray(obj)) {\n return _.all(obj, function(value) { return _validate(schema.valueSchema, value); });\n } else if (_.isArray(obj)) {\n throw new ValidationError('Expected map Javascript object to be non-array object, got array ' + JSON.stringify(obj));\n } else {\n throw new ValidationError('Expected map Javascript object to be non-array object, got ' + JSON.stringify(obj));\n }\n };\n\n var _validatePrimitive = function(schema, obj) {\n switch (schema.type) {\n case 'null':\n if (_.isNull(obj) || _.isUndefined(obj)) {\n return true;\n } else {\n throw new ValidationError('Expected Javascript null or undefined for Avro null, got ' + JSON.stringify(obj));\n }\n break;\n case 'boolean':\n if (_.isBoolean(obj)) {\n return true;\n } else {\n throw new ValidationError('Expected Javascript boolean for Avro boolean, got ' + JSON.stringify(obj));\n }\n break;\n case 'int':\n if (_.isNumber(obj) && Math.floor(obj) === obj && Math.abs(obj) <= Math.pow(2, 31)) {\n return true;\n } else {\n throw new ValidationError('Expected Javascript int32 number for Avro int, got ' + JSON.stringify(obj));\n }\n break;\n case 'long':\n if (_.isNumber(obj) && Math.floor(obj) === obj && Math.abs(obj) <= Math.pow(2, 63)) {\n return true;\n } else {\n throw new ValidationError('Expected Javascript int64 number for Avro long, got ' + JSON.stringify(obj));\n }\n break;\n case 'float':\n if (_.isNumber(obj)) { // TODO: handle NaN?\n return true;\n } else {\n throw new ValidationError('Expected Javascript float number for Avro float, got ' + JSON.stringify(obj));\n }\n break;\n case 'double':\n if (_.isNumber(obj)) { // TODO: handle NaN?\n return true;\n } else {\n throw new ValidationError('Expected Javascript double number for Avro double, got ' + JSON.stringify(obj));\n }\n break;\n case 'bytes':\n throw new InvalidSchemaError('not yet implemented: ' + schema.type);\n case 'string':\n if (_.isString(obj)) { // TODO: handle NaN?\n return true;\n } else {\n throw new ValidationError('Expected Javascript string for Avro string, got ' + JSON.stringify(obj));\n }\n break;\n default:\n throw new InvalidSchemaError('unrecognized primitive type: ' + schema.type);\n }\n };\n\n // TODO: namespace handling is rudimentary. multiple namespaces within a certain nested schema definition\n // are probably buggy.\n var _namedTypes = namedTypes || {};\n var _saveNamedType = function(fullyQualifiedTypeName, schema) {\n if (_.has(_namedTypes, fullyQualifiedTypeName)) {\n if (!_.isEqual(_namedTypes[fullyQualifiedTypeName], schema)) {\n throw new InvalidSchemaError('conflicting definitions for type ' + fullyQualifiedTypeName + ': ' + JSON.stringify(_namedTypes[fullyQualifiedTypeName]) + ' and ' + JSON.stringify(schema));\n }\n } else {\n _namedTypes[fullyQualifiedTypeName] = schema;\n }\n };\n\n var _lookupTypeByFullyQualifiedName = function(fullyQualifiedTypeName) {\n if (_.has(_namedTypes, fullyQualifiedTypeName)) {\n return _namedTypes[fullyQualifiedTypeName];\n } else {\n return null;\n }\n };\n\n var _parseNamedType = function(schema, namespace) {\n if (_.contains(AvroSpec.PrimitiveTypes, schema)) {\n return new Primitive(schema);\n } else if (!_.isNull(_lookupTypeByFullyQualifiedName(makeFullyQualifiedTypeName(schema, namespace)))) {\n return _lookupTypeByFullyQualifiedName(makeFullyQualifiedTypeName(schema, namespace));\n } else {\n throw new InvalidSchemaError('unknown type name: ' + JSON.stringify(schema) + '; known type names are ' + JSON.stringify(_.keys(_namedTypes)));\n }\n };\n\n var _parseSchema = function(schema, parentSchema, namespace) {\n if (_.isNull(schema) || _.isUndefined(schema)) {\n throw new InvalidSchemaError('schema is null, in parentSchema: ' + JSON.stringify(parentSchema));\n } else if (_.isString(schema)) {\n return _parseNamedType(schema, namespace);\n } else if (_.isObject(schema) && !_.isArray(schema)) {\n if (schema.type === 'record') {\n var newRecord = new Record(schema.name, schema.namespace, _.map(schema.fields, function(field) {\n return new Field(field.name, _parseSchema(field.type, schema, schema.namespace || namespace));\n }));\n _saveNamedType(makeFullyQualifiedTypeName(schema, namespace), newRecord);\n return newRecord;\n } else if (schema.type === 'enum') {\n if (_.has(schema, 'symbols')) {\n var newEnum = new Enum(schema.symbols);\n _saveNamedType(makeFullyQualifiedTypeName(schema, namespace), newEnum);\n return newEnum;\n } else {\n throw new InvalidSchemaError('enum must specify symbols, got ' + JSON.stringify(schema));\n }\n } else if (schema.type === 'array') {\n if (_.has(schema, 'items')) {\n return new AvroArray(_parseSchema(schema.items, schema, namespace));\n } else {\n throw new InvalidSchemaError('array must specify \"items\" schema, got ' + JSON.stringify(schema));\n }\n } else if (schema.type === 'map') {\n if (_.has(schema, 'values')) {\n return new Map(_parseSchema(schema.values, schema, namespace));\n } else {\n throw new InvalidSchemaError('map must specify \"values\" schema, got ' + JSON.stringify(schema));\n }\n } else if (_.has(schema, 'type') && _.contains(AvroSpec.PrimitiveTypes, schema.type)) {\n return _parseNamedType(schema.type, namespace);\n } else {\n throw new InvalidSchemaError('not yet implemented: ' + schema.type);\n }\n } else if (_.isArray(schema)) {\n if (_.isEmpty(schema)) {\n throw new InvalidSchemaError('unions must have at least 1 branch');\n }\n var branchTypes = _.map(schema, function(branchType) { return _parseSchema(branchType, schema, namespace); });\n return new Union(branchTypes, namespace);\n } else {\n throw new InvalidSchemaError('unexpected Javascript type for schema: ' + (typeof schema));\n }\n };\n\n this.rawSchema = schema;\n this.schema = _parseSchema(schema, null, namespace);\n}\n\nValidator.validate = function(schema, obj) {\n return (new Validator(schema)).validate(obj);\n}\n\nfunction ProtocolValidator(protocol) {\n this.validate = function(typeName, obj) {\n var fullyQualifiedTypeName = makeFullyQualifiedTypeName(typeName, protocol.namespace);\n if (!_.has(_typeSchemaValidators, fullyQualifiedTypeName)) {\n throw new ProtocolValidationError('Protocol does not contain definition for type ' + JSON.stringify(fullyQualifiedTypeName) + ' (fully qualified from input \"' + typeName + '\"); known types are ' + JSON.stringify(_.keys(_typeSchemaValidators)));\n }\n return _typeSchemaValidators[fullyQualifiedTypeName].validate(obj);\n };\n\n var _typeSchemaValidators = {};\n var _initSchemaValidators = function(protocol) {\n var namedTypes = {};\n if (!_.has(protocol, 'protocol') || !_.isString(protocol.protocol)) {\n throw new InvalidProtocolError('Protocol must contain a \"protocol\" attribute with a string value');\n }\n if (_.isArray(protocol.types)) {\n _.each(protocol.types, function(typeSchema) {\n var schemaValidator = new Validator(typeSchema, protocol.namespace, namedTypes);\n var fullyQualifiedTypeName = makeFullyQualifiedTypeName(typeSchema, protocol.namespace);\n _typeSchemaValidators[fullyQualifiedTypeName] = schemaValidator;\n });\n }\n };\n\n _initSchemaValidators(protocol);\n}\n\nProtocolValidator.validate = function(protocol, typeName, obj) {\n return (new ProtocolValidator(protocol)).validate(typeName, obj);\n};\n\nif (typeof exports !== 'undefined') {\n exports['Validator'] = Validator;\n exports['ProtocolValidator'] = ProtocolValidator;\n}\n", "/* jshint browserify: true */\n\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n'use strict';\n\n/**\n * Shim entry point used when `avro` is `require`d from browserify.\n *\n * It doesn't expose any of the filesystem methods and patches a few others.\n *\n */\n\nvar Tap = require('../../lib/utils').Tap,\n schemas = require('../../lib/schemas'),\n deprecated = require('../deprecated/validator');\n\n\nfunction parse(schema, opts) {\n var obj;\n if (typeof schema == 'string') {\n try {\n obj = JSON.parse(schema);\n } catch (err) {\n // Pass. No file reading from the browser.\n }\n }\n if (obj === undefined) {\n obj = schema;\n }\n return schemas.createType(obj, opts);\n}\n\n// No utf8 and binary functions on browserify's `Buffer`, we must patch in the\n// generic slice and write equivalents.\n\nTap.prototype.readString = function () {\n var len = this.readLong();\n var pos = this.pos;\n var buf = this.buf;\n this.pos += len;\n if (this.pos > buf.length) {\n return;\n }\n return this.buf.slice(pos, pos + len).toString();\n};\n\nTap.prototype.writeString = function (s) {\n var len = Buffer.byteLength(s);\n this.writeLong(len);\n var pos = this.pos;\n this.pos += len;\n if (this.pos > this.buf.length) {\n return;\n }\n this.buf.write(s, pos);\n};\n\nTap.prototype.writeBinary = function (s, len) {\n var pos = this.pos;\n this.pos += len;\n if (this.pos > this.buf.length) {\n return;\n }\n this.buf.write(s, pos, len, 'binary');\n};\n\n\nmodule.exports = {\n parse: parse,\n types: schemas.types,\n Validator: deprecated.Validator,\n ProtocolValidator: deprecated.ProtocolValidator\n};\n", "import React, { useCallback, useEffect, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport {\n FirebaseAppProvider,\n FirebaseGalleryProvider,\n FirebaseGithubAuthProvider,\n} from \"./firebase\";\nimport { PageContext, PAGE_QUERY_ARG } from \"./page\";\nimport { pageNames, Pages, toPageName, DEFAULT_PAGE } from \"./pages\";\n\nconst APP_ID = \"app\";\n\nconst appEl = document.getElementById(APP_ID);\n\nif (!appEl) {\n throw new Error(`Unable to find #${APP_ID}!`);\n}\n\nfunction getWindowSearch(): URLSearchParams {\n return new URLSearchParams(window.location.search);\n}\n\n/**\n * Call the given handler whenever a `popstate` event\n * occurs.\n *\n * Return a function that wraps `window.history.pushState()`;\n * the given handler will be called immediately afterwards.\n */\nfunction usePushState(onPushOrPopState: () => void) {\n useEffect(() => {\n window.addEventListener(\"popstate\", onPushOrPopState);\n return () => {\n window.removeEventListener(\"popstate\", onPushOrPopState);\n };\n }, [onPushOrPopState]);\n\n return useCallback(\n function pushState(href: string) {\n window.history.pushState(null, \"\", href);\n onPushOrPopState();\n },\n [onPushOrPopState]\n );\n}\n\nconst App: React.FC<{}> = (props) => {\n const [search, setSearch] = useState(getWindowSearch());\n const updateSearchFromWindow = useCallback(\n () => setSearch(getWindowSearch()),\n []\n );\n const currPage = toPageName(search.get(PAGE_QUERY_ARG) || \"\", DEFAULT_PAGE);\n const PageComponent = Pages[currPage];\n const pushState = usePushState(updateSearchFromWindow);\n const ctx: PageContext = {\n search,\n currPage,\n allPages: pageNames,\n pushState,\n };\n\n return (\n <FirebaseAppProvider>\n <FirebaseGithubAuthProvider>\n <FirebaseGalleryProvider>\n <PageContext.Provider value={ctx}>\n <PageComponent />\n </PageContext.Provider>\n </FirebaseGalleryProvider>\n </FirebaseGithubAuthProvider>\n </FirebaseAppProvider>\n );\n};\n\nReactDOM.render(<App />, appEl);\n", "import { FirebaseApp, FirebaseOptions, initializeApp } from \"firebase/app\";\nimport {\n getAuth,\n signInWithPopup,\n GithubAuthProvider,\n onAuthStateChanged,\n signOut,\n Auth,\n User,\n} from \"firebase/auth\";\nimport {\n FirebaseFirestore,\n getFirestore,\n collection,\n getDocs,\n query,\n orderBy,\n CollectionReference,\n Timestamp,\n addDoc,\n} from \"firebase/firestore\";\nimport React, { useCallback, useContext, useEffect, useState } from \"react\";\nimport { AuthContext } from \"./auth-context\";\nimport {\n GalleryComposition,\n GalleryContext,\n GallerySubmitStatus,\n} from \"./gallery-context\";\n\nconst GALLERY_COLLECTION = \"compositions\";\n\nconst DEFAULT_APP_CONFIG: FirebaseOptions = {\n apiKey: \"AIzaSyAV1kkVvSKEicEa8rLke9o_BxYBu1rb8kw\",\n authDomain: \"mystic-addaf.firebaseapp.com\",\n projectId: \"mystic-addaf\",\n storageBucket: \"mystic-addaf.appspot.com\",\n messagingSenderId: \"26787182745\",\n appId: \"1:26787182745:web:e4fbd9439b9279fe966008\",\n measurementId: \"G-JHKRSK1PR6\",\n};\n\ntype FirebaseAppContext = {\n app: FirebaseApp;\n auth: Auth;\n provider: GithubAuthProvider;\n db: FirebaseFirestore;\n};\n\nexport const FirebaseAppContext =\n React.createContext<FirebaseAppContext | null>(null);\n\n/**\n * A Firebase app provider. Any other components that use Firebase must\n * be a child of this.\n *\n * Note this component is assumed to never be unmounted, nor\n * for its non-children props to change.\n */\nexport const FirebaseAppProvider: React.FC<{ config?: FirebaseOptions }> = ({\n config,\n children,\n}) => {\n const [value, setValue] = useState<FirebaseAppContext | null>(null);\n\n useEffect(() => {\n const app = initializeApp(config || DEFAULT_APP_CONFIG);\n const auth = getAuth(app);\n const provider = new GithubAuthProvider();\n const db = getFirestore(app);\n\n setValue({ app, auth, provider, db });\n }, [config]);\n\n return <FirebaseAppContext.Provider value={value} children={children} />;\n};\n\n/**\n * A Firebase GitHub authentication provider. Must be a child of a\n * `FirebaseAppProvider`.\n *\n * Note this component is assumed to never be unmounted.\n */\nexport const FirebaseGithubAuthProvider: React.FC<{}> = ({ children }) => {\n const appCtx = useContext(FirebaseAppContext);\n const [user, setUser] = useState<User | null>(null);\n const [error, setError] = useState<string | undefined>(undefined);\n\n const handleError = (e: Error) => setError(e.message);\n\n useEffect(() => {\n if (!appCtx) return;\n\n onAuthStateChanged(appCtx.auth, setUser);\n }, [appCtx]);\n\n const context: AuthContext = {\n loggedInUser: user && {\n id: user.uid,\n name: user.displayName || `GitHub user ${user.uid}`,\n },\n providerName: appCtx && \"GitHub\",\n error,\n login: useCallback(() => {\n setError(undefined);\n appCtx &&\n signInWithPopup(appCtx.auth, appCtx.provider).catch(handleError);\n }, [appCtx]),\n logout: useCallback(() => {\n setError(undefined);\n appCtx && signOut(appCtx.auth).catch(handleError);\n }, [appCtx]),\n };\n\n return <AuthContext.Provider value={context} children={children} />;\n};\n\ntype FirebaseCompositionDocument = Omit<\n GalleryComposition,\n \"id\" | \"createdAt\"\n> & {\n createdAt: Timestamp;\n};\n\nfunction getGalleryCollection(appCtx: FirebaseAppContext) {\n return collection(\n appCtx.db,\n GALLERY_COLLECTION\n ) as CollectionReference<FirebaseCompositionDocument>;\n}\n\nfunction docToComp(\n doc: FirebaseCompositionDocument,\n id: string\n): GalleryComposition {\n const { createdAt, ...data } = doc;\n return {\n ...data,\n id,\n createdAt: createdAt.toDate(),\n };\n}\n\nexport const FirebaseGalleryProvider: React.FC<{}> = ({ children }) => {\n const appCtx = useContext(FirebaseAppContext);\n const [compositions, setCompositions] = useState<GalleryComposition[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | undefined>(undefined);\n const [lastRefresh, setLastRefresh] = useState(0);\n const [submitStatus, setSubmitStatus] = useState<GallerySubmitStatus>(\"idle\");\n const [lastSubmission, setLastSubmission] = useState<\n GalleryComposition | undefined\n >(undefined);\n\n const context: GalleryContext = {\n compositions,\n isLoading,\n error,\n lastRefresh,\n lastSubmission,\n submitStatus,\n submit(props) {\n if (!(appCtx && submitStatus === \"idle\")) return;\n\n const doc: FirebaseCompositionDocument = {\n ...props,\n createdAt: Timestamp.now(),\n };\n\n setSubmitStatus(\"submitting\");\n setLastSubmission(undefined);\n addDoc(getGalleryCollection(appCtx), doc)\n .then((docRef) => {\n const comp = docToComp(doc, docRef.id);\n setSubmitStatus(\"idle\");\n setCompositions([comp, ...compositions]);\n setLastSubmission(comp);\n })\n .catch((e) => {\n setSubmitStatus(\"error\");\n console.log(e);\n });\n },\n refresh: useCallback(() => {\n if (!(appCtx && !isLoading)) return false;\n\n setError(undefined);\n setIsLoading(true);\n getDocs(query(getGalleryCollection(appCtx), orderBy(\"createdAt\", \"desc\")))\n .then((snapshot) => {\n setLastRefresh(Date.now());\n setIsLoading(false);\n setCompositions(\n snapshot.docs.map((doc) => docToComp(doc.data(), doc.id))\n );\n })\n .catch((e) => {\n setIsLoading(false);\n setError(e.message);\n });\n return true;\n }, [appCtx, isLoading]),\n };\n\n return <GalleryContext.Provider value={context} children={children} />;\n};\n", "import tslib from '../tslib.js';\r\nconst {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n} = tslib;\r\nexport {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n};\r\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time.\n */\n\nexport const CONSTANTS = {\n /**\n * @define {boolean} Whether this is the client Node.js SDK.\n */\n NODE_CLIENT: false,\n /**\n * @define {boolean} Whether this is the Admin Node.js SDK.\n */\n NODE_ADMIN: false,\n\n /**\n * Firebase SDK Version\n */\n SDK_VERSION: '${JSCORE_VERSION}'\n};\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CONSTANTS } from './constants';\n\n/**\n * Throws an error if the provided assertion is falsy\n */\nexport const assert = function (assertion: unknown, message: string): void {\n if (!assertion) {\n throw assertionError(message);\n }\n};\n\n/**\n * Returns an Error object suitable for throwing.\n */\nexport const assertionError = function (message: string): Error {\n return new Error(\n 'Firebase Database (' +\n CONSTANTS.SDK_VERSION +\n ') INTERNAL ASSERT FAILED: ' +\n message\n );\n};\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst stringToByteArray = function (str: string): number[] {\n // TODO(user): Use native implementations if/when available\n const out: number[] = [];\n let p = 0;\n for (let i = 0; i < str.length; i++) {\n let c = str.charCodeAt(i);\n if (c < 128) {\n out[p++] = c;\n } else if (c < 2048) {\n out[p++] = (c >> 6) | 192;\n out[p++] = (c & 63) | 128;\n } else if (\n (c & 0xfc00) === 0xd800 &&\n i + 1 < str.length &&\n (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00\n ) {\n // Surrogate Pair\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\n out[p++] = (c >> 18) | 240;\n out[p++] = ((c >> 12) & 63) | 128;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n } else {\n out[p++] = (c >> 12) | 224;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n }\n }\n return out;\n};\n\n/**\n * Turns an array of numbers into the string given by the concatenation of the\n * characters to which the numbers correspond.\n * @param bytes Array of numbers representing characters.\n * @return Stringification of the array.\n */\nconst byteArrayToString = function (bytes: number[]): string {\n // TODO(user): Use native implementations if/when available\n const out: string[] = [];\n let pos = 0,\n c = 0;\n while (pos < bytes.length) {\n const c1 = bytes[pos++];\n if (c1 < 128) {\n out[c++] = String.fromCharCode(c1);\n } else if (c1 > 191 && c1 < 224) {\n const c2 = bytes[pos++];\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\n } else if (c1 > 239 && c1 < 365) {\n // Surrogate Pair\n const c2 = bytes[pos++];\n const c3 = bytes[pos++];\n const c4 = bytes[pos++];\n const u =\n (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\n 0x10000;\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\n } else {\n const c2 = bytes[pos++];\n const c3 = bytes[pos++];\n out[c++] = String.fromCharCode(\n ((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)\n );\n }\n }\n return out.join('');\n};\n\ninterface Base64 {\n byteToCharMap_: { [key: number]: string } | null;\n charToByteMap_: { [key: string]: number } | null;\n byteToCharMapWebSafe_: { [key: number]: string } | null;\n charToByteMapWebSafe_: { [key: string]: number } | null;\n ENCODED_VALS_BASE: string;\n readonly ENCODED_VALS: string;\n readonly ENCODED_VALS_WEBSAFE: string;\n HAS_NATIVE_SUPPORT: boolean;\n encodeByteArray(input: number[] | Uint8Array, webSafe?: boolean): string;\n encodeString(input: string, webSafe?: boolean): string;\n decodeString(input: string, webSafe: boolean): string;\n decodeStringToByteArray(input: string, webSafe: boolean): number[];\n init_(): void;\n}\n\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\n// Static lookup maps, lazily populated by init_()\nexport const base64: Base64 = {\n /**\n * Maps bytes to characters.\n */\n byteToCharMap_: null,\n\n /**\n * Maps characters to bytes.\n */\n charToByteMap_: null,\n\n /**\n * Maps bytes to websafe characters.\n * @private\n */\n byteToCharMapWebSafe_: null,\n\n /**\n * Maps websafe characters to bytes.\n * @private\n */\n charToByteMapWebSafe_: null,\n\n /**\n * Our default alphabet, shared between\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\n */\n ENCODED_VALS_BASE:\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\n\n /**\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\n */\n get ENCODED_VALS() {\n return this.ENCODED_VALS_BASE + '+/=';\n },\n\n /**\n * Our websafe alphabet.\n */\n get ENCODED_VALS_WEBSAFE() {\n return this.ENCODED_VALS_BASE + '-_.';\n },\n\n /**\n * Whether this browser supports the atob and btoa functions. This extension\n * started at Mozilla but is now implemented by many browsers. We use the\n * ASSUME_* variables to avoid pulling in the full useragent detection library\n * but still allowing the standard per-browser compilations.\n *\n */\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\n\n /**\n * Base64-encode an array of bytes.\n *\n * @param input An array of bytes (numbers with\n * value in [0, 255]) to encode.\n * @param webSafe Boolean indicating we should use the\n * alternative alphabet.\n * @return The base64 encoded string.\n */\n encodeByteArray(input: number[] | Uint8Array, webSafe?: boolean): string {\n if (!Array.isArray(input)) {\n throw Error('encodeByteArray takes an array as a parameter');\n }\n\n this.init_();\n\n const byteToCharMap = webSafe\n ? this.byteToCharMapWebSafe_!\n : this.byteToCharMap_!;\n\n const output = [];\n\n for (let i = 0; i < input.length; i += 3) {\n const byte1 = input[i];\n const haveByte2 = i + 1 < input.length;\n const byte2 = haveByte2 ? input[i + 1] : 0;\n const haveByte3 = i + 2 < input.length;\n const byte3 = haveByte3 ? input[i + 2] : 0;\n\n const outByte1 = byte1 >> 2;\n const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\n let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\n let outByte4 = byte3 & 0x3f;\n\n if (!haveByte3) {\n outByte4 = 64;\n\n if (!haveByte2) {\n outByte3 = 64;\n }\n }\n\n output.push(\n byteToCharMap[outByte1],\n byteToCharMap[outByte2],\n byteToCharMap[outByte3],\n byteToCharMap[outByte4]\n );\n }\n\n return output.join('');\n },\n\n /**\n * Base64-encode a string.\n *\n * @param input A string to encode.\n * @param webSafe If true, we should use the\n * alternative alphabet.\n * @return The base64 encoded string.\n */\n encodeString(input: string, webSafe?: boolean): string {\n // Shortcut for Mozilla browsers that implement\n // a native base64 encoder in the form of \"btoa/atob\"\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\n return btoa(input);\n }\n return this.encodeByteArray(stringToByteArray(input), webSafe);\n },\n\n /**\n * Base64-decode a string.\n *\n * @param input to decode.\n * @param webSafe True if we should use the\n * alternative alphabet.\n * @return string representing the decoded value.\n */\n decodeString(input: string, webSafe: boolean): string {\n // Shortcut for Mozilla browsers that implement\n // a native base64 encoder in the form of \"btoa/atob\"\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\n return atob(input);\n }\n return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\n },\n\n /**\n * Base64-decode a string.\n *\n * In base-64 decoding, groups of four characters are converted into three\n * bytes. If the encoder did not apply padding, the input length may not\n * be a multiple of 4.\n *\n * In this case, the last group will have fewer than 4 characters, and\n * padding will be inferred. If the group has one or two characters, it decodes\n * to one byte. If the group has three characters, it decodes to two bytes.\n *\n * @param input Input to decode.\n * @param webSafe True if we should use the web-safe alphabet.\n * @return bytes representing the decoded value.\n */\n decodeStringToByteArray(input: string, webSafe: boolean): number[] {\n this.init_();\n\n const charToByteMap = webSafe\n ? this.charToByteMapWebSafe_!\n : this.charToByteMap_!;\n\n const output: number[] = [];\n\n for (let i = 0; i < input.length; ) {\n const byte1 = charToByteMap[input.charAt(i++)];\n\n const haveByte2 = i < input.length;\n const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\n ++i;\n\n const haveByte3 = i < input.length;\n const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\n ++i;\n\n const haveByte4 = i < input.length;\n const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\n ++i;\n\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\n throw Error();\n }\n\n const outByte1 = (byte1 << 2) | (byte2 >> 4);\n output.push(outByte1);\n\n if (byte3 !== 64) {\n const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\n output.push(outByte2);\n\n if (byte4 !== 64) {\n const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\n output.push(outByte3);\n }\n }\n }\n\n return output;\n },\n\n /**\n * Lazy static initialization function. Called before\n * accessing any of the static map variables.\n * @private\n */\n init_() {\n if (!this.byteToCharMap_) {\n this.byteToCharMap_ = {};\n this.charToByteMap_ = {};\n this.byteToCharMapWebSafe_ = {};\n this.charToByteMapWebSafe_ = {};\n\n // We want quick mappings back and forth, so we precompute two maps.\n for (let i = 0; i < this.ENCODED_VALS.length; i++) {\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\n\n // Be forgiving when decoding and correctly decode both encodings.\n if (i >= this.ENCODED_VALS_BASE.length) {\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\n }\n }\n }\n }\n};\n\n/**\n * URL-safe base64 encoding\n */\nexport const base64Encode = function (str: string): string {\n const utf8Bytes = stringToByteArray(str);\n return base64.encodeByteArray(utf8Bytes, true);\n};\n\n/**\n * URL-safe base64 decoding\n *\n * NOTE: DO NOT use the global atob() function - it does NOT support the\n * base64Url variant encoding.\n *\n * @param str To be decoded\n * @return Decoded result, if possible\n */\nexport const base64Decode = function (str: string): string | null {\n try {\n return base64.decodeString(str, true);\n } catch (e) {\n console.error('base64Decode failed: ', e);\n }\n return null;\n};\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Do a deep-copy of basic JavaScript Objects or Arrays.\n */\nexport function deepCopy<T>(value: T): T {\n return deepExtend(undefined, value) as T;\n}\n\n/**\n * Copy properties from source to target (recursively allows extension\n * of Objects and Arrays). Scalar values in the target are over-written.\n * If target is undefined, an object of the appropriate type will be created\n * (and returned).\n *\n * We recursively copy all child properties of plain Objects in the source- so\n * that namespace- like dictionaries are merged.\n *\n * Note that the target can be a function, in which case the properties in\n * the source Object are copied onto it as static properties of the Function.\n *\n * Note: we don't merge __proto__ to prevent prototype pollution\n */\nexport function deepExtend(target: unknown, source: unknown): unknown {\n if (!(source instanceof Object)) {\n return source;\n }\n\n switch (source.constructor) {\n case Date:\n // Treat Dates like scalars; if the target date object had any child\n // properties - they will be lost!\n const dateValue = source as Date;\n return new Date(dateValue.getTime());\n\n case Object:\n if (target === undefined) {\n target = {};\n }\n break;\n case Array:\n // Always copy the array source and overwrite the target.\n target = [];\n break;\n\n default:\n // Not a plain Object - treat it as a scalar.\n return source;\n }\n\n for (const prop in source) {\n // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\n if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\n continue;\n }\n (target as Record<string, unknown>)[prop] = deepExtend(\n (target as Record<string, unknown>)[prop],\n (source as Record<string, unknown>)[prop]\n );\n }\n\n return target;\n}\n\nfunction isValidKey(key: string): boolean {\n return key !== '__proto__';\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class Deferred<R> {\n promise: Promise<R>;\n reject: (value?: unknown) => void = () => {};\n resolve: (value?: unknown) => void = () => {};\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve as (value?: unknown) => void;\n this.reject = reject as (value?: unknown) => void;\n });\n }\n\n /**\n * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\n */\n wrapCallback(\n callback?: (error?: unknown, value?: unknown) => void\n ): (error: unknown, value?: unknown) => void {\n return (error, value?) => {\n if (error) {\n this.reject(error);\n } else {\n this.resolve(value);\n }\n if (typeof callback === 'function') {\n // Attaching noop handler just in case developer wasn't expecting\n // promises\n this.promise.catch(() => {});\n\n // Some of our callbacks don't expect a value and our own tests\n // assert that the parameter length is 1\n if (callback.length === 1) {\n callback(error);\n } else {\n callback(error, value);\n }\n }\n };\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { base64 } from './crypt';\n\n// Firebase Auth tokens contain snake_case claims following the JWT standard / convention.\n/* eslint-disable camelcase */\n\nexport type FirebaseSignInProvider =\n | 'custom'\n | 'email'\n | 'password'\n | 'phone'\n | 'anonymous'\n | 'google.com'\n | 'facebook.com'\n | 'github.com'\n | 'twitter.com'\n | 'microsoft.com'\n | 'apple.com';\n\ninterface FirebaseIdToken {\n // Always set to https://securetoken.google.com/PROJECT_ID\n iss: string;\n\n // Always set to PROJECT_ID\n aud: string;\n\n // The user's unique id\n sub: string;\n\n // The token issue time, in seconds since epoch\n iat: number;\n\n // The token expiry time, normally 'iat' + 3600\n exp: number;\n\n // The user's unique id, must be equal to 'sub'\n user_id: string;\n\n // The time the user authenticated, normally 'iat'\n auth_time: number;\n\n // The sign in provider, only set when the provider is 'anonymous'\n provider_id?: 'anonymous';\n\n // The user's primary email\n email?: string;\n\n // The user's email verification status\n email_verified?: boolean;\n\n // The user's primary phone number\n phone_number?: string;\n\n // The user's display name\n name?: string;\n\n // The user's profile photo URL\n picture?: string;\n\n // Information on all identities linked to this user\n firebase: {\n // The primary sign-in provider\n sign_in_provider: FirebaseSignInProvider;\n\n // A map of providers to the user's list of unique identifiers from\n // each provider\n identities?: { [provider in FirebaseSignInProvider]?: string[] };\n };\n\n // Custom claims set by the developer\n [claim: string]: unknown;\n\n uid?: never; // Try to catch a common mistake of \"uid\" (should be \"sub\" instead).\n}\n\nexport type EmulatorMockTokenOptions = ({ user_id: string } | { sub: string }) &\n Partial<FirebaseIdToken>;\n\nexport function createMockUserToken(\n token: EmulatorMockTokenOptions,\n projectId?: string\n): string {\n if (token.uid) {\n throw new Error(\n 'The \"uid\" field is no longer supported by mockUserToken. Please use \"sub\" instead for Firebase Auth User ID.'\n );\n }\n // Unsecured JWTs use \"none\" as the algorithm.\n const header = {\n alg: 'none',\n type: 'JWT'\n };\n\n const project = projectId || 'demo-project';\n const iat = token.iat || 0;\n const sub = token.sub || token.user_id;\n if (!sub) {\n throw new Error(\"mockUserToken must contain 'sub' or 'user_id' field!\");\n }\n\n const payload: FirebaseIdToken = {\n // Set all required fields to decent defaults\n iss: `https://securetoken.google.com/${project}`,\n aud: project,\n iat,\n exp: iat + 3600,\n auth_time: iat,\n sub,\n user_id: sub,\n firebase: {\n sign_in_provider: 'custom',\n identities: {}\n },\n\n // Override with user options\n ...token\n };\n\n // Unsecured JWTs use the empty string as a signature.\n const signature = '';\n return [\n base64.encodeString(JSON.stringify(header), /*webSafe=*/ false),\n base64.encodeString(JSON.stringify(payload), /*webSafe=*/ false),\n signature\n ].join('.');\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CONSTANTS } from './constants';\n\n/**\n * Returns navigator.userAgent string or '' if it's not defined.\n * @return user agent string\n */\nexport function getUA(): string {\n if (\n typeof navigator !== 'undefined' &&\n typeof navigator['userAgent'] === 'string'\n ) {\n return navigator['userAgent'];\n } else {\n return '';\n }\n}\n\n/**\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\n *\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\n * wait for a callback.\n */\nexport function isMobileCordova(): boolean {\n return (\n typeof window !== 'undefined' &&\n // @ts-ignore Setting up an broadly applicable index signature for Window\n // just to deal with this case would probably be a bad idea.\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA())\n );\n}\n\n/**\n * Detect Node.js.\n *\n * @return true if Node.js environment is detected.\n */\n// Node detection logic from: https://github.com/iliakan/detect-node/\nexport function isNode(): boolean {\n try {\n return (\n Object.prototype.toString.call(global.process) === '[object process]'\n );\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Detect Browser Environment\n */\nexport function isBrowser(): boolean {\n return typeof self === 'object' && self.self === self;\n}\n\n/**\n * Detect browser extensions (Chrome and Firefox at least).\n */\ninterface BrowserRuntime {\n id?: unknown;\n}\ndeclare const chrome: { runtime?: BrowserRuntime };\ndeclare const browser: { runtime?: BrowserRuntime };\nexport function isBrowserExtension(): boolean {\n const runtime =\n typeof chrome === 'object'\n ? chrome.runtime\n : typeof browser === 'object'\n ? browser.runtime\n : undefined;\n return typeof runtime === 'object' && runtime.id !== undefined;\n}\n\n/**\n * Detect React Native.\n *\n * @return true if ReactNative environment is detected.\n */\nexport function isReactNative(): boolean {\n return (\n typeof navigator === 'object' && navigator['product'] === 'ReactNative'\n );\n}\n\n/** Detects Electron apps. */\nexport function isElectron(): boolean {\n return getUA().indexOf('Electron/') >= 0;\n}\n\n/** Detects Internet Explorer. */\nexport function isIE(): boolean {\n const ua = getUA();\n return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\n}\n\n/** Detects Universal Windows Platform apps. */\nexport function isUWP(): boolean {\n return getUA().indexOf('MSAppHost/') >= 0;\n}\n\n/**\n * Detect whether the current SDK build is the Node version.\n *\n * @return true if it's the Node SDK build.\n */\nexport function isNodeSdk(): boolean {\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\n}\n\n/** Returns true if we are running in Safari. */\nexport function isSafari(): boolean {\n return (\n !isNode() &&\n navigator.userAgent.includes('Safari') &&\n !navigator.userAgent.includes('Chrome')\n );\n}\n\n/**\n * This method checks if indexedDB is supported by current browser/service worker context\n * @return true if indexedDB is supported by current browser/service worker context\n */\nexport function isIndexedDBAvailable(): boolean {\n return 'indexedDB' in self && indexedDB != null;\n}\n\n/**\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\n * if errors occur during the database open operation.\n *\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\n * private browsing)\n */\nexport function validateIndexedDBOpenable(): Promise<boolean> {\n return new Promise((resolve, reject) => {\n try {\n let preExist: boolean = true;\n const DB_CHECK_NAME =\n 'validate-browser-context-for-indexeddb-analytics-module';\n const request = self.indexedDB.open(DB_CHECK_NAME);\n request.onsuccess = () => {\n request.result.close();\n // delete database only when it doesn't pre-exist\n if (!preExist) {\n self.indexedDB.deleteDatabase(DB_CHECK_NAME);\n }\n resolve(true);\n };\n request.onupgradeneeded = () => {\n preExist = false;\n };\n\n request.onerror = () => {\n reject(request.error?.message || '');\n };\n } catch (error) {\n reject(error);\n }\n });\n}\n\n/**\n *\n * This method checks whether cookie is enabled within current browser\n * @return true if cookie is enabled within current browser\n */\nexport function areCookiesEnabled(): boolean {\n if (!navigator || !navigator.cookieEnabled) {\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill for `globalThis` object.\n * @returns the `globalThis` object for the given environment.\n */\nexport function getGlobal(): typeof globalThis {\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n throw new Error('Unable to locate global object.');\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Standardized Firebase Error.\n *\n * Usage:\n *\n * // Typescript string literals for type-safe codes\n * type Err =\n * 'unknown' |\n * 'object-not-found'\n * ;\n *\n * // Closure enum for type-safe error codes\n * // at-enum {string}\n * var Err = {\n * UNKNOWN: 'unknown',\n * OBJECT_NOT_FOUND: 'object-not-found',\n * }\n *\n * let errors: Map<Err, string> = {\n * 'generic-error': \"Unknown error\",\n * 'file-not-found': \"Could not find file: {$file}\",\n * };\n *\n * // Type-safe function - must pass a valid error code as param.\n * let error = new ErrorFactory<Err>('service', 'Service', errors);\n *\n * ...\n * throw error.create(Err.GENERIC);\n * ...\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\n * ...\n * // Service: Could not file file: foo.txt (service/file-not-found).\n *\n * catch (e) {\n * assert(e.message === \"Could not find file: foo.txt.\");\n * if (e.code === 'service/file-not-found') {\n * console.log(\"Could not read file: \" + e['file']);\n * }\n * }\n */\n\nexport type ErrorMap<ErrorCode extends string> = {\n readonly [K in ErrorCode]: string;\n};\n\nconst ERROR_NAME = 'FirebaseError';\n\nexport interface StringLike {\n toString(): string;\n}\n\nexport interface ErrorData {\n [key: string]: unknown;\n}\n\n// Based on code from:\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\nexport class FirebaseError extends Error {\n readonly name = ERROR_NAME;\n\n constructor(\n readonly code: string,\n message: string,\n public customData?: Record<string, unknown>\n ) {\n super(message);\n\n // Fix For ES5\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, FirebaseError.prototype);\n\n // Maintains proper stack trace for where our error was thrown.\n // Only available on V8.\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\n }\n }\n}\n\nexport class ErrorFactory<\n ErrorCode extends string,\n ErrorParams extends { readonly [K in ErrorCode]?: ErrorData } = {}\n> {\n constructor(\n private readonly service: string,\n private readonly serviceName: string,\n private readonly errors: ErrorMap<ErrorCode>\n ) {}\n\n create<K extends ErrorCode>(\n code: K,\n ...data: K extends keyof ErrorParams ? [ErrorParams[K]] : []\n ): FirebaseError {\n const customData = (data[0] as ErrorData) || {};\n const fullCode = `${this.service}/${code}`;\n const template = this.errors[code];\n\n const message = template ? replaceTemplate(template, customData) : 'Error';\n // Service Name: Error message (service/code).\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\n\n const error = new FirebaseError(fullCode, fullMessage, customData);\n\n return error;\n }\n}\n\nfunction replaceTemplate(template: string, data: ErrorData): string {\n return template.replace(PATTERN, (_, key) => {\n const value = data[key];\n return value != null ? String(value) : `<${key}?>`;\n });\n}\n\nconst PATTERN = /\\{\\$([^}]+)}/g;\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Evaluates a JSON string into a javascript object.\n *\n * @param {string} str A string containing JSON.\n * @return {*} The javascript object representing the specified JSON.\n */\nexport function jsonEval(str: string): unknown {\n return JSON.parse(str);\n}\n\n/**\n * Returns JSON representing a javascript object.\n * @param {*} data Javascript object to be stringified.\n * @return {string} The JSON contents of the object.\n */\nexport function stringify(data: unknown): string {\n return JSON.stringify(data);\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { base64Decode } from './crypt';\nimport { jsonEval } from './json';\n\ninterface Claims {\n [key: string]: {};\n}\n\ninterface DecodedToken {\n header: object;\n claims: Claims;\n data: object;\n signature: string;\n}\n\n/**\n * Decodes a Firebase auth. token into constituent parts.\n *\n * Notes:\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nexport const decode = function (token: string): DecodedToken {\n let header = {},\n claims: Claims = {},\n data = {},\n signature = '';\n\n try {\n const parts = token.split('.');\n header = jsonEval(base64Decode(parts[0]) || '') as object;\n claims = jsonEval(base64Decode(parts[1]) || '') as Claims;\n signature = parts[2];\n data = claims['d'] || {};\n delete claims['d'];\n } catch (e) {}\n\n return {\n header,\n claims,\n data,\n signature\n };\n};\n\ninterface DecodedToken {\n header: object;\n claims: Claims;\n data: object;\n signature: string;\n}\n\n/**\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nexport const isValidTimestamp = function (token: string): boolean {\n const claims: Claims = decode(token).claims;\n const now: number = Math.floor(new Date().getTime() / 1000);\n let validSince: number = 0,\n validUntil: number = 0;\n\n if (typeof claims === 'object') {\n if (claims.hasOwnProperty('nbf')) {\n validSince = claims['nbf'] as number;\n } else if (claims.hasOwnProperty('iat')) {\n validSince = claims['iat'] as number;\n }\n\n if (claims.hasOwnProperty('exp')) {\n validUntil = claims['exp'] as number;\n } else {\n // token will expire after 24h by default\n validUntil = validSince + 86400;\n }\n }\n\n return (\n !!now &&\n !!validSince &&\n !!validUntil &&\n now >= validSince &&\n now <= validUntil\n );\n};\n\n/**\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\n *\n * Notes:\n * - May return null if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nexport const issuedAtTime = function (token: string): number | null {\n const claims: Claims = decode(token).claims;\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\n return claims['iat'] as number;\n }\n return null;\n};\n\n/**\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nexport const isValidFormat = function (token: string): boolean {\n const decoded = decode(token),\n claims = decoded.claims;\n\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\n};\n\n/**\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nexport const isAdmin = function (token: string): boolean {\n const claims: Claims = decode(token).claims;\n return typeof claims === 'object' && claims['admin'] === true;\n};\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function contains<T extends object>(obj: T, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function safeGet<T extends object, K extends keyof T>(\n obj: T,\n key: K\n): T[K] | undefined {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return obj[key];\n } else {\n return undefined;\n }\n}\n\nexport function isEmpty(obj: object): obj is {} {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return false;\n }\n }\n return true;\n}\n\nexport function map<K extends string, V, U>(\n obj: { [key in K]: V },\n fn: (value: V, key: K, obj: { [key in K]: V }) => U,\n contextObj?: unknown\n): { [key in K]: U } {\n const res: Partial<{ [key in K]: U }> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n res[key] = fn.call(contextObj, obj[key], key, obj);\n }\n }\n return res as { [key in K]: U };\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\n * params object (e.g. {arg: 'val', arg2: 'val2'})\n * Note: You must prepend it with ? when adding it to a URL.\n */\nexport function querystring(querystringParams: {\n [key: string]: string | number;\n}): string {\n const params = [];\n for (const [key, value] of Object.entries(querystringParams)) {\n if (Array.isArray(value)) {\n value.forEach(arrayVal => {\n params.push(\n encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal)\n );\n });\n } else {\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n }\n }\n return params.length ? '&' + params.join('&') : '';\n}\n\n/**\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\n * (e.g. {arg: 'val', arg2: 'val2'})\n */\nexport function querystringDecode(querystring: string): Record<string, string> {\n const obj: Record<string, string> = {};\n const tokens = querystring.replace(/^\\?/, '').split('&');\n\n tokens.forEach(token => {\n if (token) {\n const [key, value] = token.split('=');\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n });\n return obj;\n}\n\n/**\n * Extract the query string part of a URL, including the leading question mark (if present).\n */\nexport function extractQuerystring(url: string): string {\n const queryStart = url.indexOf('?');\n if (!queryStart) {\n return '';\n }\n const fragmentStart = url.indexOf('#', queryStart);\n return url.substring(\n queryStart,\n fragmentStart > 0 ? fragmentStart : undefined\n );\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview SHA-1 cryptographic hash.\n * Variable names follow the notation in FIPS PUB 180-3:\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\n *\n * Usage:\n * var sha1 = new sha1();\n * sha1.update(bytes);\n * var hash = sha1.digest();\n *\n * Performance:\n * Chrome 23: ~400 Mbit/s\n * Firefox 16: ~250 Mbit/s\n *\n */\n\n/**\n * SHA-1 cryptographic hash constructor.\n *\n * The properties declared here are discussed in the above algorithm document.\n * @constructor\n * @final\n * @struct\n */\nexport class Sha1 {\n /**\n * Holds the previous values of accumulated variables a-e in the compress_\n * function.\n * @private\n */\n private chain_: number[] = [];\n\n /**\n * A buffer holding the partially computed hash result.\n * @private\n */\n private buf_: number[] = [];\n\n /**\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\n * as the message schedule in the docs.\n * @private\n */\n private W_: number[] = [];\n\n /**\n * Contains data needed to pad messages less than 64 bytes.\n * @private\n */\n private pad_: number[] = [];\n\n /**\n * @private {number}\n */\n private inbuf_: number = 0;\n\n /**\n * @private {number}\n */\n private total_: number = 0;\n\n blockSize: number;\n\n constructor() {\n this.blockSize = 512 / 8;\n\n this.pad_[0] = 128;\n for (let i = 1; i < this.blockSize; ++i) {\n this.pad_[i] = 0;\n }\n\n this.reset();\n }\n\n reset(): void {\n this.chain_[0] = 0x67452301;\n this.chain_[1] = 0xefcdab89;\n this.chain_[2] = 0x98badcfe;\n this.chain_[3] = 0x10325476;\n this.chain_[4] = 0xc3d2e1f0;\n\n this.inbuf_ = 0;\n this.total_ = 0;\n }\n\n /**\n * Internal compress helper function.\n * @param buf Block to compress.\n * @param offset Offset of the block in the buffer.\n * @private\n */\n compress_(buf: number[] | Uint8Array | string, offset?: number): void {\n if (!offset) {\n offset = 0;\n }\n\n const W = this.W_;\n\n // get 16 big endian words\n if (typeof buf === 'string') {\n for (let i = 0; i < 16; i++) {\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\n // have a bug that turns the post-increment ++ operator into pre-increment\n // during JIT compilation. We have code that depends heavily on SHA-1 for\n // correctness and which is affected by this bug, so I've removed all uses\n // of post-increment ++ in which the result value is used. We can revert\n // this change once the Safari bug\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\n // most clients have been updated.\n W[i] =\n (buf.charCodeAt(offset) << 24) |\n (buf.charCodeAt(offset + 1) << 16) |\n (buf.charCodeAt(offset + 2) << 8) |\n buf.charCodeAt(offset + 3);\n offset += 4;\n }\n } else {\n for (let i = 0; i < 16; i++) {\n W[i] =\n (buf[offset] << 24) |\n (buf[offset + 1] << 16) |\n (buf[offset + 2] << 8) |\n buf[offset + 3];\n offset += 4;\n }\n }\n\n // expand to 80 words\n for (let i = 16; i < 80; i++) {\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\n }\n\n let a = this.chain_[0];\n let b = this.chain_[1];\n let c = this.chain_[2];\n let d = this.chain_[3];\n let e = this.chain_[4];\n let f, k;\n\n // TODO(user): Try to unroll this loop to speed up the computation.\n for (let i = 0; i < 80; i++) {\n if (i < 40) {\n if (i < 20) {\n f = d ^ (b & (c ^ d));\n k = 0x5a827999;\n } else {\n f = b ^ c ^ d;\n k = 0x6ed9eba1;\n }\n } else {\n if (i < 60) {\n f = (b & c) | (d & (b | c));\n k = 0x8f1bbcdc;\n } else {\n f = b ^ c ^ d;\n k = 0xca62c1d6;\n }\n }\n\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\n e = d;\n d = c;\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\n b = a;\n a = t;\n }\n\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\n }\n\n update(bytes?: number[] | Uint8Array | string, length?: number): void {\n // TODO(johnlenz): tighten the function signature and remove this check\n if (bytes == null) {\n return;\n }\n\n if (length === undefined) {\n length = bytes.length;\n }\n\n const lengthMinusBlock = length - this.blockSize;\n let n = 0;\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\n const buf = this.buf_;\n let inbuf = this.inbuf_;\n\n // The outer while loop should execute at most twice.\n while (n < length) {\n // When we have no data in the block to top up, we can directly process the\n // input buffer (assuming it contains sufficient data). This gives ~25%\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\n // the data is provided in large chunks (or in multiples of 64 bytes).\n if (inbuf === 0) {\n while (n <= lengthMinusBlock) {\n this.compress_(bytes, n);\n n += this.blockSize;\n }\n }\n\n if (typeof bytes === 'string') {\n while (n < length) {\n buf[inbuf] = bytes.charCodeAt(n);\n ++inbuf;\n ++n;\n if (inbuf === this.blockSize) {\n this.compress_(buf);\n inbuf = 0;\n // Jump to the outer loop so we use the full-block optimization.\n break;\n }\n }\n } else {\n while (n < length) {\n buf[inbuf] = bytes[n];\n ++inbuf;\n ++n;\n if (inbuf === this.blockSize) {\n this.compress_(buf);\n inbuf = 0;\n // Jump to the outer loop so we use the full-block optimization.\n break;\n }\n }\n }\n }\n\n this.inbuf_ = inbuf;\n this.total_ += length;\n }\n\n /** @override */\n digest(): number[] {\n const digest: number[] = [];\n let totalBits = this.total_ * 8;\n\n // Add pad 0x80 0x00*.\n if (this.inbuf_ < 56) {\n this.update(this.pad_, 56 - this.inbuf_);\n } else {\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\n }\n\n // Add # bits.\n for (let i = this.blockSize - 1; i >= 56; i--) {\n this.buf_[i] = totalBits & 255;\n totalBits /= 256; // Don't use bit-shifting here!\n }\n\n this.compress_(this.buf_);\n\n let n = 0;\n for (let i = 0; i < 5; i++) {\n for (let j = 24; j >= 0; j -= 8) {\n digest[n] = (this.chain_[i] >> j) & 255;\n ++n;\n }\n }\n return digest;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport type NextFn<T> = (value: T) => void;\nexport type ErrorFn = (error: Error) => void;\nexport type CompleteFn = () => void;\n\nexport interface Observer<T> {\n // Called once for each value in a stream of values.\n next: NextFn<T>;\n\n // A stream terminates by a single call to EITHER error() or complete().\n error: ErrorFn;\n\n // No events will be sent to next() once complete() is called.\n complete: CompleteFn;\n}\n\nexport type PartialObserver<T> = Partial<Observer<T>>;\n\n// TODO: Support also Unsubscribe.unsubscribe?\nexport type Unsubscribe = () => void;\n\n/**\n * The Subscribe interface has two forms - passing the inline function\n * callbacks, or a object interface with callback properties.\n */\nexport interface Subscribe<T> {\n (next?: NextFn<T>, error?: ErrorFn, complete?: CompleteFn): Unsubscribe;\n (observer: PartialObserver<T>): Unsubscribe;\n}\n\nexport interface Observable<T> {\n // Subscribe method\n subscribe: Subscribe<T>;\n}\n\nexport type Executor<T> = (observer: Observer<T>) => void;\n\n/**\n * Helper to make a Subscribe function (just like Promise helps make a\n * Thenable).\n *\n * @param executor Function which can make calls to a single Observer\n * as a proxy.\n * @param onNoObservers Callback when count of Observers goes to zero.\n */\nexport function createSubscribe<T>(\n executor: Executor<T>,\n onNoObservers?: Executor<T>\n): Subscribe<T> {\n const proxy = new ObserverProxy<T>(executor, onNoObservers);\n return proxy.subscribe.bind(proxy);\n}\n\n/**\n * Implement fan-out for any number of Observers attached via a subscribe\n * function.\n */\nclass ObserverProxy<T> implements Observer<T> {\n private observers: Array<Observer<T>> | undefined = [];\n private unsubscribes: Unsubscribe[] = [];\n private onNoObservers: Executor<T> | undefined;\n private observerCount = 0;\n // Micro-task scheduling by calling task.then().\n private task = Promise.resolve();\n private finalized = false;\n private finalError?: Error;\n\n /**\n * @param executor Function which can make calls to a single Observer\n * as a proxy.\n * @param onNoObservers Callback when count of Observers goes to zero.\n */\n constructor(executor: Executor<T>, onNoObservers?: Executor<T>) {\n this.onNoObservers = onNoObservers;\n // Call the executor asynchronously so subscribers that are called\n // synchronously after the creation of the subscribe function\n // can still receive the very first value generated in the executor.\n this.task\n .then(() => {\n executor(this);\n })\n .catch(e => {\n this.error(e);\n });\n }\n\n next(value: T): void {\n this.forEachObserver((observer: Observer<T>) => {\n observer.next(value);\n });\n }\n\n error(error: Error): void {\n this.forEachObserver((observer: Observer<T>) => {\n observer.error(error);\n });\n this.close(error);\n }\n\n complete(): void {\n this.forEachObserver((observer: Observer<T>) => {\n observer.complete();\n });\n this.close();\n }\n\n /**\n * Subscribe function that can be used to add an Observer to the fan-out list.\n *\n * - We require that no event is sent to a subscriber sychronously to their\n * call to subscribe().\n */\n subscribe(\n nextOrObserver?: NextFn<T> | PartialObserver<T>,\n error?: ErrorFn,\n complete?: CompleteFn\n ): Unsubscribe {\n let observer: Observer<T>;\n\n if (\n nextOrObserver === undefined &&\n error === undefined &&\n complete === undefined\n ) {\n throw new Error('Missing Observer.');\n }\n\n // Assemble an Observer object when passed as callback functions.\n if (\n implementsAnyMethods(nextOrObserver as { [key: string]: unknown }, [\n 'next',\n 'error',\n 'complete'\n ])\n ) {\n observer = nextOrObserver as Observer<T>;\n } else {\n observer = {\n next: nextOrObserver as NextFn<T>,\n error,\n complete\n } as Observer<T>;\n }\n\n if (observer.next === undefined) {\n observer.next = noop as NextFn<T>;\n }\n if (observer.error === undefined) {\n observer.error = noop as ErrorFn;\n }\n if (observer.complete === undefined) {\n observer.complete = noop as CompleteFn;\n }\n\n const unsub = this.unsubscribeOne.bind(this, this.observers!.length);\n\n // Attempt to subscribe to a terminated Observable - we\n // just respond to the Observer with the final error or complete\n // event.\n if (this.finalized) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n try {\n if (this.finalError) {\n observer.error(this.finalError);\n } else {\n observer.complete();\n }\n } catch (e) {\n // nothing\n }\n return;\n });\n }\n\n this.observers!.push(observer as Observer<T>);\n\n return unsub;\n }\n\n // Unsubscribe is synchronous - we guarantee that no events are sent to\n // any unsubscribed Observer.\n private unsubscribeOne(i: number): void {\n if (this.observers === undefined || this.observers[i] === undefined) {\n return;\n }\n\n delete this.observers[i];\n\n this.observerCount -= 1;\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\n this.onNoObservers(this);\n }\n }\n\n private forEachObserver(fn: (observer: Observer<T>) => void): void {\n if (this.finalized) {\n // Already closed by previous event....just eat the additional values.\n return;\n }\n\n // Since sendOne calls asynchronously - there is no chance that\n // this.observers will become undefined.\n for (let i = 0; i < this.observers!.length; i++) {\n this.sendOne(i, fn);\n }\n }\n\n // Call the Observer via one of it's callback function. We are careful to\n // confirm that the observe has not been unsubscribed since this asynchronous\n // function had been queued.\n private sendOne(i: number, fn: (observer: Observer<T>) => void): void {\n // Execute the callback asynchronously\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n if (this.observers !== undefined && this.observers[i] !== undefined) {\n try {\n fn(this.observers[i]);\n } catch (e) {\n // Ignore exceptions raised in Observers or missing methods of an\n // Observer.\n // Log error to console. b/31404806\n if (typeof console !== 'undefined' && console.error) {\n console.error(e);\n }\n }\n }\n });\n }\n\n private close(err?: Error): void {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n if (err !== undefined) {\n this.finalError = err;\n }\n // Proxy is no longer needed - garbage collect references\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n this.observers = undefined;\n this.onNoObservers = undefined;\n });\n }\n}\n\n/** Turn synchronous function into one called asynchronously. */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function async(fn: Function, onError?: ErrorFn): Function {\n return (...args: unknown[]) => {\n Promise.resolve(true)\n .then(() => {\n fn(...args);\n })\n .catch((error: Error) => {\n if (onError) {\n onError(error);\n }\n });\n };\n}\n\n/**\n * Return true if the object passed in implements any of the named methods.\n */\nfunction implementsAnyMethods(\n obj: { [key: string]: unknown },\n methods: string[]\n): boolean {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n for (const method of methods) {\n if (method in obj && typeof obj[method] === 'function') {\n return true;\n }\n }\n\n return false;\n}\n\nfunction noop(): void {\n // do nothing\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Check to make sure the appropriate number of arguments are provided for a public function.\n * Throws an error if it fails.\n *\n * @param fnName The function name\n * @param minCount The minimum number of arguments to allow for the function call\n * @param maxCount The maximum number of argument to allow for the function call\n * @param argCount The actual number of arguments provided.\n */\nexport const validateArgCount = function (\n fnName: string,\n minCount: number,\n maxCount: number,\n argCount: number\n): void {\n let argError;\n if (argCount < minCount) {\n argError = 'at least ' + minCount;\n } else if (argCount > maxCount) {\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\n }\n if (argError) {\n const error =\n fnName +\n ' failed: Was called with ' +\n argCount +\n (argCount === 1 ? ' argument.' : ' arguments.') +\n ' Expects ' +\n argError +\n '.';\n throw new Error(error);\n }\n};\n\n/**\n * Generates a string to prefix an error message about failed argument validation\n *\n * @param fnName The function name\n * @param argName The name of the argument\n * @return The prefix to add to the error thrown for validation.\n */\nexport function errorPrefix(fnName: string, argName: string): string {\n return `${fnName} failed: ${argName} argument `;\n}\n\n/**\n * @param fnName\n * @param argumentNumber\n * @param namespace\n * @param optional\n */\nexport function validateNamespace(\n fnName: string,\n namespace: string,\n optional: boolean\n): void {\n if (optional && !namespace) {\n return;\n }\n if (typeof namespace !== 'string') {\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\n throw new Error(\n errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.'\n );\n }\n}\n\nexport function validateCallback(\n fnName: string,\n argumentName: string,\n // eslint-disable-next-line @typescript-eslint/ban-types\n callback: Function,\n optional: boolean\n): void {\n if (optional && !callback) {\n return;\n }\n if (typeof callback !== 'function') {\n throw new Error(\n errorPrefix(fnName, argumentName) + 'must be a valid function.'\n );\n }\n}\n\nexport function validateContextObject(\n fnName: string,\n argumentName: string,\n context: unknown,\n optional: boolean\n): void {\n if (optional && !context) {\n return;\n }\n if (typeof context !== 'object' || context === null) {\n throw new Error(\n errorPrefix(fnName, argumentName) + 'must be a valid context object.'\n );\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from './assert';\n\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\n// so it's been modified.\n\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\n// use 2 characters in Javascript. All 4-byte UTF-8 characters begin with a first\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\n// pair).\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\n\n/**\n * @param {string} str\n * @return {Array}\n */\nexport const stringToByteArray = function (str: string): number[] {\n const out: number[] = [];\n let p = 0;\n for (let i = 0; i < str.length; i++) {\n let c = str.charCodeAt(i);\n\n // Is this the lead surrogate in a surrogate pair?\n if (c >= 0xd800 && c <= 0xdbff) {\n const high = c - 0xd800; // the high 10 bits.\n i++;\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\n c = 0x10000 + (high << 10) + low;\n }\n\n if (c < 128) {\n out[p++] = c;\n } else if (c < 2048) {\n out[p++] = (c >> 6) | 192;\n out[p++] = (c & 63) | 128;\n } else if (c < 65536) {\n out[p++] = (c >> 12) | 224;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n } else {\n out[p++] = (c >> 18) | 240;\n out[p++] = ((c >> 12) & 63) | 128;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n }\n }\n return out;\n};\n\n/**\n * Calculate length without actually converting; useful for doing cheaper validation.\n * @param {string} str\n * @return {number}\n */\nexport const stringLength = function (str: string): number {\n let p = 0;\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 128) {\n p++;\n } else if (c < 2048) {\n p += 2;\n } else if (c >= 0xd800 && c <= 0xdbff) {\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\n p += 4;\n i++; // skip trail surrogate.\n } else {\n p += 3;\n }\n }\n return p;\n};\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The amount of milliseconds to exponentially increase.\n */\nconst DEFAULT_INTERVAL_MILLIS = 1000;\n\n/**\n * The factor to backoff by.\n * Should be a number greater than 1.\n */\nconst DEFAULT_BACKOFF_FACTOR = 2;\n\n/**\n * The maximum milliseconds to increase to.\n *\n * <p>Visible for testing\n */\nexport const MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\n\n/**\n * The percentage of backoff time to randomize by.\n * See\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\n * for context.\n *\n * <p>Visible for testing\n */\nexport const RANDOM_FACTOR = 0.5;\n\n/**\n * Based on the backoff method from\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\n */\nexport function calculateBackoffMillis(\n backoffCount: number,\n intervalMillis: number = DEFAULT_INTERVAL_MILLIS,\n backoffFactor: number = DEFAULT_BACKOFF_FACTOR\n): number {\n // Calculates an exponentially increasing value.\n // Deviation: calculates value from count and a constant interval, so we only need to save value\n // and count to restore state.\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\n\n // A random \"fuzz\" to avoid waves of retries.\n // Deviation: randomFactor is required.\n const randomWait = Math.round(\n // A fraction of the backoff value to add/subtract.\n // Deviation: changes multiplication order to improve readability.\n RANDOM_FACTOR *\n currBaseValue *\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\n // if we add or subtract.\n (Math.random() - 0.5) *\n 2\n );\n\n // Limits backoff to max to avoid effectively permanent backoff.\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Provide English ordinal letters after a number\n */\nexport function ordinal(i: number): string {\n if (!Number.isFinite(i)) {\n return `${i}`;\n }\n return i + indicator(i);\n}\n\nfunction indicator(i: number): string {\n i = Math.abs(i);\n const cent = i % 100;\n if (cent >= 10 && cent <= 20) {\n return 'th';\n }\n const dec = i % 10;\n if (dec === 1) {\n return 'st';\n }\n if (dec === 2) {\n return 'nd';\n }\n if (dec === 3) {\n return 'rd';\n }\n return 'th';\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface Compat<T> {\n _delegate: T;\n}\n\nexport function getModularInstance<ExpService>(\n service: Compat<ExpService> | ExpService\n): ExpService {\n if (service && (service as Compat<ExpService>)._delegate) {\n return (service as Compat<ExpService>)._delegate;\n } else {\n return service as ExpService;\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n InstantiationMode,\n InstanceFactory,\n ComponentType,\n Dictionary,\n Name,\n onInstanceCreatedCallback\n} from './types';\n\n/**\n * Component for service name T, e.g. `auth`, `auth-internal`\n */\nexport class Component<T extends Name = Name> {\n multipleInstances = false;\n /**\n * Properties to be added to the service namespace\n */\n serviceProps: Dictionary = {};\n\n instantiationMode = InstantiationMode.LAZY;\n\n onInstanceCreated: onInstanceCreatedCallback<T> | null = null;\n\n /**\n *\n * @param name The public service name, e.g. app, auth, firestore, database\n * @param instanceFactory Service factory responsible for creating the public interface\n * @param type whether the service provided by the component is public or private\n */\n constructor(\n readonly name: T,\n readonly instanceFactory: InstanceFactory<T>,\n readonly type: ComponentType\n ) {}\n\n setInstantiationMode(mode: InstantiationMode): this {\n this.instantiationMode = mode;\n return this;\n }\n\n setMultipleInstances(multipleInstances: boolean): this {\n this.multipleInstances = multipleInstances;\n return this;\n }\n\n setServiceProps(props: Dictionary): this {\n this.serviceProps = props;\n return this;\n }\n\n setInstanceCreatedCallback(callback: onInstanceCreatedCallback<T>): this {\n this.onInstanceCreated = callback;\n return this;\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const DEFAULT_ENTRY_NAME = '[DEFAULT]';\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Deferred } from '@firebase/util';\nimport { ComponentContainer } from './component_container';\nimport { DEFAULT_ENTRY_NAME } from './constants';\nimport {\n InitializeOptions,\n InstantiationMode,\n Name,\n NameServiceMapping,\n OnInitCallBack\n} from './types';\nimport { Component } from './component';\n\n/**\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\n * NameServiceMapping[T] is an alias for the type of the instance\n */\nexport class Provider<T extends Name> {\n private component: Component<T> | null = null;\n private readonly instances: Map<string, NameServiceMapping[T]> = new Map();\n private readonly instancesDeferred: Map<\n string,\n Deferred<NameServiceMapping[T]>\n > = new Map();\n private onInitCallbacks: Map<string, Set<OnInitCallBack<T>>> = new Map();\n\n constructor(\n private readonly name: T,\n private readonly container: ComponentContainer\n ) {}\n\n /**\n * @param identifier A provider can provide mulitple instances of a service\n * if this.component.multipleInstances is true.\n */\n get(identifier?: string): Promise<NameServiceMapping[T]> {\n // if multipleInstances is not supported, use the default name\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\n const deferred = new Deferred<NameServiceMapping[T]>();\n this.instancesDeferred.set(normalizedIdentifier, deferred);\n\n if (\n this.isInitialized(normalizedIdentifier) ||\n this.shouldAutoInitialize()\n ) {\n // initialize the service if it can be auto-initialized\n try {\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n if (instance) {\n deferred.resolve(instance);\n }\n } catch (e) {\n // when the instance factory throws an exception during get(), it should not cause\n // a fatal error. We just return the unresolved promise in this case.\n }\n }\n }\n\n return this.instancesDeferred.get(normalizedIdentifier)!.promise;\n }\n\n /**\n *\n * @param options.identifier A provider can provide mulitple instances of a service\n * if this.component.multipleInstances is true.\n * @param options.optional If optional is false or not provided, the method throws an error when\n * the service is not immediately available.\n * If optional is true, the method returns null if the service is not immediately available.\n */\n getImmediate(options: {\n identifier?: string;\n optional: true;\n }): NameServiceMapping[T] | null;\n getImmediate(options?: {\n identifier?: string;\n optional?: false;\n }): NameServiceMapping[T];\n getImmediate(options?: {\n identifier?: string;\n optional?: boolean;\n }): NameServiceMapping[T] | null {\n // if multipleInstances is not supported, use the default name\n const normalizedIdentifier = this.normalizeInstanceIdentifier(\n options?.identifier\n );\n const optional = options?.optional ?? false;\n\n if (\n this.isInitialized(normalizedIdentifier) ||\n this.shouldAutoInitialize()\n ) {\n try {\n return this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n } catch (e) {\n if (optional) {\n return null;\n } else {\n throw e;\n }\n }\n } else {\n // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw\n if (optional) {\n return null;\n } else {\n throw Error(`Service ${this.name} is not available`);\n }\n }\n }\n\n getComponent(): Component<T> | null {\n return this.component;\n }\n\n setComponent(component: Component<T>): void {\n if (component.name !== this.name) {\n throw Error(\n `Mismatching Component ${component.name} for Provider ${this.name}.`\n );\n }\n\n if (this.component) {\n throw Error(`Component for ${this.name} has already been provided`);\n }\n\n this.component = component;\n\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\n if (!this.shouldAutoInitialize()) {\n return;\n }\n\n // if the service is eager, initialize the default instance\n if (isComponentEager(component)) {\n try {\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\n } catch (e) {\n // when the instance factory for an eager Component throws an exception during the eager\n // initialization, it should not cause a fatal error.\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\n // a fatal error in this case?\n }\n }\n\n // Create service instances for the pending promises and resolve them\n // NOTE: if this.multipleInstances is false, only the default instance will be created\n // and all promises with resolve with it regardless of the identifier.\n for (const [\n instanceIdentifier,\n instanceDeferred\n ] of this.instancesDeferred.entries()) {\n const normalizedIdentifier = this.normalizeInstanceIdentifier(\n instanceIdentifier\n );\n\n try {\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n })!;\n instanceDeferred.resolve(instance);\n } catch (e) {\n // when the instance factory throws an exception, it should not cause\n // a fatal error. We just leave the promise unresolved.\n }\n }\n }\n\n clearInstance(identifier: string = DEFAULT_ENTRY_NAME): void {\n this.instancesDeferred.delete(identifier);\n this.instances.delete(identifier);\n }\n\n // app.delete() will call this method on every provider to delete the services\n // TODO: should we mark the provider as deleted?\n async delete(): Promise<void> {\n const services = Array.from(this.instances.values());\n\n await Promise.all([\n ...services\n .filter(service => 'INTERNAL' in service) // legacy services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => (service as any).INTERNAL!.delete()),\n ...services\n .filter(service => '_delete' in service) // modularized services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => (service as any)._delete())\n ]);\n }\n\n isComponentSet(): boolean {\n return this.component != null;\n }\n\n isInitialized(identifier: string = DEFAULT_ENTRY_NAME): boolean {\n return this.instances.has(identifier);\n }\n\n initialize(opts: InitializeOptions = {}): NameServiceMapping[T] {\n const { options = {} } = opts;\n const normalizedIdentifier = this.normalizeInstanceIdentifier(\n opts.instanceIdentifier\n );\n if (this.isInitialized(normalizedIdentifier)) {\n throw Error(\n `${this.name}(${normalizedIdentifier}) has already been initialized`\n );\n }\n\n if (!this.isComponentSet()) {\n throw Error(`Component ${this.name} has not been registered yet`);\n }\n\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier,\n options\n })!;\n\n // resolve any pending promise waiting for the service instance\n for (const [\n instanceIdentifier,\n instanceDeferred\n ] of this.instancesDeferred.entries()) {\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(\n instanceIdentifier\n );\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\n instanceDeferred.resolve(instance);\n }\n }\n\n return instance;\n }\n\n /**\n *\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\n *\n * @param identifier An optional instance identifier\n * @returns a function to unregister the callback\n */\n onInit(callback: OnInitCallBack<T>, identifier?: string): () => void {\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n const existingCallbacks =\n this.onInitCallbacks.get(normalizedIdentifier) ??\n new Set<OnInitCallBack<T>>();\n existingCallbacks.add(callback);\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\n\n const existingInstance = this.instances.get(normalizedIdentifier);\n if (existingInstance) {\n callback(existingInstance, normalizedIdentifier);\n }\n\n return () => {\n existingCallbacks.delete(callback);\n };\n }\n\n /**\n * Invoke onInit callbacks synchronously\n * @param instance the service instance`\n */\n private invokeOnInitCallbacks(\n instance: NameServiceMapping[T],\n identifier: string\n ): void {\n const callbacks = this.onInitCallbacks.get(identifier);\n if (!callbacks) {\n return;\n }\n for (const callback of callbacks) {\n try {\n callback(instance, identifier);\n } catch {\n // ignore errors in the onInit callback\n }\n }\n }\n\n private getOrInitializeService({\n instanceIdentifier,\n options = {}\n }: {\n instanceIdentifier: string;\n options?: Record<string, unknown>;\n }): NameServiceMapping[T] | null {\n let instance = this.instances.get(instanceIdentifier);\n if (!instance && this.component) {\n instance = this.component.instanceFactory(this.container, {\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\n options\n });\n this.instances.set(instanceIdentifier, instance);\n\n /**\n * Invoke onInit listeners.\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\n * while onInit listeners are registered by consumers of the provider.\n */\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\n\n /**\n * Order is important\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\n * makes `isInitialized()` return true.\n */\n if (this.component.onInstanceCreated) {\n try {\n this.component.onInstanceCreated(\n this.container,\n instanceIdentifier,\n instance\n );\n } catch {\n // ignore errors in the onInstanceCreatedCallback\n }\n }\n }\n\n return instance || null;\n }\n\n private normalizeInstanceIdentifier(\n identifier: string = DEFAULT_ENTRY_NAME\n ): string {\n if (this.component) {\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\n } else {\n return identifier; // assume multiple instances are supported before the component is provided.\n }\n }\n\n private shouldAutoInitialize(): boolean {\n return (\n !!this.component &&\n this.component.instantiationMode !== InstantiationMode.EXPLICIT\n );\n }\n}\n\n// undefined should be passed to the service factory for the default instance\nfunction normalizeIdentifierForFactory(identifier: string): string | undefined {\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\n}\n\nfunction isComponentEager<T extends Name>(component: Component<T>): boolean {\n return component.instantiationMode === InstantiationMode.EAGER;\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Provider } from './provider';\nimport { Component } from './component';\nimport { Name } from './types';\n\n/**\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\n */\nexport class ComponentContainer {\n private readonly providers = new Map<string, Provider<Name>>();\n\n constructor(private readonly name: string) {}\n\n /**\n *\n * @param component Component being added\n * @param overwrite When a component with the same name has already been registered,\n * if overwrite is true: overwrite the existing component with the new component and create a new\n * provider with the new component. It can be useful in tests where you want to use different mocks\n * for different tests.\n * if overwrite is false: throw an exception\n */\n addComponent<T extends Name>(component: Component<T>): void {\n const provider = this.getProvider(component.name);\n if (provider.isComponentSet()) {\n throw new Error(\n `Component ${component.name} has already been registered with ${this.name}`\n );\n }\n\n provider.setComponent(component);\n }\n\n addOrOverwriteComponent<T extends Name>(component: Component<T>): void {\n const provider = this.getProvider(component.name);\n if (provider.isComponentSet()) {\n // delete the existing provider from the container, so we can register the new component\n this.providers.delete(component.name);\n }\n\n this.addComponent(component);\n }\n\n /**\n * getProvider provides a type safe interface where it can only be called with a field name\n * present in NameServiceMapping interface.\n *\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\n * themselves.\n */\n getProvider<T extends Name>(name: T): Provider<T> {\n if (this.providers.has(name)) {\n return (this.providers.get(name) as unknown) as Provider<T>;\n }\n\n // create a Provider for a service that hasn't registered with Firebase\n const provider = new Provider<T>(name, this);\n this.providers.set(name, (provider as unknown) as Provider<Name>);\n\n return provider as Provider<T>;\n }\n\n getProviders(): Array<Provider<Name>> {\n return Array.from(this.providers.values());\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport type LogLevelString =\n | 'debug'\n | 'verbose'\n | 'info'\n | 'warn'\n | 'error'\n | 'silent';\n\nexport interface LogOptions {\n level: LogLevelString;\n}\n\nexport type LogCallback = (callbackParams: LogCallbackParams) => void;\n\nexport interface LogCallbackParams {\n level: LogLevelString;\n message: string;\n args: unknown[];\n type: string;\n}\n\n/**\n * A container for all of the Logger instances\n */\nexport const instances: Logger[] = [];\n\n/**\n * The JS SDK supports 5 log levels and also allows a user the ability to\n * silence the logs altogether.\n *\n * The order is a follows:\n * DEBUG < VERBOSE < INFO < WARN < ERROR\n *\n * All of the log types above the current log level will be captured (i.e. if\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\n * `VERBOSE` logs will not)\n */\nexport enum LogLevel {\n DEBUG,\n VERBOSE,\n INFO,\n WARN,\n ERROR,\n SILENT\n}\n\nconst levelStringToEnum: { [key in LogLevelString]: LogLevel } = {\n 'debug': LogLevel.DEBUG,\n 'verbose': LogLevel.VERBOSE,\n 'info': LogLevel.INFO,\n 'warn': LogLevel.WARN,\n 'error': LogLevel.ERROR,\n 'silent': LogLevel.SILENT\n};\n\n/**\n * The default log level\n */\nconst defaultLogLevel: LogLevel = LogLevel.INFO;\n\n/**\n * We allow users the ability to pass their own log handler. We will pass the\n * type of log, the current log level, and any other arguments passed (i.e. the\n * messages that the user wants to log) to this function.\n */\nexport type LogHandler = (\n loggerInstance: Logger,\n logType: LogLevel,\n ...args: unknown[]\n) => void;\n\n/**\n * By default, `console.debug` is not displayed in the developer console (in\n * chrome). To avoid forcing users to have to opt-in to these logs twice\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\n * logs to the `console.log` function.\n */\nconst ConsoleMethod = {\n [LogLevel.DEBUG]: 'log',\n [LogLevel.VERBOSE]: 'log',\n [LogLevel.INFO]: 'info',\n [LogLevel.WARN]: 'warn',\n [LogLevel.ERROR]: 'error'\n};\n\n/**\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\n * messages on to their corresponding console counterparts (if the log method\n * is supported by the current log level)\n */\nconst defaultLogHandler: LogHandler = (instance, logType, ...args): void => {\n if (logType < instance.logLevel) {\n return;\n }\n const now = new Date().toISOString();\n const method = ConsoleMethod[logType as keyof typeof ConsoleMethod];\n if (method) {\n console[method as 'log' | 'info' | 'warn' | 'error'](\n `[${now}] ${instance.name}:`,\n ...args\n );\n } else {\n throw new Error(\n `Attempted to log a message with an invalid logType (value: ${logType})`\n );\n }\n};\n\nexport class Logger {\n /**\n * Gives you an instance of a Logger to capture messages according to\n * Firebase's logging scheme.\n *\n * @param name The name that the logs will be associated with\n */\n constructor(public name: string) {\n /**\n * Capture the current instance for later use\n */\n instances.push(this);\n }\n\n /**\n * The log level of the given Logger instance.\n */\n private _logLevel = defaultLogLevel;\n\n get logLevel(): LogLevel {\n return this._logLevel;\n }\n\n set logLevel(val: LogLevel) {\n if (!(val in LogLevel)) {\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\n }\n this._logLevel = val;\n }\n\n // Workaround for setter/getter having to be the same type.\n setLogLevel(val: LogLevel | LogLevelString): void {\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\n }\n\n /**\n * The main (internal) log handler for the Logger instance.\n * Can be set to a new function in internal package code but not by user.\n */\n private _logHandler: LogHandler = defaultLogHandler;\n get logHandler(): LogHandler {\n return this._logHandler;\n }\n set logHandler(val: LogHandler) {\n if (typeof val !== 'function') {\n throw new TypeError('Value assigned to `logHandler` must be a function');\n }\n this._logHandler = val;\n }\n\n /**\n * The optional, additional, user-defined log handler for the Logger instance.\n */\n private _userLogHandler: LogHandler | null = null;\n get userLogHandler(): LogHandler | null {\n return this._userLogHandler;\n }\n set userLogHandler(val: LogHandler | null) {\n this._userLogHandler = val;\n }\n\n /**\n * The functions below are all based on the `console` interface\n */\n\n debug(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\n this._logHandler(this, LogLevel.DEBUG, ...args);\n }\n log(...args: unknown[]): void {\n this._userLogHandler &&\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\n this._logHandler(this, LogLevel.VERBOSE, ...args);\n }\n info(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\n this._logHandler(this, LogLevel.INFO, ...args);\n }\n warn(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\n this._logHandler(this, LogLevel.WARN, ...args);\n }\n error(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\n this._logHandler(this, LogLevel.ERROR, ...args);\n }\n}\n\nexport function setLogLevel(level: LogLevelString | LogLevel): void {\n instances.forEach(inst => {\n inst.setLogLevel(level);\n });\n}\n\nexport function setUserLogHandler(\n logCallback: LogCallback | null,\n options?: LogOptions\n): void {\n for (const instance of instances) {\n let customLogLevel: LogLevel | null = null;\n if (options && options.level) {\n customLogLevel = levelStringToEnum[options.level];\n }\n if (logCallback === null) {\n instance.userLogHandler = null;\n } else {\n instance.userLogHandler = (\n instance: Logger,\n level: LogLevel,\n ...args: unknown[]\n ) => {\n const message = args\n .map(arg => {\n if (arg == null) {\n return null;\n } else if (typeof arg === 'string') {\n return arg;\n } else if (typeof arg === 'number' || typeof arg === 'boolean') {\n return arg.toString();\n } else if (arg instanceof Error) {\n return arg.message;\n } else {\n try {\n return JSON.stringify(arg);\n } catch (ignored) {\n return null;\n }\n }\n })\n .filter(arg => arg)\n .join(' ');\n if (level >= (customLogLevel ?? instance.logLevel)) {\n logCallback({\n level: LogLevel[level].toLowerCase() as LogLevelString,\n message,\n args,\n type: instance.name\n });\n }\n };\n }\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ComponentContainer,\n ComponentType,\n Provider,\n Name\n} from '@firebase/component';\nimport { PlatformLoggerService, VersionService } from './types';\n\nexport class PlatformLoggerServiceImpl implements PlatformLoggerService {\n constructor(private readonly container: ComponentContainer) {}\n // In initial implementation, this will be called by installations on\n // auth token refresh, and installations will send this string.\n getPlatformInfoString(): string {\n const providers = this.container.getProviders();\n // Loop through providers and get library/version pairs from any that are\n // version components.\n return providers\n .map(provider => {\n if (isVersionServiceProvider(provider)) {\n const service = provider.getImmediate() as VersionService;\n return `${service.library}/${service.version}`;\n } else {\n return null;\n }\n })\n .filter(logString => logString)\n .join(' ');\n }\n}\n/**\n *\n * @param provider check if this provider provides a VersionService\n *\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\n * provides VersionService. The provider is not necessarily a 'app-version'\n * provider.\n */\nfunction isVersionServiceProvider(provider: Provider<Name>): boolean {\n const component = provider.getComponent();\n return component?.type === ComponentType.VERSION;\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Logger } from '@firebase/logger';\n\nexport const logger = new Logger('@firebase/app');\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { name as appName } from '../package.json';\nimport { name as appCompatName } from '../../app-compat/package.json';\nimport { name as analyticsCompatName } from '../../../packages-exp/analytics-compat/package.json';\nimport { name as analyticsName } from '../../../packages-exp/analytics-exp/package.json';\nimport { name as appCheckCompatName } from '../../../packages-exp/app-check-compat/package.json';\nimport { name as appCheckName } from '../../../packages-exp/app-check-exp/package.json';\nimport { name as authName } from '../../../packages-exp/auth-exp/package.json';\nimport { name as authCompatName } from '../../../packages-exp/auth-compat-exp/package.json';\nimport { name as databaseName } from '../../../packages/database/package.json';\nimport { name as databaseCompatName } from '../../../packages/database/compat/package.json';\nimport { name as functionsName } from '../../../packages-exp/functions-exp/package.json';\nimport { name as functionsCompatName } from '../../../packages-exp/functions-compat/package.json';\nimport { name as installationsName } from '../../../packages-exp/installations-exp/package.json';\nimport { name as installationsCompatName } from '../../../packages-exp/installations-compat/package.json';\nimport { name as messagingName } from '../../../packages-exp/messaging-exp/package.json';\nimport { name as messagingCompatName } from '../../../packages-exp/messaging-compat/package.json';\nimport { name as performanceName } from '../../../packages-exp/performance-exp/package.json';\nimport { name as performanceCompatName } from '../../../packages-exp/performance-compat/package.json';\nimport { name as remoteConfigName } from '../../../packages-exp/remote-config-exp/package.json';\nimport { name as remoteConfigCompatName } from '../../../packages-exp/remote-config-compat/package.json';\nimport { name as storageName } from '../../../packages/storage/package.json';\nimport { name as storageCompatName } from '../../../packages/storage/compat/package.json';\nimport { name as firestoreName } from '../../../packages/firestore/package.json';\nimport { name as firestoreCompatName } from '../../../packages/firestore/compat/package.json';\nimport { name as packageName } from '../../../packages-exp/firebase-exp/package.json';\n\n/**\n * The default app name\n *\n * @internal\n */\nexport const DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\nexport const PLATFORM_LOG_STRING = {\n [appName]: 'fire-core',\n [appCompatName]: 'fire-core-compat',\n [analyticsName]: 'fire-analytics',\n [analyticsCompatName]: 'fire-analytics-compat',\n [appCheckName]: 'fire-app-check',\n [appCheckCompatName]: 'fire-app-check-compat',\n [authName]: 'fire-auth',\n [authCompatName]: 'fire-auth-compat',\n [databaseName]: 'fire-rtdb',\n [databaseCompatName]: 'fire-rtdb-compat',\n [functionsName]: 'fire-fn',\n [functionsCompatName]: 'fire-fn-compat',\n [installationsName]: 'fire-iid',\n [installationsCompatName]: 'fire-iid-compat',\n [messagingName]: 'fire-fcm',\n [messagingCompatName]: 'fire-fcm-compat',\n [performanceName]: 'fire-perf',\n [performanceCompatName]: 'fire-perf-compat',\n [remoteConfigName]: 'fire-rc',\n [remoteConfigCompatName]: 'fire-rc-compat',\n [storageName]: 'fire-gcs',\n [storageCompatName]: 'fire-gcs-compat',\n [firestoreName]: 'fire-fst',\n [firestoreCompatName]: 'fire-fst-compat',\n 'fire-js': 'fire-js', // Platform identifier for JS SDK.\n [packageName]: 'fire-js-all'\n} as const;\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseApp } from './public-types';\nimport { Component, Provider, Name } from '@firebase/component';\nimport { logger } from './logger';\nimport { DEFAULT_ENTRY_NAME } from './constants';\nimport { FirebaseAppImpl } from './firebaseApp';\n\n/**\n * @internal\n */\nexport const _apps = new Map<string, FirebaseApp>();\n\n/**\n * Registered components.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const _components = new Map<string, Component<any>>();\n\n/**\n * @param component - the component being added to this app's container\n *\n * @internal\n */\nexport function _addComponent<T extends Name>(\n app: FirebaseApp,\n component: Component<T>\n): void {\n try {\n (app as FirebaseAppImpl).container.addComponent(component);\n } catch (e) {\n logger.debug(\n `Component ${component.name} failed to register with FirebaseApp ${app.name}`,\n e\n );\n }\n}\n\n/**\n *\n * @internal\n */\nexport function _addOrOverwriteComponent(\n app: FirebaseApp,\n component: Component\n): void {\n (app as FirebaseAppImpl).container.addOrOverwriteComponent(component);\n}\n\n/**\n *\n * @param component - the component to register\n * @returns whether or not the component is registered successfully\n *\n * @internal\n */\nexport function _registerComponent<T extends Name>(\n component: Component<T>\n): boolean {\n const componentName = component.name;\n if (_components.has(componentName)) {\n logger.debug(\n `There were multiple attempts to register component ${componentName}.`\n );\n\n return false;\n }\n\n _components.set(componentName, component);\n\n // add the component to existing app instances\n for (const app of _apps.values()) {\n _addComponent(app as FirebaseAppImpl, component);\n }\n\n return true;\n}\n\n/**\n *\n * @param app - FirebaseApp instance\n * @param name - service name\n *\n * @returns the provider for the service with the matching name\n *\n * @internal\n */\nexport function _getProvider<T extends Name>(\n app: FirebaseApp,\n name: T\n): Provider<T> {\n return (app as FirebaseAppImpl).container.getProvider(name);\n}\n\n/**\n *\n * @param app - FirebaseApp instance\n * @param name - service name\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\n *\n * @internal\n */\nexport function _removeServiceInstance<T extends Name>(\n app: FirebaseApp,\n name: T,\n instanceIdentifier: string = DEFAULT_ENTRY_NAME\n): void {\n _getProvider(app, name).clearInstance(instanceIdentifier);\n}\n\n/**\n * Test only\n *\n * @internal\n */\nexport function _clearComponents(): void {\n _components.clear();\n}\n\n/**\n * Exported in order to be used in app-compat package\n */\nexport { DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME };\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ErrorFactory, ErrorMap } from '@firebase/util';\n\nexport const enum AppError {\n NO_APP = 'no-app',\n BAD_APP_NAME = 'bad-app-name',\n DUPLICATE_APP = 'duplicate-app',\n APP_DELETED = 'app-deleted',\n INVALID_APP_ARGUMENT = 'invalid-app-argument',\n INVALID_LOG_ARGUMENT = 'invalid-log-argument'\n}\n\nconst ERRORS: ErrorMap<AppError> = {\n [AppError.NO_APP]:\n \"No Firebase App '{$appName}' has been created - \" +\n 'call Firebase App.initializeApp()',\n [AppError.BAD_APP_NAME]: \"Illegal App name: '{$appName}\",\n [AppError.DUPLICATE_APP]: \"Firebase App named '{$appName}' already exists\",\n [AppError.APP_DELETED]: \"Firebase App named '{$appName}' already deleted\",\n [AppError.INVALID_APP_ARGUMENT]:\n 'firebase.{$appName}() takes either no argument or a ' +\n 'Firebase App instance.',\n [AppError.INVALID_LOG_ARGUMENT]:\n 'First argument to `onLog` must be null or a function.'\n};\n\ninterface ErrorParams {\n [AppError.NO_APP]: { appName: string };\n [AppError.BAD_APP_NAME]: { appName: string };\n [AppError.DUPLICATE_APP]: { appName: string };\n [AppError.APP_DELETED]: { appName: string };\n [AppError.INVALID_APP_ARGUMENT]: { appName: string };\n}\n\nexport const ERROR_FACTORY = new ErrorFactory<AppError, ErrorParams>(\n 'app',\n 'Firebase',\n ERRORS\n);\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n FirebaseApp,\n FirebaseOptions,\n FirebaseAppConfig\n} from './public-types';\nimport {\n ComponentContainer,\n Component,\n ComponentType\n} from '@firebase/component';\nimport { ERROR_FACTORY, AppError } from './errors';\n\nexport class FirebaseAppImpl implements FirebaseApp {\n private readonly _options: FirebaseOptions;\n private readonly _name: string;\n private _automaticDataCollectionEnabled: boolean;\n private _isDeleted = false;\n private readonly _container: ComponentContainer;\n\n constructor(\n options: FirebaseOptions,\n config: Required<FirebaseAppConfig>,\n container: ComponentContainer\n ) {\n this._options = { ...options };\n this._name = config.name;\n this._automaticDataCollectionEnabled =\n config.automaticDataCollectionEnabled;\n this._container = container;\n this.container.addComponent(\n new Component('app-exp', () => this, ComponentType.PUBLIC)\n );\n }\n\n get automaticDataCollectionEnabled(): boolean {\n this.checkDestroyed();\n return this._automaticDataCollectionEnabled;\n }\n\n set automaticDataCollectionEnabled(val: boolean) {\n this.checkDestroyed();\n this._automaticDataCollectionEnabled = val;\n }\n\n get name(): string {\n this.checkDestroyed();\n return this._name;\n }\n\n get options(): FirebaseOptions {\n this.checkDestroyed();\n return this._options;\n }\n\n get container(): ComponentContainer {\n return this._container;\n }\n\n get isDeleted(): boolean {\n return this._isDeleted;\n }\n\n set isDeleted(val: boolean) {\n this._isDeleted = val;\n }\n\n /**\n * This function will throw an Error if the App has already been deleted -\n * use before performing API actions on the App.\n */\n private checkDestroyed(): void {\n if (this.isDeleted) {\n throw ERROR_FACTORY.create(AppError.APP_DELETED, { appName: this._name });\n }\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n FirebaseApp,\n FirebaseOptions,\n FirebaseAppConfig\n} from './public-types';\nimport { DEFAULT_ENTRY_NAME, PLATFORM_LOG_STRING } from './constants';\nimport { ERROR_FACTORY, AppError } from './errors';\nimport {\n ComponentContainer,\n Component,\n Name,\n ComponentType\n} from '@firebase/component';\nimport { version } from '../../firebase-exp/package.json';\nimport { FirebaseAppImpl } from './firebaseApp';\nimport { _apps, _components, _registerComponent } from './internal';\nimport { logger } from './logger';\nimport {\n LogLevelString,\n setLogLevel as setLogLevelImpl,\n LogCallback,\n LogOptions,\n setUserLogHandler\n} from '@firebase/logger';\n\n/**\n * The current SDK version.\n *\n * @public\n */\nexport const SDK_VERSION = version;\n\n/**\n * Creates and initializes a FirebaseApp instance.\n *\n * See\n * {@link\n * https://firebase.google.com/docs/web/setup#add_firebase_to_your_app\n * | Add Firebase to your app} and\n * {@link\n * https://firebase.google.com/docs/web/setup#multiple-projects\n * | Initialize multiple projects} for detailed documentation.\n *\n * @example\n * ```javascript\n *\n * // Initialize default app\n * // Retrieve your own options values by adding a web app on\n * // https://console.firebase.google.com\n * initializeApp({\n * apiKey: \"AIza....\", // Auth / General Use\n * authDomain: \"YOUR_APP.firebaseapp.com\", // Auth with popup/redirect\n * databaseURL: \"https://YOUR_APP.firebaseio.com\", // Realtime Database\n * storageBucket: \"YOUR_APP.appspot.com\", // Storage\n * messagingSenderId: \"123456789\" // Cloud Messaging\n * });\n * ```\n *\n * @example\n * ```javascript\n *\n * // Initialize another app\n * const otherApp = initializeApp({\n * databaseURL: \"https://<OTHER_DATABASE_NAME>.firebaseio.com\",\n * storageBucket: \"<OTHER_STORAGE_BUCKET>.appspot.com\"\n * }, \"otherApp\");\n * ```\n *\n * @param options - Options to configure the app's services.\n * @param name - Optional name of the app to initialize. If no name\n * is provided, the default is `\"[DEFAULT]\"`.\n *\n * @returns The initialized app.\n *\n * @public\n */\nexport function initializeApp(\n options: FirebaseOptions,\n name?: string\n): FirebaseApp;\n/**\n * Creates and initializes a FirebaseApp instance.\n *\n * @param options - Options to configure the app's services.\n * @param config - FirebaseApp Configuration\n *\n * @public\n */\nexport function initializeApp(\n options: FirebaseOptions,\n config?: FirebaseAppConfig\n): FirebaseApp;\nexport function initializeApp(\n options: FirebaseOptions,\n rawConfig = {}\n): FirebaseApp {\n if (typeof rawConfig !== 'object') {\n const name = rawConfig;\n rawConfig = { name };\n }\n\n const config: Required<FirebaseAppConfig> = {\n name: DEFAULT_ENTRY_NAME,\n automaticDataCollectionEnabled: false,\n ...rawConfig\n };\n const name = config.name;\n\n if (typeof name !== 'string' || !name) {\n throw ERROR_FACTORY.create(AppError.BAD_APP_NAME, {\n appName: String(name)\n });\n }\n\n if (_apps.has(name)) {\n throw ERROR_FACTORY.create(AppError.DUPLICATE_APP, { appName: name });\n }\n\n const container = new ComponentContainer(name);\n for (const component of _components.values()) {\n container.addComponent(component);\n }\n\n const newApp = new FirebaseAppImpl(options, config, container);\n\n _apps.set(name, newApp);\n\n return newApp;\n}\n\n/**\n * Retrieves a FirebaseApp instance.\n *\n * When called with no arguments, the default app is returned. When an app name\n * is provided, the app corresponding to that name is returned.\n *\n * An exception is thrown if the app being retrieved has not yet been\n * initialized.\n *\n * @example\n * ```javascript\n * // Return the default app\n * const app = getApp();\n * ```\n *\n * @example\n * ```javascript\n * // Return a named app\n * const otherApp = getApp(\"otherApp\");\n * ```\n *\n * @param name - Optional name of the app to return. If no name is\n * provided, the default is `\"[DEFAULT]\"`.\n *\n * @returns The app corresponding to the provided app name.\n * If no app name is provided, the default app is returned.\n *\n * @public\n */\nexport function getApp(name: string = DEFAULT_ENTRY_NAME): FirebaseApp {\n const app = _apps.get(name);\n if (!app) {\n throw ERROR_FACTORY.create(AppError.NO_APP, { appName: name });\n }\n\n return app;\n}\n\n/**\n * A (read-only) array of all initialized apps.\n * @public\n */\nexport function getApps(): FirebaseApp[] {\n return Array.from(_apps.values());\n}\n\n/**\n * Renders this app unusable and frees the resources of all associated\n * services.\n *\n * @example\n * ```javascript\n * deleteApp(app)\n * .then(function() {\n * console.log(\"App deleted successfully\");\n * })\n * .catch(function(error) {\n * console.log(\"Error deleting app:\", error);\n * });\n * ```\n *\n * @public\n */\nexport async function deleteApp(app: FirebaseApp): Promise<void> {\n const name = app.name;\n if (_apps.has(name)) {\n _apps.delete(name);\n await Promise.all(\n (app as FirebaseAppImpl).container\n .getProviders()\n .map(provider => provider.delete())\n );\n (app as FirebaseAppImpl).isDeleted = true;\n }\n}\n\n/**\n * Registers a library's name and version for platform logging purposes.\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\n * @param version - Current version of that library.\n * @param variant - Bundle variant, e.g., node, rn, etc.\n *\n * @public\n */\nexport function registerVersion(\n libraryKeyOrName: string,\n version: string,\n variant?: string\n): void {\n // TODO: We can use this check to whitelist strings when/if we set up\n // a good whitelist system.\n let library = PLATFORM_LOG_STRING[libraryKeyOrName] ?? libraryKeyOrName;\n if (variant) {\n library += `-${variant}`;\n }\n const libraryMismatch = library.match(/\\s|\\//);\n const versionMismatch = version.match(/\\s|\\//);\n if (libraryMismatch || versionMismatch) {\n const warning = [\n `Unable to register library \"${library}\" with version \"${version}\":`\n ];\n if (libraryMismatch) {\n warning.push(\n `library name \"${library}\" contains illegal characters (whitespace or \"/\")`\n );\n }\n if (libraryMismatch && versionMismatch) {\n warning.push('and');\n }\n if (versionMismatch) {\n warning.push(\n `version name \"${version}\" contains illegal characters (whitespace or \"/\")`\n );\n }\n logger.warn(warning.join(' '));\n return;\n }\n _registerComponent(\n new Component(\n `${library}-version` as Name,\n () => ({ library, version }),\n ComponentType.VERSION\n )\n );\n}\n\n/**\n * Sets log handler for all Firebase SDKs.\n * @param logCallback - An optional custom log handler that executes user code whenever\n * the Firebase SDK makes a logging call.\n *\n * @public\n */\nexport function onLog(\n logCallback: LogCallback | null,\n options?: LogOptions\n): void {\n if (logCallback !== null && typeof logCallback !== 'function') {\n throw ERROR_FACTORY.create(AppError.INVALID_LOG_ARGUMENT);\n }\n setUserLogHandler(logCallback, options);\n}\n\n/**\n * Sets log level for all Firebase SDKs.\n *\n * All of the log types above the current log level are captured (i.e. if\n * you set the log level to `info`, errors are logged, but `debug` and\n * `verbose` logs are not).\n *\n * @public\n */\nexport function setLogLevel(logLevel: LogLevelString): void {\n setLogLevelImpl(logLevel);\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Component, ComponentType } from '@firebase/component';\nimport { PlatformLoggerServiceImpl } from './platformLoggerService';\nimport { name, version } from '../package.json';\nimport { _registerComponent } from './internal';\nimport { registerVersion } from './api';\n\nexport function registerCoreComponents(variant?: string): void {\n _registerComponent(\n new Component(\n 'platform-logger',\n container => new PlatformLoggerServiceImpl(container),\n ComponentType.PRIVATE\n )\n );\n\n // Register `app` package.\n registerVersion(name, version, variant);\n // Register platform SDK identifier (no version).\n registerVersion('fire-js', '');\n}\n", "/**\n * Firebase App\n *\n * @remarks This package coordinates the communication between the different Firebase components\n * @packageDocumentation\n */\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { registerCoreComponents } from './registerCoreComponents';\n\nexport * from './api';\nexport * from './internal';\nexport * from './public-types';\n\nregisterCoreComponents();\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { registerVersion } from '@firebase/app-exp';\nimport { name, version } from '../package.json';\n\nregisterVersion(name, version, 'app');\nexport * from '@firebase/app-exp';\n", "export * from '@firebase/auth';\n//# sourceMappingURL=index.esm.js.map\n", "import '@firebase/app';\nexport { w as ActionCodeOperation, ax as ActionCodeURL, a3 as AuthCredential, a4 as EmailAuthCredential, a8 as EmailAuthProvider, a9 as FacebookAuthProvider, u as FactorId, ab as GithubAuthProvider, aa as GoogleAuthProvider, a5 as OAuthCredential, ac as OAuthProvider, O as OperationType, a6 as PhoneAuthCredential, y as PhoneAuthProvider, N as PhoneMultiFactorGenerator, P as ProviderId, R as RecaptchaVerifier, ad as SAMLAuthProvider, v as SignInMethod, ae as TwitterAuthProvider, am as applyActionCode, j as browserLocalPersistence, M as browserPopupRedirectResolver, l as browserSessionPersistence, an as checkActionCode, al as confirmPasswordReset, a2 as connectAuthEmulator, ap as createUserWithEmailAndPassword, $ as debugErrorMap, Z as deleteUser, au as fetchSignInMethodsForEmail, aF as getAdditionalUserInfo, t as getAuth, aC as getIdToken, aD as getIdTokenResult, aH as getMultiFactorResolver, L as getRedirectResult, a7 as inMemoryPersistence, x as indexedDBLocalPersistence, a1 as initializeAuth, as as isSignInWithEmailLink, ah as linkWithCredential, B as linkWithPhoneNumber, G as linkWithPopup, J as linkWithRedirect, aI as multiFactor, V as onAuthStateChanged, T as onIdTokenChanged, ay as parseActionCodeURL, a0 as prodErrorMap, ai as reauthenticateWithCredential, C as reauthenticateWithPhoneNumber, H as reauthenticateWithPopup, K as reauthenticateWithRedirect, aG as reload, av as sendEmailVerification, ak as sendPasswordResetEmail, ar as sendSignInLinkToEmail, Q as setPersistence, af as signInAnonymously, ag as signInWithCredential, aj as signInWithCustomToken, aq as signInWithEmailAndPassword, at as signInWithEmailLink, z as signInWithPhoneNumber, E as signInWithPopup, I as signInWithRedirect, Y as signOut, aE as unlink, X as updateCurrentUser, aA as updateEmail, aB as updatePassword, D as updatePhoneNumber, az as updateProfile, W as useDeviceLanguage, aw as verifyBeforeUpdateEmail, ao as verifyPasswordResetCode } from './index-ac2ee1c0.js';\nimport '@firebase/component';\nimport '@firebase/util';\nimport '@firebase/logger';\nimport 'tslib';\n//# sourceMappingURL=index.js.map\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { AuthErrorMap, User } from '../model/public_types';\nimport { ErrorFactory, ErrorMap } from '@firebase/util';\n\nimport { IdTokenMfaResponse } from '../api/authentication/mfa';\nimport { AppName } from '../model/auth';\nimport { AuthCredential } from './credentials';\n\n/**\n * Enumeration of Firebase Auth error codes.\n *\n * @public\n */\nexport const enum AuthErrorCode {\n ADMIN_ONLY_OPERATION = 'admin-restricted-operation',\n ARGUMENT_ERROR = 'argument-error',\n APP_NOT_AUTHORIZED = 'app-not-authorized',\n APP_NOT_INSTALLED = 'app-not-installed',\n CAPTCHA_CHECK_FAILED = 'captcha-check-failed',\n CODE_EXPIRED = 'code-expired',\n CORDOVA_NOT_READY = 'cordova-not-ready',\n CORS_UNSUPPORTED = 'cors-unsupported',\n CREDENTIAL_ALREADY_IN_USE = 'credential-already-in-use',\n CREDENTIAL_MISMATCH = 'custom-token-mismatch',\n CREDENTIAL_TOO_OLD_LOGIN_AGAIN = 'requires-recent-login',\n DEPENDENT_SDK_INIT_BEFORE_AUTH = 'dependent-sdk-initialized-before-auth',\n DYNAMIC_LINK_NOT_ACTIVATED = 'dynamic-link-not-activated',\n EMAIL_CHANGE_NEEDS_VERIFICATION = 'email-change-needs-verification',\n EMAIL_EXISTS = 'email-already-in-use',\n EMULATOR_CONFIG_FAILED = 'emulator-config-failed',\n EXPIRED_OOB_CODE = 'expired-action-code',\n EXPIRED_POPUP_REQUEST = 'cancelled-popup-request',\n INTERNAL_ERROR = 'internal-error',\n INVALID_API_KEY = 'invalid-api-key',\n INVALID_APP_CREDENTIAL = 'invalid-app-credential',\n INVALID_APP_ID = 'invalid-app-id',\n INVALID_AUTH = 'invalid-user-token',\n INVALID_AUTH_EVENT = 'invalid-auth-event',\n INVALID_CERT_HASH = 'invalid-cert-hash',\n INVALID_CODE = 'invalid-verification-code',\n INVALID_CONTINUE_URI = 'invalid-continue-uri',\n INVALID_CORDOVA_CONFIGURATION = 'invalid-cordova-configuration',\n INVALID_CUSTOM_TOKEN = 'invalid-custom-token',\n INVALID_DYNAMIC_LINK_DOMAIN = 'invalid-dynamic-link-domain',\n INVALID_EMAIL = 'invalid-email',\n INVALID_EMULATOR_SCHEME = 'invalid-emulator-scheme',\n INVALID_IDP_RESPONSE = 'invalid-credential',\n INVALID_MESSAGE_PAYLOAD = 'invalid-message-payload',\n INVALID_MFA_SESSION = 'invalid-multi-factor-session',\n INVALID_OAUTH_CLIENT_ID = 'invalid-oauth-client-id',\n INVALID_OAUTH_PROVIDER = 'invalid-oauth-provider',\n INVALID_OOB_CODE = 'invalid-action-code',\n INVALID_ORIGIN = 'unauthorized-domain',\n INVALID_PASSWORD = 'wrong-password',\n INVALID_PERSISTENCE = 'invalid-persistence-type',\n INVALID_PHONE_NUMBER = 'invalid-phone-number',\n INVALID_PROVIDER_ID = 'invalid-provider-id',\n INVALID_RECIPIENT_EMAIL = 'invalid-recipient-email',\n INVALID_SENDER = 'invalid-sender',\n INVALID_SESSION_INFO = 'invalid-verification-id',\n INVALID_TENANT_ID = 'invalid-tenant-id',\n MFA_INFO_NOT_FOUND = 'multi-factor-info-not-found',\n MFA_REQUIRED = 'multi-factor-auth-required',\n MISSING_ANDROID_PACKAGE_NAME = 'missing-android-pkg-name',\n MISSING_APP_CREDENTIAL = 'missing-app-credential',\n MISSING_AUTH_DOMAIN = 'auth-domain-config-required',\n MISSING_CODE = 'missing-verification-code',\n MISSING_CONTINUE_URI = 'missing-continue-uri',\n MISSING_IFRAME_START = 'missing-iframe-start',\n MISSING_IOS_BUNDLE_ID = 'missing-ios-bundle-id',\n MISSING_OR_INVALID_NONCE = 'missing-or-invalid-nonce',\n MISSING_MFA_INFO = 'missing-multi-factor-info',\n MISSING_MFA_SESSION = 'missing-multi-factor-session',\n MISSING_PHONE_NUMBER = 'missing-phone-number',\n MISSING_SESSION_INFO = 'missing-verification-id',\n MODULE_DESTROYED = 'app-deleted',\n NEED_CONFIRMATION = 'account-exists-with-different-credential',\n NETWORK_REQUEST_FAILED = 'network-request-failed',\n NULL_USER = 'null-user',\n NO_AUTH_EVENT = 'no-auth-event',\n NO_SUCH_PROVIDER = 'no-such-provider',\n OPERATION_NOT_ALLOWED = 'operation-not-allowed',\n OPERATION_NOT_SUPPORTED = 'operation-not-supported-in-this-environment',\n POPUP_BLOCKED = 'popup-blocked',\n POPUP_CLOSED_BY_USER = 'popup-closed-by-user',\n PROVIDER_ALREADY_LINKED = 'provider-already-linked',\n QUOTA_EXCEEDED = 'quota-exceeded',\n REDIRECT_CANCELLED_BY_USER = 'redirect-cancelled-by-user',\n REDIRECT_OPERATION_PENDING = 'redirect-operation-pending',\n REJECTED_CREDENTIAL = 'rejected-credential',\n SECOND_FACTOR_ALREADY_ENROLLED = 'second-factor-already-in-use',\n SECOND_FACTOR_LIMIT_EXCEEDED = 'maximum-second-factor-count-exceeded',\n TENANT_ID_MISMATCH = 'tenant-id-mismatch',\n TIMEOUT = 'timeout',\n TOKEN_EXPIRED = 'user-token-expired',\n TOO_MANY_ATTEMPTS_TRY_LATER = 'too-many-requests',\n UNAUTHORIZED_DOMAIN = 'unauthorized-continue-uri',\n UNSUPPORTED_FIRST_FACTOR = 'unsupported-first-factor',\n UNSUPPORTED_PERSISTENCE = 'unsupported-persistence-type',\n UNSUPPORTED_TENANT_OPERATION = 'unsupported-tenant-operation',\n UNVERIFIED_EMAIL = 'unverified-email',\n USER_CANCELLED = 'user-cancelled',\n USER_DELETED = 'user-not-found',\n USER_DISABLED = 'user-disabled',\n USER_MISMATCH = 'user-mismatch',\n USER_SIGNED_OUT = 'user-signed-out',\n WEAK_PASSWORD = 'weak-password',\n WEB_STORAGE_UNSUPPORTED = 'web-storage-unsupported',\n ALREADY_INITIALIZED = 'already-initialized'\n}\n\nfunction _debugErrorMap(): ErrorMap<AuthErrorCode> {\n return {\n [AuthErrorCode.ADMIN_ONLY_OPERATION]:\n 'This operation is restricted to administrators only.',\n [AuthErrorCode.ARGUMENT_ERROR]: '',\n [AuthErrorCode.APP_NOT_AUTHORIZED]:\n \"This app, identified by the domain where it's hosted, is not \" +\n 'authorized to use Firebase Authentication with the provided API key. ' +\n 'Review your key configuration in the Google API console.',\n [AuthErrorCode.APP_NOT_INSTALLED]:\n 'The requested mobile application corresponding to the identifier (' +\n 'Android package name or iOS bundle ID) provided is not installed on ' +\n 'this device.',\n [AuthErrorCode.CAPTCHA_CHECK_FAILED]:\n 'The reCAPTCHA response token provided is either invalid, expired, ' +\n 'already used or the domain associated with it does not match the list ' +\n 'of whitelisted domains.',\n [AuthErrorCode.CODE_EXPIRED]:\n 'The SMS code has expired. Please re-send the verification code to try ' +\n 'again.',\n [AuthErrorCode.CORDOVA_NOT_READY]: 'Cordova framework is not ready.',\n [AuthErrorCode.CORS_UNSUPPORTED]: 'This browser is not supported.',\n [AuthErrorCode.CREDENTIAL_ALREADY_IN_USE]:\n 'This credential is already associated with a different user account.',\n [AuthErrorCode.CREDENTIAL_MISMATCH]:\n 'The custom token corresponds to a different audience.',\n [AuthErrorCode.CREDENTIAL_TOO_OLD_LOGIN_AGAIN]:\n 'This operation is sensitive and requires recent authentication. Log in ' +\n 'again before retrying this request.',\n [AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH]:\n 'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' +\n 'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' +\n 'starting any other Firebase SDK.',\n [AuthErrorCode.DYNAMIC_LINK_NOT_ACTIVATED]:\n 'Please activate Dynamic Links in the Firebase Console and agree to the terms and ' +\n 'conditions.',\n [AuthErrorCode.EMAIL_CHANGE_NEEDS_VERIFICATION]:\n 'Multi-factor users must always have a verified email.',\n [AuthErrorCode.EMAIL_EXISTS]:\n 'The email address is already in use by another account.',\n [AuthErrorCode.EMULATOR_CONFIG_FAILED]:\n 'Auth instance has already been used to make a network call. Auth can ' +\n 'no longer be configured to use the emulator. Try calling ' +\n '\"connectAuthEmulator()\" sooner.',\n [AuthErrorCode.EXPIRED_OOB_CODE]: 'The action code has expired.',\n [AuthErrorCode.EXPIRED_POPUP_REQUEST]:\n 'This operation has been cancelled due to another conflicting popup being opened.',\n [AuthErrorCode.INTERNAL_ERROR]: 'An internal AuthError has occurred.',\n [AuthErrorCode.INVALID_APP_CREDENTIAL]:\n 'The phone verification request contains an invalid application verifier.' +\n ' The reCAPTCHA token response is either invalid or expired.',\n [AuthErrorCode.INVALID_APP_ID]:\n 'The mobile app identifier is not registed for the current project.',\n [AuthErrorCode.INVALID_AUTH]:\n \"This user's credential isn't valid for this project. This can happen \" +\n \"if the user's token has been tampered with, or if the user isn't for \" +\n 'the project associated with this API key.',\n [AuthErrorCode.INVALID_AUTH_EVENT]: 'An internal AuthError has occurred.',\n [AuthErrorCode.INVALID_CODE]:\n 'The SMS verification code used to create the phone auth credential is ' +\n 'invalid. Please resend the verification code sms and be sure to use the ' +\n 'verification code provided by the user.',\n [AuthErrorCode.INVALID_CONTINUE_URI]:\n 'The continue URL provided in the request is invalid.',\n [AuthErrorCode.INVALID_CORDOVA_CONFIGURATION]:\n 'The following Cordova plugins must be installed to enable OAuth sign-in: ' +\n 'cordova-plugin-buildinfo, cordova-universal-links-plugin, ' +\n 'cordova-plugin-browsertab, cordova-plugin-inappbrowser and ' +\n 'cordova-plugin-customurlscheme.',\n [AuthErrorCode.INVALID_CUSTOM_TOKEN]:\n 'The custom token format is incorrect. Please check the documentation.',\n [AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN]:\n 'The provided dynamic link domain is not configured or authorized for the current project.',\n [AuthErrorCode.INVALID_EMAIL]: 'The email address is badly formatted.',\n [AuthErrorCode.INVALID_EMULATOR_SCHEME]:\n 'Emulator URL must start with a valid scheme (http:// or https://).',\n [AuthErrorCode.INVALID_API_KEY]:\n 'Your API key is invalid, please check you have copied it correctly.',\n [AuthErrorCode.INVALID_CERT_HASH]:\n 'The SHA-1 certificate hash provided is invalid.',\n [AuthErrorCode.INVALID_IDP_RESPONSE]:\n 'The supplied auth credential is malformed or has expired.',\n [AuthErrorCode.INVALID_MESSAGE_PAYLOAD]:\n 'The email template corresponding to this action contains invalid characters in its message. ' +\n 'Please fix by going to the Auth email templates section in the Firebase Console.',\n [AuthErrorCode.INVALID_MFA_SESSION]:\n 'The request does not contain a valid proof of first factor successful sign-in.',\n [AuthErrorCode.INVALID_OAUTH_PROVIDER]:\n 'EmailAuthProvider is not supported for this operation. This operation ' +\n 'only supports OAuth providers.',\n [AuthErrorCode.INVALID_OAUTH_CLIENT_ID]:\n 'The OAuth client ID provided is either invalid or does not match the ' +\n 'specified API key.',\n [AuthErrorCode.INVALID_ORIGIN]:\n 'This domain is not authorized for OAuth operations for your Firebase ' +\n 'project. Edit the list of authorized domains from the Firebase console.',\n [AuthErrorCode.INVALID_OOB_CODE]:\n 'The action code is invalid. This can happen if the code is malformed, ' +\n 'expired, or has already been used.',\n [AuthErrorCode.INVALID_PASSWORD]:\n 'The password is invalid or the user does not have a password.',\n [AuthErrorCode.INVALID_PERSISTENCE]:\n 'The specified persistence type is invalid. It can only be local, session or none.',\n [AuthErrorCode.INVALID_PHONE_NUMBER]:\n 'The format of the phone number provided is incorrect. Please enter the ' +\n 'phone number in a format that can be parsed into E.164 format. E.164 ' +\n 'phone numbers are written in the format [+][country code][subscriber ' +\n 'number including area code].',\n [AuthErrorCode.INVALID_PROVIDER_ID]:\n 'The specified provider ID is invalid.',\n [AuthErrorCode.INVALID_RECIPIENT_EMAIL]:\n 'The email corresponding to this action failed to send as the provided ' +\n 'recipient email address is invalid.',\n [AuthErrorCode.INVALID_SENDER]:\n 'The email template corresponding to this action contains an invalid sender email or name. ' +\n 'Please fix by going to the Auth email templates section in the Firebase Console.',\n [AuthErrorCode.INVALID_SESSION_INFO]:\n 'The verification ID used to create the phone auth credential is invalid.',\n [AuthErrorCode.INVALID_TENANT_ID]:\n \"The Auth instance's tenant ID is invalid.\",\n [AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME]:\n 'An Android Package Name must be provided if the Android App is required to be installed.',\n [AuthErrorCode.MISSING_AUTH_DOMAIN]:\n 'Be sure to include authDomain when calling firebase.initializeApp(), ' +\n 'by following the instructions in the Firebase console.',\n [AuthErrorCode.MISSING_APP_CREDENTIAL]:\n 'The phone verification request is missing an application verifier ' +\n 'assertion. A reCAPTCHA response token needs to be provided.',\n [AuthErrorCode.MISSING_CODE]:\n 'The phone auth credential was created with an empty SMS verification code.',\n [AuthErrorCode.MISSING_CONTINUE_URI]:\n 'A continue URL must be provided in the request.',\n [AuthErrorCode.MISSING_IFRAME_START]: 'An internal AuthError has occurred.',\n [AuthErrorCode.MISSING_IOS_BUNDLE_ID]:\n 'An iOS Bundle ID must be provided if an App Store ID is provided.',\n [AuthErrorCode.MISSING_OR_INVALID_NONCE]:\n 'The request does not contain a valid nonce. This can occur if the ' +\n 'SHA-256 hash of the provided raw nonce does not match the hashed nonce ' +\n 'in the ID token payload.',\n [AuthErrorCode.MISSING_MFA_INFO]:\n 'No second factor identifier is provided.',\n [AuthErrorCode.MISSING_MFA_SESSION]:\n 'The request is missing proof of first factor successful sign-in.',\n [AuthErrorCode.MISSING_PHONE_NUMBER]:\n 'To send verification codes, provide a phone number for the recipient.',\n [AuthErrorCode.MISSING_SESSION_INFO]:\n 'The phone auth credential was created with an empty verification ID.',\n [AuthErrorCode.MODULE_DESTROYED]:\n 'This instance of FirebaseApp has been deleted.',\n [AuthErrorCode.MFA_INFO_NOT_FOUND]:\n 'The user does not have a second factor matching the identifier provided.',\n [AuthErrorCode.MFA_REQUIRED]:\n 'Proof of ownership of a second factor is required to complete sign-in.',\n [AuthErrorCode.NEED_CONFIRMATION]:\n 'An account already exists with the same email address but different ' +\n 'sign-in credentials. Sign in using a provider associated with this ' +\n 'email address.',\n [AuthErrorCode.NETWORK_REQUEST_FAILED]:\n 'A network AuthError (such as timeout, interrupted connection or unreachable host) has occurred.',\n [AuthErrorCode.NO_AUTH_EVENT]: 'An internal AuthError has occurred.',\n [AuthErrorCode.NO_SUCH_PROVIDER]:\n 'User was not linked to an account with the given provider.',\n [AuthErrorCode.NULL_USER]:\n 'A null user object was provided as the argument for an operation which ' +\n 'requires a non-null user object.',\n [AuthErrorCode.OPERATION_NOT_ALLOWED]:\n 'The given sign-in provider is disabled for this Firebase project. ' +\n 'Enable it in the Firebase console, under the sign-in method tab of the ' +\n 'Auth section.',\n [AuthErrorCode.OPERATION_NOT_SUPPORTED]:\n 'This operation is not supported in the environment this application is ' +\n 'running on. \"location.protocol\" must be http, https or chrome-extension' +\n ' and web storage must be enabled.',\n [AuthErrorCode.POPUP_BLOCKED]:\n 'Unable to establish a connection with the popup. It may have been blocked by the browser.',\n [AuthErrorCode.POPUP_CLOSED_BY_USER]:\n 'The popup has been closed by the user before finalizing the operation.',\n [AuthErrorCode.PROVIDER_ALREADY_LINKED]:\n 'User can only be linked to one identity for the given provider.',\n [AuthErrorCode.QUOTA_EXCEEDED]:\n \"The project's quota for this operation has been exceeded.\",\n [AuthErrorCode.REDIRECT_CANCELLED_BY_USER]:\n 'The redirect operation has been cancelled by the user before finalizing.',\n [AuthErrorCode.REDIRECT_OPERATION_PENDING]:\n 'A redirect sign-in operation is already pending.',\n [AuthErrorCode.REJECTED_CREDENTIAL]:\n 'The request contains malformed or mismatching credentials.',\n [AuthErrorCode.SECOND_FACTOR_ALREADY_ENROLLED]:\n 'The second factor is already enrolled on this account.',\n [AuthErrorCode.SECOND_FACTOR_LIMIT_EXCEEDED]:\n 'The maximum allowed number of second factors on a user has been exceeded.',\n [AuthErrorCode.TENANT_ID_MISMATCH]:\n \"The provided tenant ID does not match the Auth instance's tenant ID\",\n [AuthErrorCode.TIMEOUT]: 'The operation has timed out.',\n [AuthErrorCode.TOKEN_EXPIRED]:\n \"The user's credential is no longer valid. The user must sign in again.\",\n [AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER]:\n 'We have blocked all requests from this device due to unusual activity. ' +\n 'Try again later.',\n [AuthErrorCode.UNAUTHORIZED_DOMAIN]:\n 'The domain of the continue URL is not whitelisted. Please whitelist ' +\n 'the domain in the Firebase console.',\n [AuthErrorCode.UNSUPPORTED_FIRST_FACTOR]:\n 'Enrolling a second factor or signing in with a multi-factor account requires sign-in with a supported first factor.',\n [AuthErrorCode.UNSUPPORTED_PERSISTENCE]:\n 'The current environment does not support the specified persistence type.',\n [AuthErrorCode.UNSUPPORTED_TENANT_OPERATION]:\n 'This operation is not supported in a multi-tenant context.',\n [AuthErrorCode.UNVERIFIED_EMAIL]:\n 'The operation requires a verified email.',\n [AuthErrorCode.USER_CANCELLED]:\n 'The user did not grant your application the permissions it requested.',\n [AuthErrorCode.USER_DELETED]:\n 'There is no user record corresponding to this identifier. The user may ' +\n 'have been deleted.',\n [AuthErrorCode.USER_DISABLED]:\n 'The user account has been disabled by an administrator.',\n [AuthErrorCode.USER_MISMATCH]:\n 'The supplied credentials do not correspond to the previously signed in user.',\n [AuthErrorCode.USER_SIGNED_OUT]: '',\n [AuthErrorCode.WEAK_PASSWORD]:\n 'The password must be 6 characters long or more.',\n [AuthErrorCode.WEB_STORAGE_UNSUPPORTED]:\n 'This browser is not supported or 3rd party cookies and data may be disabled.',\n [AuthErrorCode.ALREADY_INITIALIZED]:\n 'Auth can only be initialized once per app.'\n };\n}\n\nexport interface ErrorMapRetriever extends AuthErrorMap {\n (): ErrorMap<AuthErrorCode>;\n}\n\nfunction _prodErrorMap(): ErrorMap<AuthErrorCode> {\n // We will include this one message in the prod error map since by the very\n // nature of this error, developers will never be able to see the message\n // using the debugErrorMap (which is installed during auth initialization).\n return {\n [AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH]:\n 'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' +\n 'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' +\n 'starting any other Firebase SDK.'\n } as ErrorMap<AuthErrorCode>;\n}\n\n/**\n * A verbose error map with detailed descriptions for most error codes.\n *\n * See discussion at {@link AuthErrorMap}\n *\n * @public\n */\nexport const debugErrorMap: AuthErrorMap = _debugErrorMap;\n\n/**\n * A minimal error map with all verbose error messages stripped.\n *\n * See discussion at {@link AuthErrorMap}\n *\n * @public\n */\nexport const prodErrorMap: AuthErrorMap = _prodErrorMap;\n\nexport interface NamedErrorParams {\n appName: AppName;\n credential?: AuthCredential;\n email?: string;\n phoneNumber?: string;\n tenantId?: string;\n user?: User;\n serverResponse?: object;\n}\n\ntype GenericAuthErrorParams = {\n [key in Exclude<\n AuthErrorCode,\n | AuthErrorCode.ARGUMENT_ERROR\n | AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH\n | AuthErrorCode.INTERNAL_ERROR\n | AuthErrorCode.MFA_REQUIRED\n | AuthErrorCode.NO_AUTH_EVENT\n >]: {\n appName: AppName;\n email?: string;\n phoneNumber?: string;\n };\n};\n\nexport interface AuthErrorParams extends GenericAuthErrorParams {\n [AuthErrorCode.ARGUMENT_ERROR]: { appName?: AppName };\n [AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH]: { appName?: AppName };\n [AuthErrorCode.INTERNAL_ERROR]: { appName?: AppName };\n [AuthErrorCode.NO_AUTH_EVENT]: { appName?: AppName };\n [AuthErrorCode.MFA_REQUIRED]: {\n appName: AppName;\n serverResponse: IdTokenMfaResponse;\n };\n [AuthErrorCode.INVALID_CORDOVA_CONFIGURATION]: {\n appName: AppName;\n missingPlugin?: string;\n };\n}\n\nexport const _DEFAULT_AUTH_ERROR_FACTORY = new ErrorFactory<\n AuthErrorCode,\n AuthErrorParams\n>('auth', 'Firebase', _prodErrorMap());\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Logger, LogLevel } from '@firebase/logger';\nimport { SDK_VERSION } from '@firebase/app-exp';\n\nexport { LogLevel };\n\nconst logClient = new Logger('@firebase/auth-exp');\n\n// Helper methods are needed because variables can't be exported as read/write\nexport function _getLogLevel(): LogLevel {\n return logClient.logLevel;\n}\n\nexport function _setLogLevel(newLevel: LogLevel): void {\n logClient.logLevel = newLevel;\n}\n\nexport function _logDebug(msg: string, ...args: string[]): void {\n if (logClient.logLevel <= LogLevel.DEBUG) {\n logClient.debug(`Auth (${SDK_VERSION}): ${msg}`, ...args);\n }\n}\n\nexport function _logError(msg: string, ...args: string[]): void {\n if (logClient.logLevel <= LogLevel.ERROR) {\n logClient.error(`Auth (${SDK_VERSION}): ${msg}`, ...args);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Auth } from '../../model/public_types';\nimport { FirebaseError } from '@firebase/util';\nimport { AuthInternal } from '../../model/auth';\nimport {\n _DEFAULT_AUTH_ERROR_FACTORY,\n AuthErrorCode,\n AuthErrorParams\n} from '../errors';\nimport { _logError } from './log';\n\ntype AuthErrorListParams<K> = K extends keyof AuthErrorParams\n ? [AuthErrorParams[K]]\n : [];\ntype LessAppName<K extends AuthErrorCode> = Omit<AuthErrorParams[K], 'appName'>;\n\n/**\n * Unconditionally fails, throwing a developer facing INTERNAL_ERROR\n *\n * @example\n * ```javascript\n * fail(auth, AuthErrorCode.MFA_REQUIRED); // Error: the MFA_REQUIRED error needs more params than appName\n * fail(auth, AuthErrorCode.MFA_REQUIRED, {serverResponse}); // Compiles\n * fail(AuthErrorCode.INTERNAL_ERROR); // Compiles; internal error does not need appName\n * fail(AuthErrorCode.USER_DELETED); // Error: USER_DELETED requires app name\n * fail(auth, AuthErrorCode.USER_DELETED); // Compiles; USER_DELETED _only_ needs app name\n * ```\n *\n * @param appName App name for tagging the error\n * @throws FirebaseError\n */\nexport function _fail<K extends AuthErrorCode>(\n code: K,\n ...data: {} extends AuthErrorParams[K]\n ? [AuthErrorParams[K]?]\n : [AuthErrorParams[K]]\n): never;\nexport function _fail<K extends AuthErrorCode>(\n auth: Auth,\n code: K,\n ...data: {} extends LessAppName<K> ? [LessAppName<K>?] : [LessAppName<K>]\n): never;\nexport function _fail<K extends AuthErrorCode>(\n authOrCode: Auth | K,\n ...rest: unknown[]\n): never {\n throw createErrorInternal(authOrCode, ...rest);\n}\n\nexport function _createError<K extends AuthErrorCode>(\n code: K,\n ...data: {} extends AuthErrorParams[K]\n ? [AuthErrorParams[K]?]\n : [AuthErrorParams[K]]\n): FirebaseError;\nexport function _createError<K extends AuthErrorCode>(\n auth: Auth,\n code: K,\n ...data: {} extends LessAppName<K> ? [LessAppName<K>?] : [LessAppName<K>]\n): FirebaseError;\nexport function _createError<K extends AuthErrorCode>(\n authOrCode: Auth | K,\n ...rest: unknown[]\n): FirebaseError {\n return createErrorInternal(authOrCode, ...rest);\n}\n\nfunction createErrorInternal<K extends AuthErrorCode>(\n authOrCode: Auth | K,\n ...rest: unknown[]\n): FirebaseError {\n if (typeof authOrCode !== 'string') {\n const code = rest[0] as K;\n const fullParams = [...rest.slice(1)] as AuthErrorListParams<K>;\n if (fullParams[0]) {\n fullParams[0].appName = authOrCode.name;\n }\n\n return (authOrCode as AuthInternal)._errorFactory.create(\n code,\n ...fullParams\n );\n }\n\n return _DEFAULT_AUTH_ERROR_FACTORY.create(\n authOrCode,\n ...(rest as AuthErrorListParams<K>)\n );\n}\n\nexport function _assert<K extends AuthErrorCode>(\n assertion: unknown,\n code: K,\n ...data: {} extends AuthErrorParams[K]\n ? [AuthErrorParams[K]?]\n : [AuthErrorParams[K]]\n): asserts assertion;\nexport function _assert<K extends AuthErrorCode>(\n assertion: unknown,\n auth: Auth,\n code: K,\n ...data: {} extends LessAppName<K> ? [LessAppName<K>?] : [LessAppName<K>]\n): asserts assertion;\nexport function _assert<K extends AuthErrorCode>(\n assertion: unknown,\n authOrCode: Auth | K,\n ...rest: unknown[]\n): asserts assertion {\n if (!assertion) {\n throw createErrorInternal(authOrCode, ...rest);\n }\n}\n\n// We really do want to accept literally any function type here\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype TypeExpectation = Function | string | MapType;\n\ninterface MapType extends Record<string, TypeExpectation | Optional> {}\n\nclass Optional {\n constructor(readonly type: TypeExpectation) {}\n}\n\nexport function opt(type: TypeExpectation): Optional {\n return new Optional(type);\n}\n\n/**\n * Asserts the runtime types of arguments. The 'expected' field can be one of\n * a class, a string (representing a \"typeof\" call), or a record map of name\n * to type. Furthermore, the opt() function can be used to mark a field as\n * optional. For example:\n *\n * function foo(auth: Auth, profile: {displayName?: string}, update = false) {\n * assertTypes(arguments, [AuthImpl, {displayName: opt('string')}, opt('boolean')]);\n * }\n *\n * opt() can be used for any type:\n * function foo(auth?: Auth) {\n * assertTypes(arguments, [opt(AuthImpl)]);\n * }\n *\n * The string types can be or'd together, and you can use \"null\" as well (note\n * that typeof null === 'object'; this is an edge case). For example:\n *\n * function foo(profile: {displayName?: string | null}) {\n * assertTypes(arguments, [{displayName: opt('string|null')}]);\n * }\n *\n * @param args\n * @param expected\n */\nexport function assertTypes(\n args: Omit<IArguments, 'callee'>,\n ...expected: Array<TypeExpectation | Optional>\n): void {\n if (args.length > expected.length) {\n _fail(AuthErrorCode.ARGUMENT_ERROR, {});\n }\n\n for (let i = 0; i < expected.length; i++) {\n let expect = expected[i];\n const arg = args[i];\n\n if (expect instanceof Optional) {\n // If the arg is undefined, then it matches \"optional\" and we can move to\n // the next arg\n if (typeof arg === 'undefined') {\n continue;\n }\n expect = expect.type;\n }\n\n if (typeof expect === 'string') {\n // Handle the edge case for null because typeof null === 'object'\n if (expect.includes('null') && arg === null) {\n continue;\n }\n\n const required = expect.split('|');\n _assert(required.includes(typeof arg), AuthErrorCode.ARGUMENT_ERROR, {});\n } else if (typeof expect === 'object') {\n // Recursively check record arguments\n const record = arg as Record<string, unknown>;\n const map = expect as MapType;\n const keys = Object.keys(expect);\n\n assertTypes(\n keys.map(k => record[k]),\n ...keys.map(k => map[k])\n );\n } else {\n _assert(arg instanceof expect, AuthErrorCode.ARGUMENT_ERROR, {});\n }\n }\n}\n\n/**\n * Unconditionally fails, throwing an internal error with the given message.\n *\n * @param failure type of failure encountered\n * @throws Error\n */\nexport function debugFail(failure: string): never {\n // Log the failure in addition to throw an exception, just in case the\n // exception is swallowed.\n const message = `INTERNAL ASSERTION FAILED: ` + failure;\n _logError(message);\n\n // NOTE: We don't use FirebaseError here because these are internal failures\n // that cannot be handled by the user. (Also it would create a circular\n // dependency between the error and assert modules which doesn't work.)\n throw new Error(message);\n}\n\n/**\n * Fails if the given assertion condition is false, throwing an Error with the\n * given message if it did.\n *\n * @param assertion\n * @param message\n */\nexport function debugAssert(\n assertion: unknown,\n message: string\n): asserts assertion {\n if (!assertion) {\n debugFail(message);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from './assert';\n\n/**\n * Our API has a lot of one-off constants that are used to do things.\n * Unfortunately we can't export these as classes instantiated directly since\n * the constructor may side effect and therefore can't be proven to be safely\n * culled. Instead, we export these classes themselves as a lowerCamelCase\n * constant, and instantiate them under the hood.\n */\nexport interface SingletonInstantiator<T> {\n new (): T;\n}\n\nconst instanceCache: Map<unknown, unknown> = new Map();\n\nexport function _getInstance<T>(cls: unknown): T {\n debugAssert(cls instanceof Function, 'Expected a class definition');\n let instance = instanceCache.get(cls) as T | undefined;\n\n if (instance) {\n debugAssert(\n instance instanceof cls,\n 'Instance stored in cache mismatched with class'\n );\n return instance;\n }\n\n instance = new (cls as SingletonInstantiator<T>)();\n instanceCache.set(cls, instance);\n return instance;\n}\n\nexport function _clearInstanceMap(): void {\n instanceCache.clear();\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _getProvider, FirebaseApp } from '@firebase/app-exp';\nimport { Auth, Dependencies } from '../../model/public_types';\n\nimport { AuthErrorCode } from '../errors';\nimport { PersistenceInternal } from '../persistence';\nimport { _fail } from '../util/assert';\nimport { _getInstance } from '../util/instantiator';\nimport { AuthImpl } from './auth_impl';\n\n/**\n * Initializes an Auth instance with fine-grained control over\n * {@link Dependencies}.\n *\n * @remarks\n *\n * This function allows more control over the Auth instance than\n * {@link getAuth}. `getAuth` uses platform-specific defaults to supply\n * the {@link Dependencies}. In general, `getAuth` is the easiest way to\n * initialize Auth and works for most use cases. Use `initializeAuth` if you\n * need control over which persistence layer is used, or to minimize bundle\n * size if you're not using either `signInWithPopup` or `signInWithRedirect`.\n *\n * For example, if your app only uses anonymous accounts and you only want\n * accounts saved for the current session, initialize Auth with:\n *\n * ```js\n * const auth = initializeAuth(app, {\n * persistence: browserSessionPersistence,\n * popupRedirectResolver: undefined,\n * });\n * ```\n *\n * @public\n */\nexport function initializeAuth(app: FirebaseApp, deps?: Dependencies): Auth {\n const provider = _getProvider(app, 'auth-exp');\n\n if (provider.isInitialized()) {\n const auth = provider.getImmediate() as AuthImpl;\n _fail(auth, AuthErrorCode.ALREADY_INITIALIZED);\n }\n\n const auth = provider.initialize({ options: deps }) as AuthImpl;\n\n return auth;\n}\n\nexport function _initializeAuthInstance(\n auth: AuthImpl,\n deps?: Dependencies\n): void {\n const persistence = deps?.persistence || [];\n const hierarchy = (Array.isArray(persistence)\n ? persistence\n : [persistence]\n ).map<PersistenceInternal>(_getInstance);\n if (deps?.errorMap) {\n auth._updateErrorMap(deps.errorMap);\n }\n\n // This promise is intended to float; auth initialization happens in the\n // background, meanwhile the auth object may be used by the app.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n auth._initializeWithPersistence(hierarchy, deps?.popupRedirectResolver);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function _getCurrentUrl(): string {\n return (typeof self !== 'undefined' && self.location?.href) || '';\n}\n\nexport function _isHttpOrHttps(): boolean {\n return _getCurrentScheme() === 'http:' || _getCurrentScheme() === 'https:';\n}\n\nexport function _getCurrentScheme(): string | null {\n return (typeof self !== 'undefined' && self.location?.protocol) || null;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isBrowserExtension } from '@firebase/util';\nimport { _isHttpOrHttps } from './location';\n\n/**\n * Determine whether the browser is working online\n */\nexport function _isOnline(): boolean {\n if (\n typeof navigator !== 'undefined' &&\n navigator &&\n 'onLine' in navigator &&\n typeof navigator.onLine === 'boolean' &&\n // Apply only for traditional web apps and Chrome extensions.\n // This is especially true for Cordova apps which have unreliable\n // navigator.onLine behavior unless cordova-plugin-network-information is\n // installed which overwrites the native navigator.onLine value and\n // defines navigator.connection.\n (_isHttpOrHttps() || isBrowserExtension() || 'connection' in navigator)\n ) {\n return navigator.onLine;\n }\n // If we can't determine the state, assume it is online.\n return true;\n}\n\nexport function _getUserLanguage(): string | null {\n if (typeof navigator === 'undefined') {\n return null;\n }\n const navigatorLanguage: NavigatorLanguage = navigator;\n return (\n // Most reliable, but only supported in Chrome/Firefox.\n (navigatorLanguage.languages && navigatorLanguage.languages[0]) ||\n // Supported in most browsers, but returns the language of the browser\n // UI, not the language set in browser settings.\n navigatorLanguage.language ||\n // Couldn't determine language.\n null\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isMobileCordova, isReactNative } from '@firebase/util';\nimport { _isOnline } from './navigator';\nimport { debugAssert } from './assert';\n\nexport const enum DelayMin {\n OFFLINE = 5000\n}\n\n/**\n * A structure to help pick between a range of long and short delay durations\n * depending on the current environment. In general, the long delay is used for\n * mobile environments whereas short delays are used for desktop environments.\n */\nexport class Delay {\n // The default value for the offline delay timeout in ms.\n\n private readonly isMobile: boolean;\n constructor(\n private readonly shortDelay: number,\n private readonly longDelay: number\n ) {\n // Internal error when improperly initialized.\n debugAssert(\n longDelay > shortDelay,\n 'Short delay should be less than long delay!'\n );\n this.isMobile = isMobileCordova() || isReactNative();\n }\n\n get(): number {\n if (!_isOnline()) {\n // Pick the shorter timeout.\n return Math.min(DelayMin.OFFLINE, this.shortDelay);\n }\n // If running in a mobile environment, return the long delay, otherwise\n // return the short delay.\n // This could be improved in the future to dynamically change based on other\n // variables instead of just reading the current environment.\n return this.isMobile ? this.longDelay : this.shortDelay;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ConfigInternal } from '../../model/auth';\nimport { debugAssert } from './assert';\n\nexport function _emulatorUrl(config: ConfigInternal, path?: string): string {\n debugAssert(config.emulator, 'Emulator should always be set here');\n const { url } = config.emulator;\n\n if (!path) {\n return url;\n }\n\n return `${url}${path.startsWith('/') ? path.slice(1) : path}`;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugFail } from './assert';\n\nexport class FetchProvider {\n private static fetchImpl: typeof fetch | null;\n private static headersImpl: typeof Headers | null;\n private static responseImpl: typeof Response | null;\n\n static initialize(\n fetchImpl: typeof fetch,\n headersImpl?: typeof Headers,\n responseImpl?: typeof Response\n ): void {\n this.fetchImpl = fetchImpl;\n if (headersImpl) {\n this.headersImpl = headersImpl;\n }\n if (responseImpl) {\n this.responseImpl = responseImpl;\n }\n }\n\n static fetch(): typeof fetch {\n if (this.fetchImpl) {\n return this.fetchImpl;\n }\n if (typeof self !== 'undefined' && 'fetch' in self) {\n return self.fetch;\n }\n debugFail(\n 'Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'\n );\n }\n\n static headers(): typeof Headers {\n if (this.headersImpl) {\n return this.headersImpl;\n }\n if (typeof self !== 'undefined' && 'Headers' in self) {\n return self.Headers;\n }\n debugFail(\n 'Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'\n );\n }\n\n static response(): typeof Response {\n if (this.responseImpl) {\n return this.responseImpl;\n }\n if (typeof self !== 'undefined' && 'Response' in self) {\n return self.Response;\n }\n debugFail(\n 'Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'\n );\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthErrorCode } from '../core/errors';\n\n/**\n * Errors that can be returned by the backend\n */\nexport const enum ServerError {\n ADMIN_ONLY_OPERATION = 'ADMIN_ONLY_OPERATION',\n CAPTCHA_CHECK_FAILED = 'CAPTCHA_CHECK_FAILED',\n CORS_UNSUPPORTED = 'CORS_UNSUPPORTED',\n CREDENTIAL_MISMATCH = 'CREDENTIAL_MISMATCH',\n CREDENTIAL_TOO_OLD_LOGIN_AGAIN = 'CREDENTIAL_TOO_OLD_LOGIN_AGAIN',\n DYNAMIC_LINK_NOT_ACTIVATED = 'DYNAMIC_LINK_NOT_ACTIVATED',\n EMAIL_CHANGE_NEEDS_VERIFICATION = 'EMAIL_CHANGE_NEEDS_VERIFICATION',\n EMAIL_EXISTS = 'EMAIL_EXISTS',\n EMAIL_NOT_FOUND = 'EMAIL_NOT_FOUND',\n EXPIRED_OOB_CODE = 'EXPIRED_OOB_CODE',\n FEDERATED_USER_ID_ALREADY_LINKED = 'FEDERATED_USER_ID_ALREADY_LINKED',\n INVALID_APP_CREDENTIAL = 'INVALID_APP_CREDENTIAL',\n INVALID_APP_ID = 'INVALID_APP_ID',\n INVALID_CERT_HASH = 'INVALID_CERT_HASH',\n INVALID_CODE = 'INVALID_CODE',\n INVALID_CONTINUE_URI = 'INVALID_CONTINUE_URI',\n INVALID_CUSTOM_TOKEN = 'INVALID_CUSTOM_TOKEN',\n INVALID_DYNAMIC_LINK_DOMAIN = 'INVALID_DYNAMIC_LINK_DOMAIN',\n INVALID_EMAIL = 'INVALID_EMAIL',\n INVALID_ID_TOKEN = 'INVALID_ID_TOKEN',\n INVALID_IDP_RESPONSE = 'INVALID_IDP_RESPONSE',\n INVALID_IDENTIFIER = 'INVALID_IDENTIFIER',\n INVALID_MESSAGE_PAYLOAD = 'INVALID_MESSAGE_PAYLOAD',\n INVALID_MFA_PENDING_CREDENTIAL = 'INVALID_MFA_PENDING_CREDENTIAL',\n INVALID_OAUTH_CLIENT_ID = 'INVALID_OAUTH_CLIENT_ID',\n INVALID_OOB_CODE = 'INVALID_OOB_CODE',\n INVALID_PASSWORD = 'INVALID_PASSWORD',\n INVALID_PENDING_TOKEN = 'INVALID_PENDING_TOKEN',\n INVALID_PHONE_NUMBER = 'INVALID_PHONE_NUMBER',\n INVALID_PROVIDER_ID = 'INVALID_PROVIDER_ID',\n INVALID_RECIPIENT_EMAIL = 'INVALID_RECIPIENT_EMAIL',\n INVALID_SENDER = 'INVALID_SENDER',\n INVALID_SESSION_INFO = 'INVALID_SESSION_INFO',\n INVALID_TEMPORARY_PROOF = 'INVALID_TEMPORARY_PROOF',\n INVALID_TENANT_ID = 'INVALID_TENANT_ID',\n MFA_ENROLLMENT_NOT_FOUND = 'MFA_ENROLLMENT_NOT_FOUND',\n MISSING_ANDROID_PACKAGE_NAME = 'MISSING_ANDROID_PACKAGE_NAME',\n MISSING_APP_CREDENTIAL = 'MISSING_APP_CREDENTIAL',\n MISSING_CODE = 'MISSING_CODE',\n MISSING_CONTINUE_URI = 'MISSING_CONTINUE_URI',\n MISSING_CUSTOM_TOKEN = 'MISSING_CUSTOM_TOKEN',\n MISSING_IOS_BUNDLE_ID = 'MISSING_IOS_BUNDLE_ID',\n MISSING_MFA_ENROLLMENT_ID = 'MISSING_MFA_ENROLLMENT_ID',\n MISSING_MFA_PENDING_CREDENTIAL = 'MISSING_MFA_PENDING_CREDENTIAL',\n MISSING_OOB_CODE = 'MISSING_OOB_CODE',\n MISSING_OR_INVALID_NONCE = 'MISSING_OR_INVALID_NONCE',\n MISSING_PASSWORD = 'MISSING_PASSWORD',\n MISSING_REQ_TYPE = 'MISSING_REQ_TYPE',\n MISSING_PHONE_NUMBER = 'MISSING_PHONE_NUMBER',\n MISSING_SESSION_INFO = 'MISSING_SESSION_INFO',\n OPERATION_NOT_ALLOWED = 'OPERATION_NOT_ALLOWED',\n PASSWORD_LOGIN_DISABLED = 'PASSWORD_LOGIN_DISABLED',\n QUOTA_EXCEEDED = 'QUOTA_EXCEEDED',\n RESET_PASSWORD_EXCEED_LIMIT = 'RESET_PASSWORD_EXCEED_LIMIT',\n REJECTED_CREDENTIAL = 'REJECTED_CREDENTIAL',\n SECOND_FACTOR_EXISTS = 'SECOND_FACTOR_EXISTS',\n SECOND_FACTOR_LIMIT_EXCEEDED = 'SECOND_FACTOR_LIMIT_EXCEEDED',\n SESSION_EXPIRED = 'SESSION_EXPIRED',\n TENANT_ID_MISMATCH = 'TENANT_ID_MISMATCH',\n TOKEN_EXPIRED = 'TOKEN_EXPIRED',\n TOO_MANY_ATTEMPTS_TRY_LATER = 'TOO_MANY_ATTEMPTS_TRY_LATER',\n UNSUPPORTED_FIRST_FACTOR = 'UNSUPPORTED_FIRST_FACTOR',\n UNSUPPORTED_TENANT_OPERATION = 'UNSUPPORTED_TENANT_OPERATION',\n UNAUTHORIZED_DOMAIN = 'UNAUTHORIZED_DOMAIN',\n UNVERIFIED_EMAIL = 'UNVERIFIED_EMAIL',\n USER_CANCELLED = 'USER_CANCELLED',\n USER_DISABLED = 'USER_DISABLED',\n USER_NOT_FOUND = 'USER_NOT_FOUND',\n WEAK_PASSWORD = 'WEAK_PASSWORD'\n}\n\n/**\n * API Response in the event of an error\n */\nexport interface JsonError {\n error: {\n code: number;\n message: string;\n errors?: [\n {\n message: ServerError;\n domain: string;\n reason: string;\n }\n ];\n };\n}\n\n/**\n * Type definition for a map from server errors to developer visible errors\n */\nexport declare type ServerErrorMap<ApiError extends string> = {\n readonly [K in ApiError]: AuthErrorCode;\n};\n\n/**\n * Map from errors returned by the server to errors to developer visible errors\n */\nexport const SERVER_ERROR_MAP: Partial<ServerErrorMap<ServerError>> = {\n // Custom token errors.\n [ServerError.CREDENTIAL_MISMATCH]: AuthErrorCode.CREDENTIAL_MISMATCH,\n // This can only happen if the SDK sends a bad request.\n [ServerError.MISSING_CUSTOM_TOKEN]: AuthErrorCode.INTERNAL_ERROR,\n\n // Create Auth URI errors.\n [ServerError.INVALID_IDENTIFIER]: AuthErrorCode.INVALID_EMAIL,\n // This can only happen if the SDK sends a bad request.\n [ServerError.MISSING_CONTINUE_URI]: AuthErrorCode.INTERNAL_ERROR,\n\n // Sign in with email and password errors (some apply to sign up too).\n [ServerError.INVALID_PASSWORD]: AuthErrorCode.INVALID_PASSWORD,\n // This can only happen if the SDK sends a bad request.\n [ServerError.MISSING_PASSWORD]: AuthErrorCode.INTERNAL_ERROR,\n\n // Sign up with email and password errors.\n [ServerError.EMAIL_EXISTS]: AuthErrorCode.EMAIL_EXISTS,\n [ServerError.PASSWORD_LOGIN_DISABLED]: AuthErrorCode.OPERATION_NOT_ALLOWED,\n\n // Verify assertion for sign in with credential errors:\n [ServerError.INVALID_IDP_RESPONSE]: AuthErrorCode.INVALID_IDP_RESPONSE,\n [ServerError.INVALID_PENDING_TOKEN]: AuthErrorCode.INVALID_IDP_RESPONSE,\n [ServerError.FEDERATED_USER_ID_ALREADY_LINKED]:\n AuthErrorCode.CREDENTIAL_ALREADY_IN_USE,\n\n // This can only happen if the SDK sends a bad request.\n [ServerError.MISSING_REQ_TYPE]: AuthErrorCode.INTERNAL_ERROR,\n\n // Send Password reset email errors:\n [ServerError.EMAIL_NOT_FOUND]: AuthErrorCode.USER_DELETED,\n [ServerError.RESET_PASSWORD_EXCEED_LIMIT]:\n AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER,\n\n [ServerError.EXPIRED_OOB_CODE]: AuthErrorCode.EXPIRED_OOB_CODE,\n [ServerError.INVALID_OOB_CODE]: AuthErrorCode.INVALID_OOB_CODE,\n // This can only happen if the SDK sends a bad request.\n [ServerError.MISSING_OOB_CODE]: AuthErrorCode.INTERNAL_ERROR,\n\n // Operations that require ID token in request:\n [ServerError.CREDENTIAL_TOO_OLD_LOGIN_AGAIN]:\n AuthErrorCode.CREDENTIAL_TOO_OLD_LOGIN_AGAIN,\n [ServerError.INVALID_ID_TOKEN]: AuthErrorCode.INVALID_AUTH,\n [ServerError.TOKEN_EXPIRED]: AuthErrorCode.TOKEN_EXPIRED,\n [ServerError.USER_NOT_FOUND]: AuthErrorCode.TOKEN_EXPIRED,\n\n // Other errors.\n [ServerError.TOO_MANY_ATTEMPTS_TRY_LATER]:\n AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER,\n\n // Phone Auth related errors.\n [ServerError.INVALID_CODE]: AuthErrorCode.INVALID_CODE,\n [ServerError.INVALID_SESSION_INFO]: AuthErrorCode.INVALID_SESSION_INFO,\n [ServerError.INVALID_TEMPORARY_PROOF]: AuthErrorCode.INVALID_IDP_RESPONSE,\n [ServerError.MISSING_SESSION_INFO]: AuthErrorCode.MISSING_SESSION_INFO,\n [ServerError.SESSION_EXPIRED]: AuthErrorCode.CODE_EXPIRED,\n\n // Other action code errors when additional settings passed.\n // MISSING_CONTINUE_URI is getting mapped to INTERNAL_ERROR above.\n // This is OK as this error will be caught by client side validation.\n [ServerError.MISSING_ANDROID_PACKAGE_NAME]:\n AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME,\n [ServerError.UNAUTHORIZED_DOMAIN]: AuthErrorCode.UNAUTHORIZED_DOMAIN,\n\n // getProjectConfig errors when clientId is passed.\n [ServerError.INVALID_OAUTH_CLIENT_ID]: AuthErrorCode.INVALID_OAUTH_CLIENT_ID,\n\n // User actions (sign-up or deletion) disabled errors.\n [ServerError.ADMIN_ONLY_OPERATION]: AuthErrorCode.ADMIN_ONLY_OPERATION,\n\n // Multi factor related errors.\n [ServerError.INVALID_MFA_PENDING_CREDENTIAL]:\n AuthErrorCode.INVALID_MFA_SESSION,\n [ServerError.MFA_ENROLLMENT_NOT_FOUND]: AuthErrorCode.MFA_INFO_NOT_FOUND,\n [ServerError.MISSING_MFA_ENROLLMENT_ID]: AuthErrorCode.MISSING_MFA_INFO,\n [ServerError.MISSING_MFA_PENDING_CREDENTIAL]:\n AuthErrorCode.MISSING_MFA_SESSION,\n [ServerError.SECOND_FACTOR_EXISTS]:\n AuthErrorCode.SECOND_FACTOR_ALREADY_ENROLLED,\n [ServerError.SECOND_FACTOR_LIMIT_EXCEEDED]:\n AuthErrorCode.SECOND_FACTOR_LIMIT_EXCEEDED\n};\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError, querystring } from '@firebase/util';\n\nimport { AuthErrorCode, NamedErrorParams } from '../core/errors';\nimport { _createError, _fail } from '../core/util/assert';\nimport { Delay } from '../core/util/delay';\nimport { _emulatorUrl } from '../core/util/emulator';\nimport { FetchProvider } from '../core/util/fetch_provider';\nimport { Auth } from '../model/public_types';\nimport { AuthInternal, ConfigInternal } from '../model/auth';\nimport { IdTokenResponse, TaggedWithTokenResponse } from '../model/id_token';\nimport { IdTokenMfaResponse } from './authentication/mfa';\nimport { SERVER_ERROR_MAP, ServerError, ServerErrorMap } from './errors';\n\nexport const enum HttpMethod {\n POST = 'POST',\n GET = 'GET'\n}\n\nexport const enum HttpHeader {\n CONTENT_TYPE = 'Content-Type',\n X_FIREBASE_LOCALE = 'X-Firebase-Locale',\n X_CLIENT_VERSION = 'X-Client-Version'\n}\n\nexport const enum Endpoint {\n CREATE_AUTH_URI = '/v1/accounts:createAuthUri',\n DELETE_ACCOUNT = '/v1/accounts:delete',\n RESET_PASSWORD = '/v1/accounts:resetPassword',\n SIGN_UP = '/v1/accounts:signUp',\n SIGN_IN_WITH_CUSTOM_TOKEN = '/v1/accounts:signInWithCustomToken',\n SIGN_IN_WITH_EMAIL_LINK = '/v1/accounts:signInWithEmailLink',\n SIGN_IN_WITH_IDP = '/v1/accounts:signInWithIdp',\n SIGN_IN_WITH_PASSWORD = '/v1/accounts:signInWithPassword',\n SIGN_IN_WITH_PHONE_NUMBER = '/v1/accounts:signInWithPhoneNumber',\n SEND_VERIFICATION_CODE = '/v1/accounts:sendVerificationCode',\n SEND_OOB_CODE = '/v1/accounts:sendOobCode',\n SET_ACCOUNT_INFO = '/v1/accounts:update',\n GET_ACCOUNT_INFO = '/v1/accounts:lookup',\n GET_RECAPTCHA_PARAM = '/v1/recaptchaParams',\n START_PHONE_MFA_ENROLLMENT = '/v2/accounts/mfaEnrollment:start',\n FINALIZE_PHONE_MFA_ENROLLMENT = '/v2/accounts/mfaEnrollment:finalize',\n START_PHONE_MFA_SIGN_IN = '/v2/accounts/mfaSignIn:start',\n FINALIZE_PHONE_MFA_SIGN_IN = '/v2/accounts/mfaSignIn:finalize',\n WITHDRAW_MFA = '/v2/accounts/mfaEnrollment:withdraw',\n GET_PROJECT_CONFIG = '/v1/projects'\n}\n\nexport const DEFAULT_API_TIMEOUT_MS = new Delay(30_000, 60_000);\n\nexport function _addTidIfNecessary<T extends { tenantId?: string }>(\n auth: Auth,\n request: T\n): T {\n if (auth.tenantId && !request.tenantId) {\n return {\n ...request,\n tenantId: auth.tenantId\n };\n }\n return request;\n}\n\nexport async function _performApiRequest<T, V>(\n auth: Auth,\n method: HttpMethod,\n path: Endpoint,\n request?: T,\n customErrorMap: Partial<ServerErrorMap<ServerError>> = {}\n): Promise<V> {\n return _performFetchWithErrorHandling(auth, customErrorMap, () => {\n let body = {};\n let params = {};\n if (request) {\n if (method === HttpMethod.GET) {\n params = request;\n } else {\n body = {\n body: JSON.stringify(request)\n };\n }\n }\n\n const query = querystring({\n key: auth.config.apiKey,\n ...params\n }).slice(1);\n\n const headers = new (FetchProvider.headers())();\n headers.set(HttpHeader.CONTENT_TYPE, 'application/json');\n headers.set(\n HttpHeader.X_CLIENT_VERSION,\n (auth as AuthInternal)._getSdkClientVersion()\n );\n\n if (auth.languageCode) {\n headers.set(HttpHeader.X_FIREBASE_LOCALE, auth.languageCode);\n }\n\n return FetchProvider.fetch()(\n _getFinalTarget(auth, auth.config.apiHost, path, query),\n {\n method,\n headers,\n referrerPolicy: 'no-referrer',\n ...body\n }\n );\n });\n}\n\nexport async function _performFetchWithErrorHandling<V>(\n auth: Auth,\n customErrorMap: Partial<ServerErrorMap<ServerError>>,\n fetchFn: () => Promise<Response>\n): Promise<V> {\n (auth as AuthInternal)._canInitEmulator = false;\n const errorMap = { ...SERVER_ERROR_MAP, ...customErrorMap };\n try {\n const networkTimeout = new NetworkTimeout<Response>(auth);\n const response: Response = await Promise.race<Promise<Response>>([\n fetchFn(),\n networkTimeout.promise\n ]);\n\n // If we've reached this point, the fetch succeeded and the networkTimeout\n // didn't throw; clear the network timeout delay so that Node won't hang\n networkTimeout.clearNetworkTimeout();\n\n const json = await response.json();\n if ('needConfirmation' in json) {\n throw _makeTaggedError(auth, AuthErrorCode.NEED_CONFIRMATION, json);\n }\n\n if (response.ok && !('errorMessage' in json)) {\n return json;\n } else {\n const errorMessage = response.ok ? json.errorMessage : json.error.message;\n const serverErrorCode = errorMessage.split(' : ')[0] as ServerError;\n if (serverErrorCode === ServerError.FEDERATED_USER_ID_ALREADY_LINKED) {\n throw _makeTaggedError(\n auth,\n AuthErrorCode.CREDENTIAL_ALREADY_IN_USE,\n json\n );\n } else if (serverErrorCode === ServerError.EMAIL_EXISTS) {\n throw _makeTaggedError(auth, AuthErrorCode.EMAIL_EXISTS, json);\n }\n const authError =\n errorMap[serverErrorCode] ||\n ((serverErrorCode\n .toLowerCase()\n .replace(/[_\\s]+/g, '-') as unknown) as AuthErrorCode);\n _fail(auth, authError);\n }\n } catch (e) {\n if (e instanceof FirebaseError) {\n throw e;\n }\n _fail(auth, AuthErrorCode.NETWORK_REQUEST_FAILED);\n }\n}\n\nexport async function _performSignInRequest<T, V extends IdTokenResponse>(\n auth: Auth,\n method: HttpMethod,\n path: Endpoint,\n request?: T,\n customErrorMap: Partial<ServerErrorMap<ServerError>> = {}\n): Promise<V> {\n const serverResponse = (await _performApiRequest<T, V | IdTokenMfaResponse>(\n auth,\n method,\n path,\n request,\n customErrorMap\n )) as V;\n if ('mfaPendingCredential' in serverResponse) {\n _fail(auth, AuthErrorCode.MFA_REQUIRED, {\n serverResponse\n });\n }\n\n return serverResponse;\n}\n\nexport function _getFinalTarget(\n auth: Auth,\n host: string,\n path: string,\n query: string\n): string {\n const base = `${host}${path}?${query}`;\n\n if (!(auth as AuthInternal).config.emulator) {\n return `${auth.config.apiScheme}://${base}`;\n }\n\n return _emulatorUrl(auth.config as ConfigInternal, base);\n}\n\nclass NetworkTimeout<T> {\n // Node timers and browser timers are fundamentally incompatible, but we\n // don't care about the value here\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private timer: any | null = null;\n readonly promise = new Promise<T>((_, reject) => {\n this.timer = setTimeout(() => {\n return reject(_createError(this.auth, AuthErrorCode.TIMEOUT));\n }, DEFAULT_API_TIMEOUT_MS.get());\n });\n\n clearNetworkTimeout(): void {\n clearTimeout(this.timer);\n }\n\n constructor(private readonly auth: Auth) {}\n}\n\ninterface PotentialResponse extends IdTokenResponse {\n email?: string;\n phoneNumber?: string;\n}\n\nexport function _makeTaggedError(\n auth: Auth,\n code: AuthErrorCode,\n response: PotentialResponse\n): FirebaseError {\n const errorParams: NamedErrorParams = {\n appName: auth.name\n };\n\n if (response.email) {\n errorParams.email = response.email;\n }\n if (response.phoneNumber) {\n errorParams.phoneNumber = response.phoneNumber;\n }\n\n const error = _createError(auth, code, errorParams);\n\n // We know customData is defined on error because errorParams is defined\n (error.customData! as TaggedWithTokenResponse)._tokenResponse = response;\n return error;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Endpoint, HttpMethod, _performApiRequest } from '../index';\nimport { MfaEnrollment } from './mfa';\nimport { Auth } from '../../model/public_types';\n\nexport interface DeleteAccountRequest {\n idToken: string;\n}\n\nexport async function deleteAccount(\n auth: Auth,\n request: DeleteAccountRequest\n): Promise<void> {\n return _performApiRequest<DeleteAccountRequest, void>(\n auth,\n HttpMethod.POST,\n Endpoint.DELETE_ACCOUNT,\n request\n );\n}\n\nexport interface ProviderUserInfo {\n providerId: string;\n rawId?: string;\n email?: string;\n displayName?: string;\n photoUrl?: string;\n phoneNumber?: string;\n}\n\nexport interface DeleteLinkedAccountsRequest {\n idToken: string;\n deleteProvider: string[];\n}\n\nexport interface DeleteLinkedAccountsResponse {\n providerUserInfo: ProviderUserInfo[];\n}\n\nexport async function deleteLinkedAccounts(\n auth: Auth,\n request: DeleteLinkedAccountsRequest\n): Promise<DeleteLinkedAccountsResponse> {\n return _performApiRequest<\n DeleteLinkedAccountsRequest,\n DeleteLinkedAccountsResponse\n >(auth, HttpMethod.POST, Endpoint.SET_ACCOUNT_INFO, request);\n}\n\nexport interface APIUserInfo {\n localId?: string;\n displayName?: string;\n photoUrl?: string;\n email?: string;\n emailVerified?: boolean;\n phoneNumber?: string;\n lastLoginAt?: number;\n createdAt?: number;\n tenantId?: string;\n passwordHash?: string;\n providerUserInfo?: ProviderUserInfo[];\n mfaInfo?: MfaEnrollment[];\n}\n\nexport interface GetAccountInfoRequest {\n idToken: string;\n}\n\nexport interface GetAccountInfoResponse {\n users: APIUserInfo[];\n}\n\nexport async function getAccountInfo(\n auth: Auth,\n request: GetAccountInfoRequest\n): Promise<GetAccountInfoResponse> {\n return _performApiRequest<GetAccountInfoRequest, GetAccountInfoResponse>(\n auth,\n HttpMethod.POST,\n Endpoint.GET_ACCOUNT_INFO,\n request\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function utcTimestampToDateString(\n utcTimestamp?: string | number\n): string | undefined {\n if (!utcTimestamp) {\n return undefined;\n }\n try {\n // Convert to date object.\n const date = new Date(Number(utcTimestamp));\n // Test date is valid.\n if (!isNaN(date.getTime())) {\n // Convert to UTC date string.\n return date.toUTCString();\n }\n } catch (e) {\n // Do nothing. undefined will be returned.\n }\n return undefined;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { IdTokenResult, ParsedToken, User } from '../../model/public_types';\nimport { base64Decode, getModularInstance } from '@firebase/util';\n\nimport { UserInternal } from '../../model/user';\nimport { _assert } from '../util/assert';\nimport { _logError } from '../util/log';\nimport { utcTimestampToDateString } from '../util/time';\nimport { AuthErrorCode } from '../errors';\n\n/**\n * Returns a JSON Web Token (JWT) used to identify the user to a Firebase service.\n *\n * @remarks\n * Returns the current token if it has not expired or if it will not expire in the next five\n * minutes. Otherwise, this will refresh the token and return a new one.\n *\n * @param user - The user.\n * @param forceRefresh - Force refresh regardless of token expiration.\n *\n * @public\n */\nexport function getIdToken(user: User, forceRefresh = false): Promise<string> {\n return getModularInstance(user).getIdToken(forceRefresh);\n}\n\n/**\n * Returns a deserialized JSON Web Token (JWT) used to identitfy the user to a Firebase service.\n *\n * @remarks\n * Returns the current token if it has not expired or if it will not expire in the next five\n * minutes. Otherwise, this will refresh the token and return a new one.\n *\n * @param user - The user.\n * @param forceRefresh - Force refresh regardless of token expiration.\n *\n * @public\n */\nexport async function getIdTokenResult(\n user: User,\n forceRefresh = false\n): Promise<IdTokenResult> {\n const userInternal = getModularInstance(user) as UserInternal;\n const token = await userInternal.getIdToken(forceRefresh);\n const claims = _parseToken(token);\n\n _assert(\n claims && claims.exp && claims.auth_time && claims.iat,\n userInternal.auth,\n AuthErrorCode.INTERNAL_ERROR\n );\n const firebase =\n typeof claims.firebase === 'object' ? claims.firebase : undefined;\n\n const signInProvider: string | undefined = firebase?.['sign_in_provider'];\n\n return {\n claims,\n token,\n authTime: utcTimestampToDateString(\n secondsStringToMilliseconds(claims.auth_time)\n )!,\n issuedAtTime: utcTimestampToDateString(\n secondsStringToMilliseconds(claims.iat)\n )!,\n expirationTime: utcTimestampToDateString(\n secondsStringToMilliseconds(claims.exp)\n )!,\n signInProvider: signInProvider || null,\n signInSecondFactor: firebase?.['sign_in_second_factor'] || null\n };\n}\n\nfunction secondsStringToMilliseconds(seconds: string): number {\n return Number(seconds) * 1000;\n}\n\nexport function _parseToken(token: string): ParsedToken | null {\n const [algorithm, payload, signature] = token.split('.');\n if (\n algorithm === undefined ||\n payload === undefined ||\n signature === undefined\n ) {\n _logError('JWT malformed, contained fewer than 3 sections');\n return null;\n }\n\n try {\n const decoded = base64Decode(payload);\n if (!decoded) {\n _logError('Failed to decode base64 JWT payload');\n return null;\n }\n return JSON.parse(decoded);\n } catch (e) {\n _logError('Caught error parsing JWT payload as JSON', e);\n return null;\n }\n}\n\n/**\n * Extract expiresIn TTL from a token by subtracting the expiration from the issuance.\n */\nexport function _tokenExpiresIn(token: string): number {\n const parsedToken = _parseToken(token);\n _assert(parsedToken, AuthErrorCode.INTERNAL_ERROR);\n _assert(typeof parsedToken.exp !== 'undefined', AuthErrorCode.INTERNAL_ERROR);\n _assert(typeof parsedToken.iat !== 'undefined', AuthErrorCode.INTERNAL_ERROR);\n return Number(parsedToken.exp) - Number(parsedToken.iat);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\n\nimport { UserInternal } from '../../model/user';\nimport { AuthErrorCode } from '../errors';\n\nexport async function _logoutIfInvalidated<T>(\n user: UserInternal,\n promise: Promise<T>,\n bypassAuthState = false\n): Promise<T> {\n if (bypassAuthState) {\n return promise;\n }\n try {\n return await promise;\n } catch (e) {\n if (e instanceof FirebaseError && isUserInvalidated(e)) {\n if (user.auth.currentUser === user) {\n await user.auth.signOut();\n }\n }\n\n throw e;\n }\n}\n\nfunction isUserInvalidated({ code }: FirebaseError): boolean {\n return (\n code === `auth/${AuthErrorCode.USER_DISABLED}` ||\n code === `auth/${AuthErrorCode.TOKEN_EXPIRED}`\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UserInternal } from '../../model/user';\nimport { AuthErrorCode } from '../errors';\n\n// Refresh the token five minutes before expiration\nexport const enum Duration {\n OFFSET = 5 * 1000 * 60,\n RETRY_BACKOFF_MIN = 30 * 1000,\n RETRY_BACKOFF_MAX = 16 * 60 * 1000\n}\n\nexport class ProactiveRefresh {\n private isRunning = false;\n\n // Node timers and browser timers return fundamentally different types.\n // We don't actually care what the value is but TS won't accept unknown and\n // we can't cast properly in both environments.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private timerId: any | null = null;\n private errorBackoff = Duration.RETRY_BACKOFF_MIN;\n\n constructor(private readonly user: UserInternal) {}\n\n _start(): void {\n if (this.isRunning) {\n return;\n }\n\n this.isRunning = true;\n this.schedule();\n }\n\n _stop(): void {\n if (!this.isRunning) {\n return;\n }\n\n this.isRunning = false;\n if (this.timerId !== null) {\n clearTimeout(this.timerId);\n }\n }\n\n private getInterval(wasError: boolean): number {\n if (wasError) {\n const interval = this.errorBackoff;\n this.errorBackoff = Math.min(\n this.errorBackoff * 2,\n Duration.RETRY_BACKOFF_MAX\n );\n return interval;\n } else {\n // Reset the error backoff\n this.errorBackoff = Duration.RETRY_BACKOFF_MIN;\n const expTime = this.user.stsTokenManager.expirationTime ?? 0;\n const interval = expTime - Date.now() - Duration.OFFSET;\n\n return Math.max(0, interval);\n }\n }\n\n private schedule(wasError = false): void {\n if (!this.isRunning) {\n // Just in case...\n return;\n }\n\n const interval = this.getInterval(wasError);\n this.timerId = setTimeout(async () => {\n await this.iteration();\n }, interval);\n }\n\n private async iteration(): Promise<void> {\n try {\n await this.user.getIdToken(true);\n } catch (e) {\n // Only retry on network errors\n if (e.code === `auth/${AuthErrorCode.NETWORK_REQUEST_FAILED}`) {\n this.schedule(/* wasError */ true);\n }\n\n return;\n }\n this.schedule();\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UserMetadata as UserMetadataType } from '../../model/public_types';\n\nimport { utcTimestampToDateString } from '../util/time';\n\nexport class UserMetadata implements UserMetadataType {\n creationTime?: string;\n lastSignInTime?: string;\n\n constructor(\n private createdAt?: string | number,\n private lastLoginAt?: string | number\n ) {\n this._initializeTime();\n }\n\n private _initializeTime(): void {\n this.lastSignInTime = utcTimestampToDateString(this.lastLoginAt);\n this.creationTime = utcTimestampToDateString(this.createdAt);\n }\n\n _copy(metadata: UserMetadata): void {\n this.createdAt = metadata.createdAt;\n this.lastLoginAt = metadata.lastLoginAt;\n this._initializeTime();\n }\n\n toJSON(): object {\n return {\n createdAt: this.createdAt,\n lastLoginAt: this.lastLoginAt\n };\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User, UserInfo } from '../../model/public_types';\n\nimport {\n getAccountInfo,\n ProviderUserInfo\n} from '../../api/account_management/account';\nimport { UserInternal } from '../../model/user';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { _logoutIfInvalidated } from './invalidation';\nimport { UserMetadata } from './user_metadata';\nimport { getModularInstance } from '@firebase/util';\n\nexport async function _reloadWithoutSaving(user: UserInternal): Promise<void> {\n const auth = user.auth;\n const idToken = await user.getIdToken();\n const response = await _logoutIfInvalidated(\n user,\n getAccountInfo(auth, { idToken })\n );\n\n _assert(response?.users.length, auth, AuthErrorCode.INTERNAL_ERROR);\n\n const coreAccount = response.users[0];\n\n user._notifyReloadListener(coreAccount);\n\n const newProviderData = coreAccount.providerUserInfo?.length\n ? extractProviderData(coreAccount.providerUserInfo)\n : [];\n\n const providerData = mergeProviderData(user.providerData, newProviderData);\n\n // Preserves the non-nonymous status of the stored user, even if no more\n // credentials (federated or email/password) are linked to the user. If\n // the user was previously anonymous, then use provider data to update.\n // On the other hand, if it was not anonymous before, it should never be\n // considered anonymous now.\n const oldIsAnonymous = user.isAnonymous;\n const newIsAnonymous =\n !(user.email && coreAccount.passwordHash) && !providerData?.length;\n const isAnonymous = !oldIsAnonymous ? false : newIsAnonymous;\n\n const updates: Partial<UserInternal> = {\n uid: coreAccount.localId,\n displayName: coreAccount.displayName || null,\n photoURL: coreAccount.photoUrl || null,\n email: coreAccount.email || null,\n emailVerified: coreAccount.emailVerified || false,\n phoneNumber: coreAccount.phoneNumber || null,\n tenantId: coreAccount.tenantId || null,\n providerData,\n metadata: new UserMetadata(coreAccount.createdAt, coreAccount.lastLoginAt),\n isAnonymous\n };\n\n Object.assign(user, updates);\n}\n\n/**\n * Reloads user account data, if signed in.\n *\n * @param user - The user.\n *\n * @public\n */\nexport async function reload(user: User): Promise<void> {\n const userInternal: UserInternal = getModularInstance(user) as UserInternal;\n await _reloadWithoutSaving(userInternal);\n\n // Even though the current user hasn't changed, update\n // current user will trigger a persistence update w/ the\n // new info.\n await userInternal.auth._persistUserIfCurrent(userInternal);\n userInternal.auth._notifyListenersIfCurrent(userInternal);\n}\n\nfunction mergeProviderData(\n original: UserInfo[],\n newData: UserInfo[]\n): UserInfo[] {\n const deduped = original.filter(\n o => !newData.some(n => n.providerId === o.providerId)\n );\n return [...deduped, ...newData];\n}\n\nfunction extractProviderData(providers: ProviderUserInfo[]): UserInfo[] {\n return providers.map(({ providerId, ...provider }) => {\n return {\n providerId,\n uid: provider.rawId || '',\n displayName: provider.displayName || null,\n email: provider.email || null,\n phoneNumber: provider.phoneNumber || null,\n photoURL: provider.photoUrl || null\n };\n });\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint-disable camelcase */\n\nimport { querystring } from '@firebase/util';\n\nimport {\n _getFinalTarget,\n _performFetchWithErrorHandling,\n HttpMethod\n} from '../index';\nimport { FetchProvider } from '../../core/util/fetch_provider';\nimport { Auth } from '../../model/public_types';\nimport { AuthInternal } from '../../model/auth';\n\nexport const enum Endpoint {\n TOKEN = '/v1/token'\n}\n\n/** The server responses with snake_case; we convert to camelCase */\ninterface RequestStsTokenServerResponse {\n access_token: string;\n expires_in: string;\n refresh_token: string;\n}\n\nexport interface RequestStsTokenResponse {\n accessToken: string;\n expiresIn: string;\n refreshToken: string;\n}\n\nexport async function requestStsToken(\n auth: Auth,\n refreshToken: string\n): Promise<RequestStsTokenResponse> {\n const response = await _performFetchWithErrorHandling<RequestStsTokenServerResponse>(\n auth,\n {},\n () => {\n const body = querystring({\n 'grant_type': 'refresh_token',\n 'refresh_token': refreshToken\n }).slice(1);\n const { tokenApiHost, apiKey } = auth.config;\n const url = _getFinalTarget(\n auth,\n tokenApiHost,\n Endpoint.TOKEN,\n `key=${apiKey}`\n );\n\n return FetchProvider.fetch()(url, {\n method: HttpMethod.POST,\n headers: {\n 'X-Client-Version': (auth as AuthInternal)._getSdkClientVersion(),\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body\n });\n }\n );\n\n // The response comes back in snake_case. Convert to camel:\n return {\n accessToken: response.access_token,\n expiresIn: response.expires_in,\n refreshToken: response.refresh_token\n };\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FinalizeMfaResponse } from '../../api/authentication/mfa';\nimport { requestStsToken } from '../../api/authentication/token';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { AuthErrorCode } from '../errors';\nimport { PersistedBlob } from '../persistence';\nimport { _assert, debugFail } from '../util/assert';\nimport { _tokenExpiresIn } from './id_token_result';\n\n/**\n * The number of milliseconds before the official expiration time of a token\n * to refresh that token, to provide a buffer for RPCs to complete.\n */\nexport const enum Buffer {\n TOKEN_REFRESH = 30_000\n}\n\n/**\n * We need to mark this class as internal explicitly to exclude it in the public typings, because\n * it references AuthInternal which has a circular dependency with UserInternal.\n *\n * @internal\n */\nexport class StsTokenManager {\n refreshToken: string | null = null;\n accessToken: string | null = null;\n expirationTime: number | null = null;\n\n get isExpired(): boolean {\n return (\n !this.expirationTime ||\n Date.now() > this.expirationTime - Buffer.TOKEN_REFRESH\n );\n }\n\n updateFromServerResponse(\n response: IdTokenResponse | FinalizeMfaResponse\n ): void {\n _assert(response.idToken, AuthErrorCode.INTERNAL_ERROR);\n _assert(\n typeof response.idToken !== 'undefined',\n AuthErrorCode.INTERNAL_ERROR\n );\n _assert(\n typeof response.refreshToken !== 'undefined',\n AuthErrorCode.INTERNAL_ERROR\n );\n const expiresIn =\n 'expiresIn' in response && typeof response.expiresIn !== 'undefined'\n ? Number(response.expiresIn)\n : _tokenExpiresIn(response.idToken);\n this.updateTokensAndExpiration(\n response.idToken,\n response.refreshToken,\n expiresIn\n );\n }\n\n async getToken(\n auth: AuthInternal,\n forceRefresh = false\n ): Promise<string | null> {\n _assert(\n !this.accessToken || this.refreshToken,\n auth,\n AuthErrorCode.TOKEN_EXPIRED\n );\n\n if (!forceRefresh && this.accessToken && !this.isExpired) {\n return this.accessToken;\n }\n\n if (this.refreshToken) {\n await this.refresh(auth, this.refreshToken!);\n return this.accessToken;\n }\n\n return null;\n }\n\n clearRefreshToken(): void {\n this.refreshToken = null;\n }\n\n private async refresh(auth: AuthInternal, oldToken: string): Promise<void> {\n const { accessToken, refreshToken, expiresIn } = await requestStsToken(\n auth,\n oldToken\n );\n this.updateTokensAndExpiration(\n accessToken,\n refreshToken,\n Number(expiresIn)\n );\n }\n\n private updateTokensAndExpiration(\n accessToken: string,\n refreshToken: string,\n expiresInSec: number\n ): void {\n this.refreshToken = refreshToken || null;\n this.accessToken = accessToken || null;\n this.expirationTime = Date.now() + expiresInSec * 1000;\n }\n\n static fromJSON(appName: string, object: PersistedBlob): StsTokenManager {\n const { refreshToken, accessToken, expirationTime } = object;\n\n const manager = new StsTokenManager();\n if (refreshToken) {\n _assert(typeof refreshToken === 'string', AuthErrorCode.INTERNAL_ERROR, {\n appName\n });\n manager.refreshToken = refreshToken;\n }\n if (accessToken) {\n _assert(typeof accessToken === 'string', AuthErrorCode.INTERNAL_ERROR, {\n appName\n });\n manager.accessToken = accessToken;\n }\n if (expirationTime) {\n _assert(\n typeof expirationTime === 'number',\n AuthErrorCode.INTERNAL_ERROR,\n {\n appName\n }\n );\n manager.expirationTime = expirationTime;\n }\n return manager;\n }\n\n toJSON(): object {\n return {\n refreshToken: this.refreshToken,\n accessToken: this.accessToken,\n expirationTime: this.expirationTime\n };\n }\n\n _assign(stsTokenManager: StsTokenManager): void {\n this.accessToken = stsTokenManager.accessToken;\n this.refreshToken = stsTokenManager.refreshToken;\n this.expirationTime = stsTokenManager.expirationTime;\n }\n\n _clone(): StsTokenManager {\n return Object.assign(new StsTokenManager(), this.toJSON());\n }\n\n _performRefresh(): never {\n return debugFail('not implemented');\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { IdTokenResult, ProviderId } from '../../model/public_types';\nimport { NextFn } from '@firebase/util';\n\nimport {\n APIUserInfo,\n deleteAccount\n} from '../../api/account_management/account';\nimport { FinalizeMfaResponse } from '../../api/authentication/mfa';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport {\n MutableUserInfo,\n UserInternal,\n UserParameters\n} from '../../model/user';\nimport { AuthErrorCode } from '../errors';\nimport { PersistedBlob } from '../persistence';\nimport { _assert } from '../util/assert';\nimport { getIdTokenResult } from './id_token_result';\nimport { _logoutIfInvalidated } from './invalidation';\nimport { ProactiveRefresh } from './proactive_refresh';\nimport { _reloadWithoutSaving, reload } from './reload';\nimport { StsTokenManager } from './token_manager';\nimport { UserMetadata } from './user_metadata';\n\nfunction assertStringOrUndefined(\n assertion: unknown,\n appName: string\n): asserts assertion is string | undefined {\n _assert(\n typeof assertion === 'string' || typeof assertion === 'undefined',\n AuthErrorCode.INTERNAL_ERROR,\n { appName }\n );\n}\n\nexport class UserImpl implements UserInternal {\n // For the user object, provider is always Firebase.\n readonly providerId = ProviderId.FIREBASE;\n stsTokenManager: StsTokenManager;\n // Last known accessToken so we know when it changes\n private accessToken: string | null;\n\n uid: string;\n auth: AuthInternal;\n emailVerified = false;\n isAnonymous = false;\n tenantId: string | null = null;\n readonly metadata: UserMetadata;\n providerData: MutableUserInfo[] = [];\n\n // Optional fields from UserInfo\n displayName: string | null;\n email: string | null;\n phoneNumber: string | null;\n photoURL: string | null;\n\n _redirectEventId?: string;\n private readonly proactiveRefresh = new ProactiveRefresh(this);\n\n constructor({ uid, auth, stsTokenManager, ...opt }: UserParameters) {\n this.uid = uid;\n this.auth = auth;\n this.stsTokenManager = stsTokenManager;\n this.accessToken = stsTokenManager.accessToken;\n this.displayName = opt.displayName || null;\n this.email = opt.email || null;\n this.phoneNumber = opt.phoneNumber || null;\n this.photoURL = opt.photoURL || null;\n this.isAnonymous = opt.isAnonymous || false;\n this.metadata = new UserMetadata(\n opt.createdAt || undefined,\n opt.lastLoginAt || undefined\n );\n }\n\n async getIdToken(forceRefresh?: boolean): Promise<string> {\n const accessToken = await _logoutIfInvalidated(\n this,\n this.stsTokenManager.getToken(this.auth, forceRefresh)\n );\n _assert(accessToken, this.auth, AuthErrorCode.INTERNAL_ERROR);\n\n if (this.accessToken !== accessToken) {\n this.accessToken = accessToken;\n await this.auth._persistUserIfCurrent(this);\n this.auth._notifyListenersIfCurrent(this);\n }\n\n return accessToken;\n }\n\n getIdTokenResult(forceRefresh?: boolean): Promise<IdTokenResult> {\n return getIdTokenResult(this, forceRefresh);\n }\n\n reload(): Promise<void> {\n return reload(this);\n }\n\n private reloadUserInfo: APIUserInfo | null = null;\n private reloadListener: NextFn<APIUserInfo> | null = null;\n\n _assign(user: UserInternal): void {\n if (this === user) {\n return;\n }\n _assert(this.uid === user.uid, this.auth, AuthErrorCode.INTERNAL_ERROR);\n this.displayName = user.displayName;\n this.photoURL = user.photoURL;\n this.email = user.email;\n this.emailVerified = user.emailVerified;\n this.phoneNumber = user.phoneNumber;\n this.isAnonymous = user.isAnonymous;\n this.tenantId = user.tenantId;\n this.providerData = user.providerData.map(userInfo => ({ ...userInfo }));\n this.metadata._copy(user.metadata);\n this.stsTokenManager._assign(user.stsTokenManager);\n }\n\n _clone(auth: AuthInternal): UserInternal {\n return new UserImpl({\n ...this,\n auth,\n stsTokenManager: this.stsTokenManager._clone()\n });\n }\n\n _onReload(callback: NextFn<APIUserInfo>): void {\n // There should only ever be one listener, and that is a single instance of MultiFactorUser\n _assert(!this.reloadListener, this.auth, AuthErrorCode.INTERNAL_ERROR);\n this.reloadListener = callback;\n if (this.reloadUserInfo) {\n this._notifyReloadListener(this.reloadUserInfo);\n this.reloadUserInfo = null;\n }\n }\n\n _notifyReloadListener(userInfo: APIUserInfo): void {\n if (this.reloadListener) {\n this.reloadListener(userInfo);\n } else {\n // If no listener is subscribed yet, save the result so it's available when they do subscribe\n this.reloadUserInfo = userInfo;\n }\n }\n\n _startProactiveRefresh(): void {\n this.proactiveRefresh._start();\n }\n\n _stopProactiveRefresh(): void {\n this.proactiveRefresh._stop();\n }\n\n async _updateTokensIfNecessary(\n response: IdTokenResponse | FinalizeMfaResponse,\n reload = false\n ): Promise<void> {\n let tokensRefreshed = false;\n if (\n response.idToken &&\n response.idToken !== this.stsTokenManager.accessToken\n ) {\n this.stsTokenManager.updateFromServerResponse(response);\n tokensRefreshed = true;\n }\n\n if (reload) {\n await _reloadWithoutSaving(this);\n }\n\n await this.auth._persistUserIfCurrent(this);\n if (tokensRefreshed) {\n this.auth._notifyListenersIfCurrent(this);\n }\n }\n\n async delete(): Promise<void> {\n const idToken = await this.getIdToken();\n await _logoutIfInvalidated(this, deleteAccount(this.auth, { idToken }));\n this.stsTokenManager.clearRefreshToken();\n\n // TODO: Determine if cancellable-promises are necessary to use in this class so that delete()\n // cancels pending actions...\n\n return this.auth.signOut();\n }\n\n toJSON(): PersistedBlob {\n return {\n uid: this.uid,\n email: this.email || undefined,\n emailVerified: this.emailVerified,\n displayName: this.displayName || undefined,\n isAnonymous: this.isAnonymous,\n photoURL: this.photoURL || undefined,\n phoneNumber: this.phoneNumber || undefined,\n tenantId: this.tenantId || undefined,\n providerData: this.providerData.map(userInfo => ({ ...userInfo })),\n stsTokenManager: this.stsTokenManager.toJSON(),\n // Redirect event ID must be maintained in case there is a pending\n // redirect event.\n _redirectEventId: this._redirectEventId,\n ...this.metadata.toJSON(),\n\n // Required for compatibility with the legacy SDK (go/firebase-auth-sdk-persistence-parsing):\n apiKey: this.auth.config.apiKey,\n appName: this.auth.name\n // Missing authDomain will be tolerated by the legacy SDK.\n // stsTokenManager.apiKey isn't actually required (despite the legacy SDK persisting it).\n };\n }\n\n get refreshToken(): string {\n return this.stsTokenManager.refreshToken || '';\n }\n\n static _fromJSON(auth: AuthInternal, object: PersistedBlob): UserInternal {\n const displayName = object.displayName ?? undefined;\n const email = object.email ?? undefined;\n const phoneNumber = object.phoneNumber ?? undefined;\n const photoURL = object.photoURL ?? undefined;\n const tenantId = object.tenantId ?? undefined;\n const _redirectEventId = object._redirectEventId ?? undefined;\n const createdAt = object.createdAt ?? undefined;\n const lastLoginAt = object.lastLoginAt ?? undefined;\n const {\n uid,\n emailVerified,\n isAnonymous,\n providerData,\n stsTokenManager: plainObjectTokenManager\n } = object;\n\n _assert(uid && plainObjectTokenManager, auth, AuthErrorCode.INTERNAL_ERROR);\n\n const stsTokenManager = StsTokenManager.fromJSON(\n this.name,\n plainObjectTokenManager as PersistedBlob\n );\n\n _assert(typeof uid === 'string', auth, AuthErrorCode.INTERNAL_ERROR);\n assertStringOrUndefined(displayName, auth.name);\n assertStringOrUndefined(email, auth.name);\n _assert(\n typeof emailVerified === 'boolean',\n auth,\n AuthErrorCode.INTERNAL_ERROR\n );\n _assert(\n typeof isAnonymous === 'boolean',\n auth,\n AuthErrorCode.INTERNAL_ERROR\n );\n assertStringOrUndefined(phoneNumber, auth.name);\n assertStringOrUndefined(photoURL, auth.name);\n assertStringOrUndefined(tenantId, auth.name);\n assertStringOrUndefined(_redirectEventId, auth.name);\n assertStringOrUndefined(createdAt, auth.name);\n assertStringOrUndefined(lastLoginAt, auth.name);\n const user = new UserImpl({\n uid,\n auth,\n email,\n emailVerified,\n displayName,\n isAnonymous,\n photoURL,\n phoneNumber,\n tenantId,\n stsTokenManager,\n createdAt,\n lastLoginAt\n });\n\n if (providerData && Array.isArray(providerData)) {\n user.providerData = providerData.map(userInfo => ({ ...userInfo }));\n }\n\n if (_redirectEventId) {\n user._redirectEventId = _redirectEventId;\n }\n\n return user;\n }\n\n /**\n * Initialize a User from an idToken server response\n * @param auth\n * @param idTokenResponse\n */\n static async _fromIdTokenResponse(\n auth: AuthInternal,\n idTokenResponse: IdTokenResponse,\n isAnonymous: boolean = false\n ): Promise<UserInternal> {\n const stsTokenManager = new StsTokenManager();\n stsTokenManager.updateFromServerResponse(idTokenResponse);\n\n // Initialize the Firebase Auth user.\n const user = new UserImpl({\n uid: idTokenResponse.localId,\n auth,\n stsTokenManager,\n isAnonymous\n });\n\n // Updates the user info and data and resolves with a user instance.\n await _reloadWithoutSaving(user);\n return user;\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Persistence } from '../../model/public_types';\n\nimport {\n PersistenceInternal,\n PersistenceType,\n PersistenceValue,\n StorageEventListener\n} from '../persistence';\n\nexport class InMemoryPersistence implements PersistenceInternal {\n static type: 'NONE' = 'NONE';\n readonly type = PersistenceType.NONE;\n storage: Record<string, PersistenceValue> = {};\n\n async _isAvailable(): Promise<boolean> {\n return true;\n }\n\n async _set(key: string, value: PersistenceValue): Promise<void> {\n this.storage[key] = value;\n }\n\n async _get<T extends PersistenceValue>(key: string): Promise<T | null> {\n const value = this.storage[key];\n return value === undefined ? null : (value as T);\n }\n\n async _remove(key: string): Promise<void> {\n delete this.storage[key];\n }\n\n _addListener(_key: string, _listener: StorageEventListener): void {\n // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers\n return;\n }\n\n _removeListener(_key: string, _listener: StorageEventListener): void {\n // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers\n return;\n }\n}\n\n/**\n * An implementation of {@link Persistence} of type 'NONE'.\n *\n * @public\n */\nexport const inMemoryPersistence: Persistence = InMemoryPersistence;\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ApiKey, AppName, AuthInternal } from '../../model/auth';\nimport { UserInternal } from '../../model/user';\nimport { PersistedBlob, PersistenceInternal } from '../persistence';\nimport { UserImpl } from '../user/user_impl';\nimport { _getInstance } from '../util/instantiator';\nimport { inMemoryPersistence } from './in_memory';\n\nexport const enum KeyName {\n AUTH_USER = 'authUser',\n AUTH_EVENT = 'authEvent',\n REDIRECT_USER = 'redirectUser',\n PERSISTENCE_USER = 'persistence'\n}\nexport const enum Namespace {\n PERSISTENCE = 'firebase'\n}\n\nexport function _persistenceKeyName(\n key: string,\n apiKey: ApiKey,\n appName: AppName\n): string {\n return `${Namespace.PERSISTENCE}:${key}:${apiKey}:${appName}`;\n}\n\nexport class PersistenceUserManager {\n private readonly fullUserKey: string;\n private readonly fullPersistenceKey: string;\n private readonly boundEventHandler: () => void;\n\n private constructor(\n public persistence: PersistenceInternal,\n private readonly auth: AuthInternal,\n private readonly userKey: string\n ) {\n const { config, name } = this.auth;\n this.fullUserKey = _persistenceKeyName(this.userKey, config.apiKey, name);\n this.fullPersistenceKey = _persistenceKeyName(\n KeyName.PERSISTENCE_USER,\n config.apiKey,\n name\n );\n this.boundEventHandler = auth._onStorageEvent.bind(auth);\n this.persistence._addListener(this.fullUserKey, this.boundEventHandler);\n }\n\n setCurrentUser(user: UserInternal): Promise<void> {\n return this.persistence._set(this.fullUserKey, user.toJSON());\n }\n\n async getCurrentUser(): Promise<UserInternal | null> {\n const blob = await this.persistence._get<PersistedBlob>(this.fullUserKey);\n return blob ? UserImpl._fromJSON(this.auth, blob) : null;\n }\n\n removeCurrentUser(): Promise<void> {\n return this.persistence._remove(this.fullUserKey);\n }\n\n savePersistenceForRedirect(): Promise<void> {\n return this.persistence._set(\n this.fullPersistenceKey,\n this.persistence.type\n );\n }\n\n async setPersistence(newPersistence: PersistenceInternal): Promise<void> {\n if (this.persistence === newPersistence) {\n return;\n }\n\n const currentUser = await this.getCurrentUser();\n await this.removeCurrentUser();\n\n this.persistence = newPersistence;\n\n if (currentUser) {\n return this.setCurrentUser(currentUser);\n }\n }\n\n delete(): void {\n this.persistence._removeListener(this.fullUserKey, this.boundEventHandler);\n }\n\n static async create(\n auth: AuthInternal,\n persistenceHierarchy: PersistenceInternal[],\n userKey = KeyName.AUTH_USER\n ): Promise<PersistenceUserManager> {\n if (!persistenceHierarchy.length) {\n return new PersistenceUserManager(\n _getInstance(inMemoryPersistence),\n auth,\n userKey\n );\n }\n\n // Use the first persistence that supports a full read-write roundtrip (or fallback to memory).\n let chosenPersistence = _getInstance<PersistenceInternal>(\n inMemoryPersistence\n );\n for (const persistence of persistenceHierarchy) {\n if (await persistence._isAvailable()) {\n chosenPersistence = persistence;\n break;\n }\n }\n\n // However, attempt to migrate users stored in other persistences (in the hierarchy order).\n let userToMigrate: UserInternal | null = null;\n const key = _persistenceKeyName(userKey, auth.config.apiKey, auth.name);\n for (const persistence of persistenceHierarchy) {\n // We attempt to call _get without checking _isAvailable since here we don't care if the full\n // round-trip (read+write) is supported. We'll take the first one that we can read or give up.\n try {\n const blob = await persistence._get<PersistedBlob>(key); // throws if unsupported\n if (blob) {\n const user = UserImpl._fromJSON(auth, blob); // throws for unparsable blob (wrong format)\n if (persistence !== chosenPersistence) {\n userToMigrate = user;\n }\n break;\n }\n } catch {}\n }\n\n if (userToMigrate) {\n // This normally shouldn't throw since chosenPersistence.isAvailable() is true, but if it does\n // we'll just let it bubble to surface the error.\n await chosenPersistence._set(key, userToMigrate.toJSON());\n }\n\n // Attempt to clear the key in other persistences but ignore errors. This helps prevent issues\n // such as users getting stuck with a previous account after signing out and refreshing the tab.\n await Promise.all(\n persistenceHierarchy.map(async persistence => {\n if (persistence !== chosenPersistence) {\n try {\n await persistence._remove(key);\n } catch {}\n }\n })\n );\n return new PersistenceUserManager(chosenPersistence, auth, userKey);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isIE, getUA } from '@firebase/util';\n\ninterface NavigatorStandalone extends Navigator {\n standalone?: unknown;\n}\n\ninterface Document {\n documentMode?: number;\n}\n\n/**\n * Enums for Browser name.\n */\nexport const enum BrowserName {\n ANDROID = 'Android',\n BLACKBERRY = 'Blackberry',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n IE = 'IE',\n IEMOBILE = 'IEMobile',\n OPERA = 'Opera',\n OTHER = 'Other',\n CHROME = 'Chrome',\n SAFARI = 'Safari',\n SILK = 'Silk',\n WEBOS = 'Webos'\n}\n\n/**\n * Determine the browser for the purposes of reporting usage to the API\n */\nexport function _getBrowserName(userAgent: string): BrowserName | string {\n const ua = userAgent.toLowerCase();\n if (ua.includes('opera/') || ua.includes('opr/') || ua.includes('opios/')) {\n return BrowserName.OPERA;\n } else if (_isIEMobile(ua)) {\n // Windows phone IEMobile browser.\n return BrowserName.IEMOBILE;\n } else if (ua.includes('msie') || ua.includes('trident/')) {\n return BrowserName.IE;\n } else if (ua.includes('edge/')) {\n return BrowserName.EDGE;\n } else if (_isFirefox(ua)) {\n return BrowserName.FIREFOX;\n } else if (ua.includes('silk/')) {\n return BrowserName.SILK;\n } else if (_isBlackBerry(ua)) {\n // Blackberry browser.\n return BrowserName.BLACKBERRY;\n } else if (_isWebOS(ua)) {\n // WebOS default browser.\n return BrowserName.WEBOS;\n } else if (_isSafari(ua)) {\n return BrowserName.SAFARI;\n } else if (\n (ua.includes('chrome/') || _isChromeIOS(ua)) &&\n !ua.includes('edge/')\n ) {\n return BrowserName.CHROME;\n } else if (_isAndroid(ua)) {\n // Android stock browser.\n return BrowserName.ANDROID;\n } else {\n // Most modern browsers have name/version at end of user agent string.\n const re = /([a-zA-Z\\d\\.]+)\\/[a-zA-Z\\d\\.]*$/;\n const matches = userAgent.match(re);\n if (matches?.length === 2) {\n return matches[1];\n }\n }\n return BrowserName.OTHER;\n}\n\nexport function _isFirefox(ua = getUA()): boolean {\n return /firefox\\//i.test(ua);\n}\n\nexport function _isSafari(userAgent = getUA()): boolean {\n const ua = userAgent.toLowerCase();\n return (\n ua.includes('safari/') &&\n !ua.includes('chrome/') &&\n !ua.includes('crios/') &&\n !ua.includes('android')\n );\n}\n\nexport function _isChromeIOS(ua = getUA()): boolean {\n return /crios\\//i.test(ua);\n}\n\nexport function _isIEMobile(ua = getUA()): boolean {\n return /iemobile/i.test(ua);\n}\n\nexport function _isAndroid(ua = getUA()): boolean {\n return /android/i.test(ua);\n}\n\nexport function _isBlackBerry(ua = getUA()): boolean {\n return /blackberry/i.test(ua);\n}\n\nexport function _isWebOS(ua = getUA()): boolean {\n return /webos/i.test(ua);\n}\n\nexport function _isIOS(ua = getUA()): boolean {\n return /iphone|ipad|ipod/i.test(ua);\n}\n\nexport function _isIOS7Or8(ua = getUA()): boolean {\n return (\n /(iPad|iPhone|iPod).*OS 7_\\d/i.test(ua) ||\n /(iPad|iPhone|iPod).*OS 8_\\d/i.test(ua)\n );\n}\n\nexport function _isIOSStandalone(ua = getUA()): boolean {\n return _isIOS(ua) && !!(window.navigator as NavigatorStandalone)?.standalone;\n}\n\nexport function _isIE10(): boolean {\n return isIE() && (document as Document).documentMode === 10;\n}\n\nexport function _isMobileBrowser(ua: string = getUA()): boolean {\n // TODO: implement getBrowserName equivalent for OS.\n return (\n _isIOS(ua) ||\n _isAndroid(ua) ||\n _isWebOS(ua) ||\n _isBlackBerry(ua) ||\n /windows phone/i.test(ua) ||\n _isIEMobile(ua)\n );\n}\n\nexport function _isIframe(): boolean {\n try {\n // Check that the current window is not the top window.\n // If so, return true.\n return !!(window && window !== window.top);\n } catch (e) {\n return false;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SDK_VERSION } from '@firebase/app-exp';\nimport { _getBrowserName } from './browser';\nimport { getUA } from '@firebase/util';\n\nexport const enum ClientImplementation {\n CORE = 'JsCore'\n}\n\nexport const enum ClientPlatform {\n BROWSER = 'Browser',\n NODE = 'Node',\n REACT_NATIVE = 'ReactNative',\n CORDOVA = 'Cordova',\n WORKER = 'Worker'\n}\n\n/*\n * Determine the SDK version string\n */\nexport function _getClientVersion(\n clientPlatform: ClientPlatform,\n frameworks: readonly string[] = []\n): string {\n let reportedPlatform: string;\n switch (clientPlatform) {\n case ClientPlatform.BROWSER:\n // In a browser environment, report the browser name.\n reportedPlatform = _getBrowserName(getUA());\n break;\n case ClientPlatform.WORKER:\n // Technically a worker runs from a browser but we need to differentiate a\n // worker from a browser.\n // For example: Chrome-Worker/JsCore/4.9.1/FirebaseCore-web.\n reportedPlatform = `${_getBrowserName(getUA())}-${clientPlatform}`;\n break;\n default:\n reportedPlatform = clientPlatform;\n }\n const reportedFrameworks = frameworks.length\n ? frameworks.join(',')\n : 'FirebaseCore-web'; /* default value if no other framework is used */\n return `${reportedPlatform}/${ClientImplementation.CORE}/${SDK_VERSION}/${reportedFrameworks}`;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _FirebaseService, FirebaseApp } from '@firebase/app-exp';\nimport {\n Auth,\n AuthErrorMap,\n AuthSettings,\n EmulatorConfig,\n NextOrObserver,\n Persistence,\n PopupRedirectResolver,\n User,\n UserCredential,\n CompleteFn,\n ErrorFn,\n NextFn,\n Unsubscribe\n} from '../../model/public_types';\nimport {\n createSubscribe,\n ErrorFactory,\n getModularInstance,\n Observer,\n Subscribe\n} from '@firebase/util';\n\nimport { AuthInternal, ConfigInternal } from '../../model/auth';\nimport { PopupRedirectResolverInternal } from '../../model/popup_redirect';\nimport { UserInternal } from '../../model/user';\nimport {\n AuthErrorCode,\n AuthErrorParams,\n ErrorMapRetriever,\n _DEFAULT_AUTH_ERROR_FACTORY\n} from '../errors';\nimport { PersistenceInternal } from '../persistence';\nimport {\n KeyName,\n PersistenceUserManager\n} from '../persistence/persistence_user_manager';\nimport { _reloadWithoutSaving } from '../user/reload';\nimport { _assert } from '../util/assert';\nimport { _getInstance } from '../util/instantiator';\nimport { _getUserLanguage } from '../util/navigator';\nimport { _getClientVersion } from '../util/version';\n\ninterface AsyncAction {\n (): Promise<void>;\n}\n\nexport const enum DefaultConfig {\n TOKEN_API_HOST = 'securetoken.googleapis.com',\n API_HOST = 'identitytoolkit.googleapis.com',\n API_SCHEME = 'https'\n}\n\nexport class AuthImpl implements AuthInternal, _FirebaseService {\n currentUser: User | null = null;\n emulatorConfig: EmulatorConfig | null = null;\n private operations = Promise.resolve();\n private persistenceManager?: PersistenceUserManager;\n private redirectPersistenceManager?: PersistenceUserManager;\n private authStateSubscription = new Subscription<User>(this);\n private idTokenSubscription = new Subscription<User>(this);\n private redirectUser: UserInternal | null = null;\n private isProactiveRefreshEnabled = false;\n private redirectInitializerError: Error | null = null;\n\n // Any network calls will set this to true and prevent subsequent emulator\n // initialization\n _canInitEmulator = true;\n _isInitialized = false;\n _deleted = false;\n _initializationPromise: Promise<void> | null = null;\n _popupRedirectResolver: PopupRedirectResolverInternal | null = null;\n _errorFactory: ErrorFactory<\n AuthErrorCode,\n AuthErrorParams\n > = _DEFAULT_AUTH_ERROR_FACTORY;\n readonly name: string;\n\n // Tracks the last notified UID for state change listeners to prevent\n // repeated calls to the callbacks. Undefined means it's never been\n // called, whereas null means it's been called with a signed out user\n private lastNotifiedUid: string | null | undefined = undefined;\n\n languageCode: string | null = null;\n tenantId: string | null = null;\n settings: AuthSettings = { appVerificationDisabledForTesting: false };\n\n constructor(\n public readonly app: FirebaseApp,\n public readonly config: ConfigInternal\n ) {\n this.name = app.name;\n this.clientVersion = config.sdkClientVersion;\n }\n\n _initializeWithPersistence(\n persistenceHierarchy: PersistenceInternal[],\n popupRedirectResolver?: PopupRedirectResolver\n ): Promise<void> {\n if (popupRedirectResolver) {\n this._popupRedirectResolver = _getInstance(popupRedirectResolver);\n }\n\n // Have to check for app deletion throughout initialization (after each\n // promise resolution)\n this._initializationPromise = this.queue(async () => {\n if (this._deleted) {\n return;\n }\n\n this.persistenceManager = await PersistenceUserManager.create(\n this,\n persistenceHierarchy\n );\n\n if (this._deleted) {\n return;\n }\n\n // Initialize the resolver early if necessary (only applicable to web:\n // this will cause the iframe to load immediately in certain cases)\n if (this._popupRedirectResolver?._shouldInitProactively) {\n await this._popupRedirectResolver._initialize(this);\n }\n\n await this.initializeCurrentUser(popupRedirectResolver);\n\n if (this._deleted) {\n return;\n }\n\n this._isInitialized = true;\n });\n\n // After initialization completes, throw any error caused by redirect flow\n return this._initializationPromise.then(() => {\n if (this.redirectInitializerError) {\n throw this.redirectInitializerError;\n }\n });\n }\n\n /**\n * If the persistence is changed in another window, the user manager will let us know\n */\n async _onStorageEvent(): Promise<void> {\n if (this._deleted) {\n return;\n }\n\n const user = await this.assertedPersistence.getCurrentUser();\n\n if (!this.currentUser && !user) {\n // No change, do nothing (was signed out and remained signed out).\n return;\n }\n\n // If the same user is to be synchronized.\n if (this.currentUser && user && this.currentUser.uid === user.uid) {\n // Data update, simply copy data changes.\n this._currentUser._assign(user);\n // If tokens changed from previous user tokens, this will trigger\n // notifyAuthListeners_.\n await this.currentUser.getIdToken();\n return;\n }\n\n // Update current Auth state. Either a new login or logout.\n await this._updateCurrentUser(user);\n }\n\n private async initializeCurrentUser(\n popupRedirectResolver?: PopupRedirectResolver\n ): Promise<void> {\n // First check to see if we have a pending redirect event.\n let storedUser = (await this.assertedPersistence.getCurrentUser()) as UserInternal | null;\n if (popupRedirectResolver && this.config.authDomain) {\n await this.getOrInitRedirectPersistenceManager();\n const redirectUserEventId = this.redirectUser?._redirectEventId;\n const storedUserEventId = storedUser?._redirectEventId;\n const result = await this.tryRedirectSignIn(popupRedirectResolver);\n\n // If the stored user (i.e. the old \"currentUser\") has a redirectId that\n // matches the redirect user, then we want to initially sign in with the\n // new user object from result.\n // TODO(samgho): More thoroughly test all of this\n if (\n (!redirectUserEventId || redirectUserEventId === storedUserEventId) &&\n result?.user\n ) {\n storedUser = result.user as UserInternal;\n }\n }\n\n // If no user in persistence, there is no current user. Set to null.\n if (!storedUser) {\n return this.directlySetCurrentUser(null);\n }\n\n if (!storedUser._redirectEventId) {\n // This isn't a redirect user, we can reload and bail\n // This will also catch the redirected user, if available, as that method\n // strips the _redirectEventId\n return this.reloadAndSetCurrentUserOrClear(storedUser);\n }\n\n _assert(this._popupRedirectResolver, this, AuthErrorCode.ARGUMENT_ERROR);\n await this.getOrInitRedirectPersistenceManager();\n\n // If the redirect user's event ID matches the current user's event ID,\n // DO NOT reload the current user, otherwise they'll be cleared from storage.\n // This is important for the reauthenticateWithRedirect() flow.\n if (\n this.redirectUser &&\n this.redirectUser._redirectEventId === storedUser._redirectEventId\n ) {\n return this.directlySetCurrentUser(storedUser);\n }\n\n return this.reloadAndSetCurrentUserOrClear(storedUser);\n }\n\n private async tryRedirectSignIn(\n redirectResolver: PopupRedirectResolver\n ): Promise<UserCredential | null> {\n // The redirect user needs to be checked (and signed in if available)\n // during auth initialization. All of the normal sign in and link/reauth\n // flows call back into auth and push things onto the promise queue. We\n // need to await the result of the redirect sign in *inside the promise\n // queue*. This presents a problem: we run into deadlock. See:\n // \u250C> [Initialization] \u2500\u2500\u2500\u2500\u2500\u2510\n // \u250C> [<other queue tasks>] \u2502\n // \u2514\u2500 [getRedirectResult] <\u2500\u2518\n // where [] are tasks on the queue and arrows denote awaits\n // Initialization will never complete because it's waiting on something\n // that's waiting for initialization to complete!\n //\n // Instead, this method calls getRedirectResult() (stored in\n // _completeRedirectFn) with an optional parameter that instructs all of\n // the underlying auth operations to skip anything that mutates auth state.\n\n let result: UserCredential | null = null;\n try {\n // We know this._popupRedirectResolver is set since redirectResolver\n // is passed in. The _completeRedirectFn expects the unwrapped extern.\n result = await this._popupRedirectResolver!._completeRedirectFn(\n this,\n redirectResolver,\n true\n );\n } catch (e) {\n this.redirectInitializerError = e;\n await this._setRedirectUser(null);\n }\n\n return result;\n }\n\n private async reloadAndSetCurrentUserOrClear(\n user: UserInternal\n ): Promise<void> {\n try {\n await _reloadWithoutSaving(user);\n } catch (e) {\n if (e.code !== `auth/${AuthErrorCode.NETWORK_REQUEST_FAILED}`) {\n // Something's wrong with the user's token. Log them out and remove\n // them from storage\n return this.directlySetCurrentUser(null);\n }\n }\n\n return this.directlySetCurrentUser(user);\n }\n\n useDeviceLanguage(): void {\n this.languageCode = _getUserLanguage();\n }\n\n async _delete(): Promise<void> {\n this._deleted = true;\n }\n\n async updateCurrentUser(userExtern: User | null): Promise<void> {\n // The public updateCurrentUser method needs to make a copy of the user,\n // and also check that the project matches\n const user = userExtern\n ? (getModularInstance(userExtern) as UserInternal)\n : null;\n if (user) {\n _assert(\n user.auth.config.apiKey === this.config.apiKey,\n this,\n AuthErrorCode.INVALID_AUTH\n );\n }\n return this._updateCurrentUser(user && user._clone(this));\n }\n\n async _updateCurrentUser(user: User | null): Promise<void> {\n if (this._deleted) {\n return;\n }\n if (user) {\n _assert(\n this.tenantId === user.tenantId,\n this,\n AuthErrorCode.TENANT_ID_MISMATCH\n );\n }\n\n return this.queue(async () => {\n await this.directlySetCurrentUser(user as UserInternal | null);\n this.notifyAuthListeners();\n });\n }\n\n async signOut(): Promise<void> {\n // Clear the redirect user when signOut is called\n if (this.redirectPersistenceManager || this._popupRedirectResolver) {\n await this._setRedirectUser(null);\n }\n\n return this._updateCurrentUser(null);\n }\n\n setPersistence(persistence: Persistence): Promise<void> {\n return this.queue(async () => {\n await this.assertedPersistence.setPersistence(_getInstance(persistence));\n });\n }\n\n _getPersistence(): string {\n return this.assertedPersistence.persistence.type;\n }\n\n _updateErrorMap(errorMap: AuthErrorMap): void {\n this._errorFactory = new ErrorFactory<AuthErrorCode, AuthErrorParams>(\n 'auth',\n 'Firebase',\n (errorMap as ErrorMapRetriever)()\n );\n }\n\n onAuthStateChanged(\n nextOrObserver: NextOrObserver<User>,\n error?: ErrorFn,\n completed?: CompleteFn\n ): Unsubscribe {\n return this.registerStateListener(\n this.authStateSubscription,\n nextOrObserver,\n error,\n completed\n );\n }\n\n onIdTokenChanged(\n nextOrObserver: NextOrObserver<User>,\n error?: ErrorFn,\n completed?: CompleteFn\n ): Unsubscribe {\n return this.registerStateListener(\n this.idTokenSubscription,\n nextOrObserver,\n error,\n completed\n );\n }\n\n toJSON(): object {\n return {\n apiKey: this.config.apiKey,\n authDomain: this.config.authDomain,\n appName: this.name,\n currentUser: this._currentUser?.toJSON()\n };\n }\n\n async _setRedirectUser(\n user: UserInternal | null,\n popupRedirectResolver?: PopupRedirectResolver\n ): Promise<void> {\n const redirectManager = await this.getOrInitRedirectPersistenceManager(\n popupRedirectResolver\n );\n return user === null\n ? redirectManager.removeCurrentUser()\n : redirectManager.setCurrentUser(user);\n }\n\n private async getOrInitRedirectPersistenceManager(\n popupRedirectResolver?: PopupRedirectResolver\n ): Promise<PersistenceUserManager> {\n if (!this.redirectPersistenceManager) {\n const resolver: PopupRedirectResolverInternal | null =\n (popupRedirectResolver && _getInstance(popupRedirectResolver)) ||\n this._popupRedirectResolver;\n _assert(resolver, this, AuthErrorCode.ARGUMENT_ERROR);\n this.redirectPersistenceManager = await PersistenceUserManager.create(\n this,\n [_getInstance(resolver._redirectPersistence)],\n KeyName.REDIRECT_USER\n );\n this.redirectUser = await this.redirectPersistenceManager.getCurrentUser();\n }\n\n return this.redirectPersistenceManager;\n }\n\n async _redirectUserForId(id: string): Promise<UserInternal | null> {\n // Make sure we've cleared any pending persistence actions if we're not in\n // the initializer\n if (this._isInitialized) {\n await this.queue(async () => {});\n }\n\n if (this._currentUser?._redirectEventId === id) {\n return this._currentUser;\n }\n\n if (this.redirectUser?._redirectEventId === id) {\n return this.redirectUser;\n }\n\n return null;\n }\n\n async _persistUserIfCurrent(user: UserInternal): Promise<void> {\n if (user === this.currentUser) {\n return this.queue(async () => this.directlySetCurrentUser(user));\n }\n }\n\n /** Notifies listeners only if the user is current */\n _notifyListenersIfCurrent(user: UserInternal): void {\n if (user === this.currentUser) {\n this.notifyAuthListeners();\n }\n }\n\n _key(): string {\n return `${this.config.authDomain}:${this.config.apiKey}:${this.name}`;\n }\n\n _startProactiveRefresh(): void {\n this.isProactiveRefreshEnabled = true;\n if (this.currentUser) {\n this._currentUser._startProactiveRefresh();\n }\n }\n\n _stopProactiveRefresh(): void {\n this.isProactiveRefreshEnabled = false;\n if (this.currentUser) {\n this._currentUser._stopProactiveRefresh();\n }\n }\n\n /** Returns the current user cast as the internal type */\n get _currentUser(): UserInternal {\n return this.currentUser as UserInternal;\n }\n\n private notifyAuthListeners(): void {\n if (!this._isInitialized) {\n return;\n }\n\n this.idTokenSubscription.next(this.currentUser);\n\n const currentUid = this.currentUser?.uid ?? null;\n if (this.lastNotifiedUid !== currentUid) {\n this.lastNotifiedUid = currentUid;\n this.authStateSubscription.next(this.currentUser);\n }\n }\n\n private registerStateListener(\n subscription: Subscription<User>,\n nextOrObserver: NextOrObserver<User>,\n error?: ErrorFn,\n completed?: CompleteFn\n ): Unsubscribe {\n if (this._deleted) {\n return () => {};\n }\n\n const cb =\n typeof nextOrObserver === 'function'\n ? nextOrObserver\n : nextOrObserver.next.bind(nextOrObserver);\n\n const promise = this._isInitialized\n ? Promise.resolve()\n : this._initializationPromise;\n _assert(promise, this, AuthErrorCode.INTERNAL_ERROR);\n // The callback needs to be called asynchronously per the spec.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n promise.then(() => cb(this.currentUser));\n\n if (typeof nextOrObserver === 'function') {\n return subscription.addObserver(nextOrObserver, error, completed);\n } else {\n return subscription.addObserver(nextOrObserver);\n }\n }\n\n /**\n * Unprotected (from race conditions) method to set the current user. This\n * should only be called from within a queued callback. This is necessary\n * because the queue shouldn't rely on another queued callback.\n */\n private async directlySetCurrentUser(\n user: UserInternal | null\n ): Promise<void> {\n if (this.currentUser && this.currentUser !== user) {\n this._currentUser._stopProactiveRefresh();\n if (user && this.isProactiveRefreshEnabled) {\n user._startProactiveRefresh();\n }\n }\n\n this.currentUser = user;\n\n if (user) {\n await this.assertedPersistence.setCurrentUser(user);\n } else {\n await this.assertedPersistence.removeCurrentUser();\n }\n }\n\n private queue(action: AsyncAction): Promise<void> {\n // In case something errors, the callback still should be called in order\n // to keep the promise chain alive\n this.operations = this.operations.then(action, action);\n return this.operations;\n }\n\n private get assertedPersistence(): PersistenceUserManager {\n _assert(this.persistenceManager, this, AuthErrorCode.INTERNAL_ERROR);\n return this.persistenceManager;\n }\n\n private frameworks: string[] = [];\n private clientVersion: string;\n _logFramework(framework: string): void {\n if (!framework || this.frameworks.includes(framework)) {\n return;\n }\n this.frameworks.push(framework);\n\n // Sort alphabetically so that \"FirebaseCore-web,FirebaseUI-web\" and\n // \"FirebaseUI-web,FirebaseCore-web\" aren't viewed as different.\n this.frameworks.sort();\n this.clientVersion = _getClientVersion(\n this.config.clientPlatform,\n this._getFrameworks()\n );\n }\n _getFrameworks(): readonly string[] {\n return this.frameworks;\n }\n _getSdkClientVersion(): string {\n return this.clientVersion;\n }\n}\n\n/**\n * Method to be used to cast down to our private implmentation of Auth.\n * It will also handle unwrapping from the compat type if necessary\n *\n * @param auth Auth object passed in from developer\n */\nexport function _castAuth(auth: Auth): AuthInternal {\n return getModularInstance(auth) as AuthInternal;\n}\n\n/** Helper class to wrap subscriber logic */\nclass Subscription<T> {\n private observer: Observer<T | null> | null = null;\n readonly addObserver: Subscribe<T | null> = createSubscribe(\n observer => (this.observer = observer)\n );\n\n constructor(readonly auth: AuthInternal) {}\n\n get next(): NextFn<T | null> {\n _assert(this.observer, this.auth, AuthErrorCode.INTERNAL_ERROR);\n return this.observer.next.bind(this.observer);\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Auth } from '../../model/public_types';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { _castAuth } from './auth_impl';\n\n/**\n * Changes the Auth instance to communicate with the Firebase Auth Emulator, instead of production\n * Firebase Auth services.\n *\n * @remarks\n * This must be called synchronously immediately following the first call to\n * {@link initializeAuth}. Do not use with production credentials as emulator\n * traffic is not encrypted.\n *\n *\n * @example\n * ```javascript\n * connectAuthEmulator(auth, 'http://127.0.0.1:9099', { disableWarnings: true });\n * ```\n *\n * @param auth - The Auth instance.\n * @param url - The URL at which the emulator is running (eg, 'http://localhost:9099').\n * @param options.disableWarnings - (Optional: default false) Disable the warning banner attached to the DOM\n *\n * @public\n */\nexport function connectAuthEmulator(\n auth: Auth,\n url: string,\n options?: { disableWarnings: boolean }\n): void {\n const authInternal = _castAuth(auth);\n _assert(\n authInternal._canInitEmulator,\n authInternal,\n AuthErrorCode.EMULATOR_CONFIG_FAILED\n );\n\n _assert(\n /^https?:\\/\\//.test(url),\n authInternal,\n AuthErrorCode.INVALID_EMULATOR_SCHEME\n );\n\n const disableWarnings = !!options?.disableWarnings;\n\n const protocol = extractProtocol(url);\n const { host, port } = extractHostAndPort(url);\n const portStr = port === null ? '' : `:${port}`;\n\n // Always replace path with \"/\" (even if input url had no path at all, or had a different one).\n authInternal.config.emulator = { url: `${protocol}//${host}${portStr}/` };\n authInternal.settings.appVerificationDisabledForTesting = true;\n authInternal.emulatorConfig = Object.freeze({\n host,\n port,\n protocol: protocol.replace(':', ''),\n options: Object.freeze({ disableWarnings })\n });\n\n emitEmulatorWarning(disableWarnings);\n}\n\nfunction extractProtocol(url: string): string {\n const protocolEnd = url.indexOf(':');\n return protocolEnd < 0 ? '' : url.substr(0, protocolEnd + 1);\n}\n\nfunction extractHostAndPort(url: string): {\n host: string;\n port: number | null;\n} {\n const protocol = extractProtocol(url);\n const authority = /(\\/\\/)?([^?#/]+)/.exec(url.substr(protocol.length)); // Between // and /, ? or #.\n if (!authority) {\n return { host: '', port: null };\n }\n const hostAndPort = authority[2].split('@').pop() || ''; // Strip out \"username:password@\".\n const bracketedIPv6 = /^(\\[[^\\]]+\\])(:|$)/.exec(hostAndPort);\n if (bracketedIPv6) {\n const host = bracketedIPv6[1];\n return { host, port: parsePort(hostAndPort.substr(host.length + 1)) };\n } else {\n const [host, port] = hostAndPort.split(':');\n return { host, port: parsePort(port) };\n }\n}\n\nfunction parsePort(portStr: string): number | null {\n if (!portStr) {\n return null;\n }\n const port = Number(portStr);\n if (isNaN(port)) {\n return null;\n }\n return port;\n}\n\nfunction emitEmulatorWarning(disableBanner: boolean): void {\n function attachBanner(): void {\n const el = document.createElement('p');\n const sty = el.style;\n el.innerText =\n 'Running in emulator mode. Do not use with production credentials.';\n sty.position = 'fixed';\n sty.width = '100%';\n sty.backgroundColor = '#ffffff';\n sty.border = '.1em solid #000000';\n sty.color = '#b50000';\n sty.bottom = '0px';\n sty.left = '0px';\n sty.margin = '0px';\n sty.zIndex = '10000';\n sty.textAlign = 'center';\n el.classList.add('firebase-emulator-warning');\n document.body.appendChild(el);\n }\n\n if (typeof console !== 'undefined' && typeof console.info === 'function') {\n console.info(\n 'WARNING: You are using the Auth Emulator,' +\n ' which is intended for local testing only. Do not use with' +\n ' production credentials.'\n );\n }\n if (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined' &&\n !disableBanner\n ) {\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', attachBanner);\n } else {\n attachBanner();\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PhoneOrOauthTokenResponse } from '../../api/authentication/mfa';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { debugFail } from '../util/assert';\n\n/**\n * Interface that represents the credentials returned by an {@link AuthProvider}.\n *\n * @remarks\n * Implementations specify the details about each auth provider's credential requirements.\n *\n * @public\n */\nexport class AuthCredential {\n /** @internal */\n protected constructor(\n /**\n * The authentication provider ID for the credential.\n *\n * @remarks\n * For example, 'facebook.com', or 'google.com'.\n */\n readonly providerId: string,\n /**\n * The authentication sign in method for the credential.\n *\n * @remarks\n * For example, {@link SignInMethod}.EMAIL_PASSWORD, or\n * {@link SignInMethod}.EMAIL_LINK. This corresponds to the sign-in method\n * identifier as returned in {@link fetchSignInMethodsForEmail}.\n */\n readonly signInMethod: string\n ) {}\n\n /**\n * Returns a JSON-serializable representation of this object.\n *\n * @returns a JSON-serializable representation of this object.\n */\n toJSON(): object {\n return debugFail('not implemented');\n }\n\n /** @internal */\n _getIdTokenResponse(_auth: AuthInternal): Promise<PhoneOrOauthTokenResponse> {\n return debugFail('not implemented');\n }\n /** @internal */\n _linkToIdToken(\n _auth: AuthInternal,\n _idToken: string\n ): Promise<IdTokenResponse> {\n return debugFail('not implemented');\n }\n /** @internal */\n _getReauthenticationResolver(_auth: AuthInternal): Promise<IdTokenResponse> {\n return debugFail('not implemented');\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ActionCodeOperation, Auth } from '../../model/public_types';\n\nimport {\n Endpoint,\n HttpMethod,\n _addTidIfNecessary,\n _performApiRequest\n} from '../index';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { MfaEnrollment } from './mfa';\n\nexport interface ResetPasswordRequest {\n oobCode: string;\n newPassword?: string;\n tenantId?: string;\n}\n\nexport interface ResetPasswordResponse {\n email: string;\n newEmail?: string;\n requestType?: ActionCodeOperation;\n mfaInfo?: MfaEnrollment;\n}\n\nexport async function resetPassword(\n auth: Auth,\n request: ResetPasswordRequest\n): Promise<ResetPasswordResponse> {\n return _performApiRequest<ResetPasswordRequest, ResetPasswordResponse>(\n auth,\n HttpMethod.POST,\n Endpoint.RESET_PASSWORD,\n _addTidIfNecessary(auth, request)\n );\n}\nexport interface UpdateEmailPasswordRequest {\n idToken: string;\n returnSecureToken?: boolean;\n email?: string;\n password?: string;\n}\n\nexport interface UpdateEmailPasswordResponse extends IdTokenResponse {}\n\nexport async function updateEmailPassword(\n auth: Auth,\n request: UpdateEmailPasswordRequest\n): Promise<UpdateEmailPasswordResponse> {\n return _performApiRequest<\n UpdateEmailPasswordRequest,\n UpdateEmailPasswordResponse\n >(auth, HttpMethod.POST, Endpoint.SET_ACCOUNT_INFO, request);\n}\n\nexport interface ApplyActionCodeRequest {\n oobCode: string;\n tenantId?: string;\n}\n\nexport interface ApplyActionCodeResponse {}\n\nexport async function applyActionCode(\n auth: Auth,\n request: ApplyActionCodeRequest\n): Promise<ApplyActionCodeResponse> {\n return _performApiRequest<ApplyActionCodeRequest, ApplyActionCodeResponse>(\n auth,\n HttpMethod.POST,\n Endpoint.SET_ACCOUNT_INFO,\n _addTidIfNecessary(auth, request)\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ActionCodeOperation, Auth } from '../../model/public_types';\n\nimport {\n Endpoint,\n HttpMethod,\n _addTidIfNecessary,\n _performApiRequest,\n _performSignInRequest\n} from '../index';\nimport { IdToken, IdTokenResponse } from '../../model/id_token';\n\nexport interface SignInWithPasswordRequest {\n returnSecureToken?: boolean;\n email: string;\n password: string;\n tenantId?: string;\n}\n\nexport interface SignInWithPasswordResponse extends IdTokenResponse {\n email: string;\n displayName: string;\n}\n\nexport async function signInWithPassword(\n auth: Auth,\n request: SignInWithPasswordRequest\n): Promise<SignInWithPasswordResponse> {\n return _performSignInRequest<\n SignInWithPasswordRequest,\n SignInWithPasswordResponse\n >(\n auth,\n HttpMethod.POST,\n Endpoint.SIGN_IN_WITH_PASSWORD,\n _addTidIfNecessary(auth, request)\n );\n}\n\nexport interface GetOobCodeRequest {\n email?: string; // Everything except VERIFY_AND_CHANGE_EMAIL\n continueUrl?: string;\n iosBundleId?: string;\n iosAppStoreId?: string;\n androidPackageName?: string;\n androidInstallApp?: boolean;\n androidMinimumVersionCode?: string;\n canHandleCodeInApp?: boolean;\n dynamicLinkDomain?: string;\n tenantId?: string;\n targetProjectid?: string;\n}\n\nexport interface VerifyEmailRequest extends GetOobCodeRequest {\n requestType: ActionCodeOperation.VERIFY_EMAIL;\n idToken: IdToken;\n}\n\nexport interface PasswordResetRequest extends GetOobCodeRequest {\n requestType: ActionCodeOperation.PASSWORD_RESET;\n email: string;\n captchaResp?: string;\n}\n\nexport interface EmailSignInRequest extends GetOobCodeRequest {\n requestType: ActionCodeOperation.EMAIL_SIGNIN;\n email: string;\n}\n\nexport interface VerifyAndChangeEmailRequest extends GetOobCodeRequest {\n requestType: ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL;\n idToken: IdToken;\n newEmail: string;\n}\n\ninterface GetOobCodeResponse {\n email: string;\n}\n\nexport interface VerifyEmailResponse extends GetOobCodeResponse {}\nexport interface PasswordResetResponse extends GetOobCodeResponse {}\nexport interface EmailSignInResponse extends GetOobCodeResponse {}\nexport interface VerifyAndChangeEmailResponse extends GetOobCodeRequest {}\n\nasync function sendOobCode(\n auth: Auth,\n request: GetOobCodeRequest\n): Promise<GetOobCodeResponse> {\n return _performApiRequest<GetOobCodeRequest, GetOobCodeResponse>(\n auth,\n HttpMethod.POST,\n Endpoint.SEND_OOB_CODE,\n _addTidIfNecessary(auth, request)\n );\n}\n\nexport async function sendEmailVerification(\n auth: Auth,\n request: VerifyEmailRequest\n): Promise<VerifyEmailResponse> {\n return sendOobCode(auth, request);\n}\n\nexport async function sendPasswordResetEmail(\n auth: Auth,\n request: PasswordResetRequest\n): Promise<PasswordResetResponse> {\n return sendOobCode(auth, request);\n}\n\nexport async function sendSignInLinkToEmail(\n auth: Auth,\n request: EmailSignInRequest\n): Promise<EmailSignInResponse> {\n return sendOobCode(auth, request);\n}\n\nexport async function verifyAndChangeEmail(\n auth: Auth,\n request: VerifyAndChangeEmailRequest\n): Promise<VerifyAndChangeEmailResponse> {\n return sendOobCode(auth, request);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n _performSignInRequest,\n Endpoint,\n HttpMethod,\n _addTidIfNecessary\n} from '../index';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { Auth } from '../../model/public_types';\n\nexport interface SignInWithEmailLinkRequest {\n email: string;\n oobCode: string;\n tenantId?: string;\n}\n\nexport interface SignInWithEmailLinkResponse extends IdTokenResponse {\n email: string;\n isNewUser: boolean;\n}\n\nexport async function signInWithEmailLink(\n auth: Auth,\n request: SignInWithEmailLinkRequest\n): Promise<SignInWithEmailLinkResponse> {\n return _performSignInRequest<\n SignInWithEmailLinkRequest,\n SignInWithEmailLinkResponse\n >(\n auth,\n HttpMethod.POST,\n Endpoint.SIGN_IN_WITH_EMAIL_LINK,\n _addTidIfNecessary(auth, request)\n );\n}\n\nexport interface SignInWithEmailLinkForLinkingRequest\n extends SignInWithEmailLinkRequest {\n idToken: string;\n}\n\nexport async function signInWithEmailLinkForLinking(\n auth: Auth,\n request: SignInWithEmailLinkForLinkingRequest\n): Promise<SignInWithEmailLinkResponse> {\n return _performSignInRequest<\n SignInWithEmailLinkForLinkingRequest,\n SignInWithEmailLinkResponse\n >(\n auth,\n HttpMethod.POST,\n Endpoint.SIGN_IN_WITH_EMAIL_LINK,\n _addTidIfNecessary(auth, request)\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ProviderId, SignInMethod } from '../../model/public_types';\n\nimport { updateEmailPassword } from '../../api/account_management/email_and_password';\nimport { signInWithPassword } from '../../api/authentication/email_and_password';\nimport {\n signInWithEmailLink,\n signInWithEmailLinkForLinking\n} from '../../api/authentication/email_link';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { AuthErrorCode } from '../errors';\nimport { _fail } from '../util/assert';\nimport { AuthCredential } from './auth_credential';\n\n/**\n * Interface that represents the credentials returned by {@link EmailAuthProvider} for\n * {@link ProviderId}.PASSWORD\n *\n * @remarks\n * Covers both {@link SignInMethod}.EMAIL_PASSWORD and\n * {@link SignInMethod}.EMAIL_LINK.\n *\n * @public\n */\nexport class EmailAuthCredential extends AuthCredential {\n /** @internal */\n private constructor(\n /** @internal */\n readonly _email: string,\n /** @internal */\n readonly _password: string,\n signInMethod: SignInMethod,\n /** @internal */\n readonly _tenantId: string | null = null\n ) {\n super(ProviderId.PASSWORD, signInMethod);\n }\n\n /** @internal */\n static _fromEmailAndPassword(\n email: string,\n password: string\n ): EmailAuthCredential {\n return new EmailAuthCredential(\n email,\n password,\n SignInMethod.EMAIL_PASSWORD\n );\n }\n\n /** @internal */\n static _fromEmailAndCode(\n email: string,\n oobCode: string,\n tenantId: string | null = null\n ): EmailAuthCredential {\n return new EmailAuthCredential(\n email,\n oobCode,\n SignInMethod.EMAIL_LINK,\n tenantId\n );\n }\n\n /** {@inheritdoc AuthCredential.toJSON} */\n toJSON(): object {\n return {\n email: this._email,\n password: this._password,\n signInMethod: this.signInMethod,\n tenantId: this._tenantId\n };\n }\n\n /**\n * Static method to deserialize a JSON representation of an object into an {@link AuthCredential}.\n *\n * @param json - Either `object` or the stringified representation of the object. When string is\n * provided, `JSON.parse` would be called first.\n *\n * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned.\n */\n static fromJSON(json: object | string): EmailAuthCredential | null {\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\n if (obj?.email && obj?.password) {\n if (obj.signInMethod === SignInMethod.EMAIL_PASSWORD) {\n return this._fromEmailAndPassword(obj.email, obj.password);\n } else if (obj.signInMethod === SignInMethod.EMAIL_LINK) {\n return this._fromEmailAndCode(obj.email, obj.password, obj.tenantId);\n }\n }\n return null;\n }\n\n /** @internal */\n async _getIdTokenResponse(auth: AuthInternal): Promise<IdTokenResponse> {\n switch (this.signInMethod) {\n case SignInMethod.EMAIL_PASSWORD:\n return signInWithPassword(auth, {\n returnSecureToken: true,\n email: this._email,\n password: this._password\n });\n case SignInMethod.EMAIL_LINK:\n return signInWithEmailLink(auth, {\n email: this._email,\n oobCode: this._password\n });\n default:\n _fail(auth, AuthErrorCode.INTERNAL_ERROR);\n }\n }\n\n /** @internal */\n async _linkToIdToken(\n auth: AuthInternal,\n idToken: string\n ): Promise<IdTokenResponse> {\n switch (this.signInMethod) {\n case SignInMethod.EMAIL_PASSWORD:\n return updateEmailPassword(auth, {\n idToken,\n returnSecureToken: true,\n email: this._email,\n password: this._password\n });\n case SignInMethod.EMAIL_LINK:\n return signInWithEmailLinkForLinking(auth, {\n idToken,\n email: this._email,\n oobCode: this._password\n });\n default:\n _fail(auth, AuthErrorCode.INTERNAL_ERROR);\n }\n }\n\n /** @internal */\n _getReauthenticationResolver(auth: AuthInternal): Promise<IdTokenResponse> {\n return this._getIdTokenResponse(auth);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n HttpMethod,\n _addTidIfNecessary,\n _performSignInRequest\n} from '../index';\nimport { IdToken, IdTokenResponse } from '../../model/id_token';\nimport { Auth } from '../../model/public_types';\n\nexport interface SignInWithIdpRequest {\n requestUri: string;\n postBody?: string;\n sessionId?: string;\n tenantId?: string;\n returnSecureToken: boolean;\n returnIdpCredential?: boolean;\n idToken?: IdToken;\n autoCreate?: boolean;\n pendingToken?: string;\n}\n\nexport interface SignInWithIdpResponse extends IdTokenResponse {\n oauthAccessToken?: string;\n oauthTokenSecret?: string;\n nonce?: string;\n oauthIdToken?: string;\n pendingToken?: string;\n}\n\nexport async function signInWithIdp(\n auth: Auth,\n request: SignInWithIdpRequest\n): Promise<SignInWithIdpResponse> {\n return _performSignInRequest<SignInWithIdpRequest, SignInWithIdpResponse>(\n auth,\n HttpMethod.POST,\n Endpoint.SIGN_IN_WITH_IDP,\n _addTidIfNecessary(auth, request)\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { querystring } from '@firebase/util';\n\nimport {\n signInWithIdp,\n SignInWithIdpRequest\n} from '../../api/authentication/idp';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { AuthErrorCode } from '../errors';\nimport { _fail } from '../util/assert';\nimport { AuthCredential } from './auth_credential';\n\nconst IDP_REQUEST_URI = 'http://localhost';\n\nexport interface OAuthCredentialParams {\n // OAuth 2 uses either id token or access token\n idToken?: string | null;\n accessToken?: string | null;\n\n // These fields are used with OAuth 1\n oauthToken?: string;\n secret?: string;\n oauthTokenSecret?: string;\n\n // Nonce is only set if pendingToken is not present\n nonce?: string;\n pendingToken?: string;\n\n // Utilities\n providerId: string;\n signInMethod: string;\n}\n\n/**\n * Represents the OAuth credentials returned by an {@link OAuthProvider}.\n *\n * @remarks\n * Implementations specify the details about each auth provider's credential requirements.\n *\n * @public\n */\nexport class OAuthCredential extends AuthCredential {\n /**\n * The OAuth ID token associated with the credential if it belongs to an OIDC provider,\n * such as `google.com`.\n * @readonly\n */\n idToken?: string;\n /**\n * The OAuth access token associated with the credential if it belongs to an\n * {@link OAuthProvider}, such as `facebook.com`, `twitter.com`, etc.\n * @readonly\n */\n accessToken?: string;\n /**\n * The OAuth access token secret associated with the credential if it belongs to an OAuth 1.0\n * provider, such as `twitter.com`.\n * @readonly\n */\n secret?: string;\n /** @internal */\n nonce?: string;\n private pendingToken: string | null = null;\n\n /** @internal */\n static _fromParams(params: OAuthCredentialParams): OAuthCredential {\n const cred = new OAuthCredential(params.providerId, params.signInMethod);\n\n if (params.idToken || params.accessToken) {\n // OAuth 2 and either ID token or access token.\n if (params.idToken) {\n cred.idToken = params.idToken;\n }\n\n if (params.accessToken) {\n cred.accessToken = params.accessToken;\n }\n\n // Add nonce if available and no pendingToken is present.\n if (params.nonce && !params.pendingToken) {\n cred.nonce = params.nonce;\n }\n\n if (params.pendingToken) {\n cred.pendingToken = params.pendingToken;\n }\n } else if (params.oauthToken && params.oauthTokenSecret) {\n // OAuth 1 and OAuth token with token secret\n cred.accessToken = params.oauthToken;\n cred.secret = params.oauthTokenSecret;\n } else {\n _fail(AuthErrorCode.ARGUMENT_ERROR);\n }\n\n return cred;\n }\n\n /** {@inheritdoc AuthCredential.toJSON} */\n toJSON(): object {\n return {\n idToken: this.idToken,\n accessToken: this.accessToken,\n secret: this.secret,\n nonce: this.nonce,\n pendingToken: this.pendingToken,\n providerId: this.providerId,\n signInMethod: this.signInMethod\n };\n }\n\n /**\n * Static method to deserialize a JSON representation of an object into an\n * {@link AuthCredential}.\n *\n * @param json - Input can be either Object or the stringified representation of the object.\n * When string is provided, JSON.parse would be called first.\n *\n * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned.\n */\n static fromJSON(json: string | object): OAuthCredential | null {\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\n const { providerId, signInMethod, ...rest }: Partial<OAuthCredential> = obj;\n if (!providerId || !signInMethod) {\n return null;\n }\n\n const cred = new OAuthCredential(providerId, signInMethod);\n Object.assign(cred, rest);\n return cred;\n }\n\n /** @internal */\n _getIdTokenResponse(auth: AuthInternal): Promise<IdTokenResponse> {\n const request = this.buildRequest();\n return signInWithIdp(auth, request);\n }\n\n /** @internal */\n _linkToIdToken(\n auth: AuthInternal,\n idToken: string\n ): Promise<IdTokenResponse> {\n const request = this.buildRequest();\n request.idToken = idToken;\n return signInWithIdp(auth, request);\n }\n\n /** @internal */\n _getReauthenticationResolver(auth: AuthInternal): Promise<IdTokenResponse> {\n const request = this.buildRequest();\n request.autoCreate = false;\n return signInWithIdp(auth, request);\n }\n\n private buildRequest(): SignInWithIdpRequest {\n const request: SignInWithIdpRequest = {\n requestUri: IDP_REQUEST_URI,\n returnSecureToken: true\n };\n\n if (this.pendingToken) {\n request.pendingToken = this.pendingToken;\n } else {\n const postBody: Record<string, string> = {};\n if (this.idToken) {\n postBody['id_token'] = this.idToken;\n }\n if (this.accessToken) {\n postBody['access_token'] = this.accessToken;\n }\n if (this.secret) {\n postBody['oauth_token_secret'] = this.secret;\n }\n\n postBody['providerId'] = this.providerId;\n if (this.nonce && !this.pendingToken) {\n postBody['nonce'] = this.nonce;\n }\n\n request.postBody = querystring(postBody);\n }\n\n return request;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n HttpMethod,\n _addTidIfNecessary,\n _makeTaggedError,\n _performApiRequest,\n _performSignInRequest\n} from '../index';\nimport { AuthErrorCode } from '../../core/errors';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { ServerError, ServerErrorMap } from '../errors';\nimport { Auth } from '../../model/public_types';\n\nexport interface SendPhoneVerificationCodeRequest {\n phoneNumber: string;\n recaptchaToken: string;\n tenantId?: string;\n}\n\nexport interface SendPhoneVerificationCodeResponse {\n sessionInfo: string;\n}\n\nexport async function sendPhoneVerificationCode(\n auth: Auth,\n request: SendPhoneVerificationCodeRequest\n): Promise<SendPhoneVerificationCodeResponse> {\n return _performApiRequest<\n SendPhoneVerificationCodeRequest,\n SendPhoneVerificationCodeResponse\n >(\n auth,\n HttpMethod.POST,\n Endpoint.SEND_VERIFICATION_CODE,\n _addTidIfNecessary(auth, request)\n );\n}\n\nexport interface SignInWithPhoneNumberRequest {\n temporaryProof?: string;\n phoneNumber?: string;\n sessionInfo?: string;\n code?: string;\n tenantId?: string;\n}\n\nexport interface LinkWithPhoneNumberRequest\n extends SignInWithPhoneNumberRequest {\n idToken: string;\n}\n\nexport interface SignInWithPhoneNumberResponse extends IdTokenResponse {\n temporaryProof?: string;\n phoneNumber?: string;\n}\n\nexport async function signInWithPhoneNumber(\n auth: Auth,\n request: SignInWithPhoneNumberRequest\n): Promise<SignInWithPhoneNumberResponse> {\n return _performSignInRequest<\n SignInWithPhoneNumberRequest,\n SignInWithPhoneNumberResponse\n >(\n auth,\n HttpMethod.POST,\n Endpoint.SIGN_IN_WITH_PHONE_NUMBER,\n _addTidIfNecessary(auth, request)\n );\n}\n\nexport async function linkWithPhoneNumber(\n auth: Auth,\n request: LinkWithPhoneNumberRequest\n): Promise<SignInWithPhoneNumberResponse> {\n const response = await _performSignInRequest<\n LinkWithPhoneNumberRequest,\n SignInWithPhoneNumberResponse\n >(\n auth,\n HttpMethod.POST,\n Endpoint.SIGN_IN_WITH_PHONE_NUMBER,\n _addTidIfNecessary(auth, request)\n );\n if (response.temporaryProof) {\n throw _makeTaggedError(auth, AuthErrorCode.NEED_CONFIRMATION, response);\n }\n return response;\n}\n\ninterface VerifyPhoneNumberForExistingRequest\n extends SignInWithPhoneNumberRequest {\n operation: 'REAUTH';\n}\n\nconst VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_: Partial<\n ServerErrorMap<ServerError>\n> = {\n [ServerError.USER_NOT_FOUND]: AuthErrorCode.USER_DELETED\n};\n\nexport async function verifyPhoneNumberForExisting(\n auth: Auth,\n request: SignInWithPhoneNumberRequest\n): Promise<SignInWithPhoneNumberResponse> {\n const apiRequest: VerifyPhoneNumberForExistingRequest = {\n ...request,\n operation: 'REAUTH'\n };\n return _performSignInRequest<\n VerifyPhoneNumberForExistingRequest,\n SignInWithPhoneNumberResponse\n >(\n auth,\n HttpMethod.POST,\n Endpoint.SIGN_IN_WITH_PHONE_NUMBER,\n _addTidIfNecessary(auth, apiRequest),\n VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ProviderId, SignInMethod } from '../../model/public_types';\n\nimport { PhoneOrOauthTokenResponse } from '../../api/authentication/mfa';\nimport {\n linkWithPhoneNumber,\n signInWithPhoneNumber,\n SignInWithPhoneNumberRequest,\n verifyPhoneNumberForExisting\n} from '../../api/authentication/sms';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { AuthCredential } from './auth_credential';\n\nexport interface PhoneAuthCredentialParameters {\n verificationId?: string;\n verificationCode?: string;\n phoneNumber?: string;\n temporaryProof?: string;\n}\n\n/**\n * Represents the credentials returned by {@link PhoneAuthProvider}.\n *\n * @public\n */\nexport class PhoneAuthCredential extends AuthCredential {\n private constructor(private readonly params: PhoneAuthCredentialParameters) {\n super(ProviderId.PHONE, SignInMethod.PHONE);\n }\n\n /** @internal */\n static _fromVerification(\n verificationId: string,\n verificationCode: string\n ): PhoneAuthCredential {\n return new PhoneAuthCredential({ verificationId, verificationCode });\n }\n\n /** @internal */\n static _fromTokenResponse(\n phoneNumber: string,\n temporaryProof: string\n ): PhoneAuthCredential {\n return new PhoneAuthCredential({ phoneNumber, temporaryProof });\n }\n\n /** @internal */\n _getIdTokenResponse(auth: AuthInternal): Promise<PhoneOrOauthTokenResponse> {\n return signInWithPhoneNumber(auth, this._makeVerificationRequest());\n }\n\n /** @internal */\n _linkToIdToken(\n auth: AuthInternal,\n idToken: string\n ): Promise<IdTokenResponse> {\n return linkWithPhoneNumber(auth, {\n idToken,\n ...this._makeVerificationRequest()\n });\n }\n\n /** @internal */\n _getReauthenticationResolver(auth: AuthInternal): Promise<IdTokenResponse> {\n return verifyPhoneNumberForExisting(auth, this._makeVerificationRequest());\n }\n\n /** @internal */\n _makeVerificationRequest(): SignInWithPhoneNumberRequest {\n const {\n temporaryProof,\n phoneNumber,\n verificationId,\n verificationCode\n } = this.params;\n if (temporaryProof && phoneNumber) {\n return { temporaryProof, phoneNumber };\n }\n\n return {\n sessionInfo: verificationId,\n code: verificationCode\n };\n }\n\n /** {@inheritdoc AuthCredential.toJSON} */\n toJSON(): object {\n const obj: Record<string, string> = {\n providerId: this.providerId\n };\n if (this.params.phoneNumber) {\n obj.phoneNumber = this.params.phoneNumber;\n }\n if (this.params.temporaryProof) {\n obj.temporaryProof = this.params.temporaryProof;\n }\n if (this.params.verificationCode) {\n obj.verificationCode = this.params.verificationCode;\n }\n if (this.params.verificationId) {\n obj.verificationId = this.params.verificationId;\n }\n\n return obj;\n }\n\n /** Generates a phone credential based on a plain object or a JSON string. */\n static fromJSON(json: object | string): PhoneAuthCredential | null {\n if (typeof json === 'string') {\n json = JSON.parse(json);\n }\n\n const {\n verificationId,\n verificationCode,\n phoneNumber,\n temporaryProof\n } = json as { [key: string]: string };\n if (\n !verificationCode &&\n !verificationId &&\n !phoneNumber &&\n !temporaryProof\n ) {\n return null;\n }\n\n return new PhoneAuthCredential({\n verificationId,\n verificationCode,\n phoneNumber,\n temporaryProof\n });\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { extractQuerystring, querystringDecode } from '@firebase/util';\nimport { ActionCodeOperation } from '../model/public_types';\nimport { AuthErrorCode } from './errors';\nimport { _assert } from './util/assert';\n\n/**\n * Enums for fields in URL query string.\n *\n * @enum {string}\n */\nconst enum QueryField {\n API_KEY = 'apiKey',\n CODE = 'oobCode',\n CONTINUE_URL = 'continueUrl',\n LANGUAGE_CODE = 'languageCode',\n MODE = 'mode',\n TENANT_ID = 'tenantId'\n}\n\n/**\n * Maps the mode string in action code URL to Action Code Info operation.\n *\n * @param mode\n */\nfunction parseMode(mode: string | null): ActionCodeOperation | null {\n switch (mode) {\n case 'recoverEmail':\n return ActionCodeOperation.RECOVER_EMAIL;\n case 'resetPassword':\n return ActionCodeOperation.PASSWORD_RESET;\n case 'signIn':\n return ActionCodeOperation.EMAIL_SIGNIN;\n case 'verifyEmail':\n return ActionCodeOperation.VERIFY_EMAIL;\n case 'verifyAndChangeEmail':\n return ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL;\n case 'revertSecondFactorAddition':\n return ActionCodeOperation.REVERT_SECOND_FACTOR_ADDITION;\n default:\n return null;\n }\n}\n\n/**\n * Helper to parse FDL links\n *\n * @param url\n */\nfunction parseDeepLink(url: string): string {\n const link = querystringDecode(extractQuerystring(url))['link'];\n\n // Double link case (automatic redirect).\n const doubleDeepLink = link\n ? querystringDecode(extractQuerystring(link))['deep_link_id']\n : null;\n // iOS custom scheme links.\n const iOSDeepLink = querystringDecode(extractQuerystring(url))[\n 'deep_link_id'\n ];\n const iOSDoubleDeepLink = iOSDeepLink\n ? querystringDecode(extractQuerystring(iOSDeepLink))['link']\n : null;\n return iOSDoubleDeepLink || iOSDeepLink || doubleDeepLink || link || url;\n}\n\n/**\n * A utility class to parse email action URLs such as password reset, email verification,\n * email link sign in, etc.\n *\n * @public\n */\nexport class ActionCodeURL {\n /**\n * The API key of the email action link.\n */\n readonly apiKey: string;\n /**\n * The action code of the email action link.\n */\n readonly code: string;\n /**\n * The continue URL of the email action link. Null if not provided.\n */\n readonly continueUrl: string | null;\n /**\n * The language code of the email action link. Null if not provided.\n */\n readonly languageCode: string | null;\n /**\n * The action performed by the email action link. It returns from one of the types from\n * {@link ActionCodeInfo}\n */\n readonly operation: string;\n /**\n * The tenant ID of the email action link. Null if the email action is from the parent project.\n */\n readonly tenantId: string | null;\n\n /**\n * @param actionLink - The link from which to extract the URL.\n * @returns The ActionCodeURL object, or null if the link is invalid.\n *\n * @internal\n */\n constructor(actionLink: string) {\n const searchParams = querystringDecode(extractQuerystring(actionLink));\n const apiKey = searchParams[QueryField.API_KEY] ?? null;\n const code = searchParams[QueryField.CODE] ?? null;\n const operation = parseMode(searchParams[QueryField.MODE] ?? null);\n // Validate API key, code and mode.\n _assert(apiKey && code && operation, AuthErrorCode.ARGUMENT_ERROR);\n this.apiKey = apiKey;\n this.operation = operation;\n this.code = code;\n this.continueUrl = searchParams[QueryField.CONTINUE_URL] ?? null;\n this.languageCode = searchParams[QueryField.LANGUAGE_CODE] ?? null;\n this.tenantId = searchParams[QueryField.TENANT_ID] ?? null;\n }\n\n /**\n * Parses the email action link string and returns an {@link ActionCodeURL} if the link is valid,\n * otherwise returns null.\n *\n * @param link - The email action link string.\n * @returns The ActionCodeURL object, or null if the link is invalid.\n *\n * @public\n */\n static parseLink(link: string): ActionCodeURL | null {\n const actionLink = parseDeepLink(link);\n try {\n return new ActionCodeURL(actionLink);\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Parses the email action link string and returns an {@link ActionCodeURL} if\n * the link is valid, otherwise returns null.\n *\n * @public\n */\nexport function parseActionCodeURL(link: string): ActionCodeURL | null {\n return ActionCodeURL.parseLink(link);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ProviderId,\n SignInMethod,\n AuthProvider\n} from '../../model/public_types';\n\nimport { ActionCodeURL } from '../action_code_url';\nimport { EmailAuthCredential } from '../credentials/email';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\n\n/**\n * Provider for generating {@link EmailAuthCredential}.\n *\n * @public\n */\nexport class EmailAuthProvider implements AuthProvider {\n /**\n * Always set to {@link ProviderId}.PASSWORD, even for email link.\n */\n static readonly PROVIDER_ID: 'password' = ProviderId.PASSWORD;\n /**\n * Always set to {@link SignInMethod}.EMAIL_PASSWORD.\n */\n static readonly EMAIL_PASSWORD_SIGN_IN_METHOD: 'password' =\n SignInMethod.EMAIL_PASSWORD;\n /**\n * Always set to {@link SignInMethod}.EMAIL_LINK.\n */\n static readonly EMAIL_LINK_SIGN_IN_METHOD: 'emailLink' =\n SignInMethod.EMAIL_LINK;\n /**\n * Always set to {@link ProviderId}.PASSWORD, even for email link.\n */\n readonly providerId = EmailAuthProvider.PROVIDER_ID;\n\n /**\n * Initialize an {@link AuthCredential} using an email and password.\n *\n * @example\n * ```javascript\n * const authCredential = EmailAuthProvider.credential(email, password);\n * const userCredential = await signInWithCredential(auth, authCredential);\n * ```\n *\n * @example\n * ```javascript\n * const userCredential = await signInWithEmailAndPassword(auth, email, password);\n * ```\n *\n * @param email - Email address.\n * @param password - User account password.\n * @returns The auth provider credential.\n */\n static credential(email: string, password: string): EmailAuthCredential {\n return EmailAuthCredential._fromEmailAndPassword(email, password);\n }\n\n /**\n * Initialize an {@link AuthCredential} using an email and an email link after a sign in with\n * email link operation.\n *\n * @example\n * ```javascript\n * const authCredential = EmailAuthProvider.credentialWithLink(auth, email, emailLink);\n * const userCredential = await signInWithCredential(auth, authCredential);\n * ```\n *\n * @example\n * ```javascript\n * await sendSignInLinkToEmail(auth, email);\n * // Obtain emailLink from user.\n * const userCredential = await signInWithEmailLink(auth, email, emailLink);\n * ```\n *\n * @param auth - The Auth instance used to verify the link.\n * @param email - Email address.\n * @param emailLink - Sign-in email link.\n * @returns - The auth provider credential.\n */\n static credentialWithLink(\n email: string,\n emailLink: string\n ): EmailAuthCredential {\n const actionCodeUrl = ActionCodeURL.parseLink(emailLink);\n _assert(actionCodeUrl, AuthErrorCode.ARGUMENT_ERROR);\n\n return EmailAuthCredential._fromEmailAndCode(\n email,\n actionCodeUrl.code,\n actionCodeUrl.tenantId\n );\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthProvider } from '../../model/public_types';\n\n/**\n * Map of OAuth Custom Parameters.\n *\n * @public\n */\nexport type CustomParameters = Record<string, string>;\n\n/**\n * The base class for all Federated providers (OAuth (including OIDC), SAML).\n *\n * This class is not meant to be instantiated directly.\n *\n * @public\n */\nexport abstract class FederatedAuthProvider implements AuthProvider {\n /** @internal */\n defaultLanguageCode: string | null = null;\n /** @internal */\n private customParameters: CustomParameters = {};\n\n /**\n * Constructor for generic OAuth providers.\n *\n * @param providerId - Provider for which credentials should be generated.\n */\n constructor(readonly providerId: string) {}\n\n /**\n * Set the language gode.\n *\n * @param languageCode - language code\n */\n setDefaultLanguage(languageCode: string | null): void {\n this.defaultLanguageCode = languageCode;\n }\n\n /**\n * Sets the OAuth custom parameters to pass in an OAuth request for popup and redirect sign-in\n * operations.\n *\n * @remarks\n * For a detailed list, check the reserved required OAuth 2.0 parameters such as `client_id`,\n * `redirect_uri`, `scope`, `response_type`, and `state` are not allowed and will be ignored.\n *\n * @param customOAuthParameters - The custom OAuth parameters to pass in the OAuth request.\n */\n setCustomParameters(customOAuthParameters: CustomParameters): AuthProvider {\n this.customParameters = customOAuthParameters;\n return this;\n }\n\n /**\n * Retrieve the current list of {@link CustomParameters}.\n */\n getCustomParameters(): CustomParameters {\n return this.customParameters;\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthProvider, UserCredential } from '../../model/public_types';\n\nimport { _assert } from '../util/assert';\nimport { AuthErrorCode } from '../errors';\n\nimport { OAuthCredential, OAuthCredentialParams } from '../credentials/oauth';\nimport { UserCredentialInternal } from '../../model/user';\nimport { FirebaseError } from '@firebase/util';\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { SignInWithIdpResponse } from '../../../internal';\nimport { FederatedAuthProvider } from './federated';\n\n/**\n * Defines the options for initializing an {@link OAuthCredential}.\n *\n * @remarks\n * For ID tokens with nonce claim, the raw nonce has to also be provided.\n *\n * @public\n */\nexport interface OAuthCredentialOptions {\n /**\n * The OAuth ID token used to initialize the {@link OAuthCredential}.\n */\n idToken?: string;\n /**\n * The OAuth access token used to initialize the {@link OAuthCredential}.\n */\n accessToken?: string;\n /**\n * The raw nonce associated with the ID token.\n *\n * @remarks\n * It is required when an ID token with a nonce field is provided. The SHA-256 hash of the\n * raw nonce must match the nonce field in the ID token.\n */\n rawNonce?: string;\n}\n\n/**\n * Common code to all OAuth providers. This is separate from the\n * {@link OAuthProvider} so that child providers (like\n * {@link GoogleAuthProvider}) don't inherit the `credential` instance method.\n * Instead, they rely on a static `credential` method.\n */\nexport abstract class BaseOAuthProvider\n extends FederatedAuthProvider\n implements AuthProvider {\n /** @internal */\n private scopes: string[] = [];\n\n /**\n * Add an OAuth scope to the credential.\n *\n * @param scope - Provider OAuth scope to add.\n */\n addScope(scope: string): AuthProvider {\n // If not already added, add scope to list.\n if (!this.scopes.includes(scope)) {\n this.scopes.push(scope);\n }\n return this;\n }\n\n /**\n * Retrieve the current list of OAuth scopes.\n */\n getScopes(): string[] {\n return [...this.scopes];\n }\n}\n\n/**\n * Provider for generating generic {@link OAuthCredential}.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new OAuthProvider('google.com');\n * // Start a sign in process for an unauthenticated user.\n * provider.addScope('profile');\n * provider.addScope('email');\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n * // This is the signed-in user\n * const user = result.user;\n * // This gives you a OAuth Access Token for the provider.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * }\n * ```\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new OAuthProvider('google.com');\n * provider.addScope('profile');\n * provider.addScope('email');\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a OAuth Access Token for the provider.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * ```\n * @public\n */\nexport class OAuthProvider extends BaseOAuthProvider {\n /**\n * Creates an {@link OAuthCredential} from a JSON string or a plain object.\n * @param json A plain object or a JSON string\n */\n static credentialFromJSON(json: object | string): OAuthCredential {\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\n _assert(\n 'providerId' in obj && 'signInMethod' in obj,\n AuthErrorCode.ARGUMENT_ERROR\n );\n return OAuthCredential._fromParams(obj);\n }\n\n /**\n * Creates a {@link OAuthCredential} from a generic OAuth provider's access token or ID token.\n *\n * @remarks\n * The raw nonce is required when an ID token with a nonce field is provided. The SHA-256 hash of\n * the raw nonce must match the nonce field in the ID token.\n *\n * @example\n * ```javascript\n * // `googleUser` from the onsuccess Google Sign In callback.\n * // Initialize a generate OAuth provider with a `google.com` providerId.\n * const provider = new OAuthProvider('google.com');\n * const credential = provider.credential({\n * idToken: googleUser.getAuthResponse().id_token,\n * });\n * const result = await signInWithCredential(credential);\n * ```\n *\n * @param params - Either the options object containing the ID token, access token and raw nonce\n * or the ID token string.\n */\n credential(params: OAuthCredentialOptions): OAuthCredential {\n return this._credential(params);\n }\n\n /** An internal credential method that accepts more permissive options */\n private _credential(\n params: OAuthCredentialOptions | OAuthCredentialParams\n ): OAuthCredential {\n _assert(params.idToken || params.accessToken, AuthErrorCode.ARGUMENT_ERROR);\n // For OAuthCredential, sign in method is same as providerId.\n return OAuthCredential._fromParams({\n ...params,\n providerId: this.providerId,\n signInMethod: this.providerId\n });\n }\n\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromResult(\n userCredential: UserCredential\n ): OAuthCredential | null {\n return OAuthProvider.oauthCredentialFromTaggedObject(\n userCredential as UserCredentialInternal\n );\n }\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n * thrown during a sign-in, link, or reauthenticate operation.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromError(error: FirebaseError): OAuthCredential | null {\n return OAuthProvider.oauthCredentialFromTaggedObject(\n (error.customData || {}) as TaggedWithTokenResponse\n );\n }\n\n private static oauthCredentialFromTaggedObject({\n _tokenResponse: tokenResponse\n }: TaggedWithTokenResponse): OAuthCredential | null {\n if (!tokenResponse) {\n return null;\n }\n\n const {\n oauthIdToken,\n oauthAccessToken,\n oauthTokenSecret,\n pendingToken,\n nonce,\n providerId\n } = tokenResponse as SignInWithIdpResponse;\n if (\n !oauthAccessToken &&\n !oauthTokenSecret &&\n !oauthIdToken &&\n !pendingToken\n ) {\n return null;\n }\n\n if (!providerId) {\n return null;\n }\n\n try {\n return new OAuthProvider(providerId)._credential({\n idToken: oauthIdToken,\n accessToken: oauthAccessToken,\n rawNonce: nonce,\n pendingToken\n });\n } catch (e) {\n return null;\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ProviderId,\n SignInMethod,\n UserCredential\n} from '../../model/public_types';\nimport { FirebaseError } from '@firebase/util';\n\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { UserCredentialInternal } from '../../model/user';\nimport { OAuthCredential } from '../credentials/oauth';\nimport { BaseOAuthProvider } from './oauth';\n\n/**\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.FACEBOOK.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new FacebookAuthProvider();\n * // Start a sign in process for an unauthenticated user.\n * provider.addScope('user_birthday');\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n * // This is the signed-in user\n * const user = result.user;\n * // This gives you a Facebook Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * }\n * ```\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new FacebookAuthProvider();\n * provider.addScope('user_birthday');\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a Facebook Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * ```\n *\n * @public\n */\nexport class FacebookAuthProvider extends BaseOAuthProvider {\n /** Always set to {@link SignInMethod}.FACEBOOK. */\n static readonly FACEBOOK_SIGN_IN_METHOD: 'facebook.com' =\n SignInMethod.FACEBOOK;\n /** Always set to {@link ProviderId}.FACEBOOK. */\n static readonly PROVIDER_ID: 'facebook.com' = ProviderId.FACEBOOK;\n\n constructor() {\n super(ProviderId.FACEBOOK);\n }\n\n /**\n * Creates a credential for Facebook.\n *\n * @example\n * ```javascript\n * // `event` from the Facebook auth.authResponseChange callback.\n * const credential = FacebookAuthProvider.credential(event.authResponse.accessToken);\n * const result = await signInWithCredential(credential);\n * ```\n *\n * @param accessToken - Facebook access token.\n */\n static credential(accessToken: string): OAuthCredential {\n return OAuthCredential._fromParams({\n providerId: FacebookAuthProvider.PROVIDER_ID,\n signInMethod: FacebookAuthProvider.FACEBOOK_SIGN_IN_METHOD,\n accessToken\n });\n }\n\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromResult(\n userCredential: UserCredential\n ): OAuthCredential | null {\n return FacebookAuthProvider.credentialFromTaggedObject(\n userCredential as UserCredentialInternal\n );\n }\n\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n * thrown during a sign-in, link, or reauthenticate operation.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromError(error: FirebaseError): OAuthCredential | null {\n return FacebookAuthProvider.credentialFromTaggedObject(\n (error.customData || {}) as TaggedWithTokenResponse\n );\n }\n\n private static credentialFromTaggedObject({\n _tokenResponse: tokenResponse\n }: TaggedWithTokenResponse): OAuthCredential | null {\n if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) {\n return null;\n }\n\n if (!tokenResponse.oauthAccessToken) {\n return null;\n }\n\n try {\n return FacebookAuthProvider.credential(tokenResponse.oauthAccessToken);\n } catch {\n return null;\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ProviderId,\n SignInMethod,\n UserCredential\n} from '../../model/public_types';\nimport { FirebaseError } from '@firebase/util';\n\nimport { SignInWithIdpResponse } from '../../api/authentication/idp';\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { UserCredentialInternal } from '../../model/user';\nimport { OAuthCredential } from '../credentials/oauth';\nimport { BaseOAuthProvider } from './oauth';\n\n/**\n * Provider for generating an an {@link OAuthCredential} for {@link ProviderId}.GOOGLE.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new GoogleAuthProvider();\n * // Start a sign in process for an unauthenticated user.\n * provider.addScope('profile');\n * provider.addScope('email');\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n * // This is the signed-in user\n * const user = result.user;\n * // This gives you a Google Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * }\n * ```\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new GoogleAuthProvider();\n * provider.addScope('profile');\n * provider.addScope('email');\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a Google Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * ```\n *\n * @public\n */\nexport class GoogleAuthProvider extends BaseOAuthProvider {\n /** Always set to {@link SignInMethod}.GOOGLE. */\n static readonly GOOGLE_SIGN_IN_METHOD: 'google.com' = SignInMethod.GOOGLE;\n /** Always set to {@link ProviderId}.GOOGLE. */\n static readonly PROVIDER_ID: 'google.com' = ProviderId.GOOGLE;\n\n constructor() {\n super(ProviderId.GOOGLE);\n this.addScope('profile');\n }\n\n /**\n * Creates a credential for Google. At least one of ID token and access token is required.\n *\n * @example\n * ```javascript\n * // \\`googleUser\\` from the onsuccess Google Sign In callback.\n * const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token);\n * const result = await signInWithCredential(credential);\n * ```\n *\n * @param idToken - Google ID token.\n * @param accessToken - Google access token.\n */\n static credential(\n idToken?: string | null,\n accessToken?: string | null\n ): OAuthCredential {\n return OAuthCredential._fromParams({\n providerId: GoogleAuthProvider.PROVIDER_ID,\n signInMethod: GoogleAuthProvider.GOOGLE_SIGN_IN_METHOD,\n idToken,\n accessToken\n });\n }\n\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromResult(\n userCredential: UserCredential\n ): OAuthCredential | null {\n return GoogleAuthProvider.credentialFromTaggedObject(\n userCredential as UserCredentialInternal\n );\n }\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n * thrown during a sign-in, link, or reauthenticate operation.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromError(error: FirebaseError): OAuthCredential | null {\n return GoogleAuthProvider.credentialFromTaggedObject(\n (error.customData || {}) as TaggedWithTokenResponse\n );\n }\n\n private static credentialFromTaggedObject({\n _tokenResponse: tokenResponse\n }: TaggedWithTokenResponse): OAuthCredential | null {\n if (!tokenResponse) {\n return null;\n }\n\n const { oauthIdToken, oauthAccessToken } =\n tokenResponse as SignInWithIdpResponse;\n if (!oauthIdToken && !oauthAccessToken) {\n // This could be an oauth 1 credential or a phone credential\n return null;\n }\n\n try {\n return GoogleAuthProvider.credential(oauthIdToken, oauthAccessToken);\n } catch {\n return null;\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ProviderId,\n SignInMethod,\n UserCredential\n} from '../../model/public_types';\nimport { FirebaseError } from '@firebase/util';\n\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { UserCredentialInternal } from '../../model/user';\nimport { OAuthCredential } from '../credentials/oauth';\nimport { BaseOAuthProvider } from './oauth';\n\n/**\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.GITHUB.\n *\n * @remarks\n * GitHub requires an OAuth 2.0 redirect, so you can either handle the redirect directly, or use\n * the {@link signInWithPopup} handler:\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new GithubAuthProvider();\n * // Start a sign in process for an unauthenticated user.\n * provider.addScope('repo');\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n * // This is the signed-in user\n * const user = result.user;\n * // This gives you a Github Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * }\n * ```\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new GithubAuthProvider();\n * provider.addScope('repo');\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a Github Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * ```\n * @public\n */\nexport class GithubAuthProvider extends BaseOAuthProvider {\n /** Always set to {@link SignInMethod}.GITHUB. */\n static readonly GITHUB_SIGN_IN_METHOD: 'github.com' = SignInMethod.GITHUB;\n /** Always set to {@link ProviderId}.GITHUB. */\n static readonly PROVIDER_ID: 'github.com' = ProviderId.GITHUB;\n\n constructor() {\n super(ProviderId.GITHUB);\n }\n\n /**\n * Creates a credential for Github.\n *\n * @param accessToken - Github access token.\n */\n static credential(accessToken: string): OAuthCredential {\n return OAuthCredential._fromParams({\n providerId: GithubAuthProvider.PROVIDER_ID,\n signInMethod: GithubAuthProvider.GITHUB_SIGN_IN_METHOD,\n accessToken\n });\n }\n\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromResult(\n userCredential: UserCredential\n ): OAuthCredential | null {\n return GithubAuthProvider.credentialFromTaggedObject(\n userCredential as UserCredentialInternal\n );\n }\n\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n * thrown during a sign-in, link, or reauthenticate operation.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromError(error: FirebaseError): OAuthCredential | null {\n return GithubAuthProvider.credentialFromTaggedObject(\n (error.customData || {}) as TaggedWithTokenResponse\n );\n }\n\n private static credentialFromTaggedObject({\n _tokenResponse: tokenResponse\n }: TaggedWithTokenResponse): OAuthCredential | null {\n if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) {\n return null;\n }\n\n if (!tokenResponse.oauthAccessToken) {\n return null;\n }\n\n try {\n return GithubAuthProvider.credential(tokenResponse.oauthAccessToken);\n } catch {\n return null;\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Represents the SAML credentials returned by an {@link SAMLAuthProvider}.\n *\n * @public\n */\n\nimport {\n signInWithIdp,\n SignInWithIdpRequest\n} from '../../api/authentication/idp';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { AuthCredential } from './auth_credential';\n\nconst IDP_REQUEST_URI = 'http://localhost';\n\n/**\n * @public\n */\nexport class SAMLAuthCredential extends AuthCredential {\n /** @internal */\n private constructor(\n providerId: string,\n private readonly pendingToken: string\n ) {\n super(providerId, providerId);\n }\n\n /** @internal */\n _getIdTokenResponse(auth: AuthInternal): Promise<IdTokenResponse> {\n const request = this.buildRequest();\n return signInWithIdp(auth, request);\n }\n\n /** @internal */\n _linkToIdToken(\n auth: AuthInternal,\n idToken: string\n ): Promise<IdTokenResponse> {\n const request = this.buildRequest();\n request.idToken = idToken;\n return signInWithIdp(auth, request);\n }\n\n /** @internal */\n _getReauthenticationResolver(auth: AuthInternal): Promise<IdTokenResponse> {\n const request = this.buildRequest();\n request.autoCreate = false;\n return signInWithIdp(auth, request);\n }\n\n /** {@inheritdoc AuthCredential.toJSON} */\n toJSON(): object {\n return {\n signInMethod: this.signInMethod,\n providerId: this.providerId,\n pendingToken: this.pendingToken\n };\n }\n\n /**\n * Static method to deserialize a JSON representation of an object into an\n * {@link AuthCredential}.\n *\n * @param json - Input can be either Object or the stringified representation of the object.\n * When string is provided, JSON.parse would be called first.\n *\n * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned.\n */\n static fromJSON(json: string | object): SAMLAuthCredential | null {\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\n const {\n providerId,\n signInMethod,\n pendingToken\n }: Record<string, string> = obj;\n if (\n !providerId ||\n !signInMethod ||\n !pendingToken ||\n providerId !== signInMethod\n ) {\n return null;\n }\n\n return new SAMLAuthCredential(providerId, pendingToken);\n }\n\n /**\n * Helper static method to avoid exposing the constructor to end users.\n *\n * @internal\n */\n static _create(providerId: string, pendingToken: string): SAMLAuthCredential {\n return new SAMLAuthCredential(providerId, pendingToken);\n }\n\n private buildRequest(): SignInWithIdpRequest {\n return {\n requestUri: IDP_REQUEST_URI,\n returnSecureToken: true,\n pendingToken: this.pendingToken\n };\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\nimport { SignInWithIdpResponse } from '../../api/authentication/idp';\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { UserCredential } from '../../model/public_types';\nimport { UserCredentialInternal } from '../../model/user';\nimport { AuthCredential } from '../credentials';\nimport { SAMLAuthCredential } from '../credentials/saml';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { FederatedAuthProvider } from './federated';\n\nconst SAML_PROVIDER_PREFIX = 'saml.';\n\n/**\n * An AuthProvider for SAML.\n *\n * @public\n */\nexport class SAMLAuthProvider extends FederatedAuthProvider {\n /**\n * Constructor. The providerId must start with \"saml.\"\n * @param - providerId\n */\n constructor(providerId: string) {\n _assert(\n providerId.startsWith(SAML_PROVIDER_PREFIX),\n AuthErrorCode.ARGUMENT_ERROR\n );\n super(providerId);\n }\n\n /**\n * Generates an {@link AuthCredential} from a {@link UserCredential} after a\n * successful SAML flow completes.\n *\n * @remarks\n *\n * For example, to get an {@link AuthCredential}, you could write the\n * following code:\n *\n * ```js\n * const userCredential = await signInWithPopup(auth, samlProvider);\n * const credential = SAMLAuthProvider.credentialFromResult(userCredential);\n * ```\n *\n * @param userCredential\n */\n static credentialFromResult(\n userCredential: UserCredential\n ): AuthCredential | null {\n return SAMLAuthProvider.samlCredentialFromTaggedObject(\n userCredential as UserCredentialInternal\n );\n }\n\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n * thrown during a sign-in, link, or reauthenticate operation.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromError(error: FirebaseError): AuthCredential | null {\n return SAMLAuthProvider.samlCredentialFromTaggedObject(\n (error.customData || {}) as TaggedWithTokenResponse\n );\n }\n\n /**\n * Creates an {@link AuthCredential} from a JSON string or a plain object.\n * @param json A plain object or a JSON string\n */\n static credentialFromJSON(json: string | object): AuthCredential {\n const credential = SAMLAuthCredential.fromJSON(json);\n _assert(credential, AuthErrorCode.ARGUMENT_ERROR);\n return credential;\n }\n\n private static samlCredentialFromTaggedObject({\n _tokenResponse: tokenResponse\n }: TaggedWithTokenResponse): SAMLAuthCredential | null {\n if (!tokenResponse) {\n return null;\n }\n\n const { pendingToken, providerId } = tokenResponse as SignInWithIdpResponse;\n\n if (!pendingToken || !providerId) {\n return null;\n }\n\n try {\n return SAMLAuthCredential._create(providerId, pendingToken);\n } catch (e) {\n return null;\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @license\n * Copyright 2020 Twitter LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ProviderId,\n SignInMethod,\n UserCredential\n} from '../../model/public_types';\nimport { FirebaseError } from '@firebase/util';\n\nimport { SignInWithIdpResponse } from '../../api/authentication/idp';\nimport { TaggedWithTokenResponse } from '../../model/id_token';\nimport { UserCredentialInternal } from '../../model/user';\nimport { OAuthCredential } from '../credentials/oauth';\nimport { BaseOAuthProvider } from './oauth';\n\n/**\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.TWITTER.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new TwitterAuthProvider();\n * // Start a sign in process for an unauthenticated user.\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n * // This is the signed-in user\n * const user = result.user;\n * // This gives you a Twitter Access Token and Secret.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * const secret = credential.secret;\n * }\n * ```\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new TwitterAuthProvider();\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a Twitter Access Token and Secret.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * const secret = credential.secret;\n * ```\n *\n * @public\n */\nexport class TwitterAuthProvider extends BaseOAuthProvider {\n /** Always set to {@link SignInMethod}.TWITTER. */\n static readonly TWITTER_SIGN_IN_METHOD: 'twitter.com' = SignInMethod.TWITTER;\n /** Always set to {@link ProviderId}.TWITTER. */\n static readonly PROVIDER_ID: 'twitter.com' = ProviderId.TWITTER;\n\n constructor() {\n super(ProviderId.TWITTER);\n }\n\n /**\n * Creates a credential for Twitter.\n *\n * @param token - Twitter access token.\n * @param secret - Twitter secret.\n */\n static credential(token: string, secret: string): OAuthCredential {\n return OAuthCredential._fromParams({\n providerId: TwitterAuthProvider.PROVIDER_ID,\n signInMethod: TwitterAuthProvider.TWITTER_SIGN_IN_METHOD,\n oauthToken: token,\n oauthTokenSecret: secret\n });\n }\n\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromResult(\n userCredential: UserCredential\n ): OAuthCredential | null {\n return TwitterAuthProvider.credentialFromTaggedObject(\n userCredential as UserCredentialInternal\n );\n }\n\n /**\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\n * thrown during a sign-in, link, or reauthenticate operation.\n *\n * @param userCredential - The user credential.\n */\n static credentialFromError(error: FirebaseError): OAuthCredential | null {\n return TwitterAuthProvider.credentialFromTaggedObject(\n (error.customData || {}) as TaggedWithTokenResponse\n );\n }\n\n private static credentialFromTaggedObject({\n _tokenResponse: tokenResponse\n }: TaggedWithTokenResponse): OAuthCredential | null {\n if (!tokenResponse) {\n return null;\n }\n const { oauthAccessToken, oauthTokenSecret } =\n tokenResponse as SignInWithIdpResponse;\n if (!oauthAccessToken || !oauthTokenSecret) {\n return null;\n }\n\n try {\n return TwitterAuthProvider.credential(oauthAccessToken, oauthTokenSecret);\n } catch {\n return null;\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n HttpMethod,\n _addTidIfNecessary,\n _performSignInRequest\n} from '../index';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { Auth } from '../../model/public_types';\n\nexport interface SignUpRequest {\n returnSecureToken?: boolean;\n email?: string;\n password?: string;\n tenantId?: string;\n}\n\nexport interface SignUpResponse extends IdTokenResponse {\n displayName?: string;\n email?: string;\n}\n\nexport async function signUp(\n auth: Auth,\n request: SignUpRequest\n): Promise<SignUpResponse> {\n return _performSignInRequest<SignUpRequest, SignUpResponse>(\n auth,\n HttpMethod.POST,\n Endpoint.SIGN_UP,\n _addTidIfNecessary(auth, request)\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { OperationType, ProviderId } from '../../model/public_types';\n\nimport { PhoneOrOauthTokenResponse } from '../../api/authentication/mfa';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { UserInternal, UserCredentialInternal } from '../../model/user';\nimport { UserImpl } from './user_impl';\nimport { AuthInternal } from '../../model/auth';\n\ninterface UserCredentialParams {\n readonly user: UserInternal;\n readonly providerId: ProviderId | string | null;\n readonly _tokenResponse?: PhoneOrOauthTokenResponse;\n readonly operationType: OperationType;\n}\n\nexport class UserCredentialImpl\n implements UserCredentialInternal, UserCredentialParams {\n readonly user: UserInternal;\n readonly providerId: ProviderId | string | null;\n readonly _tokenResponse: PhoneOrOauthTokenResponse | undefined;\n readonly operationType: OperationType;\n\n constructor(params: UserCredentialParams) {\n this.user = params.user;\n this.providerId = params.providerId;\n this._tokenResponse = params._tokenResponse;\n this.operationType = params.operationType;\n }\n\n static async _fromIdTokenResponse(\n auth: AuthInternal,\n operationType: OperationType,\n idTokenResponse: IdTokenResponse,\n isAnonymous: boolean = false\n ): Promise<UserCredentialInternal> {\n const user = await UserImpl._fromIdTokenResponse(\n auth,\n idTokenResponse,\n isAnonymous\n );\n const providerId = providerIdForResponse(idTokenResponse);\n const userCred = new UserCredentialImpl({\n user,\n providerId,\n _tokenResponse: idTokenResponse,\n operationType\n });\n return userCred;\n }\n\n static async _forOperation(\n user: UserInternal,\n operationType: OperationType,\n response: PhoneOrOauthTokenResponse\n ): Promise<UserCredentialImpl> {\n await user._updateTokensIfNecessary(response, /* reload */ true);\n const providerId = providerIdForResponse(response);\n return new UserCredentialImpl({\n user,\n providerId,\n _tokenResponse: response,\n operationType\n });\n }\n}\n\nfunction providerIdForResponse(\n response: IdTokenResponse\n): ProviderId | string | null {\n if (response.providerId) {\n return response.providerId;\n }\n\n if ('phoneNumber' in response) {\n return ProviderId.PHONE;\n }\n\n return null;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Auth, OperationType, UserCredential } from '../../model/public_types';\nimport { signUp } from '../../api/authentication/sign_up';\nimport { UserInternal } from '../../model/user';\nimport { UserCredentialImpl } from '../user/user_credential_impl';\nimport { _castAuth } from '../auth/auth_impl';\n\n/**\n * Asynchronously signs in as an anonymous user.\n *\n * @remarks\n * If there is already an anonymous user signed in, that user will be returned; otherwise, a\n * new anonymous user identity will be created and returned.\n *\n * @param auth - The Auth instance.\n *\n * @public\n */\nexport async function signInAnonymously(auth: Auth): Promise<UserCredential> {\n const authInternal = _castAuth(auth);\n await authInternal._initializationPromise;\n if (authInternal.currentUser?.isAnonymous) {\n // If an anonymous user is already signed in, no need to sign them in again.\n return new UserCredentialImpl({\n user: authInternal.currentUser as UserInternal,\n providerId: null,\n operationType: OperationType.SIGN_IN\n });\n }\n const response = await signUp(authInternal, {\n returnSecureToken: true\n });\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(\n authInternal,\n OperationType.SIGN_IN,\n response,\n true\n );\n await authInternal._updateCurrentUser(userCredential.user);\n return userCredential;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n MultiFactorError as MultiFactorErrorPublic,\n OperationType\n} from '../model/public_types';\nimport { FirebaseError } from '@firebase/util';\nimport { AuthInternal } from '../model/auth';\nimport { IdTokenResponse } from '../model/id_token';\nimport { AuthErrorCode } from '../core/errors';\nimport { UserInternal } from '../model/user';\nimport { AuthCredential } from '../core/credentials';\nimport { IdTokenMfaResponse } from '../api/authentication/mfa';\n\nexport class MultiFactorError\n extends FirebaseError\n implements MultiFactorErrorPublic {\n readonly name = 'FirebaseError';\n readonly code: string;\n readonly appName: string;\n readonly serverResponse: IdTokenMfaResponse;\n\n readonly tenantId?: string;\n\n private constructor(\n auth: AuthInternal,\n error: FirebaseError,\n readonly operationType: OperationType,\n readonly user?: UserInternal\n ) {\n super(error.code, error.message);\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, MultiFactorError.prototype);\n this.appName = auth.name;\n this.code = error.code;\n this.tenantId = auth.tenantId ?? undefined;\n this.serverResponse = error.customData!\n .serverResponse as IdTokenMfaResponse;\n }\n\n static _fromErrorAndOperation(\n auth: AuthInternal,\n error: FirebaseError,\n operationType: OperationType,\n user?: UserInternal\n ): MultiFactorError {\n return new MultiFactorError(auth, error, operationType, user);\n }\n}\n\nexport function _processCredentialSavingMfaContextIfNecessary(\n auth: AuthInternal,\n operationType: OperationType,\n credential: AuthCredential,\n user?: UserInternal\n): Promise<IdTokenResponse> {\n const idTokenProvider =\n operationType === OperationType.REAUTHENTICATE\n ? credential._getReauthenticationResolver(auth)\n : credential._getIdTokenResponse(auth);\n\n return idTokenProvider.catch(error => {\n if (error.code === `auth/${AuthErrorCode.MFA_REQUIRED}`) {\n throw MultiFactorError._fromErrorAndOperation(\n auth,\n error,\n operationType,\n user\n );\n }\n\n throw error;\n });\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface ProviderAssociatedObject {\n providerId?: string;\n}\n\n/**\n * Takes a set of UserInfo provider data and converts it to a set of names\n */\nexport function providerDataAsNames<T extends ProviderAssociatedObject>(\n providerData: T[]\n): Set<string> {\n return new Set(\n providerData\n .map(({ providerId }) => providerId)\n .filter(pid => !!pid) as string[]\n );\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { OperationType, ProviderId, User } from '../../model/public_types';\n\nimport { deleteLinkedAccounts } from '../../api/account_management/account';\nimport { UserInternal, UserCredentialInternal } from '../../model/user';\nimport { AuthCredential } from '../credentials';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { providerDataAsNames } from '../util/providers';\nimport { _logoutIfInvalidated } from './invalidation';\nimport { _reloadWithoutSaving } from './reload';\nimport { UserCredentialImpl } from './user_credential_impl';\nimport { getModularInstance } from '@firebase/util';\n\n/**\n * Unlinks a provider from a user account.\n *\n * @param user - The user.\n * @param providerId - The provider to unlink.\n *\n * @public\n */\nexport async function unlink(user: User, providerId: string): Promise<User> {\n const userInternal = getModularInstance(user) as UserInternal;\n await _assertLinkedStatus(true, userInternal, providerId);\n const { providerUserInfo } = await deleteLinkedAccounts(userInternal.auth, {\n idToken: await userInternal.getIdToken(),\n deleteProvider: [providerId]\n });\n\n const providersLeft = providerDataAsNames(providerUserInfo || []);\n\n userInternal.providerData = userInternal.providerData.filter(pd =>\n providersLeft.has(pd.providerId)\n );\n if (!providersLeft.has(ProviderId.PHONE)) {\n userInternal.phoneNumber = null;\n }\n\n await userInternal.auth._persistUserIfCurrent(userInternal);\n return userInternal;\n}\n\nexport async function _link(\n user: UserInternal,\n credential: AuthCredential,\n bypassAuthState = false\n): Promise<UserCredentialInternal> {\n const response = await _logoutIfInvalidated(\n user,\n credential._linkToIdToken(user.auth, await user.getIdToken()),\n bypassAuthState\n );\n return UserCredentialImpl._forOperation(user, OperationType.LINK, response);\n}\n\nexport async function _assertLinkedStatus(\n expected: boolean,\n user: UserInternal,\n provider: string\n): Promise<void> {\n await _reloadWithoutSaving(user);\n const providerIds = providerDataAsNames(user.providerData);\n\n const code =\n expected === false\n ? AuthErrorCode.PROVIDER_ALREADY_LINKED\n : AuthErrorCode.NO_SUCH_PROVIDER;\n _assert(providerIds.has(provider) === expected, user.auth, code);\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { OperationType } from '../../model/public_types';\n\nimport { _processCredentialSavingMfaContextIfNecessary } from '../../mfa/mfa_error';\nimport { UserInternal } from '../../model/user';\nimport { AuthCredential } from '../credentials';\nimport { AuthErrorCode } from '../errors';\nimport { _assert, _fail } from '../util/assert';\nimport { _parseToken } from './id_token_result';\nimport { _logoutIfInvalidated } from './invalidation';\nimport { UserCredentialImpl } from './user_credential_impl';\n\nexport async function _reauthenticate(\n user: UserInternal,\n credential: AuthCredential,\n bypassAuthState = false\n): Promise<UserCredentialImpl> {\n const { auth } = user;\n const operationType = OperationType.REAUTHENTICATE;\n\n try {\n const response = await _logoutIfInvalidated(\n user,\n _processCredentialSavingMfaContextIfNecessary(\n auth,\n operationType,\n credential,\n user\n ),\n bypassAuthState\n );\n _assert(response.idToken, auth, AuthErrorCode.INTERNAL_ERROR);\n const parsed = _parseToken(response.idToken);\n _assert(parsed, auth, AuthErrorCode.INTERNAL_ERROR);\n\n const { sub: localId } = parsed;\n _assert(user.uid === localId, auth, AuthErrorCode.USER_MISMATCH);\n\n return UserCredentialImpl._forOperation(user, operationType, response);\n } catch (e) {\n // Convert user deleted error into user mismatch\n if (e?.code === `auth/${AuthErrorCode.USER_DELETED}`) {\n _fail(auth, AuthErrorCode.USER_MISMATCH);\n }\n throw e;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n OperationType,\n UserCredential,\n Auth,\n User\n} from '../../model/public_types';\n\nimport { _processCredentialSavingMfaContextIfNecessary } from '../../mfa/mfa_error';\nimport { AuthInternal } from '../../model/auth';\nimport { UserInternal } from '../../model/user';\nimport { AuthCredential } from '../credentials';\nimport { _assertLinkedStatus, _link } from '../user/link_unlink';\nimport { _reauthenticate } from '../user/reauthenticate';\nimport { UserCredentialImpl } from '../user/user_credential_impl';\nimport { _castAuth } from '../auth/auth_impl';\nimport { getModularInstance } from '@firebase/util';\n\nexport async function _signInWithCredential(\n auth: AuthInternal,\n credential: AuthCredential,\n bypassAuthState = false\n): Promise<UserCredential> {\n const operationType = OperationType.SIGN_IN;\n const response = await _processCredentialSavingMfaContextIfNecessary(\n auth,\n operationType,\n credential\n );\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(\n auth,\n operationType,\n response\n );\n\n if (!bypassAuthState) {\n await auth._updateCurrentUser(userCredential.user);\n }\n return userCredential;\n}\n\n/**\n * Asynchronously signs in with the given credentials.\n *\n * @remarks\n * An {@link AuthProvider} can be used to generate the credential.\n *\n * @param auth - The Auth instance.\n * @param credential - The auth credential.\n *\n * @public\n */\nexport async function signInWithCredential(\n auth: Auth,\n credential: AuthCredential\n): Promise<UserCredential> {\n return _signInWithCredential(_castAuth(auth), credential);\n}\n\n/**\n * Links the user account with the given credentials.\n *\n * @remarks\n * An {@link AuthProvider} can be used to generate the credential.\n *\n * @param user - The user.\n * @param credential - The auth credential.\n *\n * @public\n */\nexport async function linkWithCredential(\n user: User,\n credential: AuthCredential\n): Promise<UserCredential> {\n const userInternal = getModularInstance(user) as UserInternal;\n\n await _assertLinkedStatus(false, userInternal, credential.providerId);\n\n return _link(userInternal, credential);\n}\n\n/**\n * Re-authenticates a user using a fresh credential.\n *\n * @remarks\n * Use before operations such as {@link updatePassword} that require tokens from recent sign-in\n * attempts. This method can be used to recover from a CREDENTIAL_TOO_OLD_LOGIN_AGAIN error.\n *\n * @param user - The user.\n * @param credential - The auth credential.\n *\n * @public\n */\nexport async function reauthenticateWithCredential(\n user: User,\n credential: AuthCredential\n): Promise<UserCredential> {\n return _reauthenticate(getModularInstance(user) as UserInternal, credential);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n HttpMethod,\n _addTidIfNecessary,\n _performSignInRequest\n} from '../index';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { Auth } from '../../model/public_types';\n\nexport interface SignInWithCustomTokenRequest {\n token: string;\n returnSecureToken: boolean;\n tenantId?: string;\n}\n\nexport interface SignInWithCustomTokenResponse extends IdTokenResponse {}\n\nexport async function signInWithCustomToken(\n auth: Auth,\n request: SignInWithCustomTokenRequest\n): Promise<SignInWithCustomTokenResponse> {\n return _performSignInRequest<\n SignInWithCustomTokenRequest,\n SignInWithCustomTokenResponse\n >(\n auth,\n HttpMethod.POST,\n Endpoint.SIGN_IN_WITH_CUSTOM_TOKEN,\n _addTidIfNecessary(auth, request)\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Auth, OperationType, UserCredential } from '../../model/public_types';\n\nimport { signInWithCustomToken as getIdTokenResponse } from '../../api/authentication/custom_token';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { UserCredentialImpl } from '../user/user_credential_impl';\nimport { _castAuth } from '../auth/auth_impl';\n\n/**\n * Asynchronously signs in using a custom token.\n *\n * @remarks\n * Custom tokens are used to integrate Firebase Auth with existing auth systems, and must\n * be generated by an auth backend using the\n * {@link https://firebase.google.com/docs/reference/admin/node/admin.auth.Auth#createcustomtoken | createCustomToken}\n * method in the {@link https://firebase.google.com/docs/auth/admin | Admin SDK} .\n *\n * Fails with an error if the token is invalid, expired, or not accepted by the Firebase Auth service.\n *\n * @param auth - The Auth instance.\n * @param customToken - The custom token to sign in with.\n *\n * @public\n */\nexport async function signInWithCustomToken(\n auth: Auth,\n customToken: string\n): Promise<UserCredential> {\n const authInternal = _castAuth(auth);\n const response: IdTokenResponse = await getIdTokenResponse(authInternal, {\n token: customToken,\n returnSecureToken: true\n });\n const cred = await UserCredentialImpl._fromIdTokenResponse(\n authInternal,\n OperationType.SIGN_IN,\n response\n );\n await authInternal._updateCurrentUser(cred.user);\n return cred;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FactorId, MultiFactorInfo } from '../model/public_types';\nimport {\n PhoneMfaEnrollment,\n MfaEnrollment\n} from '../api/account_management/mfa';\nimport { AuthErrorCode } from '../core/errors';\nimport { _fail } from '../core/util/assert';\nimport { AuthInternal } from '../model/auth';\n\nexport abstract class MultiFactorInfoImpl implements MultiFactorInfo {\n readonly uid: string;\n readonly displayName?: string | null;\n readonly enrollmentTime: string;\n\n protected constructor(readonly factorId: FactorId, response: MfaEnrollment) {\n this.uid = response.mfaEnrollmentId;\n this.enrollmentTime = new Date(response.enrolledAt).toUTCString();\n this.displayName = response.displayName;\n }\n\n static _fromServerResponse(\n auth: AuthInternal,\n enrollment: MfaEnrollment\n ): MultiFactorInfoImpl {\n if ('phoneInfo' in enrollment) {\n return PhoneMultiFactorInfo._fromServerResponse(auth, enrollment);\n }\n return _fail(auth, AuthErrorCode.INTERNAL_ERROR);\n }\n}\n\nexport class PhoneMultiFactorInfo extends MultiFactorInfoImpl {\n readonly phoneNumber: string;\n\n private constructor(response: PhoneMfaEnrollment) {\n super(FactorId.PHONE, response);\n this.phoneNumber = response.phoneInfo;\n }\n\n static _fromServerResponse(\n _auth: AuthInternal,\n enrollment: MfaEnrollment\n ): PhoneMultiFactorInfo {\n return new PhoneMultiFactorInfo(enrollment);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ActionCodeSettings, Auth } from '../../model/public_types';\n\nimport { GetOobCodeRequest } from '../../api/authentication/email_and_password';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\n\nexport function _setActionCodeSettingsOnRequest(\n auth: Auth,\n request: GetOobCodeRequest,\n actionCodeSettings: ActionCodeSettings\n): void {\n _assert(\n actionCodeSettings.url?.length > 0,\n auth,\n AuthErrorCode.INVALID_CONTINUE_URI\n );\n _assert(\n typeof actionCodeSettings.dynamicLinkDomain === 'undefined' ||\n actionCodeSettings.dynamicLinkDomain.length > 0,\n auth,\n AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN\n );\n\n request.continueUrl = actionCodeSettings.url;\n request.dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain;\n request.canHandleCodeInApp = actionCodeSettings.handleCodeInApp;\n\n if (actionCodeSettings.iOS) {\n _assert(\n actionCodeSettings.iOS.bundleId.length > 0,\n auth,\n AuthErrorCode.MISSING_IOS_BUNDLE_ID\n );\n request.iosBundleId = actionCodeSettings.iOS.bundleId;\n }\n\n if (actionCodeSettings.android) {\n _assert(\n actionCodeSettings.android.packageName.length > 0,\n auth,\n AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME\n );\n request.androidInstallApp = actionCodeSettings.android.installApp;\n request.androidMinimumVersionCode =\n actionCodeSettings.android.minimumVersion;\n request.androidPackageName = actionCodeSettings.android.packageName;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ActionCodeInfo,\n ActionCodeOperation,\n ActionCodeSettings,\n Auth,\n OperationType,\n UserCredential\n} from '../../model/public_types';\n\nimport * as account from '../../api/account_management/email_and_password';\nimport * as authentication from '../../api/authentication/email_and_password';\nimport { signUp } from '../../api/authentication/sign_up';\nimport { MultiFactorInfoImpl } from '../../mfa/mfa_info';\nimport { EmailAuthProvider } from '../providers/email';\nimport { UserCredentialImpl } from '../user/user_credential_impl';\nimport { _assert } from '../util/assert';\nimport { _setActionCodeSettingsOnRequest } from './action_code_settings';\nimport { signInWithCredential } from './credential';\nimport { _castAuth } from '../auth/auth_impl';\nimport { AuthErrorCode } from '../errors';\nimport { getModularInstance } from '@firebase/util';\n\n/**\n * Sends a password reset email to the given email address.\n *\n * @remarks\n * To complete the password reset, call {@link confirmPasswordReset} with the code supplied in\n * the email sent to the user, along with the new password specified by the user.\n *\n * @example\n * ```javascript\n * const actionCodeSettings = {\n * url: 'https://www.example.com/?email=user@example.com',\n * iOS: {\n * bundleId: 'com.example.ios'\n * },\n * android: {\n * packageName: 'com.example.android',\n * installApp: true,\n * minimumVersion: '12'\n * },\n * handleCodeInApp: true\n * };\n * await sendPasswordResetEmail(auth, 'user@example.com', actionCodeSettings);\n * // Obtain code from user.\n * await confirmPasswordReset('user@example.com', code);\n * ```\n *\n * @param auth - The Auth instance.\n * @param email - The user's email address.\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\n *\n * @public\n */\nexport async function sendPasswordResetEmail(\n auth: Auth,\n email: string,\n actionCodeSettings?: ActionCodeSettings\n): Promise<void> {\n const authModular = getModularInstance(auth);\n const request: authentication.PasswordResetRequest = {\n requestType: ActionCodeOperation.PASSWORD_RESET,\n email\n };\n if (actionCodeSettings) {\n _setActionCodeSettingsOnRequest(authModular, request, actionCodeSettings);\n }\n\n await authentication.sendPasswordResetEmail(authModular, request);\n}\n\n/**\n * Completes the password reset process, given a confirmation code and new password.\n *\n * @param auth - The Auth instance.\n * @param oobCode - A confirmation code sent to the user.\n * @param newPassword - The new password.\n *\n * @public\n */\nexport async function confirmPasswordReset(\n auth: Auth,\n oobCode: string,\n newPassword: string\n): Promise<void> {\n await account.resetPassword(getModularInstance(auth), {\n oobCode,\n newPassword\n });\n // Do not return the email.\n}\n\n/**\n * Applies a verification code sent to the user by email or other out-of-band mechanism.\n *\n * @param auth - The Auth instance.\n * @param oobCode - A verification code sent to the user.\n *\n * @public\n */\nexport async function applyActionCode(\n auth: Auth,\n oobCode: string\n): Promise<void> {\n await account.applyActionCode(getModularInstance(auth), { oobCode });\n}\n\n/**\n * Checks a verification code sent to the user by email or other out-of-band mechanism.\n *\n * @returns metadata about the code.\n *\n * @param auth - The Auth instance.\n * @param oobCode - A verification code sent to the user.\n *\n * @public\n */\nexport async function checkActionCode(\n auth: Auth,\n oobCode: string\n): Promise<ActionCodeInfo> {\n const authModular = getModularInstance(auth);\n const response = await account.resetPassword(authModular, { oobCode });\n\n // Email could be empty only if the request type is EMAIL_SIGNIN or\n // VERIFY_AND_CHANGE_EMAIL.\n // New email should not be empty if the request type is\n // VERIFY_AND_CHANGE_EMAIL.\n // Multi-factor info could not be empty if the request type is\n // REVERT_SECOND_FACTOR_ADDITION.\n const operation = response.requestType;\n _assert(operation, authModular, AuthErrorCode.INTERNAL_ERROR);\n switch (operation) {\n case ActionCodeOperation.EMAIL_SIGNIN:\n break;\n case ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL:\n _assert(response.newEmail, authModular, AuthErrorCode.INTERNAL_ERROR);\n break;\n case ActionCodeOperation.REVERT_SECOND_FACTOR_ADDITION:\n _assert(response.mfaInfo, authModular, AuthErrorCode.INTERNAL_ERROR);\n // fall through\n default:\n _assert(response.email, authModular, AuthErrorCode.INTERNAL_ERROR);\n }\n\n // The multi-factor info for revert second factor addition\n let multiFactorInfo: MultiFactorInfoImpl | null = null;\n if (response.mfaInfo) {\n multiFactorInfo = MultiFactorInfoImpl._fromServerResponse(\n _castAuth(authModular),\n response.mfaInfo\n );\n }\n\n return {\n data: {\n email:\n (response.requestType === ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL\n ? response.newEmail\n : response.email) || null,\n previousEmail:\n (response.requestType === ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL\n ? response.email\n : response.newEmail) || null,\n multiFactorInfo\n },\n operation\n };\n}\n\n/**\n * Checks a password reset code sent to the user by email or other out-of-band mechanism.\n *\n * @returns the user's email address if valid.\n *\n * @param auth - The Auth instance.\n * @param code - A verification code sent to the user.\n *\n * @public\n */\nexport async function verifyPasswordResetCode(\n auth: Auth,\n code: string\n): Promise<string> {\n const { data } = await checkActionCode(getModularInstance(auth), code);\n // Email should always be present since a code was sent to it\n return data.email!;\n}\n\n/**\n * Creates a new user account associated with the specified email address and password.\n *\n * @remarks\n * On successful creation of the user account, this user will also be signed in to your application.\n *\n * User account creation can fail if the account already exists or the password is invalid.\n *\n * Note: The email address acts as a unique identifier for the user and enables an email-based\n * password reset. This function will create a new user account and set the initial user password.\n *\n * @param auth - The Auth instance.\n * @param email - The user's email address.\n * @param password - The user's chosen password.\n *\n * @public\n */\nexport async function createUserWithEmailAndPassword(\n auth: Auth,\n email: string,\n password: string\n): Promise<UserCredential> {\n const authInternal = _castAuth(auth);\n const response = await signUp(authInternal, {\n returnSecureToken: true,\n email,\n password\n });\n\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(\n authInternal,\n OperationType.SIGN_IN,\n response\n );\n await authInternal._updateCurrentUser(userCredential.user);\n\n return userCredential;\n}\n\n/**\n * Asynchronously signs in using an email and password.\n *\n * @remarks\n * Fails with an error if the email address and password do not match.\n *\n * Note: The user's password is NOT the password used to access the user's email account. The\n * email address serves as a unique identifier for the user, and the password is used to access\n * the user's account in your Firebase project. See also: {@link createUserWithEmailAndPassword}.\n *\n * @param auth - The Auth instance.\n * @param email - The users email address.\n * @param password - The users password.\n *\n * @public\n */\nexport function signInWithEmailAndPassword(\n auth: Auth,\n email: string,\n password: string\n): Promise<UserCredential> {\n return signInWithCredential(\n getModularInstance(auth),\n EmailAuthProvider.credential(email, password)\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ActionCodeOperation,\n ActionCodeSettings,\n Auth,\n UserCredential\n} from '../../model/public_types';\n\nimport * as api from '../../api/authentication/email_and_password';\nimport { ActionCodeURL } from '../action_code_url';\nimport { EmailAuthProvider } from '../providers/email';\nimport { _getCurrentUrl } from '../util/location';\nimport { _setActionCodeSettingsOnRequest } from './action_code_settings';\nimport { signInWithCredential } from './credential';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { getModularInstance } from '@firebase/util';\n\n/**\n * Sends a sign-in email link to the user with the specified email.\n *\n * @remarks\n * The sign-in operation has to always be completed in the app unlike other out of band email\n * actions (password reset and email verifications). This is because, at the end of the flow,\n * the user is expected to be signed in and their Auth state persisted within the app.\n *\n * To complete sign in with the email link, call {@link signInWithEmailLink} with the email\n * address and the email link supplied in the email sent to the user.\n *\n * @example\n * ```javascript\n * const actionCodeSettings = {\n * url: 'https://www.example.com/?email=user@example.com',\n * iOS: {\n * bundleId: 'com.example.ios'\n * },\n * android: {\n * packageName: 'com.example.android',\n * installApp: true,\n * minimumVersion: '12'\n * },\n * handleCodeInApp: true\n * };\n * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings);\n * // Obtain emailLink from the user.\n * if(isSignInWithEmailLink(auth, emailLink)) {\n * await signInWithEmailLink('user@example.com', 'user@example.com', emailLink);\n * }\n * ```\n *\n * @param authInternal - The Auth instance.\n * @param email - The user's email address.\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\n *\n * @public\n */\nexport async function sendSignInLinkToEmail(\n auth: Auth,\n email: string,\n actionCodeSettings: ActionCodeSettings\n): Promise<void> {\n const authModular = getModularInstance(auth);\n const request: api.EmailSignInRequest = {\n requestType: ActionCodeOperation.EMAIL_SIGNIN,\n email\n };\n _assert(\n actionCodeSettings.handleCodeInApp,\n authModular,\n AuthErrorCode.ARGUMENT_ERROR\n );\n if (actionCodeSettings) {\n _setActionCodeSettingsOnRequest(authModular, request, actionCodeSettings);\n }\n\n await api.sendSignInLinkToEmail(authModular, request);\n}\n\n/**\n * Checks if an incoming link is a sign-in with email link suitable for {@link signInWithEmailLink}.\n *\n * @param auth - The Auth instance.\n * @param emailLink - The link sent to the user's email address.\n *\n * @public\n */\nexport function isSignInWithEmailLink(auth: Auth, emailLink: string): boolean {\n const actionCodeUrl = ActionCodeURL.parseLink(emailLink);\n return actionCodeUrl?.operation === ActionCodeOperation.EMAIL_SIGNIN;\n}\n\n/**\n * Asynchronously signs in using an email and sign-in email link.\n *\n * @remarks\n * If no link is passed, the link is inferred from the current URL.\n *\n * Fails with an error if the email address is invalid or OTP in email link expires.\n *\n * Note: Confirm the link is a sign-in email link before calling this method firebase.auth.Auth.isSignInWithEmailLink.\n *\n * @example\n * ```javascript\n * const actionCodeSettings = {\n * url: 'https://www.example.com/?email=user@example.com',\n * iOS: {\n * bundleId: 'com.example.ios'\n * },\n * android: {\n * packageName: 'com.example.android',\n * installApp: true,\n * minimumVersion: '12'\n * },\n * handleCodeInApp: true\n * };\n * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings);\n * // Obtain emailLink from the user.\n * if(isSignInWithEmailLink(auth, emailLink)) {\n * await signInWithEmailLink('user@example.com', 'user@example.com', emailLink);\n * }\n * ```\n *\n * @param auth - The Auth instance.\n * @param email - The user's email address.\n * @param emailLink - The link sent to the user's email address.\n *\n * @public\n */\nexport async function signInWithEmailLink(\n auth: Auth,\n email: string,\n emailLink?: string\n): Promise<UserCredential> {\n const authModular = getModularInstance(auth);\n const credential = EmailAuthProvider.credentialWithLink(\n email,\n emailLink || _getCurrentUrl()\n );\n // Check if the tenant ID in the email link matches the tenant ID on Auth\n // instance.\n _assert(\n credential._tenantId === (authModular.tenantId || null),\n authModular,\n AuthErrorCode.TENANT_ID_MISMATCH\n );\n return signInWithCredential(authModular, credential);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n HttpMethod,\n _addTidIfNecessary,\n _performApiRequest\n} from '../index';\nimport { Auth } from '../../model/public_types';\n\nexport interface CreateAuthUriRequest {\n identifier: string;\n continueUri: string;\n tenantId?: string;\n}\n\nexport interface CreateAuthUriResponse {\n signinMethods: string[];\n}\n\nexport async function createAuthUri(\n auth: Auth,\n request: CreateAuthUriRequest\n): Promise<CreateAuthUriResponse> {\n return _performApiRequest<CreateAuthUriRequest, CreateAuthUriResponse>(\n auth,\n HttpMethod.POST,\n Endpoint.CREATE_AUTH_URI,\n _addTidIfNecessary(auth, request)\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ActionCodeOperation,\n ActionCodeSettings,\n Auth,\n User\n} from '../../model/public_types';\n\nimport {\n createAuthUri,\n CreateAuthUriRequest\n} from '../../api/authentication/create_auth_uri';\nimport * as api from '../../api/authentication/email_and_password';\nimport { UserInternal } from '../../model/user';\nimport { _getCurrentUrl, _isHttpOrHttps } from '../util/location';\nimport { _setActionCodeSettingsOnRequest } from './action_code_settings';\nimport { getModularInstance } from '@firebase/util';\n\n/**\n * Gets the list of possible sign in methods for the given email address.\n *\n * @remarks\n * This is useful to differentiate methods of sign-in for the same provider, eg.\n * {@link EmailAuthProvider} which has 2 methods of sign-in,\n * {@link SignInMethod}.EMAIL_PASSWORD and\n * {@link SignInMethod}.EMAIL_LINK.\n *\n * @param auth - The Auth instance.\n * @param email - The user's email address.\n *\n * @public\n */\nexport async function fetchSignInMethodsForEmail(\n auth: Auth,\n email: string\n): Promise<string[]> {\n // createAuthUri returns an error if continue URI is not http or https.\n // For environments like Cordova, Chrome extensions, native frameworks, file\n // systems, etc, use http://localhost as continue URL.\n const continueUri = _isHttpOrHttps() ? _getCurrentUrl() : 'http://localhost';\n const request: CreateAuthUriRequest = {\n identifier: email,\n continueUri\n };\n\n const { signinMethods } = await createAuthUri(\n getModularInstance(auth),\n request\n );\n\n return signinMethods || [];\n}\n\n/**\n * Sends a verification email to a user.\n *\n * @remarks\n * The verification process is completed by calling {@link applyActionCode}.\n *\n * @example\n * ```javascript\n * const actionCodeSettings = {\n * url: 'https://www.example.com/?email=user@example.com',\n * iOS: {\n * bundleId: 'com.example.ios'\n * },\n * android: {\n * packageName: 'com.example.android',\n * installApp: true,\n * minimumVersion: '12'\n * },\n * handleCodeInApp: true\n * };\n * await sendEmailVerification(user, actionCodeSettings);\n * // Obtain code from the user.\n * await applyActionCode(auth, code);\n * ```\n *\n * @param user - The user.\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\n *\n * @public\n */\nexport async function sendEmailVerification(\n user: User,\n actionCodeSettings?: ActionCodeSettings | null\n): Promise<void> {\n const userInternal = getModularInstance(user) as UserInternal;\n const idToken = await user.getIdToken();\n const request: api.VerifyEmailRequest = {\n requestType: ActionCodeOperation.VERIFY_EMAIL,\n idToken\n };\n if (actionCodeSettings) {\n _setActionCodeSettingsOnRequest(\n userInternal.auth,\n request,\n actionCodeSettings\n );\n }\n\n const { email } = await api.sendEmailVerification(userInternal.auth, request);\n\n if (email !== user.email) {\n await user.reload();\n }\n}\n\n/**\n * Sends a verification email to a new email address.\n *\n * @remarks\n * The user's email will be updated to the new one after being verified.\n *\n * If you have a custom email action handler, you can complete the verification process by calling\n * {@link applyActionCode}.\n *\n * @example\n * ```javascript\n * const actionCodeSettings = {\n * url: 'https://www.example.com/?email=user@example.com',\n * iOS: {\n * bundleId: 'com.example.ios'\n * },\n * android: {\n * packageName: 'com.example.android',\n * installApp: true,\n * minimumVersion: '12'\n * },\n * handleCodeInApp: true\n * };\n * await verifyBeforeUpdateEmail(user, 'newemail@example.com', actionCodeSettings);\n * // Obtain code from the user.\n * await applyActionCode(auth, code);\n * ```\n *\n * @param user - The user.\n * @param newEmail - The new email address to be verified before update.\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\n *\n * @public\n */\nexport async function verifyBeforeUpdateEmail(\n user: User,\n newEmail: string,\n actionCodeSettings?: ActionCodeSettings | null\n): Promise<void> {\n const userInternal = getModularInstance(user) as UserInternal;\n const idToken = await user.getIdToken();\n const request: api.VerifyAndChangeEmailRequest = {\n requestType: ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL,\n idToken,\n newEmail\n };\n if (actionCodeSettings) {\n _setActionCodeSettingsOnRequest(\n userInternal.auth,\n request,\n actionCodeSettings\n );\n }\n\n const { email } = await api.verifyAndChangeEmail(userInternal.auth, request);\n\n if (email !== user.email) {\n // If the local copy of the email on user is outdated, reload the\n // user.\n await user.reload();\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Endpoint, HttpMethod, _performApiRequest } from '../index';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { Auth } from '../../model/public_types';\n\nexport interface UpdateProfileRequest {\n idToken: string;\n displayName?: string | null;\n photoUrl?: string | null;\n returnSecureToken: boolean;\n}\n\nexport interface UpdateProfileResponse extends IdTokenResponse {\n displayName?: string | null;\n photoUrl?: string | null;\n}\n\nexport async function updateProfile(\n auth: Auth,\n request: UpdateProfileRequest\n): Promise<UpdateProfileResponse> {\n return _performApiRequest<UpdateProfileRequest, UpdateProfileResponse>(\n auth,\n HttpMethod.POST,\n Endpoint.SET_ACCOUNT_INFO,\n request\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ProviderId, User } from '../../model/public_types';\n\nimport {\n updateEmailPassword as apiUpdateEmailPassword,\n UpdateEmailPasswordRequest\n} from '../../api/account_management/email_and_password';\nimport { updateProfile as apiUpdateProfile } from '../../api/account_management/profile';\nimport { UserInternal } from '../../model/user';\nimport { _logoutIfInvalidated } from './invalidation';\nimport { getModularInstance } from '@firebase/util';\n\n/**\n * Updates a user's profile data.\n *\n * @param user - The user.\n * @param profile - The profile's `displayName` and `photoURL` to update.\n *\n * @public\n */\nexport async function updateProfile(\n user: User,\n {\n displayName,\n photoURL: photoUrl\n }: { displayName?: string | null; photoURL?: string | null }\n): Promise<void> {\n if (displayName === undefined && photoUrl === undefined) {\n return;\n }\n\n const userInternal = getModularInstance(user) as UserInternal;\n const idToken = await userInternal.getIdToken();\n const profileRequest = {\n idToken,\n displayName,\n photoUrl,\n returnSecureToken: true\n };\n const response = await _logoutIfInvalidated(\n userInternal,\n apiUpdateProfile(userInternal.auth, profileRequest)\n );\n\n userInternal.displayName = response.displayName || null;\n userInternal.photoURL = response.photoUrl || null;\n\n // Update the password provider as well\n const passwordProvider = userInternal.providerData.find(\n ({ providerId }) => providerId === ProviderId.PASSWORD\n );\n if (passwordProvider) {\n passwordProvider.displayName = userInternal.displayName;\n passwordProvider.photoURL = userInternal.photoURL;\n }\n\n await userInternal._updateTokensIfNecessary(response);\n}\n\n/**\n * Updates the user's email address.\n *\n * @remarks\n * An email will be sent to the original email address (if it was set) that allows to revoke the\n * email address change, in order to protect them from account hijacking.\n *\n * Important: this is a security sensitive operation that requires the user to have recently signed\n * in. If this requirement isn't met, ask the user to authenticate again and then call\n * {@link reauthenticateWithCredential}.\n *\n * @param user - The user.\n * @param newEmail - The new email address.\n *\n * @public\n */\nexport function updateEmail(user: User, newEmail: string): Promise<void> {\n return updateEmailOrPassword(\n getModularInstance(user) as UserInternal,\n newEmail,\n null\n );\n}\n\n/**\n * Updates the user's password.\n *\n * @remarks\n * Important: this is a security sensitive operation that requires the user to have recently signed\n * in. If this requirement isn't met, ask the user to authenticate again and then call\n * {@link reauthenticateWithCredential}.\n *\n * @param user - The user.\n * @param newPassword - The new password.\n *\n * @public\n */\nexport function updatePassword(user: User, newPassword: string): Promise<void> {\n return updateEmailOrPassword(\n getModularInstance(user) as UserInternal,\n null,\n newPassword\n );\n}\n\nasync function updateEmailOrPassword(\n user: UserInternal,\n email: string | null,\n password: string | null\n): Promise<void> {\n const { auth } = user;\n const idToken = await user.getIdToken();\n const request: UpdateEmailPasswordRequest = {\n idToken,\n returnSecureToken: true\n };\n\n if (email) {\n request.email = email;\n }\n\n if (password) {\n request.password = password;\n }\n\n const response = await _logoutIfInvalidated(\n user,\n apiUpdateEmailPassword(auth, request)\n );\n await user._updateTokensIfNecessary(response, /* reload */ true);\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AdditionalUserInfo,\n ProviderId,\n UserCredential\n} from '../../model/public_types';\nimport { IdTokenResponse, IdTokenResponseKind } from '../../model/id_token';\nimport { _parseToken } from './id_token_result';\nimport { UserCredentialInternal } from '../../model/user';\n\n/**\n * Parse the `AdditionalUserInfo` from the ID token response.\n *\n */\nexport function _fromIdTokenResponse(\n idTokenResponse?: IdTokenResponse\n): AdditionalUserInfo | null {\n if (!idTokenResponse) {\n return null;\n }\n const { providerId } = idTokenResponse;\n const profile = idTokenResponse.rawUserInfo\n ? JSON.parse(idTokenResponse.rawUserInfo)\n : {};\n const isNewUser =\n idTokenResponse.isNewUser ||\n idTokenResponse.kind === IdTokenResponseKind.SignupNewUser;\n if (!providerId && idTokenResponse?.idToken) {\n const signInProvider = _parseToken(idTokenResponse.idToken)?.firebase?.[\n 'sign_in_provider'\n ];\n if (signInProvider) {\n const filteredProviderId =\n signInProvider !== ProviderId.ANONYMOUS &&\n signInProvider !== ProviderId.CUSTOM\n ? (signInProvider as ProviderId)\n : null;\n // Uses generic class in accordance with the legacy SDK.\n return new GenericAdditionalUserInfo(isNewUser, filteredProviderId);\n }\n }\n if (!providerId) {\n return null;\n }\n switch (providerId) {\n case ProviderId.FACEBOOK:\n return new FacebookAdditionalUserInfo(isNewUser, profile);\n case ProviderId.GITHUB:\n return new GithubAdditionalUserInfo(isNewUser, profile);\n case ProviderId.GOOGLE:\n return new GoogleAdditionalUserInfo(isNewUser, profile);\n case ProviderId.TWITTER:\n return new TwitterAdditionalUserInfo(\n isNewUser,\n profile,\n idTokenResponse.screenName || null\n );\n case ProviderId.CUSTOM:\n case ProviderId.ANONYMOUS:\n return new GenericAdditionalUserInfo(isNewUser, null);\n default:\n return new GenericAdditionalUserInfo(isNewUser, providerId, profile);\n }\n}\n\nclass GenericAdditionalUserInfo implements AdditionalUserInfo {\n constructor(\n readonly isNewUser: boolean,\n readonly providerId: ProviderId | string | null,\n readonly profile: Record<string, unknown> = {}\n ) {}\n}\n\nclass FederatedAdditionalUserInfoWithUsername extends GenericAdditionalUserInfo {\n constructor(\n isNewUser: boolean,\n providerId: ProviderId,\n profile: Record<string, unknown>,\n readonly username: string | null\n ) {\n super(isNewUser, providerId, profile);\n }\n}\n\nclass FacebookAdditionalUserInfo extends GenericAdditionalUserInfo {\n constructor(isNewUser: boolean, profile: Record<string, unknown>) {\n super(isNewUser, ProviderId.FACEBOOK, profile);\n }\n}\n\nclass GithubAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {\n constructor(isNewUser: boolean, profile: Record<string, unknown>) {\n super(\n isNewUser,\n ProviderId.GITHUB,\n profile,\n typeof profile?.login === 'string' ? profile?.login : null\n );\n }\n}\n\nclass GoogleAdditionalUserInfo extends GenericAdditionalUserInfo {\n constructor(isNewUser: boolean, profile: Record<string, unknown>) {\n super(isNewUser, ProviderId.GOOGLE, profile);\n }\n}\n\nclass TwitterAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {\n constructor(\n isNewUser: boolean,\n profile: Record<string, unknown>,\n screenName: string | null\n ) {\n super(isNewUser, ProviderId.TWITTER, profile, screenName);\n }\n}\n\n/**\n * Extracts provider specific {@link AdditionalUserInfo} for the given credential.\n *\n * @param userCredential - The user credential.\n *\n * @public\n */\nexport function getAdditionalUserInfo(\n userCredential: UserCredential\n): AdditionalUserInfo | null {\n const { user, _tokenResponse } = userCredential as UserCredentialInternal;\n if (user.isAnonymous && !_tokenResponse) {\n // Handle the special case where signInAnonymously() gets called twice.\n // No network call is made so there's nothing to actually fill this in\n return {\n providerId: null,\n isNewUser: false,\n profile: null\n };\n }\n\n return _fromIdTokenResponse(_tokenResponse);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance } from '@firebase/util';\nimport {\n Auth,\n NextOrObserver,\n Persistence,\n User,\n CompleteFn,\n ErrorFn,\n Unsubscribe\n} from '../model/public_types';\n\nexport { debugErrorMap, prodErrorMap } from './errors';\n\n// Non-optional auth methods.\n/**\n * Changes the type of persistence on the Auth instance for the currently saved\n * Auth session and applies this type of persistence for future sign-in requests, including\n * sign-in with redirect requests.\n *\n * @remarks\n * This makes it easy for a user signing in to specify whether their session should be\n * remembered or not. It also makes it easier to never persist the Auth state for applications\n * that are shared by other users or have sensitive data.\n *\n * @example\n * ```javascript\n * setPersistence(auth, browserSessionPersistence);\n * ```\n *\n * @param auth - The Auth instance.\n * @param persistence - The {@link Persistence} to use.\n * @returns A promise that resolves once the persistence change has completed\n *\n * @public\n */\nexport function setPersistence(\n auth: Auth,\n persistence: Persistence\n): Promise<void> {\n return getModularInstance(auth).setPersistence(persistence);\n}\n/**\n * Adds an observer for changes to the signed-in user's ID token, which includes sign-in,\n * sign-out, and token refresh events.\n *\n * @param auth - The Auth instance.\n * @param nextOrObserver - callback triggered on change.\n * @param error - callback triggered on error.\n * @param completed - callback triggered when observer is removed.\n *\n * @public\n */\nexport function onIdTokenChanged(\n auth: Auth,\n nextOrObserver: NextOrObserver<User>,\n error?: ErrorFn,\n completed?: CompleteFn\n): Unsubscribe {\n return getModularInstance(auth).onIdTokenChanged(\n nextOrObserver,\n error,\n completed\n );\n}\n/**\n * Adds an observer for changes to the user's sign-in state.\n *\n * @remarks\n * To keep the old behavior, see {@link onIdTokenChanged}.\n *\n * @param auth - The Auth instance.\n * @param nextOrObserver - callback triggered on change.\n * @param error - callback triggered on error.\n * @param completed - callback triggered when observer is removed.\n *\n * @public\n */\nexport function onAuthStateChanged(\n auth: Auth,\n nextOrObserver: NextOrObserver<User>,\n error?: ErrorFn,\n completed?: CompleteFn\n): Unsubscribe {\n return getModularInstance(auth).onAuthStateChanged(\n nextOrObserver,\n error,\n completed\n );\n}\n/**\n * Sets the current language to the default device/browser preference.\n *\n * @param auth - The Auth instanec.\n *\n * @public\n */\nexport function useDeviceLanguage(auth: Auth): void {\n getModularInstance(auth).useDeviceLanguage();\n}\n/**\n * Asynchronously sets the provided user as {@link Auth.currentUser} on the\n * {@link Auth} instance.\n *\n * @remarks\n * A new instance copy of the user provided will be made and set as currentUser.\n *\n * This will trigger {@link onAuthStateChanged} and {@link onIdTokenChanged} listeners\n * like other sign in methods.\n *\n * The operation fails with an error if the user to be updated belongs to a different Firebase\n * project.\n *\n * @param auth - The Auth instance.\n * @param user - The new {@link User}.\n *\n * @public\n */\nexport function updateCurrentUser(\n auth: Auth,\n user: User | null\n): Promise<void> {\n return getModularInstance(auth).updateCurrentUser(user);\n}\n/**\n * Signs out the current user.\n *\n * @param auth - The Auth instance.\n *\n * @public\n */\nexport function signOut(auth: Auth): Promise<void> {\n return getModularInstance(auth).signOut();\n}\n\nexport { initializeAuth } from './auth/initialize';\nexport { connectAuthEmulator } from './auth/emulator';\n\n// credentials\nexport { AuthCredential } from './credentials';\nexport { EmailAuthCredential } from './credentials/email';\nexport { OAuthCredential } from './credentials/oauth';\nexport { PhoneAuthCredential } from './credentials/phone';\n\n// persistence\nexport { inMemoryPersistence } from './persistence/in_memory';\n\n// providers\nexport { EmailAuthProvider } from './providers/email';\nexport { FacebookAuthProvider } from './providers/facebook';\nexport { CustomParameters } from './providers/federated';\nexport { GoogleAuthProvider } from './providers/google';\nexport { GithubAuthProvider } from './providers/github';\nexport { OAuthProvider, OAuthCredentialOptions } from './providers/oauth';\nexport { SAMLAuthProvider } from './providers/saml';\nexport { TwitterAuthProvider } from './providers/twitter';\n\n// strategies\nexport { signInAnonymously } from './strategies/anonymous';\nexport {\n signInWithCredential,\n linkWithCredential,\n reauthenticateWithCredential\n} from './strategies/credential';\nexport { signInWithCustomToken } from './strategies/custom_token';\nexport {\n sendPasswordResetEmail,\n confirmPasswordReset,\n applyActionCode,\n checkActionCode,\n verifyPasswordResetCode,\n createUserWithEmailAndPassword,\n signInWithEmailAndPassword\n} from './strategies/email_and_password';\nexport {\n sendSignInLinkToEmail,\n isSignInWithEmailLink,\n signInWithEmailLink\n} from './strategies/email_link';\nexport {\n fetchSignInMethodsForEmail,\n sendEmailVerification,\n verifyBeforeUpdateEmail\n} from './strategies/email';\n\n// core\nexport { ActionCodeURL, parseActionCodeURL } from './action_code_url';\n\n// user\nexport {\n updateProfile,\n updateEmail,\n updatePassword\n} from './user/account_info';\nexport { getIdToken, getIdTokenResult } from './user/id_token_result';\nexport { unlink } from './user/link_unlink';\nexport { getAdditionalUserInfo } from './user/additional_user_info';\n\n// Non-optional user methods.\nexport { reload } from './user/reload';\n/**\n * Deletes and signs out the user.\n *\n * @remarks\n * Important: this is a security-sensitive operation that requires the user to have recently\n * signed in. If this requirement isn't met, ask the user to authenticate again and then call\n * {@link reauthenticateWithCredential}.\n *\n * @param user - The user.\n *\n * @public\n */\nexport async function deleteUser(user: User): Promise<void> {\n return getModularInstance(user).delete();\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { MultiFactorSession } from '../model/public_types';\n\nexport const enum MultiFactorSessionType {\n ENROLL = 'enroll',\n SIGN_IN = 'signin'\n}\n\ninterface SerializedMultiFactorSession {\n multiFactorSession: {\n idToken?: string;\n pendingCredential?: string;\n };\n}\n\nexport class MultiFactorSessionImpl implements MultiFactorSession {\n private constructor(\n readonly type: MultiFactorSessionType,\n readonly credential: string\n ) {}\n\n static _fromIdtoken(idToken: string): MultiFactorSessionImpl {\n return new MultiFactorSessionImpl(MultiFactorSessionType.ENROLL, idToken);\n }\n\n static _fromMfaPendingCredential(\n mfaPendingCredential: string\n ): MultiFactorSessionImpl {\n return new MultiFactorSessionImpl(\n MultiFactorSessionType.SIGN_IN,\n mfaPendingCredential\n );\n }\n\n toJSON(): SerializedMultiFactorSession {\n const key =\n this.type === MultiFactorSessionType.ENROLL\n ? 'idToken'\n : 'pendingCredential';\n return {\n multiFactorSession: {\n [key]: this.credential\n }\n };\n }\n\n static fromJSON(\n obj: Partial<SerializedMultiFactorSession>\n ): MultiFactorSessionImpl | null {\n if (obj?.multiFactorSession) {\n if (obj.multiFactorSession?.pendingCredential) {\n return MultiFactorSessionImpl._fromMfaPendingCredential(\n obj.multiFactorSession.pendingCredential\n );\n } else if (obj.multiFactorSession?.idToken) {\n return MultiFactorSessionImpl._fromIdtoken(\n obj.multiFactorSession.idToken\n );\n }\n }\n return null;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Auth,\n MultiFactorResolver,\n OperationType,\n UserCredential,\n MultiFactorError\n} from '../model/public_types';\n\nimport { _castAuth } from '../core/auth/auth_impl';\nimport { AuthErrorCode } from '../core/errors';\nimport { UserCredentialImpl } from '../core/user/user_credential_impl';\nimport { _assert, _fail } from '../core/util/assert';\nimport { UserCredentialInternal } from '../model/user';\nimport { MultiFactorAssertionImpl } from './mfa_assertion';\nimport { MultiFactorError as MultiFactorErrorInternal } from './mfa_error';\nimport { MultiFactorInfoImpl } from './mfa_info';\nimport { MultiFactorSessionImpl } from './mfa_session';\nimport { getModularInstance } from '@firebase/util';\n\nexport class MultiFactorResolverImpl implements MultiFactorResolver {\n private constructor(\n readonly session: MultiFactorSessionImpl,\n readonly hints: MultiFactorInfoImpl[],\n private readonly signInResolver: (\n assertion: MultiFactorAssertionImpl\n ) => Promise<UserCredentialInternal>\n ) {}\n\n /** @internal */\n static _fromError(\n authExtern: Auth,\n error: MultiFactorErrorInternal\n ): MultiFactorResolverImpl {\n const auth = _castAuth(authExtern);\n const hints = (error.serverResponse.mfaInfo || []).map(enrollment =>\n MultiFactorInfoImpl._fromServerResponse(auth, enrollment)\n );\n\n _assert(\n error.serverResponse.mfaPendingCredential,\n auth,\n AuthErrorCode.INTERNAL_ERROR\n );\n const session = MultiFactorSessionImpl._fromMfaPendingCredential(\n error.serverResponse.mfaPendingCredential\n );\n\n return new MultiFactorResolverImpl(\n session,\n hints,\n async (\n assertion: MultiFactorAssertionImpl\n ): Promise<UserCredentialInternal> => {\n const mfaResponse = await assertion._process(auth, session);\n // Clear out the unneeded fields from the old login response\n delete error.serverResponse.mfaInfo;\n delete error.serverResponse.mfaPendingCredential;\n\n // Use in the new token & refresh token in the old response\n const idTokenResponse = {\n ...error.serverResponse,\n idToken: mfaResponse.idToken,\n refreshToken: mfaResponse.refreshToken\n };\n\n // TODO: we should collapse this switch statement into UserCredentialImpl._forOperation and have it support the SIGN_IN case\n switch (error.operationType) {\n case OperationType.SIGN_IN:\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(\n auth,\n error.operationType,\n idTokenResponse\n );\n await auth._updateCurrentUser(userCredential.user);\n return userCredential;\n case OperationType.REAUTHENTICATE:\n _assert(error.user, auth, AuthErrorCode.INTERNAL_ERROR);\n return UserCredentialImpl._forOperation(\n error.user,\n error.operationType,\n idTokenResponse\n );\n default:\n _fail(auth, AuthErrorCode.INTERNAL_ERROR);\n }\n }\n );\n }\n\n async resolveSignIn(\n assertionExtern: MultiFactorAssertionImpl\n ): Promise<UserCredential> {\n const assertion = assertionExtern as MultiFactorAssertionImpl;\n return this.signInResolver(assertion);\n }\n}\n\n/**\n * Provides a {@link MultiFactorResolver} suitable for completion of a\n * multi-factor flow.\n *\n * @param auth - The auth instance.\n * @param error - The {@link MultiFactorError} raised during a sign-in, or\n * reauthentication operation.\n *\n * @public\n */\nexport function getMultiFactorResolver(\n auth: Auth,\n error: MultiFactorError\n): MultiFactorResolver {\n const authModular = getModularInstance(auth);\n const errorInternal = error as MultiFactorErrorInternal;\n _assert(error.operationType, authModular, AuthErrorCode.ARGUMENT_ERROR);\n _assert(\n errorInternal.serverResponse?.mfaPendingCredential,\n authModular,\n AuthErrorCode.ARGUMENT_ERROR\n );\n\n return MultiFactorResolverImpl._fromError(authModular, errorInternal);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Endpoint, HttpMethod, _performApiRequest } from '../index';\nimport { SignInWithPhoneNumberRequest } from '../authentication/sms';\nimport { FinalizeMfaResponse } from '../authentication/mfa';\nimport { AuthInternal } from '../../model/auth';\n\n/**\n * MFA Info as returned by the API\n */\ninterface BaseMfaEnrollment {\n mfaEnrollmentId: string;\n enrolledAt: number;\n displayName?: string;\n}\n\n/**\n * An MFA provided by SMS verification\n */\nexport interface PhoneMfaEnrollment extends BaseMfaEnrollment {\n phoneInfo: string;\n}\n\n/**\n * MfaEnrollment can be any subtype of BaseMfaEnrollment, currently only PhoneMfaEnrollment is supported\n */\nexport type MfaEnrollment = PhoneMfaEnrollment;\n\nexport interface StartPhoneMfaEnrollmentRequest {\n idToken: string;\n phoneEnrollmentInfo: {\n phoneNumber: string;\n recaptchaToken: string;\n };\n tenantId: string | null;\n}\n\nexport interface StartPhoneMfaEnrollmentResponse {\n phoneSessionInfo: {\n sessionInfo: string;\n };\n}\n\nexport function startEnrollPhoneMfa(\n auth: AuthInternal,\n request: Omit<StartPhoneMfaEnrollmentRequest, 'tenantId'>\n): Promise<StartPhoneMfaEnrollmentResponse> {\n return _performApiRequest<\n StartPhoneMfaEnrollmentRequest,\n StartPhoneMfaEnrollmentResponse\n >(auth, HttpMethod.POST, Endpoint.START_PHONE_MFA_ENROLLMENT, {\n tenantId: auth.tenantId,\n ...request\n });\n}\n\nexport interface FinalizePhoneMfaEnrollmentRequest {\n idToken: string;\n phoneVerificationInfo: SignInWithPhoneNumberRequest;\n displayName?: string | null;\n tenantId: string | null;\n}\n\nexport interface FinalizePhoneMfaEnrollmentResponse\n extends FinalizeMfaResponse {}\n\nexport function finalizeEnrollPhoneMfa(\n auth: AuthInternal,\n request: Omit<FinalizePhoneMfaEnrollmentRequest, 'tenantId'>\n): Promise<FinalizePhoneMfaEnrollmentResponse> {\n return _performApiRequest<\n FinalizePhoneMfaEnrollmentRequest,\n FinalizePhoneMfaEnrollmentResponse\n >(auth, HttpMethod.POST, Endpoint.FINALIZE_PHONE_MFA_ENROLLMENT, {\n tenantId: auth.tenantId,\n ...request\n });\n}\n\nexport interface WithdrawMfaRequest {\n idToken: string;\n mfaEnrollmentId: string;\n tenantId: string | null;\n}\n\nexport interface WithdrawMfaResponse extends FinalizeMfaResponse {}\n\nexport function withdrawMfa(\n auth: AuthInternal,\n request: Omit<WithdrawMfaRequest, 'tenantId'>\n): Promise<WithdrawMfaResponse> {\n return _performApiRequest<WithdrawMfaRequest, WithdrawMfaResponse>(\n auth,\n HttpMethod.POST,\n Endpoint.WITHDRAW_MFA,\n {\n tenantId: auth.tenantId,\n ...request\n }\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n MultiFactorAssertion,\n MultiFactorInfo,\n MultiFactorSession,\n MultiFactorUser,\n User\n} from '../model/public_types';\n\nimport { withdrawMfa } from '../api/account_management/mfa';\nimport { AuthErrorCode } from '../core/errors';\nimport { _logoutIfInvalidated } from '../core/user/invalidation';\nimport { UserInternal } from '../model/user';\nimport { MultiFactorAssertionImpl } from './mfa_assertion';\nimport { MultiFactorInfoImpl } from './mfa_info';\nimport { MultiFactorSessionImpl } from './mfa_session';\nimport { getModularInstance } from '@firebase/util';\n\nexport class MultiFactorUserImpl implements MultiFactorUser {\n enrolledFactors: MultiFactorInfo[] = [];\n\n private constructor(readonly user: UserInternal) {\n user._onReload(userInfo => {\n if (userInfo.mfaInfo) {\n this.enrolledFactors = userInfo.mfaInfo.map(enrollment =>\n MultiFactorInfoImpl._fromServerResponse(user.auth, enrollment)\n );\n }\n });\n }\n\n static _fromUser(user: UserInternal): MultiFactorUserImpl {\n return new MultiFactorUserImpl(user);\n }\n\n async getSession(): Promise<MultiFactorSession> {\n return MultiFactorSessionImpl._fromIdtoken(await this.user.getIdToken());\n }\n\n async enroll(\n assertionExtern: MultiFactorAssertion,\n displayName?: string | null\n ): Promise<void> {\n const assertion = assertionExtern as MultiFactorAssertionImpl;\n const session = (await this.getSession()) as MultiFactorSessionImpl;\n const finalizeMfaResponse = await _logoutIfInvalidated(\n this.user,\n assertion._process(this.user.auth, session, displayName)\n );\n // New tokens will be issued after enrollment of the new second factors.\n // They need to be updated on the user.\n await this.user._updateTokensIfNecessary(finalizeMfaResponse);\n // The user needs to be reloaded to get the new multi-factor information\n // from server. USER_RELOADED event will be triggered and `enrolledFactors`\n // will be updated.\n return this.user.reload();\n }\n\n async unenroll(infoOrUid: MultiFactorInfo | string): Promise<void> {\n const mfaEnrollmentId =\n typeof infoOrUid === 'string' ? infoOrUid : infoOrUid.uid;\n const idToken = await this.user.getIdToken();\n const idTokenResponse = await _logoutIfInvalidated(\n this.user,\n withdrawMfa(this.user.auth, {\n idToken,\n mfaEnrollmentId\n })\n );\n // Remove the second factor from the user's list.\n this.enrolledFactors = this.enrolledFactors.filter(\n ({ uid }) => uid !== mfaEnrollmentId\n );\n // Depending on whether the backend decided to revoke the user's session,\n // the tokenResponse may be empty. If the tokens were not updated (and they\n // are now invalid), reloading the user will discover this and invalidate\n // the user's state accordingly.\n await this.user._updateTokensIfNecessary(idTokenResponse);\n try {\n await this.user.reload();\n } catch (e) {\n if (e.code !== `auth/${AuthErrorCode.TOKEN_EXPIRED}`) {\n throw e;\n }\n }\n }\n}\n\nconst multiFactorUserCache = new WeakMap<User, MultiFactorUser>();\n\n/**\n * The {@link MultiFactorUser} corresponding to the user.\n *\n * @remarks\n * This is used to access all multi-factor properties and operations related to the user.\n *\n * @param user - The user.\n *\n * @public\n */\nexport function multiFactor(user: User): MultiFactorUser {\n const userModular = getModularInstance(user);\n if (!multiFactorUserCache.has(userModular)) {\n multiFactorUserCache.set(\n userModular,\n MultiFactorUserImpl._fromUser(userModular as UserInternal)\n );\n }\n return multiFactorUserCache.get(userModular)!;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Unsubscribe } from '@firebase/util';\nimport { FirebaseAuthInternal } from '@firebase/auth-interop-types';\n\nimport { AuthInternal } from '../../model/auth';\nimport { UserInternal } from '../../model/user';\nimport { _assert } from '../util/assert';\nimport { AuthErrorCode } from '../errors';\n\ninterface TokenListener {\n (tok: string | null): unknown;\n}\n\nexport class AuthInterop implements FirebaseAuthInternal {\n private readonly internalListeners: Map<\n TokenListener,\n Unsubscribe\n > = new Map();\n\n constructor(private readonly auth: AuthInternal) {}\n\n getUid(): string | null {\n this.assertAuthConfigured();\n return this.auth.currentUser?.uid || null;\n }\n\n async getToken(\n forceRefresh?: boolean\n ): Promise<{ accessToken: string } | null> {\n this.assertAuthConfigured();\n await this.auth._initializationPromise;\n if (!this.auth.currentUser) {\n return null;\n }\n\n const accessToken = await this.auth.currentUser.getIdToken(forceRefresh);\n return { accessToken };\n }\n\n addAuthTokenListener(listener: TokenListener): void {\n this.assertAuthConfigured();\n if (this.internalListeners.has(listener)) {\n return;\n }\n\n const unsubscribe = this.auth.onIdTokenChanged(user => {\n listener(\n (user as UserInternal | null)?.stsTokenManager.accessToken || null\n );\n });\n this.internalListeners.set(listener, unsubscribe);\n this.updateProactiveRefresh();\n }\n\n removeAuthTokenListener(listener: TokenListener): void {\n this.assertAuthConfigured();\n const unsubscribe = this.internalListeners.get(listener);\n if (!unsubscribe) {\n return;\n }\n\n this.internalListeners.delete(listener);\n unsubscribe();\n this.updateProactiveRefresh();\n }\n\n private assertAuthConfigured(): void {\n _assert(\n this.auth._initializationPromise,\n AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH\n );\n }\n\n private updateProactiveRefresh(): void {\n if (this.internalListeners.size > 0) {\n this.auth._startProactiveRefresh();\n } else {\n this.auth._stopProactiveRefresh();\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _registerComponent, registerVersion } from '@firebase/app-exp';\nimport {\n Component,\n ComponentType,\n InstantiationMode\n} from '@firebase/component';\n\nimport { name, version } from '../../../package.json';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from '../util/assert';\nimport { _getClientVersion, ClientPlatform } from '../util/version';\nimport { _castAuth, AuthImpl, DefaultConfig } from './auth_impl';\nimport { AuthInterop } from './firebase_internal';\nimport { ConfigInternal } from '../../model/auth';\nimport { Dependencies } from '../../model/public_types';\nimport { _initializeAuthInstance } from './initialize';\n\nexport const enum _ComponentName {\n AUTH = 'auth-exp',\n AUTH_INTERNAL = 'auth-internal'\n}\n\nfunction getVersionForPlatform(\n clientPlatform: ClientPlatform\n): string | undefined {\n switch (clientPlatform) {\n case ClientPlatform.NODE:\n return 'node';\n case ClientPlatform.REACT_NATIVE:\n return 'rn';\n case ClientPlatform.WORKER:\n return 'webworker';\n case ClientPlatform.CORDOVA:\n return 'cordova';\n default:\n return undefined;\n }\n}\n\n/** @internal */\nexport function registerAuth(clientPlatform: ClientPlatform): void {\n _registerComponent(\n new Component(\n _ComponentName.AUTH,\n (container, { options: deps }: { options?: Dependencies }) => {\n const app = container.getProvider('app-exp').getImmediate()!;\n const { apiKey, authDomain } = app.options;\n return (app => {\n _assert(\n apiKey && !apiKey.includes(':'),\n AuthErrorCode.INVALID_API_KEY,\n { appName: app.name }\n );\n // Auth domain is optional if IdP sign in isn't being used\n _assert(!authDomain?.includes(':'), AuthErrorCode.ARGUMENT_ERROR, {\n appName: app.name\n });\n const config: ConfigInternal = {\n apiKey,\n authDomain,\n clientPlatform,\n apiHost: DefaultConfig.API_HOST,\n tokenApiHost: DefaultConfig.TOKEN_API_HOST,\n apiScheme: DefaultConfig.API_SCHEME,\n sdkClientVersion: _getClientVersion(clientPlatform)\n };\n\n const authInstance = new AuthImpl(app, config);\n _initializeAuthInstance(authInstance, deps);\n\n return authInstance;\n })(app);\n },\n ComponentType.PUBLIC\n )\n /**\n * Auth can only be initialized by explicitly calling getAuth() or initializeAuth()\n * For why we do this, See go/firebase-next-auth-init\n */\n .setInstantiationMode(InstantiationMode.EXPLICIT)\n /**\n * Because all firebase products that depend on auth depend on auth-internal directly,\n * we need to initialize auth-internal after auth is initialized to make it available to other firebase products.\n */\n .setInstanceCreatedCallback(\n (container, _instanceIdentifier, _instance) => {\n const authInternalProvider = container.getProvider(\n _ComponentName.AUTH_INTERNAL\n );\n authInternalProvider.initialize();\n }\n )\n );\n\n _registerComponent(\n new Component(\n _ComponentName.AUTH_INTERNAL,\n container => {\n const auth = _castAuth(\n container.getProvider(_ComponentName.AUTH).getImmediate()!\n );\n return (auth => new AuthInterop(auth))(auth);\n },\n ComponentType.PRIVATE\n ).setInstantiationMode(InstantiationMode.EXPLICIT)\n );\n\n registerVersion(name, version, getVersionForPlatform(clientPlatform));\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Persistence } from '../../model/public_types';\n\nexport const enum PersistenceType {\n SESSION = 'SESSION',\n LOCAL = 'LOCAL',\n NONE = 'NONE'\n}\n\nexport type PersistedBlob = Record<string, unknown>;\n\nexport interface Instantiator<T> {\n (blob: PersistedBlob): T;\n}\n\nexport type PersistenceValue = PersistedBlob | string;\n\nexport const STORAGE_AVAILABLE_KEY = '__sak';\n\nexport interface StorageEventListener {\n (value: PersistenceValue | null): void;\n}\n\nexport interface PersistenceInternal extends Persistence {\n type: PersistenceType;\n _isAvailable(): Promise<boolean>;\n _set(key: string, value: PersistenceValue): Promise<void>;\n _get<T extends PersistenceValue>(key: string): Promise<T | null>;\n _remove(key: string): Promise<void>;\n _addListener(key: string, listener: StorageEventListener): void;\n _removeListener(key: string, listener: StorageEventListener): void;\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n PersistenceValue,\n STORAGE_AVAILABLE_KEY,\n PersistenceType\n} from '../../core/persistence';\n\n// There are two different browser persistence types: local and session.\n// Both have the same implementation but use a different underlying storage\n// object.\n\nexport abstract class BrowserPersistenceClass {\n protected constructor(\n protected readonly storage: Storage,\n readonly type: PersistenceType\n ) {}\n\n _isAvailable(this: BrowserPersistenceClass): Promise<boolean> {\n try {\n if (!this.storage) {\n return Promise.resolve(false);\n }\n this.storage.setItem(STORAGE_AVAILABLE_KEY, '1');\n this.storage.removeItem(STORAGE_AVAILABLE_KEY);\n return Promise.resolve(true);\n } catch {\n return Promise.resolve(false);\n }\n }\n\n _set(key: string, value: PersistenceValue): Promise<void> {\n this.storage.setItem(key, JSON.stringify(value));\n return Promise.resolve();\n }\n\n _get<T extends PersistenceValue>(key: string): Promise<T | null> {\n const json = this.storage.getItem(key);\n return Promise.resolve(json ? JSON.parse(json) : null);\n }\n\n _remove(key: string): Promise<void> {\n this.storage.removeItem(key);\n return Promise.resolve();\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Persistence } from '../../model/public_types';\n\nimport { getUA } from '@firebase/util';\nimport {\n _isSafari,\n _isIOS,\n _isIframe,\n _isMobileBrowser,\n _isIE10\n} from '../../core/util/browser';\nimport {\n PersistenceInternal as InternalPersistence,\n PersistenceType,\n PersistenceValue,\n StorageEventListener\n} from '../../core/persistence';\nimport { BrowserPersistenceClass } from './browser';\n\nfunction _iframeCannotSyncWebStorage(): boolean {\n const ua = getUA();\n return _isSafari(ua) || _isIOS(ua);\n}\n\n// The polling period in case events are not supported\nexport const _POLLING_INTERVAL_MS = 1000;\n\n// The IE 10 localStorage cross tab synchronization delay in milliseconds\nconst IE10_LOCAL_STORAGE_SYNC_DELAY = 10;\n\nclass BrowserLocalPersistence\n extends BrowserPersistenceClass\n implements InternalPersistence {\n static type: 'LOCAL' = 'LOCAL';\n\n constructor() {\n super(window.localStorage, PersistenceType.LOCAL);\n this.boundEventHandler = this.onStorageEvent.bind(this);\n }\n\n private readonly boundEventHandler: (\n event: StorageEvent,\n poll?: boolean\n ) => void;\n private readonly listeners: Record<string, Set<StorageEventListener>> = {};\n private readonly localCache: Record<string, string | null> = {};\n // setTimeout return value is platform specific\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private pollTimer: any | null = null;\n\n // Safari or iOS browser and embedded in an iframe.\n private readonly safariLocalStorageNotSynced =\n _iframeCannotSyncWebStorage() && _isIframe();\n // Whether to use polling instead of depending on window events\n private readonly fallbackToPolling = _isMobileBrowser();\n\n private forAllChangedKeys(\n cb: (key: string, oldValue: string | null, newValue: string | null) => void\n ): void {\n // Check all keys with listeners on them.\n for (const key of Object.keys(this.listeners)) {\n // Get value from localStorage.\n const newValue = this.storage.getItem(key);\n const oldValue = this.localCache[key];\n // If local map value does not match, trigger listener with storage event.\n // Differentiate this simulated event from the real storage event.\n if (newValue !== oldValue) {\n cb(key, oldValue, newValue);\n }\n }\n }\n\n private onStorageEvent(event: StorageEvent, poll: boolean = false): void {\n // Key would be null in some situations, like when localStorage is cleared\n if (!event.key) {\n this.forAllChangedKeys(\n (key: string, _oldValue: string | null, newValue: string | null) => {\n this.notifyListeners(key, newValue);\n }\n );\n return;\n }\n\n const key = event.key;\n\n // Check the mechanism how this event was detected.\n // The first event will dictate the mechanism to be used.\n if (poll) {\n // Environment detects storage changes via polling.\n // Remove storage event listener to prevent possible event duplication.\n this.detachListener();\n } else {\n // Environment detects storage changes via storage event listener.\n // Remove polling listener to prevent possible event duplication.\n this.stopPolling();\n }\n\n // Safari embedded iframe. Storage event will trigger with the delta\n // changes but no changes will be applied to the iframe localStorage.\n if (this.safariLocalStorageNotSynced) {\n // Get current iframe page value.\n const storedValue = this.storage.getItem(key);\n // Value not synchronized, synchronize manually.\n if (event.newValue !== storedValue) {\n if (event.newValue !== null) {\n // Value changed from current value.\n this.storage.setItem(key, event.newValue);\n } else {\n // Current value deleted.\n this.storage.removeItem(key);\n }\n } else if (this.localCache[key] === event.newValue && !poll) {\n // Already detected and processed, do not trigger listeners again.\n return;\n }\n }\n\n const triggerListeners = (): void => {\n // Keep local map up to date in case storage event is triggered before\n // poll.\n const storedValue = this.storage.getItem(key);\n if (!poll && this.localCache[key] === storedValue) {\n // Real storage event which has already been detected, do nothing.\n // This seems to trigger in some IE browsers for some reason.\n return;\n }\n this.notifyListeners(key, storedValue);\n };\n\n const storedValue = this.storage.getItem(key);\n if (\n _isIE10() &&\n storedValue !== event.newValue &&\n event.newValue !== event.oldValue\n ) {\n // IE 10 has this weird bug where a storage event would trigger with the\n // correct key, oldValue and newValue but localStorage.getItem(key) does\n // not yield the updated value until a few milliseconds. This ensures\n // this recovers from that situation.\n setTimeout(triggerListeners, IE10_LOCAL_STORAGE_SYNC_DELAY);\n } else {\n triggerListeners();\n }\n }\n\n private notifyListeners(key: string, value: string | null): void {\n this.localCache[key] = value;\n const listeners = this.listeners[key];\n if (listeners) {\n for (const listener of Array.from(listeners)) {\n listener(value ? JSON.parse(value) : value);\n }\n }\n }\n\n private startPolling(): void {\n this.stopPolling();\n\n this.pollTimer = setInterval(() => {\n this.forAllChangedKeys(\n (key: string, oldValue: string | null, newValue: string | null) => {\n this.onStorageEvent(\n new StorageEvent('storage', {\n key,\n oldValue,\n newValue\n }),\n /* poll */ true\n );\n }\n );\n }, _POLLING_INTERVAL_MS);\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n }\n\n private attachListener(): void {\n window.addEventListener('storage', this.boundEventHandler);\n }\n\n private detachListener(): void {\n window.removeEventListener('storage', this.boundEventHandler);\n }\n\n _addListener(key: string, listener: StorageEventListener): void {\n if (Object.keys(this.listeners).length === 0) {\n // Whether browser can detect storage event when it had already been pushed to the background.\n // This may happen in some mobile browsers. A localStorage change in the foreground window\n // will not be detected in the background window via the storage event.\n // This was detected in iOS 7.x mobile browsers\n if (this.fallbackToPolling) {\n this.startPolling();\n } else {\n this.attachListener();\n }\n }\n if (!this.listeners[key]) {\n this.listeners[key] = new Set();\n // Populate the cache to avoid spuriously triggering on first poll.\n this.localCache[key] = this.storage.getItem(key);\n }\n this.listeners[key].add(listener);\n }\n\n _removeListener(key: string, listener: StorageEventListener): void {\n if (this.listeners[key]) {\n this.listeners[key].delete(listener);\n\n if (this.listeners[key].size === 0) {\n delete this.listeners[key];\n }\n }\n\n if (Object.keys(this.listeners).length === 0) {\n this.detachListener();\n this.stopPolling();\n }\n }\n\n // Update local cache on base operations:\n\n async _set(key: string, value: PersistenceValue): Promise<void> {\n await super._set(key, value);\n this.localCache[key] = JSON.stringify(value);\n }\n\n async _get<T extends PersistenceValue>(key: string): Promise<T | null> {\n const value = await super._get<T>(key);\n this.localCache[key] = JSON.stringify(value);\n return value;\n }\n\n async _remove(key: string): Promise<void> {\n await super._remove(key);\n delete this.localCache[key];\n }\n}\n\n/**\n * An implementation of {@link Persistence} of type 'LOCAL' using `localStorage`\n * for the underlying storage.\n *\n * @public\n */\nexport const browserLocalPersistence: Persistence = BrowserLocalPersistence;\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** TODO: remove this once tslib has a polyfill for Promise.allSettled */\ninterface PromiseFulfilledResult<T> {\n fulfilled: true;\n value: T;\n}\n\ninterface PromiseRejectedResult {\n fulfilled: false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reason: any;\n}\n\nexport type PromiseSettledResult<T> =\n | PromiseFulfilledResult<T>\n | PromiseRejectedResult;\n\n/**\n * Shim for Promise.allSettled, note the slightly different format of `fulfilled` vs `status`.\n *\n * @param promises - Array of promises to wait on.\n */\nexport function _allSettled<T>(\n promises: Array<Promise<T>>\n): Promise<Array<PromiseSettledResult<T>>> {\n return Promise.all(\n promises.map(async promise => {\n try {\n const value = await promise;\n return {\n fulfilled: true,\n value\n } as PromiseFulfilledResult<T>;\n } catch (reason) {\n return {\n fulfilled: false,\n reason\n } as PromiseRejectedResult;\n }\n })\n );\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ReceiverHandler,\n _EventType,\n _ReceiverResponse,\n SenderMessageEvent,\n _Status,\n _SenderRequest\n} from './index';\nimport { _allSettled } from './promise';\n\n/**\n * Interface class for receiving messages.\n *\n */\nexport class Receiver {\n private static readonly receivers: Receiver[] = [];\n private readonly boundEventHandler: EventListener;\n\n private readonly handlersMap: {\n // Typescript doesn't have existential types :(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [eventType: string]: Set<ReceiverHandler<any, any>>;\n } = {};\n\n constructor(private readonly eventTarget: EventTarget) {\n this.boundEventHandler = this.handleEvent.bind(this);\n }\n\n /**\n * Obtain an instance of a Receiver for a given event target, if none exists it will be created.\n *\n * @param eventTarget - An event target (such as window or self) through which the underlying\n * messages will be received.\n */\n static _getInstance(eventTarget: EventTarget): Receiver {\n // The results are stored in an array since objects can't be keys for other\n // objects. In addition, setting a unique property on an event target as a\n // hash map key may not be allowed due to CORS restrictions.\n const existingInstance = this.receivers.find(receiver =>\n receiver.isListeningto(eventTarget)\n );\n if (existingInstance) {\n return existingInstance;\n }\n const newInstance = new Receiver(eventTarget);\n this.receivers.push(newInstance);\n return newInstance;\n }\n\n private isListeningto(eventTarget: EventTarget): boolean {\n return this.eventTarget === eventTarget;\n }\n\n /**\n * Fans out a MessageEvent to the appropriate listeners.\n *\n * @remarks\n * Sends an {@link Status.ACK} upon receipt and a {@link Status.DONE} once all handlers have\n * finished processing.\n *\n * @param event - The MessageEvent.\n *\n */\n private async handleEvent<\n T extends _ReceiverResponse,\n S extends _SenderRequest\n >(event: Event): Promise<void> {\n const messageEvent = event as MessageEvent<SenderMessageEvent<S>>;\n const { eventId, eventType, data } = messageEvent.data;\n\n const handlers: Set<ReceiverHandler<T, S>> | undefined = this.handlersMap[\n eventType\n ];\n if (!handlers?.size) {\n return;\n }\n\n messageEvent.ports[0].postMessage({\n status: _Status.ACK,\n eventId,\n eventType\n });\n\n const promises = Array.from(handlers).map(async handler =>\n handler(messageEvent.origin, data)\n );\n const response = await _allSettled(promises);\n messageEvent.ports[0].postMessage({\n status: _Status.DONE,\n eventId,\n eventType,\n response\n });\n }\n\n /**\n * Subscribe an event handler for a particular event.\n *\n * @param eventType - Event name to subscribe to.\n * @param eventHandler - The event handler which should receive the events.\n *\n */\n _subscribe<T extends _ReceiverResponse, S extends _SenderRequest>(\n eventType: _EventType,\n eventHandler: ReceiverHandler<T, S>\n ): void {\n if (Object.keys(this.handlersMap).length === 0) {\n this.eventTarget.addEventListener('message', this.boundEventHandler);\n }\n\n if (!this.handlersMap[eventType]) {\n this.handlersMap[eventType] = new Set();\n }\n\n this.handlersMap[eventType].add(eventHandler);\n }\n\n /**\n * Unsubscribe an event handler from a particular event.\n *\n * @param eventType - Event name to unsubscribe from.\n * @param eventHandler - Optinoal event handler, if none provided, unsubscribe all handlers on this event.\n *\n */\n _unsubscribe<T extends _ReceiverResponse, S extends _SenderRequest>(\n eventType: _EventType,\n eventHandler?: ReceiverHandler<T, S>\n ): void {\n if (this.handlersMap[eventType] && eventHandler) {\n this.handlersMap[eventType].delete(eventHandler);\n }\n if (!eventHandler || this.handlersMap[eventType].size === 0) {\n delete this.handlersMap[eventType];\n }\n\n if (Object.keys(this.handlersMap).length === 0) {\n this.eventTarget.removeEventListener('message', this.boundEventHandler);\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function _generateEventId(prefix = '', digits = 10): string {\n let random = '';\n for (let i = 0; i < digits; i++) {\n random += Math.floor(Math.random() * 10);\n }\n return prefix + random;\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _generateEventId } from '../../core/util/event_id';\nimport {\n _SenderRequest,\n _EventType,\n ReceiverMessageEvent,\n _MessageError,\n SenderMessageEvent,\n _Status,\n _ReceiverMessageResponse,\n _ReceiverResponse,\n _TimeoutDuration\n} from './index';\n\ninterface MessageHandler {\n messageChannel: MessageChannel;\n onMessage: EventListenerOrEventListenerObject;\n}\n\n/**\n * Interface for sending messages and waiting for a completion response.\n *\n */\nexport class Sender {\n private readonly handlers = new Set<MessageHandler>();\n\n constructor(private readonly target: ServiceWorker) {}\n\n /**\n * Unsubscribe the handler and remove it from our tracking Set.\n *\n * @param handler - The handler to unsubscribe.\n */\n private removeMessageHandler(handler: MessageHandler): void {\n if (handler.messageChannel) {\n handler.messageChannel.port1.removeEventListener(\n 'message',\n handler.onMessage\n );\n handler.messageChannel.port1.close();\n }\n this.handlers.delete(handler);\n }\n\n /**\n * Send a message to the Receiver located at {@link target}.\n *\n * @remarks\n * We'll first wait a bit for an ACK , if we get one we will wait significantly longer until the\n * receiver has had a chance to fully process the event.\n *\n * @param eventType - Type of event to send.\n * @param data - The payload of the event.\n * @param timeout - Timeout for waiting on an ACK from the receiver.\n *\n * @returns An array of settled promises from all the handlers that were listening on the receiver.\n */\n async _send<T extends _ReceiverResponse, S extends _SenderRequest>(\n eventType: _EventType,\n data: S,\n timeout = _TimeoutDuration.ACK\n ): Promise<_ReceiverMessageResponse<T>> {\n const messageChannel =\n typeof MessageChannel !== 'undefined' ? new MessageChannel() : null;\n if (!messageChannel) {\n throw new Error(_MessageError.CONNECTION_UNAVAILABLE);\n }\n // Node timers and browser timers return fundamentally different types.\n // We don't actually care what the value is but TS won't accept unknown and\n // we can't cast properly in both environments.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let completionTimer: any;\n let handler: MessageHandler;\n return new Promise<_ReceiverMessageResponse<T>>((resolve, reject) => {\n const eventId = _generateEventId('', 20);\n messageChannel.port1.start();\n const ackTimer = setTimeout(() => {\n reject(new Error(_MessageError.UNSUPPORTED_EVENT));\n }, timeout);\n handler = {\n messageChannel,\n onMessage(event: Event): void {\n const messageEvent = event as MessageEvent<ReceiverMessageEvent<T>>;\n if (messageEvent.data.eventId !== eventId) {\n return;\n }\n switch (messageEvent.data.status) {\n case _Status.ACK:\n // The receiver should ACK first.\n clearTimeout(ackTimer);\n completionTimer = setTimeout(() => {\n reject(new Error(_MessageError.TIMEOUT));\n }, _TimeoutDuration.COMPLETION);\n break;\n case _Status.DONE:\n // Once the receiver's handlers are finished we will get the results.\n clearTimeout(completionTimer);\n resolve(messageEvent.data.response);\n break;\n default:\n clearTimeout(ackTimer);\n clearTimeout(completionTimer);\n reject(new Error(_MessageError.INVALID_RESPONSE));\n break;\n }\n }\n };\n this.handlers.add(handler);\n messageChannel.port1.addEventListener('message', handler.onMessage);\n this.target.postMessage(\n {\n eventType,\n eventId,\n data\n } as SenderMessageEvent<S>,\n [messageChannel.port2]\n );\n }).finally(() => {\n if (handler) {\n this.removeMessageHandler(handler);\n }\n });\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Recaptcha } from './recaptcha/recaptcha';\n\n/**\n * A specialized window type that melds the normal window type plus the\n * various bits we need. The three different blocks that are &'d together\n * cant be defined in the same block together.\n */\nexport type AuthWindow = {\n // Standard window types\n [T in keyof Window]: Window[T];\n} & {\n // Any known / named properties we want to add\n grecaptcha?: Recaptcha;\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n ___jsl?: Record<string, any>;\n gapi?: typeof gapi;\n} & {\n // A final catch-all for callbacks (which will have random names) that\n // we will stick on the window.\n [callback: string]: (...args: unknown[]) => void;\n};\n\n/**\n * Lazy accessor for window, since the compat layer won't tree shake this out,\n * we need to make sure not to mess with window unless we have to\n */\nexport function _window(): AuthWindow {\n return (window as unknown) as AuthWindow;\n}\n\nexport function _setWindowLocation(url: string): void {\n _window().location.href = url;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _window } from '../auth_window';\n\nexport function _isWorker(): boolean {\n return (\n typeof _window()['WorkerGlobalScope'] !== 'undefined' &&\n typeof _window()['importScripts'] === 'function'\n );\n}\n\nexport async function _getActiveServiceWorker(): Promise<ServiceWorker | null> {\n if (!navigator?.serviceWorker) {\n return null;\n }\n try {\n const registration = await navigator.serviceWorker.ready;\n return registration.active;\n } catch {\n return null;\n }\n}\n\nexport function _getServiceWorkerController(): ServiceWorker | null {\n return navigator?.serviceWorker?.controller || null;\n}\n\nexport function _getWorkerGlobalScope(): ServiceWorker | null {\n return _isWorker() ? ((self as unknown) as ServiceWorker) : null;\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Persistence } from '../../model/public_types';\nimport {\n PersistedBlob,\n PersistenceInternal as InternalPersistence,\n PersistenceType,\n PersistenceValue,\n StorageEventListener,\n STORAGE_AVAILABLE_KEY\n} from '../../core/persistence/';\nimport {\n _EventType,\n _PingResponse,\n KeyChangedResponse,\n KeyChangedRequest,\n PingRequest,\n _TimeoutDuration\n} from '../messagechannel/index';\nimport { Receiver } from '../messagechannel/receiver';\nimport { Sender } from '../messagechannel/sender';\nimport {\n _isWorker,\n _getActiveServiceWorker,\n _getServiceWorkerController,\n _getWorkerGlobalScope\n} from '../util/worker';\n\nexport const DB_NAME = 'firebaseLocalStorageDb';\nconst DB_VERSION = 1;\nconst DB_OBJECTSTORE_NAME = 'firebaseLocalStorage';\nconst DB_DATA_KEYPATH = 'fbase_key';\n\ninterface DBObject {\n [DB_DATA_KEYPATH]: string;\n value: PersistedBlob;\n}\n\n/**\n * Promise wrapper for IDBRequest\n *\n * Unfortunately we can't cleanly extend Promise<T> since promises are not callable in ES6\n *\n */\nclass DBPromise<T> {\n constructor(private readonly request: IDBRequest) {}\n\n toPromise(): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this.request.addEventListener('success', () => {\n resolve(this.request.result);\n });\n this.request.addEventListener('error', () => {\n reject(this.request.error);\n });\n });\n }\n}\n\nfunction getObjectStore(db: IDBDatabase, isReadWrite: boolean): IDBObjectStore {\n return db\n .transaction([DB_OBJECTSTORE_NAME], isReadWrite ? 'readwrite' : 'readonly')\n .objectStore(DB_OBJECTSTORE_NAME);\n}\n\nexport async function _clearDatabase(db: IDBDatabase): Promise<void> {\n const objectStore = getObjectStore(db, true);\n return new DBPromise<void>(objectStore.clear()).toPromise();\n}\n\nexport function _deleteDatabase(): Promise<void> {\n const request = indexedDB.deleteDatabase(DB_NAME);\n return new DBPromise<void>(request).toPromise();\n}\n\nexport function _openDatabase(): Promise<IDBDatabase> {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n return new Promise((resolve, reject) => {\n request.addEventListener('error', () => {\n reject(request.error);\n });\n\n request.addEventListener('upgradeneeded', () => {\n const db = request.result;\n\n try {\n db.createObjectStore(DB_OBJECTSTORE_NAME, { keyPath: DB_DATA_KEYPATH });\n } catch (e) {\n reject(e);\n }\n });\n\n request.addEventListener('success', async () => {\n const db: IDBDatabase = request.result;\n // Strange bug that occurs in Firefox when multiple tabs are opened at the\n // same time. The only way to recover seems to be deleting the database\n // and re-initializing it.\n // https://github.com/firebase/firebase-js-sdk/issues/634\n\n if (!db.objectStoreNames.contains(DB_OBJECTSTORE_NAME)) {\n // Need to close the database or else you get a `blocked` event\n db.close();\n await _deleteDatabase();\n resolve(await _openDatabase());\n } else {\n resolve(db);\n }\n });\n });\n}\n\nexport async function _putObject(\n db: IDBDatabase,\n key: string,\n value: PersistenceValue | string\n): Promise<void> {\n const request = getObjectStore(db, true).put({\n [DB_DATA_KEYPATH]: key,\n value\n });\n return new DBPromise<void>(request).toPromise();\n}\n\nasync function getObject(\n db: IDBDatabase,\n key: string\n): Promise<PersistedBlob | null> {\n const request = getObjectStore(db, false).get(key);\n const data = await new DBPromise<DBObject | undefined>(request).toPromise();\n return data === undefined ? null : data.value;\n}\n\nexport function _deleteObject(db: IDBDatabase, key: string): Promise<void> {\n const request = getObjectStore(db, true).delete(key);\n return new DBPromise<void>(request).toPromise();\n}\n\nexport const _POLLING_INTERVAL_MS = 800;\nexport const _TRANSACTION_RETRY_COUNT = 3;\n\nclass IndexedDBLocalPersistence implements InternalPersistence {\n static type: 'LOCAL' = 'LOCAL';\n\n type = PersistenceType.LOCAL;\n db?: IDBDatabase;\n\n private readonly listeners: Record<string, Set<StorageEventListener>> = {};\n private readonly localCache: Record<string, PersistenceValue | null> = {};\n // setTimeout return value is platform specific\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private pollTimer: any | null = null;\n private pendingWrites = 0;\n\n private receiver: Receiver | null = null;\n private sender: Sender | null = null;\n private serviceWorkerReceiverAvailable = false;\n private activeServiceWorker: ServiceWorker | null = null;\n // Visible for testing only\n readonly _workerInitializationPromise: Promise<void>;\n\n constructor() {\n // Fire & forget the service worker registration as it may never resolve\n this._workerInitializationPromise =\n this.initializeServiceWorkerMessaging().then(\n () => {},\n () => {}\n );\n }\n\n async _openDb(): Promise<IDBDatabase> {\n if (this.db) {\n return this.db;\n }\n this.db = await _openDatabase();\n return this.db;\n }\n\n async _withRetries<T>(op: (db: IDBDatabase) => Promise<T>): Promise<T> {\n let numAttempts = 0;\n\n while (true) {\n try {\n const db = await this._openDb();\n return await op(db);\n } catch (e) {\n if (numAttempts++ > _TRANSACTION_RETRY_COUNT) {\n throw e;\n }\n if (this.db) {\n this.db.close();\n this.db = undefined;\n }\n // TODO: consider adding exponential backoff\n }\n }\n }\n\n /**\n * IndexedDB events do not propagate from the main window to the worker context. We rely on a\n * postMessage interface to send these events to the worker ourselves.\n */\n private async initializeServiceWorkerMessaging(): Promise<void> {\n return _isWorker() ? this.initializeReceiver() : this.initializeSender();\n }\n\n /**\n * As the worker we should listen to events from the main window.\n */\n private async initializeReceiver(): Promise<void> {\n this.receiver = Receiver._getInstance(_getWorkerGlobalScope()!);\n // Refresh from persistence if we receive a KeyChanged message.\n this.receiver._subscribe(\n _EventType.KEY_CHANGED,\n async (_origin: string, data: KeyChangedRequest) => {\n const keys = await this._poll();\n return {\n keyProcessed: keys.includes(data.key)\n };\n }\n );\n // Let the sender know that we are listening so they give us more timeout.\n this.receiver._subscribe(\n _EventType.PING,\n async (_origin: string, _data: PingRequest) => {\n return [_EventType.KEY_CHANGED];\n }\n );\n }\n\n /**\n * As the main window, we should let the worker know when keys change (set and remove).\n *\n * @remarks\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/ready | ServiceWorkerContainer.ready}\n * may not resolve.\n */\n private async initializeSender(): Promise<void> {\n // Check to see if there's an active service worker.\n this.activeServiceWorker = await _getActiveServiceWorker();\n if (!this.activeServiceWorker) {\n return;\n }\n this.sender = new Sender(this.activeServiceWorker);\n // Ping the service worker to check what events they can handle.\n const results = await this.sender._send<_PingResponse, PingRequest>(\n _EventType.PING,\n {},\n _TimeoutDuration.LONG_ACK\n );\n if (!results) {\n return;\n }\n if (\n results[0]?.fulfilled &&\n results[0]?.value.includes(_EventType.KEY_CHANGED)\n ) {\n this.serviceWorkerReceiverAvailable = true;\n }\n }\n\n /**\n * Let the worker know about a changed key, the exact key doesn't technically matter since the\n * worker will just trigger a full sync anyway.\n *\n * @remarks\n * For now, we only support one service worker per page.\n *\n * @param key - Storage key which changed.\n */\n private async notifyServiceWorker(key: string): Promise<void> {\n if (\n !this.sender ||\n !this.activeServiceWorker ||\n _getServiceWorkerController() !== this.activeServiceWorker\n ) {\n return;\n }\n try {\n await this.sender._send<KeyChangedResponse, KeyChangedRequest>(\n _EventType.KEY_CHANGED,\n { key },\n // Use long timeout if receiver has previously responded to a ping from us.\n this.serviceWorkerReceiverAvailable\n ? _TimeoutDuration.LONG_ACK\n : _TimeoutDuration.ACK\n );\n } catch {\n // This is a best effort approach. Ignore errors.\n }\n }\n\n async _isAvailable(): Promise<boolean> {\n try {\n if (!indexedDB) {\n return false;\n }\n const db = await _openDatabase();\n await _putObject(db, STORAGE_AVAILABLE_KEY, '1');\n await _deleteObject(db, STORAGE_AVAILABLE_KEY);\n return true;\n } catch {}\n return false;\n }\n\n private async _withPendingWrite(write: () => Promise<void>): Promise<void> {\n this.pendingWrites++;\n try {\n await write();\n } finally {\n this.pendingWrites--;\n }\n }\n\n async _set(key: string, value: PersistenceValue): Promise<void> {\n return this._withPendingWrite(async () => {\n await this._withRetries((db: IDBDatabase) => _putObject(db, key, value));\n this.localCache[key] = value;\n return this.notifyServiceWorker(key);\n });\n }\n\n async _get<T extends PersistenceValue>(key: string): Promise<T | null> {\n const obj = (await this._withRetries((db: IDBDatabase) =>\n getObject(db, key)\n )) as T;\n this.localCache[key] = obj;\n return obj;\n }\n\n async _remove(key: string): Promise<void> {\n return this._withPendingWrite(async () => {\n await this._withRetries((db: IDBDatabase) => _deleteObject(db, key));\n delete this.localCache[key];\n return this.notifyServiceWorker(key);\n });\n }\n\n private async _poll(): Promise<string[]> {\n // TODO: check if we need to fallback if getAll is not supported\n const result = await this._withRetries((db: IDBDatabase) => {\n const getAllRequest = getObjectStore(db, false).getAll();\n return new DBPromise<DBObject[] | null>(getAllRequest).toPromise();\n });\n\n if (!result) {\n return [];\n }\n\n // If we have pending writes in progress abort, we'll get picked up on the next poll\n if (this.pendingWrites !== 0) {\n return [];\n }\n\n const keys = [];\n const keysInResult = new Set();\n for (const { fbase_key: key, value } of result) {\n keysInResult.add(key);\n if (JSON.stringify(this.localCache[key]) !== JSON.stringify(value)) {\n this.notifyListeners(key, value as PersistenceValue);\n keys.push(key);\n }\n }\n for (const localKey of Object.keys(this.localCache)) {\n if (this.localCache[localKey] && !keysInResult.has(localKey)) {\n // Deleted\n this.notifyListeners(localKey, null);\n keys.push(localKey);\n }\n }\n return keys;\n }\n\n private notifyListeners(\n key: string,\n newValue: PersistenceValue | null\n ): void {\n this.localCache[key] = newValue;\n const listeners = this.listeners[key];\n if (listeners) {\n for (const listener of Array.from(listeners)) {\n listener(newValue);\n }\n }\n }\n\n private startPolling(): void {\n this.stopPolling();\n\n this.pollTimer = setInterval(\n async () => this._poll(),\n _POLLING_INTERVAL_MS\n );\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n }\n\n _addListener(key: string, listener: StorageEventListener): void {\n if (Object.keys(this.listeners).length === 0) {\n this.startPolling();\n }\n if (!this.listeners[key]) {\n this.listeners[key] = new Set();\n // Populate the cache to avoid spuriously triggering on first poll.\n void this._get(key); // This can happen in the background async and we can return immediately.\n }\n this.listeners[key].add(listener);\n }\n\n _removeListener(key: string, listener: StorageEventListener): void {\n if (this.listeners[key]) {\n this.listeners[key].delete(listener);\n\n if (this.listeners[key].size === 0) {\n delete this.listeners[key];\n }\n }\n\n if (Object.keys(this.listeners).length === 0) {\n this.stopPolling();\n }\n }\n}\n\n/**\n * An implementation of {@link Persistence} of type 'LOCAL' using `indexedDB`\n * for the underlying storage.\n *\n * @public\n */\nexport const indexedDBLocalPersistence: Persistence = IndexedDBLocalPersistence;\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AuthEvent,\n AuthEventConsumer,\n AuthEventType,\n EventManager\n} from '../../model/popup_redirect';\nimport { AuthErrorCode } from '../errors';\nimport { AuthInternal } from '../../model/auth';\nimport { _createError } from '../util/assert';\n\n// The amount of time to store the UIDs of seen events; this is\n// set to 10 min by default\nconst EVENT_DUPLICATION_CACHE_DURATION_MS = 10 * 60 * 1000;\n\nexport class AuthEventManager implements EventManager {\n private readonly cachedEventUids: Set<string> = new Set();\n private readonly consumers: Set<AuthEventConsumer> = new Set();\n protected queuedRedirectEvent: AuthEvent | null = null;\n protected hasHandledPotentialRedirect = false;\n private lastProcessedEventTime = Date.now();\n\n constructor(private readonly auth: AuthInternal) {}\n\n registerConsumer(authEventConsumer: AuthEventConsumer): void {\n this.consumers.add(authEventConsumer);\n\n if (\n this.queuedRedirectEvent &&\n this.isEventForConsumer(this.queuedRedirectEvent, authEventConsumer)\n ) {\n this.sendToConsumer(this.queuedRedirectEvent, authEventConsumer);\n this.saveEventToCache(this.queuedRedirectEvent);\n this.queuedRedirectEvent = null;\n }\n }\n\n unregisterConsumer(authEventConsumer: AuthEventConsumer): void {\n this.consumers.delete(authEventConsumer);\n }\n\n onEvent(event: AuthEvent): boolean {\n // Check if the event has already been handled\n if (this.hasEventBeenHandled(event)) {\n return false;\n }\n\n let handled = false;\n this.consumers.forEach(consumer => {\n if (this.isEventForConsumer(event, consumer)) {\n handled = true;\n this.sendToConsumer(event, consumer);\n this.saveEventToCache(event);\n }\n });\n\n if (this.hasHandledPotentialRedirect || !isRedirectEvent(event)) {\n // If we've already seen a redirect before, or this is a popup event,\n // bail now\n return handled;\n }\n\n this.hasHandledPotentialRedirect = true;\n\n // If the redirect wasn't handled, hang on to it\n if (!handled) {\n this.queuedRedirectEvent = event;\n handled = true;\n }\n\n return handled;\n }\n\n private sendToConsumer(event: AuthEvent, consumer: AuthEventConsumer): void {\n if (event.error && !isNullRedirectEvent(event)) {\n const code =\n (event.error.code?.split('auth/')[1] as AuthErrorCode) ||\n AuthErrorCode.INTERNAL_ERROR;\n consumer.onError(_createError(this.auth, code));\n } else {\n consumer.onAuthEvent(event);\n }\n }\n\n private isEventForConsumer(\n event: AuthEvent,\n consumer: AuthEventConsumer\n ): boolean {\n const eventIdMatches =\n consumer.eventId === null ||\n (!!event.eventId && event.eventId === consumer.eventId);\n return consumer.filter.includes(event.type) && eventIdMatches;\n }\n\n private hasEventBeenHandled(event: AuthEvent): boolean {\n if (\n Date.now() - this.lastProcessedEventTime >=\n EVENT_DUPLICATION_CACHE_DURATION_MS\n ) {\n this.cachedEventUids.clear();\n }\n\n return this.cachedEventUids.has(eventUid(event));\n }\n\n private saveEventToCache(event: AuthEvent): void {\n this.cachedEventUids.add(eventUid(event));\n this.lastProcessedEventTime = Date.now();\n }\n}\n\nfunction eventUid(e: AuthEvent): string {\n return [e.type, e.eventId, e.sessionId, e.tenantId].filter(v => v).join('-');\n}\n\nfunction isNullRedirectEvent({ type, error }: AuthEvent): boolean {\n return (\n type === AuthEventType.UNKNOWN &&\n error?.code === `auth/${AuthErrorCode.NO_AUTH_EVENT}`\n );\n}\n\nfunction isRedirectEvent(event: AuthEvent): boolean {\n switch (event.type) {\n case AuthEventType.SIGN_IN_VIA_REDIRECT:\n case AuthEventType.LINK_VIA_REDIRECT:\n case AuthEventType.REAUTH_VIA_REDIRECT:\n return true;\n case AuthEventType.UNKNOWN:\n return isNullRedirectEvent(event);\n default:\n return false;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _performApiRequest, Endpoint, HttpMethod } from '../index';\nimport { Auth } from '../../model/public_types';\n\nexport interface GetProjectConfigRequest {\n androidPackageName?: string;\n iosBundleId?: string;\n}\n\nexport interface GetProjectConfigResponse {\n authorizedDomains: string[];\n}\n\nexport async function _getProjectConfig(\n auth: Auth,\n request: GetProjectConfigRequest = {}\n): Promise<GetProjectConfigResponse> {\n return _performApiRequest<GetProjectConfigRequest, GetProjectConfigResponse>(\n auth,\n HttpMethod.GET,\n Endpoint.GET_PROJECT_CONFIG,\n request\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _getProjectConfig } from '../../api/project_config/get_project_config';\nimport { AuthInternal } from '../../model/auth';\nimport { AuthErrorCode } from '../errors';\nimport { _fail } from './assert';\nimport { _getCurrentUrl } from './location';\n\nconst IP_ADDRESS_REGEX = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\nconst HTTP_REGEX = /^https?/;\n\nexport async function _validateOrigin(auth: AuthInternal): Promise<void> {\n // Skip origin validation if we are in an emulated environment\n if (auth.config.emulator) {\n return;\n }\n\n const { authorizedDomains } = await _getProjectConfig(auth);\n\n for (const domain of authorizedDomains) {\n try {\n if (matchDomain(domain)) {\n return;\n }\n } catch {\n // Do nothing if there's a URL error; just continue searching\n }\n }\n\n // In the old SDK, this error also provides helpful messages.\n _fail(auth, AuthErrorCode.INVALID_ORIGIN);\n}\n\nfunction matchDomain(expected: string): boolean {\n const currentUrl = _getCurrentUrl();\n const { protocol, hostname } = new URL(currentUrl);\n if (expected.startsWith('chrome-extension://')) {\n const ceUrl = new URL(expected);\n\n if (ceUrl.hostname === '' && hostname === '') {\n // For some reason we're not parsing chrome URLs properly\n return (\n protocol === 'chrome-extension:' &&\n expected.replace('chrome-extension://', '') ===\n currentUrl.replace('chrome-extension://', '')\n );\n }\n\n return protocol === 'chrome-extension:' && ceUrl.hostname === hostname;\n }\n\n if (!HTTP_REGEX.test(protocol)) {\n return false;\n }\n\n if (IP_ADDRESS_REGEX.test(expected)) {\n // The domain has to be exactly equal to the pattern, as an IP domain will\n // only contain the IP, no extra character.\n return hostname === expected;\n }\n\n // Dots in pattern should be escaped.\n const escapedDomainPattern = expected.replace(/\\./g, '\\\\.');\n // Non ip address domains.\n // domain.com = *.domain.com OR domain.com\n const re = new RegExp(\n '^(.+\\\\.' + escapedDomainPattern + '|' + escapedDomainPattern + ')$',\n 'i'\n );\n return re.test(hostname);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthErrorCode } from '../core/errors';\nimport { _createError } from '../core/util/assert';\n\nfunction getScriptParentElement(): HTMLDocument | HTMLHeadElement {\n return document.getElementsByTagName('head')?.[0] ?? document;\n}\n\nexport function _loadJS(url: string): Promise<Event> {\n // TODO: consider adding timeout support & cancellation\n return new Promise((resolve, reject) => {\n const el = document.createElement('script');\n el.setAttribute('src', url);\n el.onload = resolve;\n el.onerror = e => {\n const error = _createError(AuthErrorCode.INTERNAL_ERROR);\n error.customData = e as unknown as Record<string, unknown>;\n reject(error);\n };\n el.type = 'text/javascript';\n el.charset = 'UTF-8';\n getScriptParentElement().appendChild(el);\n });\n}\n\nexport function _generateCallbackName(prefix: string): string {\n return `__${prefix}${Math.floor(Math.random() * 1000000)}`;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthErrorCode } from '../../core/errors';\nimport { _createError } from '../../core/util/assert';\nimport { Delay } from '../../core/util/delay';\nimport { AuthInternal } from '../../model/auth';\nimport { _window } from '../auth_window';\nimport * as js from '../load_js';\n\nconst NETWORK_TIMEOUT = new Delay(30000, 60000);\n\n/**\n * Reset unlaoded GApi modules. If gapi.load fails due to a network error,\n * it will stop working after a retrial. This is a hack to fix this issue.\n */\nfunction resetUnloadedGapiModules(): void {\n // Clear last failed gapi.load state to force next gapi.load to first\n // load the failed gapi.iframes module.\n // Get gapix.beacon context.\n const beacon = _window().___jsl;\n // Get current hint.\n if (beacon?.H) {\n // Get gapi hint.\n for (const hint of Object.keys(beacon.H)) {\n // Requested modules.\n beacon.H[hint].r = beacon.H[hint].r || [];\n // Loaded modules.\n beacon.H[hint].L = beacon.H[hint].L || [];\n // Set requested modules to a copy of the loaded modules.\n beacon.H[hint].r = [...beacon.H[hint].L];\n // Clear pending callbacks.\n if (beacon.CP) {\n for (let i = 0; i < beacon.CP.length; i++) {\n // Remove all failed pending callbacks.\n beacon.CP[i] = null;\n }\n }\n }\n }\n}\n\nfunction loadGapi(auth: AuthInternal): Promise<gapi.iframes.Context> {\n return new Promise<gapi.iframes.Context>((resolve, reject) => {\n // Function to run when gapi.load is ready.\n function loadGapiIframe(): void {\n // The developer may have tried to previously run gapi.load and failed.\n // Run this to fix that.\n resetUnloadedGapiModules();\n gapi.load('gapi.iframes', {\n callback: () => {\n resolve(gapi.iframes.getContext());\n },\n ontimeout: () => {\n // The above reset may be sufficient, but having this reset after\n // failure ensures that if the developer calls gapi.load after the\n // connection is re-established and before another attempt to embed\n // the iframe, it would work and would not be broken because of our\n // failed attempt.\n // Timeout when gapi.iframes.Iframe not loaded.\n resetUnloadedGapiModules();\n reject(_createError(auth, AuthErrorCode.NETWORK_REQUEST_FAILED));\n },\n timeout: NETWORK_TIMEOUT.get()\n });\n }\n\n if (_window().gapi?.iframes?.Iframe) {\n // If gapi.iframes.Iframe available, resolve.\n resolve(gapi.iframes.getContext());\n } else if (!!_window().gapi?.load) {\n // Gapi loader ready, load gapi.iframes.\n loadGapiIframe();\n } else {\n // Create a new iframe callback when this is called so as not to overwrite\n // any previous defined callback. This happens if this method is called\n // multiple times in parallel and could result in the later callback\n // overwriting the previous one. This would end up with a iframe\n // timeout.\n const cbName = js._generateCallbackName('iframefcb');\n // GApi loader not available, dynamically load platform.js.\n _window()[cbName] = () => {\n // GApi loader should be ready.\n if (!!gapi.load) {\n loadGapiIframe();\n } else {\n // Gapi loader failed, throw error.\n reject(_createError(auth, AuthErrorCode.NETWORK_REQUEST_FAILED));\n }\n };\n // Load GApi loader.\n return js._loadJS(`https://apis.google.com/js/api.js?onload=${cbName}`);\n }\n }).catch(error => {\n // Reset cached promise to allow for retrial.\n cachedGApiLoader = null;\n throw error;\n });\n}\n\nlet cachedGApiLoader: Promise<gapi.iframes.Context> | null = null;\nexport function _loadGapi(auth: AuthInternal): Promise<gapi.iframes.Context> {\n cachedGApiLoader = cachedGApiLoader || loadGapi(auth);\n return cachedGApiLoader;\n}\n\nexport function _resetLoader(): void {\n cachedGApiLoader = null;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SDK_VERSION } from '@firebase/app-exp';\nimport { querystring } from '@firebase/util';\nimport { DefaultConfig } from '../../../internal';\n\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert, _createError } from '../../core/util/assert';\nimport { Delay } from '../../core/util/delay';\nimport { _emulatorUrl } from '../../core/util/emulator';\nimport { AuthInternal } from '../../model/auth';\nimport { _window } from '../auth_window';\nimport * as gapiLoader from './gapi';\n\nconst PING_TIMEOUT = new Delay(5000, 15000);\nconst IFRAME_PATH = '__/auth/iframe';\nconst EMULATED_IFRAME_PATH = 'emulator/auth/iframe';\n\nconst IFRAME_ATTRIBUTES = {\n style: {\n position: 'absolute',\n top: '-100px',\n width: '1px',\n height: '1px'\n }\n};\n\n// Map from apiHost to endpoint ID for passing into iframe. In current SDK, apiHost can be set to\n// anything (not from a list of endpoints with IDs as in legacy), so this is the closest we can get.\nconst EID_FROM_APIHOST = new Map([\n [DefaultConfig.API_HOST, 'p'], // production\n ['staging-identitytoolkit.sandbox.googleapis.com', 's'], // staging\n ['test-identitytoolkit.sandbox.googleapis.com', 't'] // test\n]);\n\nfunction getIframeUrl(auth: AuthInternal): string {\n const config = auth.config;\n _assert(config.authDomain, auth, AuthErrorCode.MISSING_AUTH_DOMAIN);\n const url = config.emulator\n ? _emulatorUrl(config, EMULATED_IFRAME_PATH)\n : `https://${auth.config.authDomain}/${IFRAME_PATH}`;\n\n const params: Record<string, string> = {\n apiKey: config.apiKey,\n appName: auth.name,\n v: SDK_VERSION\n };\n const eid = EID_FROM_APIHOST.get(auth.config.apiHost);\n if (eid) {\n params.eid = eid;\n }\n const frameworks = auth._getFrameworks();\n if (frameworks.length) {\n params.fw = frameworks.join(',');\n }\n return `${url}?${querystring(params).slice(1)}`;\n}\n\nexport async function _openIframe(\n auth: AuthInternal\n): Promise<gapi.iframes.Iframe> {\n const context = await gapiLoader._loadGapi(auth);\n const gapi = _window().gapi;\n _assert(gapi, auth, AuthErrorCode.INTERNAL_ERROR);\n return context.open(\n {\n where: document.body,\n url: getIframeUrl(auth),\n messageHandlersFilter: gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER,\n attributes: IFRAME_ATTRIBUTES,\n dontclear: true\n },\n (iframe: gapi.iframes.Iframe) =>\n new Promise(async (resolve, reject) => {\n await iframe.restyle({\n // Prevent iframe from closing on mouse out.\n setHideOnLeave: false\n });\n\n const networkError = _createError(\n auth,\n AuthErrorCode.NETWORK_REQUEST_FAILED\n );\n // Confirm iframe is correctly loaded.\n // To fallback on failure, set a timeout.\n const networkErrorTimer = _window().setTimeout(() => {\n reject(networkError);\n }, PING_TIMEOUT.get());\n // Clear timer and resolve pending iframe ready promise.\n function clearTimerAndResolve(): void {\n _window().clearTimeout(networkErrorTimer);\n resolve(iframe);\n }\n // This returns an IThenable. However the reject part does not call\n // when the iframe is not loaded.\n iframe.ping(clearTimerAndResolve).then(clearTimerAndResolve, () => {\n reject(networkError);\n });\n })\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Persistence } from '../../model/public_types';\n\nimport {\n PersistenceInternal as InternalPersistence,\n PersistenceType,\n StorageEventListener\n} from '../../core/persistence';\nimport { BrowserPersistenceClass } from './browser';\n\nclass BrowserSessionPersistence\n extends BrowserPersistenceClass\n implements InternalPersistence {\n static type: 'SESSION' = 'SESSION';\n\n constructor() {\n super(window.sessionStorage, PersistenceType.SESSION);\n }\n\n _addListener(_key: string, _listener: StorageEventListener): void {\n // Listeners are not supported for session storage since it cannot be shared across windows\n return;\n }\n\n _removeListener(_key: string, _listener: StorageEventListener): void {\n // Listeners are not supported for session storage since it cannot be shared across windows\n return;\n }\n}\n\n/**\n * An implementation of {@link Persistence} of 'SESSION' using `sessionStorage`\n * for the underlying storage.\n *\n * @public\n */\nexport const browserSessionPersistence: Persistence = BrowserSessionPersistence;\n", "/**\n * @license\n * Copyright 2020 Google LLC.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getUA } from '@firebase/util';\n\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert } from '../../core/util/assert';\nimport {\n _isChromeIOS,\n _isFirefox,\n _isIOSStandalone\n} from '../../core/util/browser';\nimport { AuthInternal } from '../../model/auth';\n\nconst BASE_POPUP_OPTIONS = {\n location: 'yes',\n resizable: 'yes',\n statusbar: 'yes',\n toolbar: 'no'\n};\n\nconst DEFAULT_WIDTH = 500;\nconst DEFAULT_HEIGHT = 600;\nconst TARGET_BLANK = '_blank';\n\nconst FIREFOX_EMPTY_URL = 'http://localhost';\n\nexport class AuthPopup {\n associatedEvent: string | null = null;\n\n constructor(readonly window: Window | null) {}\n\n close(): void {\n if (this.window) {\n try {\n this.window.close();\n } catch (e) {}\n }\n }\n}\n\nexport function _open(\n auth: AuthInternal,\n url?: string,\n name?: string,\n width = DEFAULT_WIDTH,\n height = DEFAULT_HEIGHT\n): AuthPopup {\n const top = Math.min((window.screen.availHeight - height) / 2, 0).toString();\n const left = Math.min((window.screen.availWidth - width) / 2, 0).toString();\n let target = '';\n\n const options: { [key: string]: string } = {\n ...BASE_POPUP_OPTIONS,\n width: width.toString(),\n height: height.toString(),\n top,\n left\n };\n\n // Chrome iOS 7 and 8 is returning an undefined popup win when target is\n // specified, even though the popup is not necessarily blocked.\n const ua = getUA().toLowerCase();\n\n if (name) {\n target = _isChromeIOS(ua) ? TARGET_BLANK : name;\n }\n\n if (_isFirefox(ua)) {\n // Firefox complains when invalid URLs are popped out. Hacky way to bypass.\n url = url || FIREFOX_EMPTY_URL;\n // Firefox disables by default scrolling on popup windows, which can create\n // issues when the user has many Google accounts, for instance.\n options.scrollbars = 'yes';\n }\n\n const optionsString = Object.entries(options).reduce(\n (accum, [key, value]) => `${accum}${key}=${value},`,\n ''\n );\n\n if (_isIOSStandalone(ua) && target !== '_self') {\n openAsNewWindowIOS(url || '', target);\n return new AuthPopup(null);\n }\n\n // about:blank getting sanitized causing browsers like IE/Edge to display\n // brief error message before redirecting to handler.\n const newWin = window.open(url || '', target, optionsString);\n _assert(newWin, auth, AuthErrorCode.POPUP_BLOCKED);\n\n // Flaky on IE edge, encapsulate with a try and catch.\n try {\n newWin.focus();\n } catch (e) {}\n\n return new AuthPopup(newWin);\n}\n\nfunction openAsNewWindowIOS(url: string, target: string): void {\n const el = document.createElement('a');\n el.href = url;\n el.target = target;\n const click = document.createEvent('MouseEvent');\n click.initMouseEvent(\n 'click',\n true,\n true,\n window,\n 1,\n 0,\n 0,\n 0,\n 0,\n false,\n false,\n false,\n false,\n 1,\n null\n );\n el.dispatchEvent(click);\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PopupRedirectResolver } from '../../model/public_types';\nimport { AuthInternal } from '../../model/auth';\nimport { PopupRedirectResolverInternal } from '../../model/popup_redirect';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from './assert';\nimport { _getInstance } from './instantiator';\n\n/**\n * Chooses a popup/redirect resolver to use. This prefers the override (which\n * is directly passed in), and falls back to the property set on the auth\n * object. If neither are available, this function errors w/ an argument error.\n */\nexport function _withDefaultResolver(\n auth: AuthInternal,\n resolverOverride: PopupRedirectResolver | undefined\n): PopupRedirectResolverInternal {\n if (resolverOverride) {\n return _getInstance(resolverOverride);\n }\n\n _assert(auth._popupRedirectResolver, auth, AuthErrorCode.ARGUMENT_ERROR);\n\n return auth._popupRedirectResolver;\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ProviderId } from '../../model/public_types';\nimport {\n signInWithIdp,\n SignInWithIdpRequest\n} from '../../api/authentication/idp';\nimport { PhoneOrOauthTokenResponse } from '../../api/authentication/mfa';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { UserInternal, UserCredentialInternal } from '../../model/user';\nimport { AuthCredential } from '../credentials';\nimport { _link as _linkUser } from '../user/link_unlink';\nimport { _reauthenticate } from '../user/reauthenticate';\nimport { _assert } from '../util/assert';\nimport { _signInWithCredential } from './credential';\nimport { AuthErrorCode } from '../errors';\n\nexport interface IdpTaskParams {\n auth: AuthInternal;\n requestUri: string;\n sessionId?: string;\n tenantId?: string;\n postBody?: string;\n pendingToken?: string;\n user?: UserInternal;\n bypassAuthState?: boolean;\n}\n\nexport type IdpTask = (\n params: IdpTaskParams\n) => Promise<UserCredentialInternal>;\n\nclass IdpCredential extends AuthCredential {\n constructor(readonly params: IdpTaskParams) {\n super(ProviderId.CUSTOM, ProviderId.CUSTOM);\n }\n\n _getIdTokenResponse(auth: AuthInternal): Promise<PhoneOrOauthTokenResponse> {\n return signInWithIdp(auth, this._buildIdpRequest());\n }\n\n _linkToIdToken(\n auth: AuthInternal,\n idToken: string\n ): Promise<IdTokenResponse> {\n return signInWithIdp(auth, this._buildIdpRequest(idToken));\n }\n\n _getReauthenticationResolver(auth: AuthInternal): Promise<IdTokenResponse> {\n return signInWithIdp(auth, this._buildIdpRequest());\n }\n\n private _buildIdpRequest(idToken?: string): SignInWithIdpRequest {\n const request: SignInWithIdpRequest = {\n requestUri: this.params.requestUri,\n sessionId: this.params.sessionId,\n postBody: this.params.postBody,\n tenantId: this.params.tenantId,\n pendingToken: this.params.pendingToken,\n returnSecureToken: true,\n returnIdpCredential: true\n };\n\n if (idToken) {\n request.idToken = idToken;\n }\n\n return request;\n }\n}\n\nexport function _signIn(\n params: IdpTaskParams\n): Promise<UserCredentialInternal> {\n return _signInWithCredential(\n params.auth,\n new IdpCredential(params),\n params.bypassAuthState\n ) as Promise<UserCredentialInternal>;\n}\n\nexport function _reauth(\n params: IdpTaskParams\n): Promise<UserCredentialInternal> {\n const { auth, user } = params;\n _assert(user, auth, AuthErrorCode.INTERNAL_ERROR);\n return _reauthenticate(\n user,\n new IdpCredential(params),\n params.bypassAuthState\n );\n}\n\nexport async function _link(\n params: IdpTaskParams\n): Promise<UserCredentialInternal> {\n const { auth, user } = params;\n _assert(user, auth, AuthErrorCode.INTERNAL_ERROR);\n return _linkUser(user, new IdpCredential(params), params.bypassAuthState);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\n\nimport {\n AuthEvent,\n AuthEventConsumer,\n AuthEventType,\n EventManager,\n PopupRedirectResolverInternal\n} from '../../model/popup_redirect';\nimport { UserInternal, UserCredentialInternal } from '../../model/user';\nimport { AuthErrorCode } from '../errors';\nimport { debugAssert, _fail } from '../util/assert';\nimport {\n _link,\n _reauth,\n _signIn,\n IdpTask,\n IdpTaskParams\n} from '../strategies/idp';\nimport { AuthInternal } from '../../model/auth';\n\ninterface PendingPromise {\n resolve: (cred: UserCredentialInternal | null) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Popup event manager. Handles the popup's entire lifecycle; listens to auth\n * events\n */\nexport abstract class AbstractPopupRedirectOperation\n implements AuthEventConsumer {\n private pendingPromise: PendingPromise | null = null;\n private eventManager: EventManager | null = null;\n readonly filter: AuthEventType[];\n\n abstract eventId: string | null;\n\n constructor(\n protected readonly auth: AuthInternal,\n filter: AuthEventType | AuthEventType[],\n protected readonly resolver: PopupRedirectResolverInternal,\n protected user?: UserInternal,\n private readonly bypassAuthState = false\n ) {\n this.filter = Array.isArray(filter) ? filter : [filter];\n }\n\n abstract onExecution(): Promise<void>;\n\n execute(): Promise<UserCredentialInternal | null> {\n return new Promise<UserCredentialInternal | null>(\n async (resolve, reject) => {\n this.pendingPromise = { resolve, reject };\n\n try {\n this.eventManager = await this.resolver._initialize(this.auth);\n await this.onExecution();\n this.eventManager.registerConsumer(this);\n } catch (e) {\n this.reject(e);\n }\n }\n );\n }\n\n async onAuthEvent(event: AuthEvent): Promise<void> {\n const { urlResponse, sessionId, postBody, tenantId, error, type } = event;\n if (error) {\n this.reject(error);\n return;\n }\n\n const params: IdpTaskParams = {\n auth: this.auth,\n requestUri: urlResponse!,\n sessionId: sessionId!,\n tenantId: tenantId || undefined,\n postBody: postBody || undefined,\n user: this.user,\n bypassAuthState: this.bypassAuthState\n };\n\n try {\n this.resolve(await this.getIdpTask(type)(params));\n } catch (e) {\n this.reject(e);\n }\n }\n\n onError(error: FirebaseError): void {\n this.reject(error);\n }\n\n private getIdpTask(type: AuthEventType): IdpTask {\n switch (type) {\n case AuthEventType.SIGN_IN_VIA_POPUP:\n case AuthEventType.SIGN_IN_VIA_REDIRECT:\n return _signIn;\n case AuthEventType.LINK_VIA_POPUP:\n case AuthEventType.LINK_VIA_REDIRECT:\n return _link;\n case AuthEventType.REAUTH_VIA_POPUP:\n case AuthEventType.REAUTH_VIA_REDIRECT:\n return _reauth;\n default:\n _fail(this.auth, AuthErrorCode.INTERNAL_ERROR);\n }\n }\n\n protected resolve(cred: UserCredentialInternal | null): void {\n debugAssert(this.pendingPromise, 'Pending promise was never set');\n this.pendingPromise.resolve(cred);\n this.unregisterAndCleanUp();\n }\n\n protected reject(error: Error): void {\n debugAssert(this.pendingPromise, 'Pending promise was never set');\n this.pendingPromise.reject(error);\n this.unregisterAndCleanUp();\n }\n\n private unregisterAndCleanUp(): void {\n if (this.eventManager) {\n this.eventManager.unregisterConsumer(this);\n }\n\n this.pendingPromise = null;\n this.cleanUp();\n }\n\n abstract cleanUp(): void;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthInternal } from '../../model/auth';\nimport {\n AuthEvent,\n AuthEventType,\n PopupRedirectResolverInternal\n} from '../../model/popup_redirect';\nimport { UserCredentialInternal } from '../../model/user';\nimport { PersistenceInternal } from '../persistence';\nimport { _persistenceKeyName } from '../persistence/persistence_user_manager';\nimport { _getInstance } from '../util/instantiator';\nimport { AbstractPopupRedirectOperation } from './abstract_popup_redirect_operation';\n\nconst PENDING_REDIRECT_KEY = 'pendingRedirect';\n\n// We only get one redirect outcome for any one auth, so just store it\n// in here.\nconst redirectOutcomeMap: Map<\n string,\n () => Promise<UserCredentialInternal | null>\n> = new Map();\n\nexport class RedirectAction extends AbstractPopupRedirectOperation {\n eventId = null;\n\n constructor(\n auth: AuthInternal,\n resolver: PopupRedirectResolverInternal,\n bypassAuthState = false\n ) {\n super(\n auth,\n [\n AuthEventType.SIGN_IN_VIA_REDIRECT,\n AuthEventType.LINK_VIA_REDIRECT,\n AuthEventType.REAUTH_VIA_REDIRECT,\n AuthEventType.UNKNOWN\n ],\n resolver,\n undefined,\n bypassAuthState\n );\n }\n\n /**\n * Override the execute function; if we already have a redirect result, then\n * just return it.\n */\n async execute(): Promise<UserCredentialInternal | null> {\n let readyOutcome = redirectOutcomeMap.get(this.auth._key());\n if (!readyOutcome) {\n try {\n const hasPendingRedirect = await _getAndClearPendingRedirectStatus(\n this.resolver,\n this.auth\n );\n const result = hasPendingRedirect ? await super.execute() : null;\n readyOutcome = () => Promise.resolve(result);\n } catch (e) {\n readyOutcome = () => Promise.reject(e);\n }\n\n redirectOutcomeMap.set(this.auth._key(), readyOutcome);\n }\n\n return readyOutcome();\n }\n\n async onAuthEvent(event: AuthEvent): Promise<void> {\n if (event.type === AuthEventType.SIGN_IN_VIA_REDIRECT) {\n return super.onAuthEvent(event);\n } else if (event.type === AuthEventType.UNKNOWN) {\n // This is a sentinel value indicating there's no pending redirect\n this.resolve(null);\n return;\n }\n\n if (event.eventId) {\n const user = await this.auth._redirectUserForId(event.eventId);\n if (user) {\n this.user = user;\n return super.onAuthEvent(event);\n } else {\n this.resolve(null);\n }\n }\n }\n\n async onExecution(): Promise<void> {}\n\n cleanUp(): void {}\n}\n\nexport async function _getAndClearPendingRedirectStatus(\n resolver: PopupRedirectResolverInternal,\n auth: AuthInternal\n): Promise<boolean> {\n const key = pendingRedirectKey(auth);\n const hasPendingRedirect =\n (await resolverPersistence(resolver)._get(key)) === 'true';\n await resolverPersistence(resolver)._remove(key);\n return hasPendingRedirect;\n}\n\nexport async function _setPendingRedirectStatus(\n resolver: PopupRedirectResolverInternal,\n auth: AuthInternal\n): Promise<void> {\n return resolverPersistence(resolver)._set(pendingRedirectKey(auth), 'true');\n}\n\nexport function _clearRedirectOutcomes(): void {\n redirectOutcomeMap.clear();\n}\n\nfunction resolverPersistence(\n resolver: PopupRedirectResolverInternal\n): PersistenceInternal {\n return _getInstance(resolver._redirectPersistence);\n}\n\nfunction pendingRedirectKey(auth: AuthInternal): string {\n return _persistenceKeyName(\n PENDING_REDIRECT_KEY,\n auth.config.apiKey,\n auth.name\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Auth,\n AuthProvider,\n PopupRedirectResolver,\n User,\n UserCredential\n} from '../../model/public_types';\n\nimport { _castAuth } from '../../core/auth/auth_impl';\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assertLinkedStatus } from '../../core/user/link_unlink';\nimport { _assert } from '../../core/util/assert';\nimport { _generateEventId } from '../../core/util/event_id';\nimport { AuthEventType } from '../../model/popup_redirect';\nimport { UserInternal } from '../../model/user';\nimport { _withDefaultResolver } from '../../core/util/resolver';\nimport {\n RedirectAction,\n _setPendingRedirectStatus\n} from '../../core/strategies/redirect';\nimport { FederatedAuthProvider } from '../../core/providers/federated';\nimport { getModularInstance } from '@firebase/util';\n\n/**\n * Authenticates a Firebase client using a full-page redirect flow.\n *\n * @remarks\n * To handle the results and errors for this operation, refer to {@link getRedirectResult}.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new FacebookAuthProvider();\n * // You can add additional scopes to the provider:\n * provider.addScope('user_birthday');\n * // Start a sign in process for an unauthenticated user.\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n * // This is the signed-in user\n * const user = result.user;\n * // This gives you a Facebook Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * }\n * // As this API can be used for sign-in, linking and reauthentication,\n * // check the operationType to determine what triggered this redirect\n * // operation.\n * const operationType = result.operationType;\n * ```\n *\n * @param auth - The Auth instance.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n * @public\n */\nexport function signInWithRedirect(\n auth: Auth,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<never> {\n return _signInWithRedirect(auth, provider, resolver) as Promise<never>;\n}\n\nexport async function _signInWithRedirect(\n auth: Auth,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<void | never> {\n const authInternal = _castAuth(auth);\n _assert(\n provider instanceof FederatedAuthProvider,\n auth,\n AuthErrorCode.ARGUMENT_ERROR\n );\n\n const resolverInternal = _withDefaultResolver(authInternal, resolver);\n await _setPendingRedirectStatus(resolverInternal, authInternal);\n\n return resolverInternal._openRedirect(\n authInternal,\n provider,\n AuthEventType.SIGN_IN_VIA_REDIRECT\n );\n}\n\n/**\n * Reauthenticates the current user with the specified {@link OAuthProvider} using a full-page redirect flow.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new FacebookAuthProvider();\n * const result = await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * // Link using a redirect.\n * await linkWithRedirect(result.user, provider);\n * // This will again trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * ```\n *\n * @param user - The user.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n * @public\n */\nexport function reauthenticateWithRedirect(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<never> {\n return _reauthenticateWithRedirect(\n user,\n provider,\n resolver\n ) as Promise<never>;\n}\nexport async function _reauthenticateWithRedirect(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<void | never> {\n const userInternal = getModularInstance(user) as UserInternal;\n _assert(\n provider instanceof FederatedAuthProvider,\n userInternal.auth,\n AuthErrorCode.ARGUMENT_ERROR\n );\n\n // Allow the resolver to error before persisting the redirect user\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\n await _setPendingRedirectStatus(resolverInternal, userInternal.auth);\n\n const eventId = await prepareUserForRedirect(userInternal);\n return resolverInternal._openRedirect(\n userInternal.auth,\n provider,\n AuthEventType.REAUTH_VIA_REDIRECT,\n eventId\n );\n}\n\n/**\n * Links the {@link OAuthProvider} to the user account using a full-page redirect flow.\n *\n * @example\n * ```javascript\n * // Sign in using some other provider.\n * const result = await signInWithEmailAndPassword(auth, email, password);\n * // Link using a redirect.\n * const provider = new FacebookAuthProvider();\n * await linkWithRedirect(result.user, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * ```\n *\n * @param user - The user.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n *\n * @public\n */\nexport function linkWithRedirect(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<never> {\n return _linkWithRedirect(user, provider, resolver) as Promise<never>;\n}\nexport async function _linkWithRedirect(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<void | never> {\n const userInternal = getModularInstance(user) as UserInternal;\n _assert(\n provider instanceof FederatedAuthProvider,\n userInternal.auth,\n AuthErrorCode.ARGUMENT_ERROR\n );\n\n // Allow the resolver to error before persisting the redirect user\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\n await _assertLinkedStatus(false, userInternal, provider.providerId);\n await _setPendingRedirectStatus(resolverInternal, userInternal.auth);\n\n const eventId = await prepareUserForRedirect(userInternal);\n return resolverInternal._openRedirect(\n userInternal.auth,\n provider,\n AuthEventType.LINK_VIA_REDIRECT,\n eventId\n );\n}\n\n/**\n * Returns a {@link UserCredential} from the redirect-based sign-in flow.\n *\n * @remarks\n * If sign-in succeeded, returns the signed in user. If sign-in was unsuccessful, fails with an\n * error. If no redirect operation was called, returns a {@link UserCredential}\n * with a null `user`.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new FacebookAuthProvider();\n * // You can add additional scopes to the provider:\n * provider.addScope('user_birthday');\n * // Start a sign in process for an unauthenticated user.\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n * // This is the signed-in user\n * const user = result.user;\n * // This gives you a Facebook Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * }\n * // As this API can be used for sign-in, linking and reauthentication,\n * // check the operationType to determine what triggered this redirect\n * // operation.\n * const operationType = result.operationType;\n * ```\n *\n * @param auth - The Auth instance.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n * @public\n */\nexport async function getRedirectResult(\n auth: Auth,\n resolver?: PopupRedirectResolver\n): Promise<UserCredential | null> {\n await _castAuth(auth)._initializationPromise;\n return _getRedirectResult(auth, resolver, false);\n}\n\nexport async function _getRedirectResult(\n auth: Auth,\n resolverExtern?: PopupRedirectResolver,\n bypassAuthState = false\n): Promise<UserCredential | null> {\n const authInternal = _castAuth(auth);\n const resolver = _withDefaultResolver(authInternal, resolverExtern);\n const action = new RedirectAction(authInternal, resolver, bypassAuthState);\n const result = await action.execute();\n\n if (result && !bypassAuthState) {\n delete result.user._redirectEventId;\n await authInternal._persistUserIfCurrent(result.user as UserInternal);\n await authInternal._setRedirectUser(null, resolverExtern);\n }\n\n return result;\n}\n\nasync function prepareUserForRedirect(user: UserInternal): Promise<string> {\n const eventId = _generateEventId(`${user.uid}:::`);\n user._redirectEventId = eventId;\n await user.auth._setRedirectUser(user);\n await user.auth._persistUserIfCurrent(user);\n return eventId;\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SDK_VERSION } from '@firebase/app-exp';\nimport { AuthProvider } from '../../model/public_types';\nimport { ApiKey, AppName, AuthInternal } from '../../model/auth';\nimport { AuthEventType } from '../../model/popup_redirect';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from './assert';\nimport { isEmpty, querystring } from '@firebase/util';\nimport { _emulatorUrl } from './emulator';\nimport { FederatedAuthProvider } from '../providers/federated';\nimport { BaseOAuthProvider } from '../providers/oauth';\n\n/**\n * URL for Authentication widget which will initiate the OAuth handshake\n *\n * @internal\n */\nconst WIDGET_PATH = '__/auth/handler';\n\n/**\n * URL for emulated environment\n *\n * @internal\n */\nconst EMULATOR_WIDGET_PATH = 'emulator/auth/handler';\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\ntype WidgetParams = {\n apiKey: ApiKey;\n appName: AppName;\n authType: AuthEventType;\n redirectUrl?: string;\n v: string;\n providerId?: string;\n scopes?: string;\n customParameters?: string;\n eventId?: string;\n tid?: string;\n} & { [key: string]: string | undefined };\n\nexport function _getRedirectUrl(\n auth: AuthInternal,\n provider: AuthProvider,\n authType: AuthEventType,\n redirectUrl?: string,\n eventId?: string,\n additionalParams?: Record<string, string>\n): string {\n _assert(auth.config.authDomain, auth, AuthErrorCode.MISSING_AUTH_DOMAIN);\n _assert(auth.config.apiKey, auth, AuthErrorCode.INVALID_API_KEY);\n\n const params: WidgetParams = {\n apiKey: auth.config.apiKey,\n appName: auth.name,\n authType,\n redirectUrl,\n v: SDK_VERSION,\n eventId\n };\n\n if (provider instanceof FederatedAuthProvider) {\n provider.setDefaultLanguage(auth.languageCode);\n params.providerId = provider.providerId || '';\n if (!isEmpty(provider.getCustomParameters())) {\n params.customParameters = JSON.stringify(provider.getCustomParameters());\n }\n\n // TODO set additionalParams from the provider as well?\n for (const [key, value] of Object.entries(additionalParams || {})) {\n params[key] = value;\n }\n }\n\n if (provider instanceof BaseOAuthProvider) {\n const scopes = provider.getScopes().filter(scope => scope !== '');\n if (scopes.length > 0) {\n params.scopes = scopes.join(',');\n }\n }\n\n if (auth.tenantId) {\n params.tid = auth.tenantId;\n }\n\n // TODO: maybe set eid as endipointId\n // TODO: maybe set fw as Frameworks.join(\",\")\n\n const paramsDict = params as Record<string, string | number>;\n for (const key of Object.keys(paramsDict)) {\n if (paramsDict[key] === undefined) {\n delete paramsDict[key];\n }\n }\n return `${getHandlerBase(auth)}?${querystring(paramsDict).slice(1)}`;\n}\n\nfunction getHandlerBase({ config }: AuthInternal): string {\n if (!config.emulator) {\n return `https://${config.authDomain}/${WIDGET_PATH}`;\n }\n\n return _emulatorUrl(config, EMULATOR_WIDGET_PATH);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthProvider, PopupRedirectResolver } from '../model/public_types';\n\nimport { AuthEventManager } from '../core/auth/auth_event_manager';\nimport { AuthErrorCode } from '../core/errors';\nimport { _assert, debugAssert, _fail } from '../core/util/assert';\nimport { _generateEventId } from '../core/util/event_id';\nimport { _getCurrentUrl } from '../core/util/location';\nimport { _validateOrigin } from '../core/util/validate_origin';\nimport { AuthInternal } from '../model/auth';\nimport {\n AuthEventType,\n EventManager,\n GapiAuthEvent,\n GapiOutcome,\n PopupRedirectResolverInternal\n} from '../model/popup_redirect';\nimport { _setWindowLocation } from './auth_window';\nimport { _openIframe } from './iframe/iframe';\nimport { browserSessionPersistence } from './persistence/session_storage';\nimport { _open, AuthPopup } from './util/popup';\nimport { _getRedirectResult } from './strategies/redirect';\nimport { _getRedirectUrl } from '../core/util/handler';\nimport { _isIOS, _isMobileBrowser, _isSafari } from '../core/util/browser';\n\n/**\n * The special web storage event\n *\n */\nconst WEB_STORAGE_SUPPORT_KEY = 'webStorageSupport';\n\ninterface WebStorageSupportMessage extends gapi.iframes.Message {\n [index: number]: Record<string, boolean>;\n}\n\ninterface ManagerOrPromise {\n manager?: EventManager;\n promise?: Promise<EventManager>;\n}\n\nclass BrowserPopupRedirectResolver implements PopupRedirectResolverInternal {\n private readonly eventManagers: Record<string, ManagerOrPromise> = {};\n private readonly iframes: Record<string, gapi.iframes.Iframe> = {};\n private readonly originValidationPromises: Record<string, Promise<void>> = {};\n\n readonly _redirectPersistence = browserSessionPersistence;\n\n // Wrapping in async even though we don't await anywhere in order\n // to make sure errors are raised as promise rejections\n async _openPopup(\n auth: AuthInternal,\n provider: AuthProvider,\n authType: AuthEventType,\n eventId?: string\n ): Promise<AuthPopup> {\n debugAssert(\n this.eventManagers[auth._key()]?.manager,\n '_initialize() not called before _openPopup()'\n );\n\n const url = _getRedirectUrl(\n auth,\n provider,\n authType,\n _getCurrentUrl(),\n eventId\n );\n return _open(auth, url, _generateEventId());\n }\n\n async _openRedirect(\n auth: AuthInternal,\n provider: AuthProvider,\n authType: AuthEventType,\n eventId?: string\n ): Promise<never> {\n await this._originValidation(auth);\n _setWindowLocation(\n _getRedirectUrl(auth, provider, authType, _getCurrentUrl(), eventId)\n );\n return new Promise(() => {});\n }\n\n _initialize(auth: AuthInternal): Promise<EventManager> {\n const key = auth._key();\n if (this.eventManagers[key]) {\n const { manager, promise } = this.eventManagers[key];\n if (manager) {\n return Promise.resolve(manager);\n } else {\n debugAssert(promise, 'If manager is not set, promise should be');\n return promise;\n }\n }\n\n const promise = this.initAndGetManager(auth);\n this.eventManagers[key] = { promise };\n return promise;\n }\n\n private async initAndGetManager(auth: AuthInternal): Promise<EventManager> {\n const iframe = await _openIframe(auth);\n const manager = new AuthEventManager(auth);\n iframe.register<GapiAuthEvent>(\n 'authEvent',\n (iframeEvent: GapiAuthEvent | null) => {\n _assert(iframeEvent?.authEvent, auth, AuthErrorCode.INVALID_AUTH_EVENT);\n // TODO: Consider splitting redirect and popup events earlier on\n\n const handled = manager.onEvent(iframeEvent.authEvent);\n return { status: handled ? GapiOutcome.ACK : GapiOutcome.ERROR };\n },\n gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER\n );\n\n this.eventManagers[auth._key()] = { manager };\n this.iframes[auth._key()] = iframe;\n return manager;\n }\n\n _isIframeWebStorageSupported(\n auth: AuthInternal,\n cb: (supported: boolean) => unknown\n ): void {\n const iframe = this.iframes[auth._key()];\n iframe.send<gapi.iframes.Message, WebStorageSupportMessage>(\n WEB_STORAGE_SUPPORT_KEY,\n { type: WEB_STORAGE_SUPPORT_KEY },\n result => {\n const isSupported = result?.[0]?.[WEB_STORAGE_SUPPORT_KEY];\n if (isSupported !== undefined) {\n cb(!!isSupported);\n }\n\n _fail(auth, AuthErrorCode.INTERNAL_ERROR);\n },\n gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER\n );\n }\n\n _originValidation(auth: AuthInternal): Promise<void> {\n const key = auth._key();\n if (!this.originValidationPromises[key]) {\n this.originValidationPromises[key] = _validateOrigin(auth);\n }\n\n return this.originValidationPromises[key];\n }\n\n get _shouldInitProactively(): boolean {\n // Mobile browsers and Safari need to optimistically initialize\n return _isMobileBrowser() || _isSafari() || _isIOS();\n }\n\n _completeRedirectFn = _getRedirectResult;\n}\n\n/**\n * An implementation of {@link PopupRedirectResolver} suitable for browser\n * based applications.\n *\n * @public\n */\nexport const browserPopupRedirectResolver: PopupRedirectResolver = BrowserPopupRedirectResolver;\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * An enum of factors that may be used for multifactor authentication.\n *\n * @public\n */\nexport const FactorId = {\n /** Phone as second factor */\n PHONE: 'phone'\n} as const;\n\n/**\n * Enumeration of supported providers.\n *\n * @public\n */\nexport const ProviderId = {\n /** Facebook provider ID */\n FACEBOOK: 'facebook.com',\n /** GitHub provider ID */\n GITHUB: 'github.com',\n /** Google provider ID */\n GOOGLE: 'google.com',\n /** Password provider */\n PASSWORD: 'password',\n /** Phone provider */\n PHONE: 'phone',\n /** Twitter provider ID */\n TWITTER: 'twitter.com'\n} as const;\n\n/**\n * Enumeration of supported sign-in methods.\n *\n * @public\n */\nexport const SignInMethod = {\n /** Email link sign in method */\n EMAIL_LINK: 'emailLink',\n /** Email/password sign in method */\n EMAIL_PASSWORD: 'password',\n /** Facebook sign in method */\n FACEBOOK: 'facebook.com',\n /** GitHub sign in method */\n GITHUB: 'github.com',\n /** Google sign in method */\n GOOGLE: 'google.com',\n /** Phone sign in method */\n PHONE: 'phone',\n /** Twitter sign in method */\n TWITTER: 'twitter.com'\n} as const;\n\n/**\n * Enumeration of supported operation types.\n *\n * @public\n */\nexport const OperationType = {\n /** Operation involving linking an additional provider to an already signed-in user. */\n LINK: 'link',\n /** Operation involving using a provider to reauthenticate an already signed-in user. */\n REAUTHENTICATE: 'reauthenticate',\n /** Operation involving signing in a user. */\n SIGN_IN: 'signIn'\n} as const;\n\n/**\n * An enumeration of the possible email action types.\n *\n * @public\n */\nexport const ActionCodeOperation = {\n /** The email link sign-in action. */\n EMAIL_SIGNIN: 'EMAIL_SIGNIN',\n /** The password reset action. */\n PASSWORD_RESET: 'PASSWORD_RESET',\n /** The email revocation action. */\n RECOVER_EMAIL: 'RECOVER_EMAIL',\n /** The revert second factor addition email action. */\n REVERT_SECOND_FACTOR_ADDITION: 'REVERT_SECOND_FACTOR_ADDITION',\n /** The revert second factor addition email action. */\n VERIFY_AND_CHANGE_EMAIL: 'VERIFY_AND_CHANGE_EMAIL',\n /** The email verification action. */\n VERIFY_EMAIL: 'VERIFY_EMAIL'\n} as const;\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _performApiRequest, Endpoint, HttpMethod } from '../index';\nimport { Auth } from '../../model/public_types';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { MfaEnrollment } from '../account_management/mfa';\nimport { SignInWithIdpResponse } from './idp';\nimport {\n SignInWithPhoneNumberRequest,\n SignInWithPhoneNumberResponse\n} from './sms';\n\nexport interface FinalizeMfaResponse {\n idToken: string;\n refreshToken: string;\n}\n\nexport interface IdTokenMfaResponse extends IdTokenResponse {\n mfaPendingCredential?: string;\n mfaInfo?: MfaEnrollment[];\n}\n\nexport interface StartPhoneMfaSignInRequest {\n mfaPendingCredential: string;\n mfaEnrollmentId: string;\n phoneSignInInfo: {\n recaptchaToken: string;\n };\n tenantId: string | null;\n}\n\nexport interface StartPhoneMfaSignInResponse {\n phoneResponseInfo: {\n sessionInfo: string;\n };\n}\n\nexport function startSignInPhoneMfa(\n auth: Auth,\n request: Omit<StartPhoneMfaSignInRequest, 'tenantId'>\n): Promise<StartPhoneMfaSignInResponse> {\n return _performApiRequest<\n StartPhoneMfaSignInRequest,\n StartPhoneMfaSignInResponse\n >(auth, HttpMethod.POST, Endpoint.START_PHONE_MFA_SIGN_IN, {\n tenantId: auth.tenantId,\n ...request\n });\n}\n\nexport interface FinalizePhoneMfaSignInRequest {\n mfaPendingCredential: string;\n phoneVerificationInfo: SignInWithPhoneNumberRequest;\n tenantId: string | null;\n}\n\nexport interface FinalizePhoneMfaSignInResponse extends FinalizeMfaResponse {}\n\nexport function finalizeSignInPhoneMfa(\n auth: Auth,\n request: Omit<FinalizePhoneMfaSignInRequest, 'tenantId'>\n): Promise<FinalizePhoneMfaSignInResponse> {\n return _performApiRequest<\n FinalizePhoneMfaSignInRequest,\n FinalizePhoneMfaSignInResponse\n >(auth, HttpMethod.POST, Endpoint.FINALIZE_PHONE_MFA_SIGN_IN, {\n tenantId: auth.tenantId,\n ...request\n });\n}\n\nexport type PhoneOrOauthTokenResponse =\n | SignInWithPhoneNumberResponse\n | SignInWithIdpResponse\n | IdTokenResponse;\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Endpoint, HttpMethod, _performApiRequest } from '../index';\nimport { Auth } from '../../model/public_types';\n\ninterface GetRecaptchaParamResponse {\n recaptchaSiteKey?: string;\n}\n\nexport async function getRecaptchaParams(auth: Auth): Promise<string> {\n return (\n (\n await _performApiRequest<void, GetRecaptchaParamResponse>(\n auth,\n HttpMethod.GET,\n Endpoint.GET_RECAPTCHA_PARAM\n )\n ).recaptchaSiteKey || ''\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert } from '../../core/util/assert';\nimport { AuthInternal } from '../../model/auth';\nimport { Parameters, Recaptcha } from './recaptcha';\n\nexport const _SOLVE_TIME_MS = 500;\nexport const _EXPIRATION_TIME_MS = 60_000;\nexport const _WIDGET_ID_START = 1_000_000_000_000;\n\nexport interface Widget {\n getResponse: () => string | null;\n delete: () => void;\n execute: () => void;\n}\n\nexport class MockReCaptcha implements Recaptcha {\n private counter = _WIDGET_ID_START;\n _widgets = new Map<number, Widget>();\n\n constructor(private readonly auth: AuthInternal) {}\n\n render(container: string | HTMLElement, parameters?: Parameters): number {\n const id = this.counter;\n this._widgets.set(\n id,\n new MockWidget(container, this.auth.name, parameters || {})\n );\n this.counter++;\n return id;\n }\n\n reset(optWidgetId?: number): void {\n const id = optWidgetId || _WIDGET_ID_START;\n void this._widgets.get(id)?.delete();\n this._widgets.delete(id);\n }\n\n getResponse(optWidgetId?: number): string {\n const id = optWidgetId || _WIDGET_ID_START;\n return this._widgets.get(id)?.getResponse() || '';\n }\n\n async execute(optWidgetId?: number | string): Promise<string> {\n const id: number = (optWidgetId as number) || _WIDGET_ID_START;\n void this._widgets.get(id)?.execute();\n return '';\n }\n}\n\nexport class MockWidget {\n private readonly container: HTMLElement;\n private readonly isVisible: boolean;\n private timerId: number | null = null;\n private deleted = false;\n private responseToken: string | null = null;\n private readonly clickHandler = (): void => {\n this.execute();\n };\n\n constructor(\n containerOrId: string | HTMLElement,\n appName: string,\n private readonly params: Parameters\n ) {\n const container =\n typeof containerOrId === 'string'\n ? document.getElementById(containerOrId)\n : containerOrId;\n _assert(container, AuthErrorCode.ARGUMENT_ERROR, { appName });\n\n this.container = container;\n this.isVisible = this.params.size !== 'invisible';\n if (this.isVisible) {\n this.execute();\n } else {\n this.container.addEventListener('click', this.clickHandler);\n }\n }\n\n getResponse(): string | null {\n this.checkIfDeleted();\n return this.responseToken;\n }\n\n delete(): void {\n this.checkIfDeleted();\n this.deleted = true;\n if (this.timerId) {\n clearTimeout(this.timerId);\n this.timerId = null;\n }\n this.container.removeEventListener('click', this.clickHandler);\n }\n\n execute(): void {\n this.checkIfDeleted();\n if (this.timerId) {\n return;\n }\n\n this.timerId = window.setTimeout(() => {\n this.responseToken = generateRandomAlphaNumericString(50);\n const { callback, 'expired-callback': expiredCallback } = this.params;\n if (callback) {\n try {\n callback(this.responseToken);\n } catch (e) {}\n }\n\n this.timerId = window.setTimeout(() => {\n this.timerId = null;\n this.responseToken = null;\n if (expiredCallback) {\n try {\n expiredCallback();\n } catch (e) {}\n }\n\n if (this.isVisible) {\n this.execute();\n }\n }, _EXPIRATION_TIME_MS);\n }, _SOLVE_TIME_MS);\n }\n\n private checkIfDeleted(): void {\n if (this.deleted) {\n throw new Error('reCAPTCHA mock was already deleted!');\n }\n }\n}\n\nfunction generateRandomAlphaNumericString(len: number): string {\n const chars = [];\n const allowedChars =\n '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n for (let i = 0; i < len; i++) {\n chars.push(\n allowedChars.charAt(Math.floor(Math.random() * allowedChars.length))\n );\n }\n return chars.join('');\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { querystring } from '@firebase/util';\n\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert, _createError } from '../../core/util/assert';\nimport { Delay } from '../../core/util/delay';\nimport { AuthInternal } from '../../model/auth';\nimport { _window } from '../auth_window';\nimport * as jsHelpers from '../load_js';\nimport { Recaptcha } from './recaptcha';\nimport { MockReCaptcha } from './recaptcha_mock';\n\n// ReCaptcha will load using the same callback, so the callback function needs\n// to be kept around\nexport const _JSLOAD_CALLBACK = jsHelpers._generateCallbackName('rcb');\nconst NETWORK_TIMEOUT_DELAY = new Delay(30000, 60000);\nconst RECAPTCHA_BASE = 'https://www.google.com/recaptcha/api.js?';\n\n/**\n * We need to mark this interface as internal explicitly to exclude it in the public typings, because\n * it references AuthInternal which has a circular dependency with UserInternal.\n *\n * @internal\n */\nexport interface ReCaptchaLoader {\n load(auth: AuthInternal, hl?: string): Promise<Recaptcha>;\n clearedOneInstance(): void;\n}\n\n/**\n * Loader for the GReCaptcha library. There should only ever be one of this.\n */\nexport class ReCaptchaLoaderImpl implements ReCaptchaLoader {\n private hostLanguage = '';\n private counter = 0;\n private readonly librarySeparatelyLoaded = !!_window().grecaptcha;\n\n load(auth: AuthInternal, hl = ''): Promise<Recaptcha> {\n _assert(isHostLanguageValid(hl), auth, AuthErrorCode.ARGUMENT_ERROR);\n\n if (this.shouldResolveImmediately(hl)) {\n return Promise.resolve(_window().grecaptcha!);\n }\n return new Promise<Recaptcha>((resolve, reject) => {\n const networkTimeout = _window().setTimeout(() => {\n reject(_createError(auth, AuthErrorCode.NETWORK_REQUEST_FAILED));\n }, NETWORK_TIMEOUT_DELAY.get());\n\n _window()[_JSLOAD_CALLBACK] = () => {\n _window().clearTimeout(networkTimeout);\n delete _window()[_JSLOAD_CALLBACK];\n\n const recaptcha = _window().grecaptcha;\n\n if (!recaptcha) {\n reject(_createError(auth, AuthErrorCode.INTERNAL_ERROR));\n return;\n }\n\n // Wrap the greptcha render function so that we know if the developer has\n // called it separately\n const render = recaptcha.render;\n recaptcha.render = (container, params) => {\n const widgetId = render(container, params);\n this.counter++;\n return widgetId;\n };\n\n this.hostLanguage = hl;\n resolve(recaptcha);\n };\n\n const url = `${RECAPTCHA_BASE}?${querystring({\n onload: _JSLOAD_CALLBACK,\n render: 'explicit',\n hl\n })}`;\n\n jsHelpers._loadJS(url).catch(() => {\n clearTimeout(networkTimeout);\n reject(_createError(auth, AuthErrorCode.INTERNAL_ERROR));\n });\n });\n }\n\n clearedOneInstance(): void {\n this.counter--;\n }\n\n private shouldResolveImmediately(hl: string): boolean {\n // We can resolve immediately if:\n // \u2022 grecaptcha is already defined AND (\n // 1. the requested language codes are the same OR\n // 2. there exists already a ReCaptcha on the page\n // 3. the library was already loaded by the app\n // In cases (2) and (3), we _can't_ reload as it would break the recaptchas\n // that are already in the page\n return (\n !!_window().grecaptcha &&\n (hl === this.hostLanguage ||\n this.counter > 0 ||\n this.librarySeparatelyLoaded)\n );\n }\n}\n\nfunction isHostLanguageValid(hl: string): boolean {\n return hl.length <= 6 && /^\\s*[a-zA-Z0-9\\-]*\\s*$/.test(hl);\n}\n\nexport class MockReCaptchaLoaderImpl implements ReCaptchaLoader {\n async load(auth: AuthInternal): Promise<Recaptcha> {\n return new MockReCaptcha(auth);\n }\n\n clearedOneInstance(): void {}\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Auth } from '../../model/public_types';\nimport { getRecaptchaParams } from '../../api/authentication/recaptcha';\nimport { _castAuth } from '../../core/auth/auth_impl';\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert } from '../../core/util/assert';\nimport { _isHttpOrHttps } from '../../core/util/location';\nimport { ApplicationVerifierInternal } from '../../model/application_verifier';\nimport { AuthInternal } from '../../model/auth';\nimport { _window } from '../auth_window';\nimport { _isWorker } from '../util/worker';\nimport { Parameters, Recaptcha } from './recaptcha';\nimport {\n MockReCaptchaLoaderImpl,\n ReCaptchaLoader,\n ReCaptchaLoaderImpl\n} from './recaptcha_loader';\n\nexport const RECAPTCHA_VERIFIER_TYPE = 'recaptcha';\n\nconst DEFAULT_PARAMS: Parameters = {\n theme: 'light',\n type: 'image'\n};\n\ntype TokenCallback = (token: string) => void;\n\n/**\n * An {@link https://www.google.com/recaptcha/ | reCAPTCHA}-based application verifier.\n *\n * @public\n */\nexport class RecaptchaVerifier implements ApplicationVerifierInternal {\n /**\n * The application verifier type.\n *\n * @remarks\n * For a reCAPTCHA verifier, this is 'recaptcha'.\n */\n readonly type = RECAPTCHA_VERIFIER_TYPE;\n private destroyed = false;\n private widgetId: number | null = null;\n private readonly container: HTMLElement;\n private readonly isInvisible: boolean;\n private readonly tokenChangeListeners = new Set<TokenCallback>();\n private renderPromise: Promise<number> | null = null;\n private readonly auth: AuthInternal;\n\n /** @internal */\n readonly _recaptchaLoader: ReCaptchaLoader;\n private recaptcha: Recaptcha | null = null;\n\n /**\n *\n * @param containerOrId - The reCAPTCHA container parameter.\n *\n * @remarks\n * This has different meaning depending on whether the reCAPTCHA is hidden or visible. For a\n * visible reCAPTCHA the container must be empty. If a string is used, it has to correspond to\n * an element ID. The corresponding element must also must be in the DOM at the time of\n * initialization.\n *\n * @param parameters - The optional reCAPTCHA parameters.\n *\n * @remarks\n * Check the reCAPTCHA docs for a comprehensive list. All parameters are accepted except for\n * the sitekey. Firebase Auth backend provisions a reCAPTCHA for each project and will\n * configure this upon rendering. For an invisible reCAPTCHA, a size key must have the value\n * 'invisible'.\n *\n * @param authExtern - The corresponding Firebase Auth instance.\n *\n * @remarks\n * If none is provided, the default Firebase Auth instance is used. A Firebase Auth instance\n * must be initialized with an API key, otherwise an error will be thrown.\n */\n constructor(\n containerOrId: HTMLElement | string,\n private readonly parameters: Parameters = {\n ...DEFAULT_PARAMS\n },\n authExtern: Auth\n ) {\n this.auth = _castAuth(authExtern);\n this.isInvisible = this.parameters.size === 'invisible';\n _assert(\n typeof document !== 'undefined',\n this.auth,\n AuthErrorCode.OPERATION_NOT_SUPPORTED\n );\n const container =\n typeof containerOrId === 'string'\n ? document.getElementById(containerOrId)\n : containerOrId;\n _assert(container, this.auth, AuthErrorCode.ARGUMENT_ERROR);\n\n this.container = container;\n this.parameters.callback = this.makeTokenCallback(this.parameters.callback);\n\n this._recaptchaLoader = this.auth.settings.appVerificationDisabledForTesting\n ? new MockReCaptchaLoaderImpl()\n : new ReCaptchaLoaderImpl();\n\n this.validateStartingState();\n // TODO: Figure out if sdk version is needed\n }\n\n /**\n * Waits for the user to solve the reCAPTCHA and resolves with the reCAPTCHA token.\n *\n * @returns A Promise for the reCAPTCHA token.\n */\n async verify(): Promise<string> {\n this.assertNotDestroyed();\n const id = await this.render();\n const recaptcha = this.getAssertedRecaptcha();\n\n const response = recaptcha.getResponse(id);\n if (response) {\n return response;\n }\n\n return new Promise<string>(resolve => {\n const tokenChange = (token: string): void => {\n if (!token) {\n return; // Ignore token expirations.\n }\n this.tokenChangeListeners.delete(tokenChange);\n resolve(token);\n };\n\n this.tokenChangeListeners.add(tokenChange);\n if (this.isInvisible) {\n recaptcha.execute(id);\n }\n });\n }\n\n /**\n * Renders the reCAPTCHA widget on the page.\n *\n * @returns A Promise that resolves with the reCAPTCHA widget ID.\n */\n render(): Promise<number> {\n try {\n this.assertNotDestroyed();\n } catch (e) {\n // This method returns a promise. Since it's not async (we want to return the\n // _same_ promise if rendering is still occurring), the API surface should\n // reject with the error rather than just throw\n return Promise.reject(e);\n }\n\n if (this.renderPromise) {\n return this.renderPromise;\n }\n\n this.renderPromise = this.makeRenderPromise().catch(e => {\n this.renderPromise = null;\n throw e;\n });\n\n return this.renderPromise;\n }\n\n /** @internal */\n _reset(): void {\n this.assertNotDestroyed();\n if (this.widgetId !== null) {\n this.getAssertedRecaptcha().reset(this.widgetId);\n }\n }\n\n /**\n * Clears the reCAPTCHA widget from the page and destroys the instance.\n */\n clear(): void {\n this.assertNotDestroyed();\n this.destroyed = true;\n this._recaptchaLoader.clearedOneInstance();\n if (!this.isInvisible) {\n this.container.childNodes.forEach(node => {\n this.container.removeChild(node);\n });\n }\n }\n\n private validateStartingState(): void {\n _assert(!this.parameters.sitekey, this.auth, AuthErrorCode.ARGUMENT_ERROR);\n _assert(\n this.isInvisible || !this.container.hasChildNodes(),\n this.auth,\n AuthErrorCode.ARGUMENT_ERROR\n );\n _assert(\n typeof document !== 'undefined',\n this.auth,\n AuthErrorCode.OPERATION_NOT_SUPPORTED\n );\n }\n\n private makeTokenCallback(\n existing: TokenCallback | string | undefined\n ): TokenCallback {\n return token => {\n this.tokenChangeListeners.forEach(listener => listener(token));\n if (typeof existing === 'function') {\n existing(token);\n } else if (typeof existing === 'string') {\n const globalFunc = _window()[existing];\n if (typeof globalFunc === 'function') {\n globalFunc(token);\n }\n }\n };\n }\n\n private assertNotDestroyed(): void {\n _assert(!this.destroyed, this.auth, AuthErrorCode.INTERNAL_ERROR);\n }\n\n private async makeRenderPromise(): Promise<number> {\n await this.init();\n if (!this.widgetId) {\n let container = this.container;\n if (!this.isInvisible) {\n const guaranteedEmpty = document.createElement('div');\n container.appendChild(guaranteedEmpty);\n container = guaranteedEmpty;\n }\n\n this.widgetId = this.getAssertedRecaptcha().render(\n container,\n this.parameters\n );\n }\n\n return this.widgetId;\n }\n\n private async init(): Promise<void> {\n _assert(\n _isHttpOrHttps() && !_isWorker(),\n this.auth,\n AuthErrorCode.INTERNAL_ERROR\n );\n\n await domReady();\n this.recaptcha = await this._recaptchaLoader.load(\n this.auth,\n this.auth.languageCode || undefined\n );\n\n const siteKey = await getRecaptchaParams(this.auth);\n _assert(siteKey, this.auth, AuthErrorCode.INTERNAL_ERROR);\n this.parameters.sitekey = siteKey;\n }\n\n private getAssertedRecaptcha(): Recaptcha {\n _assert(this.recaptcha, this.auth, AuthErrorCode.INTERNAL_ERROR);\n return this.recaptcha;\n }\n}\n\nfunction domReady(): Promise<void> {\n let resolver: (() => void) | null = null;\n return new Promise<void>(resolve => {\n if (document.readyState === 'complete') {\n resolve();\n return;\n }\n\n // Document not ready, wait for load before resolving.\n // Save resolver, so we can remove listener in case it was externally\n // cancelled.\n resolver = () => resolve();\n window.addEventListener('load', resolver);\n }).catch(e => {\n if (resolver) {\n window.removeEventListener('load', resolver);\n }\n\n throw e;\n });\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ApplicationVerifier,\n Auth,\n ConfirmationResult,\n PhoneInfoOptions,\n ProviderId,\n User,\n UserCredential\n} from '../../model/public_types';\n\nimport { startEnrollPhoneMfa } from '../../api/account_management/mfa';\nimport { startSignInPhoneMfa } from '../../api/authentication/mfa';\nimport { sendPhoneVerificationCode } from '../../api/authentication/sms';\nimport { ApplicationVerifierInternal } from '../../model/application_verifier';\nimport { PhoneAuthCredential } from '../../core/credentials/phone';\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assertLinkedStatus, _link } from '../../core/user/link_unlink';\nimport { _assert } from '../../core/util/assert';\nimport { AuthInternal } from '../../model/auth';\nimport {\n linkWithCredential,\n reauthenticateWithCredential,\n signInWithCredential\n} from '../../core/strategies/credential';\nimport {\n MultiFactorSessionImpl,\n MultiFactorSessionType\n} from '../../mfa/mfa_session';\nimport { UserInternal } from '../../model/user';\nimport { RECAPTCHA_VERIFIER_TYPE } from '../recaptcha/recaptcha_verifier';\nimport { _castAuth } from '../../core/auth/auth_impl';\nimport { getModularInstance } from '@firebase/util';\n\ninterface OnConfirmationCallback {\n (credential: PhoneAuthCredential): Promise<UserCredential>;\n}\n\nclass ConfirmationResultImpl implements ConfirmationResult {\n constructor(\n readonly verificationId: string,\n private readonly onConfirmation: OnConfirmationCallback\n ) {}\n\n confirm(verificationCode: string): Promise<UserCredential> {\n const authCredential = PhoneAuthCredential._fromVerification(\n this.verificationId,\n verificationCode\n );\n return this.onConfirmation(authCredential);\n }\n}\n\n/**\n * Asynchronously signs in using a phone number.\n *\n * @remarks\n * This method sends a code via SMS to the given\n * phone number, and returns a {@link ConfirmationResult}. After the user\n * provides the code sent to their phone, call {@link ConfirmationResult.confirm}\n * with the code to sign the user in.\n *\n * For abuse prevention, this method also requires a {@link ApplicationVerifier}.\n * This SDK includes a reCAPTCHA-based implementation, {@link RecaptchaVerifier}.\n *\n * @example\n * ```javascript\n * // 'recaptcha-container' is the ID of an element in the DOM.\n * const applicationVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');\n * const confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, applicationVerifier);\n * // Obtain a verificationCode from the user.\n * const credential = await confirmationResult.confirm(verificationCode);\n * ```\n *\n * @param auth - The Auth instance.\n * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101).\n * @param appVerifier - The {@link ApplicationVerifier}.\n *\n * @public\n */\nexport async function signInWithPhoneNumber(\n auth: Auth,\n phoneNumber: string,\n appVerifier: ApplicationVerifier\n): Promise<ConfirmationResult> {\n const authInternal = _castAuth(auth);\n const verificationId = await _verifyPhoneNumber(\n authInternal,\n phoneNumber,\n getModularInstance(appVerifier as ApplicationVerifierInternal)\n );\n return new ConfirmationResultImpl(verificationId, cred =>\n signInWithCredential(authInternal, cred)\n );\n}\n\n/**\n * Links the user account with the given phone number.\n *\n * @param user - The user.\n * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101).\n * @param appVerifier - The {@link ApplicationVerifier}.\n *\n * @public\n */\nexport async function linkWithPhoneNumber(\n user: User,\n phoneNumber: string,\n appVerifier: ApplicationVerifier\n): Promise<ConfirmationResult> {\n const userInternal = getModularInstance(user) as UserInternal;\n await _assertLinkedStatus(false, userInternal, ProviderId.PHONE);\n const verificationId = await _verifyPhoneNumber(\n userInternal.auth,\n phoneNumber,\n getModularInstance(appVerifier as ApplicationVerifierInternal)\n );\n return new ConfirmationResultImpl(verificationId, cred =>\n linkWithCredential(userInternal, cred)\n );\n}\n\n/**\n * Re-authenticates a user using a fresh phne credential.\n *\n * @remarks Use before operations such as {@link updatePassword} that require tokens from recent sign-in attempts.\n *\n * @param user - The user.\n * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101).\n * @param appVerifier - The {@link ApplicationVerifier}.\n *\n * @public\n */\nexport async function reauthenticateWithPhoneNumber(\n user: User,\n phoneNumber: string,\n appVerifier: ApplicationVerifier\n): Promise<ConfirmationResult> {\n const userInternal = getModularInstance(user) as UserInternal;\n const verificationId = await _verifyPhoneNumber(\n userInternal.auth,\n phoneNumber,\n getModularInstance(appVerifier as ApplicationVerifierInternal)\n );\n return new ConfirmationResultImpl(verificationId, cred =>\n reauthenticateWithCredential(userInternal, cred)\n );\n}\n\n/**\n * Returns a verification ID to be used in conjunction with the SMS code that is sent.\n *\n */\nexport async function _verifyPhoneNumber(\n auth: AuthInternal,\n options: PhoneInfoOptions | string,\n verifier: ApplicationVerifierInternal\n): Promise<string> {\n const recaptchaToken = await verifier.verify();\n\n try {\n _assert(\n typeof recaptchaToken === 'string',\n auth,\n AuthErrorCode.ARGUMENT_ERROR\n );\n _assert(\n verifier.type === RECAPTCHA_VERIFIER_TYPE,\n auth,\n AuthErrorCode.ARGUMENT_ERROR\n );\n\n let phoneInfoOptions: PhoneInfoOptions;\n\n if (typeof options === 'string') {\n phoneInfoOptions = {\n phoneNumber: options\n };\n } else {\n phoneInfoOptions = options;\n }\n\n if ('session' in phoneInfoOptions) {\n const session = phoneInfoOptions.session as MultiFactorSessionImpl;\n\n if ('phoneNumber' in phoneInfoOptions) {\n _assert(\n session.type === MultiFactorSessionType.ENROLL,\n auth,\n AuthErrorCode.INTERNAL_ERROR\n );\n const response = await startEnrollPhoneMfa(auth, {\n idToken: session.credential,\n phoneEnrollmentInfo: {\n phoneNumber: phoneInfoOptions.phoneNumber,\n recaptchaToken\n }\n });\n return response.phoneSessionInfo.sessionInfo;\n } else {\n _assert(\n session.type === MultiFactorSessionType.SIGN_IN,\n auth,\n AuthErrorCode.INTERNAL_ERROR\n );\n const mfaEnrollmentId =\n phoneInfoOptions.multiFactorHint?.uid ||\n phoneInfoOptions.multiFactorUid;\n _assert(mfaEnrollmentId, auth, AuthErrorCode.MISSING_MFA_INFO);\n const response = await startSignInPhoneMfa(auth, {\n mfaPendingCredential: session.credential,\n mfaEnrollmentId,\n phoneSignInInfo: {\n recaptchaToken\n }\n });\n return response.phoneResponseInfo.sessionInfo;\n }\n } else {\n const { sessionInfo } = await sendPhoneVerificationCode(auth, {\n phoneNumber: phoneInfoOptions.phoneNumber,\n recaptchaToken\n });\n return sessionInfo;\n }\n } finally {\n verifier._reset();\n }\n}\n\n/**\n * Updates the user's phone number.\n *\n * @example\n * ```\n * // 'recaptcha-container' is the ID of an element in the DOM.\n * const applicationVerifier = new RecaptchaVerifier('recaptcha-container');\n * const provider = new PhoneAuthProvider(auth);\n * const verificationId = await provider.verifyPhoneNumber('+16505550101', applicationVerifier);\n * // Obtain the verificationCode from the user.\n * const phoneCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\n * await updatePhoneNumber(user, phoneCredential);\n * ```\n *\n * @param user - The user.\n * @param credential - A credential authenticating the new phone number.\n *\n * @public\n */\nexport async function updatePhoneNumber(\n user: User,\n credential: PhoneAuthCredential\n): Promise<void> {\n await _link(getModularInstance(user) as UserInternal, credential);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Auth,\n PhoneInfoOptions,\n ProviderId,\n SignInMethod,\n ApplicationVerifier,\n UserCredential\n} from '../../model/public_types';\n\nimport { SignInWithPhoneNumberResponse } from '../../api/authentication/sms';\nimport { ApplicationVerifierInternal as ApplicationVerifierInternal } from '../../model/application_verifier';\nimport { AuthInternal as AuthInternal } from '../../model/auth';\nimport { UserCredentialInternal as UserCredentialInternal } from '../../model/user';\nimport { PhoneAuthCredential } from '../../core/credentials/phone';\nimport { _verifyPhoneNumber } from '../strategies/phone';\nimport { _castAuth } from '../../core/auth/auth_impl';\nimport { AuthCredential } from '../../core';\nimport { FirebaseError, getModularInstance } from '@firebase/util';\nimport { TaggedWithTokenResponse } from '../../model/id_token';\n\n/**\n * Provider for generating an {@link PhoneAuthCredential}.\n *\n * @example\n * ```javascript\n * // 'recaptcha-container' is the ID of an element in the DOM.\n * const applicationVerifier = new RecaptchaVerifier('recaptcha-container');\n * const provider = new PhoneAuthProvider(auth);\n * const verificationId = await provider.verifyPhoneNumber('+16505550101', applicationVerifier);\n * // Obtain the verificationCode from the user.\n * const phoneCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\n * const userCredential = await signInWithCredential(auth, phoneCredential);\n * ```\n *\n * @public\n */\nexport class PhoneAuthProvider {\n /** Always set to {@link ProviderId}.PHONE. */\n static readonly PROVIDER_ID: 'phone' = ProviderId.PHONE;\n /** Always set to {@link SignInMethod}.PHONE. */\n static readonly PHONE_SIGN_IN_METHOD: 'phone' = SignInMethod.PHONE;\n\n /** Always set to {@link ProviderId}.PHONE. */\n readonly providerId = PhoneAuthProvider.PROVIDER_ID;\n private readonly auth: AuthInternal;\n\n /**\n * @param auth - The Firebase Auth instance in which sign-ins should occur.\n *\n */\n constructor(auth: Auth) {\n this.auth = _castAuth(auth);\n }\n\n /**\n *\n * Starts a phone number authentication flow by sending a verification code to the given phone\n * number.\n *\n * @example\n * ```javascript\n * const provider = new PhoneAuthProvider(auth);\n * const verificationId = await provider.verifyPhoneNumber(phoneNumber, applicationVerifier);\n * // Obtain verificationCode from the user.\n * const authCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\n * const userCredential = await signInWithCredential(auth, authCredential);\n * ```\n *\n * @example\n * An alternative flow is provided using the `signInWithPhoneNumber` method.\n * ```javascript\n * const confirmationResult = signInWithPhoneNumber(auth, phoneNumber, applicationVerifier);\n * // Obtain verificationCode from the user.\n * const userCredential = confirmationResult.confirm(verificationCode);\n * ```\n *\n * @param phoneInfoOptions - The user's {@link PhoneInfoOptions}. The phone number should be in\n * E.164 format (e.g. +16505550101).\n * @param applicationVerifier - For abuse prevention, this method also requires a\n * {@link ApplicationVerifier}. This SDK includes a reCAPTCHA-based implementation,\n * {@link RecaptchaVerifier}.\n *\n * @returns A Promise for a verification ID that can be passed to\n * {@link PhoneAuthProvider.credential} to identify this flow..\n */\n verifyPhoneNumber(\n phoneOptions: PhoneInfoOptions | string,\n applicationVerifier: ApplicationVerifier\n ): Promise<string> {\n return _verifyPhoneNumber(\n this.auth,\n phoneOptions,\n getModularInstance(applicationVerifier as ApplicationVerifierInternal)\n );\n }\n\n /**\n * Creates a phone auth credential, given the verification ID from\n * {@link PhoneAuthProvider.verifyPhoneNumber} and the code that was sent to the user's\n * mobile device.\n *\n * @example\n * ```javascript\n * const provider = new PhoneAuthProvider(auth);\n * const verificationId = provider.verifyPhoneNumber(phoneNumber, applicationVerifier);\n * // Obtain verificationCode from the user.\n * const authCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\n * const userCredential = signInWithCredential(auth, authCredential);\n * ```\n *\n * @example\n * An alternative flow is provided using the `signInWithPhoneNumber` method.\n * ```javascript\n * const confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, applicationVerifier);\n * // Obtain verificationCode from the user.\n * const userCredential = await confirmationResult.confirm(verificationCode);\n * ```\n *\n * @param verificationId - The verification ID returned from {@link PhoneAuthProvider.verifyPhoneNumber}.\n * @param verificationCode - The verification code sent to the user's mobile device.\n *\n * @returns The auth provider credential.\n */\n static credential(\n verificationId: string,\n verificationCode: string\n ): PhoneAuthCredential {\n return PhoneAuthCredential._fromVerification(\n verificationId,\n verificationCode\n );\n }\n\n /**\n * Generates an {@link AuthCredential} from a {@link UserCredential}.\n * @param userCredential\n */\n static credentialFromResult(\n userCredential: UserCredential\n ): AuthCredential | null {\n const credential = userCredential as UserCredentialInternal;\n return PhoneAuthProvider.credentialFromTaggedObject(credential);\n }\n\n /**\n * Returns an {@link AuthCredential} when passed an error.\n *\n * @remarks\n *\n * This method works for errors like\n * `auth/account-exists-with-different-credentials`. This is useful for\n * recovering when attempting to set a user's phone number but the number\n * in question is already tied to another account. For example, the following\n * code tries to update the current user's phone number, and if that\n * fails, links the user with the account associated with that number:\n *\n * ```js\n * const provider = new PhoneAuthProvider(auth);\n * const verificationId = await provider.verifyPhoneNumber(number, verifier);\n * try {\n * const code = ''; // Prompt the user for the verification code\n * await updatePhoneNumber(\n * auth.currentUser,\n * PhoneAuthProvider.credential(verificationId, code));\n * } catch (e) {\n * if (e.code === 'auth/account-exists-with-different-credential') {\n * const cred = PhoneAuthProvider.credentialFromError(e);\n * await linkWithCredential(auth.currentUser, cred);\n * }\n * }\n *\n * // At this point, auth.currentUser.phoneNumber === number.\n * ```\n *\n * @param error\n */\n static credentialFromError(error: FirebaseError): AuthCredential | null {\n return PhoneAuthProvider.credentialFromTaggedObject(\n (error.customData || {}) as TaggedWithTokenResponse\n );\n }\n\n private static credentialFromTaggedObject({\n _tokenResponse: tokenResponse\n }: TaggedWithTokenResponse): AuthCredential | null {\n if (!tokenResponse) {\n return null;\n }\n const { phoneNumber, temporaryProof } =\n tokenResponse as SignInWithPhoneNumberResponse;\n if (phoneNumber && temporaryProof) {\n return PhoneAuthCredential._fromTokenResponse(\n phoneNumber,\n temporaryProof\n );\n }\n return null;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Auth,\n AuthProvider,\n PopupRedirectResolver,\n User,\n UserCredential\n} from '../../model/public_types';\n\nimport { _castAuth } from '../../core/auth/auth_impl';\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert, debugAssert, _createError } from '../../core/util/assert';\nimport { Delay } from '../../core/util/delay';\nimport { _generateEventId } from '../../core/util/event_id';\nimport { AuthInternal } from '../../model/auth';\nimport {\n AuthEventType,\n PopupRedirectResolverInternal\n} from '../../model/popup_redirect';\nimport { UserInternal } from '../../model/user';\nimport { _withDefaultResolver } from '../../core/util/resolver';\nimport { AuthPopup } from '../util/popup';\nimport { AbstractPopupRedirectOperation } from '../../core/strategies/abstract_popup_redirect_operation';\nimport { FederatedAuthProvider } from '../../core/providers/federated';\nimport { getModularInstance } from '@firebase/util';\n\n/*\n * The event timeout is the same on mobile and desktop, no need for Delay.\n */\nexport const enum _Timeout {\n AUTH_EVENT = 2000\n}\nexport const _POLL_WINDOW_CLOSE_TIMEOUT = new Delay(2000, 10000);\n\n/**\n * Authenticates a Firebase client using a popup-based OAuth authentication flow.\n *\n * @remarks\n * If succeeds, returns the signed in user along with the provider's credential. If sign in was\n * unsuccessful, returns an error object containing additional information about the error.\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new FacebookAuthProvider();\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a Facebook Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * ```\n *\n * @param auth - The Auth instance.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n *\n * @public\n */\nexport async function signInWithPopup(\n auth: Auth,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<UserCredential> {\n const authInternal = _castAuth(auth);\n _assert(\n provider instanceof FederatedAuthProvider,\n auth,\n AuthErrorCode.ARGUMENT_ERROR\n );\n\n const resolverInternal = _withDefaultResolver(authInternal, resolver);\n const action = new PopupOperation(\n authInternal,\n AuthEventType.SIGN_IN_VIA_POPUP,\n provider,\n resolverInternal\n );\n return action.executeNotNull();\n}\n\n/**\n * Reauthenticates the current user with the specified {@link OAuthProvider} using a pop-up based\n * OAuth flow.\n *\n * @remarks\n * If the reauthentication is successful, the returned result will contain the user and the\n * provider's credential.\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new FacebookAuthProvider();\n * const result = await signInWithPopup(auth, provider);\n * // Reauthenticate using a popup.\n * await reauthenticateWithPopup(result.user, provider);\n * ```\n *\n * @param user - The user.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n * @public\n */\nexport async function reauthenticateWithPopup(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<UserCredential> {\n const userInternal = getModularInstance(user) as UserInternal;\n _assert(\n provider instanceof FederatedAuthProvider,\n userInternal.auth,\n AuthErrorCode.ARGUMENT_ERROR\n );\n\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\n const action = new PopupOperation(\n userInternal.auth,\n AuthEventType.REAUTH_VIA_POPUP,\n provider,\n resolverInternal,\n userInternal\n );\n return action.executeNotNull();\n}\n\n/**\n * Links the authenticated provider to the user account using a pop-up based OAuth flow.\n *\n * @remarks\n * If the linking is successful, the returned result will contain the user and the provider's credential.\n *\n *\n * @example\n * ```javascript\n * // Sign in using some other provider.\n * const result = await signInWithEmailAndPassword(auth, email, password);\n * // Link using a popup.\n * const provider = new FacebookAuthProvider();\n * await linkWithPopup(result.user, provider);\n * ```\n *\n * @param user - The user.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n * @public\n */\nexport async function linkWithPopup(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<UserCredential> {\n const userInternal = getModularInstance(user) as UserInternal;\n _assert(\n provider instanceof FederatedAuthProvider,\n userInternal.auth,\n AuthErrorCode.ARGUMENT_ERROR\n );\n\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\n\n const action = new PopupOperation(\n userInternal.auth,\n AuthEventType.LINK_VIA_POPUP,\n provider,\n resolverInternal,\n userInternal\n );\n return action.executeNotNull();\n}\n\n/**\n * Popup event manager. Handles the popup's entire lifecycle; listens to auth\n * events\n *\n */\nclass PopupOperation extends AbstractPopupRedirectOperation {\n // Only one popup is ever shown at once. The lifecycle of the current popup\n // can be managed / cancelled by the constructor.\n private static currentPopupAction: PopupOperation | null = null;\n private authWindow: AuthPopup | null = null;\n private pollId: number | null = null;\n\n constructor(\n auth: AuthInternal,\n filter: AuthEventType,\n private readonly provider: AuthProvider,\n resolver: PopupRedirectResolverInternal,\n user?: UserInternal\n ) {\n super(auth, filter, resolver, user);\n if (PopupOperation.currentPopupAction) {\n PopupOperation.currentPopupAction.cancel();\n }\n\n PopupOperation.currentPopupAction = this;\n }\n\n async executeNotNull(): Promise<UserCredential> {\n const result = await this.execute();\n _assert(result, this.auth, AuthErrorCode.INTERNAL_ERROR);\n return result;\n }\n\n async onExecution(): Promise<void> {\n debugAssert(\n this.filter.length === 1,\n 'Popup operations only handle one event'\n );\n const eventId = _generateEventId();\n this.authWindow = await this.resolver._openPopup(\n this.auth,\n this.provider,\n this.filter[0], // There's always one, see constructor\n eventId\n );\n this.authWindow.associatedEvent = eventId;\n\n // Check for web storage support and origin validation _after_ the popup is\n // loaded. These operations are slow (~1 second or so) Rather than\n // waiting on them before opening the window, optimistically open the popup\n // and check for storage support at the same time. If storage support is\n // not available, this will cause the whole thing to reject properly. It\n // will also close the popup, but since the promise has already rejected,\n // the popup closed by user poll will reject into the void.\n this.resolver._originValidation(this.auth).catch(e => {\n this.reject(e);\n });\n\n this.resolver._isIframeWebStorageSupported(this.auth, isSupported => {\n if (!isSupported) {\n this.reject(\n _createError(this.auth, AuthErrorCode.WEB_STORAGE_UNSUPPORTED)\n );\n }\n });\n\n // Handle user closure. Notice this does *not* use await\n this.pollUserCancellation();\n }\n\n get eventId(): string | null {\n return this.authWindow?.associatedEvent || null;\n }\n\n cancel(): void {\n this.reject(_createError(this.auth, AuthErrorCode.EXPIRED_POPUP_REQUEST));\n }\n\n cleanUp(): void {\n if (this.authWindow) {\n this.authWindow.close();\n }\n\n if (this.pollId) {\n window.clearTimeout(this.pollId);\n }\n\n this.authWindow = null;\n this.pollId = null;\n PopupOperation.currentPopupAction = null;\n }\n\n private pollUserCancellation(): void {\n const poll = (): void => {\n if (this.authWindow?.window?.closed) {\n // Make sure that there is sufficient time for whatever action to\n // complete. The window could have closed but the sign in network\n // call could still be in flight.\n this.pollId = window.setTimeout(() => {\n this.pollId = null;\n this.reject(\n _createError(this.auth, AuthErrorCode.POPUP_CLOSED_BY_USER)\n );\n }, _Timeout.AUTH_EVENT);\n return;\n }\n\n this.pollId = window.setTimeout(poll, _POLL_WINDOW_CLOSE_TIMEOUT.get());\n };\n\n poll();\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { FactorId, MultiFactorAssertion } from '../model/public_types';\nimport { debugFail } from '../core/util/assert';\nimport { MultiFactorSessionImpl, MultiFactorSessionType } from './mfa_session';\nimport { FinalizeMfaResponse } from '../api/authentication/mfa';\nimport { AuthInternal } from '../model/auth';\n\nexport abstract class MultiFactorAssertionImpl implements MultiFactorAssertion {\n protected constructor(readonly factorId: FactorId) {}\n\n _process(\n auth: AuthInternal,\n session: MultiFactorSessionImpl,\n displayName?: string | null\n ): Promise<FinalizeMfaResponse> {\n switch (session.type) {\n case MultiFactorSessionType.ENROLL:\n return this._finalizeEnroll(auth, session.credential, displayName);\n case MultiFactorSessionType.SIGN_IN:\n return this._finalizeSignIn(auth, session.credential);\n default:\n return debugFail('unexpected MultiFactorSessionType');\n }\n }\n\n abstract _finalizeEnroll(\n auth: AuthInternal,\n idToken: string,\n displayName?: string | null\n ): Promise<FinalizeMfaResponse>;\n abstract _finalizeSignIn(\n auth: AuthInternal,\n mfaPendingCredential: string\n ): Promise<FinalizeMfaResponse>;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n FactorId,\n PhoneMultiFactorAssertion\n} from '../../../model/public_types';\n\nimport { MultiFactorAssertionImpl } from '../../../mfa/mfa_assertion';\nimport { AuthInternal } from '../../../model/auth';\nimport { finalizeEnrollPhoneMfa } from '../../../api/account_management/mfa';\nimport { PhoneAuthCredential } from '../../../core/credentials/phone';\nimport {\n finalizeSignInPhoneMfa,\n FinalizeMfaResponse\n} from '../../../api/authentication/mfa';\n\n/**\n * {@inheritdoc PhoneMultiFactorAssertion}\n *\n * @public\n */\nexport class PhoneMultiFactorAssertionImpl\n extends MultiFactorAssertionImpl\n implements PhoneMultiFactorAssertion {\n private constructor(private readonly credential: PhoneAuthCredential) {\n super(FactorId.PHONE);\n }\n\n /** @internal */\n static _fromCredential(\n credential: PhoneAuthCredential\n ): PhoneMultiFactorAssertionImpl {\n return new PhoneMultiFactorAssertionImpl(credential);\n }\n\n /** @internal */\n _finalizeEnroll(\n auth: AuthInternal,\n idToken: string,\n displayName?: string | null\n ): Promise<FinalizeMfaResponse> {\n return finalizeEnrollPhoneMfa(auth, {\n idToken,\n displayName,\n phoneVerificationInfo: this.credential._makeVerificationRequest()\n });\n }\n\n /** @internal */\n _finalizeSignIn(\n auth: AuthInternal,\n mfaPendingCredential: string\n ): Promise<FinalizeMfaResponse> {\n return finalizeSignInPhoneMfa(auth, {\n mfaPendingCredential,\n phoneVerificationInfo: this.credential._makeVerificationRequest()\n });\n }\n}\n\n/**\n * Provider for generating a {@link PhoneMultiFactorAssertion}.\n *\n * @public\n */\nexport class PhoneMultiFactorGenerator {\n private constructor() {}\n\n /**\n * Provides a {@link PhoneMultiFactorAssertion} to confirm ownership of the phone second factor.\n *\n * @param phoneAuthCredential - A credential provided by {@link PhoneAuthProvider.credential}.\n * @returns A {@link PhoneMultiFactorAssertion} which can be used with\n * {@link MultiFactorResolver.resolveSignIn}\n */\n static assertion(credential: PhoneAuthCredential): PhoneMultiFactorAssertion {\n return PhoneMultiFactorAssertionImpl._fromCredential(credential);\n }\n}\n", "/**\n * Firebase Authentication\n *\n * @packageDocumentation\n */\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseApp, getApp, _getProvider } from '@firebase/app-exp';\n\nimport { initializeAuth } from './src';\nimport { registerAuth } from './src/core/auth/register';\nimport { ClientPlatform } from './src/core/util/version';\nimport { browserLocalPersistence } from './src/platform_browser/persistence/local_storage';\nimport { indexedDBLocalPersistence } from './src/platform_browser/persistence/indexed_db';\nimport { browserPopupRedirectResolver } from './src/platform_browser/popup_redirect';\nimport { Auth } from './src/model/public_types';\n\n// Public types\nexport {\n // Interfaces\n ActionCodeInfo,\n ActionCodeSettings,\n AdditionalUserInfo,\n ApplicationVerifier,\n Auth,\n AuthError,\n AuthErrorMap,\n AuthProvider,\n AuthSettings,\n Config,\n ConfirmationResult,\n IdTokenResult,\n MultiFactorAssertion,\n MultiFactorError,\n MultiFactorInfo,\n MultiFactorResolver,\n MultiFactorSession,\n MultiFactorUser,\n ParsedToken,\n Persistence,\n PhoneMultiFactorAssertion,\n PhoneMultiFactorEnrollInfoOptions,\n PhoneMultiFactorSignInInfoOptions,\n PhoneSingleFactorInfoOptions,\n PopupRedirectResolver,\n ReactNativeAsyncStorage,\n User,\n UserCredential,\n UserInfo,\n UserMetadata,\n UserProfile,\n PhoneInfoOptions,\n Dependencies,\n NextOrObserver,\n ErrorFn,\n CompleteFn,\n Unsubscribe\n} from './src/model/public_types';\n\n// Helper maps (not used internally)\nexport {\n FactorId,\n ProviderId,\n SignInMethod,\n OperationType,\n ActionCodeOperation\n} from './src/model/enum_maps';\n\n// Core functionality shared by all clients\nexport * from './src';\n\n// Additional DOM dependend functionality\n\n// persistence\nexport { browserLocalPersistence } from './src/platform_browser/persistence/local_storage';\nexport { browserSessionPersistence } from './src/platform_browser/persistence/session_storage';\nexport { indexedDBLocalPersistence } from './src/platform_browser/persistence/indexed_db';\n\n// providers\nexport { PhoneAuthProvider } from './src/platform_browser/providers/phone';\n\n// strategies\nexport {\n signInWithPhoneNumber,\n linkWithPhoneNumber,\n reauthenticateWithPhoneNumber,\n updatePhoneNumber\n} from './src/platform_browser/strategies/phone';\nexport {\n signInWithPopup,\n linkWithPopup,\n reauthenticateWithPopup\n} from './src/platform_browser/strategies/popup';\nexport {\n signInWithRedirect,\n linkWithRedirect,\n reauthenticateWithRedirect,\n getRedirectResult\n} from './src/platform_browser/strategies/redirect';\n\nexport { RecaptchaVerifier } from './src/platform_browser/recaptcha/recaptcha_verifier';\nexport { browserPopupRedirectResolver } from './src/platform_browser/popup_redirect';\n\n// MFA\nexport { PhoneMultiFactorGenerator } from './src/platform_browser/mfa/assertions/phone';\n\n/**\n * Initializes an Auth instance with platform specific default dependencies.\n *\n * @param app - The Firebase App.\n *\n * @public\n */\nexport function getAuth(app: FirebaseApp = getApp()): Auth {\n const provider = _getProvider(app, 'auth-exp');\n\n if (provider.isInitialized()) {\n return provider.getImmediate();\n }\n\n return initializeAuth(app, {\n popupRedirectResolver: browserPopupRedirectResolver,\n persistence: [indexedDBLocalPersistence, browserLocalPersistence]\n });\n}\n\nregisterAuth(ClientPlatform.BROWSER);\n", "export * from '@firebase/firestore';\n//# sourceMappingURL=index.esm.js.map\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Bootstrap for the Google JS Library (Closure).\n *\n * In uncompiled mode base.js will attempt to load Closure's deps file, unless\n * the global <code>CLOSURE_NO_DEPS</code> is set to true. This allows projects\n * to include their own deps file(s) from different locations.\n *\n * Avoid including base.js more than once. This is strictly discouraged and not\n * supported. goog.require(...) won't work properly in that case.\n *\n * @provideGoog\n */\n\n\n/**\n * @define {boolean} Overridden to true by the compiler.\n */\nvar COMPILED = false;\n\n\n/**\n * Base namespace for the Closure library. Checks to see goog is already\n * defined in the current scope before assigning to prevent clobbering if\n * base.js is loaded more than once.\n *\n * @const\n */\nvar goog = goog || {};\n\n/**\n * Reference to the global object.\n * https://www.ecma-international.org/ecma-262/9.0/index.html#sec-global-object\n *\n * More info on this implementation here:\n * https://docs.google.com/document/d/1NAeW4Wk7I7FV0Y2tcUFvQdGMc89k2vdgSXInw8_nvCI/edit\n *\n * @const\n * @suppress {undefinedVars} self won't be referenced unless `this` is falsy.\n * @type {!Global}\n */\ngoog.global =\n // Check `this` first for backwards compatibility.\n // Valid unless running as an ES module or in a function wrapper called\n // without setting `this` properly.\n // Note that base.js can't usefully be imported as an ES module, but it may\n // be compiled into bundles that are loadable as ES modules.\n this ||\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/self\n // For in-page browser environments and workers.\n self;\n\n\n/**\n * A hook for overriding the define values in uncompiled mode.\n *\n * In uncompiled mode, `CLOSURE_UNCOMPILED_DEFINES` may be defined before\n * loading base.js. If a key is defined in `CLOSURE_UNCOMPILED_DEFINES`,\n * `goog.define` will use the value instead of the default value. This\n * allows flags to be overwritten without compilation (this is normally\n * accomplished with the compiler's \"define\" flag).\n *\n * Example:\n * <pre>\n * var CLOSURE_UNCOMPILED_DEFINES = {'goog.DEBUG': false};\n * </pre>\n *\n * @type {Object<string, (string|number|boolean)>|undefined}\n */\ngoog.global.CLOSURE_UNCOMPILED_DEFINES;\n\n\n/**\n * A hook for overriding the define values in uncompiled or compiled mode,\n * like CLOSURE_UNCOMPILED_DEFINES but effective in compiled code. In\n * uncompiled code CLOSURE_UNCOMPILED_DEFINES takes precedence.\n *\n * Also unlike CLOSURE_UNCOMPILED_DEFINES the values must be number, boolean or\n * string literals or the compiler will emit an error.\n *\n * While any @define value may be set, only those set with goog.define will be\n * effective for uncompiled code.\n *\n * Example:\n * <pre>\n * var CLOSURE_DEFINES = {'goog.DEBUG': false} ;\n * </pre>\n *\n * @type {Object<string, (string|number|boolean)>|undefined}\n */\ngoog.global.CLOSURE_DEFINES;\n\n\n/**\n * Builds an object structure for the provided namespace path, ensuring that\n * names that already exist are not overwritten. For example:\n * \"a.b.c\" -> a = {};a.b={};a.b.c={};\n * Used by goog.provide and goog.exportSymbol.\n * @param {string} name The name of the object that this file defines.\n * @param {*=} object The object to expose at the end of the path.\n * @param {boolean=} overwriteImplicit If object is set and a previous call\n * implicitly constructed the namespace given by name, this parameter\n * controls whether object should overwrite the implicitly constructed\n * namespace or be merged into it. Defaults to false.\n * @param {?Object=} objectToExportTo The object to add the path to; if this\n * field is not specified, its value defaults to `goog.global`.\n * @private\n */\ngoog.exportPath_ = function(name, object, overwriteImplicit, objectToExportTo) {\n var parts = name.split('.');\n var cur = objectToExportTo || goog.global;\n\n // Internet Explorer exhibits strange behavior when throwing errors from\n // methods externed in this manner. See the testExportSymbolExceptions in\n // base_test.html for an example.\n if (!(parts[0] in cur) && typeof cur.execScript != 'undefined') {\n cur.execScript('var ' + parts[0]);\n }\n\n for (var part; parts.length && (part = parts.shift());) {\n if (!parts.length && object !== undefined) {\n if (!overwriteImplicit && goog.isObject(object) &&\n goog.isObject(cur[part])) {\n // Merge properties on object (the input parameter) with the existing\n // implicitly defined namespace, so as to not clobber previously\n // defined child namespaces.\n for (var prop in object) {\n if (object.hasOwnProperty(prop)) {\n cur[part][prop] = object[prop];\n }\n }\n } else {\n // Either there is no existing implicit namespace, or overwriteImplicit\n // is set to true, so directly assign object (the input parameter) to\n // the namespace.\n cur[part] = object;\n }\n } else if (cur[part] && cur[part] !== Object.prototype[part]) {\n cur = cur[part];\n } else {\n cur = cur[part] = {};\n }\n }\n};\n\n\n/**\n * Defines a named value. In uncompiled mode, the value is retrieved from\n * CLOSURE_DEFINES or CLOSURE_UNCOMPILED_DEFINES if the object is defined and\n * has the property specified, and otherwise used the defined defaultValue.\n * When compiled the default can be overridden using the compiler options or the\n * value set in the CLOSURE_DEFINES object. Returns the defined value so that it\n * can be used safely in modules. Note that the value type MUST be either\n * boolean, number, or string.\n *\n * @param {string} name The distinguished name to provide.\n * @param {T} defaultValue\n * @return {T} The defined value.\n * @template T\n */\ngoog.define = function(name, defaultValue) {\n var value = defaultValue;\n if (!COMPILED) {\n var uncompiledDefines = goog.global.CLOSURE_UNCOMPILED_DEFINES;\n var defines = goog.global.CLOSURE_DEFINES;\n if (uncompiledDefines &&\n // Anti DOM-clobbering runtime check (b/37736576).\n /** @type {?} */ (uncompiledDefines).nodeType === undefined &&\n Object.prototype.hasOwnProperty.call(uncompiledDefines, name)) {\n value = uncompiledDefines[name];\n } else if (\n defines &&\n // Anti DOM-clobbering runtime check (b/37736576).\n /** @type {?} */ (defines).nodeType === undefined &&\n Object.prototype.hasOwnProperty.call(defines, name)) {\n value = defines[name];\n }\n }\n return value;\n};\n\n\n/**\n * @define {number} Integer year indicating the set of browser features that are\n * guaranteed to be present. This is defined to include exactly features that\n * work correctly on all \"modern\" browsers that are stable on January 1 of the\n * specified year. For example,\n * ```js\n * if (goog.FEATURESET_YEAR >= 2019) {\n * // use APIs known to be available on all major stable browsers Jan 1, 2019\n * } else {\n * // polyfill for older browsers\n * }\n * ```\n * This is intended to be the primary define for removing\n * unnecessary browser compatibility code (such as ponyfills and workarounds),\n * and should inform the default value for most other defines:\n * ```js\n * const ASSUME_NATIVE_PROMISE =\n * goog.define('ASSUME_NATIVE_PROMISE', goog.FEATURESET_YEAR >= 2016);\n * ```\n *\n * The default assumption is that IE9 is the lowest supported browser, which was\n * first available Jan 1, 2012.\n *\n * TODO(user): Reference more thorough documentation when it's available.\n */\ngoog.FEATURESET_YEAR = goog.define('goog.FEATURESET_YEAR', 2012);\n\n\n/**\n * @define {boolean} DEBUG is provided as a convenience so that debugging code\n * that should not be included in a production. It can be easily stripped\n * by specifying --define goog.DEBUG=false to the Closure Compiler aka\n * JSCompiler. For example, most toString() methods should be declared inside an\n * \"if (goog.DEBUG)\" conditional because they are generally used for debugging\n * purposes and it is difficult for the JSCompiler to statically determine\n * whether they are used.\n */\ngoog.DEBUG = goog.define('goog.DEBUG', true);\n\n\n/**\n * @define {string} LOCALE defines the locale being used for compilation. It is\n * used to select locale specific data to be compiled in js binary. BUILD rule\n * can specify this value by \"--define goog.LOCALE=<locale_name>\" as a compiler\n * option.\n *\n * Take into account that the locale code format is important. You should use\n * the canonical Unicode format with hyphen as a delimiter. Language must be\n * lowercase, Language Script - Capitalized, Region - UPPERCASE.\n * There are few examples: pt-BR, en, en-US, sr-Latin-BO, zh-Hans-CN.\n *\n * See more info about locale codes here:\n * http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers\n *\n * For language codes you should use values defined by ISO 693-1. See it here\n * http://www.w3.org/WAI/ER/IG/ert/iso639.htm. There is only one exception from\n * this rule: the Hebrew language. For legacy reasons the old code (iw) should\n * be used instead of the new code (he).\n *\n */\ngoog.LOCALE = goog.define('goog.LOCALE', 'en'); // default to en\n\n\n/**\n * @define {boolean} Whether this code is running on trusted sites.\n *\n * On untrusted sites, several native functions can be defined or overridden by\n * external libraries like Prototype, Datejs, and JQuery and setting this flag\n * to false forces closure to use its own implementations when possible.\n *\n * If your JavaScript can be loaded by a third party site and you are wary about\n * relying on non-standard implementations, specify\n * \"--define goog.TRUSTED_SITE=false\" to the compiler.\n */\ngoog.TRUSTED_SITE = goog.define('goog.TRUSTED_SITE', true);\n\n\n/**\n * @define {boolean} Whether code that calls {@link goog.setTestOnly} should\n * be disallowed in the compilation unit.\n */\ngoog.DISALLOW_TEST_ONLY_CODE =\n goog.define('goog.DISALLOW_TEST_ONLY_CODE', COMPILED && !goog.DEBUG);\n\n\n/**\n * @define {boolean} Whether to use a Chrome app CSP-compliant method for\n * loading scripts via goog.require. @see appendScriptSrcNode_.\n */\ngoog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING =\n goog.define('goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING', false);\n\n\n/**\n * Defines a namespace in Closure.\n *\n * A namespace may only be defined once in a codebase. It may be defined using\n * goog.provide() or goog.module().\n *\n * The presence of one or more goog.provide() calls in a file indicates\n * that the file defines the given objects/namespaces.\n * Provided symbols must not be null or undefined.\n *\n * In addition, goog.provide() creates the object stubs for a namespace\n * (for example, goog.provide(\"goog.foo.bar\") will create the object\n * goog.foo.bar if it does not already exist).\n *\n * Build tools also scan for provide/require/module statements\n * to discern dependencies, build dependency files (see deps.js), etc.\n *\n * @see goog.require\n * @see goog.module\n * @param {string} name Namespace provided by this file in the form\n * \"goog.package.part\".\n * deprecated Use goog.module (see b/159289405)\n */\ngoog.provide = function(name) {\n if (goog.isInModuleLoader_()) {\n throw new Error('goog.provide cannot be used within a module.');\n }\n if (!COMPILED) {\n // Ensure that the same namespace isn't provided twice.\n // A goog.module/goog.provide maps a goog.require to a specific file\n if (goog.isProvided_(name)) {\n throw new Error('Namespace \"' + name + '\" already declared.');\n }\n }\n\n goog.constructNamespace_(name);\n};\n\n\n/**\n * @param {string} name Namespace provided by this file in the form\n * \"goog.package.part\".\n * @param {?Object=} object The object to embed in the namespace.\n * @param {boolean=} overwriteImplicit If object is set and a previous call\n * implicitly constructed the namespace given by name, this parameter\n * controls whether opt_obj should overwrite the implicitly constructed\n * namespace or be merged into it. Defaults to false.\n * @private\n */\ngoog.constructNamespace_ = function(name, object, overwriteImplicit) {\n if (!COMPILED) {\n delete goog.implicitNamespaces_[name];\n\n var namespace = name;\n while ((namespace = namespace.substring(0, namespace.lastIndexOf('.')))) {\n if (goog.getObjectByName(namespace)) {\n break;\n }\n goog.implicitNamespaces_[namespace] = true;\n }\n }\n\n goog.exportPath_(name, object, overwriteImplicit);\n};\n\n\n/**\n * Returns CSP nonce, if set for any script tag.\n * @param {?Window=} opt_window The window context used to retrieve the nonce.\n * Defaults to global context.\n * @return {string} CSP nonce or empty string if no nonce is present.\n */\ngoog.getScriptNonce = function(opt_window) {\n if (opt_window && opt_window != goog.global) {\n return goog.getScriptNonce_(opt_window.document);\n }\n if (goog.cspNonce_ === null) {\n goog.cspNonce_ = goog.getScriptNonce_(goog.global.document);\n }\n return goog.cspNonce_;\n};\n\n\n/**\n * According to the CSP3 spec a nonce must be a valid base64 string.\n * @see https://www.w3.org/TR/CSP3/#grammardef-base64-value\n * @private @const\n */\ngoog.NONCE_PATTERN_ = /^[\\w+/_-]+[=]{0,2}$/;\n\n\n/**\n * @private {?string}\n */\ngoog.cspNonce_ = null;\n\n\n/**\n * Returns CSP nonce, if set for any script tag.\n * @param {!Document} doc\n * @return {string} CSP nonce or empty string if no nonce is present.\n * @private\n */\ngoog.getScriptNonce_ = function(doc) {\n var script = doc.querySelector && doc.querySelector('script[nonce]');\n if (script) {\n // Try to get the nonce from the IDL property first, because browsers that\n // implement additional nonce protection features (currently only Chrome) to\n // prevent nonce stealing via CSS do not expose the nonce via attributes.\n // See https://github.com/whatwg/html/issues/2369\n var nonce = script['nonce'] || script.getAttribute('nonce');\n if (nonce && goog.NONCE_PATTERN_.test(nonce)) {\n return nonce;\n }\n }\n return '';\n};\n\n\n/**\n * Module identifier validation regexp.\n * Note: This is a conservative check, it is very possible to be more lenient,\n * the primary exclusion here is \"/\" and \"\\\" and a leading \".\", these\n * restrictions are intended to leave the door open for using goog.require\n * with relative file paths rather than module identifiers.\n * @private\n */\ngoog.VALID_MODULE_RE_ = /^[a-zA-Z_$][a-zA-Z0-9._$]*$/;\n\n\n/**\n * Defines a module in Closure.\n *\n * Marks that this file must be loaded as a module and claims the namespace.\n *\n * A namespace may only be defined once in a codebase. It may be defined using\n * goog.provide() or goog.module().\n *\n * goog.module() has three requirements:\n * - goog.module may not be used in the same file as goog.provide.\n * - goog.module must be the first statement in the file.\n * - only one goog.module is allowed per file.\n *\n * When a goog.module annotated file is loaded, it is enclosed in\n * a strict function closure. This means that:\n * - any variables declared in a goog.module file are private to the file\n * (not global), though the compiler is expected to inline the module.\n * - The code must obey all the rules of \"strict\" JavaScript.\n * - the file will be marked as \"use strict\"\n *\n * NOTE: unlike goog.provide, goog.module does not declare any symbols by\n * itself. If declared symbols are desired, use\n * goog.module.declareLegacyNamespace().\n *\n *\n * See the public goog.module proposal: http://goo.gl/Va1hin\n *\n * @param {string} name Namespace provided by this file in the form\n * \"goog.package.part\", is expected but not required.\n * @return {void}\n */\ngoog.module = function(name) {\n if (typeof name !== 'string' || !name ||\n name.search(goog.VALID_MODULE_RE_) == -1) {\n throw new Error('Invalid module identifier');\n }\n if (!goog.isInGoogModuleLoader_()) {\n throw new Error(\n 'Module ' + name + ' has been loaded incorrectly. Note, ' +\n 'modules cannot be loaded as normal scripts. They require some kind of ' +\n 'pre-processing step. You\\'re likely trying to load a module via a ' +\n 'script tag or as a part of a concatenated bundle without rewriting the ' +\n 'module. For more info see: ' +\n 'https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide.');\n }\n if (goog.moduleLoaderState_.moduleName) {\n throw new Error('goog.module may only be called once per module.');\n }\n\n // Store the module name for the loader.\n goog.moduleLoaderState_.moduleName = name;\n if (!COMPILED) {\n // Ensure that the same namespace isn't provided twice.\n // A goog.module/goog.provide maps a goog.require to a specific file\n if (goog.isProvided_(name)) {\n throw new Error('Namespace \"' + name + '\" already declared.');\n }\n delete goog.implicitNamespaces_[name];\n }\n};\n\n\n/**\n * @param {string} name The module identifier.\n * @return {?} The module exports for an already loaded module or null.\n *\n * Note: This is not an alternative to goog.require, it does not\n * indicate a hard dependency, instead it is used to indicate\n * an optional dependency or to access the exports of a module\n * that has already been loaded.\n * @suppress {missingProvide}\n */\ngoog.module.get = function(name) {\n return goog.module.getInternal_(name);\n};\n\n\n/**\n * @param {string} name The module identifier.\n * @return {?} The module exports for an already loaded module or null.\n * @private\n */\ngoog.module.getInternal_ = function(name) {\n if (!COMPILED) {\n if (name in goog.loadedModules_) {\n return goog.loadedModules_[name].exports;\n } else if (!goog.implicitNamespaces_[name]) {\n var ns = goog.getObjectByName(name);\n return ns != null ? ns : null;\n }\n }\n return null;\n};\n\n\n/**\n * Types of modules the debug loader can load.\n * @enum {string}\n */\ngoog.ModuleType = {\n ES6: 'es6',\n GOOG: 'goog'\n};\n\n\n/**\n * @private {?{\n * moduleName: (string|undefined),\n * declareLegacyNamespace:boolean,\n * type: ?goog.ModuleType\n * }}\n */\ngoog.moduleLoaderState_ = null;\n\n\n/**\n * @private\n * @return {boolean} Whether a goog.module or an es6 module is currently being\n * initialized.\n */\ngoog.isInModuleLoader_ = function() {\n return goog.isInGoogModuleLoader_() || goog.isInEs6ModuleLoader_();\n};\n\n\n/**\n * @private\n * @return {boolean} Whether a goog.module is currently being initialized.\n */\ngoog.isInGoogModuleLoader_ = function() {\n return !!goog.moduleLoaderState_ &&\n goog.moduleLoaderState_.type == goog.ModuleType.GOOG;\n};\n\n\n/**\n * @private\n * @return {boolean} Whether an es6 module is currently being initialized.\n */\ngoog.isInEs6ModuleLoader_ = function() {\n var inLoader = !!goog.moduleLoaderState_ &&\n goog.moduleLoaderState_.type == goog.ModuleType.ES6;\n\n if (inLoader) {\n return true;\n }\n\n var jscomp = goog.global['$jscomp'];\n\n if (jscomp) {\n // jscomp may not have getCurrentModulePath if this is a compiled bundle\n // that has some of the runtime, but not all of it. This can happen if\n // optimizations are turned on so the unused runtime is removed but renaming\n // and Closure pass are off (so $jscomp is still named $jscomp and the\n // goog.provide/require calls still exist).\n if (typeof jscomp.getCurrentModulePath != 'function') {\n return false;\n }\n\n // Bundled ES6 module.\n return !!jscomp.getCurrentModulePath();\n }\n\n return false;\n};\n\n\n/**\n * Provide the module's exports as a globally accessible object under the\n * module's declared name. This is intended to ease migration to goog.module\n * for files that have existing usages.\n * @suppress {missingProvide}\n */\ngoog.module.declareLegacyNamespace = function() {\n if (!COMPILED && !goog.isInGoogModuleLoader_()) {\n throw new Error(\n 'goog.module.declareLegacyNamespace must be called from ' +\n 'within a goog.module');\n }\n if (!COMPILED && !goog.moduleLoaderState_.moduleName) {\n throw new Error(\n 'goog.module must be called prior to ' +\n 'goog.module.declareLegacyNamespace.');\n }\n goog.moduleLoaderState_.declareLegacyNamespace = true;\n};\n\n\n/**\n * Associates an ES6 module with a Closure module ID so that is available via\n * goog.require. The associated ID acts like a goog.module ID - it does not\n * create any global names, it is merely available via goog.require /\n * goog.module.get / goog.forwardDeclare / goog.requireType. goog.require and\n * goog.module.get will return the entire module as if it was import *'d. This\n * allows Closure files to reference ES6 modules for the sake of migration.\n *\n * @param {string} namespace\n * @suppress {missingProvide}\n */\ngoog.declareModuleId = function(namespace) {\n if (!COMPILED) {\n if (!goog.isInEs6ModuleLoader_()) {\n throw new Error(\n 'goog.declareModuleId may only be called from ' +\n 'within an ES6 module');\n }\n if (goog.moduleLoaderState_ && goog.moduleLoaderState_.moduleName) {\n throw new Error(\n 'goog.declareModuleId may only be called once per module.');\n }\n if (namespace in goog.loadedModules_) {\n throw new Error(\n 'Module with namespace \"' + namespace + '\" already exists.');\n }\n }\n if (goog.moduleLoaderState_) {\n // Not bundled - debug loading.\n goog.moduleLoaderState_.moduleName = namespace;\n } else {\n // Bundled - not debug loading, no module loader state.\n var jscomp = goog.global['$jscomp'];\n if (!jscomp || typeof jscomp.getCurrentModulePath != 'function') {\n throw new Error(\n 'Module with namespace \"' + namespace +\n '\" has been loaded incorrectly.');\n }\n var exports = jscomp.require(jscomp.getCurrentModulePath());\n goog.loadedModules_[namespace] = {\n exports: exports,\n type: goog.ModuleType.ES6,\n moduleId: namespace\n };\n }\n};\n\n\n/**\n * Marks that the current file should only be used for testing, and never for\n * live code in production.\n *\n * In the case of unit tests, the message may optionally be an exact namespace\n * for the test (e.g. 'goog.stringTest'). The linter will then ignore the extra\n * provide (if not explicitly defined in the code).\n *\n * @param {string=} opt_message Optional message to add to the error that's\n * raised when used in production code.\n */\ngoog.setTestOnly = function(opt_message) {\n if (goog.DISALLOW_TEST_ONLY_CODE) {\n opt_message = opt_message || '';\n throw new Error(\n 'Importing test-only code into non-debug environment' +\n (opt_message ? ': ' + opt_message : '.'));\n }\n};\n\n\n/**\n * Forward declares a symbol. This is an indication to the compiler that the\n * symbol may be used in the source yet is not required and may not be provided\n * in compilation.\n *\n * The most common usage of forward declaration is code that takes a type as a\n * function parameter but does not need to require it. By forward declaring\n * instead of requiring, no hard dependency is made, and (if not required\n * elsewhere) the namespace may never be required and thus, not be pulled\n * into the JavaScript binary. If it is required elsewhere, it will be type\n * checked as normal.\n *\n * Before using goog.forwardDeclare, please read the documentation at\n * https://github.com/google/closure-compiler/wiki/Bad-Type-Annotation to\n * understand the options and tradeoffs when working with forward declarations.\n *\n * @param {string} name The namespace to forward declare in the form of\n * \"goog.package.part\".\n * @deprecated See go/noforwarddeclaration, Use `goog.requireType` instead.\n */\ngoog.forwardDeclare = function(name) {};\n\n\n/**\n * Forward declare type information. Used to assign types to goog.global\n * referenced object that would otherwise result in unknown type references\n * and thus block property disambiguation.\n */\ngoog.forwardDeclare('Document');\ngoog.forwardDeclare('HTMLScriptElement');\ngoog.forwardDeclare('XMLHttpRequest');\n\n\nif (!COMPILED) {\n /**\n * Check if the given name has been goog.provided. This will return false for\n * names that are available only as implicit namespaces.\n * @param {string} name name of the object to look for.\n * @return {boolean} Whether the name has been provided.\n * @private\n */\n goog.isProvided_ = function(name) {\n return (name in goog.loadedModules_) ||\n (!goog.implicitNamespaces_[name] && goog.getObjectByName(name) != null);\n };\n\n /**\n * Namespaces implicitly defined by goog.provide. For example,\n * goog.provide('goog.events.Event') implicitly declares that 'goog' and\n * 'goog.events' must be namespaces.\n *\n * @type {!Object<string, (boolean|undefined)>}\n * @private\n */\n goog.implicitNamespaces_ = {'goog.module': true};\n\n // NOTE: We add goog.module as an implicit namespace as goog.module is defined\n // here and because the existing module package has not been moved yet out of\n // the goog.module namespace. This satisifies both the debug loader and\n // ahead-of-time dependency management.\n}\n\n\n/**\n * Returns an object based on its fully qualified external name. The object\n * is not found if null or undefined. If you are using a compilation pass that\n * renames property names beware that using this function will not find renamed\n * properties.\n *\n * @param {string} name The fully qualified name.\n * @param {Object=} opt_obj The object within which to look; default is\n * |goog.global|.\n * @return {?} The value (object or primitive) or, if not found, null.\n */\ngoog.getObjectByName = function(name, opt_obj) {\n var parts = name.split('.');\n var cur = opt_obj || goog.global;\n for (var i = 0; i < parts.length; i++) {\n cur = cur[parts[i]];\n if (cur == null) {\n return null;\n }\n }\n return cur;\n};\n\n\n/**\n * Adds a dependency from a file to the files it requires.\n * @param {string} relPath The path to the js file.\n * @param {!Array<string>} provides An array of strings with\n * the names of the objects this file provides.\n * @param {!Array<string>} requires An array of strings with\n * the names of the objects this file requires.\n * @param {boolean|!Object<string>=} opt_loadFlags Parameters indicating\n * how the file must be loaded. The boolean 'true' is equivalent\n * to {'module': 'goog'} for backwards-compatibility. Valid properties\n * and values include {'module': 'goog'} and {'lang': 'es6'}.\n */\ngoog.addDependency = function(relPath, provides, requires, opt_loadFlags) {\n if (!COMPILED && goog.DEPENDENCIES_ENABLED) {\n goog.debugLoader_.addDependency(relPath, provides, requires, opt_loadFlags);\n }\n};\n\n\n// NOTE(nnaze): The debug DOM loader was included in base.js as an original way\n// to do \"debug-mode\" development. The dependency system can sometimes be\n// confusing, as can the debug DOM loader's asynchronous nature.\n//\n// With the DOM loader, a call to goog.require() is not blocking -- the script\n// will not load until some point after the current script. If a namespace is\n// needed at runtime, it needs to be defined in a previous script, or loaded via\n// require() with its registered dependencies.\n//\n// User-defined namespaces may need their own deps file. For a reference on\n// creating a deps file, see:\n// Externally: https://developers.google.com/closure/library/docs/depswriter\n//\n// Because of legacy clients, the DOM loader can't be easily removed from\n// base.js. Work was done to make it disableable or replaceable for\n// different environments (DOM-less JavaScript interpreters like Rhino or V8,\n// for example). See bootstrap/ for more information.\n\n\n/**\n * @define {boolean} Whether to enable the debug loader.\n *\n * If enabled, a call to goog.require() will attempt to load the namespace by\n * appending a script tag to the DOM (if the namespace has been registered).\n *\n * If disabled, goog.require() will simply assert that the namespace has been\n * provided (and depend on the fact that some outside tool correctly ordered\n * the script).\n */\ngoog.ENABLE_DEBUG_LOADER = goog.define('goog.ENABLE_DEBUG_LOADER', true);\n\n\n/**\n * @param {string} msg\n * @private\n */\ngoog.logToConsole_ = function(msg) {\n if (goog.global.console) {\n goog.global.console['error'](msg);\n }\n};\n\n\n/**\n * Implements a system for the dynamic resolution of dependencies that works in\n * parallel with the BUILD system.\n *\n * Note that all calls to goog.require will be stripped by the compiler.\n *\n * @see goog.provide\n * @param {string} namespace Namespace (as was given in goog.provide,\n * goog.module, or goog.declareModuleId) in the form\n * \"goog.package.part\".\n * @return {?} If called within a goog.module or ES6 module file, the associated\n * namespace or module otherwise null.\n */\ngoog.require = function(namespace) {\n if (!COMPILED) {\n // Might need to lazy load on old IE.\n if (goog.ENABLE_DEBUG_LOADER) {\n goog.debugLoader_.requested(namespace);\n }\n\n // If the object already exists we do not need to do anything.\n if (goog.isProvided_(namespace)) {\n if (goog.isInModuleLoader_()) {\n return goog.module.getInternal_(namespace);\n }\n } else if (goog.ENABLE_DEBUG_LOADER) {\n var moduleLoaderState = goog.moduleLoaderState_;\n goog.moduleLoaderState_ = null;\n try {\n goog.debugLoader_.load_(namespace);\n } finally {\n goog.moduleLoaderState_ = moduleLoaderState;\n }\n }\n\n return null;\n }\n};\n\n\n/**\n * Requires a symbol for its type information. This is an indication to the\n * compiler that the symbol may appear in type annotations, yet it is not\n * referenced at runtime.\n *\n * When called within a goog.module or ES6 module file, the return value may be\n * assigned to or destructured into a variable, but it may not be otherwise used\n * in code outside of a type annotation.\n *\n * Note that all calls to goog.requireType will be stripped by the compiler.\n *\n * @param {string} namespace Namespace (as was given in goog.provide,\n * goog.module, or goog.declareModuleId) in the form\n * \"goog.package.part\".\n * @return {?}\n */\ngoog.requireType = function(namespace) {\n // Return an empty object so that single-level destructuring of the return\n // value doesn't crash at runtime when using the debug loader. Multi-level\n // destructuring isn't supported.\n return {};\n};\n\n\n/**\n * Path for included scripts.\n * @type {string}\n */\ngoog.basePath = '';\n\n\n/**\n * A hook for overriding the base path.\n * @type {string|undefined}\n */\ngoog.global.CLOSURE_BASE_PATH;\n\n\n/**\n * Whether to attempt to load Closure's deps file. By default, when uncompiled,\n * deps files will attempt to be loaded.\n * @type {boolean|undefined}\n */\ngoog.global.CLOSURE_NO_DEPS;\n\n\n/**\n * A function to import a single script. This is meant to be overridden when\n * Closure is being run in non-HTML contexts, such as web workers. It's defined\n * in the global scope so that it can be set before base.js is loaded, which\n * allows deps.js to be imported properly.\n *\n * The first parameter the script source, which is a relative URI. The second,\n * optional parameter is the script contents, in the event the script needed\n * transformation. It should return true if the script was imported, false\n * otherwise.\n * @type {(function(string, string=): boolean)|undefined}\n */\ngoog.global.CLOSURE_IMPORT_SCRIPT;\n\n\n/**\n * Null function used for default values of callbacks, etc.\n * @return {void} Nothing.\n * @deprecated use '()=>{}' or 'function(){}' instead.\n */\ngoog.nullFunction = function() {};\n\n\n/**\n * When defining a class Foo with an abstract method bar(), you can do:\n * Foo.prototype.bar = goog.abstractMethod\n *\n * Now if a subclass of Foo fails to override bar(), an error will be thrown\n * when bar() is invoked.\n *\n * @type {!Function}\n * @throws {Error} when invoked to indicate the method should be overridden.\n * @deprecated Use \"@abstract\" annotation instead of goog.abstractMethod in new\n * code. See\n * https://github.com/google/closure-compiler/wiki/@abstract-classes-and-methods\n */\ngoog.abstractMethod = function() {\n throw new Error('unimplemented abstract method');\n};\n\n\n/**\n * Adds a `getInstance` static method that always returns the same\n * instance object.\n * @param {!Function} ctor The constructor for the class to add the static\n * method to.\n * @suppress {missingProperties} 'instance_' isn't a property on 'Function'\n * but we don't have a better type to use here.\n */\ngoog.addSingletonGetter = function(ctor) {\n // instance_ is immediately set to prevent issues with sealed constructors\n // such as are encountered when a constructor is returned as the export object\n // of a goog.module in unoptimized code.\n // Delcare type to avoid conformance violations that ctor.instance_ is unknown\n /** @type {undefined|!Object} @suppress {underscore} */\n ctor.instance_ = undefined;\n ctor.getInstance = function() {\n if (ctor.instance_) {\n return ctor.instance_;\n }\n if (goog.DEBUG) {\n // NOTE: JSCompiler can't optimize away Array#push.\n goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor;\n }\n // Cast to avoid conformance violations that ctor.instance_ is unknown\n return /** @type {!Object|undefined} */ (ctor.instance_) = new ctor;\n };\n};\n\n\n/**\n * All singleton classes that have been instantiated, for testing. Don't read\n * it directly, use the `goog.testing.singleton` module. The compiler\n * removes this variable if unused.\n * @type {!Array<!Function>}\n * @private\n */\ngoog.instantiatedSingletons_ = [];\n\n\n/**\n * @define {boolean} Whether to load goog.modules using `eval` when using\n * the debug loader. This provides a better debugging experience as the\n * source is unmodified and can be edited using Chrome Workspaces or similar.\n * However in some environments the use of `eval` is banned\n * so we provide an alternative.\n */\ngoog.LOAD_MODULE_USING_EVAL = goog.define('goog.LOAD_MODULE_USING_EVAL', true);\n\n\n/**\n * @define {boolean} Whether the exports of goog.modules should be sealed when\n * possible.\n */\ngoog.SEAL_MODULE_EXPORTS = goog.define('goog.SEAL_MODULE_EXPORTS', goog.DEBUG);\n\n\n/**\n * The registry of initialized modules:\n * The module identifier or path to module exports map.\n * @private @const {!Object<string, {exports:?,type:string,moduleId:string}>}\n */\ngoog.loadedModules_ = {};\n\n\n/**\n * True if the debug loader enabled and used.\n * @const {boolean}\n */\ngoog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER;\n\n\n/**\n * @define {string} How to decide whether to transpile. Valid values\n * are 'always', 'never', and 'detect'. The default ('detect') is to\n * use feature detection to determine which language levels need\n * transpilation.\n */\n// NOTE(sdh): we could expand this to accept a language level to bypass\n// detection: e.g. goog.TRANSPILE == 'es5' would transpile ES6 files but\n// would leave ES3 and ES5 files alone.\ngoog.TRANSPILE = goog.define('goog.TRANSPILE', 'detect');\n\n/**\n * @define {boolean} If true assume that ES modules have already been\n * transpiled by the jscompiler (in the same way that transpile.js would\n * transpile them - to jscomp modules). Useful only for servers that wish to use\n * the debug loader and transpile server side. Thus this is only respected if\n * goog.TRANSPILE is \"never\".\n */\ngoog.ASSUME_ES_MODULES_TRANSPILED =\n goog.define('goog.ASSUME_ES_MODULES_TRANSPILED', false);\n\n\n/**\n * @define {string} If a file needs to be transpiled what the output language\n * should be. By default this is the highest language level this file detects\n * the current environment supports. Generally this flag should not be set, but\n * it could be useful to override. Example: If the current environment supports\n * ES6 then by default ES7+ files will be transpiled to ES6, unless this is\n * overridden.\n *\n * Valid values include: es3, es5, es6, es7, and es8. Anything not recognized\n * is treated as es3.\n *\n * Note that setting this value does not force transpilation. Just if\n * transpilation occurs this will be the output. So this is most useful when\n * goog.TRANSPILE is set to 'always' and then forcing the language level to be\n * something lower than what the environment detects.\n */\ngoog.TRANSPILE_TO_LANGUAGE = goog.define('goog.TRANSPILE_TO_LANGUAGE', '');\n\n\n/**\n * @define {string} Path to the transpiler. Executing the script at this\n * path (relative to base.js) should define a function $jscomp.transpile.\n */\ngoog.TRANSPILER = goog.define('goog.TRANSPILER', 'transpile.js');\n\n\n/**\n * @define {string} Trusted Types policy name. If non-empty then Closure will\n * use Trusted Types.\n */\ngoog.TRUSTED_TYPES_POLICY_NAME =\n goog.define('goog.TRUSTED_TYPES_POLICY_NAME', 'goog');\n\n\n/**\n * @package {?boolean}\n * Visible for testing.\n */\ngoog.hasBadLetScoping = null;\n\n\n/**\n * @param {function(?):?|string} moduleDef The module definition.\n */\ngoog.loadModule = function(moduleDef) {\n // NOTE: we allow function definitions to be either in the from\n // of a string to eval (which keeps the original source intact) or\n // in a eval forbidden environment (CSP) we allow a function definition\n // which in its body must call `goog.module`, and return the exports\n // of the module.\n var previousState = goog.moduleLoaderState_;\n try {\n goog.moduleLoaderState_ = {\n moduleName: '',\n declareLegacyNamespace: false,\n type: goog.ModuleType.GOOG\n };\n var origExports = {};\n var exports = origExports;\n if (typeof moduleDef === 'function') {\n exports = moduleDef.call(undefined, exports);\n } else if (typeof moduleDef === 'string') {\n exports = goog.loadModuleFromSource_.call(undefined, exports, moduleDef);\n } else {\n throw new Error('Invalid module definition');\n }\n\n var moduleName = goog.moduleLoaderState_.moduleName;\n if (typeof moduleName === 'string' && moduleName) {\n // Don't seal legacy namespaces as they may be used as a parent of\n // another namespace\n if (goog.moduleLoaderState_.declareLegacyNamespace) {\n // Whether exports was overwritten via default export assignment.\n // This is important for legacy namespaces as it dictates whether\n // previously a previously loaded implicit namespace should be clobbered\n // or not.\n var isDefaultExport = origExports !== exports;\n goog.constructNamespace_(moduleName, exports, isDefaultExport);\n } else if (\n goog.SEAL_MODULE_EXPORTS && Object.seal &&\n typeof exports == 'object' && exports != null) {\n Object.seal(exports);\n }\n\n var data = {\n exports: exports,\n type: goog.ModuleType.GOOG,\n moduleId: goog.moduleLoaderState_.moduleName\n };\n goog.loadedModules_[moduleName] = data;\n } else {\n throw new Error('Invalid module name \\\"' + moduleName + '\\\"');\n }\n } finally {\n goog.moduleLoaderState_ = previousState;\n }\n};\n\n\n/**\n * @private @const\n */\ngoog.loadModuleFromSource_ =\n /** @type {function(!Object, string):?} */ (function(exports) {\n // NOTE: we avoid declaring parameters or local variables here to avoid\n // masking globals or leaking values into the module definition.\n 'use strict';\n eval(goog.CLOSURE_EVAL_PREFILTER_.createScript(arguments[1]));\n return exports;\n });\n\n\n/**\n * Normalize a file path by removing redundant \"..\" and extraneous \".\" file\n * path components.\n * @param {string} path\n * @return {string}\n * @private\n */\ngoog.normalizePath_ = function(path) {\n var components = path.split('/');\n var i = 0;\n while (i < components.length) {\n if (components[i] == '.') {\n components.splice(i, 1);\n } else if (\n i && components[i] == '..' && components[i - 1] &&\n components[i - 1] != '..') {\n components.splice(--i, 2);\n } else {\n i++;\n }\n }\n return components.join('/');\n};\n\n\n/**\n * Provides a hook for loading a file when using Closure's goog.require() API\n * with goog.modules. In particular this hook is provided to support Node.js.\n *\n * @type {(function(string):string)|undefined}\n */\ngoog.global.CLOSURE_LOAD_FILE_SYNC;\n\n\n/**\n * Loads file by synchronous XHR. Should not be used in production environments.\n * @param {string} src Source URL.\n * @return {?string} File contents, or null if load failed.\n * @private\n */\ngoog.loadFileSync_ = function(src) {\n if (goog.global.CLOSURE_LOAD_FILE_SYNC) {\n return goog.global.CLOSURE_LOAD_FILE_SYNC(src);\n } else {\n try {\n /** @type {XMLHttpRequest} */\n var xhr = new goog.global['XMLHttpRequest']();\n xhr.open('get', src, false);\n xhr.send();\n // NOTE: Successful http: requests have a status of 200, but successful\n // file: requests may have a status of zero. Any other status, or a\n // thrown exception (particularly in case of file: requests) indicates\n // some sort of error, which we treat as a missing or unavailable file.\n return xhr.status == 0 || xhr.status == 200 ? xhr.responseText : null;\n } catch (err) {\n // No need to rethrow or log, since errors should show up on their own.\n return null;\n }\n }\n};\n\n\n/**\n * Lazily retrieves the transpiler and applies it to the source.\n * @param {string} code JS code.\n * @param {string} path Path to the code.\n * @param {string} target Language level output.\n * @return {string} The transpiled code.\n * @private\n */\ngoog.transpile_ = function(code, path, target) {\n var jscomp = goog.global['$jscomp'];\n if (!jscomp) {\n goog.global['$jscomp'] = jscomp = {};\n }\n var transpile = jscomp.transpile;\n if (!transpile) {\n var transpilerPath = goog.basePath + goog.TRANSPILER;\n var transpilerCode = goog.loadFileSync_(transpilerPath);\n if (transpilerCode) {\n // This must be executed synchronously, since by the time we know we\n // need it, we're about to load and write the ES6 code synchronously,\n // so a normal script-tag load will be too slow. Wrapped in a function\n // so that code is eval'd in the global scope.\n (function() {\n (0, eval)(transpilerCode + '\\n//# sourceURL=' + transpilerPath);\n }).call(goog.global);\n // Even though the transpiler is optional, if $gwtExport is found, it's\n // a sign the transpiler was loaded and the $jscomp.transpile *should*\n // be there.\n if (goog.global['$gwtExport'] && goog.global['$gwtExport']['$jscomp'] &&\n !goog.global['$gwtExport']['$jscomp']['transpile']) {\n throw new Error(\n 'The transpiler did not properly export the \"transpile\" ' +\n 'method. $gwtExport: ' + JSON.stringify(goog.global['$gwtExport']));\n }\n // transpile.js only exports a single $jscomp function, transpile. We\n // grab just that and add it to the existing definition of $jscomp which\n // contains the polyfills.\n goog.global['$jscomp'].transpile =\n goog.global['$gwtExport']['$jscomp']['transpile'];\n jscomp = goog.global['$jscomp'];\n transpile = jscomp.transpile;\n }\n }\n if (!transpile) {\n // The transpiler is an optional component. If it's not available then\n // replace it with a pass-through function that simply logs.\n var suffix = ' requires transpilation but no transpiler was found.';\n transpile = jscomp.transpile = function(code, path) {\n // TODO(sdh): figure out some way to get this error to show up\n // in test results, noting that the failure may occur in many\n // different ways, including in loadModule() before the test\n // runner even comes up.\n goog.logToConsole_(path + suffix);\n return code;\n };\n }\n // Note: any transpilation errors/warnings will be logged to the console.\n return transpile(code, path, target);\n};\n\n//==============================================================================\n// Language Enhancements\n//==============================================================================\n\n\n/**\n * This is a \"fixed\" version of the typeof operator. It differs from the typeof\n * operator in such a way that null returns 'null' and arrays return 'array'.\n * @param {?} value The value to get the type of.\n * @return {string} The name of the type.\n */\ngoog.typeOf = function(value) {\n var s = typeof value;\n\n if (s != 'object') {\n return s;\n }\n\n if (!value) {\n return 'null';\n }\n\n if (Array.isArray(value)) {\n return 'array';\n }\n return s;\n};\n\n\n/**\n * Returns true if the object looks like an array. To qualify as array like\n * the value needs to be either a NodeList or an object with a Number length\n * property. Note that for this function neither strings nor functions are\n * considered \"array-like\".\n *\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is an array.\n */\ngoog.isArrayLike = function(val) {\n var type = goog.typeOf(val);\n // We do not use goog.isObject here in order to exclude function values.\n return type == 'array' || type == 'object' && typeof val.length == 'number';\n};\n\n\n/**\n * Returns true if the object looks like a Date. To qualify as Date-like the\n * value needs to be an object and have a getFullYear() function.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is a like a Date.\n */\ngoog.isDateLike = function(val) {\n return goog.isObject(val) && typeof val.getFullYear == 'function';\n};\n\n\n/**\n * Returns true if the specified value is an object. This includes arrays and\n * functions.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is an object.\n */\ngoog.isObject = function(val) {\n var type = typeof val;\n return type == 'object' && val != null || type == 'function';\n // return Object(val) === val also works, but is slower, especially if val is\n // not an object.\n};\n\n\n/**\n * Gets a unique ID for an object. This mutates the object so that further calls\n * with the same object as a parameter returns the same value. The unique ID is\n * guaranteed to be unique across the current session amongst objects that are\n * passed into `getUid`. There is no guarantee that the ID is unique or\n * consistent across sessions. It is unsafe to generate unique ID for function\n * prototypes.\n *\n * @param {Object} obj The object to get the unique ID for.\n * @return {number} The unique ID for the object.\n */\ngoog.getUid = function(obj) {\n // TODO(arv): Make the type stricter, do not accept null.\n return Object.prototype.hasOwnProperty.call(obj, goog.UID_PROPERTY_) &&\n obj[goog.UID_PROPERTY_] ||\n (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_);\n};\n\n\n/**\n * Whether the given object is already assigned a unique ID.\n *\n * This does not modify the object.\n *\n * @param {!Object} obj The object to check.\n * @return {boolean} Whether there is an assigned unique id for the object.\n */\ngoog.hasUid = function(obj) {\n return !!obj[goog.UID_PROPERTY_];\n};\n\n\n/**\n * Removes the unique ID from an object. This is useful if the object was\n * previously mutated using `goog.getUid` in which case the mutation is\n * undone.\n * @param {Object} obj The object to remove the unique ID field from.\n */\ngoog.removeUid = function(obj) {\n // TODO(arv): Make the type stricter, do not accept null.\n\n // In IE, DOM nodes are not instances of Object and throw an exception if we\n // try to delete. Instead we try to use removeAttribute.\n if (obj !== null && 'removeAttribute' in obj) {\n obj.removeAttribute(goog.UID_PROPERTY_);\n }\n\n try {\n delete obj[goog.UID_PROPERTY_];\n } catch (ex) {\n }\n};\n\n\n/**\n * Name for unique ID property. Initialized in a way to help avoid collisions\n * with other closure JavaScript on the same page.\n * @type {string}\n * @private\n */\ngoog.UID_PROPERTY_ = 'closure_uid_' + ((Math.random() * 1e9) >>> 0);\n\n\n/**\n * Counter for UID.\n * @type {number}\n * @private\n */\ngoog.uidCounter_ = 0;\n\n\n/**\n * Clones a value. The input may be an Object, Array, or basic type. Objects and\n * arrays will be cloned recursively.\n *\n * WARNINGS:\n * <code>goog.cloneObject</code> does not detect reference loops. Objects that\n * refer to themselves will cause infinite recursion.\n *\n * <code>goog.cloneObject</code> is unaware of unique identifiers, and copies\n * UIDs created by <code>getUid</code> into cloned results.\n *\n * @param {*} obj The value to clone.\n * @return {*} A clone of the input value.\n * @deprecated goog.cloneObject is unsafe. Prefer the goog.object methods.\n */\ngoog.cloneObject = function(obj) {\n var type = goog.typeOf(obj);\n if (type == 'object' || type == 'array') {\n if (typeof obj.clone === 'function') {\n return obj.clone();\n }\n var clone = type == 'array' ? [] : {};\n for (var key in obj) {\n clone[key] = goog.cloneObject(obj[key]);\n }\n return clone;\n }\n\n return obj;\n};\n\n\n/**\n * A native implementation of goog.bind.\n * @param {?function(this:T, ...)} fn A function to partially apply.\n * @param {T} selfObj Specifies the object which this should point to when the\n * function is run.\n * @param {...*} var_args Additional arguments that are partially applied to the\n * function.\n * @return {!Function} A partially-applied form of the function goog.bind() was\n * invoked as a method of.\n * @template T\n * @private\n */\ngoog.bindNative_ = function(fn, selfObj, var_args) {\n return /** @type {!Function} */ (fn.call.apply(fn.bind, arguments));\n};\n\n\n/**\n * A pure-JS implementation of goog.bind.\n * @param {?function(this:T, ...)} fn A function to partially apply.\n * @param {T} selfObj Specifies the object which this should point to when the\n * function is run.\n * @param {...*} var_args Additional arguments that are partially applied to the\n * function.\n * @return {!Function} A partially-applied form of the function goog.bind() was\n * invoked as a method of.\n * @template T\n * @private\n */\ngoog.bindJs_ = function(fn, selfObj, var_args) {\n if (!fn) {\n throw new Error();\n }\n\n if (arguments.length > 2) {\n var boundArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n // Prepend the bound arguments to the current arguments.\n var newArgs = Array.prototype.slice.call(arguments);\n Array.prototype.unshift.apply(newArgs, boundArgs);\n return fn.apply(selfObj, newArgs);\n };\n\n } else {\n return function() {\n return fn.apply(selfObj, arguments);\n };\n }\n};\n\n\n/**\n * Partially applies this function to a particular 'this object' and zero or\n * more arguments. The result is a new function with some arguments of the first\n * function pre-filled and the value of this 'pre-specified'.\n *\n * Remaining arguments specified at call-time are appended to the pre-specified\n * ones.\n *\n * Also see: {@link #partial}.\n *\n * Usage:\n * <pre>var barMethBound = goog.bind(myFunction, myObj, 'arg1', 'arg2');\n * barMethBound('arg3', 'arg4');</pre>\n *\n * @param {?function(this:T, ...)} fn A function to partially apply.\n * @param {T} selfObj Specifies the object which this should point to when the\n * function is run.\n * @param {...*} var_args Additional arguments that are partially applied to the\n * function.\n * @return {!Function} A partially-applied form of the function goog.bind() was\n * invoked as a method of.\n * @template T\n * @suppress {deprecated} See above.\n * @deprecated use `=> {}` or Function.prototype.bind instead.\n */\ngoog.bind = function(fn, selfObj, var_args) {\n // TODO(nicksantos): narrow the type signature.\n if (Function.prototype.bind &&\n // NOTE(nicksantos): Somebody pulled base.js into the default Chrome\n // extension environment. This means that for Chrome extensions, they get\n // the implementation of Function.prototype.bind that calls goog.bind\n // instead of the native one. Even worse, we don't want to introduce a\n // circular dependency between goog.bind and Function.prototype.bind, so\n // we have to hack this to make sure it works correctly.\n Function.prototype.bind.toString().indexOf('native code') != -1) {\n goog.bind = goog.bindNative_;\n } else {\n goog.bind = goog.bindJs_;\n }\n return goog.bind.apply(null, arguments);\n};\n\n\n/**\n * Like goog.bind(), except that a 'this object' is not required. Useful when\n * the target function is already bound.\n *\n * Usage:\n * var g = goog.partial(f, arg1, arg2);\n * g(arg3, arg4);\n *\n * @param {Function} fn A function to partially apply.\n * @param {...*} var_args Additional arguments that are partially applied to fn.\n * @return {!Function} A partially-applied form of the function goog.partial()\n * was invoked as a method of.\n */\ngoog.partial = function(fn, var_args) {\n var args = Array.prototype.slice.call(arguments, 1);\n return function() {\n // Clone the array (with slice()) and append additional arguments\n // to the existing arguments.\n var newArgs = args.slice();\n newArgs.push.apply(newArgs, arguments);\n return fn.apply(/** @type {?} */ (this), newArgs);\n };\n};\n\n\n/**\n * Copies all the members of a source object to a target object. This method\n * does not work on all browsers for all objects that contain keys such as\n * toString or hasOwnProperty. Use goog.object.extend for this purpose.\n *\n * NOTE: Some have advocated for the use of goog.mixin to setup classes\n * with multiple inheritence (traits, mixins, etc). However, as it simply\n * uses \"for in\", this is not compatible with ES6 classes whose methods are\n * non-enumerable. Changing this, would break cases where non-enumerable\n * properties are not expected.\n *\n * @param {Object} target Target.\n * @param {Object} source Source.\n * @deprecated Prefer Object.assign\n */\ngoog.mixin = function(target, source) {\n for (var x in source) {\n target[x] = source[x];\n }\n\n // For IE7 or lower, the for-in-loop does not contain any properties that are\n // not enumerable on the prototype object (for example, isPrototypeOf from\n // Object.prototype) but also it will not include 'replace' on objects that\n // extend String and change 'replace' (not that it is common for anyone to\n // extend anything except Object).\n};\n\n\n/**\n * @return {number} An integer value representing the number of milliseconds\n * between midnight, January 1, 1970 and the current time.\n * @deprecated Use Date.now\n */\ngoog.now = function() {\n return Date.now();\n};\n\n\n/**\n * Evals JavaScript in the global scope.\n *\n * Throws an exception if neither execScript or eval is defined.\n * @param {string|!TrustedScript} script JavaScript string.\n */\ngoog.globalEval = function(script) {\n (0, eval)(script);\n};\n\n\n/**\n * Optional map of CSS class names to obfuscated names used with\n * goog.getCssName().\n * @private {!Object<string, string>|undefined}\n * @see goog.setCssNameMapping\n */\ngoog.cssNameMapping_;\n\n\n/**\n * Optional obfuscation style for CSS class names. Should be set to either\n * 'BY_WHOLE' or 'BY_PART' if defined.\n * @type {string|undefined}\n * @private\n * @see goog.setCssNameMapping\n */\ngoog.cssNameMappingStyle_;\n\n\n\n/**\n * A hook for modifying the default behavior goog.getCssName. The function\n * if present, will receive the standard output of the goog.getCssName as\n * its input.\n *\n * @type {(function(string):string)|undefined}\n */\ngoog.global.CLOSURE_CSS_NAME_MAP_FN;\n\n\n/**\n * Handles strings that are intended to be used as CSS class names.\n *\n * This function works in tandem with @see goog.setCssNameMapping.\n *\n * Without any mapping set, the arguments are simple joined with a hyphen and\n * passed through unaltered.\n *\n * When there is a mapping, there are two possible styles in which these\n * mappings are used. In the BY_PART style, each part (i.e. in between hyphens)\n * of the passed in css name is rewritten according to the map. In the BY_WHOLE\n * style, the full css name is looked up in the map directly. If a rewrite is\n * not specified by the map, the compiler will output a warning.\n *\n * When the mapping is passed to the compiler, it will replace calls to\n * goog.getCssName with the strings from the mapping, e.g.\n * var x = goog.getCssName('foo');\n * var y = goog.getCssName(this.baseClass, 'active');\n * becomes:\n * var x = 'foo';\n * var y = this.baseClass + '-active';\n *\n * If one argument is passed it will be processed, if two are passed only the\n * modifier will be processed, as it is assumed the first argument was generated\n * as a result of calling goog.getCssName.\n *\n * @param {string} className The class name.\n * @param {string=} opt_modifier A modifier to be appended to the class name.\n * @return {string} The class name or the concatenation of the class name and\n * the modifier.\n */\ngoog.getCssName = function(className, opt_modifier) {\n // String() is used for compatibility with compiled soy where the passed\n // className can be non-string objects.\n if (String(className).charAt(0) == '.') {\n throw new Error(\n 'className passed in goog.getCssName must not start with \".\".' +\n ' You passed: ' + className);\n }\n\n var getMapping = function(cssName) {\n return goog.cssNameMapping_[cssName] || cssName;\n };\n\n var renameByParts = function(cssName) {\n // Remap all the parts individually.\n var parts = cssName.split('-');\n var mapped = [];\n for (var i = 0; i < parts.length; i++) {\n mapped.push(getMapping(parts[i]));\n }\n return mapped.join('-');\n };\n\n var rename;\n if (goog.cssNameMapping_) {\n rename =\n goog.cssNameMappingStyle_ == 'BY_WHOLE' ? getMapping : renameByParts;\n } else {\n rename = function(a) {\n return a;\n };\n }\n\n var result =\n opt_modifier ? className + '-' + rename(opt_modifier) : rename(className);\n\n // The special CLOSURE_CSS_NAME_MAP_FN allows users to specify further\n // processing of the class name.\n if (goog.global.CLOSURE_CSS_NAME_MAP_FN) {\n return goog.global.CLOSURE_CSS_NAME_MAP_FN(result);\n }\n\n return result;\n};\n\n\n/**\n * Sets the map to check when returning a value from goog.getCssName(). Example:\n * <pre>\n * goog.setCssNameMapping({\n * \"goog\": \"a\",\n * \"disabled\": \"b\",\n * });\n *\n * var x = goog.getCssName('goog');\n * // The following evaluates to: \"a a-b\".\n * goog.getCssName('goog') + ' ' + goog.getCssName(x, 'disabled')\n * </pre>\n * When declared as a map of string literals to string literals, the JSCompiler\n * will replace all calls to goog.getCssName() using the supplied map if the\n * --process_closure_primitives flag is set.\n *\n * @param {!Object} mapping A map of strings to strings where keys are possible\n * arguments to goog.getCssName() and values are the corresponding values\n * that should be returned.\n * @param {string=} opt_style The style of css name mapping. There are two valid\n * options: 'BY_PART', and 'BY_WHOLE'.\n * @see goog.getCssName for a description.\n */\ngoog.setCssNameMapping = function(mapping, opt_style) {\n goog.cssNameMapping_ = mapping;\n goog.cssNameMappingStyle_ = opt_style;\n};\n\n\n/**\n * To use CSS renaming in compiled mode, one of the input files should have a\n * call to goog.setCssNameMapping() with an object literal that the JSCompiler\n * can extract and use to replace all calls to goog.getCssName(). In uncompiled\n * mode, JavaScript code should be loaded before this base.js file that declares\n * a global variable, CLOSURE_CSS_NAME_MAPPING, which is used below. This is\n * to ensure that the mapping is loaded before any calls to goog.getCssName()\n * are made in uncompiled mode.\n *\n * A hook for overriding the CSS name mapping.\n * @type {!Object<string, string>|undefined}\n */\ngoog.global.CLOSURE_CSS_NAME_MAPPING;\n\n\nif (!COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING) {\n // This does not call goog.setCssNameMapping() because the JSCompiler\n // requires that goog.setCssNameMapping() be called with an object literal.\n goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING;\n}\n\n\n/**\n * Gets a localized message.\n *\n * This function is a compiler primitive. If you give the compiler a localized\n * message bundle, it will replace the string at compile-time with a localized\n * version, and expand goog.getMsg call to a concatenated string.\n *\n * Messages must be initialized in the form:\n * <code>\n * var MSG_NAME = goog.getMsg('Hello {$placeholder}', {'placeholder': 'world'});\n * </code>\n *\n * This function produces a string which should be treated as plain text. Use\n * {@link goog.html.SafeHtmlFormatter} in conjunction with goog.getMsg to\n * produce SafeHtml.\n *\n * @param {string} str Translatable string, places holders in the form {$foo}.\n * @param {Object<string, string>=} opt_values Maps place holder name to value.\n * @param {{html: (boolean|undefined),\n * unescapeHtmlEntities: (boolean|undefined)}=} opt_options Options:\n * html: Escape '<' in str to '&lt;'. Used by Closure Templates where the\n * generated code size and performance is critical which is why {@link\n * goog.html.SafeHtmlFormatter} is not used. The value must be literal true\n * or false.\n * unescapeHtmlEntities: Unescape common html entities: &gt;, &lt;, &apos;,\n * &quot; and &amp;. Used for messages not in HTML context, such as with\n * `textContent` property.\n * @return {string} message with placeholders filled.\n */\ngoog.getMsg = function(str, opt_values, opt_options) {\n if (opt_options && opt_options.html) {\n // Note that '&' is not replaced because the translation can contain HTML\n // entities.\n str = str.replace(/</g, '&lt;');\n }\n if (opt_options && opt_options.unescapeHtmlEntities) {\n // Note that \"&amp;\" must be the last to avoid \"creating\" new entities.\n str = str.replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&apos;/g, '\\'')\n .replace(/&quot;/g, '\"')\n .replace(/&amp;/g, '&');\n }\n if (opt_values) {\n str = str.replace(/\\{\\$([^}]+)}/g, function(match, key) {\n return (opt_values != null && key in opt_values) ? opt_values[key] :\n match;\n });\n }\n return str;\n};\n\n\n/**\n * Gets a localized message. If the message does not have a translation, gives a\n * fallback message.\n *\n * This is useful when introducing a new message that has not yet been\n * translated into all languages.\n *\n * This function is a compiler primitive. Must be used in the form:\n * <code>var x = goog.getMsgWithFallback(MSG_A, MSG_B);</code>\n * where MSG_A and MSG_B were initialized with goog.getMsg.\n *\n * @param {string} a The preferred message.\n * @param {string} b The fallback message.\n * @return {string} The best translated message.\n */\ngoog.getMsgWithFallback = function(a, b) {\n return a;\n};\n\n\n/**\n * Exposes an unobfuscated global namespace path for the given object.\n * Note that fields of the exported object *will* be obfuscated, unless they are\n * exported in turn via this function or goog.exportProperty.\n *\n * Also handy for making public items that are defined in anonymous closures.\n *\n * ex. goog.exportSymbol('public.path.Foo', Foo);\n *\n * ex. goog.exportSymbol('public.path.Foo.staticFunction', Foo.staticFunction);\n * public.path.Foo.staticFunction();\n *\n * ex. goog.exportSymbol('public.path.Foo.prototype.myMethod',\n * Foo.prototype.myMethod);\n * new public.path.Foo().myMethod();\n *\n * @param {string} publicPath Unobfuscated name to export.\n * @param {*} object Object the name should point to.\n * @param {?Object=} objectToExportTo The object to add the path to; default\n * is goog.global.\n */\ngoog.exportSymbol = function(publicPath, object, objectToExportTo) {\n goog.exportPath_(\n publicPath, object, /* overwriteImplicit= */ true, objectToExportTo);\n};\n\n\n/**\n * Exports a property unobfuscated into the object's namespace.\n * ex. goog.exportProperty(Foo, 'staticFunction', Foo.staticFunction);\n * ex. goog.exportProperty(Foo.prototype, 'myMethod', Foo.prototype.myMethod);\n * @param {Object} object Object whose static property is being exported.\n * @param {string} publicName Unobfuscated name to export.\n * @param {*} symbol Object the name should point to.\n */\ngoog.exportProperty = function(object, publicName, symbol) {\n object[publicName] = symbol;\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * Usage:\n * <pre>\n * function ParentClass(a, b) { }\n * ParentClass.prototype.foo = function(a) { };\n *\n * function ChildClass(a, b, c) {\n * ChildClass.base(this, 'constructor', a, b);\n * }\n * goog.inherits(ChildClass, ParentClass);\n *\n * var child = new ChildClass('a', 'b', 'see');\n * child.foo(); // This works.\n * </pre>\n *\n * @param {!Function} childCtor Child class.\n * @param {!Function} parentCtor Parent class.\n * @suppress {strictMissingProperties} superClass_ and base is not defined on\n * Function.\n * @deprecated Use ECMAScript class syntax instead.\n */\ngoog.inherits = function(childCtor, parentCtor) {\n /** @constructor */\n function tempCtor() {}\n tempCtor.prototype = parentCtor.prototype;\n childCtor.superClass_ = parentCtor.prototype;\n childCtor.prototype = new tempCtor();\n /** @override */\n childCtor.prototype.constructor = childCtor;\n\n /**\n * Calls superclass constructor/method.\n *\n * This function is only available if you use goog.inherits to\n * express inheritance relationships between classes.\n *\n * NOTE: This is a replacement for goog.base and for superClass_\n * property defined in childCtor.\n *\n * @param {!Object} me Should always be \"this\".\n * @param {string} methodName The method name to call. Calling\n * superclass constructor can be done with the special string\n * 'constructor'.\n * @param {...*} var_args The arguments to pass to superclass\n * method/constructor.\n * @return {*} The return value of the superclass method/constructor.\n */\n childCtor.base = function(me, methodName, var_args) {\n // Copying using loop to avoid deop due to passing arguments object to\n // function. This is faster in many JS engines as of late 2014.\n var args = new Array(arguments.length - 2);\n for (var i = 2; i < arguments.length; i++) {\n args[i - 2] = arguments[i];\n }\n return parentCtor.prototype[methodName].apply(me, args);\n };\n};\n\n\n/**\n * Allow for aliasing within scope functions. This function exists for\n * uncompiled code - in compiled code the calls will be inlined and the aliases\n * applied. In uncompiled code the function is simply run since the aliases as\n * written are valid JavaScript.\n *\n *\n * @param {function()} fn Function to call. This function can contain aliases\n * to namespaces (e.g. \"var dom = goog.dom\") or classes\n * (e.g. \"var Timer = goog.Timer\").\n * @deprecated Use goog.module instead.\n */\ngoog.scope = function(fn) {\n if (goog.isInModuleLoader_()) {\n throw new Error('goog.scope is not supported within a module.');\n }\n fn.call(goog.global);\n};\n\n\n/*\n * To support uncompiled, strict mode bundles that use eval to divide source\n * like so:\n * eval('someSource;//# sourceUrl sourcefile.js');\n * We need to export the globally defined symbols \"goog\" and \"COMPILED\".\n * Exporting \"goog\" breaks the compiler optimizations, so we required that\n * be defined externally.\n * NOTE: We don't use goog.exportSymbol here because we don't want to trigger\n * extern generation when that compiler option is enabled.\n */\nif (!COMPILED) {\n goog.global['COMPILED'] = COMPILED;\n}\n\n\n//==============================================================================\n// goog.defineClass implementation\n//==============================================================================\n\n\n/**\n * Creates a restricted form of a Closure \"class\":\n * - from the compiler's perspective, the instance returned from the\n * constructor is sealed (no new properties may be added). This enables\n * better checks.\n * - the compiler will rewrite this definition to a form that is optimal\n * for type checking and optimization (initially this will be a more\n * traditional form).\n *\n * @param {Function} superClass The superclass, Object or null.\n * @param {goog.defineClass.ClassDescriptor} def\n * An object literal describing\n * the class. It may have the following properties:\n * \"constructor\": the constructor function\n * \"statics\": an object literal containing methods to add to the constructor\n * as \"static\" methods or a function that will receive the constructor\n * function as its only parameter to which static properties can\n * be added.\n * all other properties are added to the prototype.\n * @return {!Function} The class constructor.\n * @deprecated Use ECMAScript class syntax instead.\n */\ngoog.defineClass = function(superClass, def) {\n // TODO(johnlenz): consider making the superClass an optional parameter.\n var constructor = def.constructor;\n var statics = def.statics;\n // Wrap the constructor prior to setting up the prototype and static methods.\n if (!constructor || constructor == Object.prototype.constructor) {\n constructor = function() {\n throw new Error(\n 'cannot instantiate an interface (no constructor defined).');\n };\n }\n\n var cls = goog.defineClass.createSealingConstructor_(constructor, superClass);\n if (superClass) {\n goog.inherits(cls, superClass);\n }\n\n // Remove all the properties that should not be copied to the prototype.\n delete def.constructor;\n delete def.statics;\n\n goog.defineClass.applyProperties_(cls.prototype, def);\n if (statics != null) {\n if (statics instanceof Function) {\n statics(cls);\n } else {\n goog.defineClass.applyProperties_(cls, statics);\n }\n }\n\n return cls;\n};\n\n\n/**\n * @typedef {{\n * constructor: (!Function|undefined),\n * statics: (Object|undefined|function(Function):void)\n * }}\n */\ngoog.defineClass.ClassDescriptor;\n\n\n/**\n * @define {boolean} Whether the instances returned by goog.defineClass should\n * be sealed when possible.\n *\n * When sealing is disabled the constructor function will not be wrapped by\n * goog.defineClass, making it incompatible with ES6 class methods.\n */\ngoog.defineClass.SEAL_CLASS_INSTANCES =\n goog.define('goog.defineClass.SEAL_CLASS_INSTANCES', goog.DEBUG);\n\n\n/**\n * If goog.defineClass.SEAL_CLASS_INSTANCES is enabled and Object.seal is\n * defined, this function will wrap the constructor in a function that seals the\n * results of the provided constructor function.\n *\n * @param {!Function} ctr The constructor whose results maybe be sealed.\n * @param {Function} superClass The superclass constructor.\n * @return {!Function} The replacement constructor.\n * @private\n */\ngoog.defineClass.createSealingConstructor_ = function(ctr, superClass) {\n if (!goog.defineClass.SEAL_CLASS_INSTANCES) {\n // Do now wrap the constructor when sealing is disabled. Angular code\n // depends on this for injection to work properly.\n return ctr;\n }\n\n // NOTE: The sealing behavior has been removed\n\n /**\n * @this {Object}\n * @return {?}\n */\n var wrappedCtr = function() {\n // Don't seal an instance of a subclass when it calls the constructor of\n // its super class as there is most likely still setup to do.\n var instance = ctr.apply(this, arguments) || this;\n instance[goog.UID_PROPERTY_] = instance[goog.UID_PROPERTY_];\n\n return instance;\n };\n\n return wrappedCtr;\n};\n\n\n\n// TODO(johnlenz): share these values with the goog.object\n/**\n * The names of the fields that are defined on Object.prototype.\n * @type {!Array<string>}\n * @private\n * @const\n */\ngoog.defineClass.OBJECT_PROTOTYPE_FIELDS_ = [\n 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n 'toLocaleString', 'toString', 'valueOf'\n];\n\n\n// TODO(johnlenz): share this function with the goog.object\n/**\n * @param {!Object} target The object to add properties to.\n * @param {!Object} source The object to copy properties from.\n * @private\n */\ngoog.defineClass.applyProperties_ = function(target, source) {\n // TODO(johnlenz): update this to support ES5 getters/setters\n\n var key;\n for (key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n\n // For IE the for-in-loop does not contain any properties that are not\n // enumerable on the prototype object (for example isPrototypeOf from\n // Object.prototype) and it will also not include 'replace' on objects that\n // extend String and change 'replace' (not that it is common for anyone to\n // extend anything except Object).\n for (var i = 0; i < goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length; i++) {\n key = goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[i];\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n};\n\n/**\n * Returns the parameter.\n * @param {string} s\n * @return {string}\n * @private\n */\ngoog.identity_ = function(s) {\n return s;\n};\n\n\n/**\n * Creates Trusted Types policy if Trusted Types are supported by the browser.\n * The policy just blesses any string as a Trusted Type. It is not visibility\n * restricted because anyone can also call trustedTypes.createPolicy directly.\n * However, the allowed names should be restricted by a HTTP header and the\n * reference to the created policy should be visibility restricted.\n * @param {string} name\n * @return {?TrustedTypePolicy}\n */\ngoog.createTrustedTypesPolicy = function(name) {\n var policy = null;\n var policyFactory = goog.global.trustedTypes;\n if (!policyFactory || !policyFactory.createPolicy) {\n return policy;\n }\n // trustedTypes.createPolicy throws if called with a name that is already\n // registered, even in report-only mode. Until the API changes, catch the\n // error not to break the applications functionally. In such case, the code\n // will fall back to using regular Safe Types.\n // TODO(koto): Remove catching once createPolicy API stops throwing.\n try {\n policy = policyFactory.createPolicy(name, {\n createHTML: goog.identity_,\n createScript: goog.identity_,\n createScriptURL: goog.identity_\n });\n } catch (e) {\n goog.logToConsole_(e.message);\n }\n return policy;\n};\n\n// There's a bug in the compiler where without collapse properties the\n// Closure namespace defines do not guard code correctly. To help reduce code\n// size also check for !COMPILED even though it redundant until this is fixed.\nif (!COMPILED && goog.DEPENDENCIES_ENABLED) {\n\n\n /**\n * Tries to detect whether the current browser is Edge, based on the user\n * agent. This matches only pre-Chromium Edge.\n * @see https://docs.microsoft.com/en-us/microsoft-edge/web-platform/user-agent-string\n * @return {boolean} True if the current browser is Edge.\n * @private\n */\n goog.isEdge_ = function() {\n var userAgent = goog.global.navigator && goog.global.navigator.userAgent ?\n goog.global.navigator.userAgent :\n '';\n var edgeRe = /Edge\\/(\\d+)(\\.\\d)*/i;\n return !!userAgent.match(edgeRe);\n };\n\n\n /**\n * Tries to detect whether is in the context of an HTML document.\n * @return {boolean} True if it looks like HTML document.\n * @private\n */\n goog.inHtmlDocument_ = function() {\n /** @type {!Document} */\n var doc = goog.global.document;\n return doc != null && 'write' in doc; // XULDocument misses write.\n };\n\n\n /**\n * We'd like to check for if the document readyState is 'loading'; however\n * there are bugs on IE 10 and below where the readyState being anything other\n * than 'complete' is not reliable.\n * @return {boolean}\n * @private\n */\n goog.isDocumentLoading_ = function() {\n // attachEvent is available on IE 6 thru 10 only, and thus can be used to\n // detect those browsers.\n /** @type {!HTMLDocument} */\n var doc = goog.global.document;\n return doc.attachEvent ? doc.readyState != 'complete' :\n doc.readyState == 'loading';\n };\n\n\n /**\n * Tries to detect the base path of base.js script that bootstraps Closure.\n * @private\n */\n goog.findBasePath_ = function() {\n if (goog.global.CLOSURE_BASE_PATH != undefined &&\n // Anti DOM-clobbering runtime check (b/37736576).\n typeof goog.global.CLOSURE_BASE_PATH === 'string') {\n goog.basePath = goog.global.CLOSURE_BASE_PATH;\n return;\n } else if (!goog.inHtmlDocument_()) {\n return;\n }\n /** @type {!Document} */\n var doc = goog.global.document;\n // If we have a currentScript available, use it exclusively.\n var currentScript = doc.currentScript;\n if (currentScript) {\n var scripts = [currentScript];\n } else {\n var scripts = doc.getElementsByTagName('SCRIPT');\n }\n // Search backwards since the current script is in almost all cases the one\n // that has base.js.\n for (var i = scripts.length - 1; i >= 0; --i) {\n var script = /** @type {!HTMLScriptElement} */ (scripts[i]);\n var src = script.src;\n var qmark = src.lastIndexOf('?');\n var l = qmark == -1 ? src.length : qmark;\n if (src.substr(l - 7, 7) == 'base.js') {\n goog.basePath = src.substr(0, l - 7);\n return;\n }\n }\n };\n\n goog.findBasePath_();\n\n /** @struct @constructor @final */\n goog.Transpiler = function() {\n /** @private {?Object<string, boolean>} */\n this.requiresTranspilation_ = null;\n /** @private {string} */\n this.transpilationTarget_ = goog.TRANSPILE_TO_LANGUAGE;\n };\n /**\n * Returns a newly created map from language mode string to a boolean\n * indicating whether transpilation should be done for that mode as well as\n * the highest level language that this environment supports.\n *\n * Guaranteed invariant:\n * For any two modes, l1 and l2 where l2 is a newer mode than l1,\n * `map[l1] == true` implies that `map[l2] == true`.\n *\n * Note this method is extracted and used elsewhere, so it cannot rely on\n * anything external (it should easily be able to be transformed into a\n * standalone, top level function).\n *\n * @private\n * @return {{\n * target: string,\n * map: !Object<string, boolean>\n * }}\n */\n goog.Transpiler.prototype.createRequiresTranspilation_ = function() {\n var transpilationTarget = 'es3';\n var /** !Object<string, boolean> */ requiresTranspilation = {'es3': false};\n var transpilationRequiredForAllLaterModes = false;\n\n /**\n * Adds an entry to requiresTranspliation for the given language mode.\n *\n * IMPORTANT: Calls must be made in order from oldest to newest language\n * mode.\n * @param {string} modeName\n * @param {function(): boolean} isSupported Returns true if the JS engine\n * supports the given mode.\n */\n function addNewerLanguageTranspilationCheck(modeName, isSupported) {\n if (transpilationRequiredForAllLaterModes) {\n requiresTranspilation[modeName] = true;\n } else if (isSupported()) {\n transpilationTarget = modeName;\n requiresTranspilation[modeName] = false;\n } else {\n requiresTranspilation[modeName] = true;\n transpilationRequiredForAllLaterModes = true;\n }\n }\n\n /**\n * Does the given code evaluate without syntax errors and return a truthy\n * result?\n */\n function /** boolean */ evalCheck(/** string */ code) {\n try {\n return !!eval(goog.CLOSURE_EVAL_PREFILTER_.createScript(code));\n } catch (ignored) {\n return false;\n }\n }\n\n // Identify ES3-only browsers by their incorrect treatment of commas.\n addNewerLanguageTranspilationCheck('es5', function() {\n return evalCheck('[1,].length==1');\n });\n addNewerLanguageTranspilationCheck('es6', function() {\n // Edge has a non-deterministic (i.e., not reproducible) bug with ES6:\n // https://github.com/Microsoft/ChakraCore/issues/1496.\n if (goog.isEdge_()) {\n // The Reflect.construct test below is flaky on Edge. It can sometimes\n // pass or fail on 40 15.15063, so just exit early for Edge and treat\n // it as ES5. Until we're on a more up to date version just always use\n // ES5. See https://github.com/Microsoft/ChakraCore/issues/3217.\n return false;\n }\n // Test es6: [FF50 (?), Edge 14 (?), Chrome 50]\n // (a) default params (specifically shadowing locals),\n // (b) destructuring, (c) block-scoped functions,\n // (d) for-of (const), (e) new.target/Reflect.construct\n var es6fullTest =\n 'class X{constructor(){if(new.target!=String)throw 1;this.x=42}}' +\n 'let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof ' +\n 'String))throw 1;for(const a of[2,3]){if(a==2)continue;function ' +\n 'f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()' +\n '==3}';\n\n return evalCheck('(()=>{\"use strict\";' + es6fullTest + '})()');\n });\n // ** and **= are the only new features in 'es7'\n addNewerLanguageTranspilationCheck('es7', function() {\n return evalCheck('2**3==8');\n });\n // async functions are the only new features in 'es8'\n addNewerLanguageTranspilationCheck('es8', function() {\n return evalCheck('async()=>1,1');\n });\n addNewerLanguageTranspilationCheck('es9', function() {\n return evalCheck('({...rest}={}),1');\n });\n // optional catch binding, unescaped unicode paragraph separator in strings\n addNewerLanguageTranspilationCheck('es_2019', function() {\n return evalCheck('let r;try{throw 0}catch{r=\"\\u2029\"};r');\n });\n // optional chaining, nullish coalescing\n // untested/unsupported: bigint, import meta\n addNewerLanguageTranspilationCheck('es_2020', function() {\n return evalCheck('null?.x??1');\n });\n addNewerLanguageTranspilationCheck('es_next', function() {\n return false; // assume it always need to transpile\n });\n return {target: transpilationTarget, map: requiresTranspilation};\n };\n\n\n /**\n * Determines whether the given language needs to be transpiled.\n * @param {string} lang\n * @param {string|undefined} module\n * @return {boolean}\n */\n goog.Transpiler.prototype.needsTranspile = function(lang, module) {\n if (goog.TRANSPILE == 'always') {\n return true;\n } else if (goog.TRANSPILE == 'never') {\n return false;\n } else if (!this.requiresTranspilation_) {\n var obj = this.createRequiresTranspilation_();\n this.requiresTranspilation_ = obj.map;\n this.transpilationTarget_ = this.transpilationTarget_ || obj.target;\n }\n if (lang in this.requiresTranspilation_) {\n if (this.requiresTranspilation_[lang]) {\n return true;\n } else if (\n goog.inHtmlDocument_() && module == 'es6' &&\n !('noModule' in goog.global.document.createElement('script'))) {\n return true;\n } else {\n return false;\n }\n } else {\n throw new Error('Unknown language mode: ' + lang);\n }\n };\n\n\n /**\n * Lazily retrieves the transpiler and applies it to the source.\n * @param {string} code JS code.\n * @param {string} path Path to the code.\n * @return {string} The transpiled code.\n */\n goog.Transpiler.prototype.transpile = function(code, path) {\n // TODO(johnplaisted): We should delete goog.transpile_ and just have this\n // function. But there's some compile error atm where goog.global is being\n // stripped incorrectly without this.\n return goog.transpile_(code, path, this.transpilationTarget_);\n };\n\n\n /** @private @final {!goog.Transpiler} */\n goog.transpiler_ = new goog.Transpiler();\n\n /**\n * Rewrites closing script tags in input to avoid ending an enclosing script\n * tag.\n *\n * @param {string} str\n * @return {string}\n * @private\n */\n goog.protectScriptTag_ = function(str) {\n return str.replace(/<\\/(SCRIPT)/ig, '\\\\x3c/$1');\n };\n\n\n /**\n * A debug loader is responsible for downloading and executing javascript\n * files in an unbundled, uncompiled environment.\n *\n * This can be custimized via the setDependencyFactory method, or by\n * CLOSURE_IMPORT_SCRIPT/CLOSURE_LOAD_FILE_SYNC.\n *\n * @struct @constructor @final @private\n */\n goog.DebugLoader_ = function() {\n /** @private @const {!Object<string, !goog.Dependency>} */\n this.dependencies_ = {};\n /** @private @const {!Object<string, string>} */\n this.idToPath_ = {};\n /** @private @const {!Object<string, boolean>} */\n this.written_ = {};\n /** @private @const {!Array<!goog.Dependency>} */\n this.loadingDeps_ = [];\n /** @private {!Array<!goog.Dependency>} */\n this.depsToLoad_ = [];\n /** @private {boolean} */\n this.paused_ = false;\n /** @private {!goog.DependencyFactory} */\n this.factory_ = new goog.DependencyFactory(goog.transpiler_);\n /** @private @const {!Object<string, !Function>} */\n this.deferredCallbacks_ = {};\n /** @private @const {!Array<string>} */\n this.deferredQueue_ = [];\n };\n\n /**\n * @param {!Array<string>} namespaces\n * @param {function(): undefined} callback Function to call once all the\n * namespaces have loaded.\n */\n goog.DebugLoader_.prototype.bootstrap = function(namespaces, callback) {\n var cb = callback;\n function resolve() {\n if (cb) {\n goog.global.setTimeout(cb, 0);\n cb = null;\n }\n }\n\n if (!namespaces.length) {\n resolve();\n return;\n }\n\n var deps = [];\n for (var i = 0; i < namespaces.length; i++) {\n var path = this.getPathFromDeps_(namespaces[i]);\n if (!path) {\n throw new Error('Unregonized namespace: ' + namespaces[i]);\n }\n deps.push(this.dependencies_[path]);\n }\n\n var require = goog.require;\n var loaded = 0;\n for (var i = 0; i < namespaces.length; i++) {\n require(namespaces[i]);\n deps[i].onLoad(function() {\n if (++loaded == namespaces.length) {\n resolve();\n }\n });\n }\n };\n\n\n /**\n * Loads the Closure Dependency file.\n *\n * Exposed a public function so CLOSURE_NO_DEPS can be set to false, base\n * loaded, setDependencyFactory called, and then this called. i.e. allows\n * custom loading of the deps file.\n */\n goog.DebugLoader_.prototype.loadClosureDeps = function() {\n // Circumvent addDependency, which would try to transpile deps.js if\n // transpile is set to always.\n var relPath = 'deps.js';\n this.depsToLoad_.push(this.factory_.createDependency(\n goog.normalizePath_(goog.basePath + relPath), relPath, [], [], {},\n false));\n this.loadDeps_();\n };\n\n\n /**\n * Notifies the debug loader when a dependency has been requested.\n *\n * @param {string} absPathOrId Path of the dependency or goog id.\n * @param {boolean=} opt_force\n */\n goog.DebugLoader_.prototype.requested = function(absPathOrId, opt_force) {\n var path = this.getPathFromDeps_(absPathOrId);\n if (path &&\n (opt_force || this.areDepsLoaded_(this.dependencies_[path].requires))) {\n var callback = this.deferredCallbacks_[path];\n if (callback) {\n delete this.deferredCallbacks_[path];\n callback();\n }\n }\n };\n\n\n /**\n * Sets the dependency factory, which can be used to create custom\n * goog.Dependency implementations to control how dependencies are loaded.\n *\n * @param {!goog.DependencyFactory} factory\n */\n goog.DebugLoader_.prototype.setDependencyFactory = function(factory) {\n this.factory_ = factory;\n };\n\n\n /**\n * Travserses the dependency graph and queues the given dependency, and all of\n * its transitive dependencies, for loading and then starts loading if not\n * paused.\n *\n * @param {string} namespace\n * @private\n */\n goog.DebugLoader_.prototype.load_ = function(namespace) {\n if (!this.getPathFromDeps_(namespace)) {\n var errorMessage = 'goog.require could not find: ' + namespace;\n goog.logToConsole_(errorMessage);\n } else {\n var loader = this;\n\n var deps = [];\n\n /** @param {string} namespace */\n var visit = function(namespace) {\n var path = loader.getPathFromDeps_(namespace);\n\n if (!path) {\n throw new Error('Bad dependency path or symbol: ' + namespace);\n }\n\n if (loader.written_[path]) {\n return;\n }\n\n loader.written_[path] = true;\n\n var dep = loader.dependencies_[path];\n for (var i = 0; i < dep.requires.length; i++) {\n if (!goog.isProvided_(dep.requires[i])) {\n visit(dep.requires[i]);\n }\n }\n\n deps.push(dep);\n };\n\n visit(namespace);\n\n var wasLoading = !!this.depsToLoad_.length;\n this.depsToLoad_ = this.depsToLoad_.concat(deps);\n\n if (!this.paused_ && !wasLoading) {\n this.loadDeps_();\n }\n }\n };\n\n\n /**\n * Loads any queued dependencies until they are all loaded or paused.\n *\n * @private\n */\n goog.DebugLoader_.prototype.loadDeps_ = function() {\n var loader = this;\n var paused = this.paused_;\n\n while (this.depsToLoad_.length && !paused) {\n (function() {\n var loadCallDone = false;\n var dep = loader.depsToLoad_.shift();\n\n var loaded = false;\n loader.loading_(dep);\n\n var controller = {\n pause: function() {\n if (loadCallDone) {\n throw new Error('Cannot call pause after the call to load.');\n } else {\n paused = true;\n }\n },\n resume: function() {\n if (loadCallDone) {\n loader.resume_();\n } else {\n // Some dep called pause and then resume in the same load call.\n // Just keep running this same loop.\n paused = false;\n }\n },\n loaded: function() {\n if (loaded) {\n throw new Error('Double call to loaded.');\n }\n\n loaded = true;\n loader.loaded_(dep);\n },\n pending: function() {\n // Defensive copy.\n var pending = [];\n for (var i = 0; i < loader.loadingDeps_.length; i++) {\n pending.push(loader.loadingDeps_[i]);\n }\n return pending;\n },\n /**\n * @param {goog.ModuleType} type\n */\n setModuleState: function(type) {\n goog.moduleLoaderState_ = {\n type: type,\n moduleName: '',\n declareLegacyNamespace: false\n };\n },\n /** @type {function(string, string, string=)} */\n registerEs6ModuleExports: function(\n path, exports, opt_closureNamespace) {\n if (opt_closureNamespace) {\n goog.loadedModules_[opt_closureNamespace] = {\n exports: exports,\n type: goog.ModuleType.ES6,\n moduleId: opt_closureNamespace || ''\n };\n }\n },\n /** @type {function(string, ?)} */\n registerGoogModuleExports: function(moduleId, exports) {\n goog.loadedModules_[moduleId] = {\n exports: exports,\n type: goog.ModuleType.GOOG,\n moduleId: moduleId\n };\n },\n clearModuleState: function() {\n goog.moduleLoaderState_ = null;\n },\n defer: function(callback) {\n if (loadCallDone) {\n throw new Error(\n 'Cannot register with defer after the call to load.');\n }\n loader.defer_(dep, callback);\n },\n areDepsLoaded: function() {\n return loader.areDepsLoaded_(dep.requires);\n }\n };\n\n try {\n dep.load(controller);\n } finally {\n loadCallDone = true;\n }\n })();\n }\n\n if (paused) {\n this.pause_();\n }\n };\n\n\n /** @private */\n goog.DebugLoader_.prototype.pause_ = function() {\n this.paused_ = true;\n };\n\n\n /** @private */\n goog.DebugLoader_.prototype.resume_ = function() {\n if (this.paused_) {\n this.paused_ = false;\n this.loadDeps_();\n }\n };\n\n\n /**\n * Marks the given dependency as loading (load has been called but it has not\n * yet marked itself as finished). Useful for dependencies that want to know\n * what else is loading. Example: goog.modules cannot eval if there are\n * loading dependencies.\n *\n * @param {!goog.Dependency} dep\n * @private\n */\n goog.DebugLoader_.prototype.loading_ = function(dep) {\n this.loadingDeps_.push(dep);\n };\n\n\n /**\n * Marks the given dependency as having finished loading and being available\n * for require.\n *\n * @param {!goog.Dependency} dep\n * @private\n */\n goog.DebugLoader_.prototype.loaded_ = function(dep) {\n for (var i = 0; i < this.loadingDeps_.length; i++) {\n if (this.loadingDeps_[i] == dep) {\n this.loadingDeps_.splice(i, 1);\n break;\n }\n }\n\n for (var i = 0; i < this.deferredQueue_.length; i++) {\n if (this.deferredQueue_[i] == dep.path) {\n this.deferredQueue_.splice(i, 1);\n break;\n }\n }\n\n if (this.loadingDeps_.length == this.deferredQueue_.length &&\n !this.depsToLoad_.length) {\n // Something has asked to load these, but they may not be directly\n // required again later, so load them now that we know we're done loading\n // everything else. e.g. a goog module entry point.\n while (this.deferredQueue_.length) {\n this.requested(this.deferredQueue_.shift(), true);\n }\n }\n\n dep.loaded();\n };\n\n\n /**\n * @param {!Array<string>} pathsOrIds\n * @return {boolean}\n * @private\n */\n goog.DebugLoader_.prototype.areDepsLoaded_ = function(pathsOrIds) {\n for (var i = 0; i < pathsOrIds.length; i++) {\n var path = this.getPathFromDeps_(pathsOrIds[i]);\n if (!path ||\n (!(path in this.deferredCallbacks_) &&\n !goog.isProvided_(pathsOrIds[i]))) {\n return false;\n }\n }\n\n return true;\n };\n\n\n /**\n * @param {string} absPathOrId\n * @return {?string}\n * @private\n */\n goog.DebugLoader_.prototype.getPathFromDeps_ = function(absPathOrId) {\n if (absPathOrId in this.idToPath_) {\n return this.idToPath_[absPathOrId];\n } else if (absPathOrId in this.dependencies_) {\n return absPathOrId;\n } else {\n return null;\n }\n };\n\n\n /**\n * @param {!goog.Dependency} dependency\n * @param {!Function} callback\n * @private\n */\n goog.DebugLoader_.prototype.defer_ = function(dependency, callback) {\n this.deferredCallbacks_[dependency.path] = callback;\n this.deferredQueue_.push(dependency.path);\n };\n\n\n /**\n * Interface for goog.Dependency implementations to have some control over\n * loading of dependencies.\n *\n * @record\n */\n goog.LoadController = function() {};\n\n\n /**\n * Tells the controller to halt loading of more dependencies.\n */\n goog.LoadController.prototype.pause = function() {};\n\n\n /**\n * Tells the controller to resume loading of more dependencies if paused.\n */\n goog.LoadController.prototype.resume = function() {};\n\n\n /**\n * Tells the controller that this dependency has finished loading.\n *\n * This causes this to be removed from pending() and any load callbacks to\n * fire.\n */\n goog.LoadController.prototype.loaded = function() {};\n\n\n /**\n * List of dependencies on which load has been called but which have not\n * called loaded on their controller. This includes the current dependency.\n *\n * @return {!Array<!goog.Dependency>}\n */\n goog.LoadController.prototype.pending = function() {};\n\n\n /**\n * Registers an object as an ES6 module's exports so that goog.modules may\n * require it by path.\n *\n * @param {string} path Full path of the module.\n * @param {?} exports\n * @param {string=} opt_closureNamespace Closure namespace to associate with\n * this module.\n */\n goog.LoadController.prototype.registerEs6ModuleExports = function(\n path, exports, opt_closureNamespace) {};\n\n\n /**\n * Sets the current module state.\n *\n * @param {goog.ModuleType} type Type of module.\n */\n goog.LoadController.prototype.setModuleState = function(type) {};\n\n\n /**\n * Clears the current module state.\n */\n goog.LoadController.prototype.clearModuleState = function() {};\n\n\n /**\n * Registers a callback to call once the dependency is actually requested\n * via goog.require + all of the immediate dependencies have been loaded or\n * all other files have been loaded. Allows for lazy loading until\n * require'd without pausing dependency loading, which is needed on old IE.\n *\n * @param {!Function} callback\n */\n goog.LoadController.prototype.defer = function(callback) {};\n\n\n /**\n * @return {boolean}\n */\n goog.LoadController.prototype.areDepsLoaded = function() {};\n\n\n /**\n * Basic super class for all dependencies Closure Library can load.\n *\n * This default implementation is designed to load untranspiled, non-module\n * scripts in a web broswer.\n *\n * For transpiled non-goog.module files {@see goog.TranspiledDependency}.\n * For goog.modules see {@see goog.GoogModuleDependency}.\n * For untranspiled ES6 modules {@see goog.Es6ModuleDependency}.\n *\n * @param {string} path Absolute path of this script.\n * @param {string} relativePath Path of this script relative to goog.basePath.\n * @param {!Array<string>} provides goog.provided or goog.module symbols\n * in this file.\n * @param {!Array<string>} requires goog symbols or relative paths to Closure\n * this depends on.\n * @param {!Object<string, string>} loadFlags\n * @struct @constructor\n */\n goog.Dependency = function(\n path, relativePath, provides, requires, loadFlags) {\n /** @const */\n this.path = path;\n /** @const */\n this.relativePath = relativePath;\n /** @const */\n this.provides = provides;\n /** @const */\n this.requires = requires;\n /** @const */\n this.loadFlags = loadFlags;\n /** @private {boolean} */\n this.loaded_ = false;\n /** @private {!Array<function()>} */\n this.loadCallbacks_ = [];\n };\n\n\n /**\n * @return {string} The pathname part of this dependency's path if it is a\n * URI.\n */\n goog.Dependency.prototype.getPathName = function() {\n var pathName = this.path;\n var protocolIndex = pathName.indexOf('://');\n if (protocolIndex >= 0) {\n pathName = pathName.substring(protocolIndex + 3);\n var slashIndex = pathName.indexOf('/');\n if (slashIndex >= 0) {\n pathName = pathName.substring(slashIndex + 1);\n }\n }\n return pathName;\n };\n\n\n /**\n * @param {function()} callback Callback to fire as soon as this has loaded.\n * @final\n */\n goog.Dependency.prototype.onLoad = function(callback) {\n if (this.loaded_) {\n callback();\n } else {\n this.loadCallbacks_.push(callback);\n }\n };\n\n\n /**\n * Marks this dependency as loaded and fires any callbacks registered with\n * onLoad.\n * @final\n */\n goog.Dependency.prototype.loaded = function() {\n this.loaded_ = true;\n var callbacks = this.loadCallbacks_;\n this.loadCallbacks_ = [];\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i]();\n }\n };\n\n\n /**\n * Whether or not document.written / appended script tags should be deferred.\n *\n * @private {boolean}\n */\n goog.Dependency.defer_ = false;\n\n\n /**\n * Map of script ready / state change callbacks. Old IE cannot handle putting\n * these properties on goog.global.\n *\n * @private @const {!Object<string, function(?):undefined>}\n */\n goog.Dependency.callbackMap_ = {};\n\n\n /**\n * @param {function(...?):?} callback\n * @return {string}\n * @private\n */\n goog.Dependency.registerCallback_ = function(callback) {\n var key = Math.random().toString(32);\n goog.Dependency.callbackMap_[key] = callback;\n return key;\n };\n\n\n /**\n * @param {string} key\n * @private\n */\n goog.Dependency.unregisterCallback_ = function(key) {\n delete goog.Dependency.callbackMap_[key];\n };\n\n\n /**\n * @param {string} key\n * @param {...?} var_args\n * @private\n * @suppress {unusedPrivateMembers}\n */\n goog.Dependency.callback_ = function(key, var_args) {\n if (key in goog.Dependency.callbackMap_) {\n var callback = goog.Dependency.callbackMap_[key];\n var args = [];\n for (var i = 1; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n callback.apply(undefined, args);\n } else {\n var errorMessage = 'Callback key ' + key +\n ' does not exist (was base.js loaded more than once?).';\n throw Error(errorMessage);\n }\n };\n\n\n /**\n * Starts loading this dependency. This dependency can pause loading if it\n * needs to and resume it later via the controller interface.\n *\n * When this is loaded it should call controller.loaded(). Note that this will\n * end up calling the loaded method of this dependency; there is no need to\n * call it explicitly.\n *\n * @param {!goog.LoadController} controller\n */\n goog.Dependency.prototype.load = function(controller) {\n if (goog.global.CLOSURE_IMPORT_SCRIPT) {\n if (goog.global.CLOSURE_IMPORT_SCRIPT(this.path)) {\n controller.loaded();\n } else {\n controller.pause();\n }\n return;\n }\n\n if (!goog.inHtmlDocument_()) {\n goog.logToConsole_(\n 'Cannot use default debug loader outside of HTML documents.');\n if (this.relativePath == 'deps.js') {\n // Some old code is relying on base.js auto loading deps.js failing with\n // no error before later setting CLOSURE_IMPORT_SCRIPT.\n // CLOSURE_IMPORT_SCRIPT should be set *before* base.js is loaded, or\n // CLOSURE_NO_DEPS set to true.\n goog.logToConsole_(\n 'Consider setting CLOSURE_IMPORT_SCRIPT before loading base.js, ' +\n 'or setting CLOSURE_NO_DEPS to true.');\n controller.loaded();\n } else {\n controller.pause();\n }\n return;\n }\n\n /** @type {!HTMLDocument} */\n var doc = goog.global.document;\n\n // If the user tries to require a new symbol after document load,\n // something has gone terribly wrong. Doing a document.write would\n // wipe out the page. This does not apply to the CSP-compliant method\n // of writing script tags.\n if (doc.readyState == 'complete' &&\n !goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING) {\n // Certain test frameworks load base.js multiple times, which tries\n // to write deps.js each time. If that happens, just fail silently.\n // These frameworks wipe the page between each load of base.js, so this\n // is OK.\n var isDeps = /\\bdeps.js$/.test(this.path);\n if (isDeps) {\n controller.loaded();\n return;\n } else {\n throw Error('Cannot write \"' + this.path + '\" after document load');\n }\n }\n\n var nonce = goog.getScriptNonce();\n if (!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING &&\n goog.isDocumentLoading_()) {\n var key;\n var callback = function(script) {\n if (script.readyState && script.readyState != 'complete') {\n script.onload = callback;\n return;\n }\n goog.Dependency.unregisterCallback_(key);\n controller.loaded();\n };\n key = goog.Dependency.registerCallback_(callback);\n\n var defer = goog.Dependency.defer_ ? ' defer' : '';\n var nonceAttr = nonce ? ' nonce=\"' + nonce + '\"' : '';\n var script = '<script src=\"' + this.path + '\"' + nonceAttr + defer +\n ' id=\"script-' + key + '\"><\\/script>';\n\n script += '<script' + nonceAttr + '>';\n\n if (goog.Dependency.defer_) {\n script += 'document.getElementById(\\'script-' + key +\n '\\').onload = function() {\\n' +\n ' goog.Dependency.callback_(\\'' + key + '\\', this);\\n' +\n '};\\n';\n } else {\n script += 'goog.Dependency.callback_(\\'' + key +\n '\\', document.getElementById(\\'script-' + key + '\\'));';\n }\n\n script += '<\\/script>';\n\n doc.write(\n goog.TRUSTED_TYPES_POLICY_ ?\n goog.TRUSTED_TYPES_POLICY_.createHTML(script) :\n script);\n } else {\n var scriptEl =\n /** @type {!HTMLScriptElement} */ (doc.createElement('script'));\n scriptEl.defer = goog.Dependency.defer_;\n scriptEl.async = false;\n\n // If CSP nonces are used, propagate them to dynamically created scripts.\n // This is necessary to allow nonce-based CSPs without 'strict-dynamic'.\n if (nonce) {\n scriptEl.nonce = nonce;\n }\n\n if (goog.DebugLoader_.IS_OLD_IE_) {\n // Execution order is not guaranteed on old IE, halt loading and write\n // these scripts one at a time, after each loads.\n controller.pause();\n scriptEl.onreadystatechange = function() {\n if (scriptEl.readyState == 'loaded' ||\n scriptEl.readyState == 'complete') {\n controller.loaded();\n controller.resume();\n }\n };\n } else {\n scriptEl.onload = function() {\n scriptEl.onload = null;\n controller.loaded();\n };\n }\n\n scriptEl.src = goog.TRUSTED_TYPES_POLICY_ ?\n goog.TRUSTED_TYPES_POLICY_.createScriptURL(this.path) :\n this.path;\n doc.head.appendChild(scriptEl);\n }\n };\n\n\n /**\n * @param {string} path Absolute path of this script.\n * @param {string} relativePath Path of this script relative to goog.basePath.\n * @param {!Array<string>} provides Should be an empty array.\n * TODO(johnplaisted) add support for adding closure namespaces to ES6\n * modules for interop purposes.\n * @param {!Array<string>} requires goog symbols or relative paths to Closure\n * this depends on.\n * @param {!Object<string, string>} loadFlags\n * @struct @constructor\n * @extends {goog.Dependency}\n */\n goog.Es6ModuleDependency = function(\n path, relativePath, provides, requires, loadFlags) {\n goog.Es6ModuleDependency.base(\n this, 'constructor', path, relativePath, provides, requires, loadFlags);\n };\n goog.inherits(goog.Es6ModuleDependency, goog.Dependency);\n\n\n /**\n * @override\n * @param {!goog.LoadController} controller\n */\n goog.Es6ModuleDependency.prototype.load = function(controller) {\n if (goog.global.CLOSURE_IMPORT_SCRIPT) {\n if (goog.global.CLOSURE_IMPORT_SCRIPT(this.path)) {\n controller.loaded();\n } else {\n controller.pause();\n }\n return;\n }\n\n if (!goog.inHtmlDocument_()) {\n goog.logToConsole_(\n 'Cannot use default debug loader outside of HTML documents.');\n controller.pause();\n return;\n }\n\n /** @type {!HTMLDocument} */\n var doc = goog.global.document;\n\n var dep = this;\n\n // TODO(johnplaisted): Does document.writing really speed up anything? Any\n // difference between this and just waiting for interactive mode and then\n // appending?\n function write(src, contents) {\n var nonceAttr = '';\n var nonce = goog.getScriptNonce();\n if (nonce) {\n nonceAttr = ' nonce=\"' + nonce + '\"';\n }\n\n if (contents) {\n var script = '<script type=\"module\" crossorigin' + nonceAttr + '>' +\n contents + '</' +\n 'script>';\n doc.write(\n goog.TRUSTED_TYPES_POLICY_ ?\n goog.TRUSTED_TYPES_POLICY_.createHTML(script) :\n script);\n } else {\n var script = '<script type=\"module\" crossorigin src=\"' + src + '\"' +\n nonceAttr + '></' +\n 'script>';\n doc.write(\n goog.TRUSTED_TYPES_POLICY_ ?\n goog.TRUSTED_TYPES_POLICY_.createHTML(script) :\n script);\n }\n }\n\n function append(src, contents) {\n var scriptEl =\n /** @type {!HTMLScriptElement} */ (doc.createElement('script'));\n scriptEl.defer = true;\n scriptEl.async = false;\n scriptEl.type = 'module';\n scriptEl.setAttribute('crossorigin', true);\n\n // If CSP nonces are used, propagate them to dynamically created scripts.\n // This is necessary to allow nonce-based CSPs without 'strict-dynamic'.\n var nonce = goog.getScriptNonce();\n if (nonce) {\n scriptEl.nonce = nonce;\n }\n\n if (contents) {\n scriptEl.text = goog.TRUSTED_TYPES_POLICY_ ?\n goog.TRUSTED_TYPES_POLICY_.createScript(contents) :\n contents;\n } else {\n scriptEl.src = goog.TRUSTED_TYPES_POLICY_ ?\n goog.TRUSTED_TYPES_POLICY_.createScriptURL(src) :\n src;\n }\n\n doc.head.appendChild(scriptEl);\n }\n\n var create;\n\n if (goog.isDocumentLoading_()) {\n create = write;\n // We can ONLY call document.write if we are guaranteed that any\n // non-module script tags document.written after this are deferred.\n // Small optimization, in theory document.writing is faster.\n goog.Dependency.defer_ = true;\n } else {\n create = append;\n }\n\n // Write 4 separate tags here:\n // 1) Sets the module state at the correct time (just before execution).\n // 2) A src node for this, which just hopefully lets the browser load it a\n // little early (no need to parse #3).\n // 3) Import the module and register it.\n // 4) Clear the module state at the correct time. Guaranteed to run even\n // if there is an error in the module (#3 will not run if there is an\n // error in the module).\n var beforeKey = goog.Dependency.registerCallback_(function() {\n goog.Dependency.unregisterCallback_(beforeKey);\n controller.setModuleState(goog.ModuleType.ES6);\n });\n create(undefined, 'goog.Dependency.callback_(\"' + beforeKey + '\")');\n\n // TODO(johnplaisted): Does this really speed up anything?\n create(this.path, undefined);\n\n var registerKey = goog.Dependency.registerCallback_(function(exports) {\n goog.Dependency.unregisterCallback_(registerKey);\n controller.registerEs6ModuleExports(\n dep.path, exports, goog.moduleLoaderState_.moduleName);\n });\n create(\n undefined,\n 'import * as m from \"' + this.path + '\"; goog.Dependency.callback_(\"' +\n registerKey + '\", m)');\n\n var afterKey = goog.Dependency.registerCallback_(function() {\n goog.Dependency.unregisterCallback_(afterKey);\n controller.clearModuleState();\n controller.loaded();\n });\n create(undefined, 'goog.Dependency.callback_(\"' + afterKey + '\")');\n };\n\n\n /**\n * Superclass of any dependency that needs to be loaded into memory,\n * transformed, and then eval'd (goog.modules and transpiled files).\n *\n * @param {string} path Absolute path of this script.\n * @param {string} relativePath Path of this script relative to goog.basePath.\n * @param {!Array<string>} provides goog.provided or goog.module symbols\n * in this file.\n * @param {!Array<string>} requires goog symbols or relative paths to Closure\n * this depends on.\n * @param {!Object<string, string>} loadFlags\n * @struct @constructor @abstract\n * @extends {goog.Dependency}\n */\n goog.TransformedDependency = function(\n path, relativePath, provides, requires, loadFlags) {\n goog.TransformedDependency.base(\n this, 'constructor', path, relativePath, provides, requires, loadFlags);\n /** @private {?string} */\n this.contents_ = null;\n\n /**\n * Whether to lazily make the synchronous XHR (when goog.require'd) or make\n * the synchronous XHR when initially loading. On FireFox 61 there is a bug\n * where an ES6 module cannot make a synchronous XHR (rather, it can, but if\n * it does then no other ES6 modules will load after).\n *\n * tl;dr we lazy load due to bugs on older browsers and eager load due to\n * bugs on newer ones.\n *\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1477090\n *\n * @private @const {boolean}\n */\n this.lazyFetch_ = !goog.inHtmlDocument_() ||\n !('noModule' in goog.global.document.createElement('script'));\n };\n goog.inherits(goog.TransformedDependency, goog.Dependency);\n\n\n /**\n * @override\n * @param {!goog.LoadController} controller\n */\n goog.TransformedDependency.prototype.load = function(controller) {\n var dep = this;\n\n function fetch() {\n dep.contents_ = goog.loadFileSync_(dep.path);\n\n if (dep.contents_) {\n dep.contents_ = dep.transform(dep.contents_);\n if (dep.contents_) {\n dep.contents_ += '\\n//# sourceURL=' + dep.path;\n }\n }\n }\n\n if (goog.global.CLOSURE_IMPORT_SCRIPT) {\n fetch();\n if (this.contents_ &&\n goog.global.CLOSURE_IMPORT_SCRIPT('', this.contents_)) {\n this.contents_ = null;\n controller.loaded();\n } else {\n controller.pause();\n }\n return;\n }\n\n\n var isEs6 = this.loadFlags['module'] == goog.ModuleType.ES6;\n\n if (!this.lazyFetch_) {\n fetch();\n }\n\n function load() {\n if (dep.lazyFetch_) {\n fetch();\n }\n\n if (!dep.contents_) {\n // loadFileSync_ or transform are responsible. Assume they logged an\n // error.\n return;\n }\n\n if (isEs6) {\n controller.setModuleState(goog.ModuleType.ES6);\n }\n\n var namespace;\n\n try {\n var contents = dep.contents_;\n dep.contents_ = null;\n goog.globalEval(goog.CLOSURE_EVAL_PREFILTER_.createScript(contents));\n if (isEs6) {\n namespace = goog.moduleLoaderState_.moduleName;\n }\n } finally {\n if (isEs6) {\n controller.clearModuleState();\n }\n }\n\n if (isEs6) {\n // Due to circular dependencies this may not be available for require\n // right now.\n goog.global['$jscomp']['require']['ensure'](\n [dep.getPathName()], function() {\n controller.registerEs6ModuleExports(\n dep.path,\n goog.global['$jscomp']['require'](dep.getPathName()),\n namespace);\n });\n }\n\n controller.loaded();\n }\n\n // Do not fetch now; in FireFox 47 the synchronous XHR doesn't block all\n // events. If we fetched now and then document.write'd the contents the\n // document.write would be an eval and would execute too soon! Instead write\n // a script tag to fetch and eval synchronously at the correct time.\n function fetchInOwnScriptThenLoad() {\n /** @type {!HTMLDocument} */\n var doc = goog.global.document;\n\n var key = goog.Dependency.registerCallback_(function() {\n goog.Dependency.unregisterCallback_(key);\n load();\n });\n\n var nonce = goog.getScriptNonce();\n var nonceAttr = nonce ? ' nonce=\"' + nonce + '\"' : '';\n var script = '<script' + nonceAttr + '>' +\n goog.protectScriptTag_('goog.Dependency.callback_(\"' + key + '\");') +\n '</' +\n 'script>';\n doc.write(\n goog.TRUSTED_TYPES_POLICY_ ?\n goog.TRUSTED_TYPES_POLICY_.createHTML(script) :\n script);\n }\n\n // If one thing is pending it is this.\n var anythingElsePending = controller.pending().length > 1;\n\n // If anything else is loading we need to lazy load due to bugs in old IE.\n // Specifically script tags with src and script tags with contents could\n // execute out of order if document.write is used, so we cannot use\n // document.write. Do not pause here; it breaks old IE as well.\n var useOldIeWorkAround =\n anythingElsePending && goog.DebugLoader_.IS_OLD_IE_;\n\n // Additionally if we are meant to defer scripts but the page is still\n // loading (e.g. an ES6 module is loading) then also defer. Or if we are\n // meant to defer and anything else is pending then defer (those may be\n // scripts that did not need transformation and are just script tags with\n // defer set to true, and we need to evaluate after that deferred script).\n var needsAsyncLoading = goog.Dependency.defer_ &&\n (anythingElsePending || goog.isDocumentLoading_());\n\n if (useOldIeWorkAround || needsAsyncLoading) {\n // Note that we only defer when we have to rather than 100% of the time.\n // Always defering would work, but then in theory the order of\n // goog.require calls would then matter. We want to enforce that most of\n // the time the order of the require calls does not matter.\n controller.defer(function() {\n load();\n });\n return;\n }\n // TODO(johnplaisted): Externs are missing onreadystatechange for\n // HTMLDocument.\n /** @type {?} */\n var doc = goog.global.document;\n\n var isInternetExplorerOrEdge = goog.inHtmlDocument_() &&\n ('ActiveXObject' in goog.global || goog.isEdge_());\n\n // Don't delay in any version of IE or pre-Chromium Edge. There's a bug\n // around this that will cause out of order script execution. This means\n // that on older IE ES6 modules will load too early (while the document is\n // still loading + the dom is not available). The other option is to load\n // too late (when the document is complete and the onload even will never\n // fire). This seems to be the lesser of two evils as scripts already act\n // like the former.\n if (isEs6 && goog.inHtmlDocument_() && goog.isDocumentLoading_() &&\n !isInternetExplorerOrEdge) {\n goog.Dependency.defer_ = true;\n // Transpiled ES6 modules still need to load like regular ES6 modules,\n // aka only after the document is interactive.\n controller.pause();\n var oldCallback = doc.onreadystatechange;\n doc.onreadystatechange = function() {\n if (doc.readyState == 'interactive') {\n doc.onreadystatechange = oldCallback;\n load();\n controller.resume();\n }\n if (typeof oldCallback === 'function') {\n oldCallback.apply(undefined, arguments);\n }\n };\n } else {\n // Always eval on old IE.\n if (goog.DebugLoader_.IS_OLD_IE_ || !goog.inHtmlDocument_() ||\n !goog.isDocumentLoading_()) {\n load();\n } else {\n fetchInOwnScriptThenLoad();\n }\n }\n };\n\n\n /**\n * @param {string} contents\n * @return {string}\n * @abstract\n */\n goog.TransformedDependency.prototype.transform = function(contents) {};\n\n\n /**\n * Any non-goog.module dependency which needs to be transpiled before eval.\n *\n * @param {string} path Absolute path of this script.\n * @param {string} relativePath Path of this script relative to goog.basePath.\n * @param {!Array<string>} provides goog.provided or goog.module symbols\n * in this file.\n * @param {!Array<string>} requires goog symbols or relative paths to Closure\n * this depends on.\n * @param {!Object<string, string>} loadFlags\n * @param {!goog.Transpiler} transpiler\n * @struct @constructor\n * @extends {goog.TransformedDependency}\n */\n goog.TranspiledDependency = function(\n path, relativePath, provides, requires, loadFlags, transpiler) {\n goog.TranspiledDependency.base(\n this, 'constructor', path, relativePath, provides, requires, loadFlags);\n /** @protected @const*/\n this.transpiler = transpiler;\n };\n goog.inherits(goog.TranspiledDependency, goog.TransformedDependency);\n\n\n /**\n * @override\n * @param {string} contents\n * @return {string}\n */\n goog.TranspiledDependency.prototype.transform = function(contents) {\n // Transpile with the pathname so that ES6 modules are domain agnostic.\n return this.transpiler.transpile(contents, this.getPathName());\n };\n\n\n /**\n * An ES6 module dependency that was transpiled to a jscomp module outside\n * of the debug loader, e.g. server side.\n *\n * @param {string} path Absolute path of this script.\n * @param {string} relativePath Path of this script relative to goog.basePath.\n * @param {!Array<string>} provides goog.provided or goog.module symbols\n * in this file.\n * @param {!Array<string>} requires goog symbols or relative paths to Closure\n * this depends on.\n * @param {!Object<string, string>} loadFlags\n * @struct @constructor\n * @extends {goog.TransformedDependency}\n */\n goog.PreTranspiledEs6ModuleDependency = function(\n path, relativePath, provides, requires, loadFlags) {\n goog.PreTranspiledEs6ModuleDependency.base(\n this, 'constructor', path, relativePath, provides, requires, loadFlags);\n };\n goog.inherits(\n goog.PreTranspiledEs6ModuleDependency, goog.TransformedDependency);\n\n\n /**\n * @override\n * @param {string} contents\n * @return {string}\n */\n goog.PreTranspiledEs6ModuleDependency.prototype.transform = function(\n contents) {\n return contents;\n };\n\n\n /**\n * A goog.module, transpiled or not. Will always perform some minimal\n * transformation even when not transpiled to wrap in a goog.loadModule\n * statement.\n *\n * @param {string} path Absolute path of this script.\n * @param {string} relativePath Path of this script relative to goog.basePath.\n * @param {!Array<string>} provides goog.provided or goog.module symbols\n * in this file.\n * @param {!Array<string>} requires goog symbols or relative paths to Closure\n * this depends on.\n * @param {!Object<string, string>} loadFlags\n * @param {boolean} needsTranspile\n * @param {!goog.Transpiler} transpiler\n * @struct @constructor\n * @extends {goog.TransformedDependency}\n */\n goog.GoogModuleDependency = function(\n path, relativePath, provides, requires, loadFlags, needsTranspile,\n transpiler) {\n goog.GoogModuleDependency.base(\n this, 'constructor', path, relativePath, provides, requires, loadFlags);\n /** @private @const */\n this.needsTranspile_ = needsTranspile;\n /** @private @const */\n this.transpiler_ = transpiler;\n };\n goog.inherits(goog.GoogModuleDependency, goog.TransformedDependency);\n\n\n /**\n * @override\n * @param {string} contents\n * @return {string}\n */\n goog.GoogModuleDependency.prototype.transform = function(contents) {\n if (this.needsTranspile_) {\n contents = this.transpiler_.transpile(contents, this.getPathName());\n }\n\n if (!goog.LOAD_MODULE_USING_EVAL || goog.global.JSON === undefined) {\n return '' +\n 'goog.loadModule(function(exports) {' +\n '\"use strict\";' + contents +\n '\\n' + // terminate any trailing single line comment.\n ';return exports' +\n '});' +\n '\\n//# sourceURL=' + this.path + '\\n';\n } else {\n return '' +\n 'goog.loadModule(' +\n goog.global.JSON.stringify(\n contents + '\\n//# sourceURL=' + this.path + '\\n') +\n ');';\n }\n };\n\n\n /**\n * Whether the browser is IE9 or earlier, which needs special handling\n * for deferred modules.\n * @const @private {boolean}\n */\n goog.DebugLoader_.IS_OLD_IE_ = !!(\n !goog.global.atob && goog.global.document && goog.global.document['all']);\n\n\n /**\n * @param {string} relPath\n * @param {!Array<string>|undefined} provides\n * @param {!Array<string>} requires\n * @param {boolean|!Object<string>=} opt_loadFlags\n * @see goog.addDependency\n */\n goog.DebugLoader_.prototype.addDependency = function(\n relPath, provides, requires, opt_loadFlags) {\n provides = provides || [];\n relPath = relPath.replace(/\\\\/g, '/');\n var path = goog.normalizePath_(goog.basePath + relPath);\n if (!opt_loadFlags || typeof opt_loadFlags === 'boolean') {\n opt_loadFlags = opt_loadFlags ? {'module': goog.ModuleType.GOOG} : {};\n }\n var dep = this.factory_.createDependency(\n path, relPath, provides, requires, opt_loadFlags,\n goog.transpiler_.needsTranspile(\n opt_loadFlags['lang'] || 'es3', opt_loadFlags['module']));\n this.dependencies_[path] = dep;\n for (var i = 0; i < provides.length; i++) {\n this.idToPath_[provides[i]] = path;\n }\n this.idToPath_[relPath] = path;\n };\n\n\n /**\n * Creates goog.Dependency instances for the debug loader to load.\n *\n * Should be overridden to have the debug loader use custom subclasses of\n * goog.Dependency.\n *\n * @param {!goog.Transpiler} transpiler\n * @struct @constructor\n */\n goog.DependencyFactory = function(transpiler) {\n /** @protected @const */\n this.transpiler = transpiler;\n };\n\n\n /**\n * @param {string} path Absolute path of the file.\n * @param {string} relativePath Path relative to closure\u2019s base.js.\n * @param {!Array<string>} provides Array of provided goog.provide/module ids.\n * @param {!Array<string>} requires Array of required goog.provide/module /\n * relative ES6 module paths.\n * @param {!Object<string, string>} loadFlags\n * @param {boolean} needsTranspile True if the file needs to be transpiled\n * per the goog.Transpiler.\n * @return {!goog.Dependency}\n */\n goog.DependencyFactory.prototype.createDependency = function(\n path, relativePath, provides, requires, loadFlags, needsTranspile) {\n\n if (loadFlags['module'] == goog.ModuleType.GOOG) {\n return new goog.GoogModuleDependency(\n path, relativePath, provides, requires, loadFlags, needsTranspile,\n this.transpiler);\n } else if (needsTranspile) {\n return new goog.TranspiledDependency(\n path, relativePath, provides, requires, loadFlags, this.transpiler);\n } else {\n if (loadFlags['module'] == goog.ModuleType.ES6) {\n if (goog.TRANSPILE == 'never' && goog.ASSUME_ES_MODULES_TRANSPILED) {\n return new goog.PreTranspiledEs6ModuleDependency(\n path, relativePath, provides, requires, loadFlags);\n } else {\n return new goog.Es6ModuleDependency(\n path, relativePath, provides, requires, loadFlags);\n }\n } else {\n return new goog.Dependency(\n path, relativePath, provides, requires, loadFlags);\n }\n }\n };\n\n\n /** @private @const */\n goog.debugLoader_ = new goog.DebugLoader_();\n\n\n /**\n * Loads the Closure Dependency file.\n *\n * Exposed a public function so CLOSURE_NO_DEPS can be set to false, base\n * loaded, setDependencyFactory called, and then this called. i.e. allows\n * custom loading of the deps file.\n */\n goog.loadClosureDeps = function() {\n goog.debugLoader_.loadClosureDeps();\n };\n\n\n /**\n * Sets the dependency factory, which can be used to create custom\n * goog.Dependency implementations to control how dependencies are loaded.\n *\n * Note: if you wish to call this function and provide your own implemnetation\n * it is a wise idea to set CLOSURE_NO_DEPS to true, otherwise the dependency\n * file and all of its goog.addDependency calls will use the default factory.\n * You can call goog.loadClosureDeps to load the Closure dependency file\n * later, after your factory is injected.\n *\n * @param {!goog.DependencyFactory} factory\n */\n goog.setDependencyFactory = function(factory) {\n goog.debugLoader_.setDependencyFactory(factory);\n };\n\n\n /**\n * Trusted Types policy for the debug loader.\n * @private @const {?TrustedTypePolicy}\n */\n goog.TRUSTED_TYPES_POLICY_ = goog.TRUSTED_TYPES_POLICY_NAME ?\n goog.createTrustedTypesPolicy(goog.TRUSTED_TYPES_POLICY_NAME + '#base') :\n null;\n\n if (!goog.global.CLOSURE_NO_DEPS) {\n goog.debugLoader_.loadClosureDeps();\n }\n\n\n /**\n * Bootstraps the given namespaces and calls the callback once they are\n * available either via goog.require. This is a replacement for using\n * `goog.require` to bootstrap Closure JavaScript. Previously a `goog.require`\n * in an HTML file would guarantee that the require'd namespace was available\n * in the next immediate script tag. With ES6 modules this no longer a\n * guarantee.\n *\n * @param {!Array<string>} namespaces\n * @param {function(): ?} callback Function to call once all the namespaces\n * have loaded. Always called asynchronously.\n */\n goog.bootstrap = function(namespaces, callback) {\n goog.debugLoader_.bootstrap(namespaces, callback);\n };\n}\n\n\nif (!COMPILED) {\n var isChrome87 = false;\n // Cannot run check for Chrome <87 bug in case of strict CSP environments.\n // TODO(user): Remove once Chrome <87 bug is no longer a problem.\n try {\n isChrome87 = eval(goog.global.trustedTypes.emptyScript) !==\n goog.global.trustedTypes.emptyScript;\n } catch (err) {\n }\n\n /**\n * Trusted Types for running dev servers.\n *\n * @private @const\n */\n goog.CLOSURE_EVAL_PREFILTER_ =\n // Detect Chrome <87 bug with TT and eval.\n goog.global.trustedTypes && isChrome87 &&\n goog.createTrustedTypesPolicy('goog#base#devonly#eval') ||\n {createScript: goog.identity_};\n}\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Implements the disposable interface.\n */\n\ngoog.provide('goog.Disposable');\n\ngoog.require('goog.disposable.IDisposable');\ngoog.require('goog.dispose');\n/**\n * TODO(user): Remove this require.\n * @suppress {extraRequire}\n */\ngoog.require('goog.disposeAll');\n\n/**\n * Class that provides the basic implementation for disposable objects. If your\n * class holds references or resources that can't be collected by standard GC,\n * it should extend this class or implement the disposable interface (defined\n * in goog.disposable.IDisposable). See description of\n * goog.disposable.IDisposable for examples of cleanup.\n * @constructor\n * @implements {goog.disposable.IDisposable}\n */\ngoog.Disposable = function() {\n 'use strict';\n /**\n * If monitoring the goog.Disposable instances is enabled, stores the creation\n * stack trace of the Disposable instance.\n * @type {string|undefined}\n */\n this.creationStack;\n\n if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) {\n if (goog.Disposable.INCLUDE_STACK_ON_CREATION) {\n this.creationStack = new Error().stack;\n }\n goog.Disposable.instances_[goog.getUid(this)] = this;\n }\n // Support sealing\n this.disposed_ = this.disposed_;\n this.onDisposeCallbacks_ = this.onDisposeCallbacks_;\n};\n\n\n/**\n * @enum {number} Different monitoring modes for Disposable.\n */\ngoog.Disposable.MonitoringMode = {\n /**\n * No monitoring.\n */\n OFF: 0,\n /**\n * Creating and disposing the goog.Disposable instances is monitored. All\n * disposable objects need to call the `goog.Disposable` base\n * constructor. The PERMANENT mode must be switched on before creating any\n * goog.Disposable instances.\n */\n PERMANENT: 1,\n /**\n * INTERACTIVE mode can be switched on and off on the fly without producing\n * errors. It also doesn't warn if the disposable objects don't call the\n * `goog.Disposable` base constructor.\n */\n INTERACTIVE: 2\n};\n\n\n/**\n * @define {number} The monitoring mode of the goog.Disposable\n * instances. Default is OFF. Switching on the monitoring is only\n * recommended for debugging because it has a significant impact on\n * performance and memory usage. If switched off, the monitoring code\n * compiles down to 0 bytes.\n */\ngoog.Disposable.MONITORING_MODE =\n goog.define('goog.Disposable.MONITORING_MODE', 0);\n\n\n/**\n * @define {boolean} Whether to attach creation stack to each created disposable\n * instance; This is only relevant for when MonitoringMode != OFF.\n */\ngoog.Disposable.INCLUDE_STACK_ON_CREATION =\n goog.define('goog.Disposable.INCLUDE_STACK_ON_CREATION', true);\n\n\n/**\n * Maps the unique ID of every undisposed `goog.Disposable` object to\n * the object itself.\n * @type {!Object<number, !goog.Disposable>}\n * @private\n */\ngoog.Disposable.instances_ = {};\n\n\n/**\n * @return {!Array<!goog.Disposable>} All `goog.Disposable` objects that\n * haven't been disposed of.\n */\ngoog.Disposable.getUndisposedObjects = function() {\n 'use strict';\n var ret = [];\n for (var id in goog.Disposable.instances_) {\n if (goog.Disposable.instances_.hasOwnProperty(id)) {\n ret.push(goog.Disposable.instances_[Number(id)]);\n }\n }\n return ret;\n};\n\n\n/**\n * Clears the registry of undisposed objects but doesn't dispose of them.\n */\ngoog.Disposable.clearUndisposedObjects = function() {\n 'use strict';\n goog.Disposable.instances_ = {};\n};\n\n\n/**\n * Whether the object has been disposed of.\n * @type {boolean}\n * @private\n */\ngoog.Disposable.prototype.disposed_ = false;\n\n\n/**\n * Callbacks to invoke when this object is disposed.\n * @type {Array<!Function>}\n * @private\n */\ngoog.Disposable.prototype.onDisposeCallbacks_;\n\n\n/**\n * @return {boolean} Whether the object has been disposed of.\n * @override\n */\ngoog.Disposable.prototype.isDisposed = function() {\n 'use strict';\n return this.disposed_;\n};\n\n\n/**\n * @return {boolean} Whether the object has been disposed of.\n * @deprecated Use {@link #isDisposed} instead.\n */\ngoog.Disposable.prototype.getDisposed = goog.Disposable.prototype.isDisposed;\n\n\n/**\n * Disposes of the object. If the object hasn't already been disposed of, calls\n * {@link #disposeInternal}. Classes that extend `goog.Disposable` should\n * override {@link #disposeInternal} in order to cleanup references, resources\n * and other disposable objects. Reentrant.\n *\n * @return {void} Nothing.\n * @override\n */\ngoog.Disposable.prototype.dispose = function() {\n 'use strict';\n if (!this.disposed_) {\n // Set disposed_ to true first, in case during the chain of disposal this\n // gets disposed recursively.\n this.disposed_ = true;\n this.disposeInternal();\n if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) {\n var uid = goog.getUid(this);\n if (goog.Disposable.MONITORING_MODE ==\n goog.Disposable.MonitoringMode.PERMANENT &&\n !goog.Disposable.instances_.hasOwnProperty(uid)) {\n throw new Error(\n this + ' did not call the goog.Disposable base ' +\n 'constructor or was disposed of after a clearUndisposedObjects ' +\n 'call');\n }\n if (goog.Disposable.MONITORING_MODE !=\n goog.Disposable.MonitoringMode.OFF &&\n this.onDisposeCallbacks_ && this.onDisposeCallbacks_.length > 0) {\n throw new Error(\n this + ' did not empty its onDisposeCallbacks queue. This ' +\n 'probably means it overrode dispose() or disposeInternal() ' +\n 'without calling the superclass\\' method.');\n }\n delete goog.Disposable.instances_[uid];\n }\n }\n};\n\n\n/**\n * Associates a disposable object with this object so that they will be disposed\n * together.\n * @param {goog.disposable.IDisposable} disposable that will be disposed when\n * this object is disposed.\n */\ngoog.Disposable.prototype.registerDisposable = function(disposable) {\n 'use strict';\n this.addOnDisposeCallback(goog.partial(goog.dispose, disposable));\n};\n\n\n/**\n * Invokes a callback function when this object is disposed. Callbacks are\n * invoked in the order in which they were added. If a callback is added to\n * an already disposed Disposable, it will be called immediately.\n * @param {function(this:T):?} callback The callback function.\n * @param {T=} opt_scope An optional scope to call the callback in.\n * @template T\n */\ngoog.Disposable.prototype.addOnDisposeCallback = function(callback, opt_scope) {\n 'use strict';\n if (this.disposed_) {\n opt_scope !== undefined ? callback.call(opt_scope) : callback();\n return;\n }\n if (!this.onDisposeCallbacks_) {\n this.onDisposeCallbacks_ = [];\n }\n\n this.onDisposeCallbacks_.push(\n opt_scope !== undefined ? goog.bind(callback, opt_scope) : callback);\n};\n\n\n/**\n * Performs appropriate cleanup. See description of goog.disposable.IDisposable\n * for examples. Classes that extend `goog.Disposable` should override this\n * method. Not reentrant. To avoid calling it twice, it must only be called from\n * the subclass' `disposeInternal` method. Everywhere else the public `dispose`\n * method must be used. For example:\n *\n * <pre>\n * mypackage.MyClass = function() {\n * mypackage.MyClass.base(this, 'constructor');\n * // Constructor logic specific to MyClass.\n * ...\n * };\n * goog.inherits(mypackage.MyClass, goog.Disposable);\n *\n * mypackage.MyClass.prototype.disposeInternal = function() {\n * // Dispose logic specific to MyClass.\n * ...\n * // Call superclass's disposeInternal at the end of the subclass's, like\n * // in C++, to avoid hard-to-catch issues.\n * mypackage.MyClass.base(this, 'disposeInternal');\n * };\n * </pre>\n *\n * @protected\n */\ngoog.Disposable.prototype.disposeInternal = function() {\n 'use strict';\n if (this.onDisposeCallbacks_) {\n while (this.onDisposeCallbacks_.length) {\n this.onDisposeCallbacks_.shift()();\n }\n }\n};\n\n\n/**\n * Returns True if we can verify the object is disposed.\n * Calls `isDisposed` on the argument if it supports it. If obj\n * is not an object with an isDisposed() method, return false.\n * @param {*} obj The object to investigate.\n * @return {boolean} True if we can verify the object is disposed.\n */\ngoog.Disposable.isDisposed = function(obj) {\n 'use strict';\n if (obj && typeof obj.isDisposed == 'function') {\n return obj.isDisposed();\n }\n return false;\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Utilities for manipulating arrays.\n */\n\n\ngoog.module('goog.array');\ngoog.module.declareLegacyNamespace();\n\nconst asserts = goog.require('goog.asserts');\n\n\n/**\n * @define {boolean} NATIVE_ARRAY_PROTOTYPES indicates whether the code should\n * rely on Array.prototype functions, if available.\n *\n * The Array.prototype functions can be defined by external libraries like\n * Prototype and setting this flag to false forces closure to use its own\n * goog.array implementation.\n *\n * If your javascript can be loaded by a third party site and you are wary about\n * relying on the prototype functions, specify\n * \"--define goog.NATIVE_ARRAY_PROTOTYPES=false\" to the JSCompiler.\n *\n * Setting goog.TRUSTED_SITE to false will automatically set\n * NATIVE_ARRAY_PROTOTYPES to false.\n */\ngoog.NATIVE_ARRAY_PROTOTYPES =\n goog.define('goog.NATIVE_ARRAY_PROTOTYPES', goog.TRUSTED_SITE);\n\n\n/**\n * @define {boolean} If true, JSCompiler will use the native implementation of\n * array functions where appropriate (e.g., `Array#filter`) and remove the\n * unused pure JS implementation.\n */\nconst ASSUME_NATIVE_FUNCTIONS = goog.define(\n 'goog.array.ASSUME_NATIVE_FUNCTIONS', goog.FEATURESET_YEAR > 2012);\nexports.ASSUME_NATIVE_FUNCTIONS = ASSUME_NATIVE_FUNCTIONS;\n\n\n/**\n * Returns the last element in an array without removing it.\n * Same as {@link goog.array.last}.\n * @param {IArrayLike<T>|string} array The array.\n * @return {T} Last item in array.\n * @template T\n */\nfunction peek(array) {\n return array[array.length - 1];\n}\nexports.peek = peek;\n\n\n/**\n * Returns the last element in an array without removing it.\n * Same as {@link goog.array.peek}.\n * @param {IArrayLike<T>|string} array The array.\n * @return {T} Last item in array.\n * @template T\n */\nexports.last = peek;\n\n// NOTE(arv): Since most of the array functions are generic it allows you to\n// pass an array-like object. Strings have a length and are considered array-\n// like. However, the 'in' operator does not work on strings so we cannot just\n// use the array path even if the browser supports indexing into strings. We\n// therefore end up splitting the string.\n\n\n/**\n * Returns the index of the first element of an array with a specified value, or\n * -1 if the element is not present in the array.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-indexof}\n *\n * @param {IArrayLike<T>|string} arr The array to be searched.\n * @param {T} obj The object for which we are searching.\n * @param {number=} opt_fromIndex The index at which to start the search. If\n * omitted the search starts at index 0.\n * @return {number} The index of the first matching array element.\n * @template T\n */\nconst indexOf = goog.NATIVE_ARRAY_PROTOTYPES &&\n (ASSUME_NATIVE_FUNCTIONS || Array.prototype.indexOf) ?\n function(arr, obj, opt_fromIndex) {\n asserts.assert(arr.length != null);\n\n return Array.prototype.indexOf.call(arr, obj, opt_fromIndex);\n } :\n function(arr, obj, opt_fromIndex) {\n const fromIndex = opt_fromIndex == null ?\n 0 :\n (opt_fromIndex < 0 ? Math.max(0, arr.length + opt_fromIndex) :\n opt_fromIndex);\n\n if (typeof arr === 'string') {\n // Array.prototype.indexOf uses === so only strings should be found.\n if (typeof obj !== 'string' || obj.length != 1) {\n return -1;\n }\n return arr.indexOf(obj, fromIndex);\n }\n\n for (let i = fromIndex; i < arr.length; i++) {\n if (i in arr && arr[i] === obj) return i;\n }\n return -1;\n };\nexports.indexOf = indexOf;\n\n\n/**\n * Returns the index of the last element of an array with a specified value, or\n * -1 if the element is not present in the array.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-lastindexof}\n *\n * @param {!IArrayLike<T>|string} arr The array to be searched.\n * @param {T} obj The object for which we are searching.\n * @param {?number=} opt_fromIndex The index at which to start the search. If\n * omitted the search starts at the end of the array.\n * @return {number} The index of the last matching array element.\n * @template T\n */\nconst lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES &&\n (ASSUME_NATIVE_FUNCTIONS || Array.prototype.lastIndexOf) ?\n function(arr, obj, opt_fromIndex) {\n asserts.assert(arr.length != null);\n\n // Firefox treats undefined and null as 0 in the fromIndex argument which\n // leads it to always return -1\n const fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex;\n return Array.prototype.lastIndexOf.call(arr, obj, fromIndex);\n } :\n function(arr, obj, opt_fromIndex) {\n let fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex;\n\n if (fromIndex < 0) {\n fromIndex = Math.max(0, arr.length + fromIndex);\n }\n\n if (typeof arr === 'string') {\n // Array.prototype.lastIndexOf uses === so only strings should be found.\n if (typeof obj !== 'string' || obj.length != 1) {\n return -1;\n }\n return arr.lastIndexOf(obj, fromIndex);\n }\n\n for (let i = fromIndex; i >= 0; i--) {\n if (i in arr && arr[i] === obj) return i;\n }\n return -1;\n };\nexports.lastIndexOf = lastIndexOf;\n\n\n/**\n * Calls a function for each element in an array. Skips holes in the array.\n * See {@link http://tinyurl.com/developer-mozilla-org-array-foreach}\n *\n * @param {IArrayLike<T>|string} arr Array or array like object over\n * which to iterate.\n * @param {?function(this: S, T, number, ?): ?} f The function to call for every\n * element. This function takes 3 arguments (the element, the index and the\n * array). The return value is ignored.\n * @param {S=} opt_obj The object to be used as the value of 'this' within f.\n * @template T,S\n */\nconst forEach = goog.NATIVE_ARRAY_PROTOTYPES &&\n (ASSUME_NATIVE_FUNCTIONS || Array.prototype.forEach) ?\n function(arr, f, opt_obj) {\n asserts.assert(arr.length != null);\n\n Array.prototype.forEach.call(arr, f, opt_obj);\n } :\n function(arr, f, opt_obj) {\n const l = arr.length; // must be fixed during loop... see docs\n const arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n for (let i = 0; i < l; i++) {\n if (i in arr2) {\n f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);\n }\n }\n };\nexports.forEach = forEach;\n\n\n/**\n * Calls a function for each element in an array, starting from the last\n * element rather than the first.\n *\n * @param {IArrayLike<T>|string} arr Array or array\n * like object over which to iterate.\n * @param {?function(this: S, T, number, ?): ?} f The function to call for every\n * element. This function\n * takes 3 arguments (the element, the index and the array). The return\n * value is ignored.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n * within f.\n * @template T,S\n */\nfunction forEachRight(arr, f, opt_obj) {\n const l = arr.length; // must be fixed during loop... see docs\n const arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n for (let i = l - 1; i >= 0; --i) {\n if (i in arr2) {\n f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);\n }\n }\n}\nexports.forEachRight = forEachRight;\n\n\n/**\n * Calls a function for each element in an array, and if the function returns\n * true adds the element to a new array.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-filter}\n *\n * @param {IArrayLike<T>|string} arr Array or array\n * like object over which to iterate.\n * @param {?function(this:S, T, number, ?):boolean} f The function to call for\n * every element. This function\n * takes 3 arguments (the element, the index and the array) and must\n * return a Boolean. If the return value is true the element is added to the\n * result array. If it is false the element is not included.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n * within f.\n * @return {!Array<T>} a new array in which only elements that passed the test\n * are present.\n * @template T,S\n */\nconst filter = goog.NATIVE_ARRAY_PROTOTYPES &&\n (ASSUME_NATIVE_FUNCTIONS || Array.prototype.filter) ?\n function(arr, f, opt_obj) {\n asserts.assert(arr.length != null);\n\n return Array.prototype.filter.call(arr, f, opt_obj);\n } :\n function(arr, f, opt_obj) {\n const l = arr.length; // must be fixed during loop... see docs\n const res = [];\n let resLength = 0;\n const arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n for (let i = 0; i < l; i++) {\n if (i in arr2) {\n const val = arr2[i]; // in case f mutates arr2\n if (f.call(/** @type {?} */ (opt_obj), val, i, arr)) {\n res[resLength++] = val;\n }\n }\n }\n return res;\n };\nexports.filter = filter;\n\n\n/**\n * Calls a function for each element in an array and inserts the result into a\n * new array.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-map}\n *\n * @param {IArrayLike<VALUE>|string} arr Array or array like object\n * over which to iterate.\n * @param {function(this:THIS, VALUE, number, ?): RESULT} f The function to call\n * for every element. This function takes 3 arguments (the element,\n * the index and the array) and should return something. The result will be\n * inserted into a new array.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within f.\n * @return {!Array<RESULT>} a new array with the results from f.\n * @template THIS, VALUE, RESULT\n */\nconst map = goog.NATIVE_ARRAY_PROTOTYPES &&\n (ASSUME_NATIVE_FUNCTIONS || Array.prototype.map) ?\n function(arr, f, opt_obj) {\n asserts.assert(arr.length != null);\n\n return Array.prototype.map.call(arr, f, opt_obj);\n } :\n function(arr, f, opt_obj) {\n const l = arr.length; // must be fixed during loop... see docs\n const res = new Array(l);\n const arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n for (let i = 0; i < l; i++) {\n if (i in arr2) {\n res[i] = f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);\n }\n }\n return res;\n };\nexports.map = map;\n\n\n/**\n * Passes every element of an array into a function and accumulates the result.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-reduce}\n * Note that this implementation differs from the native Array.prototype.reduce\n * in that the initial value is assumed to be defined (the MDN docs linked above\n * recommend not omitting this parameter, although it is technically optional).\n *\n * For example:\n * var a = [1, 2, 3, 4];\n * reduce(a, function(r, v, i, arr) {return r + v;}, 0);\n * returns 10\n *\n * @param {IArrayLike<T>|string} arr Array or array\n * like object over which to iterate.\n * @param {function(this:S, R, T, number, ?) : R} f The function to call for\n * every element. This function\n * takes 4 arguments (the function's previous result or the initial value,\n * the value of the current array element, the current array index, and the\n * array itself)\n * function(previousValue, currentValue, index, array).\n * @param {?} val The initial value to pass into the function on the first call.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n * within f.\n * @return {R} Result of evaluating f repeatedly across the values of the array.\n * @template T,S,R\n */\nconst reduce = goog.NATIVE_ARRAY_PROTOTYPES &&\n (ASSUME_NATIVE_FUNCTIONS || Array.prototype.reduce) ?\n function(arr, f, val, opt_obj) {\n asserts.assert(arr.length != null);\n if (opt_obj) {\n f = goog.bind(f, opt_obj);\n }\n return Array.prototype.reduce.call(arr, f, val);\n } :\n function(arr, f, val, opt_obj) {\n let rval = val;\n forEach(arr, function(val, index) {\n rval = f.call(/** @type {?} */ (opt_obj), rval, val, index, arr);\n });\n return rval;\n };\nexports.reduce = reduce;\n\n\n/**\n * Passes every element of an array into a function and accumulates the result,\n * starting from the last element and working towards the first.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-reduceright}\n *\n * For example:\n * var a = ['a', 'b', 'c'];\n * reduceRight(a, function(r, v, i, arr) {return r + v;}, '');\n * returns 'cba'\n *\n * @param {IArrayLike<T>|string} arr Array or array\n * like object over which to iterate.\n * @param {?function(this:S, R, T, number, ?) : R} f The function to call for\n * every element. This function\n * takes 4 arguments (the function's previous result or the initial value,\n * the value of the current array element, the current array index, and the\n * array itself)\n * function(previousValue, currentValue, index, array).\n * @param {?} val The initial value to pass into the function on the first call.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n * within f.\n * @return {R} Object returned as a result of evaluating f repeatedly across the\n * values of the array.\n * @template T,S,R\n */\nconst reduceRight = goog.NATIVE_ARRAY_PROTOTYPES &&\n (ASSUME_NATIVE_FUNCTIONS || Array.prototype.reduceRight) ?\n function(arr, f, val, opt_obj) {\n asserts.assert(arr.length != null);\n asserts.assert(f != null);\n if (opt_obj) {\n f = goog.bind(f, opt_obj);\n }\n return Array.prototype.reduceRight.call(arr, f, val);\n } :\n function(arr, f, val, opt_obj) {\n let rval = val;\n forEachRight(arr, function(val, index) {\n rval = f.call(/** @type {?} */ (opt_obj), rval, val, index, arr);\n });\n return rval;\n };\nexports.reduceRight = reduceRight;\n\n\n/**\n * Calls f for each element of an array. If any call returns true, some()\n * returns true (without checking the remaining elements). If all calls\n * return false, some() returns false.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-some}\n *\n * @param {IArrayLike<T>|string} arr Array or array\n * like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call for\n * for every element. This function takes 3 arguments (the element, the\n * index and the array) and should return a boolean.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n * within f.\n * @return {boolean} true if any element passes the test.\n * @template T,S\n */\nconst some = goog.NATIVE_ARRAY_PROTOTYPES &&\n (ASSUME_NATIVE_FUNCTIONS || Array.prototype.some) ?\n function(arr, f, opt_obj) {\n asserts.assert(arr.length != null);\n\n return Array.prototype.some.call(arr, f, opt_obj);\n } :\n function(arr, f, opt_obj) {\n const l = arr.length; // must be fixed during loop... see docs\n const arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n for (let i = 0; i < l; i++) {\n if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {\n return true;\n }\n }\n return false;\n };\nexports.some = some;\n\n\n/**\n * Call f for each element of an array. If all calls return true, every()\n * returns true. If any call returns false, every() returns false and\n * does not continue to check the remaining elements.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-every}\n *\n * @param {IArrayLike<T>|string} arr Array or array\n * like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call for\n * for every element. This function takes 3 arguments (the element, the\n * index and the array) and should return a boolean.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n * within f.\n * @return {boolean} false if any element fails the test.\n * @template T,S\n */\nconst every = goog.NATIVE_ARRAY_PROTOTYPES &&\n (ASSUME_NATIVE_FUNCTIONS || Array.prototype.every) ?\n function(arr, f, opt_obj) {\n asserts.assert(arr.length != null);\n\n return Array.prototype.every.call(arr, f, opt_obj);\n } :\n function(arr, f, opt_obj) {\n const l = arr.length; // must be fixed during loop... see docs\n const arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n for (let i = 0; i < l; i++) {\n if (i in arr2 && !f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {\n return false;\n }\n }\n return true;\n };\nexports.every = every;\n\n\n/**\n * Counts the array elements that fulfill the predicate, i.e. for which the\n * callback function returns true. Skips holes in the array.\n *\n * @param {!IArrayLike<T>|string} arr Array or array like object\n * over which to iterate.\n * @param {function(this: S, T, number, ?): boolean} f The function to call for\n * every element. Takes 3 arguments (the element, the index and the array).\n * @param {S=} opt_obj The object to be used as the value of 'this' within f.\n * @return {number} The number of the matching elements.\n * @template T,S\n */\nfunction count(arr, f, opt_obj) {\n let count = 0;\n forEach(arr, function(element, index, arr) {\n if (f.call(/** @type {?} */ (opt_obj), element, index, arr)) {\n ++count;\n }\n }, opt_obj);\n return count;\n}\nexports.count = count;\n\n\n/**\n * Search an array for the first element that satisfies a given condition and\n * return that element.\n * @param {IArrayLike<T>|string} arr Array or array\n * like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call\n * for every element. This function takes 3 arguments (the element, the\n * index and the array) and should return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {T|null} The first array element that passes the test, or null if no\n * element is found.\n * @template T,S\n */\nfunction find(arr, f, opt_obj) {\n const i = findIndex(arr, f, opt_obj);\n return i < 0 ? null : typeof arr === 'string' ? arr.charAt(i) : arr[i];\n}\nexports.find = find;\n\n\n/**\n * Search an array for the first element that satisfies a given condition and\n * return its index.\n * @param {IArrayLike<T>|string} arr Array or array\n * like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call for\n * every element. This function\n * takes 3 arguments (the element, the index and the array) and should\n * return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {number} The index of the first array element that passes the test,\n * or -1 if no element is found.\n * @template T,S\n */\nfunction findIndex(arr, f, opt_obj) {\n const l = arr.length; // must be fixed during loop... see docs\n const arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n for (let i = 0; i < l; i++) {\n if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {\n return i;\n }\n }\n return -1;\n}\nexports.findIndex = findIndex;\n\n\n/**\n * Search an array (in reverse order) for the last element that satisfies a\n * given condition and return that element.\n * @param {IArrayLike<T>|string} arr Array or array\n * like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call\n * for every element. This function\n * takes 3 arguments (the element, the index and the array) and should\n * return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {T|null} The last array element that passes the test, or null if no\n * element is found.\n * @template T,S\n */\nfunction findRight(arr, f, opt_obj) {\n const i = findIndexRight(arr, f, opt_obj);\n return i < 0 ? null : typeof arr === 'string' ? arr.charAt(i) : arr[i];\n}\nexports.findRight = findRight;\n\n\n/**\n * Search an array (in reverse order) for the last element that satisfies a\n * given condition and return its index.\n * @param {IArrayLike<T>|string} arr Array or array\n * like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call\n * for every element. This function\n * takes 3 arguments (the element, the index and the array) and should\n * return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {number} The index of the last array element that passes the test,\n * or -1 if no element is found.\n * @template T,S\n */\nfunction findIndexRight(arr, f, opt_obj) {\n const l = arr.length; // must be fixed during loop... see docs\n const arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n for (let i = l - 1; i >= 0; i--) {\n if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {\n return i;\n }\n }\n return -1;\n}\nexports.findIndexRight = findIndexRight;\n\n\n/**\n * Whether the array contains the given object.\n * @param {IArrayLike<?>|string} arr The array to test for the presence of the\n * element.\n * @param {*} obj The object for which to test.\n * @return {boolean} true if obj is present.\n */\nfunction contains(arr, obj) {\n return indexOf(arr, obj) >= 0;\n}\nexports.contains = contains;\n\n\n/**\n * Whether the array is empty.\n * @param {IArrayLike<?>|string} arr The array to test.\n * @return {boolean} true if empty.\n */\nfunction isEmpty(arr) {\n return arr.length == 0;\n}\nexports.isEmpty = isEmpty;\n\n\n/**\n * Clears the array.\n * @param {IArrayLike<?>} arr Array or array like object to clear.\n */\nfunction clear(arr) {\n // For non real arrays we don't have the magic length so we delete the\n // indices.\n if (!Array.isArray(arr)) {\n for (let i = arr.length - 1; i >= 0; i--) {\n delete arr[i];\n }\n }\n arr.length = 0;\n}\nexports.clear = clear;\n\n\n/**\n * Pushes an item into an array, if it's not already in the array.\n * @param {Array<T>} arr Array into which to insert the item.\n * @param {T} obj Value to add.\n * @template T\n */\nfunction insert(arr, obj) {\n if (!contains(arr, obj)) {\n arr.push(obj);\n }\n}\nexports.insert = insert;\n\n\n/**\n * Inserts an object at the given index of the array.\n * @param {IArrayLike<?>} arr The array to modify.\n * @param {*} obj The object to insert.\n * @param {number=} opt_i The index at which to insert the object. If omitted,\n * treated as 0. A negative index is counted from the end of the array.\n */\nfunction insertAt(arr, obj, opt_i) {\n splice(arr, opt_i, 0, obj);\n}\nexports.insertAt = insertAt;\n\n\n/**\n * Inserts at the given index of the array, all elements of another array.\n * @param {IArrayLike<?>} arr The array to modify.\n * @param {IArrayLike<?>} elementsToAdd The array of elements to add.\n * @param {number=} opt_i The index at which to insert the object. If omitted,\n * treated as 0. A negative index is counted from the end of the array.\n */\nfunction insertArrayAt(arr, elementsToAdd, opt_i) {\n goog.partial(splice, arr, opt_i, 0).apply(null, elementsToAdd);\n}\nexports.insertArrayAt = insertArrayAt;\n\n\n/**\n * Inserts an object into an array before a specified object.\n * @param {Array<T>} arr The array to modify.\n * @param {T} obj The object to insert.\n * @param {T=} opt_obj2 The object before which obj should be inserted. If obj2\n * is omitted or not found, obj is inserted at the end of the array.\n * @template T\n */\nfunction insertBefore(arr, obj, opt_obj2) {\n let i;\n if (arguments.length == 2 || (i = indexOf(arr, opt_obj2)) < 0) {\n arr.push(obj);\n } else {\n insertAt(arr, obj, i);\n }\n}\nexports.insertBefore = insertBefore;\n\n\n/**\n * Removes the first occurrence of a particular value from an array.\n * @param {IArrayLike<T>} arr Array from which to remove\n * value.\n * @param {T} obj Object to remove.\n * @return {boolean} True if an element was removed.\n * @template T\n */\nfunction remove(arr, obj) {\n const i = indexOf(arr, obj);\n let rv;\n if ((rv = i >= 0)) {\n removeAt(arr, i);\n }\n return rv;\n}\nexports.remove = remove;\n\n\n/**\n * Removes the last occurrence of a particular value from an array.\n * @param {!IArrayLike<T>} arr Array from which to remove value.\n * @param {T} obj Object to remove.\n * @return {boolean} True if an element was removed.\n * @template T\n */\nfunction removeLast(arr, obj) {\n const i = lastIndexOf(arr, obj);\n if (i >= 0) {\n removeAt(arr, i);\n return true;\n }\n return false;\n}\nexports.removeLast = removeLast;\n\n\n/**\n * Removes from an array the element at index i\n * @param {IArrayLike<?>} arr Array or array like object from which to\n * remove value.\n * @param {number} i The index to remove.\n * @return {boolean} True if an element was removed.\n */\nfunction removeAt(arr, i) {\n asserts.assert(arr.length != null);\n\n // use generic form of splice\n // splice returns the removed items and if successful the length of that\n // will be 1\n return Array.prototype.splice.call(arr, i, 1).length == 1;\n}\nexports.removeAt = removeAt;\n\n\n/**\n * Removes the first value that satisfies the given condition.\n * @param {IArrayLike<T>} arr Array or array\n * like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call\n * for every element. This function\n * takes 3 arguments (the element, the index and the array) and should\n * return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {boolean} True if an element was removed.\n * @template T,S\n */\nfunction removeIf(arr, f, opt_obj) {\n const i = findIndex(arr, f, opt_obj);\n if (i >= 0) {\n removeAt(arr, i);\n return true;\n }\n return false;\n}\nexports.removeIf = removeIf;\n\n\n/**\n * Removes all values that satisfy the given condition.\n * @param {IArrayLike<T>} arr Array or array\n * like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call\n * for every element. This function\n * takes 3 arguments (the element, the index and the array) and should\n * return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {number} The number of items removed\n * @template T,S\n */\nfunction removeAllIf(arr, f, opt_obj) {\n let removedCount = 0;\n forEachRight(arr, function(val, index) {\n if (f.call(/** @type {?} */ (opt_obj), val, index, arr)) {\n if (removeAt(arr, index)) {\n removedCount++;\n }\n }\n });\n return removedCount;\n}\nexports.removeAllIf = removeAllIf;\n\n\n/**\n * Returns a new array that is the result of joining the arguments. If arrays\n * are passed then their items are added, however, if non-arrays are passed they\n * will be added to the return array as is.\n *\n * Note that ArrayLike objects will be added as is, rather than having their\n * items added.\n *\n * concat([1, 2], [3, 4]) -> [1, 2, 3, 4]\n * concat(0, [1, 2]) -> [0, 1, 2]\n * concat([1, 2], null) -> [1, 2, null]\n *\n * There is bug in all current versions of IE (6, 7 and 8) where arrays created\n * in an iframe become corrupted soon (not immediately) after the iframe is\n * destroyed. This is common if loading data via goog.net.IframeIo, for example.\n * This corruption only affects the concat method which will start throwing\n * Catastrophic Errors (#-2147418113).\n *\n * See http://endoflow.com/scratch/corrupted-arrays.html for a test case.\n *\n * Internally goog.array should use this, so that all methods will continue to\n * work on these broken array objects.\n *\n * @param {...*} var_args Items to concatenate. Arrays will have each item\n * added, while primitives and objects will be added as is.\n * @return {!Array<?>} The new resultant array.\n */\nfunction concat(var_args) {\n return Array.prototype.concat.apply([], arguments);\n}\nexports.concat = concat;\n\n\n/**\n * Returns a new array that contains the contents of all the arrays passed.\n * @param {...!Array<T>} var_args\n * @return {!Array<T>}\n * @template T\n */\nfunction join(var_args) {\n return Array.prototype.concat.apply([], arguments);\n}\nexports.join = join;\n\n\n/**\n * Converts an object to an array.\n * @param {IArrayLike<T>|string} object The object to convert to an\n * array.\n * @return {!Array<T>} The object converted into an array. If object has a\n * length property, every property indexed with a non-negative number\n * less than length will be included in the result. If object does not\n * have a length property, an empty array will be returned.\n * @template T\n */\nfunction toArray(object) {\n const length = object.length;\n\n // If length is not a number the following is false. This case is kept for\n // backwards compatibility since there are callers that pass objects that are\n // not array like.\n if (length > 0) {\n const rv = new Array(length);\n for (let i = 0; i < length; i++) {\n rv[i] = object[i];\n }\n return rv;\n }\n return [];\n}\nexports.toArray = toArray;\n\n\n/**\n * Does a shallow copy of an array.\n * @param {IArrayLike<T>|string} arr Array or array-like object to\n * clone.\n * @return {!Array<T>} Clone of the input array.\n * @template T\n */\nconst clone = toArray;\nexports.clone = clone;\n\n\n/**\n * Extends an array with another array, element, or \"array like\" object.\n * This function operates 'in-place', it does not create a new Array.\n *\n * Example:\n * var a = [];\n * extend(a, [0, 1]);\n * a; // [0, 1]\n * extend(a, 2);\n * a; // [0, 1, 2]\n *\n * @param {Array<VALUE>} arr1 The array to modify.\n * @param {...(IArrayLike<VALUE>|VALUE)} var_args The elements or arrays of\n * elements to add to arr1.\n * @template VALUE\n */\nfunction extend(arr1, var_args) {\n for (let i = 1; i < arguments.length; i++) {\n const arr2 = arguments[i];\n if (goog.isArrayLike(arr2)) {\n const len1 = arr1.length || 0;\n const len2 = arr2.length || 0;\n arr1.length = len1 + len2;\n for (let j = 0; j < len2; j++) {\n arr1[len1 + j] = arr2[j];\n }\n } else {\n arr1.push(arr2);\n }\n }\n}\nexports.extend = extend;\n\n\n/**\n * Adds or removes elements from an array. This is a generic version of Array\n * splice. This means that it might work on other objects similar to arrays,\n * such as the arguments object.\n *\n * @param {IArrayLike<T>} arr The array to modify.\n * @param {number|undefined} index The index at which to start changing the\n * array. If not defined, treated as 0.\n * @param {number} howMany How many elements to remove (0 means no removal. A\n * value below 0 is treated as zero and so is any other non number. Numbers\n * are floored).\n * @param {...T} var_args Optional, additional elements to insert into the\n * array.\n * @return {!Array<T>} the removed elements.\n * @template T\n */\nfunction splice(arr, index, howMany, var_args) {\n asserts.assert(arr.length != null);\n\n return Array.prototype.splice.apply(arr, slice(arguments, 1));\n}\nexports.splice = splice;\n\n\n/**\n * Returns a new array from a segment of an array. This is a generic version of\n * Array slice. This means that it might work on other objects similar to\n * arrays, such as the arguments object.\n *\n * @param {IArrayLike<T>|string} arr The array from\n * which to copy a segment.\n * @param {number} start The index of the first element to copy.\n * @param {number=} opt_end The index after the last element to copy.\n * @return {!Array<T>} A new array containing the specified segment of the\n * original array.\n * @template T\n */\nfunction slice(arr, start, opt_end) {\n asserts.assert(arr.length != null);\n\n // passing 1 arg to slice is not the same as passing 2 where the second is\n // null or undefined (in that case the second argument is treated as 0).\n // we could use slice on the arguments object and then use apply instead of\n // testing the length\n if (arguments.length <= 2) {\n return Array.prototype.slice.call(arr, start);\n } else {\n return Array.prototype.slice.call(arr, start, opt_end);\n }\n}\nexports.slice = slice;\n\n\n/**\n * Removes all duplicates from an array (retaining only the first\n * occurrence of each array element). This function modifies the\n * array in place and doesn't change the order of the non-duplicate items.\n *\n * For objects, duplicates are identified as having the same unique ID as\n * defined by {@link goog.getUid}.\n *\n * Alternatively you can specify a custom hash function that returns a unique\n * value for each item in the array it should consider unique.\n *\n * Runtime: N,\n * Worstcase space: 2N (no dupes)\n *\n * @param {IArrayLike<T>} arr The array from which to remove\n * duplicates.\n * @param {Array=} opt_rv An optional array in which to return the results,\n * instead of performing the removal inplace. If specified, the original\n * array will remain unchanged.\n * @param {function(T):string=} opt_hashFn An optional function to use to\n * apply to every item in the array. This function should return a unique\n * value for each item in the array it should consider unique.\n * @template T\n */\nfunction removeDuplicates(arr, opt_rv, opt_hashFn) {\n const returnArray = opt_rv || arr;\n const defaultHashFn = function(item) {\n // Prefix each type with a single character representing the type to\n // prevent conflicting keys (e.g. true and 'true').\n return goog.isObject(item) ? 'o' + goog.getUid(item) :\n (typeof item).charAt(0) + item;\n };\n const hashFn = opt_hashFn || defaultHashFn;\n\n let cursorInsert = 0;\n let cursorRead = 0;\n const seen = {};\n\n while (cursorRead < arr.length) {\n const current = arr[cursorRead++];\n const key = hashFn(current);\n if (!Object.prototype.hasOwnProperty.call(seen, key)) {\n seen[key] = true;\n returnArray[cursorInsert++] = current;\n }\n }\n returnArray.length = cursorInsert;\n}\nexports.removeDuplicates = removeDuplicates;\n\n\n/**\n * Searches the specified array for the specified target using the binary\n * search algorithm. If no opt_compareFn is specified, elements are compared\n * using <code>defaultCompare</code>, which compares the elements\n * using the built in < and > operators. This will produce the expected\n * behavior for homogeneous arrays of String(s) and Number(s). The array\n * specified <b>must</b> be sorted in ascending order (as defined by the\n * comparison function). If the array is not sorted, results are undefined.\n * If the array contains multiple instances of the specified target value, the\n * left-most instance will be found.\n *\n * Runtime: O(log n)\n *\n * @param {IArrayLike<VALUE>} arr The array to be searched.\n * @param {TARGET} target The sought value.\n * @param {function(TARGET, VALUE): number=} opt_compareFn Optional comparison\n * function by which the array is ordered. Should take 2 arguments to\n * compare, the target value and an element from your array, and return a\n * negative number, zero, or a positive number depending on whether the\n * first argument is less than, equal to, or greater than the second.\n * @return {number} Lowest index of the target value if found, otherwise\n * (-(insertion point) - 1). The insertion point is where the value should\n * be inserted into arr to preserve the sorted property. Return value >= 0\n * iff target is found.\n * @template TARGET, VALUE\n */\nfunction binarySearch(arr, target, opt_compareFn) {\n return binarySearch_(\n arr, opt_compareFn || defaultCompare, false /* isEvaluator */, target);\n}\nexports.binarySearch = binarySearch;\n\n\n/**\n * Selects an index in the specified array using the binary search algorithm.\n * The evaluator receives an element and determines whether the desired index\n * is before, at, or after it. The evaluator must be consistent (formally,\n * map(map(arr, evaluator, opt_obj), goog.math.sign)\n * must be monotonically non-increasing).\n *\n * Runtime: O(log n)\n *\n * @param {IArrayLike<VALUE>} arr The array to be searched.\n * @param {function(this:THIS, VALUE, number, ?): number} evaluator\n * Evaluator function that receives 3 arguments (the element, the index and\n * the array). Should return a negative number, zero, or a positive number\n * depending on whether the desired index is before, at, or after the\n * element passed to it.\n * @param {THIS=} opt_obj The object to be used as the value of 'this'\n * within evaluator.\n * @return {number} Index of the leftmost element matched by the evaluator, if\n * such exists; otherwise (-(insertion point) - 1). The insertion point is\n * the index of the first element for which the evaluator returns negative,\n * or arr.length if no such element exists. The return value is non-negative\n * iff a match is found.\n * @template THIS, VALUE\n */\nfunction binarySelect(arr, evaluator, opt_obj) {\n return binarySearch_(\n arr, evaluator, true /* isEvaluator */, undefined /* opt_target */,\n opt_obj);\n}\nexports.binarySelect = binarySelect;\n\n\n/**\n * Implementation of a binary search algorithm which knows how to use both\n * comparison functions and evaluators. If an evaluator is provided, will call\n * the evaluator with the given optional data object, conforming to the\n * interface defined in binarySelect. Otherwise, if a comparison function is\n * provided, will call the comparison function against the given data object.\n *\n * This implementation purposefully does not use goog.bind or goog.partial for\n * performance reasons.\n *\n * Runtime: O(log n)\n *\n * @param {IArrayLike<?>} arr The array to be searched.\n * @param {function(?, ?, ?): number | function(?, ?): number} compareFn\n * Either an evaluator or a comparison function, as defined by binarySearch\n * and binarySelect above.\n * @param {boolean} isEvaluator Whether the function is an evaluator or a\n * comparison function.\n * @param {?=} opt_target If the function is a comparison function, then\n * this is the target to binary search for.\n * @param {Object=} opt_selfObj If the function is an evaluator, this is an\n * optional this object for the evaluator.\n * @return {number} Lowest index of the target value if found, otherwise\n * (-(insertion point) - 1). The insertion point is where the value should\n * be inserted into arr to preserve the sorted property. Return value >= 0\n * iff target is found.\n * @private\n */\nfunction binarySearch_(arr, compareFn, isEvaluator, opt_target, opt_selfObj) {\n let left = 0; // inclusive\n let right = arr.length; // exclusive\n let found;\n while (left < right) {\n const middle = left + ((right - left) >>> 1);\n let compareResult;\n if (isEvaluator) {\n compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr);\n } else {\n // NOTE(dimvar): To avoid this cast, we'd have to use function overloading\n // for the type of binarySearch_, which the type system can't express yet.\n compareResult = /** @type {function(?, ?): number} */ (compareFn)(\n opt_target, arr[middle]);\n }\n if (compareResult > 0) {\n left = middle + 1;\n } else {\n right = middle;\n // We are looking for the lowest index so we can't return immediately.\n found = !compareResult;\n }\n }\n // left is the index if found, or the insertion point otherwise.\n // Avoiding bitwise not operator, as that causes a loss in precision for array\n // indexes outside the bounds of a 32-bit signed integer. Array indexes have\n // a maximum value of 2^32-2 https://tc39.es/ecma262/#array-index\n return found ? left : -left - 1;\n}\n\n\n/**\n * Sorts the specified array into ascending order. If no opt_compareFn is\n * specified, elements are compared using\n * <code>defaultCompare</code>, which compares the elements using\n * the built in < and > operators. This will produce the expected behavior\n * for homogeneous arrays of String(s) and Number(s), unlike the native sort,\n * but will give unpredictable results for heterogeneous lists of strings and\n * numbers with different numbers of digits.\n *\n * This sort is not guaranteed to be stable.\n *\n * Runtime: Same as `Array.prototype.sort`\n *\n * @param {Array<T>} arr The array to be sorted.\n * @param {?function(T,T):number=} opt_compareFn Optional comparison\n * function by which the\n * array is to be ordered. Should take 2 arguments to compare, and return a\n * negative number, zero, or a positive number depending on whether the\n * first argument is less than, equal to, or greater than the second.\n * @template T\n */\nfunction sort(arr, opt_compareFn) {\n // TODO(arv): Update type annotation since null is not accepted.\n arr.sort(opt_compareFn || defaultCompare);\n}\nexports.sort = sort;\n\n\n/**\n * Sorts the specified array into ascending order in a stable way. If no\n * opt_compareFn is specified, elements are compared using\n * <code>defaultCompare</code>, which compares the elements using\n * the built in < and > operators. This will produce the expected behavior\n * for homogeneous arrays of String(s) and Number(s).\n *\n * Runtime: Same as `Array.prototype.sort`, plus an additional\n * O(n) overhead of copying the array twice.\n *\n * @param {Array<T>} arr The array to be sorted.\n * @param {?function(T, T): number=} opt_compareFn Optional comparison function\n * by which the array is to be ordered. Should take 2 arguments to compare,\n * and return a negative number, zero, or a positive number depending on\n * whether the first argument is less than, equal to, or greater than the\n * second.\n * @template T\n */\nfunction stableSort(arr, opt_compareFn) {\n const compArr = new Array(arr.length);\n for (let i = 0; i < arr.length; i++) {\n compArr[i] = {index: i, value: arr[i]};\n }\n const valueCompareFn = opt_compareFn || defaultCompare;\n function stableCompareFn(obj1, obj2) {\n return valueCompareFn(obj1.value, obj2.value) || obj1.index - obj2.index;\n }\n sort(compArr, stableCompareFn);\n for (let i = 0; i < arr.length; i++) {\n arr[i] = compArr[i].value;\n }\n}\nexports.stableSort = stableSort;\n\n\n/**\n * Sort the specified array into ascending order based on item keys\n * returned by the specified key function.\n * If no opt_compareFn is specified, the keys are compared in ascending order\n * using <code>defaultCompare</code>.\n *\n * Runtime: O(S(f(n)), where S is runtime of <code>sort</code>\n * and f(n) is runtime of the key function.\n *\n * @param {Array<T>} arr The array to be sorted.\n * @param {function(T): K} keyFn Function taking array element and returning\n * a key used for sorting this element.\n * @param {?function(K, K): number=} opt_compareFn Optional comparison function\n * by which the keys are to be ordered. Should take 2 arguments to compare,\n * and return a negative number, zero, or a positive number depending on\n * whether the first argument is less than, equal to, or greater than the\n * second.\n * @template T,K\n */\nfunction sortByKey(arr, keyFn, opt_compareFn) {\n const keyCompareFn = opt_compareFn || defaultCompare;\n sort(arr, function(a, b) {\n return keyCompareFn(keyFn(a), keyFn(b));\n });\n}\nexports.sortByKey = sortByKey;\n\n\n/**\n * Sorts an array of objects by the specified object key and compare\n * function. If no compare function is provided, the key values are\n * compared in ascending order using <code>defaultCompare</code>.\n * This won't work for keys that get renamed by the compiler. So use\n * {'foo': 1, 'bar': 2} rather than {foo: 1, bar: 2}.\n * @param {Array<Object>} arr An array of objects to sort.\n * @param {string} key The object key to sort by.\n * @param {Function=} opt_compareFn The function to use to compare key\n * values.\n */\nfunction sortObjectsByKey(arr, key, opt_compareFn) {\n sortByKey(arr, function(obj) {\n return obj[key];\n }, opt_compareFn);\n}\nexports.sortObjectsByKey = sortObjectsByKey;\n\n\n/**\n * Tells if the array is sorted.\n * @param {!IArrayLike<T>} arr The array.\n * @param {?function(T,T):number=} opt_compareFn Function to compare the\n * array elements.\n * Should take 2 arguments to compare, and return a negative number, zero,\n * or a positive number depending on whether the first argument is less\n * than, equal to, or greater than the second.\n * @param {boolean=} opt_strict If true no equal elements are allowed.\n * @return {boolean} Whether the array is sorted.\n * @template T\n */\nfunction isSorted(arr, opt_compareFn, opt_strict) {\n const compare = opt_compareFn || defaultCompare;\n for (let i = 1; i < arr.length; i++) {\n const compareResult = compare(arr[i - 1], arr[i]);\n if (compareResult > 0 || compareResult == 0 && opt_strict) {\n return false;\n }\n }\n return true;\n}\nexports.isSorted = isSorted;\n\n\n/**\n * Compares two arrays for equality. Two arrays are considered equal if they\n * have the same length and their corresponding elements are equal according to\n * the comparison function.\n *\n * @param {IArrayLike<A>} arr1 The first array to compare.\n * @param {IArrayLike<B>} arr2 The second array to compare.\n * @param {?function(A,B):boolean=} opt_equalsFn Optional comparison function.\n * Should take 2 arguments to compare, and return true if the arguments\n * are equal. Defaults to {@link goog.array.defaultCompareEquality} which\n * compares the elements using the built-in '===' operator.\n * @return {boolean} Whether the two arrays are equal.\n * @template A\n * @template B\n */\nfunction equals(arr1, arr2, opt_equalsFn) {\n if (!goog.isArrayLike(arr1) || !goog.isArrayLike(arr2) ||\n arr1.length != arr2.length) {\n return false;\n }\n const l = arr1.length;\n const equalsFn = opt_equalsFn || defaultCompareEquality;\n for (let i = 0; i < l; i++) {\n if (!equalsFn(arr1[i], arr2[i])) {\n return false;\n }\n }\n return true;\n}\nexports.equals = equals;\n\n\n/**\n * 3-way array compare function.\n * @param {!IArrayLike<VALUE>} arr1 The first array to\n * compare.\n * @param {!IArrayLike<VALUE>} arr2 The second array to\n * compare.\n * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison\n * function by which the array is to be ordered. Should take 2 arguments to\n * compare, and return a negative number, zero, or a positive number\n * depending on whether the first argument is less than, equal to, or\n * greater than the second.\n * @return {number} Negative number, zero, or a positive number depending on\n * whether the first argument is less than, equal to, or greater than the\n * second.\n * @template VALUE\n */\nfunction compare3(arr1, arr2, opt_compareFn) {\n const compare = opt_compareFn || defaultCompare;\n const l = Math.min(arr1.length, arr2.length);\n for (let i = 0; i < l; i++) {\n const result = compare(arr1[i], arr2[i]);\n if (result != 0) {\n return result;\n }\n }\n return defaultCompare(arr1.length, arr2.length);\n}\nexports.compare3 = compare3;\n\n\n/**\n * Compares its two arguments for order, using the built in < and >\n * operators.\n * @param {VALUE} a The first object to be compared.\n * @param {VALUE} b The second object to be compared.\n * @return {number} A negative number, zero, or a positive number as the first\n * argument is less than, equal to, or greater than the second,\n * respectively.\n * @template VALUE\n */\nfunction defaultCompare(a, b) {\n return a > b ? 1 : a < b ? -1 : 0;\n}\nexports.defaultCompare = defaultCompare;\n\n\n/**\n * Compares its two arguments for inverse order, using the built in < and >\n * operators.\n * @param {VALUE} a The first object to be compared.\n * @param {VALUE} b The second object to be compared.\n * @return {number} A negative number, zero, or a positive number as the first\n * argument is greater than, equal to, or less than the second,\n * respectively.\n * @template VALUE\n */\nfunction inverseDefaultCompare(a, b) {\n return -defaultCompare(a, b);\n}\nexports.inverseDefaultCompare = inverseDefaultCompare;\n\n\n/**\n * Compares its two arguments for equality, using the built in === operator.\n * @param {*} a The first object to compare.\n * @param {*} b The second object to compare.\n * @return {boolean} True if the two arguments are equal, false otherwise.\n */\nfunction defaultCompareEquality(a, b) {\n return a === b;\n}\nexports.defaultCompareEquality = defaultCompareEquality;\n\n\n/**\n * Inserts a value into a sorted array. The array is not modified if the\n * value is already present.\n * @param {IArrayLike<VALUE>} array The array to modify.\n * @param {VALUE} value The object to insert.\n * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison\n * function by which the array is ordered. Should take 2 arguments to\n * compare, and return a negative number, zero, or a positive number\n * depending on whether the first argument is less than, equal to, or\n * greater than the second.\n * @return {boolean} True if an element was inserted.\n * @template VALUE\n */\nfunction binaryInsert(array, value, opt_compareFn) {\n const index = binarySearch(array, value, opt_compareFn);\n if (index < 0) {\n insertAt(array, value, -(index + 1));\n return true;\n }\n return false;\n}\nexports.binaryInsert = binaryInsert;\n\n\n/**\n * Removes a value from a sorted array.\n * @param {!IArrayLike<VALUE>} array The array to modify.\n * @param {VALUE} value The object to remove.\n * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison\n * function by which the array is ordered. Should take 2 arguments to\n * compare, and return a negative number, zero, or a positive number\n * depending on whether the first argument is less than, equal to, or\n * greater than the second.\n * @return {boolean} True if an element was removed.\n * @template VALUE\n */\nfunction binaryRemove(array, value, opt_compareFn) {\n const index = binarySearch(array, value, opt_compareFn);\n return (index >= 0) ? removeAt(array, index) : false;\n}\nexports.binaryRemove = binaryRemove;\n\n\n/**\n * Splits an array into disjoint buckets according to a splitting function.\n * @param {IArrayLike<T>} array The array.\n * @param {function(this:S, T, number, !IArrayLike<T>):?} sorter Function to\n * call for every element. This takes 3 arguments (the element, the index\n * and the array) and must return a valid object key (a string, number,\n * etc), or undefined, if that object should not be placed in a bucket.\n * @param {S=} opt_obj The object to be used as the value of 'this' within\n * sorter.\n * @return {!Object<!Array<T>>} An object, with keys being all of the unique\n * return values of sorter, and values being arrays containing the items for\n * which the splitter returned that key.\n * @template T,S\n */\nfunction bucket(array, sorter, opt_obj) {\n const buckets = {};\n\n for (let i = 0; i < array.length; i++) {\n const value = array[i];\n const key = sorter.call(/** @type {?} */ (opt_obj), value, i, array);\n if (key !== undefined) {\n // Push the value to the right bucket, creating it if necessary.\n const bucket = buckets[key] || (buckets[key] = []);\n bucket.push(value);\n }\n }\n\n return buckets;\n}\nexports.bucket = bucket;\n\n\n/**\n * Creates a new object built from the provided array and the key-generation\n * function.\n * @param {IArrayLike<T>} arr Array or array like object over\n * which to iterate whose elements will be the values in the new object.\n * @param {?function(this:S, T, number, ?) : string} keyFunc The function to\n * call for every element. This function takes 3 arguments (the element, the\n * index and the array) and should return a string that will be used as the\n * key for the element in the new object. If the function returns the same\n * key for more than one element, the value for that key is\n * implementation-defined.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n * within keyFunc.\n * @return {!Object<T>} The new object.\n * @template T,S\n */\nfunction toObject(arr, keyFunc, opt_obj) {\n const ret = {};\n forEach(arr, function(element, index) {\n ret[keyFunc.call(/** @type {?} */ (opt_obj), element, index, arr)] =\n element;\n });\n return ret;\n}\nexports.toObject = toObject;\n\n\n/**\n * Creates a range of numbers in an arithmetic progression.\n *\n * Range takes 1, 2, or 3 arguments:\n * <pre>\n * range(5) is the same as range(0, 5, 1) and produces [0, 1, 2, 3, 4]\n * range(2, 5) is the same as range(2, 5, 1) and produces [2, 3, 4]\n * range(-2, -5, -1) produces [-2, -3, -4]\n * range(-2, -5, 1) produces [], since stepping by 1 wouldn't ever reach -5.\n * </pre>\n *\n * @param {number} startOrEnd The starting value of the range if an end argument\n * is provided. Otherwise, the start value is 0, and this is the end value.\n * @param {number=} opt_end The optional end value of the range.\n * @param {number=} opt_step The step size between range values. Defaults to 1\n * if opt_step is undefined or 0.\n * @return {!Array<number>} An array of numbers for the requested range. May be\n * an empty array if adding the step would not converge toward the end\n * value.\n */\nfunction range(startOrEnd, opt_end, opt_step) {\n const array = [];\n let start = 0;\n let end = startOrEnd;\n const step = opt_step || 1;\n if (opt_end !== undefined) {\n start = startOrEnd;\n end = opt_end;\n }\n\n if (step * (end - start) < 0) {\n // Sign mismatch: start + step will never reach the end value.\n return [];\n }\n\n if (step > 0) {\n for (let i = start; i < end; i += step) {\n array.push(i);\n }\n } else {\n for (let i = start; i > end; i += step) {\n array.push(i);\n }\n }\n return array;\n}\nexports.range = range;\n\n\n/**\n * Returns an array consisting of the given value repeated N times.\n *\n * @param {VALUE} value The value to repeat.\n * @param {number} n The repeat count.\n * @return {!Array<VALUE>} An array with the repeated value.\n * @template VALUE\n */\nfunction repeat(value, n) {\n const array = [];\n for (let i = 0; i < n; i++) {\n array[i] = value;\n }\n return array;\n}\nexports.repeat = repeat;\n\n\n/**\n * Returns an array consisting of every argument with all arrays\n * expanded in-place recursively.\n *\n * @param {...*} var_args The values to flatten.\n * @return {!Array<?>} An array containing the flattened values.\n */\nfunction flatten(var_args) {\n const CHUNK_SIZE = 8192;\n\n const result = [];\n for (let i = 0; i < arguments.length; i++) {\n const element = arguments[i];\n if (Array.isArray(element)) {\n for (let c = 0; c < element.length; c += CHUNK_SIZE) {\n const chunk = slice(element, c, c + CHUNK_SIZE);\n const recurseResult = flatten.apply(null, chunk);\n for (let r = 0; r < recurseResult.length; r++) {\n result.push(recurseResult[r]);\n }\n }\n } else {\n result.push(element);\n }\n }\n return result;\n}\nexports.flatten = flatten;\n\n\n/**\n * Rotates an array in-place. After calling this method, the element at\n * index i will be the element previously at index (i - n) %\n * array.length, for all values of i between 0 and array.length - 1,\n * inclusive.\n *\n * For example, suppose list comprises [t, a, n, k, s]. After invoking\n * rotate(array, 1) (or rotate(array, -4)), array will comprise [s, t, a, n, k].\n *\n * @param {!Array<T>} array The array to rotate.\n * @param {number} n The amount to rotate.\n * @return {!Array<T>} The array.\n * @template T\n */\nfunction rotate(array, n) {\n asserts.assert(array.length != null);\n\n if (array.length) {\n n %= array.length;\n if (n > 0) {\n Array.prototype.unshift.apply(array, array.splice(-n, n));\n } else if (n < 0) {\n Array.prototype.push.apply(array, array.splice(0, -n));\n }\n }\n return array;\n}\nexports.rotate = rotate;\n\n\n/**\n * Moves one item of an array to a new position keeping the order of the rest\n * of the items. Example use case: keeping a list of JavaScript objects\n * synchronized with the corresponding list of DOM elements after one of the\n * elements has been dragged to a new position.\n * @param {!IArrayLike<?>} arr The array to modify.\n * @param {number} fromIndex Index of the item to move between 0 and\n * `arr.length - 1`.\n * @param {number} toIndex Target index between 0 and `arr.length - 1`.\n */\nfunction moveItem(arr, fromIndex, toIndex) {\n asserts.assert(fromIndex >= 0 && fromIndex < arr.length);\n asserts.assert(toIndex >= 0 && toIndex < arr.length);\n // Remove 1 item at fromIndex.\n const removedItems = Array.prototype.splice.call(arr, fromIndex, 1);\n // Insert the removed item at toIndex.\n Array.prototype.splice.call(arr, toIndex, 0, removedItems[0]);\n // We don't use goog.array.insertAt and goog.array.removeAt, because they're\n // significantly slower than splice.\n}\nexports.moveItem = moveItem;\n\n\n/**\n * Creates a new array for which the element at position i is an array of the\n * ith element of the provided arrays. The returned array will only be as long\n * as the shortest array provided; additional values are ignored. For example,\n * the result of zipping [1, 2] and [3, 4, 5] is [[1,3], [2, 4]].\n *\n * This is similar to the zip() function in Python. See {@link\n * http://docs.python.org/library/functions.html#zip}\n *\n * @param {...!IArrayLike<?>} var_args Arrays to be combined.\n * @return {!Array<!Array<?>>} A new array of arrays created from\n * provided arrays.\n */\nfunction zip(var_args) {\n if (!arguments.length) {\n return [];\n }\n const result = [];\n let minLen = arguments[0].length;\n for (let i = 1; i < arguments.length; i++) {\n if (arguments[i].length < minLen) {\n minLen = arguments[i].length;\n }\n }\n for (let i = 0; i < minLen; i++) {\n const value = [];\n for (let j = 0; j < arguments.length; j++) {\n value.push(arguments[j][i]);\n }\n result.push(value);\n }\n return result;\n}\nexports.zip = zip;\n\n\n/**\n * Shuffles the values in the specified array using the Fisher-Yates in-place\n * shuffle (also known as the Knuth Shuffle). By default, calls Math.random()\n * and so resets the state of that random number generator. Similarly, may reset\n * the state of any other specified random number generator.\n *\n * Runtime: O(n)\n *\n * @param {!Array<?>} arr The array to be shuffled.\n * @param {function():number=} opt_randFn Optional random function to use for\n * shuffling.\n * Takes no arguments, and returns a random number on the interval [0, 1).\n * Defaults to Math.random() using JavaScript's built-in Math library.\n */\nfunction shuffle(arr, opt_randFn) {\n const randFn = opt_randFn || Math.random;\n\n for (let i = arr.length - 1; i > 0; i--) {\n // Choose a random array index in [0, i] (inclusive with i).\n const j = Math.floor(randFn() * (i + 1));\n\n const tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n }\n}\nexports.shuffle = shuffle;\n\n\n/**\n * Returns a new array of elements from arr, based on the indexes of elements\n * provided by index_arr. For example, the result of index copying\n * ['a', 'b', 'c'] with index_arr [1,0,0,2] is ['b', 'a', 'a', 'c'].\n *\n * @param {!IArrayLike<T>} arr The array to get a indexed copy from.\n * @param {!IArrayLike<number>} index_arr An array of indexes to get from arr.\n * @return {!Array<T>} A new array of elements from arr in index_arr order.\n * @template T\n */\nfunction copyByIndex(arr, index_arr) {\n const result = [];\n forEach(index_arr, function(index) {\n result.push(arr[index]);\n });\n return result;\n}\nexports.copyByIndex = copyByIndex;\n\n\n/**\n * Maps each element of the input array into zero or more elements of the output\n * array.\n *\n * @param {!IArrayLike<VALUE>|string} arr Array or array like object\n * over which to iterate.\n * @param {function(this:THIS, VALUE, number, ?): !Array<RESULT>} f The function\n * to call for every element. This function takes 3 arguments (the element,\n * the index and the array) and should return an array. The result will be\n * used to extend a new array.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within f.\n * @return {!Array<RESULT>} a new array with the concatenation of all arrays\n * returned from f.\n * @template THIS, VALUE, RESULT\n */\nfunction concatMap(arr, f, opt_obj) {\n return concat.apply([], map(arr, f, opt_obj));\n}\nexports.concatMap = concatMap;\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Wrapper class for handling XmlHttpRequests.\n *\n * One off requests can be sent through goog.net.XhrIo.send() or an\n * instance can be created to send multiple requests. Each request uses its\n * own XmlHttpRequest object and handles clearing of the event callback to\n * ensure no leaks.\n *\n * XhrIo is event based, it dispatches events on success, failure, finishing,\n * ready-state change, or progress (download and upload).\n *\n * The ready-state or timeout event fires first, followed by\n * a generic completed event. Then the abort, error, or success event\n * is fired as appropriate. Progress events are fired as they are\n * received. Lastly, the ready event will fire to indicate that the\n * object may be used to make another request.\n *\n * The error event may also be called before completed and\n * ready-state-change if the XmlHttpRequest.open() or .send() methods throw.\n *\n * This class does not support multiple requests, queuing, or prioritization.\n *\n * When progress events are supported by the browser, and progress is\n * enabled via .setProgressEventsEnabled(true), the\n * goog.net.EventType.PROGRESS event will be the re-dispatched browser\n * progress event. Additionally, a DOWNLOAD_PROGRESS or UPLOAD_PROGRESS event\n * will be fired for download and upload progress respectively.\n */\n\n\ngoog.provide('goog.net.XhrIo');\ngoog.provide('goog.net.XhrIo.ResponseType');\n\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.entryPointRegistry');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.json.hybrid');\ngoog.require('goog.log');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.HttpStatus');\ngoog.require('goog.net.XmlHttp');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.structs');\ngoog.require('goog.structs.Map');\ngoog.require('goog.uri.utils');\ngoog.require('goog.userAgent');\ngoog.requireType('goog.Uri');\ngoog.requireType('goog.debug.ErrorHandler');\ngoog.requireType('goog.net.XhrLike');\ngoog.requireType('goog.net.XmlHttpFactory');\n\ngoog.scope(function() {\n\n'use strict';\n/**\n * Basic class for handling XMLHttpRequests.\n * @param {goog.net.XmlHttpFactory=} opt_xmlHttpFactory Factory to use when\n * creating XMLHttpRequest objects.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.net.XhrIo = function(opt_xmlHttpFactory) {\n 'use strict';\n XhrIo.base(this, 'constructor');\n\n /**\n * Map of default headers to add to every request, use:\n * XhrIo.headers.set(name, value)\n * @type {!goog.structs.Map}\n */\n this.headers = new goog.structs.Map();\n\n /**\n * Optional XmlHttpFactory\n * @private {goog.net.XmlHttpFactory}\n */\n this.xmlHttpFactory_ = opt_xmlHttpFactory || null;\n\n /**\n * Whether XMLHttpRequest is active. A request is active from the time send()\n * is called until onReadyStateChange() is complete, or error() or abort()\n * is called.\n * @private {boolean}\n */\n this.active_ = false;\n\n /**\n * The XMLHttpRequest object that is being used for the transfer.\n * @private {?goog.net.XhrLike.OrNative}\n */\n this.xhr_ = null;\n\n /**\n * The options to use with the current XMLHttpRequest object.\n * @private {?Object}\n */\n this.xhrOptions_ = null;\n\n /**\n * Last URL that was requested.\n * @private {string|goog.Uri}\n */\n this.lastUri_ = '';\n\n /**\n * Method for the last request.\n * @private {string}\n */\n this.lastMethod_ = '';\n\n /**\n * Last error code.\n * @private {!goog.net.ErrorCode}\n */\n this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n\n /**\n * Last error message.\n * @private {Error|string}\n */\n this.lastError_ = '';\n\n /**\n * Used to ensure that we don't dispatch an multiple ERROR events. This can\n * happen in IE when it does a synchronous load and one error is handled in\n * the ready state change and one is handled due to send() throwing an\n * exception.\n * @private {boolean}\n */\n this.errorDispatched_ = false;\n\n /**\n * Used to make sure we don't fire the complete event from inside a send call.\n * @private {boolean}\n */\n this.inSend_ = false;\n\n /**\n * Used in determining if a call to {@link #onReadyStateChange_} is from\n * within a call to this.xhr_.open.\n * @private {boolean}\n */\n this.inOpen_ = false;\n\n /**\n * Used in determining if a call to {@link #onReadyStateChange_} is from\n * within a call to this.xhr_.abort.\n * @private {boolean}\n */\n this.inAbort_ = false;\n\n /**\n * Number of milliseconds after which an incomplete request will be aborted\n * and a {@link goog.net.EventType.TIMEOUT} event raised; 0 means no timeout\n * is set.\n * @private {number}\n */\n this.timeoutInterval_ = 0;\n\n /**\n * Timer to track request timeout.\n * @private {?number}\n */\n this.timeoutId_ = null;\n\n /**\n * The requested type for the response. The empty string means use the default\n * XHR behavior.\n * @private {goog.net.XhrIo.ResponseType}\n */\n this.responseType_ = ResponseType.DEFAULT;\n\n /**\n * Whether a \"credentialed\" request is to be sent (one that is aware of\n * cookies and authentication). This is applicable only for cross-domain\n * requests and more recent browsers that support this part of the HTTP Access\n * Control standard.\n *\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-withcredentials-attribute\n *\n * @private {boolean}\n */\n this.withCredentials_ = false;\n\n /**\n * Whether progress events are enabled for this request. This is\n * disabled by default because setting a progress event handler\n * causes pre-flight OPTIONS requests to be sent for CORS requests,\n * even in cases where a pre-flight request would not otherwise be\n * sent.\n *\n * @see http://xhr.spec.whatwg.org/#security-considerations\n *\n * Note that this can cause problems for Firefox 22 and below, as an\n * older \"LSProgressEvent\" will be dispatched by the browser. That\n * progress event is no longer supported, and can lead to failures,\n * including throwing exceptions.\n *\n * @see http://bugzilla.mozilla.org/show_bug.cgi?id=845631\n * @see b/23469793\n *\n * @private {boolean}\n */\n this.progressEventsEnabled_ = false;\n\n /**\n * True if we can use XMLHttpRequest's timeout directly.\n * @private {boolean}\n */\n this.useXhr2Timeout_ = false;\n\n /**\n * Specification for Trust Token operations (issuance, signing, and\n * redemption).\n * @private {?TrustTokenAttributeType}\n */\n this.trustToken_ = null;\n};\ngoog.inherits(goog.net.XhrIo, goog.events.EventTarget);\n\nconst XhrIo = goog.net.XhrIo;\n\n/**\n * Response types that may be requested for XMLHttpRequests.\n * @enum {string}\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute\n */\ngoog.net.XhrIo.ResponseType = {\n DEFAULT: '',\n TEXT: 'text',\n DOCUMENT: 'document',\n // Not supported as of Chrome 10.0.612.1 dev\n BLOB: 'blob',\n ARRAY_BUFFER: 'arraybuffer',\n};\n\nconst ResponseType = goog.net.XhrIo.ResponseType;\n\n\n/**\n * A reference to the XhrIo logger\n * @private {?goog.log.Logger}\n * @const\n */\ngoog.net.XhrIo.prototype.logger_ = goog.log.getLogger('goog.net.XhrIo');\n\n\n/**\n * The Content-Type HTTP header name\n * @type {string}\n */\ngoog.net.XhrIo.CONTENT_TYPE_HEADER = 'Content-Type';\n\n\n/**\n * The Content-Transfer-Encoding HTTP header name\n * @type {string}\n */\ngoog.net.XhrIo.CONTENT_TRANSFER_ENCODING = 'Content-Transfer-Encoding';\n\n\n/**\n * The pattern matching the 'http' and 'https' URI schemes\n * @type {!RegExp}\n */\ngoog.net.XhrIo.HTTP_SCHEME_PATTERN = /^https?$/i;\n\nconst HTTP_SCHEME_PATTERN = goog.net.XhrIo.HTTP_SCHEME_PATTERN;\n\n\n/**\n * The methods that typically come along with form data. We set different\n * headers depending on whether the HTTP action is one of these.\n * @type {!Array<string>}\n */\ngoog.net.XhrIo.METHODS_WITH_FORM_DATA = ['POST', 'PUT'];\n\n\n/**\n * The Content-Type HTTP header value for a url-encoded form\n * @type {string}\n */\ngoog.net.XhrIo.FORM_CONTENT_TYPE =\n 'application/x-www-form-urlencoded;charset=utf-8';\n\n\n/**\n * The XMLHttpRequest Level two timeout delay ms property name.\n *\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute\n *\n * @private {string}\n * @const\n */\ngoog.net.XhrIo.XHR2_TIMEOUT_ = 'timeout';\n\n\n/**\n * The XMLHttpRequest Level two ontimeout handler property name.\n *\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute\n *\n * @private {string}\n * @const\n */\ngoog.net.XhrIo.XHR2_ON_TIMEOUT_ = 'ontimeout';\n\n\n/**\n * All non-disposed instances of goog.net.XhrIo created\n * by {@link goog.net.XhrIo.send} are in this Array.\n * @see goog.net.XhrIo.cleanup\n * @private {!Array<!goog.net.XhrIo>}\n */\ngoog.net.XhrIo.sendInstances_ = [];\n\n\n/**\n * Static send that creates a short lived instance of XhrIo to send the\n * request.\n * @see goog.net.XhrIo.cleanup\n * @param {string|goog.Uri} url Uri to make request to.\n * @param {?function(this:goog.net.XhrIo, ?)=} opt_callback Callback function\n * for when request is complete.\n * @param {string=} opt_method Send method, default: GET.\n * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=}\n * opt_content Body data.\n * @param {Object|goog.structs.Map=} opt_headers Map of headers to add to the\n * request.\n * @param {number=} opt_timeoutInterval Number of milliseconds after which an\n * incomplete request will be aborted; 0 means no timeout is set.\n * @param {boolean=} opt_withCredentials Whether to send credentials with the\n * request. Default to false. See {@link goog.net.XhrIo#setWithCredentials}.\n * @return {!goog.net.XhrIo} The sent XhrIo.\n */\ngoog.net.XhrIo.send = function(\n url, opt_callback, opt_method, opt_content, opt_headers,\n opt_timeoutInterval, opt_withCredentials) {\n 'use strict';\n const x = new goog.net.XhrIo();\n goog.net.XhrIo.sendInstances_.push(x);\n if (opt_callback) {\n x.listen(goog.net.EventType.COMPLETE, opt_callback);\n }\n x.listenOnce(goog.net.EventType.READY, x.cleanupSend_);\n if (opt_timeoutInterval) {\n x.setTimeoutInterval(opt_timeoutInterval);\n }\n if (opt_withCredentials) {\n x.setWithCredentials(opt_withCredentials);\n }\n x.send(url, opt_method, opt_content, opt_headers);\n return x;\n};\n\n\n/**\n * Disposes all non-disposed instances of goog.net.XhrIo created by\n * {@link goog.net.XhrIo.send}.\n * {@link goog.net.XhrIo.send} cleans up the goog.net.XhrIo instance\n * it creates when the request completes or fails. However, if\n * the request never completes, then the goog.net.XhrIo is not disposed.\n * This can occur if the window is unloaded before the request completes.\n * We could have {@link goog.net.XhrIo.send} return the goog.net.XhrIo\n * it creates and make the client of {@link goog.net.XhrIo.send} be\n * responsible for disposing it in this case. However, this makes things\n * significantly more complicated for the client, and the whole point\n * of {@link goog.net.XhrIo.send} is that it's simple and easy to use.\n * Clients of {@link goog.net.XhrIo.send} should call\n * {@link goog.net.XhrIo.cleanup} when doing final\n * cleanup on window unload.\n */\ngoog.net.XhrIo.cleanup = function() {\n 'use strict';\n const instances = goog.net.XhrIo.sendInstances_;\n while (instances.length) {\n instances.pop().dispose();\n }\n};\n\n\n/**\n * Installs exception protection for all entry point introduced by\n * goog.net.XhrIo instances which are not protected by\n * {@link goog.debug.ErrorHandler#protectWindowSetTimeout},\n * {@link goog.debug.ErrorHandler#protectWindowSetInterval}, or\n * {@link goog.events.protectBrowserEventEntryPoint}.\n *\n * @param {goog.debug.ErrorHandler} errorHandler Error handler with which to\n * protect the entry point(s).\n */\ngoog.net.XhrIo.protectEntryPoints = function(errorHandler) {\n 'use strict';\n goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ =\n errorHandler.protectEntryPoint(\n goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_);\n};\n\n\n/**\n * Disposes of the specified goog.net.XhrIo created by\n * {@link goog.net.XhrIo.send} and removes it from\n * {@link goog.net.XhrIo.pendingStaticSendInstances_}.\n * @private\n */\ngoog.net.XhrIo.prototype.cleanupSend_ = function() {\n 'use strict';\n this.dispose();\n goog.array.remove(goog.net.XhrIo.sendInstances_, this);\n};\n\n\n/**\n * Returns the number of milliseconds after which an incomplete request will be\n * aborted, or 0 if no timeout is set.\n * @return {number} Timeout interval in milliseconds.\n */\ngoog.net.XhrIo.prototype.getTimeoutInterval = function() {\n 'use strict';\n return this.timeoutInterval_;\n};\n\n\n/**\n * Sets the number of milliseconds after which an incomplete request will be\n * aborted and a {@link goog.net.EventType.TIMEOUT} event raised; 0 means no\n * timeout is set.\n * @param {number} ms Timeout interval in milliseconds; 0 means none.\n */\ngoog.net.XhrIo.prototype.setTimeoutInterval = function(ms) {\n 'use strict';\n this.timeoutInterval_ = Math.max(0, ms);\n};\n\n\n/**\n * Sets the desired type for the response. At time of writing, this is only\n * supported in very recent versions of WebKit (10.0.612.1 dev and later).\n *\n * If this is used, the response may only be accessed via {@link #getResponse}.\n *\n * @param {goog.net.XhrIo.ResponseType} type The desired type for the response.\n */\ngoog.net.XhrIo.prototype.setResponseType = function(type) {\n 'use strict';\n this.responseType_ = type;\n};\n\n\n/**\n * Gets the desired type for the response.\n * @return {goog.net.XhrIo.ResponseType} The desired type for the response.\n */\ngoog.net.XhrIo.prototype.getResponseType = function() {\n 'use strict';\n return this.responseType_;\n};\n\n\n/**\n * Sets whether a \"credentialed\" request that is aware of cookie and\n * authentication information should be made. This option is only supported by\n * browsers that support HTTP Access Control. As of this writing, this option\n * is not supported in IE.\n *\n * @param {boolean} withCredentials Whether this should be a \"credentialed\"\n * request.\n */\ngoog.net.XhrIo.prototype.setWithCredentials = function(withCredentials) {\n 'use strict';\n this.withCredentials_ = withCredentials;\n};\n\n\n/**\n * Gets whether a \"credentialed\" request is to be sent.\n * @return {boolean} The desired type for the response.\n */\ngoog.net.XhrIo.prototype.getWithCredentials = function() {\n 'use strict';\n return this.withCredentials_;\n};\n\n\n/**\n * Sets whether progress events are enabled for this request. Note\n * that progress events require pre-flight OPTIONS request handling\n * for CORS requests, and may cause trouble with older browsers. See\n * progressEventsEnabled_ for details.\n * @param {boolean} enabled Whether progress events should be enabled.\n */\ngoog.net.XhrIo.prototype.setProgressEventsEnabled = function(enabled) {\n 'use strict';\n this.progressEventsEnabled_ = enabled;\n};\n\n\n/**\n * Gets whether progress events are enabled.\n * @return {boolean} Whether progress events are enabled for this request.\n */\ngoog.net.XhrIo.prototype.getProgressEventsEnabled = function() {\n 'use strict';\n return this.progressEventsEnabled_;\n};\n\n/**\n * Specify a Trust Tokens operation to execute alongside the request.\n * @param {!TrustTokenAttributeType} trustToken a Trust Tokens operation to\n * execute.\n */\ngoog.net.XhrIo.prototype.setTrustToken = function(trustToken) {\n 'use strict';\n this.trustToken_ = trustToken;\n};\n\n/**\n * Instance send that actually uses XMLHttpRequest to make a server call.\n * @param {string|goog.Uri} url Uri to make request to.\n * @param {string=} opt_method Send method, default: GET.\n * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=}\n * opt_content Body data.\n * @param {Object|goog.structs.Map=} opt_headers Map of headers to add to the\n * request.\n * @suppress {deprecated} Use deprecated goog.structs.forEach to allow different\n * types of parameters for opt_headers.\n */\ngoog.net.XhrIo.prototype.send = function(\n url, opt_method, opt_content, opt_headers) {\n 'use strict';\n if (this.xhr_) {\n throw new Error(\n '[goog.net.XhrIo] Object is active with another request=' +\n this.lastUri_ + '; newUri=' + url);\n }\n\n const method = opt_method ? opt_method.toUpperCase() : 'GET';\n\n this.lastUri_ = url;\n this.lastError_ = '';\n this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n this.lastMethod_ = method;\n this.errorDispatched_ = false;\n this.active_ = true;\n\n // Use the factory to create the XHR object and options\n this.xhr_ = this.createXhr();\n this.xhrOptions_ = this.xmlHttpFactory_ ? this.xmlHttpFactory_.getOptions() :\n goog.net.XmlHttp.getOptions();\n\n // Set up the onreadystatechange callback\n this.xhr_.onreadystatechange = goog.bind(this.onReadyStateChange_, this);\n\n // Set up upload/download progress events, if progress events are supported.\n if (this.getProgressEventsEnabled() && 'onprogress' in this.xhr_) {\n this.xhr_.onprogress = goog.bind(function(e) {\n 'use strict';\n this.onProgressHandler_(e, true);\n }, this);\n if (this.xhr_.upload) {\n this.xhr_.upload.onprogress = goog.bind(this.onProgressHandler_, this);\n }\n }\n\n /**\n * Try to open the XMLHttpRequest (always async), if an error occurs here it\n * is generally permission denied\n */\n try {\n goog.log.fine(this.logger_, this.formatMsg_('Opening Xhr'));\n this.inOpen_ = true;\n this.xhr_.open(method, String(url), true); // Always async!\n this.inOpen_ = false;\n } catch (err) {\n goog.log.fine(\n this.logger_, this.formatMsg_('Error opening Xhr: ' + err.message));\n this.error_(goog.net.ErrorCode.EXCEPTION, err);\n return;\n }\n\n // We can't use null since this won't allow requests with form data to have a\n // content length specified which will cause some proxies to return a 411\n // error.\n const content = opt_content || '';\n\n const headers = this.headers.clone();\n\n // Add headers specific to this request\n if (opt_headers) {\n goog.structs.forEach(opt_headers, function(value, key) {\n 'use strict';\n headers.set(key, value);\n });\n }\n\n // Find whether a content type header is set, ignoring case.\n // HTTP header names are case-insensitive. See:\n // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2\n const contentTypeKey =\n goog.array.find(headers.getKeys(), goog.net.XhrIo.isContentTypeHeader_);\n\n const contentIsFormData =\n (goog.global['FormData'] && (content instanceof goog.global['FormData']));\n if (goog.array.contains(goog.net.XhrIo.METHODS_WITH_FORM_DATA, method) &&\n !contentTypeKey && !contentIsFormData) {\n // For requests typically with form data, default to the url-encoded form\n // content type unless this is a FormData request. For FormData,\n // the browser will automatically add a multipart/form-data content type\n // with an appropriate multipart boundary.\n headers.set(\n goog.net.XhrIo.CONTENT_TYPE_HEADER, goog.net.XhrIo.FORM_CONTENT_TYPE);\n }\n\n // Add the headers to the Xhr object\n headers.forEach(function(value, key) {\n 'use strict';\n this.xhr_.setRequestHeader(key, value);\n }, this);\n\n if (this.responseType_) {\n this.xhr_.responseType = this.responseType_;\n }\n // Set xhr_.withCredentials only when the value is different, or else in\n // synchronous XMLHtppRequest.open Firefox will throw an exception.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=736340\n if ('withCredentials' in this.xhr_ &&\n this.xhr_.withCredentials !== this.withCredentials_) {\n this.xhr_.withCredentials = this.withCredentials_;\n }\n\n if ('setTrustToken' in this.xhr_ && this.trustToken_) {\n try {\n this.xhr_.setTrustToken(this.trustToken_);\n } catch (err) {\n goog.log.fine(\n this.logger_, this.formatMsg_('Error SetTrustToken: ' + err.message));\n }\n }\n /**\n * Try to send the request, or other wise report an error (404 not found).\n */\n try {\n this.cleanUpTimeoutTimer_(); // Paranoid, should never be running.\n if (this.timeoutInterval_ > 0) {\n this.useXhr2Timeout_ = goog.net.XhrIo.shouldUseXhr2Timeout_(this.xhr_);\n goog.log.fine(\n this.logger_, this.formatMsg_(\n 'Will abort after ' + this.timeoutInterval_ +\n 'ms if incomplete, xhr2 ' + this.useXhr2Timeout_));\n if (this.useXhr2Timeout_) {\n this.xhr_[goog.net.XhrIo.XHR2_TIMEOUT_] = this.timeoutInterval_;\n this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] =\n goog.bind(this.timeout_, this);\n } else {\n this.timeoutId_ =\n goog.Timer.callOnce(this.timeout_, this.timeoutInterval_, this);\n }\n }\n goog.log.fine(this.logger_, this.formatMsg_('Sending request'));\n this.inSend_ = true;\n this.xhr_.send(content);\n this.inSend_ = false;\n\n } catch (err) {\n goog.log.fine(this.logger_, this.formatMsg_('Send error: ' + err.message));\n this.error_(goog.net.ErrorCode.EXCEPTION, err);\n }\n};\n\n\n/**\n * Determines if the argument is an XMLHttpRequest that supports the level 2\n * timeout value and event.\n *\n * Currently, FF 21.0 OS X has the fields but won't actually call the timeout\n * handler. Perhaps the confusion in the bug referenced below hasn't\n * entirely been resolved.\n *\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=525816\n *\n * @param {!goog.net.XhrLike.OrNative} xhr The request.\n * @return {boolean} True if the request supports level 2 timeout.\n * @private\n */\ngoog.net.XhrIo.shouldUseXhr2Timeout_ = function(xhr) {\n 'use strict';\n return goog.userAgent.IE && goog.userAgent.isVersionOrHigher(9) &&\n typeof xhr[goog.net.XhrIo.XHR2_TIMEOUT_] === 'number' &&\n xhr[goog.net.XhrIo.XHR2_ON_TIMEOUT_] !== undefined;\n};\n\n\n/**\n * @param {string} header An HTTP header key.\n * @return {boolean} Whether the key is a content type header (ignoring\n * case.\n * @private\n */\ngoog.net.XhrIo.isContentTypeHeader_ = function(header) {\n 'use strict';\n return goog.string.caseInsensitiveEquals(\n goog.net.XhrIo.CONTENT_TYPE_HEADER, header);\n};\n\n\n/**\n * Creates a new XHR object.\n * @return {!goog.net.XhrLike.OrNative} The newly created XHR object.\n * @protected\n */\ngoog.net.XhrIo.prototype.createXhr = function() {\n 'use strict';\n return this.xmlHttpFactory_ ? this.xmlHttpFactory_.createInstance() :\n goog.net.XmlHttp();\n};\n\n\n/**\n * The request didn't complete after {@link goog.net.XhrIo#timeoutInterval_}\n * milliseconds; raises a {@link goog.net.EventType.TIMEOUT} event and aborts\n * the request.\n * @private\n */\ngoog.net.XhrIo.prototype.timeout_ = function() {\n 'use strict';\n if (typeof goog == 'undefined') {\n // If goog is undefined then the callback has occurred as the application\n // is unloading and will error. Thus we let it silently fail.\n } else if (this.xhr_) {\n this.lastError_ =\n 'Timed out after ' + this.timeoutInterval_ + 'ms, aborting';\n this.lastErrorCode_ = goog.net.ErrorCode.TIMEOUT;\n goog.log.fine(this.logger_, this.formatMsg_(this.lastError_));\n this.dispatchEvent(goog.net.EventType.TIMEOUT);\n this.abort(goog.net.ErrorCode.TIMEOUT);\n }\n};\n\n\n/**\n * Something errorred, so inactivate, fire error callback and clean up\n * @param {goog.net.ErrorCode} errorCode The error code.\n * @param {Error} err The error object.\n * @private\n */\ngoog.net.XhrIo.prototype.error_ = function(errorCode, err) {\n 'use strict';\n this.active_ = false;\n if (this.xhr_) {\n this.inAbort_ = true;\n this.xhr_.abort(); // Ensures XHR isn't hung (FF)\n this.inAbort_ = false;\n }\n this.lastError_ = err;\n this.lastErrorCode_ = errorCode;\n this.dispatchErrors_();\n this.cleanUpXhr_();\n};\n\n\n/**\n * Dispatches COMPLETE and ERROR in case of an error. This ensures that we do\n * not dispatch multiple error events.\n * @private\n */\ngoog.net.XhrIo.prototype.dispatchErrors_ = function() {\n 'use strict';\n if (!this.errorDispatched_) {\n this.errorDispatched_ = true;\n this.dispatchEvent(goog.net.EventType.COMPLETE);\n this.dispatchEvent(goog.net.EventType.ERROR);\n }\n};\n\n\n/**\n * Abort the current XMLHttpRequest\n * @param {goog.net.ErrorCode=} opt_failureCode Optional error code to use -\n * defaults to ABORT.\n */\ngoog.net.XhrIo.prototype.abort = function(opt_failureCode) {\n 'use strict';\n if (this.xhr_ && this.active_) {\n goog.log.fine(this.logger_, this.formatMsg_('Aborting'));\n this.active_ = false;\n this.inAbort_ = true;\n this.xhr_.abort();\n this.inAbort_ = false;\n this.lastErrorCode_ = opt_failureCode || goog.net.ErrorCode.ABORT;\n this.dispatchEvent(goog.net.EventType.COMPLETE);\n this.dispatchEvent(goog.net.EventType.ABORT);\n this.cleanUpXhr_();\n }\n};\n\n\n/**\n * Nullifies all callbacks to reduce risks of leaks.\n * @override\n * @protected\n */\ngoog.net.XhrIo.prototype.disposeInternal = function() {\n 'use strict';\n if (this.xhr_) {\n // We explicitly do not call xhr_.abort() unless active_ is still true.\n // This is to avoid unnecessarily aborting a successful request when\n // dispose() is called in a callback triggered by a complete response, but\n // in which browser cleanup has not yet finished.\n // (See http://b/issue?id=1684217.)\n if (this.active_) {\n this.active_ = false;\n this.inAbort_ = true;\n this.xhr_.abort();\n this.inAbort_ = false;\n }\n this.cleanUpXhr_(true);\n }\n\n XhrIo.base(this, 'disposeInternal');\n};\n\n\n/**\n * Internal handler for the XHR object's readystatechange event. This method\n * checks the status and the readystate and fires the correct callbacks.\n * If the request has ended, the handlers are cleaned up and the XHR object is\n * nullified.\n * @private\n */\ngoog.net.XhrIo.prototype.onReadyStateChange_ = function() {\n 'use strict';\n if (this.isDisposed()) {\n // This method is the target of an untracked goog.Timer.callOnce().\n return;\n }\n if (!this.inOpen_ && !this.inSend_ && !this.inAbort_) {\n // Were not being called from within a call to this.xhr_.send\n // this.xhr_.abort, or this.xhr_.open, so this is an entry point\n this.onReadyStateChangeEntryPoint_();\n } else {\n this.onReadyStateChangeHelper_();\n }\n};\n\n\n/**\n * Used to protect the onreadystatechange handler entry point. Necessary\n * as {#onReadyStateChange_} maybe called from within send or abort, this\n * method is only called when {#onReadyStateChange_} is called as an\n * entry point.\n * {@see #protectEntryPoints}\n * @private\n */\ngoog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = function() {\n 'use strict';\n this.onReadyStateChangeHelper_();\n};\n\n\n/**\n * Helper for {@link #onReadyStateChange_}. This is used so that\n * entry point calls to {@link #onReadyStateChange_} can be routed through\n * {@link #onReadyStateChangeEntryPoint_}.\n * @private\n */\ngoog.net.XhrIo.prototype.onReadyStateChangeHelper_ = function() {\n 'use strict';\n if (!this.active_) {\n // can get called inside abort call\n return;\n }\n\n if (typeof goog == 'undefined') {\n // NOTE(user): If goog is undefined then the callback has occurred as the\n // application is unloading and will error. Thus we let it silently fail.\n\n } else if (\n this.xhrOptions_[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] &&\n this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE &&\n this.getStatus() == 2) {\n // NOTE(user): In IE if send() errors on a *local* request the readystate\n // is still changed to COMPLETE. We need to ignore it and allow the\n // try/catch around send() to pick up the error.\n goog.log.fine(\n this.logger_,\n this.formatMsg_('Local request error detected and ignored'));\n\n } else {\n // In IE when the response has been cached we sometimes get the callback\n // from inside the send call and this usually breaks code that assumes that\n // XhrIo is asynchronous. If that is the case we delay the callback\n // using a timer.\n if (this.inSend_ &&\n this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE) {\n goog.Timer.callOnce(this.onReadyStateChange_, 0, this);\n return;\n }\n\n this.dispatchEvent(goog.net.EventType.READY_STATE_CHANGE);\n\n // readyState indicates the transfer has finished\n if (this.isComplete()) {\n goog.log.fine(this.logger_, this.formatMsg_('Request complete'));\n\n this.active_ = false;\n\n try {\n // Call the specific callbacks for success or failure. Only call the\n // success if the status is 200 (HTTP_OK) or 304 (HTTP_CACHED)\n if (this.isSuccess()) {\n this.dispatchEvent(goog.net.EventType.COMPLETE);\n this.dispatchEvent(goog.net.EventType.SUCCESS);\n } else {\n this.lastErrorCode_ = goog.net.ErrorCode.HTTP_ERROR;\n this.lastError_ =\n this.getStatusText() + ' [' + this.getStatus() + ']';\n this.dispatchErrors_();\n }\n } finally {\n this.cleanUpXhr_();\n }\n }\n }\n};\n\n\n/**\n * Internal handler for the XHR object's onprogress event. Fires both a generic\n * PROGRESS event and either a DOWNLOAD_PROGRESS or UPLOAD_PROGRESS event to\n * allow specific binding for each XHR progress event.\n * @param {!ProgressEvent} e XHR progress event.\n * @param {boolean=} opt_isDownload Whether the current progress event is from a\n * download. Used to determine whether DOWNLOAD_PROGRESS or UPLOAD_PROGRESS\n * event should be dispatched.\n * @private\n */\ngoog.net.XhrIo.prototype.onProgressHandler_ = function(e, opt_isDownload) {\n 'use strict';\n goog.asserts.assert(\n e.type === goog.net.EventType.PROGRESS,\n 'goog.net.EventType.PROGRESS is of the same type as raw XHR progress.');\n this.dispatchEvent(\n goog.net.XhrIo.buildProgressEvent_(e, goog.net.EventType.PROGRESS));\n this.dispatchEvent(\n goog.net.XhrIo.buildProgressEvent_(\n e, opt_isDownload ? goog.net.EventType.DOWNLOAD_PROGRESS :\n goog.net.EventType.UPLOAD_PROGRESS));\n};\n\n\n/**\n * Creates a representation of the native ProgressEvent. IE doesn't support\n * constructing ProgressEvent via \"new\", and the alternatives (e.g.,\n * ProgressEvent.initProgressEvent) are non-standard or deprecated.\n * @param {!ProgressEvent} e XHR progress event.\n * @param {!goog.net.EventType} eventType The type of the event.\n * @return {!ProgressEvent} The progress event.\n * @private\n */\ngoog.net.XhrIo.buildProgressEvent_ = function(e, eventType) {\n 'use strict';\n return /** @type {!ProgressEvent} */ ({\n type: eventType,\n lengthComputable: e.lengthComputable,\n loaded: e.loaded,\n total: e.total,\n });\n};\n\n\n/**\n * Remove the listener to protect against leaks, and nullify the XMLHttpRequest\n * object.\n * @param {boolean=} opt_fromDispose If this is from the dispose (don't want to\n * fire any events).\n * @private\n */\ngoog.net.XhrIo.prototype.cleanUpXhr_ = function(opt_fromDispose) {\n 'use strict';\n if (this.xhr_) {\n // Cancel any pending timeout event handler.\n this.cleanUpTimeoutTimer_();\n\n // Save reference so we can mark it as closed after the READY event. The\n // READY event may trigger another request, thus we must nullify this.xhr_\n const xhr = this.xhr_;\n const clearedOnReadyStateChange =\n this.xhrOptions_[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] ?\n goog.nullFunction :\n null;\n this.xhr_ = null;\n this.xhrOptions_ = null;\n\n if (!opt_fromDispose) {\n this.dispatchEvent(goog.net.EventType.READY);\n }\n\n try {\n // NOTE(user): Not nullifying in FireFox can still leak if the callbacks\n // are defined in the same scope as the instance of XhrIo. But, IE doesn't\n // allow you to set the onreadystatechange to NULL so nullFunction is\n // used.\n xhr.onreadystatechange = clearedOnReadyStateChange;\n } catch (e) {\n // This seems to occur with a Gears HTTP request. Delayed the setting of\n // this onreadystatechange until after READY is sent out and catching the\n // error to see if we can track down the problem.\n goog.log.error(\n this.logger_,\n 'Problem encountered resetting onreadystatechange: ' + e.message);\n }\n }\n};\n\n\n/**\n * Make sure the timeout timer isn't running.\n * @private\n */\ngoog.net.XhrIo.prototype.cleanUpTimeoutTimer_ = function() {\n 'use strict';\n if (this.xhr_ && this.useXhr2Timeout_) {\n this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] = null;\n }\n if (this.timeoutId_) {\n goog.Timer.clear(this.timeoutId_);\n this.timeoutId_ = null;\n }\n};\n\n\n/**\n * @return {boolean} Whether there is an active request.\n */\ngoog.net.XhrIo.prototype.isActive = function() {\n 'use strict';\n return !!this.xhr_;\n};\n\n\n/**\n * @return {boolean} Whether the request has completed.\n */\ngoog.net.XhrIo.prototype.isComplete = function() {\n 'use strict';\n return this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE;\n};\n\n\n/**\n * @return {boolean} Whether the request completed with a success.\n */\ngoog.net.XhrIo.prototype.isSuccess = function() {\n 'use strict';\n const status = this.getStatus();\n // A zero status code is considered successful for local files.\n return goog.net.HttpStatus.isSuccess(status) ||\n status === 0 && !this.isLastUriEffectiveSchemeHttp_();\n};\n\n\n/**\n * @return {boolean} whether the effective scheme of the last URI that was\n * fetched was 'http' or 'https'.\n * @private\n */\ngoog.net.XhrIo.prototype.isLastUriEffectiveSchemeHttp_ = function() {\n 'use strict';\n const scheme = goog.uri.utils.getEffectiveScheme(String(this.lastUri_));\n return HTTP_SCHEME_PATTERN.test(scheme);\n};\n\n\n/**\n * Get the readystate from the Xhr object\n * Will only return correct result when called from the context of a callback\n * @return {goog.net.XmlHttp.ReadyState} goog.net.XmlHttp.ReadyState.*.\n */\ngoog.net.XhrIo.prototype.getReadyState = function() {\n 'use strict';\n return this.xhr_ ?\n /** @type {goog.net.XmlHttp.ReadyState} */ (this.xhr_.readyState) :\n goog.net.XmlHttp.ReadyState.UNINITIALIZED;\n};\n\n\n/**\n * Get the status from the Xhr object\n * Will only return correct result when called from the context of a callback\n * @return {number} Http status.\n */\ngoog.net.XhrIo.prototype.getStatus = function() {\n 'use strict';\n /**\n * IE doesn't like you checking status until the readystate is greater than 2\n * (i.e. it is receiving or complete). The try/catch is used for when the\n * page is unloading and an ERROR_NOT_AVAILABLE may occur when accessing xhr_.\n */\n try {\n return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ?\n this.xhr_.status :\n -1;\n } catch (e) {\n return -1;\n }\n};\n\n\n/**\n * Get the status text from the Xhr object\n * Will only return correct result when called from the context of a callback\n * @return {string} Status text.\n */\ngoog.net.XhrIo.prototype.getStatusText = function() {\n 'use strict';\n /**\n * IE doesn't like you checking status until the readystate is greater than 2\n * (i.e. it is receiving or complete). The try/catch is used for when the\n * page is unloading and an ERROR_NOT_AVAILABLE may occur when accessing xhr_.\n */\n try {\n return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ?\n this.xhr_.statusText :\n '';\n } catch (e) {\n goog.log.fine(this.logger_, 'Can not get status: ' + e.message);\n return '';\n }\n};\n\n\n/**\n * Get the last Uri that was requested\n * @return {string} Last Uri.\n */\ngoog.net.XhrIo.prototype.getLastUri = function() {\n 'use strict';\n return String(this.lastUri_);\n};\n\n\n/**\n * Get the response text from the Xhr object\n * Will only return correct result when called from the context of a callback.\n * @return {string} Result from the server, or '' if no result available.\n */\ngoog.net.XhrIo.prototype.getResponseText = function() {\n 'use strict';\n try {\n return this.xhr_ ? this.xhr_.responseText : '';\n } catch (e) {\n // http://www.w3.org/TR/XMLHttpRequest/#the-responsetext-attribute\n // states that responseText should return '' (and responseXML null)\n // when the state is not LOADING or DONE. Instead, IE can\n // throw unexpected exceptions, for example when a request is aborted\n // or no data is available yet.\n goog.log.fine(this.logger_, 'Can not get responseText: ' + e.message);\n return '';\n }\n};\n\n\n/**\n * Get the response body from the Xhr object. This property is only available\n * in IE since version 7 according to MSDN:\n * http://msdn.microsoft.com/en-us/library/ie/ms534368(v=vs.85).aspx\n * Will only return correct result when called from the context of a callback.\n *\n * One option is to construct a VBArray from the returned object and convert\n * it to a JavaScript array using the toArray method:\n * `(new window['VBArray'](xhrIo.getResponseBody())).toArray()`\n * This will result in an array of numbers in the range of [0..255]\n *\n * Another option is to use the VBScript CStr method to convert it into a\n * string as outlined in http://stackoverflow.com/questions/1919972\n *\n * @return {Object} Binary result from the server or null if not available.\n */\ngoog.net.XhrIo.prototype.getResponseBody = function() {\n 'use strict';\n try {\n if (this.xhr_ && 'responseBody' in this.xhr_) {\n return this.xhr_['responseBody'];\n }\n } catch (e) {\n // IE can throw unexpected exceptions, for example when a request is aborted\n // or no data is yet available.\n goog.log.fine(this.logger_, 'Can not get responseBody: ' + e.message);\n }\n return null;\n};\n\n\n/**\n * Get the response XML from the Xhr object\n * Will only return correct result when called from the context of a callback.\n * @return {Document} The DOM Document representing the XML file, or null\n * if no result available.\n */\ngoog.net.XhrIo.prototype.getResponseXml = function() {\n 'use strict';\n try {\n return this.xhr_ ? this.xhr_.responseXML : null;\n } catch (e) {\n goog.log.fine(this.logger_, 'Can not get responseXML: ' + e.message);\n return null;\n }\n};\n\n\n/**\n * Get the response and evaluates it as JSON from the Xhr object\n * Will only return correct result when called from the context of a callback\n * @param {string=} opt_xssiPrefix Optional XSSI prefix string to use for\n * stripping of the response before parsing. This needs to be set only if\n * your backend server prepends the same prefix string to the JSON response.\n * @throws Error if the response text is invalid JSON.\n * @return {Object|undefined} JavaScript object.\n */\ngoog.net.XhrIo.prototype.getResponseJson = function(opt_xssiPrefix) {\n 'use strict';\n if (!this.xhr_) {\n return undefined;\n }\n\n let responseText = this.xhr_.responseText;\n if (opt_xssiPrefix && responseText.indexOf(opt_xssiPrefix) == 0) {\n responseText = responseText.substring(opt_xssiPrefix.length);\n }\n\n return goog.json.hybrid.parse(responseText);\n};\n\n\n/**\n * Get the response as the type specificed by {@link #setResponseType}. At time\n * of writing, this is only directly supported in very recent versions of WebKit\n * (10.0.612.1 dev and later). If the field is not supported directly, we will\n * try to emulate it.\n *\n * Emulating the response means following the rules laid out at\n * http://www.w3.org/TR/XMLHttpRequest/#the-response-attribute\n *\n * On browsers with no support for this (Chrome < 10, Firefox < 4, etc), only\n * response types of DEFAULT or TEXT may be used, and the response returned will\n * be the text response.\n *\n * On browsers with Mozilla's draft support for array buffers (Firefox 4, 5),\n * only response types of DEFAULT, TEXT, and ARRAY_BUFFER may be used, and the\n * response returned will be either the text response or the Mozilla\n * implementation of the array buffer response.\n *\n * On browsers will full support, any valid response type supported by the\n * browser may be used, and the response provided by the browser will be\n * returned.\n *\n * @return {*} The response.\n */\ngoog.net.XhrIo.prototype.getResponse = function() {\n 'use strict';\n try {\n if (!this.xhr_) {\n return null;\n }\n if ('response' in this.xhr_) {\n return this.xhr_.response;\n }\n switch (this.responseType_) {\n case ResponseType.DEFAULT:\n case ResponseType.TEXT:\n return this.xhr_.responseText;\n // DOCUMENT and BLOB don't need to be handled here because they are\n // introduced in the same spec that adds the .response field, and would\n // have been caught above.\n // ARRAY_BUFFER needs an implementation for Firefox 4, where it was\n // implemented using a draft spec rather than the final spec.\n case ResponseType.ARRAY_BUFFER:\n if ('mozResponseArrayBuffer' in this.xhr_) {\n return this.xhr_.mozResponseArrayBuffer;\n }\n }\n // Fell through to a response type that is not supported on this browser.\n goog.log.error(\n this.logger_, 'Response type ' + this.responseType_ + ' is not ' +\n 'supported on this browser');\n return null;\n } catch (e) {\n goog.log.fine(this.logger_, 'Can not get response: ' + e.message);\n return null;\n }\n};\n\n\n/**\n * Get the value of the response-header with the given name from the Xhr object\n * Will only return correct result when called from the context of a callback\n * and the request has completed\n * @param {string} key The name of the response-header to retrieve.\n * @return {string|undefined} The value of the response-header named key.\n */\ngoog.net.XhrIo.prototype.getResponseHeader = function(key) {\n 'use strict';\n if (!this.xhr_ || !this.isComplete()) {\n return undefined;\n }\n\n const value = this.xhr_.getResponseHeader(key);\n return value === null ? undefined : value;\n};\n\n\n/**\n * Gets the text of all the headers in the response.\n * Will only return correct result when called from the context of a callback\n * and the request has completed.\n * @return {string} The value of the response headers or empty string.\n */\ngoog.net.XhrIo.prototype.getAllResponseHeaders = function() {\n 'use strict';\n // getAllResponseHeaders can return null if no response has been received,\n // ensure we always return an empty string.\n return this.xhr_ && this.isComplete() ?\n (this.xhr_.getAllResponseHeaders() || '') :\n '';\n};\n\n\n/**\n * Returns all response headers as a key-value map.\n * Multiple values for the same header key can be combined into one,\n * separated by a comma and a space.\n * Note that the native getResponseHeader method for retrieving a single header\n * does a case insensitive match on the header name. This method does not\n * include any case normalization logic, it will just return a key-value\n * representation of the headers.\n * See: http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method\n * @return {!Object<string, string>} An object with the header keys as keys\n * and header values as values.\n */\ngoog.net.XhrIo.prototype.getResponseHeaders = function() {\n 'use strict';\n // TODO(user): Make this function parse headers as per the spec\n // (https://tools.ietf.org/html/rfc2616#section-4.2).\n\n const headersObject = {};\n const headersArray = this.getAllResponseHeaders().split('\\r\\n');\n for (let i = 0; i < headersArray.length; i++) {\n if (goog.string.isEmptyOrWhitespace(headersArray[i])) {\n continue;\n }\n const keyValue =\n goog.string.splitLimit(headersArray[i], ':', /* maxSplitCount= */ 1);\n const key = keyValue[0];\n let value = keyValue[1];\n\n if (typeof value !== 'string') {\n // There must be a value but it can be the empty string.\n continue;\n }\n\n // Whitespace at the start and end of the value is meaningless.\n value = value.trim();\n // The key should not contain whitespace but we currently ignore that.\n\n const values = headersObject[key] || [];\n headersObject[key] = values;\n values.push(value);\n }\n\n return goog.object.map(headersObject, function(values) {\n 'use strict';\n return values.join(', ');\n });\n};\n\n\n/**\n * Get the value of the response-header with the given name from the Xhr object.\n * As opposed to {@link #getResponseHeader}, this method does not require that\n * the request has completed.\n * @param {string} key The name of the response-header to retrieve.\n * @return {?string} The value of the response-header, or null if it is\n * unavailable.\n */\ngoog.net.XhrIo.prototype.getStreamingResponseHeader = function(key) {\n 'use strict';\n return this.xhr_ ? this.xhr_.getResponseHeader(key) : null;\n};\n\n\n/**\n * Gets the text of all the headers in the response. As opposed to\n * {@link #getAllResponseHeaders}, this method does not require that the request\n * has completed.\n * @return {string} The value of the response headers or empty string.\n */\ngoog.net.XhrIo.prototype.getAllStreamingResponseHeaders = function() {\n 'use strict';\n return this.xhr_ ? this.xhr_.getAllResponseHeaders() : '';\n};\n\n\n/**\n * Get the last error message\n * @return {!goog.net.ErrorCode} Last error code.\n */\ngoog.net.XhrIo.prototype.getLastErrorCode = function() {\n 'use strict';\n return this.lastErrorCode_;\n};\n\n\n/**\n * Get the last error message\n * @return {string} Last error message.\n */\ngoog.net.XhrIo.prototype.getLastError = function() {\n 'use strict';\n return typeof this.lastError_ === 'string' ? this.lastError_ :\n String(this.lastError_);\n};\n\n\n/**\n * Adds the last method, status and URI to the message. This is used to add\n * this information to the logging calls.\n * @param {string} msg The message text that we want to add the extra text to.\n * @return {string} The message with the extra text appended.\n * @private\n */\ngoog.net.XhrIo.prototype.formatMsg_ = function(msg) {\n 'use strict';\n return msg + ' [' + this.lastMethod_ + ' ' + this.lastUri_ + ' ' +\n this.getStatus() + ']';\n};\n\n\n// Register the xhr handler as an entry point, so that\n// it can be monitored for exception handling, etc.\ngoog.debug.entryPointRegistry.register(\n /**\n * @param {function(!Function): !Function} transformer The transforming\n * function.\n */\n function(transformer) {\n 'use strict';\n goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ =\n transformer(goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_);\n });\n}); // goog.scope\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview String functions called from Closure packages that couldn't\n * depend on each other. Outside Closure, use goog.string function which\n * delegate to these.\n */\n\n\ngoog.provide('goog.string.internal');\n\n\n/**\n * Fast prefix-checker.\n * @param {string} str The string to check.\n * @param {string} prefix A string to look for at the start of `str`.\n * @return {boolean} True if `str` begins with `prefix`.\n * @see goog.string.startsWith\n */\ngoog.string.internal.startsWith = function(str, prefix) {\n 'use strict';\n return str.lastIndexOf(prefix, 0) == 0;\n};\n\n\n/**\n * Fast suffix-checker.\n * @param {string} str The string to check.\n * @param {string} suffix A string to look for at the end of `str`.\n * @return {boolean} True if `str` ends with `suffix`.\n * @see goog.string.endsWith\n */\ngoog.string.internal.endsWith = function(str, suffix) {\n 'use strict';\n const l = str.length - suffix.length;\n return l >= 0 && str.indexOf(suffix, l) == l;\n};\n\n\n/**\n * Case-insensitive prefix-checker.\n * @param {string} str The string to check.\n * @param {string} prefix A string to look for at the end of `str`.\n * @return {boolean} True if `str` begins with `prefix` (ignoring\n * case).\n * @see goog.string.caseInsensitiveStartsWith\n */\ngoog.string.internal.caseInsensitiveStartsWith = function(str, prefix) {\n 'use strict';\n return goog.string.internal.caseInsensitiveCompare(\n prefix, str.substr(0, prefix.length)) == 0;\n};\n\n\n/**\n * Case-insensitive suffix-checker.\n * @param {string} str The string to check.\n * @param {string} suffix A string to look for at the end of `str`.\n * @return {boolean} True if `str` ends with `suffix` (ignoring\n * case).\n * @see goog.string.caseInsensitiveEndsWith\n */\ngoog.string.internal.caseInsensitiveEndsWith = function(str, suffix) {\n 'use strict';\n return (\n goog.string.internal.caseInsensitiveCompare(\n suffix, str.substr(str.length - suffix.length, suffix.length)) == 0);\n};\n\n\n/**\n * Case-insensitive equality checker.\n * @param {string} str1 First string to check.\n * @param {string} str2 Second string to check.\n * @return {boolean} True if `str1` and `str2` are the same string,\n * ignoring case.\n * @see goog.string.caseInsensitiveEquals\n */\ngoog.string.internal.caseInsensitiveEquals = function(str1, str2) {\n 'use strict';\n return str1.toLowerCase() == str2.toLowerCase();\n};\n\n\n/**\n * Checks if a string is empty or contains only whitespaces.\n * @param {string} str The string to check.\n * @return {boolean} Whether `str` is empty or whitespace only.\n * @see goog.string.isEmptyOrWhitespace\n */\ngoog.string.internal.isEmptyOrWhitespace = function(str) {\n 'use strict';\n // testing length == 0 first is actually slower in all browsers (about the\n // same in Opera).\n // Since IE doesn't include non-breaking-space (0xa0) in their \\s character\n // class (as required by section 7.2 of the ECMAScript spec), we explicitly\n // include it in the regexp to enforce consistent cross-browser behavior.\n return /^[\\s\\xa0]*$/.test(str);\n};\n\n\n/**\n * Trims white spaces to the left and right of a string.\n * @param {string} str The string to trim.\n * @return {string} A trimmed copy of `str`.\n */\ngoog.string.internal.trim =\n (goog.TRUSTED_SITE && String.prototype.trim) ? function(str) {\n 'use strict';\n return str.trim();\n } : function(str) {\n 'use strict';\n // Since IE doesn't include non-breaking-space (0xa0) in their \\s\n // character class (as required by section 7.2 of the ECMAScript spec),\n // we explicitly include it in the regexp to enforce consistent\n // cross-browser behavior.\n // NOTE: We don't use String#replace because it might have side effects\n // causing this function to not compile to 0 bytes.\n return /^[\\s\\xa0]*([\\s\\S]*?)[\\s\\xa0]*$/.exec(str)[1];\n };\n\n\n/**\n * A string comparator that ignores case.\n * -1 = str1 less than str2\n * 0 = str1 equals str2\n * 1 = str1 greater than str2\n *\n * @param {string} str1 The string to compare.\n * @param {string} str2 The string to compare `str1` to.\n * @return {number} The comparator result, as described above.\n * @see goog.string.caseInsensitiveCompare\n */\ngoog.string.internal.caseInsensitiveCompare = function(str1, str2) {\n 'use strict';\n const test1 = String(str1).toLowerCase();\n const test2 = String(str2).toLowerCase();\n\n if (test1 < test2) {\n return -1;\n } else if (test1 == test2) {\n return 0;\n } else {\n return 1;\n }\n};\n\n\n/**\n * Converts \\n to <br>s or <br />s.\n * @param {string} str The string in which to convert newlines.\n * @param {boolean=} opt_xml Whether to use XML compatible tags.\n * @return {string} A copy of `str` with converted newlines.\n * @see goog.string.newLineToBr\n */\ngoog.string.internal.newLineToBr = function(str, opt_xml) {\n 'use strict';\n return str.replace(/(\\r\\n|\\r|\\n)/g, opt_xml ? '<br />' : '<br>');\n};\n\n\n/**\n * Escapes double quote '\"' and single quote '\\'' characters in addition to\n * '&', '<', and '>' so that a string can be included in an HTML tag attribute\n * value within double or single quotes.\n * @param {string} str string to be escaped.\n * @param {boolean=} opt_isLikelyToContainHtmlChars\n * @return {string} An escaped copy of `str`.\n * @see goog.string.htmlEscape\n */\ngoog.string.internal.htmlEscape = function(\n str, opt_isLikelyToContainHtmlChars) {\n 'use strict';\n if (opt_isLikelyToContainHtmlChars) {\n str = str.replace(goog.string.internal.AMP_RE_, '&amp;')\n .replace(goog.string.internal.LT_RE_, '&lt;')\n .replace(goog.string.internal.GT_RE_, '&gt;')\n .replace(goog.string.internal.QUOT_RE_, '&quot;')\n .replace(goog.string.internal.SINGLE_QUOTE_RE_, '&#39;')\n .replace(goog.string.internal.NULL_RE_, '&#0;');\n return str;\n\n } else {\n // quick test helps in the case when there are no chars to replace, in\n // worst case this makes barely a difference to the time taken\n if (!goog.string.internal.ALL_RE_.test(str)) return str;\n\n // str.indexOf is faster than regex.test in this case\n if (str.indexOf('&') != -1) {\n str = str.replace(goog.string.internal.AMP_RE_, '&amp;');\n }\n if (str.indexOf('<') != -1) {\n str = str.replace(goog.string.internal.LT_RE_, '&lt;');\n }\n if (str.indexOf('>') != -1) {\n str = str.replace(goog.string.internal.GT_RE_, '&gt;');\n }\n if (str.indexOf('\"') != -1) {\n str = str.replace(goog.string.internal.QUOT_RE_, '&quot;');\n }\n if (str.indexOf('\\'') != -1) {\n str = str.replace(goog.string.internal.SINGLE_QUOTE_RE_, '&#39;');\n }\n if (str.indexOf('\\x00') != -1) {\n str = str.replace(goog.string.internal.NULL_RE_, '&#0;');\n }\n return str;\n }\n};\n\n\n/**\n * Regular expression that matches an ampersand, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.AMP_RE_ = /&/g;\n\n\n/**\n * Regular expression that matches a less than sign, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.LT_RE_ = /</g;\n\n\n/**\n * Regular expression that matches a greater than sign, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.GT_RE_ = />/g;\n\n\n/**\n * Regular expression that matches a double quote, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.QUOT_RE_ = /\"/g;\n\n\n/**\n * Regular expression that matches a single quote, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.SINGLE_QUOTE_RE_ = /'/g;\n\n\n/**\n * Regular expression that matches null character, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.NULL_RE_ = /\\x00/g;\n\n\n/**\n * Regular expression that matches any character that needs to be escaped.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.ALL_RE_ = /[\\x00&<>\"']/;\n\n\n/**\n * Do escaping of whitespace to preserve spatial formatting. We use character\n * entity #160 to make it safer for xml.\n * @param {string} str The string in which to escape whitespace.\n * @param {boolean=} opt_xml Whether to use XML compatible tags.\n * @return {string} An escaped copy of `str`.\n * @see goog.string.whitespaceEscape\n */\ngoog.string.internal.whitespaceEscape = function(str, opt_xml) {\n 'use strict';\n // This doesn't use goog.string.preserveSpaces for backwards compatibility.\n return goog.string.internal.newLineToBr(\n str.replace(/ /g, ' &#160;'), opt_xml);\n};\n\n\n/**\n * Determines whether a string contains a substring.\n * @param {string} str The string to search.\n * @param {string} subString The substring to search for.\n * @return {boolean} Whether `str` contains `subString`.\n * @see goog.string.contains\n */\ngoog.string.internal.contains = function(str, subString) {\n 'use strict';\n return str.indexOf(subString) != -1;\n};\n\n\n/**\n * Determines whether a string contains a substring, ignoring case.\n * @param {string} str The string to search.\n * @param {string} subString The substring to search for.\n * @return {boolean} Whether `str` contains `subString`.\n * @see goog.string.caseInsensitiveContains\n */\ngoog.string.internal.caseInsensitiveContains = function(str, subString) {\n 'use strict';\n return goog.string.internal.contains(\n str.toLowerCase(), subString.toLowerCase());\n};\n\n\n/**\n * Compares two version numbers.\n *\n * @param {string|number} version1 Version of first item.\n * @param {string|number} version2 Version of second item.\n *\n * @return {number} 1 if `version1` is higher.\n * 0 if arguments are equal.\n * -1 if `version2` is higher.\n * @see goog.string.compareVersions\n */\ngoog.string.internal.compareVersions = function(version1, version2) {\n 'use strict';\n let order = 0;\n // Trim leading and trailing whitespace and split the versions into\n // subversions.\n const v1Subs = goog.string.internal.trim(String(version1)).split('.');\n const v2Subs = goog.string.internal.trim(String(version2)).split('.');\n const subCount = Math.max(v1Subs.length, v2Subs.length);\n\n // Iterate over the subversions, as long as they appear to be equivalent.\n for (let subIdx = 0; order == 0 && subIdx < subCount; subIdx++) {\n let v1Sub = v1Subs[subIdx] || '';\n let v2Sub = v2Subs[subIdx] || '';\n\n do {\n // Split the subversions into pairs of numbers and qualifiers (like 'b').\n // Two different RegExp objects are use to make it clear the code\n // is side-effect free\n const v1Comp = /(\\d*)(\\D*)(.*)/.exec(v1Sub) || ['', '', '', ''];\n const v2Comp = /(\\d*)(\\D*)(.*)/.exec(v2Sub) || ['', '', '', ''];\n // Break if there are no more matches.\n if (v1Comp[0].length == 0 && v2Comp[0].length == 0) {\n break;\n }\n\n // Parse the numeric part of the subversion. A missing number is\n // equivalent to 0.\n const v1CompNum = v1Comp[1].length == 0 ? 0 : parseInt(v1Comp[1], 10);\n const v2CompNum = v2Comp[1].length == 0 ? 0 : parseInt(v2Comp[1], 10);\n\n // Compare the subversion components. The number has the highest\n // precedence. Next, if the numbers are equal, a subversion without any\n // qualifier is always higher than a subversion with any qualifier. Next,\n // the qualifiers are compared as strings.\n order = goog.string.internal.compareElements_(v1CompNum, v2CompNum) ||\n goog.string.internal.compareElements_(\n v1Comp[2].length == 0, v2Comp[2].length == 0) ||\n goog.string.internal.compareElements_(v1Comp[2], v2Comp[2]);\n // Stop as soon as an inequality is discovered.\n\n v1Sub = v1Comp[3];\n v2Sub = v2Comp[3];\n } while (order == 0);\n }\n\n return order;\n};\n\n\n/**\n * Compares elements of a version number.\n *\n * @param {string|number|boolean} left An element from a version number.\n * @param {string|number|boolean} right An element from a version number.\n *\n * @return {number} 1 if `left` is higher.\n * 0 if arguments are equal.\n * -1 if `right` is higher.\n * @private\n */\ngoog.string.internal.compareElements_ = function(left, right) {\n 'use strict';\n if (left < right) {\n return -1;\n } else if (left > right) {\n return 1;\n }\n return 0;\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Utilities used by goog.labs.userAgent tools. These functions\n * should not be used outside of goog.labs.userAgent.*.\n *\n */\n\ngoog.provide('goog.labs.userAgent.util');\n\ngoog.require('goog.string.internal');\n\n\n/**\n * Gets the native userAgent string from navigator if it exists.\n * If navigator or navigator.userAgent string is missing, returns an empty\n * string.\n * @return {string}\n * @private\n */\ngoog.labs.userAgent.util.getNativeUserAgentString_ = function() {\n 'use strict';\n var navigator = goog.labs.userAgent.util.getNavigator_();\n if (navigator) {\n var userAgent = navigator.userAgent;\n if (userAgent) {\n return userAgent;\n }\n }\n return '';\n};\n\n\n/**\n * Getter for the native navigator.\n * This is a separate function so it can be stubbed out in testing.\n * @return {!Navigator}\n * @private\n */\ngoog.labs.userAgent.util.getNavigator_ = function() {\n 'use strict';\n return goog.global.navigator;\n};\n\n\n/**\n * A possible override for applications which wish to not check\n * navigator.userAgent but use a specified value for detection instead.\n * @private {string}\n */\ngoog.labs.userAgent.util.userAgent_ =\n goog.labs.userAgent.util.getNativeUserAgentString_();\n\n\n/**\n * Applications may override browser detection on the built in\n * navigator.userAgent object by setting this string. Set to null to use the\n * browser object instead.\n * @param {?string=} opt_userAgent The User-Agent override.\n * @return {void}\n */\ngoog.labs.userAgent.util.setUserAgent = function(opt_userAgent) {\n 'use strict';\n goog.labs.userAgent.util.userAgent_ =\n opt_userAgent || goog.labs.userAgent.util.getNativeUserAgentString_();\n};\n\n\n/**\n * @return {string} The user agent string.\n */\ngoog.labs.userAgent.util.getUserAgent = function() {\n 'use strict';\n return goog.labs.userAgent.util.userAgent_;\n};\n\n\n/**\n * @param {string} str\n * @return {boolean} Whether the user agent contains the given string.\n */\ngoog.labs.userAgent.util.matchUserAgent = function(str) {\n 'use strict';\n var userAgent = goog.labs.userAgent.util.getUserAgent();\n return goog.string.internal.contains(userAgent, str);\n};\n\n\n/**\n * @param {string} str\n * @return {boolean} Whether the user agent contains the given string, ignoring\n * case.\n */\ngoog.labs.userAgent.util.matchUserAgentIgnoreCase = function(str) {\n 'use strict';\n var userAgent = goog.labs.userAgent.util.getUserAgent();\n return goog.string.internal.caseInsensitiveContains(userAgent, str);\n};\n\n\n/**\n * Parses the user agent into tuples for each section.\n * @param {string} userAgent\n * @return {!Array<!Array<string>>} Tuples of key, version, and the contents\n * of the parenthetical.\n */\ngoog.labs.userAgent.util.extractVersionTuples = function(userAgent) {\n 'use strict';\n // Matches each section of a user agent string.\n // Example UA:\n // Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us)\n // AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405\n // This has three version tuples: Mozilla, AppleWebKit, and Mobile.\n\n var versionRegExp = new RegExp(\n // Key. Note that a key may have a space.\n // (i.e. 'Mobile Safari' in 'Mobile Safari/5.0')\n '(\\\\w[\\\\w ]+)' +\n\n '/' + // slash\n '([^\\\\s]+)' + // version (i.e. '5.0b')\n '\\\\s*' + // whitespace\n '(?:\\\\((.*?)\\\\))?', // parenthetical info. parentheses not matched.\n 'g');\n\n var data = [];\n var match;\n\n // Iterate and collect the version tuples. Each iteration will be the\n // next regex match.\n while (match = versionRegExp.exec(userAgent)) {\n data.push([\n match[1], // key\n match[2], // value\n // || undefined as this is not undefined in IE7 and IE8\n match[3] || undefined // info\n ]);\n }\n\n return data;\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Utilities for manipulating objects/maps/hashes.\n */\n\ngoog.provide('goog.object');\n\n\n/**\n * Calls a function for each element in an object/map/hash.\n *\n * @param {Object<K,V>} obj The object over which to iterate.\n * @param {function(this:T,V,?,Object<K,V>):?} f The function to call\n * for every element. This function takes 3 arguments (the value, the\n * key and the object) and the return value is ignored.\n * @param {T=} opt_obj This is used as the 'this' object within f.\n * @return {void}\n * @template T,K,V\n */\ngoog.object.forEach = function(obj, f, opt_obj) {\n 'use strict';\n for (const key in obj) {\n f.call(/** @type {?} */ (opt_obj), obj[key], key, obj);\n }\n};\n\n\n/**\n * Calls a function for each element in an object/map/hash. If that call returns\n * true, adds the element to a new object.\n *\n * @param {Object<K,V>} obj The object over which to iterate.\n * @param {function(this:T,V,?,Object<K,V>):boolean} f The function to call\n * for every element. This\n * function takes 3 arguments (the value, the key and the object)\n * and should return a boolean. If the return value is true the\n * element is added to the result object. If it is false the\n * element is not included.\n * @param {T=} opt_obj This is used as the 'this' object within f.\n * @return {!Object<K,V>} a new object in which only elements that passed the\n * test are present.\n * @template T,K,V\n */\ngoog.object.filter = function(obj, f, opt_obj) {\n 'use strict';\n const res = {};\n for (const key in obj) {\n if (f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {\n res[key] = obj[key];\n }\n }\n return res;\n};\n\n\n/**\n * For every element in an object/map/hash calls a function and inserts the\n * result into a new object.\n *\n * @param {Object<K,V>} obj The object over which to iterate.\n * @param {function(this:T,V,?,Object<K,V>):R} f The function to call\n * for every element. This function\n * takes 3 arguments (the value, the key and the object)\n * and should return something. The result will be inserted\n * into a new object.\n * @param {T=} opt_obj This is used as the 'this' object within f.\n * @return {!Object<K,R>} a new object with the results from f.\n * @template T,K,V,R\n */\ngoog.object.map = function(obj, f, opt_obj) {\n 'use strict';\n const res = {};\n for (const key in obj) {\n res[key] = f.call(/** @type {?} */ (opt_obj), obj[key], key, obj);\n }\n return res;\n};\n\n\n/**\n * Calls a function for each element in an object/map/hash. If any\n * call returns true, returns true (without checking the rest). If\n * all calls return false, returns false.\n *\n * @param {Object<K,V>} obj The object to check.\n * @param {function(this:T,V,?,Object<K,V>):boolean} f The function to\n * call for every element. This function\n * takes 3 arguments (the value, the key and the object) and should\n * return a boolean.\n * @param {T=} opt_obj This is used as the 'this' object within f.\n * @return {boolean} true if any element passes the test.\n * @template T,K,V\n */\ngoog.object.some = function(obj, f, opt_obj) {\n 'use strict';\n for (const key in obj) {\n if (f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {\n return true;\n }\n }\n return false;\n};\n\n\n/**\n * Calls a function for each element in an object/map/hash. If\n * all calls return true, returns true. If any call returns false, returns\n * false at this point and does not continue to check the remaining elements.\n *\n * @param {Object<K,V>} obj The object to check.\n * @param {?function(this:T,V,?,Object<K,V>):boolean} f The function to\n * call for every element. This function\n * takes 3 arguments (the value, the key and the object) and should\n * return a boolean.\n * @param {T=} opt_obj This is used as the 'this' object within f.\n * @return {boolean} false if any element fails the test.\n * @template T,K,V\n */\ngoog.object.every = function(obj, f, opt_obj) {\n 'use strict';\n for (const key in obj) {\n if (!f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {\n return false;\n }\n }\n return true;\n};\n\n\n/**\n * Returns the number of key-value pairs in the object map.\n *\n * @param {Object} obj The object for which to get the number of key-value\n * pairs.\n * @return {number} The number of key-value pairs in the object map.\n */\ngoog.object.getCount = function(obj) {\n 'use strict';\n let rv = 0;\n for (const key in obj) {\n rv++;\n }\n return rv;\n};\n\n\n/**\n * Returns one key from the object map, if any exists.\n * For map literals the returned key will be the first one in most of the\n * browsers (a know exception is Konqueror).\n *\n * @param {Object} obj The object to pick a key from.\n * @return {string|undefined} The key or undefined if the object is empty.\n */\ngoog.object.getAnyKey = function(obj) {\n 'use strict';\n for (const key in obj) {\n return key;\n }\n};\n\n\n/**\n * Returns one value from the object map, if any exists.\n * For map literals the returned value will be the first one in most of the\n * browsers (a know exception is Konqueror).\n *\n * @param {Object<K,V>} obj The object to pick a value from.\n * @return {V|undefined} The value or undefined if the object is empty.\n * @template K,V\n */\ngoog.object.getAnyValue = function(obj) {\n 'use strict';\n for (const key in obj) {\n return obj[key];\n }\n};\n\n\n/**\n * Whether the object/hash/map contains the given object as a value.\n * An alias for goog.object.containsValue(obj, val).\n *\n * @param {Object<K,V>} obj The object in which to look for val.\n * @param {V} val The object for which to check.\n * @return {boolean} true if val is present.\n * @template K,V\n */\ngoog.object.contains = function(obj, val) {\n 'use strict';\n return goog.object.containsValue(obj, val);\n};\n\n\n/**\n * Returns the values of the object/map/hash.\n *\n * @param {Object<K,V>} obj The object from which to get the values.\n * @return {!Array<V>} The values in the object/map/hash.\n * @template K,V\n */\ngoog.object.getValues = function(obj) {\n 'use strict';\n const res = [];\n let i = 0;\n for (const key in obj) {\n res[i++] = obj[key];\n }\n return res;\n};\n\n\n/**\n * Returns the keys of the object/map/hash.\n *\n * @param {Object} obj The object from which to get the keys.\n * @return {!Array<string>} Array of property keys.\n */\ngoog.object.getKeys = function(obj) {\n 'use strict';\n const res = [];\n let i = 0;\n for (const key in obj) {\n res[i++] = key;\n }\n return res;\n};\n\n\n/**\n * Get a value from an object multiple levels deep. This is useful for\n * pulling values from deeply nested objects, such as JSON responses.\n * Example usage: getValueByKeys(jsonObj, 'foo', 'entries', 3)\n *\n * @param {!Object} obj An object to get the value from. Can be array-like.\n * @param {...(string|number|!IArrayLike<number|string>)}\n * var_args A number of keys\n * (as strings, or numbers, for array-like objects). Can also be\n * specified as a single array of keys.\n * @return {*} The resulting value. If, at any point, the value for a key\n * in the current object is null or undefined, returns undefined.\n */\ngoog.object.getValueByKeys = function(obj, var_args) {\n 'use strict';\n const isArrayLike = goog.isArrayLike(var_args);\n const keys = isArrayLike ?\n /** @type {!IArrayLike<number|string>} */ (var_args) :\n arguments;\n\n // Start with the 2nd parameter for the variable parameters syntax.\n for (let i = isArrayLike ? 0 : 1; i < keys.length; i++) {\n if (obj == null) return undefined;\n obj = obj[keys[i]];\n }\n\n return obj;\n};\n\n\n/**\n * Whether the object/map/hash contains the given key.\n *\n * @param {Object} obj The object in which to look for key.\n * @param {?} key The key for which to check.\n * @return {boolean} true If the map contains the key.\n */\ngoog.object.containsKey = function(obj, key) {\n 'use strict';\n return obj !== null && key in obj;\n};\n\n\n/**\n * Whether the object/map/hash contains the given value. This is O(n).\n *\n * @param {Object<K,V>} obj The object in which to look for val.\n * @param {V} val The value for which to check.\n * @return {boolean} true If the map contains the value.\n * @template K,V\n */\ngoog.object.containsValue = function(obj, val) {\n 'use strict';\n for (const key in obj) {\n if (obj[key] == val) {\n return true;\n }\n }\n return false;\n};\n\n\n/**\n * Searches an object for an element that satisfies the given condition and\n * returns its key.\n * @param {Object<K,V>} obj The object to search in.\n * @param {function(this:T,V,string,Object<K,V>):boolean} f The\n * function to call for every element. Takes 3 arguments (the value,\n * the key and the object) and should return a boolean.\n * @param {T=} opt_this An optional \"this\" context for the function.\n * @return {string|undefined} The key of an element for which the function\n * returns true or undefined if no such element is found.\n * @template T,K,V\n */\ngoog.object.findKey = function(obj, f, opt_this) {\n 'use strict';\n for (const key in obj) {\n if (f.call(/** @type {?} */ (opt_this), obj[key], key, obj)) {\n return key;\n }\n }\n return undefined;\n};\n\n\n/**\n * Searches an object for an element that satisfies the given condition and\n * returns its value.\n * @param {Object<K,V>} obj The object to search in.\n * @param {function(this:T,V,string,Object<K,V>):boolean} f The function\n * to call for every element. Takes 3 arguments (the value, the key\n * and the object) and should return a boolean.\n * @param {T=} opt_this An optional \"this\" context for the function.\n * @return {V} The value of an element for which the function returns true or\n * undefined if no such element is found.\n * @template T,K,V\n */\ngoog.object.findValue = function(obj, f, opt_this) {\n 'use strict';\n const key = goog.object.findKey(obj, f, opt_this);\n return key && obj[key];\n};\n\n\n/**\n * Whether the object/map/hash is empty.\n *\n * @param {Object} obj The object to test.\n * @return {boolean} true if obj is empty.\n */\ngoog.object.isEmpty = function(obj) {\n 'use strict';\n for (const key in obj) {\n return false;\n }\n return true;\n};\n\n\n/**\n * Removes all key value pairs from the object/map/hash.\n *\n * @param {Object} obj The object to clear.\n * @return {void}\n */\ngoog.object.clear = function(obj) {\n 'use strict';\n for (const i in obj) {\n delete obj[i];\n }\n};\n\n\n/**\n * Removes a key-value pair based on the key.\n *\n * @param {Object} obj The object from which to remove the key.\n * @param {?} key The key to remove.\n * @return {boolean} Whether an element was removed.\n */\ngoog.object.remove = function(obj, key) {\n 'use strict';\n let rv;\n if (rv = key in /** @type {!Object} */ (obj)) {\n delete obj[key];\n }\n return rv;\n};\n\n\n/**\n * Adds a key-value pair to the object. Throws an exception if the key is\n * already in use. Use set if you want to change an existing pair.\n *\n * @param {Object<K,V>} obj The object to which to add the key-value pair.\n * @param {string} key The key to add.\n * @param {V} val The value to add.\n * @return {void}\n * @template K,V\n */\ngoog.object.add = function(obj, key, val) {\n 'use strict';\n if (obj !== null && key in obj) {\n throw new Error('The object already contains the key \"' + key + '\"');\n }\n goog.object.set(obj, key, val);\n};\n\n\n/**\n * Returns the value for the given key.\n *\n * @param {Object<K,V>} obj The object from which to get the value.\n * @param {string} key The key for which to get the value.\n * @param {R=} opt_val The value to return if no item is found for the given\n * key (default is undefined).\n * @return {V|R|undefined} The value for the given key.\n * @template K,V,R\n */\ngoog.object.get = function(obj, key, opt_val) {\n 'use strict';\n if (obj !== null && key in obj) {\n return obj[key];\n }\n return opt_val;\n};\n\n\n/**\n * Adds a key-value pair to the object/map/hash.\n *\n * @param {Object<K,V>} obj The object to which to add the key-value pair.\n * @param {string} key The key to add.\n * @param {V} value The value to add.\n * @template K,V\n * @return {void}\n */\ngoog.object.set = function(obj, key, value) {\n 'use strict';\n obj[key] = value;\n};\n\n\n/**\n * Adds a key-value pair to the object/map/hash if it doesn't exist yet.\n *\n * @param {Object<K,V>} obj The object to which to add the key-value pair.\n * @param {string} key The key to add.\n * @param {V} value The value to add if the key wasn't present.\n * @return {V} The value of the entry at the end of the function.\n * @template K,V\n */\ngoog.object.setIfUndefined = function(obj, key, value) {\n 'use strict';\n return key in /** @type {!Object} */ (obj) ? obj[key] : (obj[key] = value);\n};\n\n\n/**\n * Sets a key and value to an object if the key is not set. The value will be\n * the return value of the given function. If the key already exists, the\n * object will not be changed and the function will not be called (the function\n * will be lazily evaluated -- only called if necessary).\n *\n * This function is particularly useful when used with an `Object` which is\n * acting as a cache.\n *\n * @param {!Object<K,V>} obj The object to which to add the key-value pair.\n * @param {string} key The key to add.\n * @param {function():V} f The value to add if the key wasn't present.\n * @return {V} The value of the entry at the end of the function.\n * @template K,V\n */\ngoog.object.setWithReturnValueIfNotSet = function(obj, key, f) {\n 'use strict';\n if (key in obj) {\n return obj[key];\n }\n\n const val = f();\n obj[key] = val;\n return val;\n};\n\n\n/**\n * Compares two objects for equality using === on the values.\n *\n * @param {!Object<K,V>} a\n * @param {!Object<K,V>} b\n * @return {boolean}\n * @template K,V\n */\ngoog.object.equals = function(a, b) {\n 'use strict';\n for (const k in a) {\n if (!(k in b) || a[k] !== b[k]) {\n return false;\n }\n }\n for (const k in b) {\n if (!(k in a)) {\n return false;\n }\n }\n return true;\n};\n\n\n/**\n * Returns a shallow clone of the object.\n *\n * @param {Object<K,V>} obj Object to clone.\n * @return {!Object<K,V>} Clone of the input object.\n * @template K,V\n */\ngoog.object.clone = function(obj) {\n 'use strict';\n const res = {};\n for (const key in obj) {\n res[key] = obj[key];\n }\n return res;\n};\n\n\n/**\n * Clones a value. The input may be an Object, Array, or basic type. Objects and\n * arrays will be cloned recursively.\n *\n * WARNINGS:\n * <code>goog.object.unsafeClone</code> does not detect reference loops. Objects\n * that refer to themselves will cause infinite recursion.\n *\n * <code>goog.object.unsafeClone</code> is unaware of unique identifiers, and\n * copies UIDs created by <code>getUid</code> into cloned results.\n *\n * @param {T} obj The value to clone.\n * @return {T} A clone of the input value.\n * @template T\n */\ngoog.object.unsafeClone = function(obj) {\n 'use strict';\n if (!obj || typeof obj !== 'object') return obj;\n if (typeof obj.clone === 'function') return obj.clone();\n const clone = Array.isArray(obj) ? [] :\n typeof ArrayBuffer === 'function' &&\n typeof ArrayBuffer.isView === 'function' && ArrayBuffer.isView(obj) &&\n !(obj instanceof DataView) ?\n new obj.constructor(obj.length) :\n {};\n for (const key in obj) {\n clone[key] = goog.object.unsafeClone(obj[key]);\n }\n return clone;\n};\n\n\n/**\n * Returns a new object in which all the keys and values are interchanged\n * (keys become values and values become keys). If multiple keys map to the\n * same value, the chosen transposed value is implementation-dependent.\n *\n * @param {Object} obj The object to transpose.\n * @return {!Object} The transposed object.\n */\ngoog.object.transpose = function(obj) {\n 'use strict';\n const transposed = {};\n for (const key in obj) {\n transposed[obj[key]] = key;\n }\n return transposed;\n};\n\n\n/**\n * The names of the fields that are defined on Object.prototype.\n * @type {Array<string>}\n * @private\n */\ngoog.object.PROTOTYPE_FIELDS_ = [\n 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n 'toLocaleString', 'toString', 'valueOf'\n];\n\n\n/**\n * Extends an object with another object.\n * This operates 'in-place'; it does not create a new Object.\n *\n * Example:\n * var o = {};\n * goog.object.extend(o, {a: 0, b: 1});\n * o; // {a: 0, b: 1}\n * goog.object.extend(o, {b: 2, c: 3});\n * o; // {a: 0, b: 2, c: 3}\n *\n * @param {Object} target The object to modify. Existing properties will be\n * overwritten if they are also present in one of the objects in\n * `var_args`.\n * @param {...(Object|null|undefined)} var_args The objects from which values\n * will be copied.\n * @return {void}\n * @deprecated Prefer Object.assign\n */\ngoog.object.extend = function(target, var_args) {\n 'use strict';\n let key;\n let source;\n for (let i = 1; i < arguments.length; i++) {\n source = arguments[i];\n for (key in source) {\n target[key] = source[key];\n }\n\n // For IE the for-in-loop does not contain any properties that are not\n // enumerable on the prototype object (for example isPrototypeOf from\n // Object.prototype) and it will also not include 'replace' on objects that\n // extend String and change 'replace' (not that it is common for anyone to\n // extend anything except Object).\n\n for (let j = 0; j < goog.object.PROTOTYPE_FIELDS_.length; j++) {\n key = goog.object.PROTOTYPE_FIELDS_[j];\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n};\n\n\n/**\n * Creates a new object built from the key-value pairs provided as arguments.\n * @param {...*} var_args If only one argument is provided and it is an array\n * then this is used as the arguments, otherwise even arguments are used as\n * the property names and odd arguments are used as the property values.\n * @return {!Object} The new object.\n * @throws {Error} If there are uneven number of arguments or there is only one\n * non array argument.\n */\ngoog.object.create = function(var_args) {\n 'use strict';\n const argLength = arguments.length;\n if (argLength == 1 && Array.isArray(arguments[0])) {\n return goog.object.create.apply(null, arguments[0]);\n }\n\n if (argLength % 2) {\n throw new Error('Uneven number of arguments');\n }\n\n const rv = {};\n for (let i = 0; i < argLength; i += 2) {\n rv[arguments[i]] = arguments[i + 1];\n }\n return rv;\n};\n\n\n/**\n * Creates a new object where the property names come from the arguments but\n * the value is always set to true\n * @param {...*} var_args If only one argument is provided and it is an array\n * then this is used as the arguments, otherwise the arguments are used\n * as the property names.\n * @return {!Object} The new object.\n */\ngoog.object.createSet = function(var_args) {\n 'use strict';\n const argLength = arguments.length;\n if (argLength == 1 && Array.isArray(arguments[0])) {\n return goog.object.createSet.apply(null, arguments[0]);\n }\n\n const rv = {};\n for (let i = 0; i < argLength; i++) {\n rv[arguments[i]] = true;\n }\n return rv;\n};\n\n\n/**\n * Creates an immutable view of the underlying object, if the browser\n * supports immutable objects.\n *\n * In default mode, writes to this view will fail silently. In strict mode,\n * they will throw an error.\n *\n * @param {!Object<K,V>} obj An object.\n * @return {!Object<K,V>} An immutable view of that object, or the\n * original object if this browser does not support immutables.\n * @template K,V\n */\ngoog.object.createImmutableView = function(obj) {\n 'use strict';\n let result = obj;\n if (Object.isFrozen && !Object.isFrozen(obj)) {\n result = Object.create(obj);\n Object.freeze(result);\n }\n return result;\n};\n\n\n/**\n * @param {!Object} obj An object.\n * @return {boolean} Whether this is an immutable view of the object.\n */\ngoog.object.isImmutableView = function(obj) {\n 'use strict';\n return !!Object.isFrozen && Object.isFrozen(obj);\n};\n\n\n/**\n * Get all properties names on a given Object regardless of enumerability.\n *\n * <p> If the browser does not support `Object.getOwnPropertyNames` nor\n * `Object.getPrototypeOf` then this is equivalent to using\n * `goog.object.getKeys`\n *\n * @param {?Object} obj The object to get the properties of.\n * @param {boolean=} opt_includeObjectPrototype Whether properties defined on\n * `Object.prototype` should be included in the result.\n * @param {boolean=} opt_includeFunctionPrototype Whether properties defined on\n * `Function.prototype` should be included in the result.\n * @return {!Array<string>}\n * @public\n */\ngoog.object.getAllPropertyNames = function(\n obj, opt_includeObjectPrototype, opt_includeFunctionPrototype) {\n 'use strict';\n if (!obj) {\n return [];\n }\n\n // Naively use a for..in loop to get the property names if the browser doesn't\n // support any other APIs for getting it.\n if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {\n return goog.object.getKeys(obj);\n }\n\n const visitedSet = {};\n\n // Traverse the prototype chain and add all properties to the visited set.\n let proto = obj;\n while (proto &&\n (proto !== Object.prototype || !!opt_includeObjectPrototype) &&\n (proto !== Function.prototype || !!opt_includeFunctionPrototype)) {\n const names = Object.getOwnPropertyNames(proto);\n for (let i = 0; i < names.length; i++) {\n visitedSet[names[i]] = true;\n }\n proto = Object.getPrototypeOf(proto);\n }\n\n return goog.object.getKeys(visitedSet);\n};\n\n\n/**\n * Given a ES5 or ES6 class reference, return its super class / super\n * constructor.\n *\n * This should be used in rare cases where you need to walk up the inheritance\n * tree (this is generally a bad idea). But this work with ES5 and ES6 classes,\n * unlike relying on the superClass_ property.\n *\n * Note: To start walking up the hierarchy from an instance call this with its\n * `constructor` property; e.g. `getSuperClass(instance.constructor)`.\n *\n * @param {function(new: ?)} constructor\n * @return {?Object}\n */\ngoog.object.getSuperClass = function(constructor) {\n 'use strict';\n var proto = Object.getPrototypeOf(constructor.prototype);\n return proto && proto.constructor;\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Useful compiler idioms.\n */\n\ngoog.provide('goog.reflect');\n\n\n/**\n * Syntax for object literal casts.\n * @see http://go/jscompiler-renaming\n * @see https://goo.gl/CRs09P\n *\n * Use this if you have an object literal whose keys need to have the same names\n * as the properties of some class even after they are renamed by the compiler.\n *\n * @param {!Function} type Type to cast to.\n * @param {Object} object Object literal to cast.\n * @return {Object} The object literal.\n */\ngoog.reflect.object = function(type, object) {\n 'use strict';\n return object;\n};\n\n/**\n * Syntax for renaming property strings.\n * @see http://go/jscompiler-renaming\n * @see https://goo.gl/CRs09P\n *\n * Use this if you have an need to access a property as a string, but want\n * to also have the property renamed by the compiler. In contrast to\n * goog.reflect.object, this method takes an instance of an object.\n *\n * Properties must be simple names (not qualified names).\n *\n * @param {string} prop Name of the property\n * @param {!Object} object Instance of the object whose type will be used\n * for renaming\n * @return {string} The renamed property.\n */\ngoog.reflect.objectProperty = function(prop, object) {\n 'use strict';\n return prop;\n};\n\n/**\n * To assert to the compiler that an operation is needed when it would\n * otherwise be stripped. For example:\n * <code>\n * // Force a layout\n * goog.reflect.sinkValue(dialog.offsetHeight);\n * </code>\n * @param {T} x\n * @return {T}\n * @template T\n */\ngoog.reflect.sinkValue = function(x) {\n 'use strict';\n goog.reflect.sinkValue[' '](x);\n return x;\n};\n\n\n/**\n * The compiler should optimize this function away iff no one ever uses\n * goog.reflect.sinkValue.\n */\ngoog.reflect.sinkValue[' '] = goog.nullFunction;\n\n\n/**\n * Check if a property can be accessed without throwing an exception.\n * @param {Object} obj The owner of the property.\n * @param {string} prop The property name.\n * @return {boolean} Whether the property is accessible. Will also return true\n * if obj is null.\n */\ngoog.reflect.canAccessProperty = function(obj, prop) {\n 'use strict';\n try {\n goog.reflect.sinkValue(obj[prop]);\n return true;\n } catch (e) {\n }\n return false;\n};\n\n\n/**\n * Retrieves a value from a cache given a key. The compiler provides special\n * consideration for this call such that it is generally considered side-effect\n * free. However, if the `opt_keyFn` or `valueFn` have side-effects\n * then the entire call is considered to have side-effects.\n *\n * Conventionally storing the value on the cache would be considered a\n * side-effect and preclude unused calls from being pruned, ie. even if\n * the value was never used, it would still always be stored in the cache.\n *\n * Providing a side-effect free `valueFn` and `opt_keyFn`\n * allows unused calls to `goog.reflect.cache` to be pruned.\n *\n * @param {!Object<K, V>} cacheObj The object that contains the cached values.\n * @param {?} key The key to lookup in the cache. If it is not string or number\n * then a `opt_keyFn` should be provided. The key is also used as the\n * parameter to the `valueFn`.\n * @param {function(?):V} valueFn The value provider to use to calculate the\n * value to store in the cache. This function should be side-effect free\n * to take advantage of the optimization.\n * @param {function(?):K=} opt_keyFn The key provider to determine the cache\n * map key. This should be used if the given key is not a string or number.\n * If not provided then the given key is used. This function should be\n * side-effect free to take advantage of the optimization.\n * @return {V} The cached or calculated value.\n * @template K\n * @template V\n */\ngoog.reflect.cache = function(cacheObj, key, valueFn, opt_keyFn) {\n 'use strict';\n const storedKey = opt_keyFn ? opt_keyFn(key) : key;\n\n if (Object.prototype.hasOwnProperty.call(cacheObj, storedKey)) {\n return cacheObj[storedKey];\n }\n\n return (cacheObj[storedKey] = valueFn(key));\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Rendering engine detection.\n * @see <a href=\"http://www.useragentstring.com/\">User agent strings</a>\n * For information on the browser brand (such as Safari versus Chrome), see\n * goog.userAgent.product.\n * @see ../demos/useragent.html\n */\n\ngoog.provide('goog.userAgent');\n\ngoog.require('goog.labs.userAgent.browser');\ngoog.require('goog.labs.userAgent.engine');\ngoog.require('goog.labs.userAgent.platform');\ngoog.require('goog.labs.userAgent.util');\ngoog.require('goog.reflect');\ngoog.require('goog.string');\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is IE.\n */\ngoog.userAgent.ASSUME_IE = goog.define('goog.userAgent.ASSUME_IE', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is EDGE,\n * referring to EdgeHTML based Edge.\n */\ngoog.userAgent.ASSUME_EDGE = goog.define('goog.userAgent.ASSUME_EDGE', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is GECKO.\n */\ngoog.userAgent.ASSUME_GECKO = goog.define('goog.userAgent.ASSUME_GECKO', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is WEBKIT.\n */\ngoog.userAgent.ASSUME_WEBKIT =\n goog.define('goog.userAgent.ASSUME_WEBKIT', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is a\n * mobile device running WebKit e.g. iPhone or Android.\n */\ngoog.userAgent.ASSUME_MOBILE_WEBKIT =\n goog.define('goog.userAgent.ASSUME_MOBILE_WEBKIT', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is OPERA,\n * referring to Presto-based Opera.\n */\ngoog.userAgent.ASSUME_OPERA = goog.define('goog.userAgent.ASSUME_OPERA', false);\n\n\n/**\n * @define {boolean} Whether the\n * `goog.userAgent.isVersionOrHigher`\n * function will return true for any version.\n */\ngoog.userAgent.ASSUME_ANY_VERSION =\n goog.define('goog.userAgent.ASSUME_ANY_VERSION', false);\n\n\n/**\n * Whether we know the browser engine at compile-time.\n * @type {boolean}\n * @private\n */\ngoog.userAgent.BROWSER_KNOWN_ = goog.userAgent.ASSUME_IE ||\n goog.userAgent.ASSUME_EDGE || goog.userAgent.ASSUME_GECKO ||\n goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.ASSUME_WEBKIT ||\n goog.userAgent.ASSUME_OPERA;\n\n\n/**\n * Returns the userAgent string for the current browser.\n *\n * @return {string} The userAgent string.\n */\ngoog.userAgent.getUserAgentString = function() {\n 'use strict';\n return goog.labs.userAgent.util.getUserAgent();\n};\n\n\n/**\n * @return {?Navigator} The native navigator object.\n */\ngoog.userAgent.getNavigatorTyped = function() {\n 'use strict';\n // Need a local navigator reference instead of using the global one,\n // to avoid the rare case where they reference different objects.\n // (in a WorkerPool, for example).\n return goog.global['navigator'] || null;\n};\n\n\n/**\n * TODO(nnaze): Change type to \"Navigator\" and update compilation targets.\n * @return {?Object} The native navigator object.\n */\ngoog.userAgent.getNavigator = function() {\n 'use strict';\n return goog.userAgent.getNavigatorTyped();\n};\n\n\n/**\n * Whether the user agent is Presto-based Opera.\n * @type {boolean}\n */\ngoog.userAgent.OPERA = goog.userAgent.BROWSER_KNOWN_ ?\n goog.userAgent.ASSUME_OPERA :\n goog.labs.userAgent.browser.isOpera();\n\n\n/**\n * Whether the user agent is Internet Explorer.\n * @type {boolean}\n */\ngoog.userAgent.IE = goog.userAgent.BROWSER_KNOWN_ ?\n goog.userAgent.ASSUME_IE :\n goog.labs.userAgent.browser.isIE();\n\n\n/**\n * Whether the user agent is Microsoft Edge (EdgeHTML based).\n * @type {boolean}\n */\ngoog.userAgent.EDGE = goog.userAgent.BROWSER_KNOWN_ ?\n goog.userAgent.ASSUME_EDGE :\n goog.labs.userAgent.engine.isEdge();\n\n\n/**\n * Whether the user agent is MS Internet Explorer or MS Edge (EdgeHTML based).\n * @type {boolean}\n */\ngoog.userAgent.EDGE_OR_IE = goog.userAgent.EDGE || goog.userAgent.IE;\n\n\n/**\n * Whether the user agent is Gecko. Gecko is the rendering engine used by\n * Mozilla, Firefox, and others.\n * @type {boolean}\n */\ngoog.userAgent.GECKO = goog.userAgent.BROWSER_KNOWN_ ?\n goog.userAgent.ASSUME_GECKO :\n goog.labs.userAgent.engine.isGecko();\n\n\n/**\n * Whether the user agent is WebKit. WebKit is the rendering engine that\n * Safari, Edge Chromium, Opera Chromium, Android and others use.\n * @type {boolean}\n */\ngoog.userAgent.WEBKIT = goog.userAgent.BROWSER_KNOWN_ ?\n goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_MOBILE_WEBKIT :\n goog.labs.userAgent.engine.isWebKit();\n\n\n/**\n * Whether the user agent is running on a mobile device.\n *\n * This is a separate function so that the logic can be tested.\n *\n * TODO(nnaze): Investigate swapping in goog.labs.userAgent.device.isMobile().\n *\n * @return {boolean} Whether the user agent is running on a mobile device.\n * @private\n */\ngoog.userAgent.isMobile_ = function() {\n 'use strict';\n return goog.userAgent.WEBKIT &&\n goog.labs.userAgent.util.matchUserAgent('Mobile');\n};\n\n\n/**\n * Whether the user agent is running on a mobile device.\n *\n * TODO(nnaze): Consider deprecating MOBILE when labs.userAgent\n * is promoted as the gecko/webkit logic is likely inaccurate.\n *\n * @type {boolean}\n */\ngoog.userAgent.MOBILE =\n goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.isMobile_();\n\n\n/**\n * Used while transitioning code to use WEBKIT instead.\n * @type {boolean}\n * @deprecated Use {@link goog.userAgent.product.SAFARI} instead.\n * TODO(nicksantos): Delete this from goog.userAgent.\n */\ngoog.userAgent.SAFARI = goog.userAgent.WEBKIT;\n\n\n/**\n * @return {string} the platform (operating system) the user agent is running\n * on. Default to empty string because navigator.platform may not be defined\n * (on Rhino, for example).\n * @private\n */\ngoog.userAgent.determinePlatform_ = function() {\n 'use strict';\n var navigator = goog.userAgent.getNavigatorTyped();\n return navigator && navigator.platform || '';\n};\n\n\n/**\n * The platform (operating system) the user agent is running on. Default to\n * empty string because navigator.platform may not be defined (on Rhino, for\n * example).\n * @type {string}\n */\ngoog.userAgent.PLATFORM = goog.userAgent.determinePlatform_();\n\n\n/**\n * @define {boolean} Whether the user agent is running on a Macintosh operating\n * system.\n */\ngoog.userAgent.ASSUME_MAC = goog.define('goog.userAgent.ASSUME_MAC', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on a Windows operating\n * system.\n */\ngoog.userAgent.ASSUME_WINDOWS =\n goog.define('goog.userAgent.ASSUME_WINDOWS', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on a Linux operating\n * system.\n */\ngoog.userAgent.ASSUME_LINUX = goog.define('goog.userAgent.ASSUME_LINUX', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on a X11 windowing\n * system.\n */\ngoog.userAgent.ASSUME_X11 = goog.define('goog.userAgent.ASSUME_X11', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on Android.\n */\ngoog.userAgent.ASSUME_ANDROID =\n goog.define('goog.userAgent.ASSUME_ANDROID', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on an iPhone.\n */\ngoog.userAgent.ASSUME_IPHONE =\n goog.define('goog.userAgent.ASSUME_IPHONE', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on an iPad.\n */\ngoog.userAgent.ASSUME_IPAD = goog.define('goog.userAgent.ASSUME_IPAD', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on an iPod.\n */\ngoog.userAgent.ASSUME_IPOD = goog.define('goog.userAgent.ASSUME_IPOD', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on KaiOS.\n */\ngoog.userAgent.ASSUME_KAIOS = goog.define('goog.userAgent.ASSUME_KAIOS', false);\n\n\n/**\n * @type {boolean}\n * @private\n */\ngoog.userAgent.PLATFORM_KNOWN_ = goog.userAgent.ASSUME_MAC ||\n goog.userAgent.ASSUME_WINDOWS || goog.userAgent.ASSUME_LINUX ||\n goog.userAgent.ASSUME_X11 || goog.userAgent.ASSUME_ANDROID ||\n goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD ||\n goog.userAgent.ASSUME_IPOD;\n\n\n/**\n * Whether the user agent is running on a Macintosh operating system.\n * @type {boolean}\n */\ngoog.userAgent.MAC = goog.userAgent.PLATFORM_KNOWN_ ?\n goog.userAgent.ASSUME_MAC :\n goog.labs.userAgent.platform.isMacintosh();\n\n\n/**\n * Whether the user agent is running on a Windows operating system.\n * @type {boolean}\n */\ngoog.userAgent.WINDOWS = goog.userAgent.PLATFORM_KNOWN_ ?\n goog.userAgent.ASSUME_WINDOWS :\n goog.labs.userAgent.platform.isWindows();\n\n\n/**\n * Whether the user agent is Linux per the legacy behavior of\n * goog.userAgent.LINUX, which considered ChromeOS to also be\n * Linux.\n * @return {boolean}\n * @private\n */\ngoog.userAgent.isLegacyLinux_ = function() {\n 'use strict';\n return goog.labs.userAgent.platform.isLinux() ||\n goog.labs.userAgent.platform.isChromeOS();\n};\n\n\n/**\n * Whether the user agent is running on a Linux operating system.\n *\n * Note that goog.userAgent.LINUX considers ChromeOS to be Linux,\n * while goog.labs.userAgent.platform considers ChromeOS and\n * Linux to be different OSes.\n *\n * @type {boolean}\n */\ngoog.userAgent.LINUX = goog.userAgent.PLATFORM_KNOWN_ ?\n goog.userAgent.ASSUME_LINUX :\n goog.userAgent.isLegacyLinux_();\n\n\n/**\n * @return {boolean} Whether the user agent is an X11 windowing system.\n * @private\n */\ngoog.userAgent.isX11_ = function() {\n 'use strict';\n var navigator = goog.userAgent.getNavigatorTyped();\n return !!navigator &&\n goog.string.contains(navigator['appVersion'] || '', 'X11');\n};\n\n\n/**\n * Whether the user agent is running on a X11 windowing system.\n * @type {boolean}\n */\ngoog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ?\n goog.userAgent.ASSUME_X11 :\n goog.userAgent.isX11_();\n\n\n/**\n * Whether the user agent is running on Android.\n * @type {boolean}\n */\ngoog.userAgent.ANDROID = goog.userAgent.PLATFORM_KNOWN_ ?\n goog.userAgent.ASSUME_ANDROID :\n goog.labs.userAgent.platform.isAndroid();\n\n\n/**\n * Whether the user agent is running on an iPhone.\n * @type {boolean}\n */\ngoog.userAgent.IPHONE = goog.userAgent.PLATFORM_KNOWN_ ?\n goog.userAgent.ASSUME_IPHONE :\n goog.labs.userAgent.platform.isIphone();\n\n\n/**\n * Whether the user agent is running on an iPad.\n * @type {boolean}\n */\ngoog.userAgent.IPAD = goog.userAgent.PLATFORM_KNOWN_ ?\n goog.userAgent.ASSUME_IPAD :\n goog.labs.userAgent.platform.isIpad();\n\n\n/**\n * Whether the user agent is running on an iPod.\n * @type {boolean}\n */\ngoog.userAgent.IPOD = goog.userAgent.PLATFORM_KNOWN_ ?\n goog.userAgent.ASSUME_IPOD :\n goog.labs.userAgent.platform.isIpod();\n\n\n/**\n * Whether the user agent is running on iOS.\n * @type {boolean}\n */\ngoog.userAgent.IOS = goog.userAgent.PLATFORM_KNOWN_ ?\n (goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD ||\n goog.userAgent.ASSUME_IPOD) :\n goog.labs.userAgent.platform.isIos();\n\n/**\n * Whether the user agent is running on KaiOS.\n * @type {boolean}\n */\ngoog.userAgent.KAIOS = goog.userAgent.PLATFORM_KNOWN_ ?\n goog.userAgent.ASSUME_KAIOS :\n goog.labs.userAgent.platform.isKaiOS();\n\n\n/**\n * @return {string} The string that describes the version number of the user\n * agent.\n * @private\n */\ngoog.userAgent.determineVersion_ = function() {\n 'use strict';\n // All browsers have different ways to detect the version and they all have\n // different naming schemes.\n // version is a string rather than a number because it may contain 'b', 'a',\n // and so on.\n var version = '';\n var arr = goog.userAgent.getVersionRegexResult_();\n if (arr) {\n version = arr ? arr[1] : '';\n }\n\n if (goog.userAgent.IE) {\n // IE9 can be in document mode 9 but be reporting an inconsistent user agent\n // version. If it is identifying as a version lower than 9 we take the\n // documentMode as the version instead. IE8 has similar behavior.\n // It is recommended to set the X-UA-Compatible header to ensure that IE9\n // uses documentMode 9.\n var docMode = goog.userAgent.getDocumentMode_();\n if (docMode != null && docMode > parseFloat(version)) {\n return String(docMode);\n }\n }\n\n return version;\n};\n\n\n/**\n * @return {?IArrayLike<string>|undefined} The version regex matches from\n * parsing the user\n * agent string. These regex statements must be executed inline so they can\n * be compiled out by the closure compiler with the rest of the useragent\n * detection logic when ASSUME_* is specified.\n * @private\n */\ngoog.userAgent.getVersionRegexResult_ = function() {\n 'use strict';\n var userAgent = goog.userAgent.getUserAgentString();\n if (goog.userAgent.GECKO) {\n return /rv\\:([^\\);]+)(\\)|;)/.exec(userAgent);\n }\n if (goog.userAgent.EDGE) {\n return /Edge\\/([\\d\\.]+)/.exec(userAgent);\n }\n if (goog.userAgent.IE) {\n return /\\b(?:MSIE|rv)[: ]([^\\);]+)(\\)|;)/.exec(userAgent);\n }\n if (goog.userAgent.WEBKIT) {\n // WebKit/125.4\n return /WebKit\\/(\\S+)/.exec(userAgent);\n }\n if (goog.userAgent.OPERA) {\n // If none of the above browsers were detected but the browser is Opera, the\n // only string that is of interest is 'Version/<number>'.\n return /(?:Version)[ \\/]?(\\S+)/.exec(userAgent);\n }\n return undefined;\n};\n\n\n/**\n * @return {number|undefined} Returns the document mode (for testing).\n * @private\n */\ngoog.userAgent.getDocumentMode_ = function() {\n 'use strict';\n // NOTE(user): goog.userAgent may be used in context where there is no DOM.\n var doc = goog.global['document'];\n return doc ? doc['documentMode'] : undefined;\n};\n\n\n/**\n * The version of the user agent. This is a string because it might contain\n * 'b' (as in beta) as well as multiple dots.\n * @type {string}\n */\ngoog.userAgent.VERSION = goog.userAgent.determineVersion_();\n\n\n/**\n * Compares two version numbers.\n *\n * @param {string} v1 Version of first item.\n * @param {string} v2 Version of second item.\n *\n * @return {number} 1 if first argument is higher\n * 0 if arguments are equal\n * -1 if second argument is higher.\n * @deprecated Use goog.string.compareVersions.\n */\ngoog.userAgent.compare = function(v1, v2) {\n 'use strict';\n return goog.string.compareVersions(v1, v2);\n};\n\n\n/**\n * Cache for {@link goog.userAgent.isVersionOrHigher}.\n * Calls to compareVersions are surprisingly expensive and, as a browser's\n * version number is unlikely to change during a session, we cache the results.\n * @const\n * @private\n */\ngoog.userAgent.isVersionOrHigherCache_ = {};\n\n\n/**\n * Whether the user agent version is higher or the same as the given version.\n * NOTE: When checking the version numbers for Firefox and Safari, be sure to\n * use the engine's version, not the browser's version number. For example,\n * Firefox 3.0 corresponds to Gecko 1.9 and Safari 3.0 to Webkit 522.11.\n * Opera and Internet Explorer versions match the product release number.<br>\n * @see <a href=\"http://en.wikipedia.org/wiki/Safari_version_history\">\n * Webkit</a>\n * @see <a href=\"http://en.wikipedia.org/wiki/Gecko_engine\">Gecko</a>\n *\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the user agent version is higher or the same as\n * the given version.\n */\ngoog.userAgent.isVersionOrHigher = function(version) {\n 'use strict';\n return goog.userAgent.ASSUME_ANY_VERSION ||\n goog.reflect.cache(\n goog.userAgent.isVersionOrHigherCache_, version, function() {\n 'use strict';\n return goog.string.compareVersions(\n goog.userAgent.VERSION, version) >= 0;\n });\n};\n\n\n/**\n * Deprecated alias to `goog.userAgent.isVersionOrHigher`.\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the user agent version is higher or the same as\n * the given version.\n * @deprecated Use goog.userAgent.isVersionOrHigher().\n */\ngoog.userAgent.isVersion = goog.userAgent.isVersionOrHigher;\n\n\n/**\n * Whether the IE effective document mode is higher or the same as the given\n * document mode version.\n * NOTE: Only for IE, return false for another browser.\n *\n * @param {number} documentMode The document mode version to check.\n * @return {boolean} Whether the IE effective document mode is higher or the\n * same as the given version.\n */\ngoog.userAgent.isDocumentModeOrHigher = function(documentMode) {\n 'use strict';\n return Number(goog.userAgent.DOCUMENT_MODE) >= documentMode;\n};\n\n\n/**\n * Deprecated alias to `goog.userAgent.isDocumentModeOrHigher`.\n * @param {number} version The version to check.\n * @return {boolean} Whether the IE effective document mode is higher or the\n * same as the given version.\n * @deprecated Use goog.userAgent.isDocumentModeOrHigher().\n */\ngoog.userAgent.isDocumentMode = goog.userAgent.isDocumentModeOrHigher;\n\n\n/**\n * For IE version < 7, documentMode is undefined, so attempt to use the\n * CSS1Compat property to see if we are in standards mode. If we are in\n * standards mode, treat the browser version as the document mode. Otherwise,\n * IE is emulating version 5.\n *\n * NOTE(user): Support for IE < 7 is long gone, so this is now simplified.\n * It returns document.documentMode for IE and undefined for everything else.\n *\n * @type {number|undefined}\n * @const\n */\ngoog.userAgent.DOCUMENT_MODE = (function() {\n 'use strict';\n var doc = goog.global['document'];\n if (!doc || !goog.userAgent.IE) return undefined;\n // This must be an IE user agent.\n var documentMode = goog.userAgent.getDocumentMode_();\n if (documentMode) return documentMode;\n // The user agent version string begins with the major version.\n // Parse the major version and truncate anything following.\n var ieVersion = parseInt(goog.userAgent.VERSION, 10);\n return ieVersion || undefined;\n})();\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Closure user agent detection (Browser).\n * @see <a href=\"http://www.useragentstring.com/\">User agent strings</a>\n * For more information on rendering engine, platform, or device see the other\n * sub-namespaces in goog.labs.userAgent, goog.labs.userAgent.platform,\n * goog.labs.userAgent.device respectively.)\n */\n\ngoog.provide('goog.labs.userAgent.browser');\n\ngoog.require('goog.array');\ngoog.require('goog.labs.userAgent.util');\ngoog.require('goog.object');\ngoog.require('goog.string.internal');\n\n\n// TODO(nnaze): Refactor to remove excessive exclusion logic in matching\n// functions.\n\n\n/**\n * @return {boolean} Whether the user's browser is Opera. Note: Chromium\n * based Opera (Opera 15+) is detected as Chrome to avoid unnecessary\n * special casing.\n * @private\n */\ngoog.labs.userAgent.browser.matchOpera_ = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Opera');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is IE.\n * @private\n */\ngoog.labs.userAgent.browser.matchIE_ = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Trident') ||\n goog.labs.userAgent.util.matchUserAgent('MSIE');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Edge. This refers to EdgeHTML\n * based Edge.\n * @private\n */\ngoog.labs.userAgent.browser.matchEdgeHtml_ = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Edge');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Chromium based Edge.\n * @private\n */\ngoog.labs.userAgent.browser.matchEdgeChromium_ = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Edg/');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Chromium based Opera.\n * @private\n */\ngoog.labs.userAgent.browser.matchOperaChromium_ = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('OPR');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Firefox.\n * @private\n */\ngoog.labs.userAgent.browser.matchFirefox_ = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Firefox') ||\n goog.labs.userAgent.util.matchUserAgent('FxiOS');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Safari.\n * @private\n */\ngoog.labs.userAgent.browser.matchSafari_ = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Safari') &&\n !(goog.labs.userAgent.browser.matchChrome_() ||\n goog.labs.userAgent.browser.matchCoast_() ||\n goog.labs.userAgent.browser.matchOpera_() ||\n goog.labs.userAgent.browser.matchEdgeHtml_() ||\n goog.labs.userAgent.browser.matchEdgeChromium_() ||\n goog.labs.userAgent.browser.matchOperaChromium_() ||\n goog.labs.userAgent.browser.matchFirefox_() ||\n goog.labs.userAgent.browser.isSilk() ||\n goog.labs.userAgent.util.matchUserAgent('Android'));\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Coast (Opera's Webkit-based\n * iOS browser).\n * @private\n */\ngoog.labs.userAgent.browser.matchCoast_ = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Coast');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is iOS Webview.\n * @private\n */\ngoog.labs.userAgent.browser.matchIosWebview_ = function() {\n 'use strict';\n // iOS Webview does not show up as Chrome or Safari. Also check for Opera's\n // WebKit-based iOS browser, Coast.\n return (goog.labs.userAgent.util.matchUserAgent('iPad') ||\n goog.labs.userAgent.util.matchUserAgent('iPhone')) &&\n !goog.labs.userAgent.browser.matchSafari_() &&\n !goog.labs.userAgent.browser.matchChrome_() &&\n !goog.labs.userAgent.browser.matchCoast_() &&\n !goog.labs.userAgent.browser.matchFirefox_() &&\n goog.labs.userAgent.util.matchUserAgent('AppleWebKit');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is any Chromium browser. This\n * returns true for Chrome, Opera 15+, and Edge Chromium.\n * @private\n */\ngoog.labs.userAgent.browser.matchChrome_ = function() {\n 'use strict';\n return (goog.labs.userAgent.util.matchUserAgent('Chrome') ||\n goog.labs.userAgent.util.matchUserAgent('CriOS')) &&\n !goog.labs.userAgent.browser.matchEdgeHtml_();\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is the Android browser.\n * @private\n */\ngoog.labs.userAgent.browser.matchAndroidBrowser_ = function() {\n 'use strict';\n // Android can appear in the user agent string for Chrome on Android.\n // This is not the Android standalone browser if it does.\n return goog.labs.userAgent.util.matchUserAgent('Android') &&\n !(goog.labs.userAgent.browser.isChrome() ||\n goog.labs.userAgent.browser.isFirefox() ||\n goog.labs.userAgent.browser.isOpera() ||\n goog.labs.userAgent.browser.isSilk());\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Opera.\n */\ngoog.labs.userAgent.browser.isOpera = goog.labs.userAgent.browser.matchOpera_;\n\n\n/**\n * @return {boolean} Whether the user's browser is IE.\n */\ngoog.labs.userAgent.browser.isIE = goog.labs.userAgent.browser.matchIE_;\n\n\n/**\n * @return {boolean} Whether the user's browser is EdgeHTML based Edge.\n */\ngoog.labs.userAgent.browser.isEdge = goog.labs.userAgent.browser.matchEdgeHtml_;\n\n\n/**\n * @return {boolean} Whether the user's browser is Chromium based Edge.\n */\ngoog.labs.userAgent.browser.isEdgeChromium =\n goog.labs.userAgent.browser.matchEdgeChromium_;\n\n/**\n * @return {boolean} Whether the user's browser is Chromium based Opera.\n */\ngoog.labs.userAgent.browser.isOperaChromium =\n goog.labs.userAgent.browser.matchOperaChromium_;\n\n/**\n * @return {boolean} Whether the user's browser is Firefox.\n */\ngoog.labs.userAgent.browser.isFirefox =\n goog.labs.userAgent.browser.matchFirefox_;\n\n\n/**\n * @return {boolean} Whether the user's browser is Safari.\n */\ngoog.labs.userAgent.browser.isSafari = goog.labs.userAgent.browser.matchSafari_;\n\n\n/**\n * @return {boolean} Whether the user's browser is Coast (Opera's Webkit-based\n * iOS browser).\n */\ngoog.labs.userAgent.browser.isCoast = goog.labs.userAgent.browser.matchCoast_;\n\n\n/**\n * @return {boolean} Whether the user's browser is iOS Webview.\n */\ngoog.labs.userAgent.browser.isIosWebview =\n goog.labs.userAgent.browser.matchIosWebview_;\n\n\n/**\n * @return {boolean} Whether the user's browser is any Chromium based browser (\n * Chrome, Blink-based Opera (15+) and Edge Chromium).\n */\ngoog.labs.userAgent.browser.isChrome = goog.labs.userAgent.browser.matchChrome_;\n\n\n/**\n * @return {boolean} Whether the user's browser is the Android browser.\n */\ngoog.labs.userAgent.browser.isAndroidBrowser =\n goog.labs.userAgent.browser.matchAndroidBrowser_;\n\n\n/**\n * For more information, see:\n * http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html\n * @return {boolean} Whether the user's browser is Silk.\n */\ngoog.labs.userAgent.browser.isSilk = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Silk');\n};\n\n\n/**\n * @return {string} The browser version or empty string if version cannot be\n * determined. Note that for Internet Explorer, this returns the version of\n * the browser, not the version of the rendering engine. (IE 8 in\n * compatibility mode will return 8.0 rather than 7.0. To determine the\n * rendering engine version, look at document.documentMode instead. See\n * http://msdn.microsoft.com/en-us/library/cc196988(v=vs.85).aspx for more\n * details.)\n */\ngoog.labs.userAgent.browser.getVersion = function() {\n 'use strict';\n var userAgentString = goog.labs.userAgent.util.getUserAgent();\n // Special case IE since IE's version is inside the parenthesis and\n // without the '/'.\n if (goog.labs.userAgent.browser.isIE()) {\n return goog.labs.userAgent.browser.getIEVersion_(userAgentString);\n }\n\n var versionTuples =\n goog.labs.userAgent.util.extractVersionTuples(userAgentString);\n\n // Construct a map for easy lookup.\n var versionMap = {};\n goog.array.forEach(versionTuples, function(tuple) {\n 'use strict';\n // Note that the tuple is of length three, but we only care about the\n // first two.\n var key = tuple[0];\n var value = tuple[1];\n versionMap[key] = value;\n });\n\n var versionMapHasKey = goog.partial(goog.object.containsKey, versionMap);\n\n // Gives the value with the first key it finds, otherwise empty string.\n function lookUpValueWithKeys(keys) {\n var key = goog.array.find(keys, versionMapHasKey);\n return versionMap[key] || '';\n }\n\n // Check Opera before Chrome since Opera 15+ has \"Chrome\" in the string.\n // See\n // http://my.opera.com/ODIN/blog/2013/07/15/opera-user-agent-strings-opera-15-and-beyond\n if (goog.labs.userAgent.browser.isOpera()) {\n // Opera 10 has Version/10.0 but Opera/9.8, so look for \"Version\" first.\n // Opera uses 'OPR' for more recent UAs.\n return lookUpValueWithKeys(['Version', 'Opera']);\n }\n\n // Check Edge before Chrome since it has Chrome in the string.\n if (goog.labs.userAgent.browser.isEdge()) {\n return lookUpValueWithKeys(['Edge']);\n }\n\n // Check Chromium Edge before Chrome since it has Chrome in the string.\n if (goog.labs.userAgent.browser.isEdgeChromium()) {\n return lookUpValueWithKeys(['Edg']);\n }\n\n if (goog.labs.userAgent.browser.isChrome()) {\n return lookUpValueWithKeys(['Chrome', 'CriOS', 'HeadlessChrome']);\n }\n\n // Usually products browser versions are in the third tuple after \"Mozilla\"\n // and the engine.\n var tuple = versionTuples[2];\n return tuple && tuple[1] || '';\n};\n\n\n/**\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the browser version is higher or the same as the\n * given version.\n */\ngoog.labs.userAgent.browser.isVersionOrHigher = function(version) {\n 'use strict';\n return goog.string.internal.compareVersions(\n goog.labs.userAgent.browser.getVersion(), version) >= 0;\n};\n\n\n/**\n * Determines IE version. More information:\n * http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx#uaString\n * http://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx\n * http://blogs.msdn.com/b/ie/archive/2010/03/23/introducing-ie9-s-user-agent-string.aspx\n * http://blogs.msdn.com/b/ie/archive/2009/01/09/the-internet-explorer-8-user-agent-string-updated-edition.aspx\n *\n * @param {string} userAgent the User-Agent.\n * @return {string}\n * @private\n */\ngoog.labs.userAgent.browser.getIEVersion_ = function(userAgent) {\n 'use strict';\n // IE11 may identify itself as MSIE 9.0 or MSIE 10.0 due to an IE 11 upgrade\n // bug. Example UA:\n // Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)\n // like Gecko.\n // See http://www.whatismybrowser.com/developers/unknown-user-agent-fragments.\n var rv = /rv: *([\\d\\.]*)/.exec(userAgent);\n if (rv && rv[1]) {\n return rv[1];\n }\n\n var version = '';\n var msie = /MSIE +([\\d\\.]+)/.exec(userAgent);\n if (msie && msie[1]) {\n // IE in compatibility mode usually identifies itself as MSIE 7.0; in this\n // case, use the Trident version to determine the version of IE. For more\n // details, see the links above.\n var tridentVersion = /Trident\\/(\\d.\\d)/.exec(userAgent);\n if (msie[1] == '7.0') {\n if (tridentVersion && tridentVersion[1]) {\n switch (tridentVersion[1]) {\n case '4.0':\n version = '8.0';\n break;\n case '5.0':\n version = '9.0';\n break;\n case '6.0':\n version = '10.0';\n break;\n case '7.0':\n version = '11.0';\n break;\n }\n } else {\n version = '7.0';\n }\n } else {\n version = msie[1];\n }\n }\n return version;\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Closure user agent detection.\n * @see http://en.wikipedia.org/wiki/User_agent\n * For more information on browser brand, platform, or device see the other\n * sub-namespaces in goog.labs.userAgent (browser, platform, and device).\n */\n\ngoog.provide('goog.labs.userAgent.engine');\n\ngoog.require('goog.array');\ngoog.require('goog.labs.userAgent.util');\ngoog.require('goog.string');\n\n\n/**\n * @return {boolean} Whether the rendering engine is Presto.\n */\ngoog.labs.userAgent.engine.isPresto = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Presto');\n};\n\n\n/**\n * @return {boolean} Whether the rendering engine is Trident.\n */\ngoog.labs.userAgent.engine.isTrident = function() {\n 'use strict';\n // IE only started including the Trident token in IE8.\n return goog.labs.userAgent.util.matchUserAgent('Trident') ||\n goog.labs.userAgent.util.matchUserAgent('MSIE');\n};\n\n\n/**\n * @return {boolean} Whether the rendering engine is EdgeHTML.\n */\ngoog.labs.userAgent.engine.isEdge = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Edge');\n};\n\n\n/**\n * @return {boolean} Whether the rendering engine is WebKit. This will return\n * true for Chrome, Blink-based Opera (15+), Edge Chromium and Safari.\n */\ngoog.labs.userAgent.engine.isWebKit = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgentIgnoreCase('WebKit') &&\n !goog.labs.userAgent.engine.isEdge();\n};\n\n\n/**\n * @return {boolean} Whether the rendering engine is Gecko.\n */\ngoog.labs.userAgent.engine.isGecko = function() {\n 'use strict';\n return goog.labs.userAgent.util.matchUserAgent('Gecko') &&\n !goog.labs.userAgent.engine.isWebKit() &&\n !goog.labs.userAgent.engine.isTrident() &&\n !goog.labs.userAgent.engine.isEdge();\n};\n\n\n/**\n * @return {string} The rendering engine's version or empty string if version\n * can't be determined.\n */\ngoog.labs.userAgent.engine.getVersion = function() {\n 'use strict';\n var userAgentString = goog.labs.userAgent.util.getUserAgent();\n if (userAgentString) {\n var tuples = goog.labs.userAgent.util.extractVersionTuples(userAgentString);\n\n var engineTuple = goog.labs.userAgent.engine.getEngineTuple_(tuples);\n if (engineTuple) {\n // In Gecko, the version string is either in the browser info or the\n // Firefox version. See Gecko user agent string reference:\n // http://goo.gl/mULqa\n if (engineTuple[0] == 'Gecko') {\n return goog.labs.userAgent.engine.getVersionForKey_(tuples, 'Firefox');\n }\n\n return engineTuple[1];\n }\n\n // MSIE has only one version identifier, and the Trident version is\n // specified in the parenthetical. IE Edge is covered in the engine tuple\n // detection.\n var browserTuple = tuples[0];\n var info;\n if (browserTuple && (info = browserTuple[2])) {\n var match = /Trident\\/([^\\s;]+)/.exec(info);\n if (match) {\n return match[1];\n }\n }\n }\n return '';\n};\n\n\n/**\n * @param {!Array<!Array<string>>} tuples Extracted version tuples.\n * @return {!Array<string>|undefined} The engine tuple or undefined if not\n * found.\n * @private\n */\ngoog.labs.userAgent.engine.getEngineTuple_ = function(tuples) {\n 'use strict';\n if (!goog.labs.userAgent.engine.isEdge()) {\n return tuples[1];\n }\n for (var i = 0; i < tuples.length; i++) {\n var tuple = tuples[i];\n if (tuple[0] == 'Edge') {\n return tuple;\n }\n }\n};\n\n\n/**\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the rendering engine version is higher or the same\n * as the given version.\n */\ngoog.labs.userAgent.engine.isVersionOrHigher = function(version) {\n 'use strict';\n return goog.string.compareVersions(\n goog.labs.userAgent.engine.getVersion(), version) >= 0;\n};\n\n\n/**\n * @param {!Array<!Array<string>>} tuples Version tuples.\n * @param {string} key The key to look for.\n * @return {string} The version string of the given key, if present.\n * Otherwise, the empty string.\n * @private\n */\ngoog.labs.userAgent.engine.getVersionForKey_ = function(tuples, key) {\n 'use strict';\n // TODO(nnaze): Move to util if useful elsewhere.\n\n var pair = goog.array.find(tuples, function(pair) {\n 'use strict';\n return key == pair[0];\n });\n\n return pair && pair[1] || '';\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Browser capability checks for the events package.\n */\n\ngoog.module('goog.events.BrowserFeature');\ngoog.module.declareLegacyNamespace();\n\n\n/**\n * Tricks Closure Compiler into believing that a function is pure. The compiler\n * assumes that any `valueOf` function is pure, without analyzing its contents.\n *\n * @param {function(): T} fn\n * @return {T}\n * @template T\n */\nconst purify = (fn) => {\n return ({valueOf: fn}).valueOf();\n};\n\n\n/**\n * Enum of browser capabilities.\n * @enum {boolean}\n */\nexports = {\n /**\n * Whether the button attribute of the event is W3C compliant. False in\n * Internet Explorer prior to version 9; document-version dependent.\n */\n HAS_W3C_BUTTON: true,\n\n /**\n * Whether the browser supports full W3C event model.\n */\n HAS_W3C_EVENT_SUPPORT: true,\n\n /**\n * To prevent default in IE7-8 for certain keydown events we need set the\n * keyCode to -1.\n */\n SET_KEY_CODE_TO_PREVENT_DEFAULT: false,\n\n /**\n * Whether the `navigator.onLine` property is supported.\n */\n HAS_NAVIGATOR_ONLINE_PROPERTY: true,\n\n /**\n * Whether HTML5 network online/offline events are supported.\n */\n HAS_HTML5_NETWORK_EVENT_SUPPORT: true,\n\n /**\n * Whether HTML5 network events fire on document.body, or otherwise the\n * window.\n */\n HTML5_NETWORK_EVENTS_FIRE_ON_BODY: false,\n\n /**\n * Whether touch is enabled in the browser.\n */\n TOUCH_ENABLED:\n ('ontouchstart' in goog.global ||\n !!(goog.global['document'] && document.documentElement &&\n 'ontouchstart' in document.documentElement) ||\n // IE10 uses non-standard touch events, so it has a different check.\n !!(goog.global['navigator'] &&\n (goog.global['navigator']['maxTouchPoints'] ||\n goog.global['navigator']['msMaxTouchPoints']))),\n\n /**\n * Whether addEventListener supports W3C standard pointer events.\n * http://www.w3.org/TR/pointerevents/\n */\n POINTER_EVENTS: ('PointerEvent' in goog.global),\n\n /**\n * Whether addEventListener supports MSPointer events (only used in IE10).\n * http://msdn.microsoft.com/en-us/library/ie/hh772103(v=vs.85).aspx\n * http://msdn.microsoft.com/library/hh673557(v=vs.85).aspx\n */\n MSPOINTER_EVENTS:\n ('MSPointerEvent' in goog.global &&\n !!(goog.global['navigator'] &&\n goog.global['navigator']['msPointerEnabled'])),\n\n /**\n * Whether addEventListener supports {passive: true}.\n * https://developers.google.com/web/updates/2016/06/passive-event-listeners\n */\n PASSIVE_EVENTS: purify(function() {\n // If we're in a web worker or other custom environment, we can't tell.\n if (!goog.global.addEventListener || !Object.defineProperty) { // IE 8\n return false;\n }\n\n var passive = false;\n var options = Object.defineProperty({}, 'passive', {\n get: function() {\n passive = true;\n }\n });\n try {\n goog.global.addEventListener('test', goog.nullFunction, options);\n goog.global.removeEventListener('test', goog.nullFunction, options);\n } catch (e) {\n }\n\n return passive;\n })\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview A base class for event objects.\n */\n\n\ngoog.provide('goog.events.Event');\n\n/**\n * goog.events.Event no longer depends on goog.Disposable. Keep requiring\n * goog.Disposable here to not break projects which assume this dependency.\n * @suppress {extraRequire}\n */\ngoog.require('goog.Disposable');\ngoog.require('goog.events.EventId');\n\n\n/**\n * A base class for event objects, so that they can support preventDefault and\n * stopPropagation.\n *\n * @param {string|!goog.events.EventId} type Event Type.\n * @param {Object=} opt_target Reference to the object that is the target of\n * this event. It has to implement the `EventTarget` interface\n * declared at {@link http://developer.mozilla.org/en/DOM/EventTarget}.\n * @constructor\n */\ngoog.events.Event = function(type, opt_target) {\n 'use strict';\n /**\n * Event type.\n * @type {string}\n */\n this.type = type instanceof goog.events.EventId ? String(type) : type;\n\n /**\n * TODO(tbreisacher): The type should probably be\n * EventTarget|goog.events.EventTarget.\n *\n * Target of the event.\n * @type {Object|undefined}\n */\n this.target = opt_target;\n\n /**\n * Object that had the listener attached.\n * @type {Object|undefined}\n */\n this.currentTarget = this.target;\n\n /**\n * Whether to cancel the event in internal capture/bubble processing for IE.\n * @type {boolean}\n * @private\n */\n this.propagationStopped_ = false;\n\n /**\n * Whether the default action has been prevented.\n * This is a property to match the W3C specification at\n * {@link http://www.w3.org/TR/DOM-Level-3-Events/\n * #events-event-type-defaultPrevented}.\n * Must be treated as read-only outside the class.\n * @type {boolean}\n */\n this.defaultPrevented = false;\n};\n\n/**\n * @return {boolean} true iff internal propagation has been stopped.\n */\ngoog.events.Event.prototype.hasPropagationStopped = function() {\n 'use strict';\n return this.propagationStopped_;\n};\n\n/**\n * Stops event propagation.\n * @return {void}\n */\ngoog.events.Event.prototype.stopPropagation = function() {\n 'use strict';\n this.propagationStopped_ = true;\n};\n\n\n/**\n * Prevents the default action, for example a link redirecting to a url.\n * @return {void}\n */\ngoog.events.Event.prototype.preventDefault = function() {\n 'use strict';\n this.defaultPrevented = true;\n};\n\n\n/**\n * Stops the propagation of the event. It is equivalent to\n * `e.stopPropagation()`, but can be used as the callback argument of\n * {@link goog.events.listen} without declaring another function.\n * @param {!goog.events.Event} e An event.\n * @return {void}\n */\ngoog.events.Event.stopPropagation = function(e) {\n 'use strict';\n e.stopPropagation();\n};\n\n\n/**\n * Prevents the default action. It is equivalent to\n * `e.preventDefault()`, but can be used as the callback argument of\n * {@link goog.events.listen} without declaring another function.\n * @param {!goog.events.Event} e An event.\n * @return {void}\n */\ngoog.events.Event.preventDefault = function(e) {\n 'use strict';\n e.preventDefault();\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview A patched, standardized event object for browser events.\n *\n * <pre>\n * The patched event object contains the following members:\n * - type {string} Event type, e.g. 'click'\n * - target {Object} The element that actually triggered the event\n * - currentTarget {Object} The element the listener is attached to\n * - relatedTarget {Object} For mouseover and mouseout, the previous object\n * - offsetX {number} X-coordinate relative to target\n * - offsetY {number} Y-coordinate relative to target\n * - clientX {number} X-coordinate relative to viewport\n * - clientY {number} Y-coordinate relative to viewport\n * - screenX {number} X-coordinate relative to the edge of the screen\n * - screenY {number} Y-coordinate relative to the edge of the screen\n * - button {number} Mouse button. Use isButton() to test.\n * - keyCode {number} Key-code\n * - ctrlKey {boolean} Was ctrl key depressed\n * - altKey {boolean} Was alt key depressed\n * - shiftKey {boolean} Was shift key depressed\n * - metaKey {boolean} Was meta key depressed\n * - pointerId {number} Pointer ID\n * - pointerType {string} Pointer type, e.g. 'mouse', 'pen', or 'touch'\n * - defaultPrevented {boolean} Whether the default action has been prevented\n * - state {Object} History state object\n *\n * NOTE: The keyCode member contains the raw browser keyCode. For normalized\n * key and character code use {@link goog.events.KeyHandler}.\n * </pre>\n * @suppress {missingRequire} TODO(user): this shouldn't be needed\n */\n\ngoog.provide('goog.events.BrowserEvent');\ngoog.provide('goog.events.BrowserEvent.MouseButton');\ngoog.provide('goog.events.BrowserEvent.PointerType');\n\ngoog.require('goog.debug');\ngoog.require('goog.events.BrowserFeature');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventType');\ngoog.require('goog.reflect');\ngoog.require('goog.userAgent');\n\n/**\n * @define {boolean} If true, use the layerX and layerY properties of a native\n * browser event over the offsetX and offsetY properties, which cause expensive\n * reflow. If layerX or layerY is not defined, offsetX and offsetY will be used\n * as usual.\n */\ngoog.events.USE_LAYER_XY_AS_OFFSET_XY =\n goog.define('goog.events.USE_LAYER_XY_AS_OFFSET_XY', false);\n\n/**\n * Accepts a browser event object and creates a patched, cross browser event\n * object.\n * The content of this object will not be initialized if no event object is\n * provided. If this is the case, init() needs to be invoked separately.\n * @param {Event=} opt_e Browser event object.\n * @param {EventTarget=} opt_currentTarget Current target for event.\n * @constructor\n * @extends {goog.events.Event}\n */\ngoog.events.BrowserEvent = function(opt_e, opt_currentTarget) {\n 'use strict';\n goog.events.BrowserEvent.base(this, 'constructor', opt_e ? opt_e.type : '');\n\n /**\n * Target that fired the event.\n * @override\n * @type {?Node}\n */\n this.target = null;\n\n /**\n * Node that had the listener attached.\n * @override\n * @type {?Node|undefined}\n */\n this.currentTarget = null;\n\n /**\n * For mouseover and mouseout events, the related object for the event.\n * @type {?Node}\n */\n this.relatedTarget = null;\n\n /**\n * X-coordinate relative to target.\n * @type {number}\n */\n this.offsetX = 0;\n\n /**\n * Y-coordinate relative to target.\n * @type {number}\n */\n this.offsetY = 0;\n\n /**\n * X-coordinate relative to the window.\n * @type {number}\n */\n this.clientX = 0;\n\n /**\n * Y-coordinate relative to the window.\n * @type {number}\n */\n this.clientY = 0;\n\n /**\n * X-coordinate relative to the monitor.\n * @type {number}\n */\n this.screenX = 0;\n\n /**\n * Y-coordinate relative to the monitor.\n * @type {number}\n */\n this.screenY = 0;\n\n /**\n * Which mouse button was pressed.\n * @type {number}\n */\n this.button = 0;\n\n /**\n * Key of key press.\n * @type {string}\n */\n this.key = '';\n\n /**\n * Keycode of key press.\n * @type {number}\n */\n this.keyCode = 0;\n\n /**\n * Keycode of key press.\n * @type {number}\n */\n this.charCode = 0;\n\n /**\n * Whether control was pressed at time of event.\n * @type {boolean}\n */\n this.ctrlKey = false;\n\n /**\n * Whether alt was pressed at time of event.\n * @type {boolean}\n */\n this.altKey = false;\n\n /**\n * Whether shift was pressed at time of event.\n * @type {boolean}\n */\n this.shiftKey = false;\n\n /**\n * Whether the meta key was pressed at time of event.\n * @type {boolean}\n */\n this.metaKey = false;\n\n /**\n * History state object, only set for PopState events where it's a copy of the\n * state object provided to pushState or replaceState.\n * @type {?Object}\n */\n this.state = null;\n\n /**\n * Whether the default platform modifier key was pressed at time of event.\n * (This is control for all platforms except Mac, where it's Meta.)\n * @type {boolean}\n */\n this.platformModifierKey = false;\n\n /**\n * @type {number}\n */\n this.pointerId = 0;\n\n /**\n * @type {string}\n */\n this.pointerType = '';\n\n /**\n * The browser event object.\n * @private {?Event}\n */\n this.event_ = null;\n\n if (opt_e) {\n this.init(opt_e, opt_currentTarget);\n }\n};\ngoog.inherits(goog.events.BrowserEvent, goog.events.Event);\n\n\n/**\n * Normalized button constants for the mouse.\n * @enum {number}\n */\ngoog.events.BrowserEvent.MouseButton = {\n LEFT: 0,\n MIDDLE: 1,\n RIGHT: 2\n};\n\n\n/**\n * Normalized pointer type constants for pointer events.\n * @enum {string}\n */\ngoog.events.BrowserEvent.PointerType = {\n MOUSE: 'mouse',\n PEN: 'pen',\n TOUCH: 'touch'\n};\n\n\n/**\n * Static data for mapping mouse buttons.\n * @type {!Array<number>}\n * @deprecated Use `goog.events.BrowserEvent.IE_BUTTON_MAP` instead.\n */\ngoog.events.BrowserEvent.IEButtonMap = goog.debug.freeze([\n 1, // LEFT\n 4, // MIDDLE\n 2 // RIGHT\n]);\n\n\n/**\n * Static data for mapping mouse buttons.\n * @const {!Array<number>}\n */\ngoog.events.BrowserEvent.IE_BUTTON_MAP = goog.events.BrowserEvent.IEButtonMap;\n\n\n/**\n * Static data for mapping MSPointerEvent types to PointerEvent types.\n * @const {!Object<number, goog.events.BrowserEvent.PointerType>}\n */\ngoog.events.BrowserEvent.IE_POINTER_TYPE_MAP = goog.debug.freeze({\n 2: goog.events.BrowserEvent.PointerType.TOUCH,\n 3: goog.events.BrowserEvent.PointerType.PEN,\n 4: goog.events.BrowserEvent.PointerType.MOUSE\n});\n\n\n/**\n * Accepts a browser event object and creates a patched, cross browser event\n * object.\n * @param {Event} e Browser event object.\n * @param {EventTarget=} opt_currentTarget Current target for event.\n */\ngoog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) {\n 'use strict';\n var type = this.type = e.type;\n\n /**\n * On touch devices use the first \"changed touch\" as the relevant touch.\n * @type {?Touch}\n */\n var relevantTouch =\n e.changedTouches && e.changedTouches.length ? e.changedTouches[0] : null;\n\n // TODO(nicksantos): Change this.target to type EventTarget.\n this.target = /** @type {Node} */ (e.target) || e.srcElement;\n\n // TODO(nicksantos): Change this.currentTarget to type EventTarget.\n this.currentTarget = /** @type {Node} */ (opt_currentTarget);\n\n var relatedTarget = /** @type {Node} */ (e.relatedTarget);\n if (relatedTarget) {\n // There's a bug in FireFox where sometimes, relatedTarget will be a\n // chrome element, and accessing any property of it will get a permission\n // denied exception. See:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=497780\n if (goog.userAgent.GECKO) {\n if (!goog.reflect.canAccessProperty(relatedTarget, 'nodeName')) {\n relatedTarget = null;\n }\n }\n } else if (type == goog.events.EventType.MOUSEOVER) {\n relatedTarget = e.fromElement;\n } else if (type == goog.events.EventType.MOUSEOUT) {\n relatedTarget = e.toElement;\n }\n\n this.relatedTarget = relatedTarget;\n\n if (relevantTouch) {\n this.clientX = relevantTouch.clientX !== undefined ? relevantTouch.clientX :\n relevantTouch.pageX;\n this.clientY = relevantTouch.clientY !== undefined ? relevantTouch.clientY :\n relevantTouch.pageY;\n this.screenX = relevantTouch.screenX || 0;\n this.screenY = relevantTouch.screenY || 0;\n } else {\n if (goog.events.USE_LAYER_XY_AS_OFFSET_XY) {\n this.offsetX = (e.layerX !== undefined) ? e.layerX : e.offsetX;\n this.offsetY = (e.layerY !== undefined) ? e.layerY : e.offsetY;\n } else {\n // Webkit emits a lame warning whenever layerX/layerY is accessed.\n // http://code.google.com/p/chromium/issues/detail?id=101733\n this.offsetX = (goog.userAgent.WEBKIT || e.offsetX !== undefined) ?\n e.offsetX :\n e.layerX;\n this.offsetY = (goog.userAgent.WEBKIT || e.offsetY !== undefined) ?\n e.offsetY :\n e.layerY;\n }\n this.clientX = e.clientX !== undefined ? e.clientX : e.pageX;\n this.clientY = e.clientY !== undefined ? e.clientY : e.pageY;\n this.screenX = e.screenX || 0;\n this.screenY = e.screenY || 0;\n }\n\n this.button = e.button;\n\n this.keyCode = e.keyCode || 0;\n this.key = e.key || '';\n this.charCode = e.charCode || (type == 'keypress' ? e.keyCode : 0);\n this.ctrlKey = e.ctrlKey;\n this.altKey = e.altKey;\n this.shiftKey = e.shiftKey;\n this.metaKey = e.metaKey;\n this.platformModifierKey = goog.userAgent.MAC ? e.metaKey : e.ctrlKey;\n this.pointerId = e.pointerId || 0;\n this.pointerType = goog.events.BrowserEvent.getPointerType_(e);\n this.state = e.state;\n this.event_ = e;\n if (e.defaultPrevented) {\n // Sync native event state to internal state via super class, where default\n // prevention is implemented and managed.\n goog.events.BrowserEvent.superClass_.preventDefault.call(this);\n }\n};\n\n\n/**\n * Tests to see which button was pressed during the event. This is really only\n * useful in IE and Gecko browsers. And in IE, it's only useful for\n * mousedown/mouseup events, because click only fires for the left mouse button.\n *\n * Safari 2 only reports the left button being clicked, and uses the value '1'\n * instead of 0. Opera only reports a mousedown event for the middle button, and\n * no mouse events for the right button. Opera has default behavior for left and\n * middle click that can only be overridden via a configuration setting.\n *\n * There's a nice table of this mess at http://www.unixpapa.com/js/mouse.html.\n *\n * @param {goog.events.BrowserEvent.MouseButton} button The button\n * to test for.\n * @return {boolean} True if button was pressed.\n */\ngoog.events.BrowserEvent.prototype.isButton = function(button) {\n 'use strict';\n if (!goog.events.BrowserFeature.HAS_W3C_BUTTON) {\n if (this.type == 'click') {\n return button == goog.events.BrowserEvent.MouseButton.LEFT;\n } else {\n return !!(\n this.event_.button & goog.events.BrowserEvent.IE_BUTTON_MAP[button]);\n }\n } else {\n return this.event_.button == button;\n }\n};\n\n\n/**\n * Whether this has an \"action\"-producing mouse button.\n *\n * By definition, this includes left-click on windows/linux, and left-click\n * without the ctrl key on Macs.\n *\n * @return {boolean} The result.\n */\ngoog.events.BrowserEvent.prototype.isMouseActionButton = function() {\n 'use strict';\n // Ctrl+click should never behave like a left-click on mac, regardless of\n // whether or not the browser will actually ever emit such an event. If\n // we see it, treat it like right-click always.\n return this.isButton(goog.events.BrowserEvent.MouseButton.LEFT) &&\n !(goog.userAgent.MAC && this.ctrlKey);\n};\n\n\n/**\n * @override\n */\ngoog.events.BrowserEvent.prototype.stopPropagation = function() {\n 'use strict';\n goog.events.BrowserEvent.superClass_.stopPropagation.call(this);\n if (this.event_.stopPropagation) {\n this.event_.stopPropagation();\n } else {\n this.event_.cancelBubble = true;\n }\n};\n\n\n/**\n * @override\n */\ngoog.events.BrowserEvent.prototype.preventDefault = function() {\n 'use strict';\n goog.events.BrowserEvent.superClass_.preventDefault.call(this);\n var be = this.event_;\n if (!be.preventDefault) {\n be.returnValue = false;\n if (goog.events.BrowserFeature.SET_KEY_CODE_TO_PREVENT_DEFAULT) {\n\n try {\n // Most keys can be prevented using returnValue. Some special keys\n // require setting the keyCode to -1 as well:\n //\n // In IE7:\n // F3, F5, F10, F11, Ctrl+P, Crtl+O, Ctrl+F (these are taken from IE6)\n //\n // In IE8:\n // Ctrl+P, Crtl+O, Ctrl+F (F1-F12 cannot be stopped through the event)\n //\n // We therefore do this for all function keys as well as when Ctrl key\n // is pressed.\n var VK_F1 = 112;\n var VK_F12 = 123;\n if (be.ctrlKey || be.keyCode >= VK_F1 && be.keyCode <= VK_F12) {\n be.keyCode = -1;\n }\n } catch (ex) {\n // IE throws an 'access denied' exception when trying to change\n // keyCode in some situations (e.g. srcElement is input[type=file],\n // or srcElement is an anchor tag rewritten by parent's innerHTML).\n // Do nothing in this case.\n }\n }\n } else {\n be.preventDefault();\n }\n};\n\n\n/**\n * @return {Event} The underlying browser event object.\n */\ngoog.events.BrowserEvent.prototype.getBrowserEvent = function() {\n 'use strict';\n return this.event_;\n};\n\n\n/**\n * Extracts the pointer type from the given event.\n * @param {!Event} e\n * @return {string} The pointer type, e.g. 'mouse', 'pen', or 'touch'.\n * @private\n */\ngoog.events.BrowserEvent.getPointerType_ = function(e) {\n 'use strict';\n if (typeof (e.pointerType) === 'string') {\n return e.pointerType;\n }\n // IE10 uses integer codes for pointer type.\n // https://msdn.microsoft.com/en-us/library/hh772359(v=vs.85).aspx\n return goog.events.BrowserEvent.IE_POINTER_TYPE_MAP[e.pointerType] || '';\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Event Types.\n * @suppress {missingRequire} TODO(user): this shouldn't be needed\n */\n\n\ngoog.provide('goog.events.EventType');\ngoog.provide('goog.events.MouseAsMouseEventType');\ngoog.provide('goog.events.MouseEvents');\ngoog.provide('goog.events.PointerAsMouseEventType');\ngoog.provide('goog.events.PointerAsTouchEventType');\ngoog.provide('goog.events.PointerFallbackEventType');\ngoog.provide('goog.events.PointerTouchFallbackEventType');\n\ngoog.require('goog.events.BrowserFeature');\ngoog.require('goog.userAgent');\n\n\n/**\n * Returns a prefixed event name for the current browser.\n * @param {string} eventName The name of the event.\n * @return {string} The prefixed event name.\n * @private\n */\ngoog.events.getVendorPrefixedName_ = function(eventName) {\n 'use strict';\n return goog.userAgent.WEBKIT ?\n 'webkit' + eventName :\n (goog.userAgent.OPERA ? 'o' + eventName.toLowerCase() :\n eventName.toLowerCase());\n};\n\n\n/**\n * Constants for event names.\n * @enum {string}\n */\ngoog.events.EventType = {\n // Mouse events\n CLICK: 'click',\n RIGHTCLICK: 'rightclick',\n DBLCLICK: 'dblclick',\n AUXCLICK: 'auxclick',\n MOUSEDOWN: 'mousedown',\n MOUSEUP: 'mouseup',\n MOUSEOVER: 'mouseover',\n MOUSEOUT: 'mouseout',\n MOUSEMOVE: 'mousemove',\n MOUSEENTER: 'mouseenter',\n MOUSELEAVE: 'mouseleave',\n\n // Non-existent event; will never fire. This exists as a mouse counterpart to\n // POINTERCANCEL.\n MOUSECANCEL: 'mousecancel',\n\n // Selection events.\n // https://www.w3.org/TR/selection-api/\n SELECTIONCHANGE: 'selectionchange',\n SELECTSTART: 'selectstart', // IE, Safari, Chrome\n\n // Wheel events\n // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents\n WHEEL: 'wheel',\n\n // Key events\n KEYPRESS: 'keypress',\n KEYDOWN: 'keydown',\n KEYUP: 'keyup',\n\n // Focus\n BLUR: 'blur',\n FOCUS: 'focus',\n DEACTIVATE: 'deactivate', // IE only\n FOCUSIN: 'focusin',\n FOCUSOUT: 'focusout',\n\n // Forms\n CHANGE: 'change',\n RESET: 'reset',\n SELECT: 'select',\n SUBMIT: 'submit',\n INPUT: 'input',\n PROPERTYCHANGE: 'propertychange', // IE only\n\n // Drag and drop\n DRAGSTART: 'dragstart',\n DRAG: 'drag',\n DRAGENTER: 'dragenter',\n DRAGOVER: 'dragover',\n DRAGLEAVE: 'dragleave',\n DROP: 'drop',\n DRAGEND: 'dragend',\n\n // Touch events\n // Note that other touch events exist, but we should follow the W3C list here.\n // http://www.w3.org/TR/touch-events/#list-of-touchevent-types\n TOUCHSTART: 'touchstart',\n TOUCHMOVE: 'touchmove',\n TOUCHEND: 'touchend',\n TOUCHCANCEL: 'touchcancel',\n\n // Misc\n BEFOREUNLOAD: 'beforeunload',\n CONSOLEMESSAGE: 'consolemessage',\n CONTEXTMENU: 'contextmenu',\n DEVICECHANGE: 'devicechange',\n DEVICEMOTION: 'devicemotion',\n DEVICEORIENTATION: 'deviceorientation',\n DOMCONTENTLOADED: 'DOMContentLoaded',\n ERROR: 'error',\n HELP: 'help',\n LOAD: 'load',\n LOSECAPTURE: 'losecapture',\n ORIENTATIONCHANGE: 'orientationchange',\n READYSTATECHANGE: 'readystatechange',\n RESIZE: 'resize',\n SCROLL: 'scroll',\n UNLOAD: 'unload',\n\n // Media events\n CANPLAY: 'canplay',\n CANPLAYTHROUGH: 'canplaythrough',\n DURATIONCHANGE: 'durationchange',\n EMPTIED: 'emptied',\n ENDED: 'ended',\n LOADEDDATA: 'loadeddata',\n LOADEDMETADATA: 'loadedmetadata',\n PAUSE: 'pause',\n PLAY: 'play',\n PLAYING: 'playing',\n PROGRESS: 'progress',\n RATECHANGE: 'ratechange',\n SEEKED: 'seeked',\n SEEKING: 'seeking',\n STALLED: 'stalled',\n SUSPEND: 'suspend',\n TIMEUPDATE: 'timeupdate',\n VOLUMECHANGE: 'volumechange',\n WAITING: 'waiting',\n\n // Media Source Extensions events\n // https://www.w3.org/TR/media-source/#mediasource-events\n SOURCEOPEN: 'sourceopen',\n SOURCEENDED: 'sourceended',\n SOURCECLOSED: 'sourceclosed',\n // https://www.w3.org/TR/media-source/#sourcebuffer-events\n ABORT: 'abort',\n UPDATE: 'update',\n UPDATESTART: 'updatestart',\n UPDATEEND: 'updateend',\n\n // HTML 5 History events\n // See http://www.w3.org/TR/html5/browsers.html#event-definitions-0\n HASHCHANGE: 'hashchange',\n PAGEHIDE: 'pagehide',\n PAGESHOW: 'pageshow',\n POPSTATE: 'popstate',\n\n // Copy and Paste\n // Support is limited. Make sure it works on your favorite browser\n // before using.\n // http://www.quirksmode.org/dom/events/cutcopypaste.html\n COPY: 'copy',\n PASTE: 'paste',\n CUT: 'cut',\n BEFORECOPY: 'beforecopy',\n BEFORECUT: 'beforecut',\n BEFOREPASTE: 'beforepaste',\n\n // HTML5 online/offline events.\n // http://www.w3.org/TR/offline-webapps/#related\n ONLINE: 'online',\n OFFLINE: 'offline',\n\n // HTML 5 worker events\n MESSAGE: 'message',\n CONNECT: 'connect',\n\n // Service Worker Events - ServiceWorkerGlobalScope context\n // See https://w3c.github.io/ServiceWorker/#execution-context-events\n // Note: message event defined in worker events section\n INSTALL: 'install',\n ACTIVATE: 'activate',\n FETCH: 'fetch',\n FOREIGNFETCH: 'foreignfetch',\n MESSAGEERROR: 'messageerror',\n\n // Service Worker Events - Document context\n // See https://w3c.github.io/ServiceWorker/#document-context-events\n STATECHANGE: 'statechange',\n UPDATEFOUND: 'updatefound',\n CONTROLLERCHANGE: 'controllerchange',\n\n // CSS animation events.\n ANIMATIONSTART: goog.events.getVendorPrefixedName_('AnimationStart'),\n ANIMATIONEND: goog.events.getVendorPrefixedName_('AnimationEnd'),\n ANIMATIONITERATION: goog.events.getVendorPrefixedName_('AnimationIteration'),\n\n // CSS transition events. Based on the browser support described at:\n // https://developer.mozilla.org/en/css/css_transitions#Browser_compatibility\n TRANSITIONEND: goog.events.getVendorPrefixedName_('TransitionEnd'),\n\n // W3C Pointer Events\n // http://www.w3.org/TR/pointerevents/\n POINTERDOWN: 'pointerdown',\n POINTERUP: 'pointerup',\n POINTERCANCEL: 'pointercancel',\n POINTERMOVE: 'pointermove',\n POINTEROVER: 'pointerover',\n POINTEROUT: 'pointerout',\n POINTERENTER: 'pointerenter',\n POINTERLEAVE: 'pointerleave',\n GOTPOINTERCAPTURE: 'gotpointercapture',\n LOSTPOINTERCAPTURE: 'lostpointercapture',\n\n // IE specific events.\n // See http://msdn.microsoft.com/en-us/library/ie/hh772103(v=vs.85).aspx\n // Note: these events will be supplanted in IE11.\n MSGESTURECHANGE: 'MSGestureChange',\n MSGESTUREEND: 'MSGestureEnd',\n MSGESTUREHOLD: 'MSGestureHold',\n MSGESTURESTART: 'MSGestureStart',\n MSGESTURETAP: 'MSGestureTap',\n MSGOTPOINTERCAPTURE: 'MSGotPointerCapture',\n MSINERTIASTART: 'MSInertiaStart',\n MSLOSTPOINTERCAPTURE: 'MSLostPointerCapture',\n MSPOINTERCANCEL: 'MSPointerCancel',\n MSPOINTERDOWN: 'MSPointerDown',\n MSPOINTERENTER: 'MSPointerEnter',\n MSPOINTERHOVER: 'MSPointerHover',\n MSPOINTERLEAVE: 'MSPointerLeave',\n MSPOINTERMOVE: 'MSPointerMove',\n MSPOINTEROUT: 'MSPointerOut',\n MSPOINTEROVER: 'MSPointerOver',\n MSPOINTERUP: 'MSPointerUp',\n\n // Native IMEs/input tools events.\n TEXT: 'text',\n // The textInput event is supported in IE9+, but only in lower case. All other\n // browsers use the camel-case event name.\n TEXTINPUT: goog.userAgent.IE ? 'textinput' : 'textInput',\n COMPOSITIONSTART: 'compositionstart',\n COMPOSITIONUPDATE: 'compositionupdate',\n COMPOSITIONEND: 'compositionend',\n\n // The beforeinput event is initially only supported in Safari. See\n // https://bugs.chromium.org/p/chromium/issues/detail?id=342670 for Chrome\n // implementation tracking.\n BEFOREINPUT: 'beforeinput',\n\n // Webview tag events\n // See https://developer.chrome.com/apps/tags/webview\n EXIT: 'exit',\n LOADABORT: 'loadabort',\n LOADCOMMIT: 'loadcommit',\n LOADREDIRECT: 'loadredirect',\n LOADSTART: 'loadstart',\n LOADSTOP: 'loadstop',\n RESPONSIVE: 'responsive',\n SIZECHANGED: 'sizechanged',\n UNRESPONSIVE: 'unresponsive',\n\n // HTML5 Page Visibility API. See details at\n // `goog.labs.dom.PageVisibilityMonitor`.\n VISIBILITYCHANGE: 'visibilitychange',\n\n // LocalStorage event.\n STORAGE: 'storage',\n\n // DOM Level 2 mutation events (deprecated).\n DOMSUBTREEMODIFIED: 'DOMSubtreeModified',\n DOMNODEINSERTED: 'DOMNodeInserted',\n DOMNODEREMOVED: 'DOMNodeRemoved',\n DOMNODEREMOVEDFROMDOCUMENT: 'DOMNodeRemovedFromDocument',\n DOMNODEINSERTEDINTODOCUMENT: 'DOMNodeInsertedIntoDocument',\n DOMATTRMODIFIED: 'DOMAttrModified',\n DOMCHARACTERDATAMODIFIED: 'DOMCharacterDataModified',\n\n // Print events.\n BEFOREPRINT: 'beforeprint',\n AFTERPRINT: 'afterprint',\n\n // Web app manifest events.\n BEFOREINSTALLPROMPT: 'beforeinstallprompt',\n APPINSTALLED: 'appinstalled'\n};\n\n\n/**\n * Returns one of the given pointer fallback event names in order of preference:\n * 1. pointerEventName\n * 2. msPointerEventName\n * 3. fallbackEventName\n * @param {string} pointerEventName\n * @param {string} msPointerEventName\n * @param {string} fallbackEventName\n * @return {string} The supported pointer or fallback (mouse or touch) event\n * name.\n * @private\n */\ngoog.events.getPointerFallbackEventName_ = function(\n pointerEventName, msPointerEventName, fallbackEventName) {\n 'use strict';\n if (goog.events.BrowserFeature.POINTER_EVENTS) {\n return pointerEventName;\n }\n if (goog.events.BrowserFeature.MSPOINTER_EVENTS) {\n return msPointerEventName;\n }\n return fallbackEventName;\n};\n\n\n/**\n * Constants for pointer event names that fall back to corresponding mouse event\n * names on unsupported platforms. These are intended to be drop-in replacements\n * for corresponding values in `goog.events.EventType`.\n * @enum {string}\n */\ngoog.events.PointerFallbackEventType = {\n POINTERDOWN: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTERDOWN, goog.events.EventType.MSPOINTERDOWN,\n goog.events.EventType.MOUSEDOWN),\n POINTERUP: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTERUP, goog.events.EventType.MSPOINTERUP,\n goog.events.EventType.MOUSEUP),\n POINTERCANCEL: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTERCANCEL,\n goog.events.EventType.MSPOINTERCANCEL,\n // When falling back to mouse events, there is no MOUSECANCEL equivalent\n // of POINTERCANCEL. In this case POINTERUP already falls back to MOUSEUP\n // which represents both UP and CANCEL. POINTERCANCEL does not fall back\n // to MOUSEUP to prevent listening twice on the same event.\n goog.events.EventType.MOUSECANCEL),\n POINTERMOVE: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTERMOVE, goog.events.EventType.MSPOINTERMOVE,\n goog.events.EventType.MOUSEMOVE),\n POINTEROVER: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTEROVER, goog.events.EventType.MSPOINTEROVER,\n goog.events.EventType.MOUSEOVER),\n POINTEROUT: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTEROUT, goog.events.EventType.MSPOINTEROUT,\n goog.events.EventType.MOUSEOUT),\n POINTERENTER: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTERENTER, goog.events.EventType.MSPOINTERENTER,\n goog.events.EventType.MOUSEENTER),\n POINTERLEAVE: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTERLEAVE, goog.events.EventType.MSPOINTERLEAVE,\n goog.events.EventType.MOUSELEAVE)\n};\n\n\n/**\n * Constants for pointer event names that fall back to corresponding touch event\n * names on unsupported platforms. These are intended to be drop-in replacements\n * for corresponding values in `goog.events.EventType`.\n * @enum {string}\n */\ngoog.events.PointerTouchFallbackEventType = {\n POINTERDOWN: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTERDOWN, goog.events.EventType.MSPOINTERDOWN,\n goog.events.EventType.TOUCHSTART),\n POINTERUP: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTERUP, goog.events.EventType.MSPOINTERUP,\n goog.events.EventType.TOUCHEND),\n POINTERCANCEL: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTERCANCEL,\n goog.events.EventType.MSPOINTERCANCEL, goog.events.EventType.TOUCHCANCEL),\n POINTERMOVE: goog.events.getPointerFallbackEventName_(\n goog.events.EventType.POINTERMOVE, goog.events.EventType.MSPOINTERMOVE,\n goog.events.EventType.TOUCHMOVE)\n};\n\n\n/**\n * Mapping of mouse event names to underlying browser event names.\n * @typedef {{\n * MOUSEDOWN: string,\n * MOUSEUP: string,\n * MOUSECANCEL:string,\n * MOUSEMOVE:string,\n * MOUSEOVER:string,\n * MOUSEOUT:string,\n * MOUSEENTER:string,\n * MOUSELEAVE: string,\n * }}\n */\ngoog.events.MouseEvents;\n\n\n/**\n * An alias for `goog.events.EventType.MOUSE*` event types that is overridden by\n * corresponding `POINTER*` event types.\n * @const {!goog.events.MouseEvents}\n */\ngoog.events.PointerAsMouseEventType = {\n MOUSEDOWN: goog.events.PointerFallbackEventType.POINTERDOWN,\n MOUSEUP: goog.events.PointerFallbackEventType.POINTERUP,\n MOUSECANCEL: goog.events.PointerFallbackEventType.POINTERCANCEL,\n MOUSEMOVE: goog.events.PointerFallbackEventType.POINTERMOVE,\n MOUSEOVER: goog.events.PointerFallbackEventType.POINTEROVER,\n MOUSEOUT: goog.events.PointerFallbackEventType.POINTEROUT,\n MOUSEENTER: goog.events.PointerFallbackEventType.POINTERENTER,\n MOUSELEAVE: goog.events.PointerFallbackEventType.POINTERLEAVE\n};\n\n\n/**\n * An alias for `goog.events.EventType.MOUSE*` event types that continue to use\n * mouse events.\n * @const {!goog.events.MouseEvents}\n */\ngoog.events.MouseAsMouseEventType = {\n MOUSEDOWN: goog.events.EventType.MOUSEDOWN,\n MOUSEUP: goog.events.EventType.MOUSEUP,\n MOUSECANCEL: goog.events.EventType.MOUSECANCEL,\n MOUSEMOVE: goog.events.EventType.MOUSEMOVE,\n MOUSEOVER: goog.events.EventType.MOUSEOVER,\n MOUSEOUT: goog.events.EventType.MOUSEOUT,\n MOUSEENTER: goog.events.EventType.MOUSEENTER,\n MOUSELEAVE: goog.events.EventType.MOUSELEAVE\n};\n\n\n/**\n * An alias for `goog.events.EventType.TOUCH*` event types that is overridden by\n * corresponding `POINTER*` event types.\n * @enum {string}\n */\ngoog.events.PointerAsTouchEventType = {\n TOUCHCANCEL: goog.events.PointerTouchFallbackEventType.POINTERCANCEL,\n TOUCHEND: goog.events.PointerTouchFallbackEventType.POINTERUP,\n TOUCHMOVE: goog.events.PointerTouchFallbackEventType.POINTERMOVE,\n TOUCHSTART: goog.events.PointerTouchFallbackEventType.POINTERDOWN\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview An interface for a listenable JavaScript object.\n */\n\ngoog.provide('goog.events.Listenable');\n\ngoog.requireType('goog.events.EventId');\ngoog.requireType('goog.events.EventLike');\ngoog.requireType('goog.events.ListenableKey');\n\n\n/**\n * A listenable interface. A listenable is an object with the ability\n * to dispatch/broadcast events to \"event listeners\" registered via\n * listen/listenOnce.\n *\n * The interface allows for an event propagation mechanism similar\n * to one offered by native browser event targets, such as\n * capture/bubble mechanism, stopping propagation, and preventing\n * default actions. Capture/bubble mechanism depends on the ancestor\n * tree constructed via `#getParentEventTarget`; this tree\n * must be directed acyclic graph. The meaning of default action(s)\n * in preventDefault is specific to a particular use case.\n *\n * Implementations that do not support capture/bubble or can not have\n * a parent listenable can simply not implement any ability to set the\n * parent listenable (and have `#getParentEventTarget` return\n * null).\n *\n * Implementation of this class can be used with or independently from\n * goog.events.\n *\n * Implementation must call `#addImplementation(implClass)`.\n *\n * @interface\n * @see goog.events\n * @see http://www.w3.org/TR/DOM-Level-2-Events/events.html\n */\ngoog.events.Listenable = function() {};\n\n\n/**\n * An expando property to indicate that an object implements\n * goog.events.Listenable.\n *\n * See addImplementation/isImplementedBy.\n *\n * @type {string}\n * @const\n */\ngoog.events.Listenable.IMPLEMENTED_BY_PROP =\n 'closure_listenable_' + ((Math.random() * 1e6) | 0);\n\n\n/**\n * Marks a given class (constructor) as an implementation of\n * Listenable, so that we can query that fact at runtime. The class\n * must have already implemented the interface.\n * @param {function(new:goog.events.Listenable,...)} cls The class constructor.\n * The corresponding class must have already implemented the interface.\n */\ngoog.events.Listenable.addImplementation = function(cls) {\n 'use strict';\n cls.prototype[goog.events.Listenable.IMPLEMENTED_BY_PROP] = true;\n};\n\n\n/**\n * @param {?Object} obj The object to check.\n * @return {boolean} Whether a given instance implements Listenable. The\n * class/superclass of the instance must call addImplementation.\n */\ngoog.events.Listenable.isImplementedBy = function(obj) {\n 'use strict';\n return !!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]);\n};\n\n\n/**\n * Adds an event listener. A listener can only be added once to an\n * object and if it is added again the key for the listener is\n * returned. Note that if the existing listener is a one-off listener\n * (registered via listenOnce), it will no longer be a one-off\n * listener after a call to listen().\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback\n * method.\n * @param {boolean=} opt_useCapture Whether to fire in capture phase\n * (defaults to false).\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call the\n * listener.\n * @return {!goog.events.ListenableKey} Unique key for the listener.\n * @template SCOPE,EVENTOBJ\n */\ngoog.events.Listenable.prototype.listen = function(\n type, listener, opt_useCapture, opt_listenerScope) {};\n\n\n/**\n * Adds an event listener that is removed automatically after the\n * listener fired once.\n *\n * If an existing listener already exists, listenOnce will do\n * nothing. In particular, if the listener was previously registered\n * via listen(), listenOnce() will not turn the listener into a\n * one-off listener. Similarly, if there is already an existing\n * one-off listener, listenOnce does not modify the listeners (it is\n * still a once listener).\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback\n * method.\n * @param {boolean=} opt_useCapture Whether to fire in capture phase\n * (defaults to false).\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call the\n * listener.\n * @return {!goog.events.ListenableKey} Unique key for the listener.\n * @template SCOPE,EVENTOBJ\n */\ngoog.events.Listenable.prototype.listenOnce = function(\n type, listener, opt_useCapture, opt_listenerScope) {};\n\n\n/**\n * Removes an event listener which was added with listen() or listenOnce().\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback\n * method.\n * @param {boolean=} opt_useCapture Whether to fire in capture phase\n * (defaults to false).\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call\n * the listener.\n * @return {boolean} Whether any listener was removed.\n * @template SCOPE,EVENTOBJ\n */\ngoog.events.Listenable.prototype.unlisten = function(\n type, listener, opt_useCapture, opt_listenerScope) {};\n\n\n/**\n * Removes an event listener which was added with listen() by the key\n * returned by listen().\n *\n * @param {!goog.events.ListenableKey} key The key returned by\n * listen() or listenOnce().\n * @return {boolean} Whether any listener was removed.\n */\ngoog.events.Listenable.prototype.unlistenByKey = function(key) {};\n\n\n/**\n * Dispatches an event (or event like object) and calls all listeners\n * listening for events of this type. The type of the event is decided by the\n * type property on the event object.\n *\n * If any of the listeners returns false OR calls preventDefault then this\n * function will return false. If one of the capture listeners calls\n * stopPropagation, then the bubble listeners won't fire.\n *\n * @param {?goog.events.EventLike} e Event object.\n * @return {boolean} If anyone called preventDefault on the event object (or\n * if any of the listeners returns false) this will also return false.\n */\ngoog.events.Listenable.prototype.dispatchEvent = function(e) {};\n\n\n/**\n * Removes all listeners from this listenable. If type is specified,\n * it will only remove listeners of the particular type. otherwise all\n * registered listeners will be removed.\n *\n * @param {string|!goog.events.EventId=} opt_type Type of event to remove,\n * default is to remove all types.\n * @return {number} Number of listeners removed.\n */\ngoog.events.Listenable.prototype.removeAllListeners = function(opt_type) {};\n\n\n/**\n * Returns the parent of this event target to use for capture/bubble\n * mechanism.\n *\n * NOTE(chrishenry): The name reflects the original implementation of\n * custom event target (`goog.events.EventTarget`). We decided\n * that changing the name is not worth it.\n *\n * @return {?goog.events.Listenable} The parent EventTarget or null if\n * there is no parent.\n */\ngoog.events.Listenable.prototype.getParentEventTarget = function() {};\n\n\n/**\n * Fires all registered listeners in this listenable for the given\n * type and capture mode, passing them the given eventObject. This\n * does not perform actual capture/bubble. Only implementors of the\n * interface should be using this.\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The type of the\n * listeners to fire.\n * @param {boolean} capture The capture mode of the listeners to fire.\n * @param {EVENTOBJ} eventObject The event object to fire.\n * @return {boolean} Whether all listeners succeeded without\n * attempting to prevent default behavior. If any listener returns\n * false or called goog.events.Event#preventDefault, this returns\n * false.\n * @template EVENTOBJ\n */\ngoog.events.Listenable.prototype.fireListeners = function(\n type, capture, eventObject) {};\n\n\n/**\n * Gets all listeners in this listenable for the given type and\n * capture mode.\n *\n * @param {string|!goog.events.EventId} type The type of the listeners to fire.\n * @param {boolean} capture The capture mode of the listeners to fire.\n * @return {!Array<!goog.events.ListenableKey>} An array of registered\n * listeners.\n * @template EVENTOBJ\n */\ngoog.events.Listenable.prototype.getListeners = function(type, capture) {};\n\n\n/**\n * Gets the goog.events.ListenableKey for the event or null if no such\n * listener is in use.\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The name of the event\n * without the 'on' prefix.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener The\n * listener function to get.\n * @param {boolean} capture Whether the listener is a capturing listener.\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call the\n * listener.\n * @return {?goog.events.ListenableKey} the found listener or null if not found.\n * @template SCOPE,EVENTOBJ\n */\ngoog.events.Listenable.prototype.getListener = function(\n type, listener, capture, opt_listenerScope) {};\n\n\n/**\n * Whether there is any active listeners matching the specified\n * signature. If either the type or capture parameters are\n * unspecified, the function will match on the remaining criteria.\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>=} opt_type Event type.\n * @param {boolean=} opt_capture Whether to check for capture or bubble\n * listeners.\n * @return {boolean} Whether there is any active listeners matching\n * the requested type and/or capture phase.\n * @template EVENTOBJ\n */\ngoog.events.Listenable.prototype.hasListener = function(\n opt_type, opt_capture) {};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview An interface that describes a single registered listener.\n */\ngoog.provide('goog.events.ListenableKey');\n\ngoog.requireType('goog.events.Listenable');\n\n\n/**\n * An interface that describes a single registered listener.\n * @interface\n */\ngoog.events.ListenableKey = function() {};\n\n\n/**\n * Counter used to create a unique key\n * @type {number}\n * @private\n */\ngoog.events.ListenableKey.counter_ = 0;\n\n\n/**\n * Reserves a key to be used for ListenableKey#key field.\n * @return {number} A number to be used to fill ListenableKey#key\n * field.\n */\ngoog.events.ListenableKey.reserveKey = function() {\n 'use strict';\n return ++goog.events.ListenableKey.counter_;\n};\n\n\n/**\n * The source event target.\n * @type {?Object|?goog.events.Listenable}\n */\ngoog.events.ListenableKey.prototype.src;\n\n\n/**\n * The event type the listener is listening to.\n * @type {string}\n */\ngoog.events.ListenableKey.prototype.type;\n\n\n/**\n * The listener function.\n * @type {function(?):?|{handleEvent:function(?):?}|null}\n */\ngoog.events.ListenableKey.prototype.listener;\n\n\n/**\n * Whether the listener works on capture phase.\n * @type {boolean}\n */\ngoog.events.ListenableKey.prototype.capture;\n\n\n/**\n * The 'this' object for the listener function's scope.\n * @type {?Object|undefined}\n */\ngoog.events.ListenableKey.prototype.handler;\n\n\n/**\n * A globally unique number to identify the key.\n * @type {number}\n */\ngoog.events.ListenableKey.prototype.key;\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Listener object.\n * @see ../demos/events.html\n */\n\ngoog.provide('goog.events.Listener');\n\ngoog.require('goog.events.ListenableKey');\ngoog.requireType('goog.events.Listenable');\n\n\n\n/**\n * Simple class that stores information about a listener\n * @param {function(?):?} listener Callback function.\n * @param {Function} proxy Wrapper for the listener that patches the event.\n * @param {EventTarget|goog.events.Listenable} src Source object for\n * the event.\n * @param {string} type Event type.\n * @param {boolean} capture Whether in capture or bubble phase.\n * @param {Object=} opt_handler Object in whose context to execute the callback.\n * @implements {goog.events.ListenableKey}\n * @constructor\n */\ngoog.events.Listener = function(\n listener, proxy, src, type, capture, opt_handler) {\n 'use strict';\n if (goog.events.Listener.ENABLE_MONITORING) {\n this.creationStack = new Error().stack;\n }\n\n /** @override */\n this.listener = listener;\n\n /**\n * A wrapper over the original listener. This is used solely to\n * handle native browser events (it is used to simulate the capture\n * phase and to patch the event object).\n * @type {Function}\n */\n this.proxy = proxy;\n\n /**\n * Object or node that callback is listening to\n * @type {EventTarget|goog.events.Listenable}\n */\n this.src = src;\n\n /**\n * The event type.\n * @const {string}\n */\n this.type = type;\n\n /**\n * Whether the listener is being called in the capture or bubble phase\n * @const {boolean}\n */\n this.capture = !!capture;\n\n /**\n * Optional object whose context to execute the listener in\n * @type {Object|undefined}\n */\n this.handler = opt_handler;\n\n /**\n * The key of the listener.\n * @const {number}\n * @override\n */\n this.key = goog.events.ListenableKey.reserveKey();\n\n /**\n * Whether to remove the listener after it has been called.\n * @type {boolean}\n */\n this.callOnce = false;\n\n /**\n * Whether the listener has been removed.\n * @type {boolean}\n */\n this.removed = false;\n};\n\n\n/**\n * @define {boolean} Whether to enable the monitoring of the\n * goog.events.Listener instances. Switching on the monitoring is only\n * recommended for debugging because it has a significant impact on\n * performance and memory usage. If switched off, the monitoring code\n * compiles down to 0 bytes.\n */\ngoog.events.Listener.ENABLE_MONITORING =\n goog.define('goog.events.Listener.ENABLE_MONITORING', false);\n\n\n/**\n * If monitoring the goog.events.Listener instances is enabled, stores the\n * creation stack trace of the Disposable instance.\n * @type {string}\n */\ngoog.events.Listener.prototype.creationStack;\n\n\n/**\n * Marks this listener as removed. This also remove references held by\n * this listener object (such as listener and event source).\n */\ngoog.events.Listener.prototype.markAsRemoved = function() {\n 'use strict';\n this.removed = true;\n this.listener = null;\n this.proxy = null;\n this.src = null;\n this.handler = null;\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview A map of listeners that provides utility functions to\n * deal with listeners on an event target. Used by\n * `goog.events.EventTarget`.\n *\n * WARNING: Do not use this class from outside goog.events package.\n *\n */\n\ngoog.provide('goog.events.ListenerMap');\n\ngoog.require('goog.array');\ngoog.require('goog.events.Listener');\ngoog.require('goog.object');\ngoog.requireType('goog.events.EventId');\ngoog.requireType('goog.events.Listenable');\ngoog.requireType('goog.events.ListenableKey');\n\n\n\n/**\n * Creates a new listener map.\n * @param {EventTarget|goog.events.Listenable} src The src object.\n * @constructor\n * @final\n */\ngoog.events.ListenerMap = function(src) {\n 'use strict';\n /** @type {EventTarget|goog.events.Listenable} */\n this.src = src;\n\n /**\n * Maps of event type to an array of listeners.\n * @type {!Object<string, !Array<!goog.events.Listener>>}\n */\n this.listeners = {};\n\n /**\n * The count of types in this map that have registered listeners.\n * @private {number}\n */\n this.typeCount_ = 0;\n};\n\n\n/**\n * @return {number} The count of event types in this map that actually\n * have registered listeners.\n */\ngoog.events.ListenerMap.prototype.getTypeCount = function() {\n 'use strict';\n return this.typeCount_;\n};\n\n\n/**\n * @return {number} Total number of registered listeners.\n */\ngoog.events.ListenerMap.prototype.getListenerCount = function() {\n 'use strict';\n var count = 0;\n for (var type in this.listeners) {\n count += this.listeners[type].length;\n }\n return count;\n};\n\n\n/**\n * Adds an event listener. A listener can only be added once to an\n * object and if it is added again the key for the listener is\n * returned.\n *\n * Note that a one-off listener will not change an existing listener,\n * if any. On the other hand a normal listener will change existing\n * one-off listener to become a normal listener.\n *\n * @param {string|!goog.events.EventId} type The listener event type.\n * @param {!Function} listener This listener callback method.\n * @param {boolean} callOnce Whether the listener is a one-off\n * listener.\n * @param {boolean=} opt_useCapture The capture mode of the listener.\n * @param {Object=} opt_listenerScope Object in whose scope to call the\n * listener.\n * @return {!goog.events.ListenableKey} Unique key for the listener.\n */\ngoog.events.ListenerMap.prototype.add = function(\n type, listener, callOnce, opt_useCapture, opt_listenerScope) {\n 'use strict';\n var typeStr = type.toString();\n var listenerArray = this.listeners[typeStr];\n if (!listenerArray) {\n listenerArray = this.listeners[typeStr] = [];\n this.typeCount_++;\n }\n\n var listenerObj;\n var index = goog.events.ListenerMap.findListenerIndex_(\n listenerArray, listener, opt_useCapture, opt_listenerScope);\n if (index > -1) {\n listenerObj = listenerArray[index];\n if (!callOnce) {\n // Ensure that, if there is an existing callOnce listener, it is no\n // longer a callOnce listener.\n listenerObj.callOnce = false;\n }\n } else {\n listenerObj = new goog.events.Listener(\n listener, null, this.src, typeStr, !!opt_useCapture, opt_listenerScope);\n listenerObj.callOnce = callOnce;\n listenerArray.push(listenerObj);\n }\n return listenerObj;\n};\n\n\n/**\n * Removes a matching listener.\n * @param {string|!goog.events.EventId} type The listener event type.\n * @param {!Function} listener This listener callback method.\n * @param {boolean=} opt_useCapture The capture mode of the listener.\n * @param {Object=} opt_listenerScope Object in whose scope to call the\n * listener.\n * @return {boolean} Whether any listener was removed.\n */\ngoog.events.ListenerMap.prototype.remove = function(\n type, listener, opt_useCapture, opt_listenerScope) {\n 'use strict';\n var typeStr = type.toString();\n if (!(typeStr in this.listeners)) {\n return false;\n }\n\n var listenerArray = this.listeners[typeStr];\n var index = goog.events.ListenerMap.findListenerIndex_(\n listenerArray, listener, opt_useCapture, opt_listenerScope);\n if (index > -1) {\n var listenerObj = listenerArray[index];\n listenerObj.markAsRemoved();\n goog.array.removeAt(listenerArray, index);\n if (listenerArray.length == 0) {\n delete this.listeners[typeStr];\n this.typeCount_--;\n }\n return true;\n }\n return false;\n};\n\n\n/**\n * Removes the given listener object.\n * @param {!goog.events.ListenableKey} listener The listener to remove.\n * @return {boolean} Whether the listener is removed.\n */\ngoog.events.ListenerMap.prototype.removeByKey = function(listener) {\n 'use strict';\n var type = listener.type;\n if (!(type in this.listeners)) {\n return false;\n }\n\n var removed = goog.array.remove(this.listeners[type], listener);\n if (removed) {\n /** @type {!goog.events.Listener} */ (listener).markAsRemoved();\n if (this.listeners[type].length == 0) {\n delete this.listeners[type];\n this.typeCount_--;\n }\n }\n return removed;\n};\n\n\n/**\n * Removes all listeners from this map. If opt_type is provided, only\n * listeners that match the given type are removed.\n * @param {string|!goog.events.EventId=} opt_type Type of event to remove.\n * @return {number} Number of listeners removed.\n */\ngoog.events.ListenerMap.prototype.removeAll = function(opt_type) {\n 'use strict';\n var typeStr = opt_type && opt_type.toString();\n var count = 0;\n for (var type in this.listeners) {\n if (!typeStr || type == typeStr) {\n var listenerArray = this.listeners[type];\n for (var i = 0; i < listenerArray.length; i++) {\n ++count;\n listenerArray[i].markAsRemoved();\n }\n delete this.listeners[type];\n this.typeCount_--;\n }\n }\n return count;\n};\n\n\n/**\n * Gets all listeners that match the given type and capture mode. The\n * returned array is a copy (but the listener objects are not).\n * @param {string|!goog.events.EventId} type The type of the listeners\n * to retrieve.\n * @param {boolean} capture The capture mode of the listeners to retrieve.\n * @return {!Array<!goog.events.ListenableKey>} An array of matching\n * listeners.\n */\ngoog.events.ListenerMap.prototype.getListeners = function(type, capture) {\n 'use strict';\n var listenerArray = this.listeners[type.toString()];\n var rv = [];\n if (listenerArray) {\n for (var i = 0; i < listenerArray.length; ++i) {\n var listenerObj = listenerArray[i];\n if (listenerObj.capture == capture) {\n rv.push(listenerObj);\n }\n }\n }\n return rv;\n};\n\n\n/**\n * Gets the goog.events.ListenableKey for the event or null if no such\n * listener is in use.\n *\n * @param {string|!goog.events.EventId} type The type of the listener\n * to retrieve.\n * @param {!Function} listener The listener function to get.\n * @param {boolean} capture Whether the listener is a capturing listener.\n * @param {Object=} opt_listenerScope Object in whose scope to call the\n * listener.\n * @return {goog.events.ListenableKey} the found listener or null if not found.\n */\ngoog.events.ListenerMap.prototype.getListener = function(\n type, listener, capture, opt_listenerScope) {\n 'use strict';\n var listenerArray = this.listeners[type.toString()];\n var i = -1;\n if (listenerArray) {\n i = goog.events.ListenerMap.findListenerIndex_(\n listenerArray, listener, capture, opt_listenerScope);\n }\n return i > -1 ? listenerArray[i] : null;\n};\n\n\n/**\n * Whether there is a matching listener. If either the type or capture\n * parameters are unspecified, the function will match on the\n * remaining criteria.\n *\n * @param {string|!goog.events.EventId=} opt_type The type of the listener.\n * @param {boolean=} opt_capture The capture mode of the listener.\n * @return {boolean} Whether there is an active listener matching\n * the requested type and/or capture phase.\n */\ngoog.events.ListenerMap.prototype.hasListener = function(\n opt_type, opt_capture) {\n 'use strict';\n var hasType = (opt_type !== undefined);\n var typeStr = hasType ? opt_type.toString() : '';\n var hasCapture = (opt_capture !== undefined);\n\n return goog.object.some(this.listeners, function(listenerArray, type) {\n 'use strict';\n for (var i = 0; i < listenerArray.length; ++i) {\n if ((!hasType || listenerArray[i].type == typeStr) &&\n (!hasCapture || listenerArray[i].capture == opt_capture)) {\n return true;\n }\n }\n\n return false;\n });\n};\n\n\n/**\n * Finds the index of a matching goog.events.Listener in the given\n * listenerArray.\n * @param {!Array<!goog.events.Listener>} listenerArray Array of listener.\n * @param {!Function} listener The listener function.\n * @param {boolean=} opt_useCapture The capture flag for the listener.\n * @param {Object=} opt_listenerScope The listener scope.\n * @return {number} The index of the matching listener within the\n * listenerArray.\n * @private\n */\ngoog.events.ListenerMap.findListenerIndex_ = function(\n listenerArray, listener, opt_useCapture, opt_listenerScope) {\n 'use strict';\n for (var i = 0; i < listenerArray.length; ++i) {\n var listenerObj = listenerArray[i];\n if (!listenerObj.removed && listenerObj.listener == listener &&\n listenerObj.capture == !!opt_useCapture &&\n listenerObj.handler == opt_listenerScope) {\n return i;\n }\n }\n return -1;\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview An event manager for both native browser event\n * targets and custom JavaScript event targets\n * (`goog.events.Listenable`). This provides an abstraction\n * over browsers' event systems.\n *\n * It also provides a simulation of W3C event model's capture phase in\n * Internet Explorer (IE 8 and below). Caveat: the simulation does not\n * interact well with listeners registered directly on the elements\n * (bypassing goog.events) or even with listeners registered via\n * goog.events in a separate JS binary. In these cases, we provide\n * no ordering guarantees.\n *\n * The listeners will receive a \"patched\" event object. Such event object\n * contains normalized values for certain event properties that differs in\n * different browsers.\n *\n * Example usage:\n * <pre>\n * goog.events.listen(myNode, 'click', function(e) { alert('woo') });\n * goog.events.listen(myNode, 'mouseover', mouseHandler, true);\n * goog.events.unlisten(myNode, 'mouseover', mouseHandler, true);\n * goog.events.removeAll(myNode);\n * </pre>\n *\n * in IE and event object patching]\n *\n * @see ../demos/events.html\n * @see ../demos/event-propagation.html\n * @see ../demos/stopevent.html\n */\n\n// IMPLEMENTATION NOTES:\n// goog.events stores an auxiliary data structure on each EventTarget\n// source being listened on. This allows us to take advantage of GC,\n// having the data structure GC'd when the EventTarget is GC'd. This\n// GC behavior is equivalent to using W3C DOM Events directly.\n\ngoog.provide('goog.events');\ngoog.provide('goog.events.CaptureSimulationMode');\ngoog.provide('goog.events.Key');\ngoog.provide('goog.events.ListenableType');\n\ngoog.require('goog.asserts');\ngoog.require('goog.debug.entryPointRegistry');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.BrowserFeature');\ngoog.require('goog.events.Listenable');\ngoog.require('goog.events.ListenerMap');\ngoog.requireType('goog.debug.ErrorHandler');\ngoog.requireType('goog.events.EventId');\ngoog.requireType('goog.events.EventLike');\ngoog.requireType('goog.events.EventWrapper');\ngoog.requireType('goog.events.ListenableKey');\ngoog.requireType('goog.events.Listener');\n\n\n/**\n * @typedef {number|goog.events.ListenableKey}\n */\ngoog.events.Key;\n\n\n/**\n * @typedef {EventTarget|goog.events.Listenable}\n */\ngoog.events.ListenableType;\n\n\n/**\n * Property name on a native event target for the listener map\n * associated with the event target.\n * @private @const {string}\n */\ngoog.events.LISTENER_MAP_PROP_ = 'closure_lm_' + ((Math.random() * 1e6) | 0);\n\n\n/**\n * String used to prepend to IE event types.\n * @const\n * @private\n */\ngoog.events.onString_ = 'on';\n\n\n/**\n * Map of computed \"on<eventname>\" strings for IE event types. Caching\n * this removes an extra object allocation in goog.events.listen which\n * improves IE6 performance.\n * @const\n * @dict\n * @private\n */\ngoog.events.onStringMap_ = {};\n\n\n/**\n * @enum {number} Different capture simulation mode for IE8-.\n */\ngoog.events.CaptureSimulationMode = {\n /**\n * Does not perform capture simulation. Will asserts in IE8- when you\n * add capture listeners.\n */\n OFF_AND_FAIL: 0,\n\n /**\n * Does not perform capture simulation, silently ignore capture\n * listeners.\n */\n OFF_AND_SILENT: 1,\n\n /**\n * Performs capture simulation.\n */\n ON: 2\n};\n\n\n/**\n * @define {number} The capture simulation mode for IE8-. By default,\n * this is ON.\n */\ngoog.events.CAPTURE_SIMULATION_MODE =\n goog.define('goog.events.CAPTURE_SIMULATION_MODE', 2);\n\n\n/**\n * Estimated count of total native listeners.\n * @private {number}\n */\ngoog.events.listenerCountEstimate_ = 0;\n\n\n/**\n * Adds an event listener for a specific event on a native event\n * target (such as a DOM element) or an object that has implemented\n * {@link goog.events.Listenable}. A listener can only be added once\n * to an object and if it is added again the key for the listener is\n * returned. Note that if the existing listener is a one-off listener\n * (registered via listenOnce), it will no longer be a one-off\n * listener after a call to listen().\n *\n * @param {EventTarget|goog.events.Listenable} src The node to listen\n * to events on.\n * @param {string|Array<string>|\n * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n * type Event type or array of event types.\n * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null}\n * listener Callback method, or an object with a handleEvent function.\n * WARNING: passing an Object is now softly deprecated.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @param {T=} opt_handler Element in whose scope to call the listener.\n * @return {goog.events.Key} Unique key for the listener.\n * @template T,EVENTOBJ\n */\ngoog.events.listen = function(src, type, listener, opt_options, opt_handler) {\n 'use strict';\n if (opt_options && opt_options.once) {\n return goog.events.listenOnce(\n src, type, listener, opt_options, opt_handler);\n }\n if (Array.isArray(type)) {\n for (var i = 0; i < type.length; i++) {\n goog.events.listen(src, type[i], listener, opt_options, opt_handler);\n }\n return null;\n }\n\n listener = goog.events.wrapListener(listener);\n if (goog.events.Listenable.isImplementedBy(src)) {\n var capture =\n goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;\n return src.listen(\n /** @type {string|!goog.events.EventId} */ (type), listener, capture,\n opt_handler);\n } else {\n return goog.events.listen_(\n /** @type {!EventTarget} */ (src), type, listener,\n /* callOnce */ false, opt_options, opt_handler);\n }\n};\n\n\n/**\n * Adds an event listener for a specific event on a native event\n * target. A listener can only be added once to an object and if it\n * is added again the key for the listener is returned.\n *\n * Note that a one-off listener will not change an existing listener,\n * if any. On the other hand a normal listener will change existing\n * one-off listener to become a normal listener.\n *\n * @param {EventTarget} src The node to listen to events on.\n * @param {string|?goog.events.EventId<EVENTOBJ>} type Event type.\n * @param {!Function} listener Callback function.\n * @param {boolean} callOnce Whether the listener is a one-off\n * listener or otherwise.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @param {Object=} opt_handler Element in whose scope to call the listener.\n * @return {goog.events.ListenableKey} Unique key for the listener.\n * @template EVENTOBJ\n * @private\n */\ngoog.events.listen_ = function(\n src, type, listener, callOnce, opt_options, opt_handler) {\n 'use strict';\n if (!type) {\n throw new Error('Invalid event type');\n }\n\n var capture =\n goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;\n if (capture && !goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {\n if (goog.events.CAPTURE_SIMULATION_MODE ==\n goog.events.CaptureSimulationMode.OFF_AND_FAIL) {\n goog.asserts.fail('Can not register capture listener in IE8-.');\n return null;\n } else if (\n goog.events.CAPTURE_SIMULATION_MODE ==\n goog.events.CaptureSimulationMode.OFF_AND_SILENT) {\n return null;\n }\n }\n\n var listenerMap = goog.events.getListenerMap_(src);\n if (!listenerMap) {\n src[goog.events.LISTENER_MAP_PROP_] = listenerMap =\n new goog.events.ListenerMap(src);\n }\n\n var listenerObj = /** @type {goog.events.Listener} */ (\n listenerMap.add(type, listener, callOnce, capture, opt_handler));\n\n // If the listenerObj already has a proxy, it has been set up\n // previously. We simply return.\n if (listenerObj.proxy) {\n return listenerObj;\n }\n\n var proxy = goog.events.getProxy();\n listenerObj.proxy = proxy;\n\n proxy.src = src;\n proxy.listener = listenerObj;\n\n // Attach the proxy through the browser's API\n if (src.addEventListener) {\n // Don't pass an object as `capture` if the browser doesn't support that.\n if (!goog.events.BrowserFeature.PASSIVE_EVENTS) {\n opt_options = capture;\n }\n // Don't break tests that expect a boolean.\n if (opt_options === undefined) opt_options = false;\n src.addEventListener(type.toString(), proxy, opt_options);\n } else if (src.attachEvent) {\n // The else if above used to be an unconditional else. It would call\n // attachEvent come gws or high water. This would sometimes throw an\n // exception on IE11, spoiling the day of some callers. The previous\n // incarnation of this code, from 2007, indicates that it replaced an\n // earlier still version that caused excess allocations on IE6.\n src.attachEvent(goog.events.getOnString_(type.toString()), proxy);\n } else if (src.addListener && src.removeListener) {\n // In IE, MediaQueryList uses addListener() insteadd of addEventListener. In\n // Safari, there is no global for the MediaQueryList constructor, so we just\n // check whether the object \"looks like\" MediaQueryList.\n goog.asserts.assert(\n type === 'change', 'MediaQueryList only has a change event');\n src.addListener(proxy);\n } else {\n throw new Error('addEventListener and attachEvent are unavailable.');\n }\n\n goog.events.listenerCountEstimate_++;\n return listenerObj;\n};\n\n\n/**\n * Helper function for returning a proxy function.\n * @return {!Function} A new or reused function object.\n */\ngoog.events.getProxy = function() {\n 'use strict';\n var proxyCallbackFunction = goog.events.handleBrowserEvent_;\n // Use a local var f to prevent one allocation.\n var f =\n goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT ? function(eventObject) {\n 'use strict';\n return proxyCallbackFunction.call(f.src, f.listener, eventObject);\n } : function(eventObject) {\n 'use strict';\n var v = proxyCallbackFunction.call(f.src, f.listener, eventObject);\n // NOTE(chrishenry): In IE, we hack in a capture phase. However, if\n // there is inline event handler which tries to prevent default (for\n // example <a href=\"...\" onclick=\"return false\">...</a>) in a\n // descendant element, the prevent default will be overridden\n // by this listener if this listener were to return true. Hence, we\n // return undefined.\n if (!v) return v;\n };\n return f;\n};\n\n\n/**\n * Adds an event listener for a specific event on a native event\n * target (such as a DOM element) or an object that has implemented\n * {@link goog.events.Listenable}. After the event has fired the event\n * listener is removed from the target.\n *\n * If an existing listener already exists, listenOnce will do\n * nothing. In particular, if the listener was previously registered\n * via listen(), listenOnce() will not turn the listener into a\n * one-off listener. Similarly, if there is already an existing\n * one-off listener, listenOnce does not modify the listeners (it is\n * still a once listener).\n *\n * @param {EventTarget|goog.events.Listenable} src The node to listen\n * to events on.\n * @param {string|Array<string>|\n * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n * type Event type or array of event types.\n * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null}\n * listener Callback method.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @param {T=} opt_handler Element in whose scope to call the listener.\n * @return {goog.events.Key} Unique key for the listener.\n * @template T,EVENTOBJ\n */\ngoog.events.listenOnce = function(\n src, type, listener, opt_options, opt_handler) {\n 'use strict';\n if (Array.isArray(type)) {\n for (var i = 0; i < type.length; i++) {\n goog.events.listenOnce(src, type[i], listener, opt_options, opt_handler);\n }\n return null;\n }\n\n listener = goog.events.wrapListener(listener);\n if (goog.events.Listenable.isImplementedBy(src)) {\n var capture =\n goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;\n return src.listenOnce(\n /** @type {string|!goog.events.EventId} */ (type), listener, capture,\n opt_handler);\n } else {\n return goog.events.listen_(\n /** @type {!EventTarget} */ (src), type, listener,\n /* callOnce */ true, opt_options, opt_handler);\n }\n};\n\n\n/**\n * Adds an event listener with a specific event wrapper on a DOM Node or an\n * object that has implemented {@link goog.events.Listenable}. A listener can\n * only be added once to an object.\n *\n * @param {EventTarget|goog.events.Listenable} src The target to\n * listen to events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(this:T, ?):?|{handleEvent:function(?):?}|null} listener\n * Callback method, or an object with a handleEvent function.\n * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to\n * false).\n * @param {T=} opt_handler Element in whose scope to call the listener.\n * @template T\n */\ngoog.events.listenWithWrapper = function(\n src, wrapper, listener, opt_capt, opt_handler) {\n 'use strict';\n wrapper.listen(src, listener, opt_capt, opt_handler);\n};\n\n\n/**\n * Removes an event listener which was added with listen().\n *\n * @param {EventTarget|goog.events.Listenable} src The target to stop\n * listening to events on.\n * @param {string|Array<string>|\n * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n * type Event type or array of event types to unlisten to.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener The\n * listener function to remove.\n * @param {(boolean|!EventListenerOptions)=} opt_options\n * whether the listener is fired during the capture or bubble phase of the\n * event.\n * @param {Object=} opt_handler Element in whose scope to call the listener.\n * @return {?boolean} indicating whether the listener was there to remove.\n * @template EVENTOBJ\n */\ngoog.events.unlisten = function(src, type, listener, opt_options, opt_handler) {\n 'use strict';\n if (Array.isArray(type)) {\n for (var i = 0; i < type.length; i++) {\n goog.events.unlisten(src, type[i], listener, opt_options, opt_handler);\n }\n return null;\n }\n var capture =\n goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;\n\n listener = goog.events.wrapListener(listener);\n if (goog.events.Listenable.isImplementedBy(src)) {\n return src.unlisten(\n /** @type {string|!goog.events.EventId} */ (type), listener, capture,\n opt_handler);\n }\n\n if (!src) {\n // TODO(chrishenry): We should tighten the API to only accept\n // non-null objects, or add an assertion here.\n return false;\n }\n\n var listenerMap = goog.events.getListenerMap_(\n /** @type {!EventTarget} */ (src));\n if (listenerMap) {\n var listenerObj = listenerMap.getListener(\n /** @type {string|!goog.events.EventId} */ (type), listener, capture,\n opt_handler);\n if (listenerObj) {\n return goog.events.unlistenByKey(listenerObj);\n }\n }\n\n return false;\n};\n\n\n/**\n * Removes an event listener which was added with listen() by the key\n * returned by listen().\n *\n * @param {goog.events.Key} key The key returned by listen() for this\n * event listener.\n * @return {boolean} indicating whether the listener was there to remove.\n */\ngoog.events.unlistenByKey = function(key) {\n 'use strict';\n // TODO(chrishenry): Remove this check when tests that rely on this\n // are fixed.\n if (typeof key === 'number') {\n return false;\n }\n\n var listener = key;\n if (!listener || listener.removed) {\n return false;\n }\n\n var src = listener.src;\n if (goog.events.Listenable.isImplementedBy(src)) {\n return /** @type {!goog.events.Listenable} */ (src).unlistenByKey(listener);\n }\n\n var type = listener.type;\n var proxy = listener.proxy;\n if (src.removeEventListener) {\n src.removeEventListener(type, proxy, listener.capture);\n } else if (src.detachEvent) {\n src.detachEvent(goog.events.getOnString_(type), proxy);\n } else if (src.addListener && src.removeListener) {\n src.removeListener(proxy);\n }\n goog.events.listenerCountEstimate_--;\n\n var listenerMap = goog.events.getListenerMap_(\n /** @type {!EventTarget} */ (src));\n // TODO(chrishenry): Try to remove this conditional and execute the\n // first branch always. This should be safe.\n if (listenerMap) {\n listenerMap.removeByKey(listener);\n if (listenerMap.getTypeCount() == 0) {\n // Null the src, just because this is simple to do (and useful\n // for IE <= 7).\n listenerMap.src = null;\n // We don't use delete here because IE does not allow delete\n // on a window object.\n src[goog.events.LISTENER_MAP_PROP_] = null;\n }\n } else {\n /** @type {!goog.events.Listener} */ (listener).markAsRemoved();\n }\n\n return true;\n};\n\n\n/**\n * Removes an event listener which was added with listenWithWrapper().\n *\n * @param {EventTarget|goog.events.Listenable} src The target to stop\n * listening to events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener The\n * listener function to remove.\n * @param {boolean=} opt_capt In DOM-compliant browsers, this determines\n * whether the listener is fired during the capture or bubble phase of the\n * event.\n * @param {Object=} opt_handler Element in whose scope to call the listener.\n */\ngoog.events.unlistenWithWrapper = function(\n src, wrapper, listener, opt_capt, opt_handler) {\n 'use strict';\n wrapper.unlisten(src, listener, opt_capt, opt_handler);\n};\n\n\n/**\n * Removes all listeners from an object. You can also optionally\n * remove listeners of a particular type.\n *\n * @param {Object|undefined} obj Object to remove listeners from. Must be an\n * EventTarget or a goog.events.Listenable.\n * @param {string|!goog.events.EventId=} opt_type Type of event to remove.\n * Default is all types.\n * @return {number} Number of listeners removed.\n */\ngoog.events.removeAll = function(obj, opt_type) {\n 'use strict';\n // TODO(chrishenry): Change the type of obj to\n // (!EventTarget|!goog.events.Listenable).\n\n if (!obj) {\n return 0;\n }\n\n if (goog.events.Listenable.isImplementedBy(obj)) {\n return /** @type {?} */ (obj).removeAllListeners(opt_type);\n }\n\n var listenerMap = goog.events.getListenerMap_(\n /** @type {!EventTarget} */ (obj));\n if (!listenerMap) {\n return 0;\n }\n\n var count = 0;\n var typeStr = opt_type && opt_type.toString();\n for (var type in listenerMap.listeners) {\n if (!typeStr || type == typeStr) {\n // Clone so that we don't need to worry about unlistenByKey\n // changing the content of the ListenerMap.\n var listeners = listenerMap.listeners[type].concat();\n for (var i = 0; i < listeners.length; ++i) {\n if (goog.events.unlistenByKey(listeners[i])) {\n ++count;\n }\n }\n }\n }\n return count;\n};\n\n\n/**\n * Gets the listeners for a given object, type and capture phase.\n *\n * @param {Object} obj Object to get listeners for.\n * @param {string|!goog.events.EventId} type Event type.\n * @param {boolean} capture Capture phase?.\n * @return {!Array<!goog.events.Listener>} Array of listener objects.\n */\ngoog.events.getListeners = function(obj, type, capture) {\n 'use strict';\n if (goog.events.Listenable.isImplementedBy(obj)) {\n return /** @type {!goog.events.Listenable} */ (obj).getListeners(\n type, capture);\n } else {\n if (!obj) {\n // TODO(chrishenry): We should tighten the API to accept\n // !EventTarget|goog.events.Listenable, and add an assertion here.\n return [];\n }\n\n var listenerMap = goog.events.getListenerMap_(\n /** @type {!EventTarget} */ (obj));\n return listenerMap ? listenerMap.getListeners(type, capture) : [];\n }\n};\n\n\n/**\n * Gets the goog.events.Listener for the event or null if no such listener is\n * in use.\n *\n * @param {EventTarget|goog.events.Listenable} src The target from\n * which to get listeners.\n * @param {?string|!goog.events.EventId<EVENTOBJ>} type The type of the event.\n * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null} listener The\n * listener function to get.\n * @param {boolean=} opt_capt In DOM-compliant browsers, this determines\n * whether the listener is fired during the\n * capture or bubble phase of the event.\n * @param {Object=} opt_handler Element in whose scope to call the listener.\n * @return {goog.events.ListenableKey} the found listener or null if not found.\n * @template EVENTOBJ\n */\ngoog.events.getListener = function(src, type, listener, opt_capt, opt_handler) {\n 'use strict';\n // TODO(chrishenry): Change type from ?string to string, or add assertion.\n type = /** @type {string} */ (type);\n listener = goog.events.wrapListener(listener);\n var capture = !!opt_capt;\n if (goog.events.Listenable.isImplementedBy(src)) {\n return src.getListener(type, listener, capture, opt_handler);\n }\n\n if (!src) {\n // TODO(chrishenry): We should tighten the API to only accept\n // non-null objects, or add an assertion here.\n return null;\n }\n\n var listenerMap = goog.events.getListenerMap_(\n /** @type {!EventTarget} */ (src));\n if (listenerMap) {\n return listenerMap.getListener(type, listener, capture, opt_handler);\n }\n return null;\n};\n\n\n/**\n * Returns whether an event target has any active listeners matching the\n * specified signature. If either the type or capture parameters are\n * unspecified, the function will match on the remaining criteria.\n *\n * @param {EventTarget|goog.events.Listenable} obj Target to get\n * listeners for.\n * @param {string|!goog.events.EventId=} opt_type Event type.\n * @param {boolean=} opt_capture Whether to check for capture or bubble-phase\n * listeners.\n * @return {boolean} Whether an event target has one or more listeners matching\n * the requested type and/or capture phase.\n */\ngoog.events.hasListener = function(obj, opt_type, opt_capture) {\n 'use strict';\n if (goog.events.Listenable.isImplementedBy(obj)) {\n return obj.hasListener(opt_type, opt_capture);\n }\n\n var listenerMap = goog.events.getListenerMap_(\n /** @type {!EventTarget} */ (obj));\n return !!listenerMap && listenerMap.hasListener(opt_type, opt_capture);\n};\n\n\n/**\n * Provides a nice string showing the normalized event objects public members\n * @param {Object} e Event Object.\n * @return {string} String of the public members of the normalized event object.\n */\ngoog.events.expose = function(e) {\n 'use strict';\n var str = [];\n for (var key in e) {\n if (e[key] && e[key].id) {\n str.push(key + ' = ' + e[key] + ' (' + e[key].id + ')');\n } else {\n str.push(key + ' = ' + e[key]);\n }\n }\n return str.join('\\n');\n};\n\n\n/**\n * Returns a string with on prepended to the specified type. This is used for IE\n * which expects \"on\" to be prepended. This function caches the string in order\n * to avoid extra allocations in steady state.\n * @param {string} type Event type.\n * @return {string} The type string with 'on' prepended.\n * @private\n */\ngoog.events.getOnString_ = function(type) {\n 'use strict';\n if (type in goog.events.onStringMap_) {\n return goog.events.onStringMap_[type];\n }\n return goog.events.onStringMap_[type] = goog.events.onString_ + type;\n};\n\n\n/**\n * Fires an object's listeners of a particular type and phase\n *\n * @param {Object} obj Object whose listeners to call.\n * @param {string|!goog.events.EventId} type Event type.\n * @param {boolean} capture Which event phase.\n * @param {Object} eventObject Event object to be passed to listener.\n * @return {boolean} True if all listeners returned true else false.\n */\ngoog.events.fireListeners = function(obj, type, capture, eventObject) {\n 'use strict';\n if (goog.events.Listenable.isImplementedBy(obj)) {\n return /** @type {!goog.events.Listenable} */ (obj).fireListeners(\n type, capture, eventObject);\n }\n\n return goog.events.fireListeners_(obj, type, capture, eventObject);\n};\n\n\n/**\n * Fires an object's listeners of a particular type and phase.\n * @param {Object} obj Object whose listeners to call.\n * @param {string|!goog.events.EventId} type Event type.\n * @param {boolean} capture Which event phase.\n * @param {Object} eventObject Event object to be passed to listener.\n * @return {boolean} True if all listeners returned true else false.\n * @private\n */\ngoog.events.fireListeners_ = function(obj, type, capture, eventObject) {\n 'use strict';\n /** @type {boolean} */\n var retval = true;\n\n var listenerMap = goog.events.getListenerMap_(\n /** @type {EventTarget} */ (obj));\n if (listenerMap) {\n // TODO(chrishenry): Original code avoids array creation when there\n // is no listener, so we do the same. If this optimization turns\n // out to be not required, we can replace this with\n // listenerMap.getListeners(type, capture) instead, which is simpler.\n var listenerArray = listenerMap.listeners[type.toString()];\n if (listenerArray) {\n listenerArray = listenerArray.concat();\n for (var i = 0; i < listenerArray.length; i++) {\n var listener = listenerArray[i];\n // We might not have a listener if the listener was removed.\n if (listener && listener.capture == capture && !listener.removed) {\n var result = goog.events.fireListener(listener, eventObject);\n retval = retval && (result !== false);\n }\n }\n }\n }\n return retval;\n};\n\n\n/**\n * Fires a listener with a set of arguments\n *\n * @param {goog.events.Listener} listener The listener object to call.\n * @param {Object} eventObject The event object to pass to the listener.\n * @return {*} Result of listener.\n */\ngoog.events.fireListener = function(listener, eventObject) {\n 'use strict';\n var listenerFn = listener.listener;\n var listenerHandler = listener.handler || listener.src;\n\n if (listener.callOnce) {\n goog.events.unlistenByKey(listener);\n }\n return listenerFn.call(listenerHandler, eventObject);\n};\n\n\n/**\n * Gets the total number of listeners currently in the system.\n * @return {number} Number of listeners.\n * @deprecated This returns estimated count, now that Closure no longer\n * stores a central listener registry. We still return an estimation\n * to keep existing listener-related tests passing. In the near future,\n * this function will be removed.\n */\ngoog.events.getTotalListenerCount = function() {\n 'use strict';\n return goog.events.listenerCountEstimate_;\n};\n\n\n/**\n * Dispatches an event (or event like object) and calls all listeners\n * listening for events of this type. The type of the event is decided by the\n * type property on the event object.\n *\n * If any of the listeners returns false OR calls preventDefault then this\n * function will return false. If one of the capture listeners calls\n * stopPropagation, then the bubble listeners won't fire.\n *\n * @param {goog.events.Listenable} src The event target.\n * @param {goog.events.EventLike} e Event object.\n * @return {boolean} If anyone called preventDefault on the event object (or\n * if any of the handlers returns false) this will also return false.\n * If there are no handlers, or if all handlers return true, this returns\n * true.\n */\ngoog.events.dispatchEvent = function(src, e) {\n 'use strict';\n goog.asserts.assert(\n goog.events.Listenable.isImplementedBy(src),\n 'Can not use goog.events.dispatchEvent with ' +\n 'non-goog.events.Listenable instance.');\n return src.dispatchEvent(e);\n};\n\n\n/**\n * Installs exception protection for the browser event entry point using the\n * given error handler.\n *\n * @param {goog.debug.ErrorHandler} errorHandler Error handler with which to\n * protect the entry point.\n */\ngoog.events.protectBrowserEventEntryPoint = function(errorHandler) {\n 'use strict';\n goog.events.handleBrowserEvent_ =\n errorHandler.protectEntryPoint(goog.events.handleBrowserEvent_);\n};\n\n\n/**\n * Handles an event and dispatches it to the correct listeners. This\n * function is a proxy for the real listener the user specified.\n *\n * @param {goog.events.Listener} listener The listener object.\n * @param {Event=} opt_evt Optional event object that gets passed in via the\n * native event handlers.\n * @return {*} Result of the event handler.\n * @this {EventTarget} The object or Element that fired the event.\n * @private\n */\ngoog.events.handleBrowserEvent_ = function(listener, opt_evt) {\n 'use strict';\n if (listener.removed) {\n return true;\n }\n\n // Synthesize event propagation if the browser does not support W3C\n // event model.\n if (!goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {\n var ieEvent = opt_evt ||\n /** @type {Event} */ (goog.getObjectByName('window.event'));\n var evt = new goog.events.BrowserEvent(ieEvent, this);\n /** @type {*} */\n var retval = true;\n\n if (goog.events.CAPTURE_SIMULATION_MODE ==\n goog.events.CaptureSimulationMode.ON) {\n // If we have not marked this event yet, we should perform capture\n // simulation.\n if (!goog.events.isMarkedIeEvent_(ieEvent)) {\n goog.events.markIeEvent_(ieEvent);\n\n var ancestors = [];\n for (var parent = evt.currentTarget; parent;\n parent = parent.parentNode) {\n ancestors.push(parent);\n }\n\n // Fire capture listeners.\n var type = listener.type;\n for (var i = ancestors.length - 1;\n !evt.hasPropagationStopped() && i >= 0; i--) {\n evt.currentTarget = ancestors[i];\n var result =\n goog.events.fireListeners_(ancestors[i], type, true, evt);\n retval = retval && result;\n }\n\n // Fire bubble listeners.\n //\n // We can technically rely on IE to perform bubble event\n // propagation. However, it turns out that IE fires events in\n // opposite order of attachEvent registration, which broke\n // some code and tests that rely on the order. (While W3C DOM\n // Level 2 Events TR leaves the event ordering unspecified,\n // modern browsers and W3C DOM Level 3 Events Working Draft\n // actually specify the order as the registration order.)\n for (var i = 0; !evt.hasPropagationStopped() && i < ancestors.length;\n i++) {\n evt.currentTarget = ancestors[i];\n var result =\n goog.events.fireListeners_(ancestors[i], type, false, evt);\n retval = retval && result;\n }\n }\n } else {\n retval = goog.events.fireListener(listener, evt);\n }\n return retval;\n }\n\n // Otherwise, simply fire the listener.\n return goog.events.fireListener(\n listener, new goog.events.BrowserEvent(opt_evt, this));\n};\n\n\n/**\n * This is used to mark the IE event object so we do not do the Closure pass\n * twice for a bubbling event.\n * @param {Event} e The IE browser event.\n * @private\n */\ngoog.events.markIeEvent_ = function(e) {\n 'use strict';\n // Only the keyCode and the returnValue can be changed. We use keyCode for\n // non keyboard events.\n // event.returnValue is a bit more tricky. It is undefined by default. A\n // boolean false prevents the default action. In a window.onbeforeunload and\n // the returnValue is non undefined it will be alerted. However, we will only\n // modify the returnValue for keyboard events. We can get a problem if non\n // closure events sets the keyCode or the returnValue\n\n var useReturnValue = false;\n\n if (e.keyCode == 0) {\n // We cannot change the keyCode in case that srcElement is input[type=file].\n // We could test that that is the case but that would allocate 3 objects.\n // If we use try/catch we will only allocate extra objects in the case of a\n // failure.\n\n try {\n e.keyCode = -1;\n return;\n } catch (ex) {\n useReturnValue = true;\n }\n }\n\n if (useReturnValue ||\n /** @type {boolean|undefined} */ (e.returnValue) == undefined) {\n e.returnValue = true;\n }\n};\n\n\n/**\n * This is used to check if an IE event has already been handled by the Closure\n * system so we do not do the Closure pass twice for a bubbling event.\n * @param {Event} e The IE browser event.\n * @return {boolean} True if the event object has been marked.\n * @private\n */\ngoog.events.isMarkedIeEvent_ = function(e) {\n 'use strict';\n return e.keyCode < 0 || e.returnValue != undefined;\n};\n\n\n/**\n * Counter to create unique event ids.\n * @private {number}\n */\ngoog.events.uniqueIdCounter_ = 0;\n\n\n/**\n * Creates a unique event id.\n *\n * @param {string} identifier The identifier.\n * @return {string} A unique identifier.\n * @idGenerator {unique}\n */\ngoog.events.getUniqueId = function(identifier) {\n 'use strict';\n return identifier + '_' + goog.events.uniqueIdCounter_++;\n};\n\n\n/**\n * @param {EventTarget} src The source object.\n * @return {goog.events.ListenerMap} A listener map for the given\n * source object, or null if none exists.\n * @private\n */\ngoog.events.getListenerMap_ = function(src) {\n 'use strict';\n var listenerMap = src[goog.events.LISTENER_MAP_PROP_];\n // IE serializes the property as well (e.g. when serializing outer\n // HTML). So we must check that the value is of the correct type.\n return listenerMap instanceof goog.events.ListenerMap ? listenerMap : null;\n};\n\n\n/**\n * Expando property for listener function wrapper for Object with\n * handleEvent.\n * @private @const {string}\n */\ngoog.events.LISTENER_WRAPPER_PROP_ =\n '__closure_events_fn_' + ((Math.random() * 1e9) >>> 0);\n\n\n/**\n * @param {Object|Function} listener The listener function or an\n * object that contains handleEvent method.\n * @return {!Function} Either the original function or a function that\n * calls obj.handleEvent. If the same listener is passed to this\n * function more than once, the same function is guaranteed to be\n * returned.\n */\ngoog.events.wrapListener = function(listener) {\n 'use strict';\n goog.asserts.assert(listener, 'Listener can not be null.');\n\n if (typeof listener === 'function') {\n return listener;\n }\n\n goog.asserts.assert(\n listener.handleEvent, 'An object listener must have handleEvent method.');\n if (!listener[goog.events.LISTENER_WRAPPER_PROP_]) {\n listener[goog.events.LISTENER_WRAPPER_PROP_] = function(e) {\n 'use strict';\n return /** @type {?} */ (listener).handleEvent(e);\n };\n }\n return listener[goog.events.LISTENER_WRAPPER_PROP_];\n};\n\n\n// Register the browser event handler as an entry point, so that\n// it can be monitored for exception handling, etc.\ngoog.debug.entryPointRegistry.register(\n /**\n * @param {function(!Function): !Function} transformer The transforming\n * function.\n */\n function(transformer) {\n 'use strict';\n goog.events.handleBrowserEvent_ =\n transformer(goog.events.handleBrowserEvent_);\n });\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview A disposable implementation of a custom\n * listenable/event target. See also: documentation for\n * `goog.events.Listenable`.\n *\n * @see ../demos/eventtarget.html\n * @see goog.events.Listenable\n */\n\ngoog.provide('goog.events.EventTarget');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.asserts');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.Listenable');\ngoog.require('goog.events.ListenerMap');\ngoog.require('goog.object');\ngoog.requireType('goog.events.EventId');\ngoog.requireType('goog.events.EventLike');\ngoog.requireType('goog.events.ListenableKey');\n\n\n\n/**\n * An implementation of `goog.events.Listenable` with full W3C\n * EventTarget-like support (capture/bubble mechanism, stopping event\n * propagation, preventing default actions).\n *\n * You may subclass this class to turn your class into a Listenable.\n *\n * Unless propagation is stopped, an event dispatched by an\n * EventTarget will bubble to the parent returned by\n * `getParentEventTarget`. To set the parent, call\n * `setParentEventTarget`. Subclasses that don't support\n * changing the parent can override the setter to throw an error.\n *\n * Example usage:\n * <pre>\n * var source = new goog.events.EventTarget();\n * function handleEvent(e) {\n * alert('Type: ' + e.type + '; Target: ' + e.target);\n * }\n * source.listen('foo', handleEvent);\n * // Or: goog.events.listen(source, 'foo', handleEvent);\n * ...\n * source.dispatchEvent('foo'); // will call handleEvent\n * ...\n * source.unlisten('foo', handleEvent);\n * // Or: goog.events.unlisten(source, 'foo', handleEvent);\n * </pre>\n *\n * @constructor\n * @extends {goog.Disposable}\n * @implements {goog.events.Listenable}\n */\ngoog.events.EventTarget = function() {\n 'use strict';\n goog.Disposable.call(this);\n\n /**\n * Maps of event type to an array of listeners.\n * @private {!goog.events.ListenerMap}\n */\n this.eventTargetListeners_ = new goog.events.ListenerMap(this);\n\n /**\n * The object to use for event.target. Useful when mixing in an\n * EventTarget to another object.\n * @private {!Object}\n */\n this.actualEventTarget_ = this;\n\n /**\n * Parent event target, used during event bubbling.\n *\n * TODO(chrishenry): Change this to goog.events.Listenable. This\n * currently breaks people who expect getParentEventTarget to return\n * goog.events.EventTarget.\n *\n * @private {?goog.events.EventTarget}\n */\n this.parentEventTarget_ = null;\n};\ngoog.inherits(goog.events.EventTarget, goog.Disposable);\ngoog.events.Listenable.addImplementation(goog.events.EventTarget);\n\n\n/**\n * An artificial cap on the number of ancestors you can have. This is mainly\n * for loop detection.\n * @const {number}\n * @private\n */\ngoog.events.EventTarget.MAX_ANCESTORS_ = 1000;\n\n\n/**\n * Returns the parent of this event target to use for bubbling.\n *\n * @return {goog.events.EventTarget} The parent EventTarget or null if\n * there is no parent.\n * @override\n */\ngoog.events.EventTarget.prototype.getParentEventTarget = function() {\n 'use strict';\n return this.parentEventTarget_;\n};\n\n\n/**\n * Sets the parent of this event target to use for capture/bubble\n * mechanism.\n * @param {goog.events.EventTarget} parent Parent listenable (null if none).\n */\ngoog.events.EventTarget.prototype.setParentEventTarget = function(parent) {\n 'use strict';\n this.parentEventTarget_ = parent;\n};\n\n\n/**\n * Adds an event listener to the event target. The same handler can only be\n * added once per the type. Even if you add the same handler multiple times\n * using the same type then it will only be called once when the event is\n * dispatched.\n *\n * @param {string|!goog.events.EventId} type The type of the event to listen for\n * @param {function(?):?|{handleEvent:function(?):?}|null} handler The function\n * to handle the event. The handler can also be an object that implements\n * the handleEvent method which takes the event object as argument.\n * @param {boolean=} opt_capture In DOM-compliant browsers, this determines\n * whether the listener is fired during the capture or bubble phase\n * of the event.\n * @param {Object=} opt_handlerScope Object in whose scope to call\n * the listener.\n * @deprecated Use `#listen` instead, when possible. Otherwise, use\n * `goog.events.listen` if you are passing Object\n * (instead of Function) as handler.\n */\ngoog.events.EventTarget.prototype.addEventListener = function(\n type, handler, opt_capture, opt_handlerScope) {\n 'use strict';\n goog.events.listen(this, type, handler, opt_capture, opt_handlerScope);\n};\n\n\n/**\n * Removes an event listener from the event target. The handler must be the\n * same object as the one added. If the handler has not been added then\n * nothing is done.\n *\n * @param {string|!goog.events.EventId} type The type of the event to listen for\n * @param {function(?):?|{handleEvent:function(?):?}|null} handler The function\n * to handle the event. The handler can also be an object that implements\n * the handleEvent method which takes the event object as argument.\n * @param {boolean=} opt_capture In DOM-compliant browsers, this determines\n * whether the listener is fired during the capture or bubble phase\n * of the event.\n * @param {Object=} opt_handlerScope Object in whose scope to call\n * the listener.\n * @deprecated Use `#unlisten` instead, when possible. Otherwise, use\n * `goog.events.unlisten` if you are passing Object\n * (instead of Function) as handler.\n */\ngoog.events.EventTarget.prototype.removeEventListener = function(\n type, handler, opt_capture, opt_handlerScope) {\n 'use strict';\n goog.events.unlisten(this, type, handler, opt_capture, opt_handlerScope);\n};\n\n\n/**\n * @param {?goog.events.EventLike} e Event object.\n * @return {boolean} If anyone called preventDefault on the event object (or\n * if any of the listeners returns false) this will also return false.\n * @override\n */\ngoog.events.EventTarget.prototype.dispatchEvent = function(e) {\n 'use strict';\n this.assertInitialized_();\n\n var ancestorsTree, ancestor = this.getParentEventTarget();\n if (ancestor) {\n ancestorsTree = [];\n var ancestorCount = 1;\n for (; ancestor; ancestor = ancestor.getParentEventTarget()) {\n ancestorsTree.push(ancestor);\n goog.asserts.assert(\n (++ancestorCount < goog.events.EventTarget.MAX_ANCESTORS_),\n 'infinite loop');\n }\n }\n\n return goog.events.EventTarget.dispatchEventInternal_(\n this.actualEventTarget_, e, ancestorsTree);\n};\n\n\n/**\n * Removes listeners from this object. Classes that extend EventTarget may\n * need to override this method in order to remove references to DOM Elements\n * and additional listeners.\n * @override\n * @protected\n */\ngoog.events.EventTarget.prototype.disposeInternal = function() {\n 'use strict';\n goog.events.EventTarget.superClass_.disposeInternal.call(this);\n\n this.removeAllListeners();\n this.parentEventTarget_ = null;\n};\n\n\n/**\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback\n * method.\n * @param {boolean=} opt_useCapture Whether to fire in capture phase\n * (defaults to false).\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call the\n * listener.\n * @return {!goog.events.ListenableKey} Unique key for the listener.\n * @template SCOPE,EVENTOBJ\n * @override\n */\ngoog.events.EventTarget.prototype.listen = function(\n type, listener, opt_useCapture, opt_listenerScope) {\n 'use strict';\n this.assertInitialized_();\n return this.eventTargetListeners_.add(\n String(type), listener, false /* callOnce */, opt_useCapture,\n opt_listenerScope);\n};\n\n\n/**\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback\n * method.\n * @param {boolean=} opt_useCapture Whether to fire in capture phase\n * (defaults to false).\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call the\n * listener.\n * @return {!goog.events.ListenableKey} Unique key for the listener.\n * @template SCOPE,EVENTOBJ\n * @override\n */\ngoog.events.EventTarget.prototype.listenOnce = function(\n type, listener, opt_useCapture, opt_listenerScope) {\n 'use strict';\n return this.eventTargetListeners_.add(\n String(type), listener, true /* callOnce */, opt_useCapture,\n opt_listenerScope);\n};\n\n\n/**\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback\n * method.\n * @param {boolean=} opt_useCapture Whether to fire in capture phase\n * (defaults to false).\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call\n * the listener.\n * @return {boolean} Whether any listener was removed.\n * @template SCOPE,EVENTOBJ\n * @override\n */\ngoog.events.EventTarget.prototype.unlisten = function(\n type, listener, opt_useCapture, opt_listenerScope) {\n 'use strict';\n return this.eventTargetListeners_.remove(\n String(type), listener, opt_useCapture, opt_listenerScope);\n};\n\n\n/**\n * @param {!goog.events.ListenableKey} key The key returned by\n * listen() or listenOnce().\n * @return {boolean} Whether any listener was removed.\n * @override\n */\ngoog.events.EventTarget.prototype.unlistenByKey = function(key) {\n 'use strict';\n return this.eventTargetListeners_.removeByKey(key);\n};\n\n\n/**\n * @param {string|!goog.events.EventId=} opt_type Type of event to remove,\n * default is to remove all types.\n * @return {number} Number of listeners removed.\n * @override\n */\ngoog.events.EventTarget.prototype.removeAllListeners = function(opt_type) {\n 'use strict';\n // TODO(chrishenry): Previously, removeAllListeners can be called on\n // uninitialized EventTarget, so we preserve that behavior. We\n // should remove this when usages that rely on that fact are purged.\n if (!this.eventTargetListeners_) {\n return 0;\n }\n return this.eventTargetListeners_.removeAll(opt_type);\n};\n\n\n/**\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The type of the\n * listeners to fire.\n * @param {boolean} capture The capture mode of the listeners to fire.\n * @param {EVENTOBJ} eventObject The event object to fire.\n * @return {boolean} Whether all listeners succeeded without\n * attempting to prevent default behavior. If any listener returns\n * false or called goog.events.Event#preventDefault, this returns\n * false.\n * @template EVENTOBJ\n * @override\n */\ngoog.events.EventTarget.prototype.fireListeners = function(\n type, capture, eventObject) {\n 'use strict';\n // TODO(chrishenry): Original code avoids array creation when there\n // is no listener, so we do the same. If this optimization turns\n // out to be not required, we can replace this with\n // getListeners(type, capture) instead, which is simpler.\n var listenerArray = this.eventTargetListeners_.listeners[String(type)];\n if (!listenerArray) {\n return true;\n }\n listenerArray = listenerArray.concat();\n\n var rv = true;\n for (var i = 0; i < listenerArray.length; ++i) {\n var listener = listenerArray[i];\n // We might not have a listener if the listener was removed.\n if (listener && !listener.removed && listener.capture == capture) {\n var listenerFn = listener.listener;\n var listenerHandler = listener.handler || listener.src;\n\n if (listener.callOnce) {\n this.unlistenByKey(listener);\n }\n rv = listenerFn.call(listenerHandler, eventObject) !== false && rv;\n }\n }\n\n return rv && !eventObject.defaultPrevented;\n};\n\n\n/**\n * @param {string|!goog.events.EventId} type The type of the listeners to fire.\n * @param {boolean} capture The capture mode of the listeners to fire.\n * @return {!Array<!goog.events.ListenableKey>} An array of registered\n * listeners.\n * @template EVENTOBJ\n * @override\n */\ngoog.events.EventTarget.prototype.getListeners = function(type, capture) {\n 'use strict';\n return this.eventTargetListeners_.getListeners(String(type), capture);\n};\n\n\n/**\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The name of the event\n * without the 'on' prefix.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener The\n * listener function to get.\n * @param {boolean} capture Whether the listener is a capturing listener.\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call the\n * listener.\n * @return {?goog.events.ListenableKey} the found listener or null if not found.\n * @template SCOPE,EVENTOBJ\n * @override\n */\ngoog.events.EventTarget.prototype.getListener = function(\n type, listener, capture, opt_listenerScope) {\n 'use strict';\n return this.eventTargetListeners_.getListener(\n String(type), listener, capture, opt_listenerScope);\n};\n\n\n/**\n * @param {string|!goog.events.EventId<EVENTOBJ>=} opt_type Event type.\n * @param {boolean=} opt_capture Whether to check for capture or bubble\n * listeners.\n * @return {boolean} Whether there is any active listeners matching\n * the requested type and/or capture phase.\n * @template EVENTOBJ\n * @override\n */\ngoog.events.EventTarget.prototype.hasListener = function(\n opt_type, opt_capture) {\n 'use strict';\n var id = (opt_type !== undefined) ? String(opt_type) : undefined;\n return this.eventTargetListeners_.hasListener(id, opt_capture);\n};\n\n\n/**\n * Sets the target to be used for `event.target` when firing\n * event. Mainly used for testing. For example, see\n * `goog.testing.events.mixinListenable`.\n * @param {!Object} target The target.\n */\ngoog.events.EventTarget.prototype.setTargetForTesting = function(target) {\n 'use strict';\n this.actualEventTarget_ = target;\n};\n\n\n/**\n * Asserts that the event target instance is initialized properly.\n * @private\n */\ngoog.events.EventTarget.prototype.assertInitialized_ = function() {\n 'use strict';\n goog.asserts.assert(\n this.eventTargetListeners_,\n 'Event target is not initialized. Did you call the superclass ' +\n '(goog.events.EventTarget) constructor?');\n};\n\n\n/**\n * Dispatches the given event on the ancestorsTree.\n *\n * @param {!Object} target The target to dispatch on.\n * @param {goog.events.Event|Object|string} e The event object.\n * @param {Array<goog.events.Listenable>=} opt_ancestorsTree The ancestors\n * tree of the target, in reverse order from the closest ancestor\n * to the root event target. May be null if the target has no ancestor.\n * @return {boolean} If anyone called preventDefault on the event object (or\n * if any of the listeners returns false) this will also return false.\n * @private\n */\ngoog.events.EventTarget.dispatchEventInternal_ = function(\n target, e, opt_ancestorsTree) {\n 'use strict';\n /** @suppress {missingProperties} */\n var type = e.type || /** @type {string} */ (e);\n\n // If accepting a string or object, create a custom event object so that\n // preventDefault and stopPropagation work with the event.\n if (typeof e === 'string') {\n e = new goog.events.Event(e, target);\n } else if (!(e instanceof goog.events.Event)) {\n var oldEvent = e;\n e = new goog.events.Event(type, target);\n goog.object.extend(e, oldEvent);\n } else {\n e.target = e.target || target;\n }\n\n var rv = true, currentTarget;\n\n // Executes all capture listeners on the ancestors, if any.\n if (opt_ancestorsTree) {\n for (var i = opt_ancestorsTree.length - 1;\n !e.hasPropagationStopped() && i >= 0; i--) {\n currentTarget = e.currentTarget = opt_ancestorsTree[i];\n rv = currentTarget.fireListeners(type, true, e) && rv;\n }\n }\n\n // Executes capture and bubble listeners on the target.\n if (!e.hasPropagationStopped()) {\n currentTarget = /** @type {?} */ (e.currentTarget = target);\n rv = currentTarget.fireListeners(type, true, e) && rv;\n if (!e.hasPropagationStopped()) {\n rv = currentTarget.fireListeners(type, false, e) && rv;\n }\n }\n\n // Executes all bubble listeners on the ancestors, if any.\n if (opt_ancestorsTree) {\n for (i = 0; !e.hasPropagationStopped() && i < opt_ancestorsTree.length;\n i++) {\n currentTarget = e.currentTarget = opt_ancestorsTree[i];\n rv = currentTarget.fireListeners(type, false, e) && rv;\n }\n }\n\n return rv;\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview JSON utility functions.\n */\n\n\ngoog.provide('goog.json');\ngoog.provide('goog.json.Replacer');\ngoog.provide('goog.json.Reviver');\ngoog.provide('goog.json.Serializer');\n\n\n/**\n * @define {boolean} If true, use the native JSON parsing API.\n * NOTE: The default `goog.json.parse` implementation is able to handle\n * invalid JSON. JSPB used to produce invalid JSON which is not the case\n * anymore so this is safe to enable for parsing JSPB. Using native JSON is\n * faster and safer than the default implementation using `eval`.\n */\ngoog.json.USE_NATIVE_JSON = goog.define('goog.json.USE_NATIVE_JSON', false);\n\n/**\n * @define {boolean} If true, try the native JSON parsing API first. If it\n * fails, log an error and use `eval` instead. This is useful when\n * transitioning to `goog.json.USE_NATIVE_JSON`. The error logger needs to\n * be set by `goog.json.setErrorLogger`. If it is not set then the error\n * is ignored.\n */\ngoog.json.TRY_NATIVE_JSON = goog.define('goog.json.TRY_NATIVE_JSON', true);\n\n\n/**\n * Tests if a string is an invalid JSON string. This only ensures that we are\n * not using any invalid characters\n * @param {string} s The string to test.\n * @return {boolean} True if the input is a valid JSON string.\n */\ngoog.json.isValid = function(s) {\n 'use strict';\n // All empty whitespace is not valid.\n if (/^\\s*$/.test(s)) {\n return false;\n }\n\n // This is taken from http://www.json.org/json2.js which is released to the\n // public domain.\n // Changes: We dissallow \\u2028 Line separator and \\u2029 Paragraph separator\n // inside strings. We also treat \\u2028 and \\u2029 as whitespace which they\n // are in the RFC but IE and Safari does not match \\s to these so we need to\n // include them in the reg exps in all places where whitespace is allowed.\n // We allowed \\x7f inside strings because some tools don't escape it,\n // e.g. http://www.json.org/java/org/json/JSONObject.java\n\n // Parsing happens in three stages. In the first stage, we run the text\n // against regular expressions that look for non-JSON patterns. We are\n // especially concerned with '()' and 'new' because they can cause invocation,\n // and '=' because it can cause mutation. But just to be safe, we want to\n // reject all unexpected forms.\n\n // We split the first stage into 4 regexp operations in order to work around\n // crippling inefficiencies in IE's and Safari's regexp engines. First we\n // replace all backslash pairs with '@' (a non-JSON character). Second, we\n // replace all simple value tokens with ']' characters, but only when followed\n // by a colon, comma, closing bracket or end of string. Third, we delete all\n // open brackets that follow a colon or comma or that begin the text. Finally,\n // we look to see that the remaining characters are only whitespace or ']' or\n // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n // Don't make these static since they have the global flag.\n const backslashesRe = /\\\\[\"\\\\\\/bfnrtu]/g;\n const simpleValuesRe =\n /(?:\"[^\"\\\\\\n\\r\\u2028\\u2029\\x00-\\x08\\x0a-\\x1f]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)[\\s\\u2028\\u2029]*(?=:|,|]|}|$)/g;\n const openBracketsRe = /(?:^|:|,)(?:[\\s\\u2028\\u2029]*\\[)+/g;\n const remainderRe = /^[\\],:{}\\s\\u2028\\u2029]*$/;\n\n return remainderRe.test(\n s.replace(backslashesRe, '@')\n .replace(simpleValuesRe, ']')\n .replace(openBracketsRe, ''));\n};\n\n/**\n * Logs a parsing error in `JSON.parse` solvable by using `eval`\n * if `goog.json.TRY_NATIVE_JSON` is enabled.\n * @private {function(string, !Error)} The first parameter is the error message,\n * the second is the exception thrown by `JSON.parse`.\n */\ngoog.json.errorLogger_ = goog.nullFunction;\n\n\n/**\n * Sets an error logger to use if there's a recoverable parsing error and\n * `goog.json.TRY_NATIVE_JSON` is enabled.\n * @param {function(string, !Error)} errorLogger The first parameter is the\n * error message, the second is the exception thrown by `JSON.parse`.\n */\ngoog.json.setErrorLogger = function(errorLogger) {\n 'use strict';\n goog.json.errorLogger_ = errorLogger;\n};\n\n\n/**\n * Parses a JSON string and returns the result. This throws an exception if\n * the string is an invalid JSON string.\n *\n * Note that this is very slow on large strings. Use JSON.parse if possible.\n *\n * @param {*} s The JSON string to parse.\n * @throws Error if s is invalid JSON.\n * @return {Object} The object generated from the JSON string, or null.\n * @deprecated Use JSON.parse.\n */\ngoog.json.parse = goog.json.USE_NATIVE_JSON ?\n /** @type {function(*):Object} */ (goog.global['JSON']['parse']) :\n function(s) {\n 'use strict';\n let error;\n if (goog.json.TRY_NATIVE_JSON) {\n try {\n return goog.global['JSON']['parse'](s);\n } catch (ex) {\n error = ex;\n }\n }\n const o = String(s);\n if (goog.json.isValid(o)) {\n\n try {\n const result = /** @type {?Object} */ (eval('(' + o + ')'));\n if (error) {\n goog.json.errorLogger_('Invalid JSON: ' + o, error);\n }\n return result;\n } catch (ex) {\n }\n }\n throw new Error('Invalid JSON string: ' + o);\n };\n\n\n/**\n * JSON replacer, as defined in Section 15.12.3 of the ES5 spec.\n * @see http://ecma-international.org/ecma-262/5.1/#sec-15.12.3\n *\n * TODO(nicksantos): Array should also be a valid replacer.\n *\n * @typedef {function(this:Object, string, *): *}\n */\ngoog.json.Replacer;\n\n\n/**\n * JSON reviver, as defined in Section 15.12.2 of the ES5 spec.\n * @see http://ecma-international.org/ecma-262/5.1/#sec-15.12.3\n *\n * @typedef {function(this:Object, string, *): *}\n */\ngoog.json.Reviver;\n\n\n/**\n * Serializes an object or a value to a JSON string.\n *\n * @param {*} object The object to serialize.\n * @param {?goog.json.Replacer=} opt_replacer A replacer function\n * called for each (key, value) pair that determines how the value\n * should be serialized. By defult, this just returns the value\n * and allows default serialization to kick in.\n * @throws Error if there are loops in the object graph.\n * @return {string} A JSON string representation of the input.\n */\ngoog.json.serialize = goog.json.USE_NATIVE_JSON ?\n /** @type {function(*, ?goog.json.Replacer=):string} */\n (goog.global['JSON']['stringify']) :\n function(object, opt_replacer) {\n 'use strict';\n // NOTE(nicksantos): Currently, we never use JSON.stringify.\n //\n // The last time I evaluated this, JSON.stringify had subtle bugs and\n // behavior differences on all browsers, and the performance win was not\n // large enough to justify all the issues. This may change in the future\n // as browser implementations get better.\n //\n // assertSerialize in json_test contains if branches for the cases\n // that fail.\n return new goog.json.Serializer(opt_replacer).serialize(object);\n };\n\n\n\n/**\n * Class that is used to serialize JSON objects to a string.\n * @param {?goog.json.Replacer=} opt_replacer Replacer.\n * @constructor\n */\ngoog.json.Serializer = function(opt_replacer) {\n 'use strict';\n /**\n * @type {goog.json.Replacer|null|undefined}\n * @private\n */\n this.replacer_ = opt_replacer;\n};\n\n\n/**\n * Serializes an object or a value to a JSON string.\n *\n * @param {*} object The object to serialize.\n * @throws Error if there are loops in the object graph.\n * @return {string} A JSON string representation of the input.\n */\ngoog.json.Serializer.prototype.serialize = function(object) {\n 'use strict';\n const sb = [];\n this.serializeInternal(object, sb);\n return sb.join('');\n};\n\n\n/**\n * Serializes a generic value to a JSON string\n * @protected\n * @param {*} object The object to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n * @throws Error if there are loops in the object graph.\n */\ngoog.json.Serializer.prototype.serializeInternal = function(object, sb) {\n 'use strict';\n if (object == null) {\n // undefined == null so this branch covers undefined as well as null\n sb.push('null');\n return;\n }\n\n if (typeof object == 'object') {\n if (Array.isArray(object)) {\n this.serializeArray(object, sb);\n return;\n } else if (\n object instanceof String || object instanceof Number ||\n object instanceof Boolean) {\n object = object.valueOf();\n // Fall through to switch below.\n } else {\n this.serializeObject_(/** @type {!Object} */ (object), sb);\n return;\n }\n }\n\n switch (typeof object) {\n case 'string':\n this.serializeString_(object, sb);\n break;\n case 'number':\n this.serializeNumber_(object, sb);\n break;\n case 'boolean':\n sb.push(String(object));\n break;\n case 'function':\n sb.push('null');\n break;\n default:\n throw new Error('Unknown type: ' + typeof object);\n }\n};\n\n\n/**\n * Character mappings used internally for goog.string.quote\n * @private\n * @type {!Object}\n */\ngoog.json.Serializer.charToJsonCharCache_ = {\n '\\\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n '/': '\\\\/',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n\n '\\x0B': '\\\\u000b' // '\\v' is not supported in JScript\n};\n\n\n/**\n * Regular expression used to match characters that need to be replaced.\n * The S60 browser has a bug where unicode characters are not matched by\n * regular expressions. The condition below detects such behaviour and\n * adjusts the regular expression accordingly.\n * @private\n * @type {!RegExp}\n */\ngoog.json.Serializer.charsToReplace_ = /\\uffff/.test('\\uffff') ?\n /[\\\\\\\"\\x00-\\x1f\\x7f-\\uffff]/g :\n /[\\\\\\\"\\x00-\\x1f\\x7f-\\xff]/g;\n\n\n/**\n * Serializes a string to a JSON string\n * @private\n * @param {string} s The string to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n */\ngoog.json.Serializer.prototype.serializeString_ = function(s, sb) {\n 'use strict';\n // The official JSON implementation does not work with international\n // characters.\n sb.push('\"', s.replace(goog.json.Serializer.charsToReplace_, function(c) {\n 'use strict';\n // caching the result improves performance by a factor 2-3\n let rv = goog.json.Serializer.charToJsonCharCache_[c];\n if (!rv) {\n rv = '\\\\u' + (c.charCodeAt(0) | 0x10000).toString(16).substr(1);\n goog.json.Serializer.charToJsonCharCache_[c] = rv;\n }\n return rv;\n }), '\"');\n};\n\n\n/**\n * Serializes a number to a JSON string\n * @private\n * @param {number} n The number to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n */\ngoog.json.Serializer.prototype.serializeNumber_ = function(n, sb) {\n 'use strict';\n sb.push(isFinite(n) && !isNaN(n) ? String(n) : 'null');\n};\n\n\n/**\n * Serializes an array to a JSON string\n * @param {Array<string>} arr The array to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n * @protected\n */\ngoog.json.Serializer.prototype.serializeArray = function(arr, sb) {\n 'use strict';\n const l = arr.length;\n sb.push('[');\n let sep = '';\n for (let i = 0; i < l; i++) {\n sb.push(sep);\n\n const value = arr[i];\n this.serializeInternal(\n this.replacer_ ? this.replacer_.call(arr, String(i), value) : value,\n sb);\n\n sep = ',';\n }\n sb.push(']');\n};\n\n\n/**\n * Serializes an object to a JSON string\n * @private\n * @param {!Object} obj The object to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n */\ngoog.json.Serializer.prototype.serializeObject_ = function(obj, sb) {\n 'use strict';\n sb.push('{');\n let sep = '';\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key];\n // Skip functions.\n if (typeof value != 'function') {\n sb.push(sep);\n this.serializeString_(key, sb);\n sb.push(':');\n\n this.serializeInternal(\n this.replacer_ ? this.replacer_.call(obj, key, value) : value, sb);\n\n sep = ',';\n }\n }\n }\n sb.push('}');\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.module('goog.async.WorkQueue');\ngoog.module.declareLegacyNamespace();\n\nconst FreeList = goog.require('goog.async.FreeList');\nconst {assert} = goog.require('goog.asserts');\n\n// TODO(johnlenz): generalize the WorkQueue if this is used by more\n// than goog.async.run.\n\n\n/**\n * A low GC workqueue. The key elements of this design:\n * - avoids the need for goog.bind or equivalent by carrying scope\n * - avoids the need for array reallocation by using a linked list\n * - minimizes work entry objects allocation by recycling objects\n * @final\n * @struct\n */\nclass WorkQueue {\n constructor() {\n this.workHead_ = null;\n this.workTail_ = null;\n }\n\n /**\n * @param {function()} fn\n * @param {Object|null|undefined} scope\n */\n add(fn, scope) {\n const item = this.getUnusedItem_();\n item.set(fn, scope);\n\n if (this.workTail_) {\n this.workTail_.next = item;\n this.workTail_ = item;\n } else {\n assert(!this.workHead_);\n this.workHead_ = item;\n this.workTail_ = item;\n }\n }\n\n /**\n * @return {?WorkItem}\n */\n remove() {\n let item = null;\n\n if (this.workHead_) {\n item = this.workHead_;\n this.workHead_ = this.workHead_.next;\n if (!this.workHead_) {\n this.workTail_ = null;\n }\n item.next = null;\n }\n return item;\n }\n\n /**\n * @param {!WorkItem} item\n */\n returnUnused(item) {\n WorkQueue.freelist_.put(item);\n }\n\n /**\n * @return {!WorkItem}\n * @private\n */\n getUnusedItem_() {\n return WorkQueue.freelist_.get();\n }\n}\n\n/** @define {number} The maximum number of entries to keep for recycling. */\nWorkQueue.DEFAULT_MAX_UNUSED =\n goog.define('goog.async.WorkQueue.DEFAULT_MAX_UNUSED', 100);\n\n/** @const @private {!FreeList<!WorkItem>} */\nWorkQueue.freelist_ = new FreeList(\n () => new WorkItem(), item => item.reset(), WorkQueue.DEFAULT_MAX_UNUSED);\n\n/**\n * @final\n * @struct\n */\nclass WorkItem {\n constructor() {\n /** @type {?function()} */\n this.fn = null;\n /** @type {?Object|null|undefined} */\n this.scope = null;\n /** @type {?WorkItem} */\n this.next = null;\n }\n\n /**\n * @param {function()} fn\n * @param {Object|null|undefined} scope\n */\n set(fn, scope) {\n 'use strict';\n this.fn = fn;\n this.scope = scope;\n this.next = null;\n }\n\n /** Reset the work item so they don't prevent GC before reuse */\n reset() {\n this.fn = null;\n this.scope = null;\n this.next = null;\n }\n}\n\nexports = WorkQueue;\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('goog.async.run');\n\ngoog.require('goog.async.WorkQueue');\ngoog.require('goog.async.nextTick');\ngoog.require('goog.async.throwException');\n\n/**\n * @define {boolean} If true, use the global Promise to implement goog.async.run\n * assuming either the native, or polyfill version will be used. Does still\n * permit tests to use forceNextTick.\n */\ngoog.ASSUME_NATIVE_PROMISE = goog.define('goog.ASSUME_NATIVE_PROMISE', false);\n\n/**\n * Fires the provided callback just before the current callstack unwinds, or as\n * soon as possible after the current JS execution context.\n * @param {function(this:THIS)} callback\n * @param {THIS=} opt_context Object to use as the \"this value\" when calling\n * the provided function.\n * @template THIS\n */\ngoog.async.run = function(callback, opt_context) {\n 'use strict';\n if (!goog.async.run.schedule_) {\n goog.async.run.initializeRunner_();\n }\n if (!goog.async.run.workQueueScheduled_) {\n // Nothing is currently scheduled, schedule it now.\n goog.async.run.schedule_();\n goog.async.run.workQueueScheduled_ = true;\n }\n\n goog.async.run.workQueue_.add(callback, opt_context);\n};\n\n\n/**\n * Initializes the function to use to process the work queue.\n * @private\n */\ngoog.async.run.initializeRunner_ = function() {\n 'use strict';\n if (goog.ASSUME_NATIVE_PROMISE ||\n (goog.global.Promise && goog.global.Promise.resolve)) {\n // Use goog.global.Promise instead of just Promise because the relevant\n // externs may be missing, and don't alias it because this could confuse the\n // compiler into thinking the polyfill is required when it should be treated\n // as optional.\n var promise = goog.global.Promise.resolve(undefined);\n goog.async.run.schedule_ = function() {\n 'use strict';\n promise.then(goog.async.run.processWorkQueue);\n };\n } else {\n goog.async.run.schedule_ = function() {\n 'use strict';\n goog.async.nextTick(goog.async.run.processWorkQueue);\n };\n }\n};\n\n\n/**\n * Forces goog.async.run to use nextTick instead of Promise.\n *\n * This should only be done in unit tests. It's useful because MockClock\n * replaces nextTick, but not the browser Promise implementation, so it allows\n * Promise-based code to be tested with MockClock.\n *\n * However, we also want to run promises if the MockClock is no longer in\n * control so we schedule a backup \"setTimeout\" to the unmocked timeout if\n * provided.\n *\n * @param {function(function())=} opt_realSetTimeout\n */\ngoog.async.run.forceNextTick = function(opt_realSetTimeout) {\n 'use strict';\n goog.async.run.schedule_ = function() {\n 'use strict';\n goog.async.nextTick(goog.async.run.processWorkQueue);\n if (opt_realSetTimeout) {\n opt_realSetTimeout(goog.async.run.processWorkQueue);\n }\n };\n};\n\n\n/**\n * The function used to schedule work asynchronousely.\n * @private {function()}\n */\ngoog.async.run.schedule_;\n\n\n/** @private {boolean} */\ngoog.async.run.workQueueScheduled_ = false;\n\n\n/** @private {!goog.async.WorkQueue} */\ngoog.async.run.workQueue_ = new goog.async.WorkQueue();\n\n\nif (goog.DEBUG) {\n /**\n * Reset the work queue. Only available for tests in debug mode.\n */\n goog.async.run.resetQueue = function() {\n 'use strict';\n goog.async.run.workQueueScheduled_ = false;\n goog.async.run.workQueue_ = new goog.async.WorkQueue();\n };\n}\n\n\n/**\n * Run any pending goog.async.run work items. This function is not intended\n * for general use, but for use by entry point handlers to run items ahead of\n * goog.async.nextTick.\n */\ngoog.async.run.processWorkQueue = function() {\n 'use strict';\n // NOTE: additional work queue items may be added while processing.\n var item = null;\n while (item = goog.async.run.workQueue_.remove()) {\n try {\n item.fn.call(item.scope);\n } catch (e) {\n goog.async.throwException(e);\n }\n goog.async.run.workQueue_.returnUnused(item);\n }\n\n // There are no more work items, allow processing to be scheduled again.\n goog.async.run.workQueueScheduled_ = false;\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Simple freelist.\n *\n * An anterative to goog.structs.SimplePool, it imposes the requirement that the\n * objects in the list contain a \"next\" property that can be used to maintain\n * the pool.\n */\n\ngoog.provide('goog.async.FreeList');\n\n\n/**\n * @template ITEM\n */\ngoog.async.FreeList = class {\n /**\n * @param {function():ITEM} create\n * @param {function(ITEM):void} reset\n * @param {number} limit\n */\n constructor(create, reset, limit) {\n /** @private @const {number} */\n this.limit_ = limit;\n /** @private @const {function()} */\n this.create_ = create;\n /** @private @const {function(ITEM):void} */\n this.reset_ = reset;\n\n /** @private {number} */\n this.occupants_ = 0;\n /** @private {ITEM} */\n this.head_ = null;\n }\n\n /**\n * @return {ITEM}\n */\n get() {\n let item;\n if (this.occupants_ > 0) {\n this.occupants_--;\n item = this.head_;\n this.head_ = item.next;\n item.next = null;\n } else {\n item = this.create_();\n }\n return item;\n }\n\n /**\n * @param {ITEM} item An item available for possible future reuse.\n */\n put(item) {\n this.reset_(item);\n if (this.occupants_ < this.limit_) {\n this.occupants_++;\n item.next = this.head_;\n this.head_ = item;\n }\n }\n\n /**\n * Visible for testing.\n * @package\n * @return {number}\n */\n occupants() {\n return this.occupants_;\n }\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Provides a function to throw an error without interrupting\n * the current execution context.\n */\n\ngoog.module('goog.async.throwException');\ngoog.module.declareLegacyNamespace();\n\n/**\n * Throw an item without interrupting the current execution context. For\n * example, if processing a group of items in a loop, sometimes it is useful\n * to report an error while still allowing the rest of the batch to be\n * processed.\n * @param {*} exception\n */\nfunction throwException(exception) {\n // Each throw needs to be in its own context.\n goog.global.setTimeout(() => {\n throw exception;\n }, 0);\n}\nexports = throwException;\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview A timer class to which other classes and objects can listen on.\n * This is only an abstraction above `setInterval`.\n *\n * @see ../demos/timers.html\n */\n\ngoog.provide('goog.Timer');\n\ngoog.require('goog.Promise');\ngoog.require('goog.events.EventTarget');\ngoog.requireType('goog.Thenable');\n\n\n\n/**\n * Class for handling timing events.\n *\n * @param {number=} opt_interval Number of ms between ticks (default: 1ms).\n * @param {Object=} opt_timerObject An object that has `setTimeout`,\n * `setInterval`, `clearTimeout` and `clearInterval`\n * (e.g., `window`).\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.Timer = function(opt_interval, opt_timerObject) {\n 'use strict';\n goog.events.EventTarget.call(this);\n\n /**\n * Number of ms between ticks\n * @private {number}\n */\n this.interval_ = opt_interval || 1;\n\n /**\n * An object that implements `setTimeout`, `setInterval`,\n * `clearTimeout` and `clearInterval`. We default to the window\n * object. Changing this on {@link goog.Timer.prototype} changes the object\n * for all timer instances which can be useful if your environment has some\n * other implementation of timers than the `window` object.\n * @private {{setTimeout:!Function, clearTimeout:!Function}}\n */\n this.timerObject_ = /** @type {{setTimeout, clearTimeout}} */ (\n opt_timerObject || goog.Timer.defaultTimerObject);\n\n /**\n * Cached `tick_` bound to the object for later use in the timer.\n * @private {Function}\n * @const\n */\n this.boundTick_ = goog.bind(this.tick_, this);\n\n /**\n * Firefox browser often fires the timer event sooner (sometimes MUCH sooner)\n * than the requested timeout. So we compare the time to when the event was\n * last fired, and reschedule if appropriate. See also\n * {@link goog.Timer.intervalScale}.\n * @private {number}\n */\n this.last_ = goog.now();\n};\ngoog.inherits(goog.Timer, goog.events.EventTarget);\n\n\n/**\n * Maximum timeout value.\n *\n * Timeout values too big to fit into a signed 32-bit integer may cause overflow\n * in FF, Safari, and Chrome, resulting in the timeout being scheduled\n * immediately. It makes more sense simply not to schedule these timeouts, since\n * 24.8 days is beyond a reasonable expectation for the browser to stay open.\n *\n * @private {number}\n * @const\n */\ngoog.Timer.MAX_TIMEOUT_ = 2147483647;\n\n\n/**\n * A timer ID that cannot be returned by any known implementation of\n * `window.setTimeout`. Passing this value to `window.clearTimeout`\n * should therefore be a no-op.\n *\n * @private {number}\n * @const\n */\ngoog.Timer.INVALID_TIMEOUT_ID_ = -1;\n\n\n/**\n * Whether this timer is enabled\n * @type {boolean}\n */\ngoog.Timer.prototype.enabled = false;\n\n\n/**\n * An object that implements `setTimeout`, `setInterval`,\n * `clearTimeout` and `clearInterval`. We default to the global\n * object. Changing `goog.Timer.defaultTimerObject` changes the object for\n * all timer instances which can be useful if your environment has some other\n * implementation of timers you'd like to use.\n * @type {{setTimeout, clearTimeout}}\n */\ngoog.Timer.defaultTimerObject = goog.global;\n\n\n/**\n * Variable that controls the timer error correction. If the timer is called\n * before the requested interval times `intervalScale`, which often\n * happens on Mozilla, the timer is rescheduled.\n * @see {@link #last_}\n * @type {number}\n */\ngoog.Timer.intervalScale = 0.8;\n\n\n/**\n * Variable for storing the result of `setInterval`.\n * @private {?number}\n */\ngoog.Timer.prototype.timer_ = null;\n\n\n/**\n * Gets the interval of the timer.\n * @return {number} interval Number of ms between ticks.\n */\ngoog.Timer.prototype.getInterval = function() {\n 'use strict';\n return this.interval_;\n};\n\n\n/**\n * Sets the interval of the timer.\n * @param {number} interval Number of ms between ticks.\n */\ngoog.Timer.prototype.setInterval = function(interval) {\n 'use strict';\n this.interval_ = interval;\n if (this.timer_ && this.enabled) {\n // Stop and then start the timer to reset the interval.\n this.stop();\n this.start();\n } else if (this.timer_) {\n this.stop();\n }\n};\n\n\n/**\n * Callback for the `setTimeout` used by the timer.\n * @private\n */\ngoog.Timer.prototype.tick_ = function() {\n 'use strict';\n if (this.enabled) {\n var elapsed = goog.now() - this.last_;\n if (elapsed > 0 && elapsed < this.interval_ * goog.Timer.intervalScale) {\n this.timer_ = this.timerObject_.setTimeout(\n this.boundTick_, this.interval_ - elapsed);\n return;\n }\n\n // Prevents setInterval from registering a duplicate timeout when called\n // in the timer event handler.\n if (this.timer_) {\n this.timerObject_.clearTimeout(this.timer_);\n this.timer_ = null;\n }\n\n this.dispatchTick();\n // The timer could be stopped in the timer event handler.\n if (this.enabled) {\n // Stop and start to ensure there is always only one timeout even if\n // start is called in the timer event handler.\n this.stop();\n this.start();\n }\n }\n};\n\n\n/**\n * Dispatches the TICK event. This is its own method so subclasses can override.\n */\ngoog.Timer.prototype.dispatchTick = function() {\n 'use strict';\n this.dispatchEvent(goog.Timer.TICK);\n};\n\n\n/**\n * Starts the timer.\n */\ngoog.Timer.prototype.start = function() {\n 'use strict';\n this.enabled = true;\n\n // If there is no interval already registered, start it now\n if (!this.timer_) {\n // IMPORTANT!\n // window.setInterval in FireFox has a bug - it fires based on\n // absolute time, rather than on relative time. What this means\n // is that if a computer is sleeping/hibernating for 24 hours\n // and the timer interval was configured to fire every 1000ms,\n // then after the PC wakes up the timer will fire, in rapid\n // succession, 3600*24 times.\n // This bug is described here and is already fixed, but it will\n // take time to propagate, so for now I am switching this over\n // to setTimeout logic.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=376643\n //\n this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_);\n this.last_ = goog.now();\n }\n};\n\n\n/**\n * Stops the timer.\n */\ngoog.Timer.prototype.stop = function() {\n 'use strict';\n this.enabled = false;\n if (this.timer_) {\n this.timerObject_.clearTimeout(this.timer_);\n this.timer_ = null;\n }\n};\n\n\n/** @override */\ngoog.Timer.prototype.disposeInternal = function() {\n 'use strict';\n goog.Timer.superClass_.disposeInternal.call(this);\n this.stop();\n delete this.timerObject_;\n};\n\n\n/**\n * Constant for the timer's event type.\n * @const\n */\ngoog.Timer.TICK = 'tick';\n\n\n/**\n * Calls the given function once, after the optional pause.\n * <p>\n * The function is always called asynchronously, even if the delay is 0. This\n * is a common trick to schedule a function to run after a batch of browser\n * event processing.\n *\n * @param {function(this:SCOPE)|{handleEvent:function()}|null} listener Function\n * or object that has a handleEvent method.\n * @param {number=} opt_delay Milliseconds to wait; default is 0.\n * @param {SCOPE=} opt_handler Object in whose scope to call the listener.\n * @return {number} A handle to the timer ID.\n * @template SCOPE\n */\ngoog.Timer.callOnce = function(listener, opt_delay, opt_handler) {\n 'use strict';\n if (typeof listener === 'function') {\n if (opt_handler) {\n listener = goog.bind(listener, opt_handler);\n }\n } else if (listener && typeof listener.handleEvent == 'function') {\n // using typeof to prevent strict js warning\n listener = goog.bind(listener.handleEvent, listener);\n } else {\n throw new Error('Invalid listener argument');\n }\n\n if (Number(opt_delay) > goog.Timer.MAX_TIMEOUT_) {\n // Timeouts greater than MAX_INT return immediately due to integer\n // overflow in many browsers. Since MAX_INT is 24.8 days, just don't\n // schedule anything at all.\n return goog.Timer.INVALID_TIMEOUT_ID_;\n } else {\n return goog.Timer.defaultTimerObject.setTimeout(listener, opt_delay || 0);\n }\n};\n\n\n/**\n * Clears a timeout initiated by {@link #callOnce}.\n * @param {?number} timerId A timer ID.\n */\ngoog.Timer.clear = function(timerId) {\n 'use strict';\n goog.Timer.defaultTimerObject.clearTimeout(timerId);\n};\n\n\n/**\n * @param {number} delay Milliseconds to wait.\n * @param {(RESULT|goog.Thenable<RESULT>|Thenable)=} opt_result The value\n * with which the promise will be resolved.\n * @return {!goog.Promise<RESULT>} A promise that will be resolved after\n * the specified delay, unless it is canceled first.\n * @template RESULT\n */\ngoog.Timer.promise = function(delay, opt_result) {\n 'use strict';\n var timerKey = null;\n return new goog\n .Promise(function(resolve, reject) {\n 'use strict';\n timerKey = goog.Timer.callOnce(function() {\n 'use strict';\n resolve(opt_result);\n }, delay);\n if (timerKey == goog.Timer.INVALID_TIMEOUT_ID_) {\n reject(new Error('Failed to schedule timer.'));\n }\n })\n .thenCatch(function(error) {\n 'use strict';\n // Clear the timer. The most likely reason is \"cancel\" signal.\n goog.Timer.clear(timerKey);\n throw error;\n });\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Definition of the goog.async.Throttle class.\n *\n * @see ../demos/timers.html\n */\n\ngoog.module('goog.async.Throttle');\ngoog.module.declareLegacyNamespace();\n\nconst Disposable = goog.require('goog.Disposable');\nconst Timer = goog.require('goog.Timer');\n\n\n/**\n * Throttle will perform an action that is passed in no more than once\n * per interval (specified in milliseconds). If it gets multiple signals\n * to perform the action while it is waiting, it will only perform the action\n * once at the end of the interval.\n * @final\n * @template T\n */\nclass Throttle extends Disposable {\n /**\n * @param {function(this: T, ...?)} listener Function to callback when the\n * action is triggered.\n * @param {number} interval Interval over which to throttle. The listener can\n * only be called once per interval.\n * @param {T=} handler Object in whose scope to call the listener.\n */\n constructor(listener, interval, handler) {\n super();\n /**\n * Function to callback\n * @type {function(this: T, ...?)}\n * @private\n */\n this.listener_ = handler != null ? listener.bind(handler) : listener;\n\n /**\n * Interval for the throttle time\n * @type {number}\n * @private\n */\n this.interval_ = interval;\n\n /**\n * The last arguments passed into `fire`, or null if there is no pending\n * call.\n * @private {?IArrayLike}\n */\n this.args_ = null;\n\n /**\n * Indicates that the action is pending and needs to be fired.\n * @type {boolean}\n * @private\n */\n this.shouldFire_ = false;\n\n /**\n * Indicates the count of nested pauses currently in effect on the throttle.\n * When this count is not zero, fired actions will be postponed until the\n * throttle is resumed enough times to drop the pause count to zero.\n * @type {number}\n * @private\n */\n this.pauseCount_ = 0;\n\n /**\n * Timer for scheduling the next callback\n * @type {?number}\n * @private\n */\n this.timer_ = null;\n }\n\n /**\n * Notifies the throttle that the action has happened. It will throttle\n * the call so that the callback is not called too often according to the\n * interval parameter passed to the constructor, passing the arguments\n * from the last call of this function into the throttled function.\n * @param {...?} var_args Arguments to pass on to the throttled function.\n */\n fire(var_args) {\n this.args_ = arguments;\n if (!this.timer_ && !this.pauseCount_) {\n this.doAction_();\n } else {\n this.shouldFire_ = true;\n }\n }\n\n /**\n * Cancels any pending action callback. The throttle can be restarted by\n * calling {@link #fire}.\n */\n stop() {\n if (this.timer_) {\n Timer.clear(this.timer_);\n this.timer_ = null;\n this.shouldFire_ = false;\n this.args_ = null;\n }\n }\n\n /**\n * Pauses the throttle. All pending and future action callbacks will be\n * delayed until the throttle is resumed. Pauses can be nested.\n */\n pause() {\n this.pauseCount_++;\n }\n\n /**\n * Resumes the throttle. If doing so drops the pausing count to zero,\n * pending action callbacks will be executed as soon as possible, but\n * still no sooner than an interval's delay after the previous call.\n * Future action callbacks will be executed as normal.\n */\n resume() {\n this.pauseCount_--;\n if (!this.pauseCount_ && this.shouldFire_ && !this.timer_) {\n this.shouldFire_ = false;\n this.doAction_();\n }\n }\n\n /** @override */\n disposeInternal() {\n super.disposeInternal();\n this.stop();\n }\n\n /**\n * Handler for the timer to fire the throttle\n * @private\n */\n onTimer_() {\n this.timer_ = null;\n\n if (this.shouldFire_ && !this.pauseCount_) {\n this.shouldFire_ = false;\n this.doAction_();\n }\n }\n\n /**\n * Calls the callback\n * @private\n */\n doAction_() {\n this.timer_ = Timer.callOnce(() => this.onTimer_(), this.interval_);\n const args = this.args_;\n // release memory first so it always happens even if listener throws\n this.args_ = null;\n this.listener_.apply(null, args);\n }\n}\n\nexports = Throttle;\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Class to create objects which want to handle multiple events\n * and have their listeners easily cleaned up via a dispose method.\n *\n * Example:\n * <pre>\n * function Something() {\n * Something.base(this);\n *\n * ... set up object ...\n *\n * // Add event listeners\n * this.listen(this.starEl, goog.events.EventType.CLICK, this.handleStar);\n * this.listen(this.headerEl, goog.events.EventType.CLICK, this.expand);\n * this.listen(this.collapseEl, goog.events.EventType.CLICK, this.collapse);\n * this.listen(this.infoEl, goog.events.EventType.MOUSEOVER, this.showHover);\n * this.listen(this.infoEl, goog.events.EventType.MOUSEOUT, this.hideHover);\n * }\n * goog.inherits(Something, goog.events.EventHandler);\n *\n * Something.prototype.disposeInternal = function() {\n * Something.base(this, 'disposeInternal');\n * goog.dom.removeNode(this.container);\n * };\n *\n *\n * // Then elsewhere:\n *\n * var activeSomething = null;\n * function openSomething() {\n * activeSomething = new Something();\n * }\n *\n * function closeSomething() {\n * if (activeSomething) {\n * activeSomething.dispose(); // Remove event listeners\n * activeSomething = null;\n * }\n * }\n * </pre>\n */\n\ngoog.provide('goog.events.EventHandler');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.events');\ngoog.require('goog.object');\ngoog.requireType('goog.events.Event');\ngoog.requireType('goog.events.EventId');\ngoog.requireType('goog.events.EventTarget');\ngoog.requireType('goog.events.EventWrapper');\n\n\n\n/**\n * Super class for objects that want to easily manage a number of event\n * listeners. It allows a short cut to listen and also provides a quick way\n * to remove all events listeners belonging to this object.\n * @param {SCOPE=} opt_scope Object in whose scope to call the listeners.\n * @constructor\n * @extends {goog.Disposable}\n * @template SCOPE\n */\ngoog.events.EventHandler = function(opt_scope) {\n 'use strict';\n goog.Disposable.call(this);\n // TODO(mknichel): Rename this to this.scope_ and fix the classes in google3\n // that access this private variable. :(\n this.handler_ = opt_scope;\n\n /**\n * Keys for events that are being listened to.\n * @type {!Object<!goog.events.Key>}\n * @private\n */\n this.keys_ = {};\n};\ngoog.inherits(goog.events.EventHandler, goog.Disposable);\n\n\n/**\n * Utility array used to unify the cases of listening for an array of types\n * and listening for a single event, without using recursion or allocating\n * an array each time.\n * @type {!Array<string>}\n * @const\n * @private\n */\ngoog.events.EventHandler.typeArray_ = [];\n\n\n/**\n * Listen to an event on a Listenable. If the function is omitted then the\n * EventHandler's handleEvent method will be used.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n * type Event type to listen for or array of event types.\n * @param {function(this:SCOPE, EVENTOBJ):?|{handleEvent:function(?):?}|null=}\n * opt_fn Optional callback function to be used as the listener or an object\n * with handleEvent function.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template EVENTOBJ, THIS\n */\ngoog.events.EventHandler.prototype.listen = function(\n src, type, opt_fn, opt_options) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n return self.listen_(src, type, opt_fn, opt_options);\n};\n\n\n/**\n * Listen to an event on a Listenable. If the function is omitted then the\n * EventHandler's handleEvent method will be used.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n * type Event type to listen for or array of event types.\n * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(this:T, ?):?}|\n * null|undefined} fn Optional callback function to be used as the\n * listener or an object with handleEvent function.\n * @param {boolean|!AddEventListenerOptions|undefined} options\n * @param {T} scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template T, EVENTOBJ, THIS\n */\ngoog.events.EventHandler.prototype.listenWithScope = function(\n src, type, fn, options, scope) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n // TODO(mknichel): Deprecate this function.\n return self.listen_(src, type, fn, options, scope);\n};\n\n\n/**\n * Listen to an event on a Listenable. If the function is omitted then the\n * EventHandler's handleEvent method will be used.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n * type Event type to listen for or array of event types.\n * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn\n * Optional callback function to be used as the listener or an object with\n * handleEvent function.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @param {Object=} opt_scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template EVENTOBJ, THIS\n * @private\n */\ngoog.events.EventHandler.prototype.listen_ = function(\n src, type, opt_fn, opt_options, opt_scope) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n if (!Array.isArray(type)) {\n if (type) {\n goog.events.EventHandler.typeArray_[0] = type.toString();\n }\n type = goog.events.EventHandler.typeArray_;\n }\n for (var i = 0; i < type.length; i++) {\n var listenerObj = goog.events.listen(\n src, type[i], opt_fn || self.handleEvent, opt_options || false,\n opt_scope || self.handler_ || self);\n\n if (!listenerObj) {\n // When goog.events.listen run on OFF_AND_FAIL or OFF_AND_SILENT\n // (goog.events.CaptureSimulationMode) in IE8-, it will return null\n // value.\n return self;\n }\n\n var key = listenerObj.key;\n self.keys_[key] = listenerObj;\n }\n\n return self;\n};\n\n\n/**\n * Listen to an event on a Listenable. If the function is omitted, then the\n * EventHandler's handleEvent method will be used. After the event has fired the\n * event listener is removed from the target. If an array of event types is\n * provided, each event type will be listened to once.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n * type Event type to listen for or array of event types.\n * @param {function(this:SCOPE, EVENTOBJ):?|{handleEvent:function(?):?}|null=}\n * opt_fn\n * Optional callback function to be used as the listener or an object with\n * handleEvent function.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template EVENTOBJ, THIS\n */\ngoog.events.EventHandler.prototype.listenOnce = function(\n src, type, opt_fn, opt_options) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n return self.listenOnce_(src, type, opt_fn, opt_options);\n};\n\n\n/**\n * Listen to an event on a Listenable. If the function is omitted, then the\n * EventHandler's handleEvent method will be used. After the event has fired the\n * event listener is removed from the target. If an array of event types is\n * provided, each event type will be listened to once.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n * type Event type to listen for or array of event types.\n * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(this:T, ?):?}|\n * null|undefined} fn Optional callback function to be used as the\n * listener or an object with handleEvent function.\n * @param {boolean|undefined} capture Optional whether to use capture phase.\n * @param {T} scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template T, EVENTOBJ, THIS\n */\ngoog.events.EventHandler.prototype.listenOnceWithScope = function(\n src, type, fn, capture, scope) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n // TODO(mknichel): Deprecate this function.\n return self.listenOnce_(src, type, fn, capture, scope);\n};\n\n\n/**\n * Listen to an event on a Listenable. If the function is omitted, then the\n * EventHandler's handleEvent method will be used. After the event has fired\n * the event listener is removed from the target. If an array of event types is\n * provided, each event type will be listened to once.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n * type Event type to listen for or array of event types.\n * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn\n * Optional callback function to be used as the listener or an object with\n * handleEvent function.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @param {Object=} opt_scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template EVENTOBJ, THIS\n * @private\n */\ngoog.events.EventHandler.prototype.listenOnce_ = function(\n src, type, opt_fn, opt_options, opt_scope) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n if (Array.isArray(type)) {\n for (var i = 0; i < type.length; i++) {\n self.listenOnce_(src, type[i], opt_fn, opt_options, opt_scope);\n }\n } else {\n var listenerObj = goog.events.listenOnce(\n src, type, opt_fn || self.handleEvent, opt_options,\n opt_scope || self.handler_ || self);\n if (!listenerObj) {\n // When goog.events.listen run on OFF_AND_FAIL or OFF_AND_SILENT\n // (goog.events.CaptureSimulationMode) in IE8-, it will return null\n // value.\n return self;\n }\n\n var key = listenerObj.key;\n self.keys_[key] = listenerObj;\n }\n\n return self;\n};\n\n\n/**\n * Adds an event listener with a specific event wrapper on a DOM Node or an\n * object that has implemented {@link goog.events.EventTarget}. A listener can\n * only be added once to an object.\n *\n * @param {EventTarget|goog.events.EventTarget} src The node to listen to\n * events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(this:SCOPE, ?):?|{handleEvent:function(?):?}|null} listener\n * Callback method, or an object with a handleEvent function.\n * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to\n * false).\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template THIS\n */\ngoog.events.EventHandler.prototype.listenWithWrapper = function(\n src, wrapper, listener, opt_capt) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n // TODO(mknichel): Remove the opt_scope from this function and then\n // templatize it.\n return self.listenWithWrapper_(src, wrapper, listener, opt_capt);\n};\n\n\n/**\n * Adds an event listener with a specific event wrapper on a DOM Node or an\n * object that has implemented {@link goog.events.EventTarget}. A listener can\n * only be added once to an object.\n *\n * @param {EventTarget|goog.events.EventTarget} src The node to listen to\n * events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(this:T, ?):?|{handleEvent:function(this:T, ?):?}|null}\n * listener Optional callback function to be used as the\n * listener or an object with handleEvent function.\n * @param {boolean|undefined} capture Optional whether to use capture phase.\n * @param {T} scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template T, THIS\n */\ngoog.events.EventHandler.prototype.listenWithWrapperAndScope = function(\n src, wrapper, listener, capture, scope) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n // TODO(mknichel): Deprecate this function.\n return self.listenWithWrapper_(src, wrapper, listener, capture, scope);\n};\n\n\n/**\n * Adds an event listener with a specific event wrapper on a DOM Node or an\n * object that has implemented {@link goog.events.EventTarget}. A listener can\n * only be added once to an object.\n *\n * @param {EventTarget|goog.events.EventTarget} src The node to listen to\n * events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback\n * method, or an object with a handleEvent function.\n * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to\n * false).\n * @param {Object=} opt_scope Element in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template THIS\n * @private\n */\ngoog.events.EventHandler.prototype.listenWithWrapper_ = function(\n src, wrapper, listener, opt_capt, opt_scope) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n wrapper.listen(\n src, listener, opt_capt, opt_scope || self.handler_ || self, self);\n return self;\n};\n\n\n/**\n * @return {number} Number of listeners registered by this handler.\n */\ngoog.events.EventHandler.prototype.getListenerCount = function() {\n 'use strict';\n var count = 0;\n for (var key in this.keys_) {\n if (Object.prototype.hasOwnProperty.call(this.keys_, key)) {\n count++;\n }\n }\n return count;\n};\n\n\n/**\n * Unlistens on an event.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n * type Event type or array of event types to unlisten to.\n * @param {function(this:?, EVENTOBJ):?|{handleEvent:function(?):?}|null=}\n * opt_fn Optional callback function to be used as the listener or an object\n * with handleEvent function.\n * @param {(boolean|!EventListenerOptions)=} opt_options\n * @param {Object=} opt_scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template EVENTOBJ, THIS\n */\ngoog.events.EventHandler.prototype.unlisten = function(\n src, type, opt_fn, opt_options, opt_scope) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n if (Array.isArray(type)) {\n for (var i = 0; i < type.length; i++) {\n self.unlisten(src, type[i], opt_fn, opt_options, opt_scope);\n }\n } else {\n var capture =\n goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;\n var listener = goog.events.getListener(\n src, type, opt_fn || self.handleEvent, capture,\n opt_scope || self.handler_ || self);\n\n if (listener) {\n goog.events.unlistenByKey(listener);\n delete self.keys_[listener.key];\n }\n }\n\n return self;\n};\n\n\n/**\n * Removes an event listener which was added with listenWithWrapper().\n *\n * @param {EventTarget|goog.events.EventTarget} src The target to stop\n * listening to events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener The\n * listener function to remove.\n * @param {boolean=} opt_capt In DOM-compliant browsers, this determines\n * whether the listener is fired during the capture or bubble phase of the\n * event.\n * @param {Object=} opt_scope Element in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template THIS\n */\ngoog.events.EventHandler.prototype.unlistenWithWrapper = function(\n src, wrapper, listener, opt_capt, opt_scope) {\n 'use strict';\n var self = /** @type {!goog.events.EventHandler} */ (this);\n wrapper.unlisten(\n src, listener, opt_capt, opt_scope || self.handler_ || self, self);\n return self;\n};\n\n\n/**\n * Unlistens to all events.\n */\ngoog.events.EventHandler.prototype.removeAll = function() {\n 'use strict';\n goog.object.forEach(this.keys_, function(listenerObj, key) {\n 'use strict';\n if (this.keys_.hasOwnProperty(key)) {\n goog.events.unlistenByKey(listenerObj);\n }\n }, this);\n\n this.keys_ = {};\n};\n\n\n/**\n * Disposes of this EventHandler and removes all listeners that it registered.\n * @override\n * @protected\n */\ngoog.events.EventHandler.prototype.disposeInternal = function() {\n 'use strict';\n goog.events.EventHandler.superClass_.disposeInternal.call(this);\n this.removeAll();\n};\n\n\n/**\n * Default event handler\n * @param {goog.events.Event} e Event object.\n */\ngoog.events.EventHandler.prototype.handleEvent = function(e) {\n 'use strict';\n throw new Error('EventHandler.handleEvent not implemented');\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Provides a utility for tracing and debugging WebChannel\n * requests.\n *\n */\n\n\ngoog.provide('goog.labs.net.webChannel.WebChannelDebug');\n\ngoog.require('goog.json');\ngoog.require('goog.log');\ngoog.requireType('goog.Uri');\ngoog.requireType('goog.net.XmlHttp.ReadyState');\n\n\n\n/**\n * Logs and keeps a buffer of debugging info for the Channel.\n *\n * @constructor\n * @struct\n * @final\n */\ngoog.labs.net.webChannel.WebChannelDebug = function() {\n 'use strict';\n /**\n * The logger instance.\n * @const\n * @private {?goog.log.Logger}\n */\n this.logger_ = goog.log.getLogger('goog.labs.net.webChannel.WebChannelDebug');\n\n /**\n * Whether to enable redact. Defaults to true.\n * @private {boolean}\n */\n this.redactEnabled_ = true;\n};\n\n\ngoog.scope(function() {\n'use strict';\nvar WebChannelDebug = goog.labs.net.webChannel.WebChannelDebug;\n\n\n/**\n * Turns off redact.\n */\nWebChannelDebug.prototype.disableRedact = function() {\n 'use strict';\n this.redactEnabled_ = false;\n};\n\n\n/**\n * Logs that the browser went offline during the lifetime of a request.\n * @param {goog.Uri} url The URL being requested.\n */\nWebChannelDebug.prototype.browserOfflineResponse = function(url) {\n 'use strict';\n this.info(function() {\n 'use strict';\n return 'BROWSER_OFFLINE: ' + url;\n });\n};\n\n\n/**\n * Logs an XmlHttp request..\n * @param {string} verb The request type (GET/POST).\n * @param {goog.Uri} uri The request destination.\n * @param {string|number|undefined} id The request id.\n * @param {number} attempt Which attempt # the request was.\n * @param {?string} postData The data posted in the request.\n */\nWebChannelDebug.prototype.xmlHttpChannelRequest = function(\n verb, uri, id, attempt, postData) {\n 'use strict';\n var self = this;\n this.info(function() {\n 'use strict';\n return 'XMLHTTP REQ (' + id + ') [attempt ' + attempt + ']: ' + verb +\n '\\n' + uri + '\\n' + self.maybeRedactPostData_(postData);\n });\n};\n\n\n/**\n * Logs the meta data received from an XmlHttp request.\n * @param {string} verb The request type (GET/POST).\n * @param {goog.Uri} uri The request destination.\n * @param {string|number|undefined} id The request id.\n * @param {number} attempt Which attempt # the request was.\n * @param {goog.net.XmlHttp.ReadyState} readyState The ready state.\n * @param {number} statusCode The HTTP status code.\n */\nWebChannelDebug.prototype.xmlHttpChannelResponseMetaData = function(\n verb, uri, id, attempt, readyState, statusCode) {\n 'use strict';\n this.info(function() {\n 'use strict';\n return 'XMLHTTP RESP (' + id + ') [ attempt ' + attempt + ']: ' + verb +\n '\\n' + uri + '\\n' + readyState + ' ' + statusCode;\n });\n};\n\n\n/**\n * Logs the response data received from an XmlHttp request.\n * @param {string|number|undefined} id The request id.\n * @param {?string} responseText The response text.\n * @param {?string=} opt_desc Optional request description.\n */\nWebChannelDebug.prototype.xmlHttpChannelResponseText = function(\n id, responseText, opt_desc) {\n 'use strict';\n var self = this;\n this.info(function() {\n 'use strict';\n return 'XMLHTTP TEXT (' + id + '): ' + self.redactResponse_(responseText) +\n (opt_desc ? ' ' + opt_desc : '');\n });\n};\n\n\n/**\n * Logs a request timeout.\n * @param {goog.Uri} uri The uri that timed out.\n */\nWebChannelDebug.prototype.timeoutResponse = function(uri) {\n 'use strict';\n this.info(function() {\n 'use strict';\n return 'TIMEOUT: ' + uri;\n });\n};\n\n\n/**\n * Logs a debug message.\n * @param {!goog.log.Loggable} text The message.\n */\nWebChannelDebug.prototype.debug = function(text) {\n 'use strict';\n goog.log.fine(this.logger_, text);\n};\n\n\n/**\n * Logs an exception\n * @param {Error} e The error or error event.\n * @param {goog.log.Loggable=} opt_msg The optional message,\n * defaults to 'Exception'.\n */\nWebChannelDebug.prototype.dumpException = function(e, opt_msg) {\n 'use strict';\n goog.log.error(this.logger_, opt_msg || 'Exception', e);\n};\n\n\n/**\n * Logs an info message.\n * @param {!goog.log.Loggable} text The message.\n */\nWebChannelDebug.prototype.info = function(text) {\n 'use strict';\n goog.log.info(this.logger_, text);\n};\n\n\n/**\n * Logs a warning message.\n * @param {!goog.log.Loggable} text The message.\n */\nWebChannelDebug.prototype.warning = function(text) {\n 'use strict';\n goog.log.warning(this.logger_, text);\n};\n\n\n/**\n * Logs a severe message.\n * @param {!goog.log.Loggable} text The message.\n */\nWebChannelDebug.prototype.severe = function(text) {\n 'use strict';\n goog.log.error(this.logger_, text);\n};\n\n\n/**\n * Removes potentially private data from a response so that we don't\n * accidentally save private and personal data to the server logs.\n * @param {?string} responseText A JSON response to clean.\n * @return {?string} The cleaned response.\n * @private\n */\nWebChannelDebug.prototype.redactResponse_ = function(responseText) {\n 'use strict';\n if (!this.redactEnabled_) {\n return responseText;\n }\n\n if (!responseText) {\n return null;\n }\n\n try {\n var responseArray = JSON.parse(responseText);\n if (responseArray) {\n for (var i = 0; i < responseArray.length; i++) {\n if (Array.isArray(responseArray[i])) {\n this.maybeRedactArray_(responseArray[i]);\n }\n }\n }\n\n return goog.json.serialize(responseArray);\n } catch (e) {\n this.debug('Exception parsing expected JS array - probably was not JS');\n return responseText;\n }\n};\n\n\n/**\n * Removes data from a response array that may be sensitive.\n * @param {!Array<?>} array The array to clean.\n * @private\n */\nWebChannelDebug.prototype.maybeRedactArray_ = function(array) {\n 'use strict';\n if (array.length < 2) {\n return;\n }\n var dataPart = array[1];\n if (!Array.isArray(dataPart)) {\n return;\n }\n if (dataPart.length < 1) {\n return;\n }\n\n var type = dataPart[0];\n if (type != 'noop' && type != 'stop' && type != 'close') {\n // redact all fields in the array\n for (var i = 1; i < dataPart.length; i++) {\n dataPart[i] = '';\n }\n }\n};\n\n\n/**\n * Removes potentially private data from a request POST body so that we don't\n * accidentally save private and personal data to the server logs.\n * @param {?string} data The data string to clean.\n * @return {?string} The data string with sensitive data replaced by 'redacted'.\n * @private\n */\nWebChannelDebug.prototype.maybeRedactPostData_ = function(data) {\n 'use strict';\n if (!this.redactEnabled_) {\n return data;\n }\n\n if (!data) {\n return null;\n }\n var out = '';\n var params = data.split('&');\n for (var i = 0; i < params.length; i++) {\n var param = params[i];\n var keyValue = param.split('=');\n if (keyValue.length > 1) {\n var key = keyValue[0];\n var value = keyValue[1];\n\n var keyParts = key.split('_');\n if (keyParts.length >= 2 && keyParts[1] == 'type') {\n out += key + '=' + value + '&';\n } else {\n out += key + '=' +\n 'redacted' +\n '&';\n }\n }\n }\n return out;\n};\n}); // goog.scope\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Static utilities for collecting stats associated with\n * ChannelRequest.\n *\n */\n\n\ngoog.provide('goog.labs.net.webChannel.requestStats');\ngoog.provide('goog.labs.net.webChannel.requestStats.Event');\ngoog.provide('goog.labs.net.webChannel.requestStats.ServerReachability');\ngoog.provide('goog.labs.net.webChannel.requestStats.ServerReachabilityEvent');\ngoog.provide('goog.labs.net.webChannel.requestStats.Stat');\ngoog.provide('goog.labs.net.webChannel.requestStats.StatEvent');\ngoog.provide('goog.labs.net.webChannel.requestStats.TimingEvent');\n\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventTarget');\n\n\ngoog.scope(function() {\n'use strict';\nconst requestStats = goog.labs.net.webChannel.requestStats;\n\n\n/**\n * Events fired.\n * @const\n */\nrequestStats.Event = {};\n\n\n/**\n * Singleton event target for firing stat events\n * @type {?goog.events.EventTarget}\n * @private\n */\nrequestStats.eventTarget_ = null;\n\n/**\n * Singleton event target for firing stat events\n * @return {!goog.events.EventTarget}\n * @private\n */\nrequestStats.getStatEventTarget_ = function() {\n 'use strict';\n requestStats.eventTarget_ =\n requestStats.eventTarget_ || new goog.events.EventTarget();\n return requestStats.eventTarget_;\n};\n\n/**\n * The type of event that occurs every time some information about how reachable\n * the server is is discovered.\n */\nrequestStats.Event.SERVER_REACHABILITY_EVENT = 'serverreachability';\n\n\n/**\n * Types of events which reveal information about the reachability of the\n * server.\n * @enum {number}\n */\nrequestStats.ServerReachability = {\n REQUEST_MADE: 1,\n REQUEST_SUCCEEDED: 2,\n REQUEST_FAILED: 3,\n BACK_CHANNEL_ACTIVITY: 4 // any response data received\n};\n\n\n\n/**\n * Event class for SERVER_REACHABILITY_EVENT.\n *\n * @param {goog.events.EventTarget} target The stat event target for\n the channel.\n * @param {requestStats.ServerReachability} reachabilityType\n * The reachability event type.\n * @constructor\n * @extends {goog.events.Event}\n */\nrequestStats.ServerReachabilityEvent = function(target, reachabilityType) {\n 'use strict';\n goog.events.Event.call(\n this, requestStats.Event.SERVER_REACHABILITY_EVENT, target);\n\n /**\n * @type {requestStats.ServerReachability}\n */\n this.reachabilityType = reachabilityType;\n};\ngoog.inherits(requestStats.ServerReachabilityEvent, goog.events.Event);\n\n\n/**\n * Notify the channel that a particular fine grained network event has occurred.\n * Should be considered package-private.\n * @param {requestStats.ServerReachability} reachabilityType\n * The reachability event type.\n */\nrequestStats.notifyServerReachabilityEvent = function(reachabilityType) {\n 'use strict';\n const target = requestStats.getStatEventTarget_();\n target.dispatchEvent(\n new requestStats.ServerReachabilityEvent(target, reachabilityType));\n};\n\n\n/**\n * Stat Event that fires when things of interest happen that may be useful for\n * applications to know about for stats or debugging purposes.\n */\nrequestStats.Event.STAT_EVENT = 'statevent';\n\n\n/**\n * Enum that identifies events for statistics that are interesting to track.\n * @enum {number}\n */\nrequestStats.Stat = {\n /** Event indicating a new connection attempt. */\n CONNECT_ATTEMPT: 0,\n\n /** Event indicating a connection error due to a general network problem. */\n ERROR_NETWORK: 1,\n\n /**\n * Event indicating a connection error that isn't due to a general network\n * problem.\n */\n ERROR_OTHER: 2,\n\n /** Event indicating the start of test stage one. */\n TEST_STAGE_ONE_START: 3,\n\n /** Event indicating the start of test stage two. */\n TEST_STAGE_TWO_START: 4,\n\n /** Event indicating the first piece of test data was received. */\n TEST_STAGE_TWO_DATA_ONE: 5,\n\n /**\n * Event indicating that the second piece of test data was received and it was\n * received separately from the first.\n */\n TEST_STAGE_TWO_DATA_TWO: 6,\n\n /** Event indicating both pieces of test data were received simultaneously. */\n TEST_STAGE_TWO_DATA_BOTH: 7,\n\n /** Event indicating stage one of the test request failed. */\n TEST_STAGE_ONE_FAILED: 8,\n\n /** Event indicating stage two of the test request failed. */\n TEST_STAGE_TWO_FAILED: 9,\n\n /**\n * Event indicating that a buffering proxy is likely between the client and\n * the server.\n */\n PROXY: 10,\n\n /**\n * Event indicating that no buffering proxy is likely between the client and\n * the server.\n */\n NOPROXY: 11,\n\n /** Event indicating an unknown SID error. */\n REQUEST_UNKNOWN_SESSION_ID: 12,\n\n /** Event indicating a bad status code was received. */\n REQUEST_BAD_STATUS: 13,\n\n /** Event indicating incomplete data was received */\n REQUEST_INCOMPLETE_DATA: 14,\n\n /** Event indicating bad data was received */\n REQUEST_BAD_DATA: 15,\n\n /** Event indicating no data was received when data was expected. */\n REQUEST_NO_DATA: 16,\n\n /** Event indicating a request timeout. */\n REQUEST_TIMEOUT: 17,\n\n /**\n * Event indicating that the server never received our hanging GET and so it\n * is being retried.\n */\n BACKCHANNEL_MISSING: 18,\n\n /**\n * Event indicating that we have determined that our hanging GET is not\n * receiving data when it should be. Thus it is dead dead and will be retried.\n */\n BACKCHANNEL_DEAD: 19,\n\n /**\n * The browser declared itself offline during the lifetime of a request, or\n * was offline when a request was initially made.\n */\n BROWSER_OFFLINE: 20\n};\n\n\n\n/**\n * Event class for STAT_EVENT.\n *\n * @param {goog.events.EventTarget} eventTarget The stat event target for\n the channel.\n * @param {requestStats.Stat} stat The stat.\n * @constructor\n * @extends {goog.events.Event}\n */\nrequestStats.StatEvent = function(eventTarget, stat) {\n 'use strict';\n goog.events.Event.call(this, requestStats.Event.STAT_EVENT, eventTarget);\n\n /**\n * The stat\n * @type {requestStats.Stat}\n */\n this.stat = stat;\n};\ngoog.inherits(requestStats.StatEvent, goog.events.Event);\n\n\n/**\n * Returns the singleton event target for stat events.\n * @return {!goog.events.EventTarget} The event target for stat events.\n */\nrequestStats.getStatEventTarget = function() {\n 'use strict';\n return requestStats.getStatEventTarget_();\n};\n\n\n/**\n * Helper function to call the stat event callback.\n * @param {requestStats.Stat} stat The stat.\n */\nrequestStats.notifyStatEvent = function(stat) {\n 'use strict';\n const target = requestStats.getStatEventTarget_();\n target.dispatchEvent(new requestStats.StatEvent(target, stat));\n};\n\n\n/**\n * An event that fires when POST requests complete successfully, indicating\n * the size of the POST and the round trip time.\n */\nrequestStats.Event.TIMING_EVENT = 'timingevent';\n\n\n\n/**\n * Event class for requestStats.Event.TIMING_EVENT\n *\n * @param {goog.events.EventTarget} target The stat event target for\n the channel.\n * @param {number} size The number of characters in the POST data.\n * @param {number} rtt The total round trip time from POST to response in MS.\n * @param {number} retries The number of times the POST had to be retried.\n * @constructor\n * @extends {goog.events.Event}\n */\nrequestStats.TimingEvent = function(target, size, rtt, retries) {\n 'use strict';\n goog.events.Event.call(this, requestStats.Event.TIMING_EVENT, target);\n\n /**\n * @type {number}\n */\n this.size = size;\n\n /**\n * @type {number}\n */\n this.rtt = rtt;\n\n /**\n * @type {number}\n */\n this.retries = retries;\n};\ngoog.inherits(requestStats.TimingEvent, goog.events.Event);\n\n\n/**\n * Helper function to notify listeners about POST request performance.\n *\n * @param {number} size Number of characters in the POST data.\n * @param {number} rtt The amount of time from POST start to response.\n * @param {number} retries The number of times the POST had to be retried.\n */\nrequestStats.notifyTimingEvent = function(size, rtt, retries) {\n 'use strict';\n const target = requestStats.getStatEventTarget_();\n target.dispatchEvent(\n new requestStats.TimingEvent(target, size, rtt, retries));\n};\n\n\n/**\n * Allows the application to set an execution hooks for when a channel\n * starts processing requests. This is useful to track timing or logging\n * special information. The function takes no parameters and return void.\n * @param {Function} startHook The function for the start hook.\n */\nrequestStats.setStartThreadExecutionHook = function(startHook) {\n 'use strict';\n requestStats.startExecutionHook_ = startHook;\n};\n\n\n/**\n * Allows the application to set an execution hooks for when a channel\n * stops processing requests. This is useful to track timing or logging\n * special information. The function takes no parameters and return void.\n * @param {Function} endHook The function for the end hook.\n */\nrequestStats.setEndThreadExecutionHook = function(endHook) {\n 'use strict';\n requestStats.endExecutionHook_ = endHook;\n};\n\n\n/**\n * Application provided execution hook for the start hook.\n *\n * @type {Function}\n * @private\n */\nrequestStats.startExecutionHook_ = function() {};\n\n\n/**\n * Application provided execution hook for the end hook.\n *\n * @type {Function}\n * @private\n */\nrequestStats.endExecutionHook_ = function() {};\n\n\n/**\n * Helper function to call the start hook\n */\nrequestStats.onStartExecution = function() {\n 'use strict';\n requestStats.startExecutionHook_();\n};\n\n\n/**\n * Helper function to call the end hook\n */\nrequestStats.onEndExecution = function() {\n 'use strict';\n requestStats.endExecutionHook_();\n};\n\n\n/**\n * Wrapper around SafeTimeout which calls the start and end execution hooks\n * with a try...finally block.\n * @param {Function} fn The callback function.\n * @param {number} ms The time in MS for the timer.\n * @return {number} The ID of the timer.\n */\nrequestStats.setTimeout = function(fn, ms) {\n 'use strict';\n if (typeof fn !== 'function') {\n throw new Error('Fn must not be null and must be a function');\n }\n return goog.global.setTimeout(function() {\n 'use strict';\n requestStats.onStartExecution();\n try {\n fn();\n } finally {\n requestStats.onEndExecution();\n }\n }, ms);\n};\n}); // goog.scope\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Error codes shared between goog.net.IframeIo and\n * goog.net.XhrIo.\n */\n\ngoog.provide('goog.net.ErrorCode');\n\n\n/**\n * Error codes\n * @enum {number}\n */\ngoog.net.ErrorCode = {\n\n /**\n * There is no error condition.\n */\n NO_ERROR: 0,\n\n /**\n * The most common error from iframeio, unfortunately, is that the browser\n * responded with an error page that is classed as a different domain. The\n * situations, are when a browser error page is shown -- 404, access denied,\n * DNS failure, connection reset etc.)\n *\n */\n ACCESS_DENIED: 1,\n\n /**\n * Currently the only case where file not found will be caused is when the\n * code is running on the local file system and a non-IE browser makes a\n * request to a file that doesn't exist.\n */\n FILE_NOT_FOUND: 2,\n\n /**\n * If Firefox shows a browser error page, such as a connection reset by\n * server or access denied, then it will fail silently without the error or\n * load handlers firing.\n */\n FF_SILENT_ERROR: 3,\n\n /**\n * Custom error provided by the client through the error check hook.\n */\n CUSTOM_ERROR: 4,\n\n /**\n * Exception was thrown while processing the request.\n */\n EXCEPTION: 5,\n\n /**\n * The Http response returned a non-successful http status code.\n */\n HTTP_ERROR: 6,\n\n /**\n * The request was aborted.\n */\n ABORT: 7,\n\n /**\n * The request timed out.\n */\n TIMEOUT: 8,\n\n /**\n * The resource is not available offline.\n */\n OFFLINE: 9,\n};\n\n\n/**\n * Returns a friendly error message for an error code. These messages are for\n * debugging and are not localized.\n * @param {goog.net.ErrorCode} errorCode An error code.\n * @return {string} A message for debugging.\n */\ngoog.net.ErrorCode.getDebugMessage = function(errorCode) {\n 'use strict';\n switch (errorCode) {\n case goog.net.ErrorCode.NO_ERROR:\n return 'No Error';\n\n case goog.net.ErrorCode.ACCESS_DENIED:\n return 'Access denied to content document';\n\n case goog.net.ErrorCode.FILE_NOT_FOUND:\n return 'File not found';\n\n case goog.net.ErrorCode.FF_SILENT_ERROR:\n return 'Firefox silently errored';\n\n case goog.net.ErrorCode.CUSTOM_ERROR:\n return 'Application custom error';\n\n case goog.net.ErrorCode.EXCEPTION:\n return 'An exception occurred';\n\n case goog.net.ErrorCode.HTTP_ERROR:\n return 'Http response at 400 or 500 level';\n\n case goog.net.ErrorCode.ABORT:\n return 'Request was aborted';\n\n case goog.net.ErrorCode.TIMEOUT:\n return 'Request timed out';\n\n case goog.net.ErrorCode.OFFLINE:\n return 'The resource is not available offline';\n\n default:\n return 'Unrecognized error code';\n }\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Common events for the network classes.\n */\n\n\ngoog.provide('goog.net.EventType');\n\n\n/**\n * Event names for network events\n * @enum {string}\n */\ngoog.net.EventType = {\n COMPLETE: 'complete',\n SUCCESS: 'success',\n ERROR: 'error',\n ABORT: 'abort',\n READY: 'ready',\n READY_STATE_CHANGE: 'readystatechange',\n TIMEOUT: 'timeout',\n INCREMENTAL_DATA: 'incrementaldata',\n PROGRESS: 'progress',\n // DOWNLOAD_PROGRESS and UPLOAD_PROGRESS are special events dispatched by\n // goog.net.XhrIo to allow binding listeners specific to each type of\n // progress.\n DOWNLOAD_PROGRESS: 'downloadprogress',\n UPLOAD_PROGRESS: 'uploadprogress',\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Interface for a factory for creating XMLHttpRequest objects\n * and metadata about them.\n */\n\ngoog.provide('goog.net.XmlHttpFactory');\n\n/** @suppress {extraRequire} Typedef. */\ngoog.require('goog.net.XhrLike');\n\n\n\n/**\n * Abstract base class for an XmlHttpRequest factory.\n * @constructor\n */\ngoog.net.XmlHttpFactory = function() {};\n\n\n/**\n * Cache of options - we only actually call internalGetOptions once.\n * @type {?Object}\n * @private\n */\ngoog.net.XmlHttpFactory.prototype.cachedOptions_ = null;\n\n\n/**\n * @return {!goog.net.XhrLike.OrNative} A new XhrLike instance.\n */\ngoog.net.XmlHttpFactory.prototype.createInstance = goog.abstractMethod;\n\n\n/**\n * @return {Object} Options describing how xhr objects obtained from this\n * factory should be used.\n */\ngoog.net.XmlHttpFactory.prototype.getOptions = function() {\n 'use strict';\n return this.cachedOptions_ ||\n (this.cachedOptions_ = this.internalGetOptions());\n};\n\n\n/**\n * Override this method in subclasses to preserve the caching offered by\n * getOptions().\n * @return {Object} Options describing how xhr objects obtained from this\n * factory should be used.\n * @protected\n */\ngoog.net.XmlHttpFactory.prototype.internalGetOptions = goog.abstractMethod;\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview The API spec for the WebChannel messaging library.\n *\n * Similar to HTML5 WebSocket, WebChannel offers an abstraction for\n * point-to-point socket-like communication between a browser client and\n * a remote origin.\n *\n * WebChannels are created via <code>WebChannel</code>. Multiple WebChannels\n * may be multiplexed over the same WebChannelTransport, which represents\n * the underlying physical connectivity over standard wire protocols\n * such as HTTP.\n *\n * A WebChannel in turn represents a logical communication channel between\n * the client and server end point. A WebChannel remains open for as long\n * as the client or server end-point allows.\n *\n * Messages are delivered in-order and reliably over the same WebChannel,\n * and the choice of the underlying wire protocols is completely transparent\n * to the API users.\n *\n * Note that we have no immediate plan to move this API out of labs. While\n * the implementation is production ready, the API is subject to change.\n */\n\ngoog.provide('goog.net.WebChannel');\ngoog.provide('goog.net.WebChannel.Options');\n\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.Listenable');\ngoog.require('goog.net.XmlHttpFactory');\n\n\n\n/**\n * A WebChannel represents a logical bi-directional channel over which the\n * client communicates with a remote server that holds the other endpoint\n * of the channel. A WebChannel is always created in the context of a shared\n * {@link WebChannelTransport} instance. It is up to the underlying client-side\n * and server-side implementations to decide how or when multiplexing is\n * to be enabled.\n *\n * @interface\n * @extends {goog.events.Listenable}\n */\ngoog.net.WebChannel = function() {};\n\n\n\n/**\n * This interface defines a pluggable API to allow WebChannel runtime to support\n * customized algorithms in order to recover from transient failures such as\n * those failures caused by network or proxies (intermediaries).\n *\n * The algorithm may also choose to fail-fast, e.g. switch the client to some\n * offline mode.\n *\n * Extra measurements and logging could also be implemented in the custom\n * module, which has the full knowledge of all the state transitions\n * (due to failures).\n *\n * A default algorithm will be provided by the webchannel library itself. Custom\n * algorithms are expected to be tailored to specific client platforms or\n * networking environments, e.g. mobile, cellular network.\n *\n * @interface\n */\ngoog.net.WebChannel.FailureRecovery = function() {};\n\n\n/**\n * Configuration spec for newly created WebChannel instances.\n *\n * WebChannels are configured in the context of the containing\n * {@link WebChannelTransport}. The configuration parameters are specified\n * when a new instance of WebChannel is created via {@link WebChannelTransport}.\n * @record\n */\ngoog.net.WebChannel.Options = function() {};\n\n/**\n * Custom headers to be added to every message sent to the\n * server. This object is mutable, and custom headers may be changed, removed,\n * or added during the runtime after a channel has been\n * opened\n * @type {!Object<string, string>|undefined}\n */\ngoog.net.WebChannel.Options.prototype.messageHeaders;\n\n/**\n * Similar to messageHeaders, but any custom headers will\n * be sent only once when the channel is opened. Typical usage is to send\n * an auth header to the server, which only checks the auth header at the time\n * when the channel is opened.\n * @type {!Object<string, string>|undefined}\n */\ngoog.net.WebChannel.Options.prototype.initMessageHeaders;\n\n/**\n * Sent as initMessageHeaders via X-WebChannel-Content-Type,\n * to inform the server the MIME type of WebChannel messages.\n * @type {string|undefined}\n */\ngoog.net.WebChannel.Options.prototype.messageContentType;\n\n/**\n * Custom url query parameters to be added to every message\n * sent to the server. This object is mutable, and custom parameters may be\n * changed, removed or added during the runtime after a channel has been opened.\n * @type {!Object<string, string>|undefined}\n */\ngoog.net.WebChannel.Options.prototype.messageUrlParams;\n\n/**\n * Whether a special header should be added to\n * each message so that the server can dispatch webchannel messages without\n * knowing the URL path prefix. Defaults to false.\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.clientProtocolHeaderRequired;\n\n/**\n * The maximum number of in-flight HTTP requests allowed\n * when SPDY is enabled. Currently we only detect SPDY in Chrome.\n * This parameter defaults to 10. When SPDY is not enabled, this parameter\n * will have no effect.\n * @type {number|undefined}\n */\ngoog.net.WebChannel.Options.prototype.concurrentRequestLimit;\n\n/**\n * Setting this to true to allow the use of sub-domains\n * (as configured by the server) to send XHRs with the CORS withCredentials\n * bit set to true.\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.supportsCrossDomainXhr;\n\n/**\n * Whether to bypass v8 encoding of client-sent messages.\n * This defaults to false now due to legacy servers. New applications should\n * always configure this option to true.\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.sendRawJson;\n\n/**\n * The URL parameter name that contains the session id (for sticky routing of\n * HTTP requests). When this param is specified, a server that supports this\n * option will respond with an opaque session id as part of the initial\n * handshake (via the X-HTTP-Session-Id header); and all the subsequent requests\n * will contain the httpSessionIdParam. This option will take precedence over\n * any duplicated parameter specified with messageUrlParams, whose value will be\n * ignored.\n * @type {string|undefined}\n */\ngoog.net.WebChannel.Options.prototype.httpSessionIdParam;\n\n/**\n * The URL parameter name to allow custom HTTP\n * headers to be overwritten as a URL param to bypass CORS preflight.\n * goog.net.rpc.HttpCors is used to encode the HTTP headers.\n * @type {string|undefined}\n */\ngoog.net.WebChannel.Options.prototype.httpHeadersOverwriteParam;\n\n/**\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.backgroundChannelTest;\n\n/**\n * Whether to force long-polling from client to server.\n * This defaults to false. Long-polling may be necessary when a (MITM) proxy\n * is buffering data sent by the server.\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.forceLongPolling;\n\n/**\n * Whether to enable automatic detection of buffering proxies. In the presence\n * of any buffering proxy, webchannel will use long-polling to send messages\n * from the server to the client. This option defaults to false.\n * Currently when fastHandshake is enabled, this option will be ignored.\n * Compared to \"forceLongPolling\", this option may introduce up to 2-RTT\n * extra latency for delivering messages generated immediately after the\n * handshake.\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.detectBufferingProxy;\n\n/**\n * Enable true 0-RTT message delivery, including\n * leveraging QUIC 0-RTT (which requires GET to be used). This option\n * defaults to false. Note it is allowed to send messages before Open event is\n * received, after a channel has been opened. In order to enable 0-RTT,\n * messages will be encoded as part of URL and therefore there needs be a size\n * limit for those initial messages that are sent immediately as part of the\n * GET handshake request. With sendRawJson=true, this limit is currently set\n * to 4K chars and data beyond this limit will be buffered till the handshake\n * (1-RTT) finishes. With sendRawJson=false, it's up to the application\n * to limit the amount of data that is sent as part of the handshake.\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.fastHandshake;\n\n/**\n * Enable the blocking RPC semantics for the handshake:\n * 1) the completion of handshake is blocked by the server-side application\n * logic for handling the handshake (HTTP) request; 2) the client application\n * will inspect the handshake (HTTP) response headers as generated\n * by the server application (v.s. by only the webchannel runtime). This option\n * defaults to false.\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.blockingHandshake;\n\n/**\n * Whether to disable logging redact. By default, redact is\n * enabled to remove any message payload or user-provided info\n * from closure logs.\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.disableRedact;\n\n/**\n * Inform the server about the client profile to enable\n * customized configs that are optimized for certain clients or environments.\n * Currently this information is sent via X-WebChannel-Client-Profile header.\n * @type {string|undefined}\n */\ngoog.net.WebChannel.Options.prototype.clientProfile;\n\n/**\n * The internal channel parameter name to allow\n * experimental channel configurations. Supported options include fastfail,\n * baseRetryDelayMs, retryDelaySeedMs, forwardChannelMaxRetries and\n * forwardChannelRequestTimeoutMs. Note that these options are subject to\n * change.\n * @type {!Object<string, boolean|number>|undefined}\n */\ngoog.net.WebChannel.Options.prototype.internalChannelParams;\n\n/**\n * Allows the caller to override the factory used to create\n * XMLHttpRequest objects. This is introduced to disable CORS on firefox OS.\n * @type {!goog.net.XmlHttpFactory|undefined}\n */\ngoog.net.WebChannel.Options.prototype.xmlHttpFactory;\n\n/**\n * Client-side thresholds that decide when to refresh\n * an underlying HTTP request, to limit memory consumption due to XHR buffering\n * or compression context. The client-side thresholds should be significantly\n * smaller than the server-side thresholds. This allows the client to eliminate\n * any latency introduced by request refreshing, i.e. an RTT window during which\n * messages may be buffered on the server-side. Supported params include\n * totalBytesReceived, totalDurationMs.\n * @type {!Object<string, number>|undefined}\n */\ngoog.net.WebChannel.Options.prototype.requestRefreshThresholds;\n\n/**\n * This is an experimental feature to use WHATWG Fetch/streams (when supported)\n * for the backchannel. If a custom 'xmlHttpFactory' is speficied, this option\n * will not be effective. This option defaults to false now and will eventually\n * be turned on by default.\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.useFetchStreams;\n\n/**\n * Opt-in to enable Chrome origin trials from the WebChannel client. See\n * https://github.com/GoogleChrome/OriginTrials\n *\n * Origin trial history:\n * - fetch upload (11/2020 - 07/2021)\n * https://developers.chrome.com/origintrials/#/view_trial/3524066708417413121\n *\n * Participating in the origin trials will help Chrome to release new Web\n * platform features sooner, which will in turn help improve WebChannel\n * performance.\n *\n * Origin trials are not expected to interfere with WebChannel wire messages\n * and should not introduce any noticeable overhead.\n *\n * This is enabled by default with any on-going origin-trial.\n *\n * @type {boolean|undefined}\n */\ngoog.net.WebChannel.Options.prototype.enableOriginTrials;\n\n\n/**\n * Types that are allowed as message data.\n *\n * Note that JS objects (sent by the client) can only have string encoded\n * values due to the limitation of the current wire protocol.\n *\n * Unicode strings (sent by the server) may or may not need be escaped, as\n * decided by the server.\n *\n * @typedef {(!ArrayBuffer|!Blob|!Object<string, !Object|string>|!Array|string)}\n */\ngoog.net.WebChannel.MessageData;\n\n\n/**\n * Open the WebChannel against the URI specified in the constructor.\n */\ngoog.net.WebChannel.prototype.open = goog.abstractMethod;\n\n\n/**\n * Close the WebChannel.\n *\n * This is a full close (shutdown) with no guarantee of FIFO delivery in respect\n * to any in-flight messages sent to the server.\n *\n * If you need such a guarantee, see the Half the halfClose() method.\n */\ngoog.net.WebChannel.prototype.close = goog.abstractMethod;\n\n\n/**\n * Half-close the WebChannel.\n *\n * Half-close semantics:\n * 1. delivered as a regular message in FIFO programming order\n * 2. the server is expected to return a half-close too (with or without\n * application involved), which will trigger a full close (shutdown)\n * on the client side\n * 3. for now, the half-close event defined for server-initiated\n * half-close is not exposed to the client application\n * 4. a client-side half-close may be triggered internally when the client\n * receives a half-close from the server; and the client is expected to\n * do a full close after the half-close is acked and delivered\n * on the server-side.\n * 5. Full close is always a forced one. See the close() method.\n *\n * New messages sent after halfClose() will be dropped.\n *\n * NOTE: This is not yet implemented, and will throw an exception if called.\n */\ngoog.net.WebChannel.prototype.halfClose = goog.abstractMethod;\n\n\n/**\n * Sends a message to the server that maintains the other end point of\n * the WebChannel.\n *\n * O-RTT behavior:\n * 1. messages sent before open() is called will always be delivered as\n * part of the handshake, i.e. with 0-RTT\n * 2. messages sent after open() is called but before the OPEN event\n * is received will be delivered as part of the handshake if\n * send() is called from the same execution context as open().\n * 3. otherwise, those messages will be buffered till the handshake\n * is completed (which will fire the OPEN event).\n *\n * @param {!goog.net.WebChannel.MessageData} message The message to send.\n */\ngoog.net.WebChannel.prototype.send = goog.abstractMethod;\n\n\n/**\n * Common events fired by WebChannels.\n * @enum {string}\n */\ngoog.net.WebChannel.EventType = {\n /** Dispatched when the channel is opened. */\n OPEN: goog.events.getUniqueId('open'),\n\n /** Dispatched when the channel is closed. */\n CLOSE: goog.events.getUniqueId('close'),\n\n /**\n * Dispatched when the channel is aborted due to errors.\n *\n * For backward compatibility reasons, a CLOSE event will also be\n * dispatched, following the ERROR event, which indicates that the channel\n * has been completely shutdown .\n */\n ERROR: goog.events.getUniqueId('error'),\n\n /** Dispatched when the channel has received a new message. */\n MESSAGE: goog.events.getUniqueId('message')\n};\n\n\n\n/**\n * The event interface for the MESSAGE event.\n *\n * @constructor\n * @extends {goog.events.Event}\n */\ngoog.net.WebChannel.MessageEvent = function() {\n 'use strict';\n goog.net.WebChannel.MessageEvent.base(\n this, 'constructor', goog.net.WebChannel.EventType.MESSAGE);\n};\ngoog.inherits(goog.net.WebChannel.MessageEvent, goog.events.Event);\n\n\n/**\n * The content of the message received from the server.\n *\n * @type {!goog.net.WebChannel.MessageData}\n */\ngoog.net.WebChannel.MessageEvent.prototype.data;\n\n\n/**\n * The metadata key when the MESSAGE event represents a metadata message.\n *\n * @type {string|undefined}\n */\ngoog.net.WebChannel.MessageEvent.prototype.metadataKey;\n\n\n/**\n * WebChannel level error conditions.\n *\n * Summary of error debugging and reporting in WebChannel:\n *\n * Network Error\n * 1. By default the webchannel library will set the error status to\n * NETWORK_ERROR when a channel has to be aborted or closed. NETWORK_ERROR\n * may be recovered by the application by retrying and opening a new channel.\n * 2. There may be lost messages (not acked by the server) when a channel is\n * aborted. Currently we don't have a public API to retrieve messages that\n * are waiting to be acked on the client side. File a bug if you think it\n * is useful to expose such an API.\n * 3. Details of why a channel fails are available via closure debug logs,\n * and stats events (see webchannel/requeststats.js). Those are internal\n * stats and are subject to change. File a bug if you think it's useful to\n * version and expose such stats as part of the WebChannel API.\n *\n * Server Error\n * 1. SERVER_ERROR is intended to indicate a non-recoverable condition, e.g.\n * when auth fails.\n * 2. We don't currently generate any such errors, because most of the time\n * it's the responsibility of upper-layer frameworks or the application\n * itself to indicate to the client why a webchannel has been failed\n * by the server.\n * 3. When a channel is failed by the server explicitly, we still signal\n * NETWORK_ERROR to the client. Explicit server failure may happen when the\n * server does a fail-over, or becomes overloaded, or conducts a forced\n * shutdown etc.\n * 4. We use some heuristic to decide if the network (aka cloud) is down\n * v.s. the actual server is down.\n *\n * RuntimeProperties.getLastStatusCode is a useful state that we expose to\n * the client to indicate the HTTP response status code of the last HTTP\n * request initiated by the WebChannel client library, for debugging\n * purposes only.\n *\n * See WebChannel.Options.backChannelFailureRecovery and\n * WebChannel.FailureRecovery to install a custom failure-recovery algorithm.\n *\n * @enum {number}\n */\ngoog.net.WebChannel.ErrorStatus = {\n /** No error has occurred. */\n OK: 0,\n\n /** Communication to the server has failed. */\n NETWORK_ERROR: 1,\n\n /** The server fails to accept or process the WebChannel. */\n SERVER_ERROR: 2\n};\n\n\n\n/**\n * The event interface for the ERROR event.\n *\n * @constructor\n * @extends {goog.events.Event}\n */\ngoog.net.WebChannel.ErrorEvent = function() {\n 'use strict';\n goog.net.WebChannel.ErrorEvent.base(\n this, 'constructor', goog.net.WebChannel.EventType.ERROR);\n};\ngoog.inherits(goog.net.WebChannel.ErrorEvent, goog.events.Event);\n\n\n/**\n * The error status.\n *\n * @type {!goog.net.WebChannel.ErrorStatus}\n */\ngoog.net.WebChannel.ErrorEvent.prototype.status;\n\n\n/**\n * @return {!goog.net.WebChannel.RuntimeProperties} The runtime properties\n * of the WebChannel instance.\n */\ngoog.net.WebChannel.prototype.getRuntimeProperties = goog.abstractMethod;\n\n\n\n/**\n * The runtime properties of the WebChannel instance.\n *\n * This class is defined for debugging and monitoring purposes, as well as for\n * runtime functions that the application may choose to manage by itself.\n *\n * @interface\n */\ngoog.net.WebChannel.RuntimeProperties = function() {};\n\n\n/**\n * @return {number} The effective limit for the number of concurrent HTTP\n * requests that are allowed to be made for sending messages from the client\n * to the server. When SPDY is not enabled, this limit will be one.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.getConcurrentRequestLimit =\n goog.abstractMethod;\n\n\n/**\n * For applications that need support multiple channels (e.g. from\n * different tabs) to the same origin, use this method to decide if SPDY is\n * enabled and therefore it is safe to open multiple channels.\n *\n * If SPDY is disabled, the application may choose to limit the number of active\n * channels to one or use other means such as sub-domains to work around\n * the browser connection limit.\n *\n * @return {boolean} Whether SPDY is enabled for the origin against which\n * the channel is created.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.isSpdyEnabled =\n goog.abstractMethod;\n\n\n/**\n * @return {number} The number of requests (for sending messages to the server)\n * that are pending. If this number is approaching the value of\n * getConcurrentRequestLimit(), client-to-server message delivery may experience\n * a higher latency.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.getPendingRequestCount =\n goog.abstractMethod;\n\n\n/**\n * For applications to query the current HTTP session id, sent by the server\n * during the initial handshake.\n *\n * @return {?string} the HTTP session id or null if no HTTP session is in use.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.getHttpSessionId =\n goog.abstractMethod;\n\n\n/**\n * Experimental API.\n *\n * This method generates an in-band commit request to the server, which will\n * ack the commit request as soon as all messages sent prior to this commit\n * request have been committed by the application.\n *\n * Committing a message has a stronger semantics than delivering a message\n * to the application. Detail spec:\n * https://github.com/bidiweb/webchannel/blob/master/commit.md\n *\n * Timeout or cancellation is not supported and the application is expected to\n * abort the channel if the commit-ack fails to arrive in time.\n *\n * ===\n *\n * This is currently implemented only in the client layer and the commit\n * callback will be invoked after all the pending client-sent messages have been\n * delivered by the server-side webchannel end-point. This semantics is\n * different and weaker than what's required for end-to-end ack which requires\n * the server application to ack the in-order delivery of messages that are sent\n * before the commit request is issued.\n *\n * Commit should only be called after the channel open event is received.\n * Duplicated commits are allowed and only the last callback is guaranteed.\n * Commit called after the channel has been closed will be ignored.\n *\n * @param {function()} callback The callback will be invoked once an\n * ack has been received for the current commit or any newly issued commit.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.commit = goog.abstractMethod;\n\n\n/**\n * This method may be used by the application to recover from a peer failure\n * or to enable sender-initiated flow-control.\n *\n * Detail spec: https://github.com/bidiweb/webchannel/blob/master/commit.md\n *\n * This is not yet implemented.\n *\n * @return {number} The total number of messages that have not received\n * commit-ack from the server; or if no commit has been issued, the number\n * of messages that have not been delivered to the server application.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.getNonAckedMessageCount =\n goog.abstractMethod;\n\n\n/**\n * A low water-mark message count to notify the application when the\n * flow-control condition is cleared, that is, when the application is\n * able to send more messages.\n *\n * We expect the application to configure a high water-mark message count,\n * which is checked via getNonAckedMessageCount(). When the high water-mark\n * is exceeded, the application should install a callback via this method\n * to be notified when to start to send new messages.\n *\n * This is not yet implemented.\n *\n * @param {number} count The low water-mark count. It is an error to pass\n * a non-positive value.\n * @param {function()} callback The call back to notify the application\n * when NonAckedMessageCount is below the specified low water-mark count.\n * Any previously registered callback is cleared. This new callback will\n * be cleared once it has been fired, or when the channel is closed or aborted.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.notifyNonAckedMessageCount =\n goog.abstractMethod;\n\n\n/**\n * Experimental API.\n *\n * This method registers a callback to handle the commit request sent\n * by the server. Commit protocol spec:\n * https://github.com/bidiweb/webchannel/blob/master/commit.md\n *\n * This is not yet implemented.\n *\n * @param {function(!Object)} callback The callback will take an opaque\n * commitId which needs be passed back to the server when an ack-commit\n * response is generated by the client application, via ackCommit().\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.onCommit = goog.abstractMethod;\n\n\n/**\n * Experimental API.\n *\n * This method is used by the application to generate an ack-commit response\n * for the given commitId. Commit protocol spec:\n * https://github.com/bidiweb/webchannel/blob/master/commit.md\n *\n * This is not yet implemented.\n *\n * @param {!Object} commitId The commitId which denotes the commit request\n * from the server that needs be ack'ed.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.ackCommit = goog.abstractMethod;\n\n\n/**\n * @return {number} The last HTTP status code received by the channel.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.getLastStatusCode =\n goog.abstractMethod;\n\n\n/**\n * Enum to indicate the current recovery state.\n *\n * @enum {string}\n */\ngoog.net.WebChannel.FailureRecovery.State = {\n /** Initial state. */\n INIT: 'init',\n\n /** Once a failure has been detected. */\n FAILED: 'failed',\n\n /**\n * Once a recovery operation has been issued, e.g. a new request to resume\n * communication.\n */\n RECOVERING: 'recovering',\n\n /** The channel has been closed. */\n CLOSED: 'closed'\n};\n\n\n/**\n * Enum to indicate different failure conditions as detected by the webchannel\n * runtime.\n *\n * This enum is to be used only between the runtime and FailureRecovery module,\n * and new states are expected to be introduced in future.\n *\n * @enum {string}\n */\ngoog.net.WebChannel.FailureRecovery.FailureCondition = {\n /**\n * The HTTP response returned a non-successful http status code.\n */\n HTTP_ERROR: 'http_error',\n\n /**\n * The request was aborted.\n */\n ABORT: 'abort',\n\n /**\n * The request timed out.\n */\n TIMEOUT: 'timeout',\n\n /**\n * Exception was thrown while processing the request/response.\n */\n EXCEPTION: 'exception'\n};\n\n\n/**\n * @return {!goog.net.WebChannel.FailureRecovery.State} the current state,\n * mainly for debugging use.\n */\ngoog.net.WebChannel.FailureRecovery.prototype.getState = goog.abstractMethod;\n\n\n/**\n * This method is for WebChannel runtime to set the current failure condition\n * and to provide a callback for the algorithm to signal to the runtime\n * when it is time to issue a recovery operation, e.g. a new request to the\n * server.\n *\n * Supported transitions include:\n * INIT->FAILED\n * FAILED->FAILED (re-entry ok)\n * RECOVERY->FAILED.\n *\n * Ignored if state == CLOSED.\n *\n * Advanced implementations are expected to track all the state transitions\n * and their timestamps for monitoring purposes.\n *\n * @param {!goog.net.WebChannel.FailureRecovery.FailureCondition} failure The\n * new failure condition generated by the WebChannel runtime.\n * @param {!Function} operation The callback function to the WebChannel\n * runtime to issue a recovery operation, e.g. a new request. E.g. the default\n * recovery algorithm will issue timeout-based recovery operations.\n * Post-condition for the callback: state transition to RECOVERING.\n *\n * @return {!goog.net.WebChannel.FailureRecovery.State} The updated state\n * as decided by the failure recovery module. Upon a recoverable failure event,\n * the state is transitioned to RECOVERING; or the state is transitioned to\n * FAILED which indicates a fail-fast decision for the runtime to execute.\n */\ngoog.net.WebChannel.FailureRecovery.prototype.setFailure = goog.abstractMethod;\n\n\n/**\n * The Webchannel runtime needs call this method when webchannel is closed or\n * aborted.\n *\n * Once the instance is closed, any access to the instance will be a no-op.\n */\ngoog.net.WebChannel.FailureRecovery.prototype.close = goog.abstractMethod;\n\n\n/**\n * A request header to indicate to the server the messaging protocol\n * each HTTP message is speaking.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_CLIENT_PROTOCOL = 'X-Client-Protocol';\n\n\n/**\n * The value for x-client-protocol when the messaging protocol is WebChannel.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_CLIENT_PROTOCOL_WEB_CHANNEL = 'webchannel';\n\n\n/**\n * A response header for the server to signal the wire-protocol that\n * the browser establishes with the server (or proxy), e.g. \"spdy\" (aka http/2)\n * \"quic\". This information avoids the need to use private APIs to decide if\n * HTTP requests are multiplexed etc.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_CLIENT_WIRE_PROTOCOL = 'X-Client-Wire-Protocol';\n\n\n/**\n * A response header for the server to send back the HTTP session id as part of\n * the initial handshake. The value of the HTTP session id is opaque to the\n * WebChannel protocol.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_HTTP_SESSION_ID = 'X-HTTP-Session-Id';\n\n\n/**\n * A response header for the server to send back any initial response data as a\n * header to avoid any possible buffering by an intermediary, which may\n * be undesired during the handshake.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_HTTP_INITIAL_RESPONSE = 'X-HTTP-Initial-Response';\n\n\n/**\n * A request header for specifying the content-type of WebChannel messages,\n * e.g. application-defined JSON encoding styles. Currently this header\n * is sent by the client via initMessageHeaders when the channel is opened.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_WEBCHANNEL_CONTENT_TYPE = 'X-WebChannel-Content-Type';\n\n\n/**\n * A request header for specifying the client profile in order to apply\n * customized config params on the server side, e.g. timeouts.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_WEBCHANNEL_CLIENT_PROFILE = 'X-WebChannel-Client-Profile';\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Low level handling of XMLHttpRequest.\n */\n\ngoog.provide('goog.net.DefaultXmlHttpFactory');\ngoog.provide('goog.net.XmlHttp');\ngoog.provide('goog.net.XmlHttp.OptionType');\ngoog.provide('goog.net.XmlHttp.ReadyState');\ngoog.provide('goog.net.XmlHttpDefines');\n\ngoog.require('goog.asserts');\ngoog.require('goog.net.WrapperXmlHttpFactory');\ngoog.require('goog.net.XmlHttpFactory');\ngoog.requireType('goog.net.XhrLike');\n\n\n/**\n * Static class for creating XMLHttpRequest objects.\n * @return {!goog.net.XhrLike.OrNative} A new XMLHttpRequest object.\n */\ngoog.net.XmlHttp = function() {\n 'use strict';\n return goog.net.XmlHttp.factory_.createInstance();\n};\n\n\n/**\n * @define {boolean} Whether to assume XMLHttpRequest exists. Setting this to\n * true bypasses the ActiveX probing code.\n * NOTE(ruilopes): Due to the way JSCompiler works, this define *will not* strip\n * out the ActiveX probing code from binaries. To achieve this, use\n * `goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR` instead.\n * TODO(ruilopes): Collapse both defines.\n */\ngoog.net.XmlHttp.ASSUME_NATIVE_XHR =\n goog.define('goog.net.XmlHttp.ASSUME_NATIVE_XHR', false);\n\n\n/** @const */\ngoog.net.XmlHttpDefines = {};\n\n\n/**\n * @define {boolean} Whether to assume XMLHttpRequest exists. Setting this to\n * true eliminates the ActiveX probing code.\n */\ngoog.net.XmlHttpDefines.ASSUME_NATIVE_XHR =\n goog.define('goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR', false);\n\n\n/**\n * Gets the options to use with the XMLHttpRequest objects obtained using\n * the static methods.\n * @return {Object} The options.\n */\ngoog.net.XmlHttp.getOptions = function() {\n 'use strict';\n return goog.net.XmlHttp.factory_.getOptions();\n};\n\n\n/**\n * Type of options that an XmlHttp object can have.\n * @enum {number}\n */\ngoog.net.XmlHttp.OptionType = {\n /**\n * Whether a goog.nullFunction should be used to clear the onreadystatechange\n * handler instead of null.\n */\n USE_NULL_FUNCTION: 0,\n\n /**\n * NOTE(user): In IE if send() errors on a *local* request the readystate\n * is still changed to COMPLETE. We need to ignore it and allow the\n * try/catch around send() to pick up the error.\n */\n LOCAL_REQUEST_ERROR: 1,\n};\n\n\n/**\n * Status constants for XMLHTTP, matches:\n * https://msdn.microsoft.com/en-us/library/ms534361(v=vs.85).aspx\n * @enum {number}\n */\ngoog.net.XmlHttp.ReadyState = {\n /**\n * Constant for when xmlhttprequest.readyState is uninitialized\n */\n UNINITIALIZED: 0,\n\n /**\n * Constant for when xmlhttprequest.readyState is loading.\n */\n LOADING: 1,\n\n /**\n * Constant for when xmlhttprequest.readyState is loaded.\n */\n LOADED: 2,\n\n /**\n * Constant for when xmlhttprequest.readyState is in an interactive state.\n */\n INTERACTIVE: 3,\n\n /**\n * Constant for when xmlhttprequest.readyState is completed\n */\n COMPLETE: 4,\n};\n\n\n/**\n * The global factory instance for creating XMLHttpRequest objects.\n * @type {goog.net.XmlHttpFactory}\n * @private\n */\ngoog.net.XmlHttp.factory_;\n\n\n/**\n * Sets the factories for creating XMLHttpRequest objects and their options.\n * @param {Function} factory The factory for XMLHttpRequest objects.\n * @param {Function} optionsFactory The factory for options.\n * @deprecated Use setGlobalFactory instead.\n */\ngoog.net.XmlHttp.setFactory = function(factory, optionsFactory) {\n 'use strict';\n goog.net.XmlHttp.setGlobalFactory(new goog.net.WrapperXmlHttpFactory(\n goog.asserts.assert(factory), goog.asserts.assert(optionsFactory)));\n};\n\n\n/**\n * Sets the global factory object.\n * @param {!goog.net.XmlHttpFactory} factory New global factory object.\n */\ngoog.net.XmlHttp.setGlobalFactory = function(factory) {\n 'use strict';\n goog.net.XmlHttp.factory_ = factory;\n};\n\n\n\n/**\n * Default factory to use when creating xhr objects. You probably shouldn't be\n * instantiating this directly, but rather using it via goog.net.XmlHttp.\n * @extends {goog.net.XmlHttpFactory}\n * @constructor\n */\ngoog.net.DefaultXmlHttpFactory = function() {\n 'use strict';\n goog.net.XmlHttpFactory.call(this);\n};\ngoog.inherits(goog.net.DefaultXmlHttpFactory, goog.net.XmlHttpFactory);\n\n\n/** @override */\ngoog.net.DefaultXmlHttpFactory.prototype.createInstance = function() {\n 'use strict';\n const progId = this.getProgId_();\n if (progId) {\n return new ActiveXObject(progId);\n } else {\n return new XMLHttpRequest();\n }\n};\n\n\n/** @override */\ngoog.net.DefaultXmlHttpFactory.prototype.internalGetOptions = function() {\n 'use strict';\n const progId = this.getProgId_();\n const options = {};\n if (progId) {\n options[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] = true;\n options[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] = true;\n }\n return options;\n};\n\n\n/**\n * The ActiveX PROG ID string to use to create xhr's in IE. Lazily initialized.\n * @type {string|undefined}\n * @private\n */\ngoog.net.DefaultXmlHttpFactory.prototype.ieProgId_;\n\n\n/**\n * Initialize the private state used by other functions.\n * @return {string} The ActiveX PROG ID string to use to create xhr's in IE.\n * @private\n */\ngoog.net.DefaultXmlHttpFactory.prototype.getProgId_ = function() {\n 'use strict';\n if (goog.net.XmlHttp.ASSUME_NATIVE_XHR ||\n goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR) {\n return '';\n }\n\n // The following blog post describes what PROG IDs to use to create the\n // XMLHTTP object in Internet Explorer:\n // http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx\n // However we do not (yet) fully trust that this will be OK for old versions\n // of IE on Win9x so we therefore keep the last 2.\n if (!this.ieProgId_ && typeof XMLHttpRequest == 'undefined' &&\n typeof ActiveXObject != 'undefined') {\n // Candidate Active X types.\n const ACTIVE_X_IDENTS = [\n 'MSXML2.XMLHTTP.6.0',\n 'MSXML2.XMLHTTP.3.0',\n 'MSXML2.XMLHTTP',\n 'Microsoft.XMLHTTP',\n ];\n for (let i = 0; i < ACTIVE_X_IDENTS.length; i++) {\n const candidate = ACTIVE_X_IDENTS[i];\n\n try {\n new ActiveXObject(candidate);\n // NOTE(user): cannot assign progid and return candidate in one line\n // because JSCompiler complaings: BUG 658126\n this.ieProgId_ = candidate;\n return candidate;\n } catch (e) {\n // do nothing; try next choice\n }\n }\n\n // couldn't find any matches\n throw new Error(\n 'Could not create ActiveXObject. ActiveX might be disabled,' +\n ' or MSXML might not be installed');\n }\n\n return /** @type {string} */ (this.ieProgId_);\n};\n\n\n// Set the global factory to an instance of the default factory.\ngoog.net.XmlHttp.setGlobalFactory(new goog.net.DefaultXmlHttpFactory());\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Definition of the ChannelRequest class. The request\n * object encapsulates the logic for making a single request, either for the\n * forward channel, back channel, or test channel, to the server. It contains\n * the logic for the two types of transports we use:\n * XMLHTTP and Image request. It provides timeout detection. More transports\n * to be added in future, such as Fetch, WebSocket.\n *\n */\n\n\ngoog.provide('goog.labs.net.webChannel.ChannelRequest');\n\ngoog.require('goog.Timer');\ngoog.require('goog.asserts');\ngoog.require('goog.async.Throttle');\ngoog.require('goog.dispose');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.labs.net.webChannel.Channel');\ngoog.require('goog.labs.net.webChannel.WebChannelDebug');\ngoog.require('goog.labs.net.webChannel.environment');\ngoog.require('goog.labs.net.webChannel.requestStats');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.WebChannel');\ngoog.require('goog.net.XmlHttp');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\ngoog.requireType('goog.Uri');\ngoog.requireType('goog.events.Event');\ngoog.requireType('goog.labs.net.webChannel.Wire.QueuedMap');\ngoog.requireType('goog.net.XhrIo');\n\n\n\n/**\n * A new ChannelRequest is created for each request to the server.\n *\n * @param {goog.labs.net.webChannel.Channel} channel\n * The channel that owns this request.\n * @param {goog.labs.net.webChannel.WebChannelDebug} channelDebug A\n * WebChannelDebug to use for logging.\n * @param {string=} opt_sessionId The session id for the channel.\n * @param {string|number=} opt_requestId The request id for this request.\n * @param {number=} opt_retryId The retry id for this request.\n * @constructor\n * @struct\n * @final\n */\ngoog.labs.net.webChannel.ChannelRequest = function(\n channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId) {\n 'use strict';\n /**\n * The channel object that owns the request.\n * @private {goog.labs.net.webChannel.Channel}\n */\n this.channel_ = channel;\n\n /**\n * The channel debug to use for logging\n * @private {goog.labs.net.webChannel.WebChannelDebug}\n */\n this.channelDebug_ = channelDebug;\n\n /**\n * The Session ID for the channel.\n * @private {string|undefined}\n */\n this.sid_ = opt_sessionId;\n\n /**\n * The RID (request ID) for the request.\n * @private {string|number|undefined}\n */\n this.rid_ = opt_requestId;\n\n /**\n * The attempt number of the current request.\n * @private {number}\n */\n this.retryId_ = opt_retryId || 1;\n\n /**\n * An object to keep track of the channel request event listeners.\n * @private {!goog.events.EventHandler<\n * !goog.labs.net.webChannel.ChannelRequest>}\n */\n this.eventHandler_ = new goog.events.EventHandler(this);\n\n /**\n * The timeout in ms before failing the request.\n * @private {number}\n */\n this.timeout_ = goog.labs.net.webChannel.ChannelRequest.TIMEOUT_MS_;\n\n /**\n * A timer for polling responseText in browsers that don't fire\n * onreadystatechange during incremental loading of responseText.\n * @private {goog.Timer}\n */\n this.pollingTimer_ =\n new goog.Timer(goog.labs.net.webChannel.environment.getPollingInterval());\n\n /**\n * Extra HTTP headers to add to all the requests sent to the server.\n * @private {?Object}\n */\n this.extraHeaders_ = null;\n\n\n /**\n * Whether the request was successful. This is only set to true after the\n * request successfully completes.\n * @private {boolean}\n */\n this.successful_ = false;\n\n\n /**\n * The TimerID of the timer used to detect if the request has timed-out.\n * @type {?number}\n * @private\n */\n this.watchDogTimerId_ = null;\n\n /**\n * The time in the future when the request will timeout.\n * @private {?number}\n */\n this.watchDogTimeoutTime_ = null;\n\n /**\n * The time the request started.\n * @private {?number}\n */\n this.requestStartTime_ = null;\n\n /**\n * The type of request (XMLHTTP, IMG)\n * @private {?number}\n */\n this.type_ = null;\n\n /**\n * The base Uri for the request. The includes all the parameters except the\n * one that indicates the retry number.\n * @private {?goog.Uri}\n */\n this.baseUri_ = null;\n\n /**\n * The request Uri that was actually used for the most recent request attempt.\n * @private {?goog.Uri}\n */\n this.requestUri_ = null;\n\n /**\n * The post data, if the request is a post.\n * @private {?string}\n */\n this.postData_ = null;\n\n /**\n * An array of pending messages that we have either received a non-successful\n * response for, or no response at all, and which therefore may or may not\n * have been received by the server.\n * @private {!Array<goog.labs.net.webChannel.Wire.QueuedMap>}\n */\n this.pendingMessages_ = [];\n\n /**\n * The XhrLte request if the request is using XMLHTTP\n * @private {?goog.net.XhrIo}\n */\n this.xmlHttp_ = null;\n\n /**\n * The position of where the next unprocessed chunk starts in the response\n * text.\n * @private {number}\n */\n this.xmlHttpChunkStart_ = 0;\n\n /**\n * The verb (Get or Post) for the request.\n * @private {?string}\n */\n this.verb_ = null;\n\n /**\n * The last error if the request failed.\n * @private {?goog.labs.net.webChannel.ChannelRequest.Error}\n */\n this.lastError_ = null;\n\n /**\n * The last status code received.\n * @private {number}\n */\n this.lastStatusCode_ = -1;\n\n /**\n * Whether the request has been cancelled due to a call to cancel.\n * @private {boolean}\n */\n this.cancelled_ = false;\n\n /**\n * A throttle time in ms for readystatechange events for the backchannel.\n * Useful for throttling when ready state is INTERACTIVE (partial data).\n * If set to zero no throttle is used.\n *\n * See WebChannelBase.prototype.readyStateChangeThrottleMs_\n *\n * @private {number}\n */\n this.readyStateChangeThrottleMs_ = 0;\n\n /**\n * The throttle for readystatechange events for the current request, or null\n * if there is none.\n * @private {?goog.async.Throttle}\n */\n this.readyStateChangeThrottle_ = null;\n\n /**\n * Whether to the result is expected to be encoded for chunking and thus\n * requires decoding.\n * @private {boolean}\n */\n this.decodeChunks_ = false;\n\n /**\n * Whether to decode x-http-initial-response.\n * @private {boolean}\n */\n this.decodeInitialResponse_ = false;\n\n /**\n * Whether x-http-initial-response has been decoded (dispatched).\n * @private {boolean}\n */\n this.initialResponseDecoded_ = false;\n\n /**\n * Whether the first byte of response body has arrived, for a successful\n * response.\n * @private {boolean}\n */\n this.firstByteReceived_ = false;\n\n /**\n * The current state of fetch responses if webchannel is using WHATWG\n * fetch/streams.\n * @private {!goog.labs.net.webChannel.FetchResponseState}\n */\n this.fetchResponseState_ = new goog.labs.net.webChannel.FetchResponseState();\n};\n\n/**\n * A collection of fetch/stream properties.\n * @struct\n * @constructor\n */\ngoog.labs.net.webChannel.FetchResponseState = function() {\n 'use strict';\n /**\n * The TextDecoder for decoding Uint8Array responses from fetch request.\n * @type {?goog.global.TextDecoder}\n */\n this.textDecoder = null;\n\n /**\n * The unconsumed response text from the fetch requests.\n * @type {string}\n */\n this.responseBuffer = '';\n\n /**\n * Whether or not the response body has arrived.\n * @type {boolean}\n */\n this.responseArrivedForFetch = false;\n};\n\n\ngoog.scope(function() {\n'use strict';\nconst WebChannel = goog.net.WebChannel;\nconst Channel = goog.labs.net.webChannel.Channel;\nconst ChannelRequest = goog.labs.net.webChannel.ChannelRequest;\nconst FetchResponseState = goog.labs.net.webChannel.FetchResponseState;\nconst requestStats = goog.labs.net.webChannel.requestStats;\nconst WebChannelDebug = goog.labs.net.webChannel.WebChannelDebug;\nconst environment = goog.labs.net.webChannel.environment;\n\n/**\n * Default timeout in MS for a request. The server must return data within this\n * time limit for the request to not timeout.\n * @private {number}\n */\nChannelRequest.TIMEOUT_MS_ = 45 * 1000;\n\n\n/**\n * Enum for channel requests type\n * @enum {number}\n * @private\n */\nChannelRequest.Type_ = {\n /**\n * XMLHTTP requests.\n */\n XML_HTTP: 1,\n\n /**\n * IMG requests.\n */\n CLOSE_REQUEST: 2\n};\n\n\n/**\n * Enum type for identifying an error.\n * @enum {number}\n */\nChannelRequest.Error = {\n /**\n * Errors due to a non-200 status code.\n */\n STATUS: 0,\n\n /**\n * Errors due to no data being returned.\n */\n NO_DATA: 1,\n\n /**\n * Errors due to a timeout.\n */\n TIMEOUT: 2,\n\n /**\n * Errors due to the server returning an unknown.\n */\n UNKNOWN_SESSION_ID: 3,\n\n /**\n * Errors due to bad data being received.\n */\n BAD_DATA: 4,\n\n /**\n * Errors due to the handler throwing an exception.\n */\n HANDLER_EXCEPTION: 5,\n\n /**\n * The browser declared itself offline during the request.\n */\n BROWSER_OFFLINE: 6\n};\n\n\n/**\n * Returns a useful error string for debugging based on the specified error\n * code.\n * @param {?ChannelRequest.Error} errorCode The error code.\n * @param {number} statusCode The HTTP status code.\n * @return {string} The error string for the given code combination.\n */\nChannelRequest.errorStringFromCode = function(errorCode, statusCode) {\n 'use strict';\n switch (errorCode) {\n case ChannelRequest.Error.STATUS:\n return 'Non-200 return code (' + statusCode + ')';\n case ChannelRequest.Error.NO_DATA:\n return 'XMLHTTP failure (no data)';\n case ChannelRequest.Error.TIMEOUT:\n return 'HttpConnection timeout';\n default:\n return 'Unknown error';\n }\n};\n\n\n/**\n * Sentinel value used to indicate an invalid chunk in a multi-chunk response.\n * @private {!Object}\n */\nChannelRequest.INVALID_CHUNK_ = {};\n\n\n/**\n * Sentinel value used to indicate an incomplete chunk in a multi-chunk\n * response.\n * @private {!Object}\n */\nChannelRequest.INCOMPLETE_CHUNK_ = {};\n\n\n/**\n * Returns whether XHR streaming is supported on this browser.\n *\n * @return {boolean} Whether XHR streaming is supported.\n * @see http://code.google.com/p/closure-library/issues/detail?id=346\n */\nChannelRequest.supportsXhrStreaming = function() {\n 'use strict';\n return !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(10);\n};\n\n\n/**\n * Sets extra HTTP headers to add to all the requests sent to the server.\n *\n * @param {Object} extraHeaders The HTTP headers.\n */\nChannelRequest.prototype.setExtraHeaders = function(extraHeaders) {\n 'use strict';\n this.extraHeaders_ = extraHeaders;\n};\n\n\n/**\n * Overrides the default HTTP method.\n *\n * @param {string} verb The HTTP method\n */\nChannelRequest.prototype.setVerb = function(verb) {\n 'use strict';\n this.verb_ = verb;\n};\n\n\n/**\n * Sets the timeout for a request\n *\n * @param {number} timeout The timeout in MS for when we fail the request.\n */\nChannelRequest.prototype.setTimeout = function(timeout) {\n 'use strict';\n this.timeout_ = timeout;\n};\n\n\n/**\n * Sets the throttle for handling onreadystatechange events for the request.\n *\n * @param {number} throttle The throttle in ms. A value of zero indicates\n * no throttle.\n */\nChannelRequest.prototype.setReadyStateChangeThrottle = function(throttle) {\n 'use strict';\n this.readyStateChangeThrottleMs_ = throttle;\n};\n\n\n/**\n * Sets the pending messages that this request is handling.\n *\n * @param {!Array<goog.labs.net.webChannel.Wire.QueuedMap>} pendingMessages\n * The pending messages for this request.\n */\nChannelRequest.prototype.setPendingMessages = function(pendingMessages) {\n 'use strict';\n this.pendingMessages_ = pendingMessages;\n};\n\n\n/**\n * Gets the pending messages that this request is handling, in case of a retry.\n *\n * @return {!Array<goog.labs.net.webChannel.Wire.QueuedMap>} The pending\n * messages for this request.\n */\nChannelRequest.prototype.getPendingMessages = function() {\n 'use strict';\n return this.pendingMessages_;\n};\n\n\n/**\n * Uses XMLHTTP to send an HTTP POST to the server.\n *\n * @param {goog.Uri} uri The uri of the request.\n * @param {?string} postData The data for the post body.\n * @param {boolean} decodeChunks Whether to the result is expected to be\n * encoded for chunking and thus requires decoding.\n */\nChannelRequest.prototype.xmlHttpPost = function(uri, postData, decodeChunks) {\n 'use strict';\n this.type_ = ChannelRequest.Type_.XML_HTTP;\n this.baseUri_ = uri.clone().makeUnique();\n this.postData_ = postData;\n this.decodeChunks_ = decodeChunks;\n this.sendXmlHttp_(null /* hostPrefix */);\n};\n\n\n/**\n * Uses XMLHTTP to send an HTTP GET to the server.\n *\n * @param {goog.Uri} uri The uri of the request.\n * @param {boolean} decodeChunks Whether to the result is expected to be\n * encoded for chunking and thus requires decoding.\n * @param {?string} hostPrefix The host prefix, if we might be using a\n * secondary domain. Note that it should also be in the URL, adding this\n * won't cause it to be added to the URL.\n */\nChannelRequest.prototype.xmlHttpGet = function(uri, decodeChunks, hostPrefix) {\n 'use strict';\n this.type_ = ChannelRequest.Type_.XML_HTTP;\n this.baseUri_ = uri.clone().makeUnique();\n this.postData_ = null;\n this.decodeChunks_ = decodeChunks;\n\n this.sendXmlHttp_(hostPrefix);\n};\n\n\n/**\n * Sends a request via XMLHTTP according to the current state of the request\n * object.\n *\n * @param {?string} hostPrefix The host prefix, if we might be using a secondary\n * domain.\n * @private\n */\nChannelRequest.prototype.sendXmlHttp_ = function(hostPrefix) {\n 'use strict';\n this.requestStartTime_ = Date.now();\n this.ensureWatchDogTimer_();\n\n // clone the base URI to create the request URI. The request uri has the\n // attempt number as a parameter which helps in debugging.\n this.requestUri_ = this.baseUri_.clone();\n this.requestUri_.setParameterValues('t', this.retryId_);\n\n // send the request either as a POST or GET\n this.xmlHttpChunkStart_ = 0;\n const useSecondaryDomains = this.channel_.shouldUseSecondaryDomains();\n this.fetchResponseState_ = new FetchResponseState();\n // If the request is a GET request, start a backchannel to transfer streaming\n // data. Note that WebChannel GET request can also be used for closing the\n // channel as in method ChannelRequest#sendCloseRequest.\n // The second parameter of Channel#createXhrIo is JS only.\n this.xmlHttp_ = this.channel_.createXhrIo(\n useSecondaryDomains ? hostPrefix : null, !this.postData_);\n\n if (this.readyStateChangeThrottleMs_ > 0) {\n this.readyStateChangeThrottle_ = new goog.async.Throttle(\n goog.bind(this.xmlHttpHandler_, this, this.xmlHttp_),\n this.readyStateChangeThrottleMs_);\n }\n\n this.eventHandler_.listen(\n this.xmlHttp_, goog.net.EventType.READY_STATE_CHANGE,\n this.readyStateChangeHandler_);\n\n const headers =\n this.extraHeaders_ ? goog.object.clone(this.extraHeaders_) : {};\n if (this.postData_) {\n if (!this.verb_) {\n this.verb_ = 'POST';\n }\n headers['Content-Type'] = 'application/x-www-form-urlencoded';\n this.xmlHttp_.send(this.requestUri_, this.verb_, this.postData_, headers);\n } else {\n this.verb_ = 'GET';\n this.xmlHttp_.send(this.requestUri_, this.verb_, null, headers);\n }\n requestStats.notifyServerReachabilityEvent(\n requestStats.ServerReachability.REQUEST_MADE);\n this.channelDebug_.xmlHttpChannelRequest(\n this.verb_, this.requestUri_, this.rid_, this.retryId_, this.postData_);\n};\n\n\n/**\n * Handles a readystatechange event.\n * @param {goog.events.Event} evt The event.\n * @private\n */\nChannelRequest.prototype.readyStateChangeHandler_ = function(evt) {\n 'use strict';\n const xhr = /** @type {goog.net.XhrIo} */ (evt.target);\n const throttle = this.readyStateChangeThrottle_;\n if (throttle &&\n xhr.getReadyState() == goog.net.XmlHttp.ReadyState.INTERACTIVE) {\n // Only throttle in the partial data case.\n this.channelDebug_.debug('Throttling readystatechange.');\n throttle.fire();\n } else {\n // If we haven't throttled, just handle response directly.\n this.xmlHttpHandler_(xhr);\n }\n};\n\n\n/**\n * XmlHttp handler\n * @param {goog.net.XhrIo} xmlhttp The XhrIo object for the current request.\n * @private\n */\nChannelRequest.prototype.xmlHttpHandler_ = function(xmlhttp) {\n 'use strict';\n requestStats.onStartExecution();\n\n try {\n if (xmlhttp == this.xmlHttp_) {\n this.onXmlHttpReadyStateChanged_();\n } else {\n this.channelDebug_.warning(\n 'Called back with an ' +\n 'unexpected xmlhttp');\n }\n } catch (ex) {\n this.channelDebug_.debug('Failed call to OnXmlHttpReadyStateChanged_');\n if (this.hasResponseBody_()) {\n const channelRequest = this;\n this.channelDebug_.dumpException(ex, function() {\n 'use strict';\n return 'ResponseText: ' + channelRequest.xmlHttp_.getResponseText();\n });\n } else {\n this.channelDebug_.dumpException(ex, 'No response text');\n }\n } finally {\n requestStats.onEndExecution();\n }\n};\n\n\n/**\n * Called by the readystate handler for XMLHTTP requests.\n *\n * @private\n */\nChannelRequest.prototype.onXmlHttpReadyStateChanged_ = function() {\n 'use strict';\n const readyState = this.xmlHttp_.getReadyState();\n const errorCode = this.xmlHttp_.getLastErrorCode();\n const statusCode = this.xmlHttp_.getStatus();\n\n // we get partial results in browsers that support ready state interactive.\n // We also make sure that getResponseText is not null in interactive mode\n // before we continue.\n if (readyState < goog.net.XmlHttp.ReadyState.INTERACTIVE ||\n (readyState == goog.net.XmlHttp.ReadyState.INTERACTIVE &&\n !environment.isPollingRequired() && // otherwise, go on to startPolling\n !this.hasResponseBody_())) {\n return; // not yet ready\n }\n\n // Dispatch any appropriate network events.\n if (!this.cancelled_ && readyState == goog.net.XmlHttp.ReadyState.COMPLETE &&\n errorCode != goog.net.ErrorCode.ABORT) {\n // Pretty conservative, these are the only known scenarios which we'd\n // consider indicative of a truly non-functional network connection.\n if (errorCode == goog.net.ErrorCode.TIMEOUT || statusCode <= 0) {\n requestStats.notifyServerReachabilityEvent(\n requestStats.ServerReachability.REQUEST_FAILED);\n } else {\n requestStats.notifyServerReachabilityEvent(\n requestStats.ServerReachability.REQUEST_SUCCEEDED);\n }\n }\n\n // got some data so cancel the watchdog timer\n this.cancelWatchDogTimer_();\n\n const status = this.xmlHttp_.getStatus();\n this.lastStatusCode_ = status;\n const responseText = this.decodeXmlHttpResponse_();\n\n if (!this.hasResponseBody_()) {\n const channelRequest = this;\n this.channelDebug_.debug(function() {\n 'use strict';\n return 'No response text for uri ' + channelRequest.requestUri_ +\n ' status ' + status;\n });\n }\n this.successful_ = (status == 200);\n\n this.channelDebug_.xmlHttpChannelResponseMetaData(\n /** @type {string} */ (this.verb_), this.requestUri_, this.rid_,\n this.retryId_, readyState, status);\n\n if (!this.successful_) {\n if (status == 400 && responseText.indexOf('Unknown SID') > 0) {\n // the server error string will include 'Unknown SID' which indicates the\n // server doesn't know about the session (maybe it got restarted, maybe\n // the user got moved to another server, etc.,). Handlers can special\n // case this error\n this.lastError_ = ChannelRequest.Error.UNKNOWN_SESSION_ID;\n requestStats.notifyStatEvent(\n requestStats.Stat.REQUEST_UNKNOWN_SESSION_ID);\n this.channelDebug_.warning('XMLHTTP Unknown SID (' + this.rid_ + ')');\n } else {\n this.lastError_ = ChannelRequest.Error.STATUS;\n requestStats.notifyStatEvent(requestStats.Stat.REQUEST_BAD_STATUS);\n this.channelDebug_.warning(\n 'XMLHTTP Bad status ' + status + ' (' + this.rid_ + ')');\n }\n this.cleanup_();\n this.dispatchFailure_();\n return;\n }\n\n if (this.shouldCheckInitialResponse_()) {\n const initialResponse = this.getInitialResponse_();\n if (initialResponse) {\n this.channelDebug_.xmlHttpChannelResponseText(\n this.rid_, initialResponse,\n 'Initial handshake response via ' +\n WebChannel.X_HTTP_INITIAL_RESPONSE);\n this.initialResponseDecoded_ = true;\n this.safeOnRequestData_(initialResponse);\n } else {\n this.successful_ = false;\n this.lastError_ = ChannelRequest.Error.UNKNOWN_SESSION_ID; // fail-fast\n requestStats.notifyStatEvent(\n requestStats.Stat.REQUEST_UNKNOWN_SESSION_ID);\n this.channelDebug_.warning(\n 'XMLHTTP Missing X_HTTP_INITIAL_RESPONSE' +\n ' (' + this.rid_ + ')');\n this.cleanup_();\n this.dispatchFailure_();\n return;\n }\n }\n\n if (this.decodeChunks_) {\n this.decodeNextChunks_(readyState, responseText);\n if (environment.isPollingRequired() && this.successful_ &&\n readyState == goog.net.XmlHttp.ReadyState.INTERACTIVE) {\n this.startPolling_();\n }\n } else {\n this.channelDebug_.xmlHttpChannelResponseText(\n this.rid_, responseText, null);\n this.safeOnRequestData_(responseText);\n }\n\n if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n this.cleanup_();\n }\n\n if (!this.successful_) {\n return;\n }\n\n if (!this.cancelled_) {\n if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n this.channel_.onRequestComplete(this);\n } else {\n // The default is false, the result from this callback shouldn't carry\n // over to the next callback, otherwise the request looks successful if\n // the watchdog timer gets called\n this.successful_ = false;\n this.ensureWatchDogTimer_();\n }\n }\n};\n\n\n/**\n * Whether we need check the initial-response header that is sent during the\n * fast handshake.\n *\n * @return {boolean} true if the initial-response header is yet to be processed.\n * @private\n */\nChannelRequest.prototype.shouldCheckInitialResponse_ = function() {\n 'use strict';\n return this.decodeInitialResponse_ && !this.initialResponseDecoded_;\n};\n\n\n/**\n * Queries the initial response header that is sent during the handshake.\n *\n * @return {?string} The non-empty header value or null.\n * @private\n */\nChannelRequest.prototype.getInitialResponse_ = function() {\n 'use strict';\n if (this.xmlHttp_) {\n const value = this.xmlHttp_.getStreamingResponseHeader(\n WebChannel.X_HTTP_INITIAL_RESPONSE);\n if (value && !goog.string.isEmptyOrWhitespace(value)) {\n return value;\n }\n }\n\n return null;\n};\n\n\n/**\n * Check if the initial response header has been handled.\n *\n * @return {boolean} true if X_HTTP_INITIAL_RESPONSE has been handled.\n */\nChannelRequest.prototype.isInitialResponseDecoded = function() {\n 'use strict';\n return this.initialResponseDecoded_;\n};\n\n\n/**\n * Decodes X_HTTP_INITIAL_RESPONSE if present.\n */\nChannelRequest.prototype.setDecodeInitialResponse = function() {\n 'use strict';\n this.decodeInitialResponse_ = true;\n};\n\n\n\n/**\n * Decodes the responses from XhrIo object.\n * @returns {string} responseText\n * @private\n */\nChannelRequest.prototype.decodeXmlHttpResponse_ = function() {\n 'use strict';\n if (!this.useFetchStreamsForResponse_()) {\n return this.xmlHttp_.getResponseText();\n }\n const responseChunks =\n /** @type {!Array<!Uint8Array>} */ (this.xmlHttp_.getResponse());\n let responseText = '';\n const responseLength = responseChunks.length;\n const requestCompleted =\n this.xmlHttp_.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE;\n if (!this.fetchResponseState_.textDecoder) {\n if (typeof TextDecoder === 'undefined') {\n this.channelDebug_.severe(\n 'TextDecoder is not supported by this browser.');\n this.cleanup_();\n this.dispatchFailure_();\n return '';\n }\n this.fetchResponseState_.textDecoder = new goog.global.TextDecoder();\n }\n for (let i = 0; i < responseLength; i++) {\n this.fetchResponseState_.responseArrivedForFetch = true;\n const isLastChunk = requestCompleted && i == responseLength - 1;\n responseText += this.fetchResponseState_.textDecoder.decode(\n responseChunks[i], {stream: isLastChunk});\n }\n responseChunks.splice(0, responseLength);\n this.fetchResponseState_.responseBuffer += responseText;\n this.xmlHttpChunkStart_ = 0;\n return this.fetchResponseState_.responseBuffer;\n};\n\n\n/**\n * Whether or not the response has response body.\n * @private\n * @returns {boolean}\n */\nChannelRequest.prototype.hasResponseBody_ = function() {\n 'use strict';\n if (!this.xmlHttp_) {\n return false;\n }\n if (this.fetchResponseState_.responseArrivedForFetch) {\n return true;\n }\n return !(!this.xmlHttp_.getResponseText() && !this.xmlHttp_.getResponse());\n};\n\n/**\n * Whether or not the response body is streamed.\n * @private\n * @returns {boolean}\n */\nChannelRequest.prototype.useFetchStreamsForResponse_ = function() {\n 'use strict';\n if (!this.xmlHttp_) {\n return false;\n }\n return (\n this.verb_ == 'GET' && this.type_ != ChannelRequest.Type_.CLOSE_REQUEST &&\n this.channel_.usesFetchStreams());\n};\n\n\n/**\n * Resets the response buffer if the saved chunk has been processed.\n * @private\n * @param {string|!Object|undefined} chunkText\n */\nChannelRequest.prototype.maybeResetBuffer_ = function(chunkText) {\n 'use strict';\n if (this.useFetchStreamsForResponse_() &&\n chunkText != ChannelRequest.INCOMPLETE_CHUNK_ &&\n chunkText != ChannelRequest.INVALID_CHUNK_) {\n this.fetchResponseState_.responseBuffer = '';\n this.xmlHttpChunkStart_ = 0;\n }\n};\n\n\n/**\n * Decodes the next set of available chunks in the response.\n * @param {number} readyState The value of readyState.\n * @param {string} responseText The value of responseText.\n * @private\n */\nChannelRequest.prototype.decodeNextChunks_ = function(\n readyState, responseText) {\n 'use strict';\n let decodeNextChunksSuccessful = true;\n\n let chunkText;\n while (!this.cancelled_ && this.xmlHttpChunkStart_ < responseText.length) {\n chunkText = this.getNextChunk_(responseText);\n if (chunkText == ChannelRequest.INCOMPLETE_CHUNK_) {\n if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n // should have consumed entire response when the request is done\n this.lastError_ = ChannelRequest.Error.BAD_DATA;\n requestStats.notifyStatEvent(requestStats.Stat.REQUEST_INCOMPLETE_DATA);\n decodeNextChunksSuccessful = false;\n }\n this.channelDebug_.xmlHttpChannelResponseText(\n this.rid_, null, '[Incomplete Response]');\n break;\n } else if (chunkText == ChannelRequest.INVALID_CHUNK_) {\n this.lastError_ = ChannelRequest.Error.BAD_DATA;\n requestStats.notifyStatEvent(requestStats.Stat.REQUEST_BAD_DATA);\n this.channelDebug_.xmlHttpChannelResponseText(\n this.rid_, responseText, '[Invalid Chunk]');\n decodeNextChunksSuccessful = false;\n break;\n } else {\n this.channelDebug_.xmlHttpChannelResponseText(\n this.rid_, /** @type {string} */ (chunkText), null);\n this.safeOnRequestData_(/** @type {string} */ (chunkText));\n }\n }\n\n this.maybeResetBuffer_(chunkText);\n\n if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE &&\n responseText.length == 0 &&\n !this.fetchResponseState_.responseArrivedForFetch) {\n // also an error if we didn't get any response\n this.lastError_ = ChannelRequest.Error.NO_DATA;\n requestStats.notifyStatEvent(requestStats.Stat.REQUEST_NO_DATA);\n decodeNextChunksSuccessful = false;\n }\n\n this.successful_ = this.successful_ && decodeNextChunksSuccessful;\n\n if (!decodeNextChunksSuccessful) {\n // malformed response - we make this trigger retry logic\n this.channelDebug_.xmlHttpChannelResponseText(\n this.rid_, responseText, '[Invalid Chunked Response]');\n this.cleanup_();\n this.dispatchFailure_();\n } else {\n if (responseText.length > 0 && !this.firstByteReceived_) {\n this.firstByteReceived_ = true;\n this.channel_.onFirstByteReceived(this, responseText);\n }\n }\n};\n\n\n/**\n * Polls the response for new data.\n * @private\n */\nChannelRequest.prototype.pollResponse_ = function() {\n 'use strict';\n if (!this.xmlHttp_) {\n return; // already closed\n }\n const readyState = this.xmlHttp_.getReadyState();\n const responseText = this.xmlHttp_.getResponseText();\n if (this.xmlHttpChunkStart_ < responseText.length) {\n this.cancelWatchDogTimer_();\n this.decodeNextChunks_(readyState, responseText);\n if (this.successful_ &&\n readyState != goog.net.XmlHttp.ReadyState.COMPLETE) {\n this.ensureWatchDogTimer_();\n }\n }\n};\n\n\n/**\n * Starts a polling interval for changes to responseText of the\n * XMLHttpRequest, for browsers that don't fire onreadystatechange\n * as data comes in incrementally. This timer is disabled in\n * cleanup_().\n * @private\n */\nChannelRequest.prototype.startPolling_ = function() {\n 'use strict';\n this.eventHandler_.listen(\n this.pollingTimer_, goog.Timer.TICK, this.pollResponse_);\n this.pollingTimer_.start();\n};\n\n\n/**\n * Returns the next chunk of a chunk-encoded response. This is not standard\n * HTTP chunked encoding because browsers don't expose the chunk boundaries to\n * the application through XMLHTTP. So we have an additional chunk encoding at\n * the application level that lets us tell where the beginning and end of\n * individual responses are so that we can only try to eval a complete JS array.\n *\n * The encoding is the size of the chunk encoded as a decimal string followed\n * by a newline followed by the data.\n *\n * @param {string} responseText The response text from the XMLHTTP response.\n * @return {string|!Object} The next chunk string or a sentinel object\n * indicating a special condition.\n * @private\n */\nChannelRequest.prototype.getNextChunk_ = function(responseText) {\n 'use strict';\n const sizeStartIndex = this.xmlHttpChunkStart_;\n const sizeEndIndex = responseText.indexOf('\\n', sizeStartIndex);\n if (sizeEndIndex == -1) {\n return ChannelRequest.INCOMPLETE_CHUNK_;\n }\n\n const sizeAsString = responseText.substring(sizeStartIndex, sizeEndIndex);\n const size = Number(sizeAsString);\n if (isNaN(size)) {\n return ChannelRequest.INVALID_CHUNK_;\n }\n\n const chunkStartIndex = sizeEndIndex + 1;\n if (chunkStartIndex + size > responseText.length) {\n return ChannelRequest.INCOMPLETE_CHUNK_;\n }\n\n const chunkText = responseText.substr(chunkStartIndex, size);\n this.xmlHttpChunkStart_ = chunkStartIndex + size;\n return chunkText;\n};\n\n\n/**\n * Uses an IMG tag or navigator.sendBeacon to send an HTTP get to the server.\n *\n * This is only currently used to terminate the connection, as an IMG tag is\n * the most reliable way to send something to the server while the page\n * is getting torn down.\n *\n * Navigator.sendBeacon is available on Chrome and Firefox as a formal\n * solution to ensure delivery without blocking window close. See\n * https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon\n *\n * For Chrome Apps, sendBeacon is always necessary due to Content Security\n * Policy (CSP) violation of using an IMG tag.\n *\n * For react-native, we use xhr to send the actual close request, and assume\n * there is no page-close issue with react-native.\n *\n * @param {goog.Uri} uri The uri to send a request to.\n */\nChannelRequest.prototype.sendCloseRequest = function(uri) {\n 'use strict';\n this.type_ = ChannelRequest.Type_.CLOSE_REQUEST;\n this.baseUri_ = uri.clone().makeUnique();\n\n let requestSent = false;\n\n if (goog.global.navigator && goog.global.navigator.sendBeacon) {\n // empty string body to avoid 413 error on chrome < 41\n requestSent =\n goog.global.navigator.sendBeacon(this.baseUri_.toString(), '');\n }\n\n if (!requestSent && goog.global.Image) {\n const eltImg = new Image();\n eltImg.src = this.baseUri_;\n requestSent = true;\n }\n\n if (!requestSent) {\n // no handler is set to match the sendBeacon/Image behavior\n this.xmlHttp_ = this.channel_.createXhrIo(null);\n this.xmlHttp_.send(this.baseUri_);\n }\n\n this.requestStartTime_ = Date.now();\n this.ensureWatchDogTimer_();\n};\n\n\n/**\n * Cancels the request no matter what the underlying transport is.\n */\nChannelRequest.prototype.cancel = function() {\n 'use strict';\n this.cancelled_ = true;\n this.cleanup_();\n};\n\n\n/**\n * Resets the timeout.\n *\n * @param {number=} opt_timeout The new timeout\n */\nChannelRequest.prototype.resetTimeout = function(opt_timeout) {\n 'use strict';\n if (opt_timeout) {\n this.setTimeout(opt_timeout);\n }\n // restart only if a timer is currently set\n if (this.watchDogTimerId_) {\n this.cancelWatchDogTimer_();\n this.ensureWatchDogTimer_();\n }\n};\n\n\n/**\n * Ensures that there is watchdog timeout which is used to ensure that\n * the connection completes in time.\n *\n * @private\n */\nChannelRequest.prototype.ensureWatchDogTimer_ = function() {\n 'use strict';\n this.watchDogTimeoutTime_ = Date.now() + this.timeout_;\n this.startWatchDogTimer_(this.timeout_);\n};\n\n\n/**\n * Starts the watchdog timer which is used to ensure that the connection\n * completes in time.\n * @param {number} time The number of milliseconds to wait.\n * @private\n */\nChannelRequest.prototype.startWatchDogTimer_ = function(time) {\n 'use strict';\n if (this.watchDogTimerId_ != null) {\n // assertion\n throw new Error('WatchDog timer not null');\n }\n this.watchDogTimerId_ =\n requestStats.setTimeout(goog.bind(this.onWatchDogTimeout_, this), time);\n};\n\n\n/**\n * Cancels the watchdog timer if it has been started.\n *\n * @private\n */\nChannelRequest.prototype.cancelWatchDogTimer_ = function() {\n 'use strict';\n if (this.watchDogTimerId_) {\n goog.global.clearTimeout(this.watchDogTimerId_);\n this.watchDogTimerId_ = null;\n }\n};\n\n\n/**\n * Called when the watchdog timer is triggered. It also handles a case where it\n * is called too early which we suspect may be happening sometimes\n * (not sure why)\n *\n * @private\n */\nChannelRequest.prototype.onWatchDogTimeout_ = function() {\n 'use strict';\n this.watchDogTimerId_ = null;\n const now = Date.now();\n goog.asserts.assert(\n this.watchDogTimeoutTime_, 'WatchDog timeout time missing?');\n if (now - this.watchDogTimeoutTime_ >= 0) {\n this.handleTimeout_();\n } else {\n // got called too early for some reason\n this.channelDebug_.warning('WatchDog timer called too early');\n this.startWatchDogTimer_(this.watchDogTimeoutTime_ - now);\n }\n};\n\n\n/**\n * Called when the request has actually timed out. Will cleanup and notify the\n * channel of the failure.\n *\n * @private\n */\nChannelRequest.prototype.handleTimeout_ = function() {\n 'use strict';\n if (this.successful_) {\n // Should never happen.\n this.channelDebug_.severe(\n 'Received watchdog timeout even though request loaded successfully');\n }\n\n this.channelDebug_.timeoutResponse(this.requestUri_);\n\n // IMG or SendBeacon requests never notice if they were successful,\n // and always 'time out'. This fact says nothing about reachability.\n if (this.type_ != ChannelRequest.Type_.CLOSE_REQUEST) {\n requestStats.notifyServerReachabilityEvent(\n requestStats.ServerReachability.REQUEST_FAILED);\n requestStats.notifyStatEvent(requestStats.Stat.REQUEST_TIMEOUT);\n }\n\n this.cleanup_();\n\n // Set error and dispatch failure.\n // This is called for CLOSE_REQUEST too to ensure channel_.onRequestComplete.\n this.lastError_ = ChannelRequest.Error.TIMEOUT;\n this.dispatchFailure_();\n};\n\n\n/**\n * Notifies the channel that this request failed.\n * @private\n */\nChannelRequest.prototype.dispatchFailure_ = function() {\n 'use strict';\n if (this.channel_.isClosed() || this.cancelled_) {\n return;\n }\n\n this.channel_.onRequestComplete(this);\n};\n\n\n/**\n * Cleans up the objects used to make the request. This function is\n * idempotent.\n *\n * @private\n */\nChannelRequest.prototype.cleanup_ = function() {\n 'use strict';\n this.cancelWatchDogTimer_();\n\n goog.dispose(this.readyStateChangeThrottle_);\n this.readyStateChangeThrottle_ = null;\n\n // Stop the polling timer, if necessary.\n this.pollingTimer_.stop();\n\n // Unhook all event handlers.\n this.eventHandler_.removeAll();\n\n if (this.xmlHttp_) {\n // clear out this.xmlHttp_ before aborting so we handle getting reentered\n // inside abort\n const xmlhttp = this.xmlHttp_;\n this.xmlHttp_ = null;\n xmlhttp.abort();\n xmlhttp.dispose();\n }\n};\n\n\n/**\n * Indicates whether the request was successful. Only valid after the handler\n * is called to indicate completion of the request.\n *\n * @return {boolean} True if the request succeeded.\n */\nChannelRequest.prototype.getSuccess = function() {\n 'use strict';\n return this.successful_;\n};\n\n\n/**\n * If the request was not successful, returns the reason.\n *\n * @return {?ChannelRequest.Error} The last error.\n */\nChannelRequest.prototype.getLastError = function() {\n 'use strict';\n return this.lastError_;\n};\n\n\n/**\n * Returns the status code of the last request.\n * @return {number} The status code of the last request.\n */\nChannelRequest.prototype.getLastStatusCode = function() {\n 'use strict';\n return this.lastStatusCode_;\n};\n\n\n/**\n * Returns the session id for this channel.\n *\n * @return {string|undefined} The session ID.\n */\nChannelRequest.prototype.getSessionId = function() {\n 'use strict';\n return this.sid_;\n};\n\n\n/**\n * Returns the request id for this request. Each request has a unique request\n * id and the request IDs are a sequential increasing count.\n *\n * @return {string|number|undefined} The request ID.\n */\nChannelRequest.prototype.getRequestId = function() {\n 'use strict';\n return this.rid_;\n};\n\n\n/**\n * Returns the data for a post, if this request is a post.\n *\n * @return {?string} The POST data provided by the request initiator.\n */\nChannelRequest.prototype.getPostData = function() {\n 'use strict';\n return this.postData_;\n};\n\n\n/**\n * Returns the XhrIo request object.\n *\n * @return {?goog.net.XhrIo} Any XhrIo request created for this object.\n */\nChannelRequest.prototype.getXhr = function() {\n 'use strict';\n return this.xmlHttp_;\n};\n\n\n/**\n * Returns the time that the request started, if it has started.\n *\n * @return {?number} The time the request started, as returned by Date.now().\n */\nChannelRequest.prototype.getRequestStartTime = function() {\n 'use strict';\n return this.requestStartTime_;\n};\n\n\n/**\n * Helper to call the callback's onRequestData, which catches any\n * exception.\n * @param {string} data The request data.\n * @private\n */\nChannelRequest.prototype.safeOnRequestData_ = function(data) {\n 'use strict';\n try {\n this.channel_.onRequestData(this, data);\n const stats = requestStats.ServerReachability;\n requestStats.notifyServerReachabilityEvent(stats.BACK_CHANNEL_ACTIVITY);\n } catch (e) {\n // Dump debug info, but keep going without closing the channel.\n this.channelDebug_.dumpException(e, 'Error in httprequest callback');\n }\n};\n\n\n/**\n * Convenience factory method.\n *\n * @param {Channel} channel The channel object that owns this request.\n * @param {WebChannelDebug} channelDebug A WebChannelDebug to use for logging.\n * @param {string=} opt_sessionId The session id for the channel.\n * @param {string|number=} opt_requestId The request id for this request.\n * @param {number=} opt_retryId The retry id for this request.\n * @return {!ChannelRequest} The created channel request.\n */\nChannelRequest.createChannelRequest = function(\n channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId) {\n 'use strict';\n return new ChannelRequest(\n channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId);\n};\n}); // goog.scope\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview A single module to define user-agent specific environment\n * details.\n *\n */\n\ngoog.module('goog.labs.net.webChannel.environment');\n\ngoog.module.declareLegacyNamespace();\n\nvar userAgent = goog.require('goog.userAgent');\n\n\n/**\n * The default polling interval in millis for Edge.\n *\n * Currently on edge, new-chunk events may be not be fired (at all) if a new\n * chunk arrives within 50ms following the previous chunk. This may be fixed\n * in future, which requires changes to the whatwg spec too.\n *\n * @private @const {number}\n */\nvar EDGE_POLLING_INTERVAL_ = 125;\n\n\n/**\n * History:\n *\n * IE11 is still using Trident, the traditional engine for IE.\n * Edge is using EdgeHTML, a fork of Trident. We are seeing the same issue\n * on IE-11 (reported in 2017), so treat IE the same as Edge for now.\n *\n * We used to do polling for Opera (only) with an 250ms interval, because Opera\n * only fires readyState == INTERACTIVE once. Opera switched to WebKit in 2013,\n * and then to Blink (chrome).\n *\n * TODO(user): check the raw UA string to keep polling for old, mobile operas\n * that may still be affected. For old Opera, double the polling interval\n * to 250ms.\n *\n * @return {boolean} True if polling is required with XHR.\n */\nexports.isPollingRequired = function() {\n return userAgent.EDGE_OR_IE;\n};\n\n\n/**\n * How often to poll (in MS) for changes to responseText in browsers that don't\n * fire onreadystatechange during incremental loading of the response body.\n *\n * @return {number|undefined} The polling interval (MS) for the current U-A;\n * or undefined if polling is not supposed to be enabled.\n */\nexports.getPollingInterval = function() {\n if (userAgent.EDGE_OR_IE) {\n return EDGE_POLLING_INTERVAL_;\n }\n\n return undefined;\n};\n\n\n/**\n * For Fetch/upload OT, make three requests against the server endpoint.\n * POST requests contain only dummy payload.\n *\n * https://developers.chrome.com/origintrials/#/view_trial/3524066708417413121\n *\n * 1) google.com token\n *\n * A329ozYiTjUmNz0Eh5wffNLiRjiVtFBptKBulP7UYXxKSuMVVhP3pVnlHnbrBg2ALEPd63boPZArHXg3+WlmagkAAAB/eyJvcmlnaW4iOiJodHRwczovL2dvb2dsZS5jb206NDQzIiwiZmVhdHVyZSI6IkZldGNoVXBsb2FkU3RyZWFtaW5nIiwiZXhwaXJ5IjoxNjA4OTIzMjA4LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlfQ==\n *\n * 2) googleapis.com token\n *\n * To be registered after 1) is deployed.\n *\n * https://developers.chrome.com/origintrials/#/trials\n *\n * This function is expected to be called from background during the handshake.\n * Exceptions will be logged by the caller.\n *\n * No stats or logs are collected on the client-side. To be disabled once the\n * OT is expired.\n *\n * @param {string} path The base URL path for the requests\n */\nexports.startOriginTrials = function(path) {\n // NE: may need check if path has already contains query params?\n\n // 1st req: path?ot=1\n // non-streaming upload request\n\n // 2nd req: path?ot=2\n // h2-only streaming upload request\n\n // 3rd req: path?ot=3\n // h1-allowed streaming upload request\n\n // Example calling a Chrome API:\n // goog.global.chrome.loadTimes().wasFetchedViaSpdy\n};", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Base WebChannel implementation.\n */\n\n\ngoog.provide('goog.labs.net.webChannel.WebChannelBase');\n\ngoog.require('goog.Uri');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.async.run');\ngoog.require('goog.json');\ngoog.require('goog.labs.net.webChannel.Channel');\ngoog.require('goog.labs.net.webChannel.ChannelRequest');\ngoog.require('goog.labs.net.webChannel.ConnectionState');\ngoog.require('goog.labs.net.webChannel.ForwardChannelRequestPool');\ngoog.require('goog.labs.net.webChannel.WebChannelDebug');\ngoog.require('goog.labs.net.webChannel.Wire');\ngoog.require('goog.labs.net.webChannel.WireV8');\ngoog.require('goog.labs.net.webChannel.environment');\ngoog.require('goog.labs.net.webChannel.netUtils');\ngoog.require('goog.labs.net.webChannel.requestStats');\ngoog.require('goog.net.FetchXmlHttpFactory');\ngoog.require('goog.net.WebChannel');\ngoog.require('goog.net.XhrIo');\ngoog.require('goog.net.XmlHttpFactory');\ngoog.require('goog.net.rpc.HttpCors');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.structs');\ngoog.requireType('goog.structs.Map');\n\ngoog.scope(function() {\n'use strict';\nconst WebChannel = goog.net.WebChannel;\nconst ChannelRequest = goog.labs.net.webChannel.ChannelRequest;\nconst ConnectionState = goog.labs.net.webChannel.ConnectionState;\nconst ForwardChannelRequestPool =\n goog.labs.net.webChannel.ForwardChannelRequestPool;\nconst WebChannelDebug = goog.labs.net.webChannel.WebChannelDebug;\nconst Wire = goog.labs.net.webChannel.Wire;\nconst WireV8 = goog.labs.net.webChannel.WireV8;\nconst environment = goog.labs.net.webChannel.environment;\nconst netUtils = goog.labs.net.webChannel.netUtils;\nconst requestStats = goog.labs.net.webChannel.requestStats;\n\nconst httpCors = goog.module.get('goog.net.rpc.HttpCors');\n\n/**\n * Gets an internal channel parameter in a type-safe way.\n *\n * @param {string} paramName the key of the parameter to fetch.\n * @param {!T} defaultValue the default value to return\n * @param {!goog.net.WebChannel.Options=} options Configuration for the\n * WebChannel instance.\n * @return {T}\n * @template T\n */\nfunction getInternalChannelParam(paramName, defaultValue, options) {\n if (!options || !options.internalChannelParams) {\n return defaultValue;\n }\n return /** @type {T} */ (options.internalChannelParams[paramName]) ||\n defaultValue;\n}\n\n/**\n * This WebChannel implementation is branched off goog.net.BrowserChannel\n * for now. Ongoing changes to goog.net.BrowserChannel will be back\n * ported to this implementation as needed.\n *\n * @param {!goog.net.WebChannel.Options=} opt_options Configuration for the\n * WebChannel instance.\n * @param {number=} opt_clientVersion An application-specific version number\n * that is sent to the server when connected.\n * @param {!ConnectionState=} opt_conn Previously determined connection\n * conditions.\n * @constructor\n * @struct\n * @implements {goog.labs.net.webChannel.Channel}\n */\ngoog.labs.net.webChannel.WebChannelBase = function(\n opt_options, opt_clientVersion, opt_conn) {\n 'use strict';\n /**\n * The client library version (capabilities).\n * @private {number}\n */\n this.clientVersion_ = opt_clientVersion || 0;\n\n /**\n * The server library version (capabilities).\n * @private {number}\n */\n this.serverVersion_ = 0;\n\n\n /**\n * An array of queued maps that need to be sent to the server.\n * @private {!Array<Wire.QueuedMap>}\n */\n this.outgoingMaps_ = [];\n\n /**\n * The channel debug used for logging\n * @private {!WebChannelDebug}\n */\n this.channelDebug_ = new WebChannelDebug();\n\n /**\n * Connectivity state.\n * @private {!ConnectionState}\n */\n this.connState_ = opt_conn || new ConnectionState();\n\n /**\n * Extra HTTP headers to add to all the requests sent to the server.\n * @private {?Object}\n */\n this.extraHeaders_ = null;\n\n /**\n * Extra HTTP headers to add to the init request(s) sent to the server.\n * @private {?Object}\n */\n this.initHeaders_ = null;\n\n /**\n * @private {?string} The URL param name to overwrite custom HTTP headers\n * to bypass CORS preflight.\n */\n this.httpHeadersOverwriteParam_ = null;\n\n /**\n * Extra parameters to add to all the requests sent to the server.\n * @private {?Object}\n */\n this.extraParams_ = null;\n\n /**\n * Parameter name for the http session id.\n * @private {?string}\n */\n this.httpSessionIdParam_ = null;\n\n /**\n * The http session id, to be sent with httpSessionIdParam_ with each\n * request after the initial handshake.\n * @private {?string}\n */\n this.httpSessionId_ = null;\n\n /**\n * The ChannelRequest object for the backchannel.\n * @private {?ChannelRequest}\n */\n this.backChannelRequest_ = null;\n\n /**\n * The relative path (in the context of the page hosting the browser channel)\n * for making requests to the server.\n * @private {?string}\n */\n this.path_ = null;\n\n /**\n * The absolute URI for the forwardchannel request.\n * @private {?goog.Uri}\n */\n this.forwardChannelUri_ = null;\n\n /**\n * The absolute URI for the backchannel request.\n * @private {?goog.Uri}\n */\n this.backChannelUri_ = null;\n\n /**\n * A subdomain prefix for using a subdomain in IE for the backchannel\n * requests.\n * @private {?string}\n */\n this.hostPrefix_ = null;\n\n /**\n * Whether we allow the use of a subdomain in IE for the backchannel requests.\n * @private {boolean}\n */\n this.allowHostPrefix_ = true;\n\n /**\n * The next id to use for the RID (request identifier) parameter. This\n * identifier uniquely identifies the forward channel request.\n * @private {number}\n */\n this.nextRid_ = 0;\n\n /**\n * The id to use for the next outgoing map. This identifier uniquely\n * identifies a sent map.\n * @private {number}\n */\n this.nextMapId_ = 0;\n\n /**\n * Whether to fail forward-channel requests after one try or a few tries.\n * @private {boolean}\n */\n this.failFast_ = getInternalChannelParam('failFast', false, opt_options);\n\n /**\n * The handler that receive callbacks for state changes and data.\n * @private {?goog.labs.net.webChannel.WebChannelBase.Handler}\n */\n this.handler_ = null;\n\n /**\n * Timer identifier for asynchronously making a forward channel request.\n * This is set to true if the func is scheduled with async.run, which\n * is equivalent to setTimeout(0).\n * @private {?number|?boolean}\n */\n this.forwardChannelTimerId_ = null;\n\n /**\n * Timer identifier for asynchronously making a back channel request.\n * @private {?number}\n */\n this.backChannelTimerId_ = null;\n\n /**\n * Timer identifier for the timer that waits for us to retry the backchannel\n * in the case where it is dead and no longer receiving data.\n * @private {?number}\n */\n this.deadBackChannelTimerId_ = null;\n\n /**\n * Whether the client's network conditions can support streamed responses.\n * @private {?boolean}\n */\n this.enableStreaming_ = null;\n\n /**\n * Whether streaming mode is allowed. In certain debugging situations, it's\n * useful to disable this.\n * @private {boolean}\n */\n this.allowStreamingMode_ = true;\n\n /**\n * The array identifier of the last array received from the server for the\n * backchannel request.\n * @private {number}\n */\n this.lastArrayId_ = -1;\n\n /**\n * The array id of the last array sent by the server that we know about.\n * @private {number}\n */\n this.lastPostResponseArrayId_ = -1;\n\n /**\n * The last status code received.\n * @private {number}\n */\n this.lastStatusCode_ = -1;\n\n /**\n * Number of times we have retried the current forward channel request.\n * @private {number}\n */\n this.forwardChannelRetryCount_ = 0;\n\n /**\n * Number of times in a row that we have retried the current back channel\n * request and received no data.\n * @private {number}\n */\n this.backChannelRetryCount_ = 0;\n\n /**\n * The attempt id for the current back channel request. Starts at 1 and\n * increments for each reconnect. The server uses this to log if our\n * connection is flaky or not.\n * @private {number}\n */\n this.backChannelAttemptId_ = 0;\n\n /**\n * The base part of the time before firing next retry request. Default is 5\n * seconds. Note that a random delay is added (see {@link retryDelaySeedMs_})\n * for all retries, and linear backoff is applied to the sum for subsequent\n * retries.\n * @private {number}\n */\n this.baseRetryDelayMs_ =\n getInternalChannelParam('baseRetryDelayMs', 5 * 1000, opt_options);\n\n /**\n * A random time between 0 and this number of MS is added to the\n * {@link baseRetryDelayMs_}. Default is 10 seconds.\n * @private {number}\n */\n this.retryDelaySeedMs_ =\n getInternalChannelParam('retryDelaySeedMs', 10 * 1000, opt_options);\n\n /**\n * Maximum number of attempts to connect to the server for forward channel\n * requests. Defaults to 2.\n * @private {number}\n */\n this.forwardChannelMaxRetries_ =\n getInternalChannelParam('forwardChannelMaxRetries', 2, opt_options);\n\n /**\n * The timeout in milliseconds for a forward channel request. Defaults to 20\n * seconds. Note that part of this timeout can be randomized.\n * @private {number}\n */\n this.forwardChannelRequestTimeoutMs_ = getInternalChannelParam(\n 'forwardChannelRequestTimeoutMs', 20 * 1000, opt_options);\n\n /**\n * The custom factory used to create XMLHttpRequest objects.\n * @private {!goog.net.XmlHttpFactory | undefined}\n */\n this.xmlHttpFactory_ =\n (opt_options && opt_options.xmlHttpFactory) || undefined;\n\n /**\n * Whether or not this channel uses WHATWG Fetch/streams.\n * @private {boolean}\n */\n this.usesFetchStreams_ =\n (opt_options && opt_options.useFetchStreams) || false;\n\n /**\n * The timeout in milliseconds for a back channel request. Defaults to using\n * the timeout configured in ChannelRequest (45s). If server-side\n * keepaliveInterval is known to the client, set the backchannel request\n * timeout to 1.5 * keepaliveInterval (ms).\n *\n * @private {number|undefined}\n */\n this.backChannelRequestTimeoutMs_ = undefined;\n\n /**\n * A throttle time in ms for readystatechange events for the backchannel.\n * Useful for throttling when ready state is INTERACTIVE (partial data).\n *\n * This throttle is useful if the server sends large data chunks down the\n * backchannel. It prevents examining XHR partial data on every readystate\n * change event. This is useful because large chunks can trigger hundreds\n * of readystatechange events, each of which takes ~5ms or so to handle,\n * in turn making the UI unresponsive for a significant period.\n *\n * If set to zero no throttle is used.\n * @private {number}\n */\n this.readyStateChangeThrottleMs_ = 0;\n\n /**\n * Whether cross origin requests are supported for the channel.\n *\n * See {@link goog.net.XhrIo#setWithCredentials}.\n * @private {boolean}\n */\n this.supportsCrossDomainXhrs_ =\n (opt_options && opt_options.supportsCrossDomainXhr) || false;\n\n /**\n * The current session id.\n * @private {string}\n */\n this.sid_ = '';\n\n /**\n * The current ChannelRequest pool for the forward channel.\n * @private {!ForwardChannelRequestPool}\n */\n this.forwardChannelRequestPool_ = new ForwardChannelRequestPool(\n opt_options && opt_options.concurrentRequestLimit);\n\n /**\n * The V8 codec.\n * @private {!WireV8}\n */\n this.wireCodec_ = new WireV8();\n\n /**\n * Whether to turn on the fast handshake behavior.\n *\n * @private {boolean}\n */\n this.fastHandshake_ = (opt_options && opt_options.fastHandshake) || false;\n\n /**\n * Whether to signal to the server to enable blocking handshake.\n *\n * @private {boolean}\n */\n this.blockingHandshake_ =\n (opt_options && opt_options.blockingHandshake) || false;\n\n\n if (opt_options && opt_options.disableRedact) {\n this.channelDebug_.disableRedact();\n }\n\n if (opt_options && opt_options.forceLongPolling) {\n this.allowStreamingMode_ = false;\n }\n\n /**\n * Whether to detect buffering proxies.\n *\n * fastHandshake + detectBufferingProxy are yet to be implemented.\n *\n * @private {boolean}\n */\n this.detectBufferingProxy_ =\n (!this.fastHandshake_ && this.allowStreamingMode_ && opt_options &&\n opt_options.detectBufferingProxy) ||\n false;\n\n /**\n * Callback when all the pending client-sent messages have been flushed.\n *\n * @private {function()|undefined}\n */\n this.forwardChannelFlushedCallback_ = undefined;\n\n /**\n * TODO(user): move all backchannel states to its own class similar to\n * forwardchannelrequestpool.js and log more stats.\n *\n * The estimated handshake RTT (ms) as measured from when the handshake\n * request is sent and when the handshake response headers are received.\n * If the value is 0, the RTT is unknown.\n *\n * @private {number}\n */\n this.handshakeRttMs_ = 0;\n\n /**\n * If BP detection is done or still in progress.\n * Should only be checked when detectBufferingProxy is turned on.\n * @private {boolean}\n */\n this.bpDetectionDone_ = false;\n\n /**\n * The timer for detecting buffering proxy. This needs be reset with each\n * backchannel request. If this is not null, bpDetectionDone_ == false.\n * @private {?number}\n */\n this.bpDetectionTimerId_ = null;\n\n /***\n * Whether to attempt Chrome Origin Trials as part of the handshake.\n * @private {boolean}\n */\n this.enableOriginTrials_ =\n !opt_options || opt_options.enableOriginTrials !== false;\n};\n\nconst WebChannelBase = goog.labs.net.webChannel.WebChannelBase;\n\n\n/**\n * The channel version that we negotiated with the server for this session.\n * Starts out as the version we request, and then is changed to the negotiated\n * version after the initial open.\n * @private {number}\n */\nWebChannelBase.prototype.channelVersion_ = Wire.LATEST_CHANNEL_VERSION;\n\n\n/**\n * Enum type for the channel state machine.\n * @enum {number}\n */\nWebChannelBase.State = {\n /** The channel is closed. */\n CLOSED: 0,\n\n /** The channel has been initialized but hasn't yet initiated a connection. */\n INIT: 1,\n\n /** The channel is in the process of opening a connection to the server. */\n OPENING: 2,\n\n /** The channel is open. */\n OPENED: 3\n};\n\n\n/**\n * The current state of the WebChannel.\n * @private {!WebChannelBase.State}\n */\nWebChannelBase.prototype.state_ = WebChannelBase.State.INIT;\n\n\n/**\n * The timeout in milliseconds for a forward channel request.\n * @type {number}\n */\nWebChannelBase.FORWARD_CHANNEL_RETRY_TIMEOUT = 20 * 1000;\n\n\n/**\n * Maximum number of attempts to connect to the server for back channel\n * requests.\n * @type {number}\n */\nWebChannelBase.BACK_CHANNEL_MAX_RETRIES = 3;\n\n\n/**\n * A number in MS of how long we guess the maxmium amount of time a round trip\n * to the server should take. In the future this could be substituted with a\n * real measurement of the RTT.\n * @type {number}\n */\nWebChannelBase.RTT_ESTIMATE = 3 * 1000;\n\n\n/**\n * When retrying for an inactive channel, we will multiply the total delay by\n * this number.\n * @type {number}\n */\nWebChannelBase.INACTIVE_CHANNEL_RETRY_FACTOR = 2;\n\n\n/**\n * Enum type for identifying an error.\n * @enum {number}\n */\nWebChannelBase.Error = {\n /** Value that indicates no error has occurred. */\n OK: 0,\n\n /** An error due to a request failing. */\n REQUEST_FAILED: 2,\n\n /** An error due to the user being logged out. */\n LOGGED_OUT: 4,\n\n /** An error due to server response which contains no data. */\n NO_DATA: 5,\n\n /** An error due to a server response indicating an unknown session id */\n UNKNOWN_SESSION_ID: 6,\n\n /** An error due to a server response requesting to stop the channel. */\n STOP: 7,\n\n /** A general network error. */\n NETWORK: 8,\n\n /** An error due to bad data being returned from the server. */\n BAD_DATA: 10,\n\n /** An error due to a response that is not parsable. */\n BAD_RESPONSE: 11\n};\n\n\n/**\n * Internal enum type for the two channel types.\n * @enum {number}\n * @private\n */\nWebChannelBase.ChannelType_ = {\n FORWARD_CHANNEL: 1,\n\n BACK_CHANNEL: 2\n};\n\n\n/**\n * The maximum number of maps that can be sent in one POST. Should match\n * MAX_MAPS_PER_REQUEST on the server code.\n * @type {number}\n * @private\n */\nWebChannelBase.MAX_MAPS_PER_REQUEST_ = 1000;\n\n\n/**\n * The maximum number of utf-8 chars that can be sent in one GET to enable 0-RTT\n * handshake.\n *\n * @const @private {number}\n */\nWebChannelBase.MAX_CHARS_PER_GET_ = 4 * 1024;\n\n\n/**\n * A guess at a cutoff at which to no longer assume the backchannel is dead\n * when we are slow to receive data. Number in bytes.\n *\n * Assumption: The worst bandwidth we work on is 50 kilobits/sec\n * 50kbits/sec * (1 byte / 8 bits) * 6 sec dead backchannel timeout\n * @type {number}\n */\nWebChannelBase.OUTSTANDING_DATA_BACKCHANNEL_RETRY_CUTOFF = 37500;\n\n\n/**\n * @return {number} The server version or 0 if undefined\n */\nWebChannelBase.prototype.getServerVersion = function() {\n 'use strict';\n return this.serverVersion_;\n};\n\n\n/**\n * @return {!ForwardChannelRequestPool} The forward channel request pool.\n */\nWebChannelBase.prototype.getForwardChannelRequestPool = function() {\n 'use strict';\n return this.forwardChannelRequestPool_;\n};\n\n\n/**\n * @return {!Object} The codec object.\n */\nWebChannelBase.prototype.getWireCodec = function() {\n 'use strict';\n return this.wireCodec_;\n};\n\n\n/**\n * Returns the logger.\n *\n * @return {!WebChannelDebug} The channel debug object.\n */\nWebChannelBase.prototype.getChannelDebug = function() {\n 'use strict';\n return this.channelDebug_;\n};\n\n\n/**\n * Sets the logger.\n *\n * @param {!WebChannelDebug} channelDebug The channel debug object.\n */\nWebChannelBase.prototype.setChannelDebug = function(channelDebug) {\n 'use strict';\n this.channelDebug_ = channelDebug;\n};\n\n\n/**\n * Starts the channel. This initiates connections to the server.\n *\n * @param {string} channelPath The path for the channel connection.\n * @param {!Object=} opt_extraParams Extra parameter keys and values to add to\n * the requests.\n * @param {string=} opt_oldSessionId Session ID from a previous session.\n * @param {number=} opt_oldArrayId The last array ID from a previous session.\n */\nWebChannelBase.prototype.connect = function(\n channelPath, opt_extraParams, opt_oldSessionId, opt_oldArrayId) {\n 'use strict';\n this.channelDebug_.debug('connect()');\n\n this.startOriginTrials_(channelPath);\n\n requestStats.notifyStatEvent(requestStats.Stat.CONNECT_ATTEMPT);\n\n this.path_ = channelPath;\n this.extraParams_ = opt_extraParams || {};\n\n // Attach parameters about the previous session if reconnecting.\n if (opt_oldSessionId && opt_oldArrayId !== undefined) {\n this.extraParams_['OSID'] = opt_oldSessionId;\n this.extraParams_['OAID'] = opt_oldArrayId;\n }\n\n this.enableStreaming_ = this.allowStreamingMode_;\n this.connectChannel_();\n};\n\n\n/**\n * Disconnects and closes the channel.\n */\nWebChannelBase.prototype.disconnect = function() {\n 'use strict';\n this.channelDebug_.debug('disconnect()');\n\n this.cancelRequests_();\n\n if (this.state_ == WebChannelBase.State.OPENED) {\n const rid = this.nextRid_++;\n const uri = this.forwardChannelUri_.clone();\n uri.setParameterValue('SID', this.sid_);\n uri.setParameterValue('RID', rid);\n uri.setParameterValue('TYPE', 'terminate');\n\n // Add the reconnect parameters.\n this.addAdditionalParams_(uri);\n\n const request = ChannelRequest.createChannelRequest(\n this, this.channelDebug_, this.sid_, rid);\n request.sendCloseRequest(uri);\n }\n\n this.onClose_();\n};\n\n\n/**\n * Returns the session id of the channel. Only available after the\n * channel has been opened.\n * @return {string} Session ID.\n */\nWebChannelBase.prototype.getSessionId = function() {\n 'use strict';\n return this.sid_;\n};\n\n\n/**\n * Starts the connection.\n * @private\n */\nWebChannelBase.prototype.connectChannel_ = function() {\n 'use strict';\n this.channelDebug_.debug('connectChannel_()');\n this.ensureInState_(WebChannelBase.State.INIT, WebChannelBase.State.CLOSED);\n this.forwardChannelUri_ =\n this.getForwardChannelUri(/** @type {string} */ (this.path_));\n this.ensureForwardChannel_();\n};\n\n\n/**\n * Starts the Origin Trials.\n * @param {string} channelPath The path for the channel connection.\n * @private\n */\nWebChannelBase.prototype.startOriginTrials_ = function(channelPath) {\n 'use strict';\n\n if (!this.enableOriginTrials_) {\n return;\n }\n\n this.channelDebug_.info('Origin Trials enabled.');\n goog.async.run(goog.bind(this.runOriginTrials_, this, channelPath));\n};\n\n\n/**\n * Runs the Origin Trials.\n * @param {string} channelPath The path for the channel connection.\n * @private\n */\nWebChannelBase.prototype.runOriginTrials_ = function(channelPath) {\n 'use strict';\n\n try {\n environment.startOriginTrials(channelPath);\n this.channelDebug_.info('Origin Trials invoked: ' + channelPath);\n } catch (e) {\n this.channelDebug_.dumpException(e, 'Error in running origin trials');\n }\n};\n\n\n/**\n * Cancels backchannel request.\n * @private\n */\nWebChannelBase.prototype.cancelBackChannelRequest_ = function() {\n 'use strict';\n if (this.backChannelRequest_) {\n this.clearBpDetectionTimer_();\n this.backChannelRequest_.cancel();\n this.backChannelRequest_ = null;\n }\n};\n\n\n/**\n * Cancels all outstanding requests.\n * @private\n */\nWebChannelBase.prototype.cancelRequests_ = function() {\n 'use strict';\n this.cancelBackChannelRequest_();\n\n if (this.backChannelTimerId_) {\n goog.global.clearTimeout(this.backChannelTimerId_);\n this.backChannelTimerId_ = null;\n }\n\n this.clearDeadBackchannelTimer_();\n\n this.forwardChannelRequestPool_.cancel();\n\n if (this.forwardChannelTimerId_) {\n this.clearForwardChannelTimer_();\n }\n};\n\n\n/**\n * Clears the forward channel timer.\n * @private\n */\nWebChannelBase.prototype.clearForwardChannelTimer_ = function() {\n 'use strict';\n if (typeof this.forwardChannelTimerId_ === 'number') {\n goog.global.clearTimeout(this.forwardChannelTimerId_);\n }\n\n this.forwardChannelTimerId_ = null;\n};\n\n\n/**\n * Returns the extra HTTP headers to add to all the requests sent to the server.\n *\n * @return {Object} The HTTP headers, or null.\n */\nWebChannelBase.prototype.getExtraHeaders = function() {\n 'use strict';\n return this.extraHeaders_;\n};\n\n\n/**\n * Sets extra HTTP headers to add to all the requests sent to the server.\n *\n * @param {Object} extraHeaders The HTTP headers, or null.\n */\nWebChannelBase.prototype.setExtraHeaders = function(extraHeaders) {\n 'use strict';\n this.extraHeaders_ = extraHeaders;\n};\n\n\n/**\n * Returns the extra HTTP headers to add to the init requests\n * sent to the server.\n *\n * @return {Object} The HTTP headers, or null.\n */\nWebChannelBase.prototype.getInitHeaders = function() {\n 'use strict';\n return this.initHeaders_;\n};\n\n\n/**\n * Sets extra HTTP headers to add to the init requests sent to the server.\n *\n * @param {Object} initHeaders The HTTP headers, or null.\n */\nWebChannelBase.prototype.setInitHeaders = function(initHeaders) {\n 'use strict';\n this.initHeaders_ = initHeaders;\n};\n\n\n/**\n * Sets the URL param name to overwrite custom HTTP headers.\n *\n * @param {string} httpHeadersOverwriteParam The URL param name.\n */\nWebChannelBase.prototype.setHttpHeadersOverwriteParam = function(\n httpHeadersOverwriteParam) {\n 'use strict';\n this.httpHeadersOverwriteParam_ = httpHeadersOverwriteParam;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.setHttpSessionIdParam = function(httpSessionIdParam) {\n 'use strict';\n this.httpSessionIdParam_ = httpSessionIdParam;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getHttpSessionIdParam = function() {\n 'use strict';\n return this.httpSessionIdParam_;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.setHttpSessionId = function(httpSessionId) {\n 'use strict';\n this.httpSessionId_ = httpSessionId;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getHttpSessionId = function() {\n 'use strict';\n return this.httpSessionId_;\n};\n\n\n/**\n * Sets the throttle for handling onreadystatechange events for the request.\n *\n * @param {number} throttle The throttle in ms. A value of zero indicates\n * no throttle.\n */\nWebChannelBase.prototype.setReadyStateChangeThrottle = function(throttle) {\n 'use strict';\n this.readyStateChangeThrottleMs_ = throttle;\n};\n\n\n/**\n * Sets whether cross origin requests are supported for the channel.\n *\n * Setting this allows the creation of requests to secondary domains and\n * sends XHRs with the CORS withCredentials bit set to true.\n *\n * In order for cross-origin requests to work, the server will also need to set\n * CORS response headers as per:\n * https://developer.mozilla.org/en-US/docs/HTTP_access_control\n *\n * See {@link goog.net.XhrIo#setWithCredentials}.\n * @param {boolean} supportCrossDomain Whether cross domain XHRs are supported.\n */\nWebChannelBase.prototype.setSupportsCrossDomainXhrs = function(\n supportCrossDomain) {\n 'use strict';\n this.supportsCrossDomainXhrs_ = supportCrossDomain;\n};\n\n\n/**\n * Returns the handler used for channel callback events.\n *\n * @return {WebChannelBase.Handler} The handler.\n */\nWebChannelBase.prototype.getHandler = function() {\n 'use strict';\n return this.handler_;\n};\n\n\n/**\n * Sets the handler used for channel callback events.\n * @param {WebChannelBase.Handler} handler The handler to set.\n */\nWebChannelBase.prototype.setHandler = function(handler) {\n 'use strict';\n this.handler_ = handler;\n};\n\n\n/**\n * Returns whether the channel allows the use of a subdomain. There may be\n * cases where this isn't allowed.\n * @return {boolean} Whether a host prefix is allowed.\n */\nWebChannelBase.prototype.getAllowHostPrefix = function() {\n 'use strict';\n return this.allowHostPrefix_;\n};\n\n\n/**\n * Sets whether the channel allows the use of a subdomain. There may be cases\n * where this isn't allowed, for example, logging in with troutboard where\n * using a subdomain causes Apache to force the user to authenticate twice.\n * @param {boolean} allowHostPrefix Whether a host prefix is allowed.\n */\nWebChannelBase.prototype.setAllowHostPrefix = function(allowHostPrefix) {\n 'use strict';\n this.allowHostPrefix_ = allowHostPrefix;\n};\n\n\n/**\n * Returns whether the channel is buffered or not. This may be\n * queried in the WebChannelBase.okToMakeRequest() callback.\n *\n * @return {boolean} Whether the channel is buffered.\n */\nWebChannelBase.prototype.isBuffered = function() {\n 'use strict';\n return !this.enableStreaming_;\n};\n\n\n/**\n * Returns whether streaming mode is allowed. In certain debugging situations,\n * it's useful for the application to have a way to disable streaming mode for a\n * user.\n\n * @return {boolean} Whether streaming mode is allowed.\n */\nWebChannelBase.prototype.getAllowStreamingMode = function() {\n 'use strict';\n return this.allowStreamingMode_;\n};\n\n\n/**\n * Sets whether streaming mode is allowed. In certain debugging situations, it's\n * useful for the application to have a way to disable streaming mode for a\n * user.\n * @param {boolean} allowStreamingMode Whether streaming mode is allowed.\n */\nWebChannelBase.prototype.setAllowStreamingMode = function(allowStreamingMode) {\n 'use strict';\n this.allowStreamingMode_ = allowStreamingMode;\n};\n\n\n/**\n * Sends a request to the server. The format of the request is a Map data\n * structure of key/value pairs. These maps are then encoded in a format\n * suitable for the wire and then reconstituted as a Map data structure that\n * the server can process.\n * @param {!Object|!goog.structs.Map} map The map to send.\n * @param {!Object=} opt_context The context associated with the map.\n */\nWebChannelBase.prototype.sendMap = function(map, opt_context) {\n 'use strict';\n goog.asserts.assert(\n this.state_ != WebChannelBase.State.CLOSED,\n 'Invalid operation: sending map when state is closed');\n\n // We can only send 1000 maps per POST, but typically we should never have\n // that much to send, so warn if we exceed that (we still send all the maps).\n if (this.outgoingMaps_.length == WebChannelBase.MAX_MAPS_PER_REQUEST_) {\n // severe() is temporary so that we get these uploaded and can figure out\n // what's causing them. Afterwards can change to warning().\n this.channelDebug_.severe(function() {\n 'use strict';\n return 'Already have ' + WebChannelBase.MAX_MAPS_PER_REQUEST_ +\n ' queued maps upon queueing ' + goog.json.serialize(map);\n });\n }\n\n this.outgoingMaps_.push(\n new Wire.QueuedMap(this.nextMapId_++, map, opt_context));\n\n // Messages need be buffered during OPENING to avoid server-side race\n if (this.state_ == WebChannelBase.State.OPENED) {\n this.ensureForwardChannel_();\n }\n};\n\n\n/**\n * When set to true, this changes the behavior of the forward channel so it\n * will not retry requests; it will fail after one network failure, and if\n * there was already one network failure, the request will fail immediately.\n * @param {boolean} failFast Whether or not to fail fast.\n */\nWebChannelBase.prototype.setFailFast = function(failFast) {\n 'use strict';\n this.failFast_ = failFast;\n this.channelDebug_.info('setFailFast: ' + failFast);\n if ((this.forwardChannelRequestPool_.hasPendingRequest() ||\n this.forwardChannelTimerId_) &&\n this.forwardChannelRetryCount_ > this.getForwardChannelMaxRetries()) {\n const self = this;\n this.channelDebug_.info(function() {\n 'use strict';\n return 'Retry count ' + self.forwardChannelRetryCount_ +\n ' > new maxRetries ' + self.getForwardChannelMaxRetries() +\n '. Fail immediately!';\n });\n\n if (!this.forwardChannelRequestPool_.forceComplete(\n goog.bind(this.onRequestComplete, this))) {\n // i.e., this.forwardChannelTimerId_\n this.clearForwardChannelTimer_();\n // The error code from the last failed request is gone, so just use a\n // generic one.\n this.signalError_(WebChannelBase.Error.REQUEST_FAILED);\n }\n }\n};\n\n\n/**\n * @return {number} The max number of forward-channel retries, which will be 0\n * in fail-fast mode.\n */\nWebChannelBase.prototype.getForwardChannelMaxRetries = function() {\n 'use strict';\n return this.failFast_ ? 0 : this.forwardChannelMaxRetries_;\n};\n\n\n/**\n * Sets the maximum number of attempts to connect to the server for forward\n * channel requests.\n * @param {number} retries The maximum number of attempts.\n */\nWebChannelBase.prototype.setForwardChannelMaxRetries = function(retries) {\n 'use strict';\n this.forwardChannelMaxRetries_ = retries;\n};\n\n\n/**\n * Sets the timeout for a forward channel request.\n * @param {number} timeoutMs The timeout in milliseconds.\n */\nWebChannelBase.prototype.setForwardChannelRequestTimeout = function(timeoutMs) {\n 'use strict';\n this.forwardChannelRequestTimeoutMs_ = timeoutMs;\n};\n\n\n/**\n * @return {number} The max number of back-channel retries, which is a constant.\n */\nWebChannelBase.prototype.getBackChannelMaxRetries = function() {\n 'use strict';\n // Back-channel retries is a constant.\n return WebChannelBase.BACK_CHANNEL_MAX_RETRIES;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.isClosed = function() {\n 'use strict';\n return this.state_ == WebChannelBase.State.CLOSED;\n};\n\n\n/**\n * Returns the channel state.\n * @return {WebChannelBase.State} The current state of the channel.\n */\nWebChannelBase.prototype.getState = function() {\n 'use strict';\n return this.state_;\n};\n\n\n/**\n * Return the last status code received for a request.\n * @return {number} The last status code received for a request.\n */\nWebChannelBase.prototype.getLastStatusCode = function() {\n 'use strict';\n return this.lastStatusCode_;\n};\n\n\n/**\n * @return {number} The last array id received.\n */\nWebChannelBase.prototype.getLastArrayId = function() {\n 'use strict';\n return this.lastArrayId_;\n};\n\n\n/**\n * Returns whether there are outstanding requests servicing the channel.\n * @return {boolean} true if there are outstanding requests.\n */\nWebChannelBase.prototype.hasOutstandingRequests = function() {\n 'use strict';\n return this.getOutstandingRequests_() != 0;\n};\n\n\n/**\n * Returns the number of outstanding requests.\n * @return {number} The number of outstanding requests to the server.\n * @private\n */\nWebChannelBase.prototype.getOutstandingRequests_ = function() {\n 'use strict';\n let count = 0;\n if (this.backChannelRequest_) {\n count++;\n }\n count += this.forwardChannelRequestPool_.getRequestCount();\n return count;\n};\n\n\n/**\n * Ensures that a forward channel request is scheduled.\n * @private\n */\nWebChannelBase.prototype.ensureForwardChannel_ = function() {\n 'use strict';\n if (this.forwardChannelRequestPool_.isFull()) {\n // enough connection in process - no need to start a new request\n return;\n }\n\n if (this.forwardChannelTimerId_) {\n // no need to start a new request - one is already scheduled\n return;\n }\n\n // Use async.run instead of setTimeout(0) to avoid the 1s message delay\n // from chrome/firefox background tabs\n this.forwardChannelTimerId_ = true;\n goog.async.run(this.onStartForwardChannelTimer_, this);\n\n this.forwardChannelRetryCount_ = 0;\n};\n\n\n/**\n * Schedules a forward-channel retry for the specified request, unless the max\n * retries has been reached.\n * @param {!ChannelRequest} request The failed request to retry.\n * @return {boolean} true iff a retry was scheduled.\n * @private\n */\nWebChannelBase.prototype.maybeRetryForwardChannel_ = function(request) {\n 'use strict';\n if (this.forwardChannelRequestPool_.getRequestCount() >=\n this.forwardChannelRequestPool_.getMaxSize() -\n (this.forwardChannelTimerId_ ? 1 : 0)) {\n // Should be impossible to be called in this state.\n this.channelDebug_.severe('Unexpected retry request is scheduled.');\n return false;\n }\n\n if (this.forwardChannelTimerId_) {\n this.channelDebug_.debug(\n 'Use the retry request that is already scheduled.');\n this.outgoingMaps_ =\n request.getPendingMessages().concat(this.outgoingMaps_);\n return true;\n }\n\n // No retry for open_() and fail-fast\n if (this.state_ == WebChannelBase.State.INIT ||\n this.state_ == WebChannelBase.State.OPENING ||\n (this.forwardChannelRetryCount_ >= this.getForwardChannelMaxRetries())) {\n return false;\n }\n\n this.channelDebug_.debug('Going to retry POST');\n\n this.forwardChannelTimerId_ = requestStats.setTimeout(\n goog.bind(this.onStartForwardChannelTimer_, this, request),\n this.getRetryTime_(this.forwardChannelRetryCount_));\n this.forwardChannelRetryCount_++;\n return true;\n};\n\n\n/**\n * Timer callback for ensureForwardChannel\n * @param {ChannelRequest=} opt_retryRequest A failed request\n * to retry.\n * @private\n */\nWebChannelBase.prototype.onStartForwardChannelTimer_ = function(\n opt_retryRequest) {\n 'use strict';\n // null is possible if scheduled with async.run\n if (this.forwardChannelTimerId_) {\n this.forwardChannelTimerId_ = null;\n this.startForwardChannel_(opt_retryRequest);\n }\n};\n\n\n/**\n * Begins a new forward channel operation to the server.\n * @param {ChannelRequest=} opt_retryRequest A failed request to retry.\n * @private\n */\nWebChannelBase.prototype.startForwardChannel_ = function(opt_retryRequest) {\n 'use strict';\n this.channelDebug_.debug('startForwardChannel_');\n if (!this.okToMakeRequest_()) {\n return; // channel is cancelled\n } else if (this.state_ == WebChannelBase.State.INIT) {\n if (opt_retryRequest) {\n this.channelDebug_.severe('Not supposed to retry the open');\n return;\n }\n this.open_();\n this.state_ = WebChannelBase.State.OPENING;\n } else if (this.state_ == WebChannelBase.State.OPENED) {\n if (opt_retryRequest) {\n this.makeForwardChannelRequest_(opt_retryRequest);\n return;\n }\n\n if (this.outgoingMaps_.length == 0) {\n this.channelDebug_.debug(\n 'startForwardChannel_ returned: ' +\n 'nothing to send');\n // no need to start a new forward channel request\n return;\n }\n\n if (this.forwardChannelRequestPool_.isFull()) {\n // Should be impossible to be called in this state.\n this.channelDebug_.severe(\n 'startForwardChannel_ returned: ' +\n 'connection already in progress');\n return;\n }\n\n this.makeForwardChannelRequest_();\n this.channelDebug_.debug('startForwardChannel_ finished, sent request');\n }\n};\n\n\n/**\n * Establishes a new channel session with the server.\n * @private\n */\nWebChannelBase.prototype.open_ = function() {\n 'use strict';\n this.channelDebug_.debug('open_()');\n this.nextRid_ = Math.floor(Math.random() * 100000);\n\n const rid = this.nextRid_++;\n const request =\n ChannelRequest.createChannelRequest(this, this.channelDebug_, '', rid);\n\n // mix the init headers\n let extraHeaders = this.extraHeaders_;\n if (this.initHeaders_) {\n if (extraHeaders) {\n extraHeaders = goog.object.clone(extraHeaders);\n goog.object.extend(extraHeaders, this.initHeaders_);\n } else {\n extraHeaders = this.initHeaders_;\n }\n }\n\n if (this.httpHeadersOverwriteParam_ === null) {\n request.setExtraHeaders(extraHeaders);\n }\n\n const requestText = this.dequeueOutgoingMaps_(\n request,\n this.fastHandshake_ ? this.getMaxNumMessagesForFastHandshake_() :\n WebChannelBase.MAX_MAPS_PER_REQUEST_);\n\n const uri = this.forwardChannelUri_.clone();\n uri.setParameterValue('RID', rid);\n\n if (this.clientVersion_ > 0) {\n uri.setParameterValue('CVER', this.clientVersion_);\n }\n\n // http-session-id to be generated as the response\n if (this.getHttpSessionIdParam()) {\n uri.setParameterValue(\n WebChannel.X_HTTP_SESSION_ID, this.getHttpSessionIdParam());\n }\n\n // Add the reconnect parameters.\n this.addAdditionalParams_(uri);\n\n if (this.httpHeadersOverwriteParam_ && extraHeaders) {\n httpCors.setHttpHeadersWithOverwriteParam(\n uri, this.httpHeadersOverwriteParam_, extraHeaders);\n }\n\n this.forwardChannelRequestPool_.addRequest(request);\n\n if (this.blockingHandshake_) {\n uri.setParameterValue('TYPE', 'init'); // default to blocking in future\n }\n\n // Check the option and use GET to enable QUIC 0-RTT\n if (this.fastHandshake_) {\n uri.setParameterValue('$req', requestText);\n\n // enable handshake upgrade\n uri.setParameterValue('SID', 'null');\n request.setDecodeInitialResponse();\n\n request.xmlHttpPost(uri, null, true); // Send as a GET\n } else {\n request.xmlHttpPost(uri, requestText, true);\n }\n};\n\n\n/**\n * @return {number} The number of raw JSON messages to be encoded\n * with the fast-handshake (GET) request, including zero. If messages are not\n * encoded as raw JSON data, return WebChannelBase.MAX_MAPS_PER_REQUEST_\n * @private\n */\nWebChannelBase.prototype.getMaxNumMessagesForFastHandshake_ = function() {\n 'use strict';\n let total = 0;\n for (let i = 0; i < this.outgoingMaps_.length; i++) {\n const map = this.outgoingMaps_[i];\n const size = map.getRawDataSize();\n if (size === undefined) {\n break;\n }\n total += size;\n\n if (total > WebChannelBase.MAX_CHARS_PER_GET_) {\n return i;\n }\n\n if (total === WebChannelBase.MAX_CHARS_PER_GET_ ||\n i === this.outgoingMaps_.length - 1) {\n return i + 1;\n }\n }\n\n return WebChannelBase.MAX_MAPS_PER_REQUEST_;\n};\n\n\n\n/**\n * Makes a forward channel request using XMLHTTP.\n * @param {!ChannelRequest=} opt_retryRequest A failed request to retry.\n * @private\n */\nWebChannelBase.prototype.makeForwardChannelRequest_ = function(\n opt_retryRequest) {\n 'use strict';\n let rid;\n if (opt_retryRequest) {\n rid = opt_retryRequest.getRequestId(); // Reuse the same RID for a retry\n } else {\n rid = this.nextRid_++;\n }\n\n const uri = this.forwardChannelUri_.clone();\n uri.setParameterValue('SID', this.sid_);\n uri.setParameterValue('RID', rid);\n uri.setParameterValue('AID', this.lastArrayId_);\n // Add the additional reconnect parameters.\n this.addAdditionalParams_(uri);\n\n if (this.httpHeadersOverwriteParam_ && this.extraHeaders_) {\n httpCors.setHttpHeadersWithOverwriteParam(\n uri, this.httpHeadersOverwriteParam_, this.extraHeaders_);\n }\n\n const request = ChannelRequest.createChannelRequest(\n this, this.channelDebug_, this.sid_, rid,\n this.forwardChannelRetryCount_ + 1);\n\n if (this.httpHeadersOverwriteParam_ === null) {\n request.setExtraHeaders(this.extraHeaders_);\n }\n\n let requestText;\n if (opt_retryRequest) {\n this.requeuePendingMaps_(opt_retryRequest);\n }\n requestText =\n this.dequeueOutgoingMaps_(request, WebChannelBase.MAX_MAPS_PER_REQUEST_);\n\n // Randomize from 50%-100% of the forward channel timeout to avoid\n // a big hit if servers happen to die at once.\n request.setTimeout(\n Math.round(this.forwardChannelRequestTimeoutMs_ * 0.50) +\n Math.round(this.forwardChannelRequestTimeoutMs_ * 0.50 * Math.random()));\n this.forwardChannelRequestPool_.addRequest(request);\n request.xmlHttpPost(uri, requestText, true);\n};\n\n\n/**\n * Adds the additional parameters from the handler to the given URI.\n * @param {!goog.Uri} uri The URI to add the parameters to.\n * @private\n */\nWebChannelBase.prototype.addAdditionalParams_ = function(uri) {\n 'use strict';\n // Add the additional reconnect parameters as needed.\n if (this.handler_) {\n const params = this.handler_.getAdditionalParams(this);\n if (params) {\n goog.structs.forEach(params, function(value, key, coll) {\n 'use strict';\n uri.setParameterValue(key, value);\n });\n }\n }\n};\n\n\n/**\n * Returns the request text from the outgoing maps and resets it.\n * @param {!ChannelRequest} request The new request for sending the messages.\n * @param {number} maxNum The maximum number of messages to be encoded\n * @return {string} The encoded request text created from all the currently\n * queued outgoing maps.\n * @private\n */\nWebChannelBase.prototype.dequeueOutgoingMaps_ = function(request, maxNum) {\n 'use strict';\n const count = Math.min(this.outgoingMaps_.length, maxNum);\n\n const badMapHandler = this.handler_ ?\n goog.bind(this.handler_.badMapError, this.handler_, this) :\n null;\n const result = this.wireCodec_.encodeMessageQueue(\n this.outgoingMaps_, count, badMapHandler);\n\n request.setPendingMessages(this.outgoingMaps_.splice(0, count));\n\n return result;\n};\n\n\n/**\n * Requeues unacknowledged sent arrays for retransmission in the next forward\n * channel request.\n * @param {!ChannelRequest} retryRequest A failed request to retry.\n * @private\n */\nWebChannelBase.prototype.requeuePendingMaps_ = function(retryRequest) {\n 'use strict';\n this.outgoingMaps_ =\n retryRequest.getPendingMessages().concat(this.outgoingMaps_);\n};\n\n\n/**\n * Ensures there is a backchannel request for receiving data from the server.\n * @private\n */\nWebChannelBase.prototype.ensureBackChannel_ = function() {\n 'use strict';\n if (this.backChannelRequest_) {\n // already have one\n return;\n }\n\n if (this.backChannelTimerId_) {\n // no need to start a new request - one is already scheduled\n return;\n }\n\n this.backChannelAttemptId_ = 1;\n\n // Use async.run instead of setTimeout(0) to avoid the 1s message delay\n // from chrome/firefox background tabs\n // backChannelTimerId_ stays unset, as with setTimeout(0)\n goog.async.run(this.onStartBackChannelTimer_, this);\n\n this.backChannelRetryCount_ = 0;\n};\n\n\n/**\n * Schedules a back-channel retry, unless the max retries has been reached.\n * @return {boolean} true iff a retry was scheduled.\n * @private\n */\nWebChannelBase.prototype.maybeRetryBackChannel_ = function() {\n 'use strict';\n if (this.backChannelRequest_ || this.backChannelTimerId_) {\n // Should be impossible to be called in this state.\n this.channelDebug_.severe('Request already in progress');\n return false;\n }\n\n if (this.backChannelRetryCount_ >= this.getBackChannelMaxRetries()) {\n return false;\n }\n\n this.channelDebug_.debug('Going to retry GET');\n\n this.backChannelAttemptId_++;\n this.backChannelTimerId_ = requestStats.setTimeout(\n goog.bind(this.onStartBackChannelTimer_, this),\n this.getRetryTime_(this.backChannelRetryCount_));\n this.backChannelRetryCount_++;\n return true;\n};\n\n\n/**\n * Timer callback for ensureBackChannel_.\n * @private\n */\nWebChannelBase.prototype.onStartBackChannelTimer_ = function() {\n 'use strict';\n this.backChannelTimerId_ = null;\n this.startBackChannel_();\n\n if (!this.detectBufferingProxy_) {\n return;\n }\n\n if (this.bpDetectionDone_) {\n return;\n }\n\n if (this.backChannelRequest_ == null || this.handshakeRttMs_ <= 0) {\n this.channelDebug_.warning(\n 'Skip bpDetectionTimerId_ ' + this.backChannelRequest_ + ' ' +\n this.handshakeRttMs_);\n return;\n }\n\n // This goes with each new request until bpDetectionDone_\n const bpDetectionTimeout = 2 * this.handshakeRttMs_;\n this.channelDebug_.info('BP detection timer enabled: ' + bpDetectionTimeout);\n\n this.bpDetectionTimerId_ = requestStats.setTimeout(\n goog.bind(this.onBpDetectionTimer_, this), bpDetectionTimeout);\n};\n\n\n/**\n * Timer callback for bpDetection.\n * @private\n */\nWebChannelBase.prototype.onBpDetectionTimer_ = function() {\n 'use strict';\n if (!this.bpDetectionTimerId_) {\n this.channelDebug_.warning('Invalid operation.');\n return;\n }\n\n this.bpDetectionTimerId_ = null;\n this.channelDebug_.info('BP detection timeout reached.');\n\n goog.asserts.assert(\n this.backChannelRequest_ != null,\n 'Invalid state: no backchannel request');\n\n // We wait for extra response payload in addition to just headers to\n // cancel the timer.\n if (this.backChannelRequest_.getXhr() != null) {\n const responseData = this.backChannelRequest_.getXhr().getResponseText();\n if (responseData) {\n this.channelDebug_.warning(\n 'Timer should have been cancelled : ' + responseData);\n }\n }\n\n // Enable long-polling\n this.channelDebug_.info(\n 'Buffering proxy detected and switch to long-polling!');\n this.enableStreaming_ = false;\n\n this.bpDetectionDone_ = true;\n requestStats.notifyStatEvent(requestStats.Stat.PROXY);\n\n // Cancel the request and start a new one immediately\n this.cancelBackChannelRequest_();\n this.startBackChannel_();\n};\n\n\n/**\n * Clears the timer for BP detection.\n * @private\n */\nWebChannelBase.prototype.clearBpDetectionTimer_ = function() {\n 'use strict';\n if (this.bpDetectionTimerId_ != null) {\n this.channelDebug_.debug('Cancel the BP detection timer.');\n goog.global.clearTimeout(this.bpDetectionTimerId_);\n this.bpDetectionTimerId_ = null;\n }\n};\n\n\n/**\n * Begins a new back channel operation to the server.\n * @private\n */\nWebChannelBase.prototype.startBackChannel_ = function() {\n 'use strict';\n if (!this.okToMakeRequest_()) {\n // channel is cancelled\n return;\n }\n\n this.channelDebug_.debug('Creating new HttpRequest');\n this.backChannelRequest_ = ChannelRequest.createChannelRequest(\n this, this.channelDebug_, this.sid_, 'rpc', this.backChannelAttemptId_);\n\n if (this.httpHeadersOverwriteParam_ === null) {\n this.backChannelRequest_.setExtraHeaders(this.extraHeaders_);\n }\n\n this.backChannelRequest_.setReadyStateChangeThrottle(\n this.readyStateChangeThrottleMs_);\n const uri = this.backChannelUri_.clone();\n uri.setParameterValue('RID', 'rpc');\n uri.setParameterValue('SID', this.sid_);\n uri.setParameterValue('CI', this.enableStreaming_ ? '0' : '1');\n uri.setParameterValue('AID', this.lastArrayId_);\n\n // Add the reconnect parameters.\n this.addAdditionalParams_(uri);\n\n uri.setParameterValue('TYPE', 'xmlhttp');\n\n if (this.httpHeadersOverwriteParam_ && this.extraHeaders_) {\n httpCors.setHttpHeadersWithOverwriteParam(\n uri, this.httpHeadersOverwriteParam_, this.extraHeaders_);\n }\n\n if (this.backChannelRequestTimeoutMs_) {\n this.backChannelRequest_.setTimeout(this.backChannelRequestTimeoutMs_);\n }\n\n this.backChannelRequest_.xmlHttpGet(\n uri, true /* decodeChunks */, this.hostPrefix_);\n\n this.channelDebug_.debug('New Request created');\n};\n\n\n/**\n * Gives the handler a chance to return an error code and stop channel\n * execution. A handler might want to do this to check that the user is still\n * logged in, for example.\n * @private\n * @return {boolean} If it's OK to make a request.\n */\nWebChannelBase.prototype.okToMakeRequest_ = function() {\n 'use strict';\n if (this.handler_) {\n const result = this.handler_.okToMakeRequest(this);\n if (result != WebChannelBase.Error.OK) {\n this.channelDebug_.debug(\n 'Handler returned error code from okToMakeRequest');\n this.signalError_(result);\n return false;\n }\n }\n return true;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.onFirstByteReceived = function(request, responseText) {\n 'use strict';\n if (this.backChannelRequest_ == request && this.detectBufferingProxy_) {\n if (!this.bpDetectionDone_) {\n this.channelDebug_.info(\n 'Great, no buffering proxy detected. Bytes received: ' +\n responseText.length);\n goog.asserts.assert(\n this.bpDetectionTimerId_, 'Timer should not have been cancelled.');\n this.clearBpDetectionTimer_();\n this.bpDetectionDone_ = true;\n requestStats.notifyStatEvent(requestStats.Stat.NOPROXY);\n }\n }\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.onRequestData = function(request, responseText) {\n 'use strict';\n if (this.state_ == WebChannelBase.State.CLOSED ||\n (this.backChannelRequest_ != request &&\n !this.forwardChannelRequestPool_.hasRequest(request))) {\n // either CLOSED or a request we don't know about (perhaps an old request)\n return;\n }\n this.lastStatusCode_ = request.getLastStatusCode();\n\n // first to check if request has been upgraded to backchannel\n if (!request.isInitialResponseDecoded() &&\n this.forwardChannelRequestPool_.hasRequest(request) &&\n this.state_ == WebChannelBase.State.OPENED) {\n let response;\n try {\n response = this.wireCodec_.decodeMessage(responseText);\n } catch (ex) {\n response = null;\n }\n if (Array.isArray(response) && response.length == 3) {\n this.handlePostResponse_(/** @type {!Array<?>} */ (response), request);\n this.onForwardChannelFlushed_();\n } else {\n this.channelDebug_.debug('Bad POST response data returned');\n this.signalError_(WebChannelBase.Error.BAD_RESPONSE);\n }\n } else {\n if (request.isInitialResponseDecoded() ||\n this.backChannelRequest_ == request) {\n this.clearDeadBackchannelTimer_();\n }\n\n if (!goog.string.isEmptyOrWhitespace(responseText)) {\n let response = this.wireCodec_.decodeMessage(responseText);\n this.onInput_(/** @type {!Array<?>} */ (response), request);\n }\n }\n};\n\n\n/**\n * Checks if we need call the flush callback.\n *\n * @private\n */\nWebChannelBase.prototype.onForwardChannelFlushed_ = function() {\n 'use strict';\n if (this.forwardChannelRequestPool_.getRequestCount() <= 1) {\n if (this.forwardChannelFlushedCallback_) {\n try {\n this.forwardChannelFlushedCallback_();\n } catch (ex) {\n this.channelDebug_.dumpException(\n ex, 'Exception from forwardChannelFlushedCallback_ ');\n }\n // reset\n this.forwardChannelFlushedCallback_ = undefined;\n }\n }\n};\n\n\n/**\n * Handles a POST response from the server.\n * @param {Array<number>} responseValues The key value pairs in\n * the POST response.\n * @param {!ChannelRequest} forwardReq The forward channel request that\n * triggers this function call.\n * @private\n */\nWebChannelBase.prototype.handlePostResponse_ = function(\n responseValues, forwardReq) {\n 'use strict';\n // The first response value is set to 0 if server is missing backchannel.\n if (responseValues[0] == 0) {\n this.handleBackchannelMissing_(forwardReq);\n return;\n }\n this.lastPostResponseArrayId_ = responseValues[1];\n const outstandingArrays = this.lastPostResponseArrayId_ - this.lastArrayId_;\n if (0 < outstandingArrays) {\n const numOutstandingBackchannelBytes = responseValues[2];\n this.channelDebug_.debug(\n numOutstandingBackchannelBytes + ' bytes (in ' + outstandingArrays +\n ' arrays) are outstanding on the BackChannel');\n if (!this.shouldRetryBackChannel_(numOutstandingBackchannelBytes)) {\n return;\n }\n if (!this.deadBackChannelTimerId_) {\n // We expect to receive data within 2 RTTs or we retry the backchannel.\n this.deadBackChannelTimerId_ = requestStats.setTimeout(\n goog.bind(this.onBackChannelDead_, this),\n 2 * WebChannelBase.RTT_ESTIMATE);\n }\n }\n};\n\n\n/**\n * Handles a POST response from the server telling us that it has detected that\n * we have no hanging GET connection.\n * @param {!ChannelRequest} forwardReq The forward channel request that\n * triggers this function call.\n * @private\n */\nWebChannelBase.prototype.handleBackchannelMissing_ = function(forwardReq) {\n 'use strict';\n // As long as the back channel was started before the POST was sent,\n // we should retry the backchannel. We give a slight buffer of RTT_ESTIMATE\n // so as not to excessively retry the backchannel\n this.channelDebug_.debug('Server claims our backchannel is missing.');\n if (this.backChannelTimerId_) {\n this.channelDebug_.debug('But we are currently starting the request.');\n return;\n } else if (!this.backChannelRequest_) {\n this.channelDebug_.warning('We do not have a BackChannel established');\n } else if (\n this.backChannelRequest_.getRequestStartTime() +\n WebChannelBase.RTT_ESTIMATE <\n forwardReq.getRequestStartTime()) {\n this.clearDeadBackchannelTimer_();\n this.cancelBackChannelRequest_();\n } else {\n return;\n }\n this.maybeRetryBackChannel_();\n requestStats.notifyStatEvent(requestStats.Stat.BACKCHANNEL_MISSING);\n};\n\n\n/**\n * Determines whether we should start the process of retrying a possibly\n * dead backchannel.\n * @param {number} outstandingBytes The number of bytes for which the server has\n * not yet received acknowledgement.\n * @return {boolean} Whether to start the backchannel retry timer.\n * @private\n */\nWebChannelBase.prototype.shouldRetryBackChannel_ = function(outstandingBytes) {\n 'use strict';\n // Not too many outstanding bytes, not buffered and not after a retry.\n return outstandingBytes <\n WebChannelBase.OUTSTANDING_DATA_BACKCHANNEL_RETRY_CUTOFF &&\n !this.isBuffered() && this.backChannelRetryCount_ == 0;\n};\n\n\n/**\n * Decides which host prefix should be used, if any. If there is a handler,\n * allows the handler to validate a host prefix provided by the server, and\n * optionally override it.\n * @param {?string} serverHostPrefix The host prefix provided by the server.\n * @return {?string} The host prefix to actually use, if any. Will return null\n * if the use of host prefixes was disabled via setAllowHostPrefix().\n * @override\n */\nWebChannelBase.prototype.correctHostPrefix = function(serverHostPrefix) {\n 'use strict';\n if (this.allowHostPrefix_) {\n if (this.handler_) {\n return this.handler_.correctHostPrefix(serverHostPrefix);\n }\n return serverHostPrefix;\n }\n return null;\n};\n\n\n/**\n * Handles the timer that indicates that our backchannel is no longer able to\n * successfully receive data from the server.\n * @private\n */\nWebChannelBase.prototype.onBackChannelDead_ = function() {\n 'use strict';\n if (this.deadBackChannelTimerId_ != null) {\n this.deadBackChannelTimerId_ = null;\n this.cancelBackChannelRequest_();\n this.maybeRetryBackChannel_();\n requestStats.notifyStatEvent(requestStats.Stat.BACKCHANNEL_DEAD);\n }\n};\n\n\n/**\n * Clears the timer that indicates that our backchannel is no longer able to\n * successfully receive data from the server.\n * @private\n */\nWebChannelBase.prototype.clearDeadBackchannelTimer_ = function() {\n 'use strict';\n if (this.deadBackChannelTimerId_ != null) {\n goog.global.clearTimeout(this.deadBackChannelTimerId_);\n this.deadBackChannelTimerId_ = null;\n }\n};\n\n\n/**\n * Returns whether or not the given error/status combination is fatal or not.\n * On fatal errors we immediately close the session rather than retrying the\n * failed request.\n * @param {?ChannelRequest.Error} error The error code for the\n * failed request.\n * @param {number} statusCode The last HTTP status code.\n * @return {boolean} Whether or not the error is fatal.\n * @private\n */\nWebChannelBase.isFatalError_ = function(error, statusCode) {\n 'use strict';\n return error == ChannelRequest.Error.UNKNOWN_SESSION_ID ||\n (error == ChannelRequest.Error.STATUS && statusCode > 0);\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.onRequestComplete = function(request) {\n 'use strict';\n this.channelDebug_.debug('Request complete');\n let type;\n let pendingMessages = null;\n if (this.backChannelRequest_ == request) {\n this.clearDeadBackchannelTimer_();\n this.clearBpDetectionTimer_();\n this.backChannelRequest_ = null;\n type = WebChannelBase.ChannelType_.BACK_CHANNEL;\n } else if (this.forwardChannelRequestPool_.hasRequest(request)) {\n pendingMessages = request.getPendingMessages();\n this.forwardChannelRequestPool_.removeRequest(request);\n type = WebChannelBase.ChannelType_.FORWARD_CHANNEL;\n } else {\n // return if it was an old request from a previous session\n return;\n }\n\n this.lastStatusCode_ = request.getLastStatusCode();\n\n if (this.state_ == WebChannelBase.State.CLOSED) {\n return;\n }\n\n if (request.getSuccess()) {\n if (type == WebChannelBase.ChannelType_.FORWARD_CHANNEL) {\n const size = request.getPostData() ? request.getPostData().length : 0;\n requestStats.notifyTimingEvent(\n size, Date.now() - request.getRequestStartTime(),\n this.forwardChannelRetryCount_);\n this.ensureForwardChannel_();\n this.onSuccess_(request);\n } else { // i.e., back-channel\n this.ensureBackChannel_();\n }\n return;\n }\n // Else unsuccessful. Fall through.\n\n const lastError = request.getLastError();\n if (!WebChannelBase.isFatalError_(lastError, this.lastStatusCode_)) {\n // Maybe retry.\n const self = this;\n this.channelDebug_.debug(function() {\n 'use strict';\n return 'Maybe retrying, last error: ' +\n ChannelRequest.errorStringFromCode(lastError, self.lastStatusCode_);\n });\n if (type == WebChannelBase.ChannelType_.FORWARD_CHANNEL) {\n if (this.maybeRetryForwardChannel_(request)) {\n return;\n }\n }\n if (type == WebChannelBase.ChannelType_.BACK_CHANNEL) {\n if (this.maybeRetryBackChannel_()) {\n return;\n }\n }\n // Else exceeded max retries. Fall through.\n this.channelDebug_.debug('Exceeded max number of retries');\n } else {\n // Else fatal error. Fall through and mark the pending maps as failed.\n this.channelDebug_.debug('Not retrying due to error type');\n }\n\n\n // Abort the channel now\n\n // Record pending messages from the failed request\n if (pendingMessages && pendingMessages.length > 0) {\n this.forwardChannelRequestPool_.addPendingMessages(pendingMessages);\n }\n\n this.channelDebug_.debug('Error: HTTP request failed');\n switch (lastError) {\n case ChannelRequest.Error.NO_DATA:\n this.signalError_(WebChannelBase.Error.NO_DATA);\n break;\n case ChannelRequest.Error.BAD_DATA:\n this.signalError_(WebChannelBase.Error.BAD_DATA);\n break;\n case ChannelRequest.Error.UNKNOWN_SESSION_ID:\n this.signalError_(WebChannelBase.Error.UNKNOWN_SESSION_ID);\n break;\n default:\n this.signalError_(WebChannelBase.Error.REQUEST_FAILED);\n break;\n }\n};\n\n\n/**\n * @param {number} retryCount Number of retries so far.\n * @return {number} Time in ms before firing next retry request.\n * @private\n */\nWebChannelBase.prototype.getRetryTime_ = function(retryCount) {\n 'use strict';\n let retryTime = this.baseRetryDelayMs_ +\n Math.floor(Math.random() * this.retryDelaySeedMs_);\n if (!this.isActive()) {\n this.channelDebug_.debug('Inactive channel');\n retryTime = retryTime * WebChannelBase.INACTIVE_CHANNEL_RETRY_FACTOR;\n }\n // Backoff for subsequent retries\n retryTime *= retryCount;\n return retryTime;\n};\n\n\n/**\n * @param {number} baseDelayMs The base part of the retry delay, in ms.\n * @param {number} delaySeedMs A random delay between 0 and this is added to\n * the base part.\n */\nWebChannelBase.prototype.setRetryDelay = function(baseDelayMs, delaySeedMs) {\n 'use strict';\n this.baseRetryDelayMs_ = baseDelayMs;\n this.retryDelaySeedMs_ = delaySeedMs;\n};\n\n\n/**\n * Apply any handshake control headers.\n * @param {!ChannelRequest} request The underlying request object\n * @private\n */\nWebChannelBase.prototype.applyControlHeaders_ = function(request) {\n 'use strict';\n const xhr = request.getXhr();\n if (xhr) {\n const clientProtocol =\n xhr.getStreamingResponseHeader(WebChannel.X_CLIENT_WIRE_PROTOCOL);\n if (clientProtocol) {\n this.forwardChannelRequestPool_.applyClientProtocol(clientProtocol);\n }\n\n if (this.getHttpSessionIdParam()) {\n const httpSessionIdHeader =\n xhr.getStreamingResponseHeader(WebChannel.X_HTTP_SESSION_ID);\n if (httpSessionIdHeader) {\n this.setHttpSessionId(httpSessionIdHeader);\n // update the cached uri\n const httpSessionIdParam = this.getHttpSessionIdParam();\n\n this.forwardChannelUri_.setParameterValue(\n /** @type {string} */ (httpSessionIdParam), // never null\n httpSessionIdHeader);\n } else {\n this.channelDebug_.warning(\n 'Missing X_HTTP_SESSION_ID in the handshake response');\n }\n }\n }\n};\n\n\n/**\n * Processes the data returned by the server.\n * @param {!Array<!Array<?>>} respArray The response array returned\n * by the server.\n * @param {!ChannelRequest} request The underlying request object\n * @private\n */\nWebChannelBase.prototype.onInput_ = function(respArray, request) {\n 'use strict';\n const batch =\n this.handler_ && this.handler_.channelHandleMultipleArrays ? [] : null;\n for (let i = 0; i < respArray.length; i++) {\n let nextArray = respArray[i];\n this.lastArrayId_ = nextArray[0];\n nextArray = nextArray[1];\n if (this.state_ == WebChannelBase.State.OPENING) {\n if (nextArray[0] == 'c') {\n this.sid_ = nextArray[1];\n this.hostPrefix_ = this.correctHostPrefix(nextArray[2]);\n\n const negotiatedVersion = nextArray[3];\n if (negotiatedVersion != null) {\n this.channelVersion_ = negotiatedVersion;\n this.channelDebug_.info('VER=' + this.channelVersion_);\n }\n\n const negotiatedServerVersion = nextArray[4];\n if (negotiatedServerVersion != null) {\n this.serverVersion_ = negotiatedServerVersion;\n this.channelDebug_.info('SVER=' + this.serverVersion_);\n }\n\n // CVER=22\n const serverKeepaliveMs = nextArray[5];\n if (serverKeepaliveMs != null &&\n typeof serverKeepaliveMs === 'number' && serverKeepaliveMs > 0) {\n const timeout = 1.5 * serverKeepaliveMs;\n this.backChannelRequestTimeoutMs_ = timeout;\n this.channelDebug_.info('backChannelRequestTimeoutMs_=' + timeout);\n }\n\n this.applyControlHeaders_(request);\n\n this.state_ = WebChannelBase.State.OPENED;\n if (this.handler_) {\n this.handler_.channelOpened(this);\n }\n\n if (this.detectBufferingProxy_) {\n this.handshakeRttMs_ = Date.now() - request.getRequestStartTime();\n this.channelDebug_.info(\n 'Handshake RTT: ' + this.handshakeRttMs_ + 'ms');\n }\n\n this.startBackchannelAfterHandshake_(request);\n\n if (this.outgoingMaps_.length > 0) {\n this.ensureForwardChannel_();\n }\n } else if (nextArray[0] == 'stop' || nextArray[0] == 'close') {\n // treat close also as an abort\n this.signalError_(WebChannelBase.Error.STOP);\n }\n } else if (this.state_ == WebChannelBase.State.OPENED) {\n if (nextArray[0] == 'stop' || nextArray[0] == 'close') {\n if (batch && !goog.array.isEmpty(batch)) {\n this.handler_.channelHandleMultipleArrays(this, batch);\n batch.length = 0;\n }\n if (nextArray[0] == 'stop') {\n this.signalError_(WebChannelBase.Error.STOP);\n } else {\n this.disconnect();\n }\n } else if (nextArray[0] == 'noop') {\n // ignore - noop to keep connection happy\n } else {\n if (batch) {\n batch.push(nextArray);\n } else if (this.handler_) {\n this.handler_.channelHandleArray(this, nextArray);\n }\n }\n // We have received useful data on the back-channel, so clear its retry\n // count. We do this because back-channels by design do not complete\n // quickly, so on a flaky connection we could have many fail to complete\n // fully but still deliver a lot of data before they fail. We don't want\n // to count such failures towards the retry limit, because we don't want\n // to give up on a session if we can still receive data.\n this.backChannelRetryCount_ = 0;\n }\n }\n if (batch && !goog.array.isEmpty(batch)) {\n this.handler_.channelHandleMultipleArrays(this, batch);\n }\n};\n\n\n/**\n * Starts the backchannel after the handshake.\n *\n * @param {!ChannelRequest} request The underlying request object\n * @private\n */\nWebChannelBase.prototype.startBackchannelAfterHandshake_ = function(request) {\n 'use strict';\n this.backChannelUri_ = this.getBackChannelUri(\n this.hostPrefix_, /** @type {string} */ (this.path_));\n\n if (request.isInitialResponseDecoded()) {\n this.channelDebug_.debug('Upgrade the handshake request to a backchannel.');\n this.forwardChannelRequestPool_.removeRequest(request);\n request.resetTimeout(this.backChannelRequestTimeoutMs_);\n this.backChannelRequest_ = request;\n } else {\n this.ensureBackChannel_();\n }\n};\n\n\n/**\n * Helper to ensure the channel is in the expected state.\n * @param {...number} var_args The channel must be in one of the indicated\n * states.\n * @private\n */\nWebChannelBase.prototype.ensureInState_ = function(var_args) {\n 'use strict';\n goog.asserts.assert(\n goog.array.contains(arguments, this.state_),\n 'Unexpected channel state: %s', this.state_);\n};\n\n\n/**\n * Signals an error has occurred.\n * @param {WebChannelBase.Error} error The error code for the failure.\n * @private\n */\nWebChannelBase.prototype.signalError_ = function(error) {\n 'use strict';\n this.channelDebug_.info('Error code ' + error);\n if (error == WebChannelBase.Error.REQUEST_FAILED) {\n // Create a separate Internet connection to check\n // if it's a server error or user's network error.\n let imageUri = null;\n if (this.handler_) {\n imageUri = this.handler_.getNetworkTestImageUri(this);\n }\n netUtils.testNetwork(goog.bind(this.testNetworkCallback_, this), imageUri);\n } else {\n requestStats.notifyStatEvent(requestStats.Stat.ERROR_OTHER);\n }\n this.onError_(error);\n};\n\n\n/**\n * Callback for netUtils.testNetwork during error handling.\n * @param {boolean} networkUp Whether the network is up.\n * @private\n */\nWebChannelBase.prototype.testNetworkCallback_ = function(networkUp) {\n 'use strict';\n if (networkUp) {\n this.channelDebug_.info('Successfully pinged google.com');\n requestStats.notifyStatEvent(requestStats.Stat.ERROR_OTHER);\n } else {\n this.channelDebug_.info('Failed to ping google.com');\n requestStats.notifyStatEvent(requestStats.Stat.ERROR_NETWORK);\n // Do not call onError_ again to eliminate duplicated Error events.\n }\n};\n\n\n/**\n * Called when messages have been successfully sent from the queue.\n * @param {!ChannelRequest} request The request object\n * @private\n */\nWebChannelBase.prototype.onSuccess_ = function(request) {\n 'use strict';\n if (this.handler_) {\n this.handler_.channelSuccess(this, request);\n }\n};\n\n\n/**\n * Called when we've determined the final error for a channel. It closes the\n * notifiers the handler of the error and closes the channel.\n * @param {WebChannelBase.Error} error The error code for the failure.\n * @private\n */\nWebChannelBase.prototype.onError_ = function(error) {\n 'use strict';\n this.channelDebug_.debug('HttpChannel: error - ' + error);\n this.state_ = WebChannelBase.State.CLOSED;\n if (this.handler_) {\n this.handler_.channelError(this, error);\n }\n this.onClose_();\n this.cancelRequests_();\n};\n\n\n/**\n * Called when the channel has been closed. It notifiers the handler of the\n * event, and reports any pending or undelivered maps.\n * @private\n */\nWebChannelBase.prototype.onClose_ = function() {\n 'use strict';\n this.state_ = WebChannelBase.State.CLOSED;\n this.lastStatusCode_ = -1;\n if (this.handler_) {\n const pendingMessages =\n this.forwardChannelRequestPool_.getPendingMessages();\n\n if (pendingMessages.length == 0 && this.outgoingMaps_.length == 0) {\n this.handler_.channelClosed(this);\n } else {\n const self = this;\n this.channelDebug_.debug(function() {\n 'use strict';\n return 'Number of undelivered maps' +\n ', pending: ' + pendingMessages.length +\n ', outgoing: ' + self.outgoingMaps_.length;\n });\n\n this.forwardChannelRequestPool_.clearPendingMessages();\n\n const copyOfUndeliveredMaps = goog.array.clone(this.outgoingMaps_);\n this.outgoingMaps_.length = 0;\n\n this.handler_.channelClosed(this, pendingMessages, copyOfUndeliveredMaps);\n }\n }\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getForwardChannelUri = function(path) {\n 'use strict';\n const uri = this.createDataUri(null, path);\n this.channelDebug_.debug('GetForwardChannelUri: ' + uri);\n return uri;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getConnectionState = function() {\n 'use strict';\n return this.connState_;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getBackChannelUri = function(hostPrefix, path) {\n 'use strict';\n const uri = this.createDataUri(\n this.shouldUseSecondaryDomains() ? hostPrefix : null, path);\n this.channelDebug_.debug('GetBackChannelUri: ' + uri);\n return uri;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.createDataUri = function(\n hostPrefix, path, opt_overridePort) {\n 'use strict';\n let uri = goog.Uri.parse(path);\n const uriAbsolute = (uri.getDomain() != '');\n if (uriAbsolute) {\n if (hostPrefix) {\n uri.setDomain(hostPrefix + '.' + uri.getDomain());\n }\n\n uri.setPort(opt_overridePort || uri.getPort());\n } else {\n const locationPage = goog.global.location;\n let hostName;\n if (hostPrefix) {\n hostName = hostPrefix + '.' + locationPage.hostname;\n } else {\n hostName = locationPage.hostname;\n }\n\n const port = opt_overridePort || +locationPage.port;\n\n uri = goog.Uri.create(locationPage.protocol, null, hostName, port, path);\n }\n\n if (this.extraParams_) {\n goog.object.forEach(this.extraParams_, function(value, key) {\n 'use strict';\n uri.setParameterValue(key, value);\n });\n }\n\n const param = this.getHttpSessionIdParam();\n const value = this.getHttpSessionId();\n if (param && value) {\n uri.setParameterValue(param, value);\n }\n\n // Add the protocol version to the URI.\n uri.setParameterValue('VER', this.channelVersion_);\n\n // Add the reconnect parameters.\n this.addAdditionalParams_(uri);\n\n return uri;\n};\n\n/**\n * @override\n * @param {?string} hostPrefix The host prefix, if we need an XhrIo object\n * capable of calling a secondary domain.\n * @param {boolean=} isStreaming Whether or not fetch/streams are enabled for\n * the underlying HTTP request.\n * @return {!goog.net.XhrIo} A new XhrIo object.\n */\nWebChannelBase.prototype.createXhrIo = function(hostPrefix, isStreaming) {\n 'use strict';\n if (hostPrefix && !this.supportsCrossDomainXhrs_) {\n throw new Error('Can\\'t create secondary domain capable XhrIo object.');\n }\n let xhr;\n if (isStreaming && this.usesFetchStreams_ && !this.xmlHttpFactory_) {\n xhr = new goog.net.XhrIo(\n new goog.net.FetchXmlHttpFactory({streamBinaryChunks: true}));\n } else {\n xhr = new goog.net.XhrIo(this.xmlHttpFactory_);\n }\n xhr.setWithCredentials(this.supportsCrossDomainXhrs_);\n return xhr;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.isActive = function() {\n 'use strict';\n return !!this.handler_ && this.handler_.isActive(this);\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.shouldUseSecondaryDomains = function() {\n 'use strict';\n return this.supportsCrossDomainXhrs_;\n};\n\n\n/**\n * Sets (overwrites) the forward channel flush callback.\n *\n * @param {function()} callback The callback to be invoked.\n */\nWebChannelBase.prototype.setForwardChannelFlushCallback = function(callback) {\n 'use strict';\n this.forwardChannelFlushedCallback_ = callback;\n};\n\n\n/**\n * Abstract base class for the channel handler\n * @constructor\n * @struct\n */\nWebChannelBase.Handler = function() {};\n\n\n/**\n * Callback handler for when a batch of response arrays is received from the\n * server. When null, batched dispatching is disabled.\n * @type {?function(!WebChannelBase, !Array<!Array<?>>)}\n */\nWebChannelBase.Handler.prototype.channelHandleMultipleArrays = null;\n\n\n/**\n * Whether it's okay to make a request to the server. A handler can return\n * false if the channel should fail. For example, if the user has logged out,\n * the handler may want all requests to fail immediately.\n * @param {WebChannelBase} channel The channel.\n * @return {WebChannelBase.Error} An error code. The code should\n * return WebChannelBase.Error.OK to indicate it's okay. Any other\n * error code will cause a failure.\n */\nWebChannelBase.Handler.prototype.okToMakeRequest = function(channel) {\n 'use strict';\n return WebChannelBase.Error.OK;\n};\n\n\n/**\n * Indicates the WebChannel has successfully negotiated with the server\n * and can now send and receive data.\n * @param {WebChannelBase} channel The channel.\n */\nWebChannelBase.Handler.prototype.channelOpened = function(channel) {};\n\n\n/**\n * New input is available for the application to process.\n *\n * @param {WebChannelBase} channel The channel.\n * @param {Array<?>} array The data array.\n */\nWebChannelBase.Handler.prototype.channelHandleArray = function(\n channel, array) {};\n\n\n/**\n * Indicates messages that have been successfully sent on the channel.\n *\n * @param {WebChannelBase} channel The channel.\n * @param {!ChannelRequest} request The request object that contains\n * the pending messages that have been successfully delivered to the server.\n */\nWebChannelBase.Handler.prototype.channelSuccess = function(channel, request) {};\n\n\n/**\n * Indicates an error occurred on the WebChannel.\n *\n * @param {WebChannelBase} channel The channel.\n * @param {WebChannelBase.Error} error The error code.\n */\nWebChannelBase.Handler.prototype.channelError = function(channel, error) {};\n\n\n/**\n * Indicates the WebChannel is closed. Also notifies about which maps,\n * if any, that may not have been delivered to the server.\n * @param {WebChannelBase} channel The channel.\n * @param {Array<Wire.QueuedMap>=} opt_pendingMaps The\n * array of pending maps, which may or may not have been delivered to the\n * server.\n * @param {Array<Wire.QueuedMap>=} opt_undeliveredMaps\n * The array of undelivered maps, which have definitely not been delivered\n * to the server.\n */\nWebChannelBase.Handler.prototype.channelClosed = function(\n channel, opt_pendingMaps, opt_undeliveredMaps) {};\n\n\n/**\n * Gets any parameters that should be added at the time another connection is\n * made to the server.\n * @param {WebChannelBase} channel The channel.\n * @return {!Object} Extra parameter keys and values to add to the requests.\n */\nWebChannelBase.Handler.prototype.getAdditionalParams = function(channel) {\n 'use strict';\n return {};\n};\n\n\n/**\n * Gets the URI of an image that can be used to test network connectivity.\n * @param {WebChannelBase} channel The channel.\n * @return {goog.Uri?} A custom URI to load for the network test.\n */\nWebChannelBase.Handler.prototype.getNetworkTestImageUri = function(channel) {\n 'use strict';\n return null;\n};\n\n\n/**\n * Gets whether this channel is currently active. This is used to determine the\n * length of time to wait before retrying.\n * @param {WebChannelBase} channel The channel.\n * @return {boolean} Whether the channel is currently active.\n */\nWebChannelBase.Handler.prototype.isActive = function(channel) {\n 'use strict';\n return true;\n};\n\n/**\n * Whether or not this channel uses WHATWG Fetch/streams.\n * @override\n * @return {boolean}\n */\nWebChannelBase.prototype.usesFetchStreams = function() {\n 'use strict';\n return this.usesFetchStreams_;\n};\n\n\n/**\n * Called by the channel if enumeration of the map throws an exception.\n * @param {WebChannelBase} channel The channel.\n * @param {Object} map The map that can't be enumerated.\n */\nWebChannelBase.Handler.prototype.badMapError = function(channel, map) {};\n\n\n/**\n * Allows the handler to override a host prefix provided by the server. Will\n * be called whenever the channel has received such a prefix and is considering\n * its use.\n * @param {?string} serverHostPrefix The host prefix provided by the server.\n * @return {?string} The host prefix the client should use.\n */\nWebChannelBase.Handler.prototype.correctHostPrefix = function(\n serverHostPrefix) {\n 'use strict';\n return serverHostPrefix;\n};\n}); // goog.scope\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Class for parsing and formatting URIs.\n *\n * This package is deprecated in favour of the Closure URL package (goog.url)\n * when manipulating URIs for use by a browser. This package uses regular\n * expressions to parse a potential URI which can fall out of sync with how a\n * browser will actually interpret the URI. See\n * `goog.uri.utils.setUrlPackageSupportLoggingHandler` for one way to identify\n * URIs that should instead be parsed using the URL package.\n *\n * Use goog.Uri(string) to parse a URI string. Use goog.Uri.create(...) to\n * create a new instance of the goog.Uri object from Uri parts.\n *\n * e.g: <code>var myUri = new goog.Uri(window.location);</code>\n *\n * Implements RFC 3986 for parsing/formatting URIs.\n * http://www.ietf.org/rfc/rfc3986.txt\n *\n * Some changes have been made to the interface (more like .NETs), though the\n * internal representation is now of un-encoded parts, this will change the\n * behavior slightly.\n */\n\ngoog.provide('goog.Uri');\ngoog.provide('goog.Uri.QueryData');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.string');\ngoog.require('goog.structs');\ngoog.require('goog.structs.Map');\ngoog.require('goog.uri.utils');\ngoog.require('goog.uri.utils.ComponentIndex');\ngoog.require('goog.uri.utils.StandardQueryParam');\n\n\n\n/**\n * This class contains setters and getters for the parts of the URI.\n * The <code>getXyz</code>/<code>setXyz</code> methods return the decoded part\n * -- so<code>goog.Uri.parse('/foo%20bar').getPath()</code> will return the\n * decoded path, <code>/foo bar</code>.\n *\n * Reserved characters (see RFC 3986 section 2.2) can be present in\n * their percent-encoded form in scheme, domain, and path URI components and\n * will not be auto-decoded. For example:\n * <code>goog.Uri.parse('rel%61tive/path%2fto/resource').getPath()</code> will\n * return <code>relative/path%2fto/resource</code>.\n *\n * The constructor accepts an optional unparsed, raw URI string. The parser\n * is relaxed, so special characters that aren't escaped but don't cause\n * ambiguities will not cause parse failures.\n *\n * All setters return <code>this</code> and so may be chained, a la\n * <code>goog.Uri.parse('/foo').setFragment('part').toString()</code>.\n *\n * @param {*=} opt_uri Optional string URI to parse\n * (use goog.Uri.create() to create a URI from parts), or if\n * a goog.Uri is passed, a clone is created.\n * @param {boolean=} opt_ignoreCase If true, #getParameterValue will ignore\n * the case of the parameter name.\n *\n * @throws URIError If opt_uri is provided and URI is malformed (that is,\n * if decodeURIComponent fails on any of the URI components).\n * @constructor\n * @struct\n */\ngoog.Uri = function(opt_uri, opt_ignoreCase) {\n 'use strict';\n /**\n * Scheme such as \"http\".\n * @private {string}\n */\n this.scheme_ = '';\n\n /**\n * User credentials in the form \"username:password\".\n * @private {string}\n */\n this.userInfo_ = '';\n\n /**\n * Domain part, e.g. \"www.google.com\".\n * @private {string}\n */\n this.domain_ = '';\n\n /**\n * Port, e.g. 8080.\n * @private {?number}\n */\n this.port_ = null;\n\n /**\n * Path, e.g. \"/tests/img.png\".\n * @private {string}\n */\n this.path_ = '';\n\n /**\n * The fragment without the #.\n * @private {string}\n */\n this.fragment_ = '';\n\n /**\n * Whether or not this Uri should be treated as Read Only.\n * @private {boolean}\n */\n this.isReadOnly_ = false;\n\n /**\n * Whether or not to ignore case when comparing query params.\n * @private {boolean}\n */\n this.ignoreCase_ = false;\n\n /**\n * Object representing query data.\n * @private {!goog.Uri.QueryData}\n */\n this.queryData_;\n\n // Parse in the uri string\n var m;\n if (opt_uri instanceof goog.Uri) {\n this.ignoreCase_ = (opt_ignoreCase !== undefined) ? opt_ignoreCase :\n opt_uri.getIgnoreCase();\n this.setScheme(opt_uri.getScheme());\n this.setUserInfo(opt_uri.getUserInfo());\n this.setDomain(opt_uri.getDomain());\n this.setPort(opt_uri.getPort());\n this.setPath(opt_uri.getPath());\n this.setQueryData(opt_uri.getQueryData().clone());\n this.setFragment(opt_uri.getFragment());\n } else if (opt_uri && (m = goog.uri.utils.split(String(opt_uri)))) {\n this.ignoreCase_ = !!opt_ignoreCase;\n\n // Set the parts -- decoding as we do so.\n // COMPATIBILITY NOTE - In IE, unmatched fields may be empty strings,\n // whereas in other browsers they will be undefined.\n this.setScheme(m[goog.uri.utils.ComponentIndex.SCHEME] || '', true);\n this.setUserInfo(m[goog.uri.utils.ComponentIndex.USER_INFO] || '', true);\n this.setDomain(m[goog.uri.utils.ComponentIndex.DOMAIN] || '', true);\n this.setPort(m[goog.uri.utils.ComponentIndex.PORT]);\n this.setPath(m[goog.uri.utils.ComponentIndex.PATH] || '', true);\n this.setQueryData(m[goog.uri.utils.ComponentIndex.QUERY_DATA] || '', true);\n this.setFragment(m[goog.uri.utils.ComponentIndex.FRAGMENT] || '', true);\n\n } else {\n this.ignoreCase_ = !!opt_ignoreCase;\n this.queryData_ = new goog.Uri.QueryData(null, this.ignoreCase_);\n }\n};\n\n\n/**\n * Parameter name added to stop caching.\n * @type {string}\n */\ngoog.Uri.RANDOM_PARAM = goog.uri.utils.StandardQueryParam.RANDOM;\n\n\n/**\n * @return {string} The string form of the url.\n * @override\n */\ngoog.Uri.prototype.toString = function() {\n 'use strict';\n var out = [];\n\n var scheme = this.getScheme();\n if (scheme) {\n out.push(\n goog.Uri.encodeSpecialChars_(\n scheme, goog.Uri.reDisallowedInSchemeOrUserInfo_, true),\n ':');\n }\n\n var domain = this.getDomain();\n if (domain || scheme == 'file') {\n out.push('//');\n\n var userInfo = this.getUserInfo();\n if (userInfo) {\n out.push(\n goog.Uri.encodeSpecialChars_(\n userInfo, goog.Uri.reDisallowedInSchemeOrUserInfo_, true),\n '@');\n }\n\n out.push(goog.Uri.removeDoubleEncoding_(goog.string.urlEncode(domain)));\n\n var port = this.getPort();\n if (port != null) {\n out.push(':', String(port));\n }\n }\n\n var path = this.getPath();\n if (path) {\n if (this.hasDomain() && path.charAt(0) != '/') {\n out.push('/');\n }\n out.push(goog.Uri.encodeSpecialChars_(\n path,\n path.charAt(0) == '/' ? goog.Uri.reDisallowedInAbsolutePath_ :\n goog.Uri.reDisallowedInRelativePath_,\n true));\n }\n\n var query = this.getEncodedQuery();\n if (query) {\n out.push('?', query);\n }\n\n var fragment = this.getFragment();\n if (fragment) {\n out.push(\n '#',\n goog.Uri.encodeSpecialChars_(\n fragment, goog.Uri.reDisallowedInFragment_));\n }\n return out.join('');\n};\n\n\n/**\n * Resolves the given relative URI (a goog.Uri object), using the URI\n * represented by this instance as the base URI.\n *\n * There are several kinds of relative URIs:<br>\n * 1. foo - replaces the last part of the path, the whole query and fragment<br>\n * 2. /foo - replaces the path, the query and fragment<br>\n * 3. //foo - replaces everything from the domain on. foo is a domain name<br>\n * 4. ?foo - replace the query and fragment<br>\n * 5. #foo - replace the fragment only\n *\n * Additionally, if relative URI has a non-empty path, all \"..\" and \".\"\n * segments will be resolved, as described in RFC 3986.\n *\n * @param {!goog.Uri} relativeUri The relative URI to resolve.\n * @return {!goog.Uri} The resolved URI.\n */\ngoog.Uri.prototype.resolve = function(relativeUri) {\n 'use strict';\n var absoluteUri = this.clone();\n\n // we satisfy these conditions by looking for the first part of relativeUri\n // that is not blank and applying defaults to the rest\n\n var overridden = relativeUri.hasScheme();\n\n if (overridden) {\n absoluteUri.setScheme(relativeUri.getScheme());\n } else {\n overridden = relativeUri.hasUserInfo();\n }\n\n if (overridden) {\n absoluteUri.setUserInfo(relativeUri.getUserInfo());\n } else {\n overridden = relativeUri.hasDomain();\n }\n\n if (overridden) {\n absoluteUri.setDomain(relativeUri.getDomain());\n } else {\n overridden = relativeUri.hasPort();\n }\n\n var path = relativeUri.getPath();\n if (overridden) {\n absoluteUri.setPort(relativeUri.getPort());\n } else {\n overridden = relativeUri.hasPath();\n if (overridden) {\n // resolve path properly\n if (path.charAt(0) != '/') {\n // path is relative\n if (this.hasDomain() && !this.hasPath()) {\n // RFC 3986, section 5.2.3, case 1\n path = '/' + path;\n } else {\n // RFC 3986, section 5.2.3, case 2\n var lastSlashIndex = absoluteUri.getPath().lastIndexOf('/');\n if (lastSlashIndex != -1) {\n path = absoluteUri.getPath().substr(0, lastSlashIndex + 1) + path;\n }\n }\n }\n path = goog.Uri.removeDotSegments(path);\n }\n }\n\n if (overridden) {\n absoluteUri.setPath(path);\n } else {\n overridden = relativeUri.hasQuery();\n }\n\n if (overridden) {\n absoluteUri.setQueryData(relativeUri.getQueryData().clone());\n } else {\n overridden = relativeUri.hasFragment();\n }\n\n if (overridden) {\n absoluteUri.setFragment(relativeUri.getFragment());\n }\n\n return absoluteUri;\n};\n\n\n/**\n * Clones the URI instance.\n * @return {!goog.Uri} New instance of the URI object.\n */\ngoog.Uri.prototype.clone = function() {\n 'use strict';\n return new goog.Uri(this);\n};\n\n\n/**\n * @return {string} The encoded scheme/protocol for the URI.\n */\ngoog.Uri.prototype.getScheme = function() {\n 'use strict';\n return this.scheme_;\n};\n\n\n/**\n * Sets the scheme/protocol.\n * @throws URIError If opt_decode is true and newScheme is malformed (that is,\n * if decodeURIComponent fails).\n * @param {string} newScheme New scheme value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setScheme = function(newScheme, opt_decode) {\n 'use strict';\n this.enforceReadOnly();\n this.scheme_ =\n opt_decode ? goog.Uri.decodeOrEmpty_(newScheme, true) : newScheme;\n\n // remove an : at the end of the scheme so somebody can pass in\n // window.location.protocol\n if (this.scheme_) {\n this.scheme_ = this.scheme_.replace(/:$/, '');\n }\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the scheme has been set.\n */\ngoog.Uri.prototype.hasScheme = function() {\n 'use strict';\n return !!this.scheme_;\n};\n\n\n/**\n * @return {string} The decoded user info.\n */\ngoog.Uri.prototype.getUserInfo = function() {\n 'use strict';\n return this.userInfo_;\n};\n\n\n/**\n * Sets the userInfo.\n * @throws URIError If opt_decode is true and newUserInfo is malformed (that is,\n * if decodeURIComponent fails).\n * @param {string} newUserInfo New userInfo value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setUserInfo = function(newUserInfo, opt_decode) {\n 'use strict';\n this.enforceReadOnly();\n this.userInfo_ =\n opt_decode ? goog.Uri.decodeOrEmpty_(newUserInfo) : newUserInfo;\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the user info has been set.\n */\ngoog.Uri.prototype.hasUserInfo = function() {\n 'use strict';\n return !!this.userInfo_;\n};\n\n\n/**\n * @return {string} The decoded domain.\n */\ngoog.Uri.prototype.getDomain = function() {\n 'use strict';\n return this.domain_;\n};\n\n\n/**\n * Sets the domain.\n * @throws URIError If opt_decode is true and newDomain is malformed (that is,\n * if decodeURIComponent fails).\n * @param {string} newDomain New domain value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setDomain = function(newDomain, opt_decode) {\n 'use strict';\n this.enforceReadOnly();\n this.domain_ =\n opt_decode ? goog.Uri.decodeOrEmpty_(newDomain, true) : newDomain;\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the domain has been set.\n */\ngoog.Uri.prototype.hasDomain = function() {\n 'use strict';\n return !!this.domain_;\n};\n\n\n/**\n * @return {?number} The port number.\n */\ngoog.Uri.prototype.getPort = function() {\n 'use strict';\n return this.port_;\n};\n\n\n/**\n * Sets the port number.\n * @param {*} newPort Port number. Will be explicitly casted to a number.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setPort = function(newPort) {\n 'use strict';\n this.enforceReadOnly();\n\n if (newPort) {\n newPort = Number(newPort);\n if (isNaN(newPort) || newPort < 0) {\n throw new Error('Bad port number ' + newPort);\n }\n this.port_ = newPort;\n } else {\n this.port_ = null;\n }\n\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the port has been set.\n */\ngoog.Uri.prototype.hasPort = function() {\n 'use strict';\n return this.port_ != null;\n};\n\n\n/**\n * @return {string} The decoded path.\n */\ngoog.Uri.prototype.getPath = function() {\n 'use strict';\n return this.path_;\n};\n\n\n/**\n * Sets the path.\n * @throws URIError If opt_decode is true and newPath is malformed (that is,\n * if decodeURIComponent fails).\n * @param {string} newPath New path value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setPath = function(newPath, opt_decode) {\n 'use strict';\n this.enforceReadOnly();\n this.path_ = opt_decode ? goog.Uri.decodeOrEmpty_(newPath, true) : newPath;\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the path has been set.\n */\ngoog.Uri.prototype.hasPath = function() {\n 'use strict';\n return !!this.path_;\n};\n\n\n/**\n * @return {boolean} Whether the query string has been set.\n */\ngoog.Uri.prototype.hasQuery = function() {\n 'use strict';\n return this.queryData_.toString() !== '';\n};\n\n\n/**\n * Sets the query data.\n * @param {goog.Uri.QueryData|string|undefined} queryData QueryData object.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * Applies only if queryData is a string.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setQueryData = function(queryData, opt_decode) {\n 'use strict';\n this.enforceReadOnly();\n\n if (queryData instanceof goog.Uri.QueryData) {\n this.queryData_ = queryData;\n this.queryData_.setIgnoreCase(this.ignoreCase_);\n } else {\n if (!opt_decode) {\n // QueryData accepts encoded query string, so encode it if\n // opt_decode flag is not true.\n queryData = goog.Uri.encodeSpecialChars_(\n queryData, goog.Uri.reDisallowedInQuery_);\n }\n this.queryData_ = new goog.Uri.QueryData(queryData, this.ignoreCase_);\n }\n\n return this;\n};\n\n\n/**\n * Sets the URI query.\n * @param {string} newQuery New query value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setQuery = function(newQuery, opt_decode) {\n 'use strict';\n return this.setQueryData(newQuery, opt_decode);\n};\n\n\n/**\n * @return {string} The encoded URI query, not including the ?.\n */\ngoog.Uri.prototype.getEncodedQuery = function() {\n 'use strict';\n return this.queryData_.toString();\n};\n\n\n/**\n * @return {string} The decoded URI query, not including the ?.\n */\ngoog.Uri.prototype.getDecodedQuery = function() {\n 'use strict';\n return this.queryData_.toDecodedString();\n};\n\n\n/**\n * Returns the query data.\n * @return {!goog.Uri.QueryData} QueryData object.\n */\ngoog.Uri.prototype.getQueryData = function() {\n 'use strict';\n return this.queryData_;\n};\n\n\n/**\n * @return {string} The encoded URI query, not including the ?.\n *\n * Warning: This method, unlike other getter methods, returns encoded\n * value, instead of decoded one.\n */\ngoog.Uri.prototype.getQuery = function() {\n 'use strict';\n return this.getEncodedQuery();\n};\n\n\n/**\n * Sets the value of the named query parameters, clearing previous values for\n * that key.\n *\n * @param {string} key The parameter to set.\n * @param {*} value The new value. Value does not need to be encoded.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setParameterValue = function(key, value) {\n 'use strict';\n this.enforceReadOnly();\n this.queryData_.set(key, value);\n return this;\n};\n\n\n/**\n * Sets the values of the named query parameters, clearing previous values for\n * that key. Not new values will currently be moved to the end of the query\n * string.\n *\n * So, <code>goog.Uri.parse('foo?a=b&c=d&e=f').setParameterValues('c', ['new'])\n * </code> yields <tt>foo?a=b&e=f&c=new</tt>.</p>\n *\n * @param {string} key The parameter to set.\n * @param {*} values The new values. If values is a single\n * string then it will be treated as the sole value. Values do not need to\n * be encoded.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setParameterValues = function(key, values) {\n 'use strict';\n this.enforceReadOnly();\n\n if (!Array.isArray(values)) {\n values = [String(values)];\n }\n\n this.queryData_.setValues(key, values);\n\n return this;\n};\n\n\n/**\n * Returns the value<b>s</b> for a given cgi parameter as a list of decoded\n * query parameter values.\n * @param {string} name The parameter to get values for.\n * @return {!Array<?>} The values for a given cgi parameter as a list of\n * decoded query parameter values.\n */\ngoog.Uri.prototype.getParameterValues = function(name) {\n 'use strict';\n return this.queryData_.getValues(name);\n};\n\n\n/**\n * Returns the first value for a given cgi parameter or undefined if the given\n * parameter name does not appear in the query string.\n * @param {string} paramName Unescaped parameter name.\n * @return {string|undefined} The first value for a given cgi parameter or\n * undefined if the given parameter name does not appear in the query\n * string.\n */\ngoog.Uri.prototype.getParameterValue = function(paramName) {\n 'use strict';\n return /** @type {string|undefined} */ (this.queryData_.get(paramName));\n};\n\n\n/**\n * @return {string} The URI fragment, not including the #.\n */\ngoog.Uri.prototype.getFragment = function() {\n 'use strict';\n return this.fragment_;\n};\n\n\n/**\n * Sets the URI fragment.\n * @throws URIError If opt_decode is true and newFragment is malformed (that is,\n * if decodeURIComponent fails).\n * @param {string} newFragment New fragment value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setFragment = function(newFragment, opt_decode) {\n 'use strict';\n this.enforceReadOnly();\n this.fragment_ =\n opt_decode ? goog.Uri.decodeOrEmpty_(newFragment) : newFragment;\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the URI has a fragment set.\n */\ngoog.Uri.prototype.hasFragment = function() {\n 'use strict';\n return !!this.fragment_;\n};\n\n\n/**\n * Returns true if this has the same domain as that of uri2.\n * @param {!goog.Uri} uri2 The URI object to compare to.\n * @return {boolean} true if same domain; false otherwise.\n */\ngoog.Uri.prototype.hasSameDomainAs = function(uri2) {\n 'use strict';\n return ((!this.hasDomain() && !uri2.hasDomain()) ||\n this.getDomain() == uri2.getDomain()) &&\n ((!this.hasPort() && !uri2.hasPort()) ||\n this.getPort() == uri2.getPort());\n};\n\n\n/**\n * Adds a random parameter to the Uri.\n * @return {!goog.Uri} Reference to this Uri object.\n */\ngoog.Uri.prototype.makeUnique = function() {\n 'use strict';\n this.enforceReadOnly();\n this.setParameterValue(goog.Uri.RANDOM_PARAM, goog.string.getRandomString());\n\n return this;\n};\n\n\n/**\n * Removes the named query parameter.\n *\n * @param {string} key The parameter to remove.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.removeParameter = function(key) {\n 'use strict';\n this.enforceReadOnly();\n this.queryData_.remove(key);\n return this;\n};\n\n\n/**\n * Sets whether Uri is read only. If this goog.Uri is read-only,\n * enforceReadOnly_ will be called at the start of any function that may modify\n * this Uri.\n * @param {boolean} isReadOnly whether this goog.Uri should be read only.\n * @return {!goog.Uri} Reference to this Uri object.\n */\ngoog.Uri.prototype.setReadOnly = function(isReadOnly) {\n 'use strict';\n this.isReadOnly_ = isReadOnly;\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the URI is read only.\n */\ngoog.Uri.prototype.isReadOnly = function() {\n 'use strict';\n return this.isReadOnly_;\n};\n\n\n/**\n * Checks if this Uri has been marked as read only, and if so, throws an error.\n * This should be called whenever any modifying function is called.\n */\ngoog.Uri.prototype.enforceReadOnly = function() {\n 'use strict';\n if (this.isReadOnly_) {\n throw new Error('Tried to modify a read-only Uri');\n }\n};\n\n\n/**\n * Sets whether to ignore case.\n * NOTE: If there are already key/value pairs in the QueryData, and\n * ignoreCase_ is set to false, the keys will all be lower-cased.\n * @param {boolean} ignoreCase whether this goog.Uri should ignore case.\n * @return {!goog.Uri} Reference to this Uri object.\n */\ngoog.Uri.prototype.setIgnoreCase = function(ignoreCase) {\n 'use strict';\n this.ignoreCase_ = ignoreCase;\n if (this.queryData_) {\n this.queryData_.setIgnoreCase(ignoreCase);\n }\n return this;\n};\n\n\n/**\n * @return {boolean} Whether to ignore case.\n */\ngoog.Uri.prototype.getIgnoreCase = function() {\n 'use strict';\n return this.ignoreCase_;\n};\n\n\n//==============================================================================\n// Static members\n//==============================================================================\n\n\n/**\n * Creates a uri from the string form. Basically an alias of new goog.Uri().\n * If a Uri object is passed to parse then it will return a clone of the object.\n *\n * @throws URIError If parsing the URI is malformed. The passed URI components\n * should all be parseable by decodeURIComponent.\n * @param {*} uri Raw URI string or instance of Uri\n * object.\n * @param {boolean=} opt_ignoreCase Whether to ignore the case of parameter\n * names in #getParameterValue.\n * @return {!goog.Uri} The new URI object.\n */\ngoog.Uri.parse = function(uri, opt_ignoreCase) {\n 'use strict';\n return uri instanceof goog.Uri ? uri.clone() :\n new goog.Uri(uri, opt_ignoreCase);\n};\n\n\n/**\n * Creates a new goog.Uri object from unencoded parts.\n *\n * @param {?string=} opt_scheme Scheme/protocol or full URI to parse.\n * @param {?string=} opt_userInfo username:password.\n * @param {?string=} opt_domain www.google.com.\n * @param {?number=} opt_port 9830.\n * @param {?string=} opt_path /some/path/to/a/file.html.\n * @param {string|goog.Uri.QueryData=} opt_query a=1&b=2.\n * @param {?string=} opt_fragment The fragment without the #.\n * @param {boolean=} opt_ignoreCase Whether to ignore parameter name case in\n * #getParameterValue.\n *\n * @return {!goog.Uri} The new URI object.\n */\ngoog.Uri.create = function(\n opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_query,\n opt_fragment, opt_ignoreCase) {\n 'use strict';\n var uri = new goog.Uri(null, opt_ignoreCase);\n\n // Only set the parts if they are defined and not empty strings.\n opt_scheme && uri.setScheme(opt_scheme);\n opt_userInfo && uri.setUserInfo(opt_userInfo);\n opt_domain && uri.setDomain(opt_domain);\n opt_port && uri.setPort(opt_port);\n opt_path && uri.setPath(opt_path);\n opt_query && uri.setQueryData(opt_query);\n opt_fragment && uri.setFragment(opt_fragment);\n\n return uri;\n};\n\n\n/**\n * Resolves a relative Uri against a base Uri, accepting both strings and\n * Uri objects.\n *\n * @param {*} base Base Uri.\n * @param {*} rel Relative Uri.\n * @return {!goog.Uri} Resolved uri.\n */\ngoog.Uri.resolve = function(base, rel) {\n 'use strict';\n if (!(base instanceof goog.Uri)) {\n base = goog.Uri.parse(base);\n }\n\n if (!(rel instanceof goog.Uri)) {\n rel = goog.Uri.parse(rel);\n }\n\n return base.resolve(rel);\n};\n\n\n/**\n * Removes dot segments in given path component, as described in\n * RFC 3986, section 5.2.4.\n *\n * @param {string} path A non-empty path component.\n * @return {string} Path component with removed dot segments.\n */\ngoog.Uri.removeDotSegments = function(path) {\n 'use strict';\n if (path == '..' || path == '.') {\n return '';\n\n } else if (\n !goog.string.contains(path, './') && !goog.string.contains(path, '/.')) {\n // This optimization detects uris which do not contain dot-segments,\n // and as a consequence do not require any processing.\n return path;\n\n } else {\n var leadingSlash = goog.string.startsWith(path, '/');\n var segments = path.split('/');\n var out = [];\n\n for (var pos = 0; pos < segments.length;) {\n var segment = segments[pos++];\n\n if (segment == '.') {\n if (leadingSlash && pos == segments.length) {\n out.push('');\n }\n } else if (segment == '..') {\n if (out.length > 1 || out.length == 1 && out[0] != '') {\n out.pop();\n }\n if (leadingSlash && pos == segments.length) {\n out.push('');\n }\n } else {\n out.push(segment);\n leadingSlash = true;\n }\n }\n\n return out.join('/');\n }\n};\n\n\n/**\n * Decodes a value or returns the empty string if it isn't defined or empty.\n * @throws URIError If decodeURIComponent fails to decode val.\n * @param {string|undefined} val Value to decode.\n * @param {boolean=} opt_preserveReserved If true, restricted characters will\n * not be decoded.\n * @return {string} Decoded value.\n * @private\n */\ngoog.Uri.decodeOrEmpty_ = function(val, opt_preserveReserved) {\n 'use strict';\n // Don't use UrlDecode() here because val is not a query parameter.\n if (!val) {\n return '';\n }\n\n // decodeURI has the same output for '%2f' and '%252f'. We double encode %25\n // so that we can distinguish between the 2 inputs. This is later undone by\n // removeDoubleEncoding_.\n return opt_preserveReserved ? decodeURI(val.replace(/%25/g, '%2525')) :\n decodeURIComponent(val);\n};\n\n\n/**\n * If unescapedPart is non null, then escapes any characters in it that aren't\n * valid characters in a url and also escapes any special characters that\n * appear in extra.\n *\n * @param {*} unescapedPart The string to encode.\n * @param {RegExp} extra A character set of characters in [\\01-\\177].\n * @param {boolean=} opt_removeDoubleEncoding If true, remove double percent\n * encoding.\n * @return {?string} null iff unescapedPart == null.\n * @private\n */\ngoog.Uri.encodeSpecialChars_ = function(\n unescapedPart, extra, opt_removeDoubleEncoding) {\n 'use strict';\n if (typeof unescapedPart === 'string') {\n var encoded = encodeURI(unescapedPart).replace(extra, goog.Uri.encodeChar_);\n if (opt_removeDoubleEncoding) {\n // encodeURI double-escapes %XX sequences used to represent restricted\n // characters in some URI components, remove the double escaping here.\n encoded = goog.Uri.removeDoubleEncoding_(encoded);\n }\n return encoded;\n }\n return null;\n};\n\n\n/**\n * Converts a character in [\\01-\\177] to its unicode character equivalent.\n * @param {string} ch One character string.\n * @return {string} Encoded string.\n * @private\n */\ngoog.Uri.encodeChar_ = function(ch) {\n 'use strict';\n var n = ch.charCodeAt(0);\n return '%' + ((n >> 4) & 0xf).toString(16) + (n & 0xf).toString(16);\n};\n\n\n/**\n * Removes double percent-encoding from a string.\n * @param {string} doubleEncodedString String\n * @return {string} String with double encoding removed.\n * @private\n */\ngoog.Uri.removeDoubleEncoding_ = function(doubleEncodedString) {\n 'use strict';\n return doubleEncodedString.replace(/%25([0-9a-fA-F]{2})/g, '%$1');\n};\n\n\n/**\n * Regular expression for characters that are disallowed in the scheme or\n * userInfo part of the URI.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInSchemeOrUserInfo_ = /[#\\/\\?@]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in a relative path.\n * Colon is included due to RFC 3986 3.3.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInRelativePath_ = /[\\#\\?:]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in an absolute path.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInAbsolutePath_ = /[\\#\\?]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in the query.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInQuery_ = /[\\#\\?@]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in the fragment.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInFragment_ = /#/g;\n\n\n/**\n * Checks whether two URIs have the same domain.\n * @param {string} uri1String First URI string.\n * @param {string} uri2String Second URI string.\n * @return {boolean} true if the two URIs have the same domain; false otherwise.\n */\ngoog.Uri.haveSameDomain = function(uri1String, uri2String) {\n 'use strict';\n // Differs from goog.uri.utils.haveSameDomain, since this ignores scheme.\n // TODO(gboyer): Have this just call goog.uri.util.haveSameDomain.\n var pieces1 = goog.uri.utils.split(uri1String);\n var pieces2 = goog.uri.utils.split(uri2String);\n return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] ==\n pieces2[goog.uri.utils.ComponentIndex.DOMAIN] &&\n pieces1[goog.uri.utils.ComponentIndex.PORT] ==\n pieces2[goog.uri.utils.ComponentIndex.PORT];\n};\n\n\n\n/**\n * Class used to represent URI query parameters. It is essentially a hash of\n * name-value pairs, though a name can be present more than once.\n *\n * Has the same interface as the collections in goog.structs.\n *\n * @param {?string=} opt_query Optional encoded query string to parse into\n * the object.\n * @param {boolean=} opt_ignoreCase If true, ignore the case of the parameter\n * name in #get.\n * @constructor\n * @struct\n * @final\n */\ngoog.Uri.QueryData = function(opt_query, opt_ignoreCase) {\n 'use strict';\n /**\n * The map containing name/value or name/array-of-values pairs.\n * May be null if it requires parsing from the query string.\n *\n * We need to use a Map because we cannot guarantee that the key names will\n * not be problematic for IE.\n *\n * @private {?goog.structs.Map<string, !Array<*>>}\n */\n this.keyMap_ = null;\n\n /**\n * The number of params, or null if it requires computing.\n * @private {?number}\n */\n this.count_ = null;\n\n /**\n * Encoded query string, or null if it requires computing from the key map.\n * @private {?string}\n */\n this.encodedQuery_ = opt_query || null;\n\n /**\n * If true, ignore the case of the parameter name in #get.\n * @private {boolean}\n */\n this.ignoreCase_ = !!opt_ignoreCase;\n};\n\n\n/**\n * If the underlying key map is not yet initialized, it parses the\n * query string and fills the map with parsed data.\n * @private\n */\ngoog.Uri.QueryData.prototype.ensureKeyMapInitialized_ = function() {\n 'use strict';\n if (!this.keyMap_) {\n this.keyMap_ = new goog.structs.Map();\n this.count_ = 0;\n if (this.encodedQuery_) {\n var self = this;\n goog.uri.utils.parseQueryData(this.encodedQuery_, function(name, value) {\n 'use strict';\n self.add(goog.string.urlDecode(name), value);\n });\n }\n }\n};\n\n\n/**\n * Creates a new query data instance from a map of names and values.\n *\n * @param {!goog.structs.Map<string, ?>|!Object} map Map of string parameter\n * names to parameter value. If parameter value is an array, it is\n * treated as if the key maps to each individual value in the\n * array.\n * @param {boolean=} opt_ignoreCase If true, ignore the case of the parameter\n * name in #get.\n * @return {!goog.Uri.QueryData} The populated query data instance.\n */\ngoog.Uri.QueryData.createFromMap = function(map, opt_ignoreCase) {\n 'use strict';\n var keys = goog.structs.getKeys(map);\n if (typeof keys == 'undefined') {\n throw new Error('Keys are undefined');\n }\n\n var queryData = new goog.Uri.QueryData(null, opt_ignoreCase);\n var values = goog.structs.getValues(map);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = values[i];\n if (!Array.isArray(value)) {\n queryData.add(key, value);\n } else {\n queryData.setValues(key, value);\n }\n }\n return queryData;\n};\n\n\n/**\n * Creates a new query data instance from parallel arrays of parameter names\n * and values. Allows for duplicate parameter names. Throws an error if the\n * lengths of the arrays differ.\n *\n * @param {!Array<string>} keys Parameter names.\n * @param {!Array<?>} values Parameter values.\n * @param {boolean=} opt_ignoreCase If true, ignore the case of the parameter\n * name in #get.\n * @return {!goog.Uri.QueryData} The populated query data instance.\n */\ngoog.Uri.QueryData.createFromKeysValues = function(\n keys, values, opt_ignoreCase) {\n 'use strict';\n if (keys.length != values.length) {\n throw new Error('Mismatched lengths for keys/values');\n }\n var queryData = new goog.Uri.QueryData(null, opt_ignoreCase);\n for (var i = 0; i < keys.length; i++) {\n queryData.add(keys[i], values[i]);\n }\n return queryData;\n};\n\n\n/**\n * @return {?number} The number of parameters.\n */\ngoog.Uri.QueryData.prototype.getCount = function() {\n 'use strict';\n this.ensureKeyMapInitialized_();\n return this.count_;\n};\n\n\n/**\n * Adds a key value pair.\n * @param {string} key Name.\n * @param {*} value Value.\n * @return {!goog.Uri.QueryData} Instance of this object.\n */\ngoog.Uri.QueryData.prototype.add = function(key, value) {\n 'use strict';\n this.ensureKeyMapInitialized_();\n this.invalidateCache_();\n\n key = this.getKeyName_(key);\n var values = this.keyMap_.get(key);\n if (!values) {\n this.keyMap_.set(key, (values = []));\n }\n values.push(value);\n this.count_ = goog.asserts.assertNumber(this.count_) + 1;\n return this;\n};\n\n\n/**\n * Removes all the params with the given key.\n * @param {string} key Name.\n * @return {boolean} Whether any parameter was removed.\n */\ngoog.Uri.QueryData.prototype.remove = function(key) {\n 'use strict';\n this.ensureKeyMapInitialized_();\n\n key = this.getKeyName_(key);\n if (this.keyMap_.containsKey(key)) {\n this.invalidateCache_();\n\n // Decrement parameter count.\n this.count_ =\n goog.asserts.assertNumber(this.count_) - this.keyMap_.get(key).length;\n return this.keyMap_.remove(key);\n }\n return false;\n};\n\n\n/**\n * Clears the parameters.\n */\ngoog.Uri.QueryData.prototype.clear = function() {\n 'use strict';\n this.invalidateCache_();\n this.keyMap_ = null;\n this.count_ = 0;\n};\n\n\n/**\n * @return {boolean} Whether we have any parameters.\n */\ngoog.Uri.QueryData.prototype.isEmpty = function() {\n 'use strict';\n this.ensureKeyMapInitialized_();\n return this.count_ == 0;\n};\n\n\n/**\n * Whether there is a parameter with the given name\n * @param {string} key The parameter name to check for.\n * @return {boolean} Whether there is a parameter with the given name.\n */\ngoog.Uri.QueryData.prototype.containsKey = function(key) {\n 'use strict';\n this.ensureKeyMapInitialized_();\n key = this.getKeyName_(key);\n return this.keyMap_.containsKey(key);\n};\n\n\n/**\n * Whether there is a parameter with the given value.\n * @param {*} value The value to check for.\n * @return {boolean} Whether there is a parameter with the given value.\n */\ngoog.Uri.QueryData.prototype.containsValue = function(value) {\n 'use strict';\n // NOTE(arv): This solution goes through all the params even if it was the\n // first param. We can get around this by not reusing code or by switching to\n // iterators.\n var vals = this.getValues();\n return goog.array.contains(vals, value);\n};\n\n\n/**\n * Runs a callback on every key-value pair in the map, including duplicate keys.\n * This won't maintain original order when duplicate keys are interspersed (like\n * getKeys() / getValues()).\n * @param {function(this:SCOPE, ?, string, !goog.Uri.QueryData)} f\n * @param {SCOPE=} opt_scope The value of \"this\" inside f.\n * @template SCOPE\n */\ngoog.Uri.QueryData.prototype.forEach = function(f, opt_scope) {\n 'use strict';\n this.ensureKeyMapInitialized_();\n this.keyMap_.forEach(function(values, key) {\n 'use strict';\n goog.array.forEach(values, function(value) {\n 'use strict';\n f.call(opt_scope, value, key, this);\n }, this);\n }, this);\n};\n\n\n/**\n * Returns all the keys of the parameters. If a key is used multiple times\n * it will be included multiple times in the returned array\n * @return {!Array<string>} All the keys of the parameters.\n */\ngoog.Uri.QueryData.prototype.getKeys = function() {\n 'use strict';\n this.ensureKeyMapInitialized_();\n // We need to get the values to know how many keys to add.\n var vals = this.keyMap_.getValues();\n var keys = this.keyMap_.getKeys();\n var rv = [];\n for (var i = 0; i < keys.length; i++) {\n var val = vals[i];\n for (var j = 0; j < val.length; j++) {\n rv.push(keys[i]);\n }\n }\n return rv;\n};\n\n\n/**\n * Returns all the values of the parameters with the given name. If the query\n * data has no such key this will return an empty array. If no key is given\n * all values wil be returned.\n * @param {string=} opt_key The name of the parameter to get the values for.\n * @return {!Array<?>} All the values of the parameters with the given name.\n */\ngoog.Uri.QueryData.prototype.getValues = function(opt_key) {\n 'use strict';\n this.ensureKeyMapInitialized_();\n var rv = [];\n if (typeof opt_key === 'string') {\n if (this.containsKey(opt_key)) {\n rv = goog.array.concat(rv, this.keyMap_.get(this.getKeyName_(opt_key)));\n }\n } else {\n // Return all values.\n var values = this.keyMap_.getValues();\n for (var i = 0; i < values.length; i++) {\n rv = goog.array.concat(rv, values[i]);\n }\n }\n return rv;\n};\n\n\n/**\n * Sets a key value pair and removes all other keys with the same value.\n *\n * @param {string} key Name.\n * @param {*} value Value.\n * @return {!goog.Uri.QueryData} Instance of this object.\n */\ngoog.Uri.QueryData.prototype.set = function(key, value) {\n 'use strict';\n this.ensureKeyMapInitialized_();\n this.invalidateCache_();\n\n // TODO(chrishenry): This could be better written as\n // this.remove(key), this.add(key, value), but that would reorder\n // the key (since the key is first removed and then added at the\n // end) and we would have to fix unit tests that depend on key\n // ordering.\n key = this.getKeyName_(key);\n if (this.containsKey(key)) {\n this.count_ =\n goog.asserts.assertNumber(this.count_) - this.keyMap_.get(key).length;\n }\n this.keyMap_.set(key, [value]);\n this.count_ = goog.asserts.assertNumber(this.count_) + 1;\n return this;\n};\n\n\n/**\n * Returns the first value associated with the key. If the query data has no\n * such key this will return undefined or the optional default.\n * @param {string} key The name of the parameter to get the value for.\n * @param {*=} opt_default The default value to return if the query data\n * has no such key.\n * @return {*} The first string value associated with the key, or opt_default\n * if there's no value.\n */\ngoog.Uri.QueryData.prototype.get = function(key, opt_default) {\n 'use strict';\n if (!key) {\n return opt_default;\n }\n var values = this.getValues(key);\n return values.length > 0 ? String(values[0]) : opt_default;\n};\n\n\n/**\n * Sets the values for a key. If the key already exists, this will\n * override all of the existing values that correspond to the key.\n * @param {string} key The key to set values for.\n * @param {!Array<?>} values The values to set.\n */\ngoog.Uri.QueryData.prototype.setValues = function(key, values) {\n 'use strict';\n this.remove(key);\n\n if (values.length > 0) {\n this.invalidateCache_();\n this.keyMap_.set(this.getKeyName_(key), goog.array.clone(values));\n this.count_ = goog.asserts.assertNumber(this.count_) + values.length;\n }\n};\n\n\n/**\n * @return {string} Encoded query string.\n * @override\n */\ngoog.Uri.QueryData.prototype.toString = function() {\n 'use strict';\n if (this.encodedQuery_) {\n return this.encodedQuery_;\n }\n\n if (!this.keyMap_) {\n return '';\n }\n\n var sb = [];\n\n // In the past, we use this.getKeys() and this.getVals(), but that\n // generates a lot of allocations as compared to simply iterating\n // over the keys.\n var keys = this.keyMap_.getKeys();\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var encodedKey = goog.string.urlEncode(key);\n var val = this.getValues(key);\n for (var j = 0; j < val.length; j++) {\n var param = encodedKey;\n // Ensure that null and undefined are encoded into the url as\n // literal strings.\n if (val[j] !== '') {\n param += '=' + goog.string.urlEncode(val[j]);\n }\n sb.push(param);\n }\n }\n\n return this.encodedQuery_ = sb.join('&');\n};\n\n\n/**\n * @throws URIError If URI is malformed (that is, if decodeURIComponent fails on\n * any of the URI components).\n * @return {string} Decoded query string.\n */\ngoog.Uri.QueryData.prototype.toDecodedString = function() {\n 'use strict';\n return goog.Uri.decodeOrEmpty_(this.toString());\n};\n\n\n/**\n * Invalidate the cache.\n * @private\n */\ngoog.Uri.QueryData.prototype.invalidateCache_ = function() {\n 'use strict';\n this.encodedQuery_ = null;\n};\n\n\n/**\n * Removes all keys that are not in the provided list. (Modifies this object.)\n * @param {Array<string>} keys The desired keys.\n * @return {!goog.Uri.QueryData} a reference to this object.\n */\ngoog.Uri.QueryData.prototype.filterKeys = function(keys) {\n 'use strict';\n this.ensureKeyMapInitialized_();\n this.keyMap_.forEach(function(value, key) {\n 'use strict';\n if (!goog.array.contains(keys, key)) {\n this.remove(key);\n }\n }, this);\n return this;\n};\n\n\n/**\n * Clone the query data instance.\n * @return {!goog.Uri.QueryData} New instance of the QueryData object.\n */\ngoog.Uri.QueryData.prototype.clone = function() {\n 'use strict';\n var rv = new goog.Uri.QueryData();\n rv.encodedQuery_ = this.encodedQuery_;\n if (this.keyMap_) {\n rv.keyMap_ = this.keyMap_.clone();\n rv.count_ = this.count_;\n }\n return rv;\n};\n\n\n/**\n * Helper function to get the key name from a JavaScript object. Converts\n * the object to a string, and to lower case if necessary.\n * @private\n * @param {*} arg The object to get a key name from.\n * @return {string} valid key name which can be looked up in #keyMap_.\n */\ngoog.Uri.QueryData.prototype.getKeyName_ = function(arg) {\n 'use strict';\n var keyName = String(arg);\n if (this.ignoreCase_) {\n keyName = keyName.toLowerCase();\n }\n return keyName;\n};\n\n\n/**\n * Ignore case in parameter names.\n * NOTE: If there are already key/value pairs in the QueryData, and\n * ignoreCase_ is set to false, the keys will all be lower-cased.\n * @param {boolean} ignoreCase whether this goog.Uri should ignore case.\n */\ngoog.Uri.QueryData.prototype.setIgnoreCase = function(ignoreCase) {\n 'use strict';\n var resetKeys = ignoreCase && !this.ignoreCase_;\n if (resetKeys) {\n this.ensureKeyMapInitialized_();\n this.invalidateCache_();\n this.keyMap_.forEach(function(value, key) {\n 'use strict';\n var lowerCase = key.toLowerCase();\n if (key != lowerCase) {\n this.remove(key);\n this.setValues(lowerCase, value);\n }\n }, this);\n }\n this.ignoreCase_ = ignoreCase;\n};\n\n\n/**\n * Extends a query data object with another query data or map like object. This\n * operates 'in-place', it does not create a new QueryData object.\n *\n * @param {...(?goog.Uri.QueryData|?goog.structs.Map<?, ?>|?Object)} var_args\n * The object from which key value pairs will be copied. Note: does not\n * accept null.\n * @suppress {deprecated} Use deprecated goog.structs.forEach to allow different\n * types of parameters.\n */\ngoog.Uri.QueryData.prototype.extend = function(var_args) {\n 'use strict';\n for (var i = 0; i < arguments.length; i++) {\n var data = arguments[i];\n goog.structs.forEach(data, function(value, key) {\n 'use strict';\n this.add(key, value);\n }, this);\n }\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Utilities for string manipulation.\n */\n\n\n/**\n * Namespace for string utilities\n */\ngoog.provide('goog.string');\ngoog.provide('goog.string.Unicode');\n\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.string.Const');\ngoog.require('goog.string.internal');\n\n\n/**\n * @define {boolean} Enables HTML escaping of lowercase letter \"e\" which helps\n * with detection of double-escaping as this letter is frequently used.\n */\ngoog.string.DETECT_DOUBLE_ESCAPING =\n goog.define('goog.string.DETECT_DOUBLE_ESCAPING', false);\n\n\n/**\n * @define {boolean} Whether to force non-dom html unescaping.\n */\ngoog.string.FORCE_NON_DOM_HTML_UNESCAPING =\n goog.define('goog.string.FORCE_NON_DOM_HTML_UNESCAPING', false);\n\n\n/**\n * Common Unicode string characters.\n * @enum {string}\n */\ngoog.string.Unicode = {\n NBSP: '\\xa0'\n};\n\n\n/**\n * Fast prefix-checker.\n * @param {string} str The string to check.\n * @param {string} prefix A string to look for at the start of `str`.\n * @return {boolean} True if `str` begins with `prefix`.\n */\ngoog.string.startsWith = goog.string.internal.startsWith;\n\n\n/**\n * Fast suffix-checker.\n * @param {string} str The string to check.\n * @param {string} suffix A string to look for at the end of `str`.\n * @return {boolean} True if `str` ends with `suffix`.\n */\ngoog.string.endsWith = goog.string.internal.endsWith;\n\n\n/**\n * Case-insensitive prefix-checker.\n * @param {string} str The string to check.\n * @param {string} prefix A string to look for at the end of `str`.\n * @return {boolean} True if `str` begins with `prefix` (ignoring\n * case).\n */\ngoog.string.caseInsensitiveStartsWith =\n goog.string.internal.caseInsensitiveStartsWith;\n\n\n/**\n * Case-insensitive suffix-checker.\n * @param {string} str The string to check.\n * @param {string} suffix A string to look for at the end of `str`.\n * @return {boolean} True if `str` ends with `suffix` (ignoring\n * case).\n */\ngoog.string.caseInsensitiveEndsWith =\n goog.string.internal.caseInsensitiveEndsWith;\n\n\n/**\n * Case-insensitive equality checker.\n * @param {string} str1 First string to check.\n * @param {string} str2 Second string to check.\n * @return {boolean} True if `str1` and `str2` are the same string,\n * ignoring case.\n */\ngoog.string.caseInsensitiveEquals = goog.string.internal.caseInsensitiveEquals;\n\n\n/**\n * Does simple python-style string substitution.\n * subs(\"foo%s hot%s\", \"bar\", \"dog\") becomes \"foobar hotdog\".\n * @param {string} str The string containing the pattern.\n * @param {...*} var_args The items to substitute into the pattern.\n * @return {string} A copy of `str` in which each occurrence of\n * {@code %s} has been replaced an argument from `var_args`.\n */\ngoog.string.subs = function(str, var_args) {\n 'use strict';\n const splitParts = str.split('%s');\n let returnString = '';\n\n const subsArguments = Array.prototype.slice.call(arguments, 1);\n while (subsArguments.length &&\n // Replace up to the last split part. We are inserting in the\n // positions between split parts.\n splitParts.length > 1) {\n returnString += splitParts.shift() + subsArguments.shift();\n }\n\n return returnString + splitParts.join('%s'); // Join unused '%s'\n};\n\n\n/**\n * Converts multiple whitespace chars (spaces, non-breaking-spaces, new lines\n * and tabs) to a single space, and strips leading and trailing whitespace.\n * @param {string} str Input string.\n * @return {string} A copy of `str` with collapsed whitespace.\n */\ngoog.string.collapseWhitespace = function(str) {\n 'use strict';\n // Since IE doesn't include non-breaking-space (0xa0) in their \\s character\n // class (as required by section 7.2 of the ECMAScript spec), we explicitly\n // include it in the regexp to enforce consistent cross-browser behavior.\n return str.replace(/[\\s\\xa0]+/g, ' ').replace(/^\\s+|\\s+$/g, '');\n};\n\n\n/**\n * Checks if a string is empty or contains only whitespaces.\n * @param {string} str The string to check.\n * @return {boolean} Whether `str` is empty or whitespace only.\n */\ngoog.string.isEmptyOrWhitespace = goog.string.internal.isEmptyOrWhitespace;\n\n\n/**\n * Checks if a string is empty.\n * @param {string} str The string to check.\n * @return {boolean} Whether `str` is empty.\n */\ngoog.string.isEmptyString = function(str) {\n 'use strict';\n return str.length == 0;\n};\n\n\n/**\n * Checks if a string is empty or contains only whitespaces.\n *\n * @param {string} str The string to check.\n * @return {boolean} Whether `str` is empty or whitespace only.\n * @deprecated Use goog.string.isEmptyOrWhitespace instead.\n */\ngoog.string.isEmpty = goog.string.isEmptyOrWhitespace;\n\n\n/**\n * Checks if a string is null, undefined, empty or contains only whitespaces.\n * @param {*} str The string to check.\n * @return {boolean} Whether `str` is null, undefined, empty, or\n * whitespace only.\n * @deprecated Use goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str))\n * instead.\n */\ngoog.string.isEmptyOrWhitespaceSafe = function(str) {\n 'use strict';\n return goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str));\n};\n\n\n/**\n * Checks if a string is null, undefined, empty or contains only whitespaces.\n *\n * @param {*} str The string to check.\n * @return {boolean} Whether `str` is null, undefined, empty, or\n * whitespace only.\n * @deprecated Use goog.string.isEmptyOrWhitespace instead.\n */\ngoog.string.isEmptySafe = goog.string.isEmptyOrWhitespaceSafe;\n\n\n/**\n * Checks if a string is all breaking whitespace.\n * @param {string} str The string to check.\n * @return {boolean} Whether the string is all breaking whitespace.\n */\ngoog.string.isBreakingWhitespace = function(str) {\n 'use strict';\n return !/[^\\t\\n\\r ]/.test(str);\n};\n\n\n/**\n * Checks if a string contains all letters.\n * @param {string} str string to check.\n * @return {boolean} True if `str` consists entirely of letters.\n */\ngoog.string.isAlpha = function(str) {\n 'use strict';\n return !/[^a-zA-Z]/.test(str);\n};\n\n\n/**\n * Checks if a string contains only numbers.\n * @param {*} str string to check. If not a string, it will be\n * casted to one.\n * @return {boolean} True if `str` is numeric.\n */\ngoog.string.isNumeric = function(str) {\n 'use strict';\n return !/[^0-9]/.test(str);\n};\n\n\n/**\n * Checks if a string contains only numbers or letters.\n * @param {string} str string to check.\n * @return {boolean} True if `str` is alphanumeric.\n */\ngoog.string.isAlphaNumeric = function(str) {\n 'use strict';\n return !/[^a-zA-Z0-9]/.test(str);\n};\n\n\n/**\n * Checks if a character is a space character.\n * @param {string} ch Character to check.\n * @return {boolean} True if `ch` is a space.\n */\ngoog.string.isSpace = function(ch) {\n 'use strict';\n return ch == ' ';\n};\n\n\n/**\n * Checks if a character is a valid unicode character.\n * @param {string} ch Character to check.\n * @return {boolean} True if `ch` is a valid unicode character.\n */\ngoog.string.isUnicodeChar = function(ch) {\n 'use strict';\n return ch.length == 1 && ch >= ' ' && ch <= '~' ||\n ch >= '\\u0080' && ch <= '\\uFFFD';\n};\n\n\n/**\n * Takes a string and replaces newlines with a space. Multiple lines are\n * replaced with a single space.\n * @param {string} str The string from which to strip newlines.\n * @return {string} A copy of `str` stripped of newlines.\n */\ngoog.string.stripNewlines = function(str) {\n 'use strict';\n return str.replace(/(\\r\\n|\\r|\\n)+/g, ' ');\n};\n\n\n/**\n * Replaces Windows and Mac new lines with unix style: \\r or \\r\\n with \\n.\n * @param {string} str The string to in which to canonicalize newlines.\n * @return {string} `str` A copy of {@code} with canonicalized newlines.\n */\ngoog.string.canonicalizeNewlines = function(str) {\n 'use strict';\n return str.replace(/(\\r\\n|\\r|\\n)/g, '\\n');\n};\n\n\n/**\n * Normalizes whitespace in a string, replacing all whitespace chars with\n * a space.\n * @param {string} str The string in which to normalize whitespace.\n * @return {string} A copy of `str` with all whitespace normalized.\n */\ngoog.string.normalizeWhitespace = function(str) {\n 'use strict';\n return str.replace(/\\xa0|\\s/g, ' ');\n};\n\n\n/**\n * Normalizes spaces in a string, replacing all consecutive spaces and tabs\n * with a single space. Replaces non-breaking space with a space.\n * @param {string} str The string in which to normalize spaces.\n * @return {string} A copy of `str` with all consecutive spaces and tabs\n * replaced with a single space.\n */\ngoog.string.normalizeSpaces = function(str) {\n 'use strict';\n return str.replace(/\\xa0|[ \\t]+/g, ' ');\n};\n\n\n/**\n * Removes the breaking spaces from the left and right of the string and\n * collapses the sequences of breaking spaces in the middle into single spaces.\n * The original and the result strings render the same way in HTML.\n * @param {string} str A string in which to collapse spaces.\n * @return {string} Copy of the string with normalized breaking spaces.\n */\ngoog.string.collapseBreakingSpaces = function(str) {\n 'use strict';\n return str.replace(/[\\t\\r\\n ]+/g, ' ')\n .replace(/^[\\t\\r\\n ]+|[\\t\\r\\n ]+$/g, '');\n};\n\n\n/**\n * Trims white spaces to the left and right of a string.\n * @param {string} str The string to trim.\n * @return {string} A trimmed copy of `str`.\n */\ngoog.string.trim = goog.string.internal.trim;\n\n\n/**\n * Trims whitespaces at the left end of a string.\n * @param {string} str The string to left trim.\n * @return {string} A trimmed copy of `str`.\n */\ngoog.string.trimLeft = function(str) {\n 'use strict';\n // Since IE doesn't include non-breaking-space (0xa0) in their \\s character\n // class (as required by section 7.2 of the ECMAScript spec), we explicitly\n // include it in the regexp to enforce consistent cross-browser behavior.\n return str.replace(/^[\\s\\xa0]+/, '');\n};\n\n\n/**\n * Trims whitespaces at the right end of a string.\n * @param {string} str The string to right trim.\n * @return {string} A trimmed copy of `str`.\n */\ngoog.string.trimRight = function(str) {\n 'use strict';\n // Since IE doesn't include non-breaking-space (0xa0) in their \\s character\n // class (as required by section 7.2 of the ECMAScript spec), we explicitly\n // include it in the regexp to enforce consistent cross-browser behavior.\n return str.replace(/[\\s\\xa0]+$/, '');\n};\n\n\n/**\n * A string comparator that ignores case.\n * -1 = str1 less than str2\n * 0 = str1 equals str2\n * 1 = str1 greater than str2\n *\n * @param {string} str1 The string to compare.\n * @param {string} str2 The string to compare `str1` to.\n * @return {number} The comparator result, as described above.\n */\ngoog.string.caseInsensitiveCompare =\n goog.string.internal.caseInsensitiveCompare;\n\n\n/**\n * Compares two strings interpreting their numeric substrings as numbers.\n *\n * @param {string} str1 First string.\n * @param {string} str2 Second string.\n * @param {!RegExp} tokenizerRegExp Splits a string into substrings of\n * non-negative integers, non-numeric characters and optionally fractional\n * numbers starting with a decimal point.\n * @return {number} Negative if str1 < str2, 0 is str1 == str2, positive if\n * str1 > str2.\n * @private\n */\ngoog.string.numberAwareCompare_ = function(str1, str2, tokenizerRegExp) {\n 'use strict';\n if (str1 == str2) {\n return 0;\n }\n if (!str1) {\n return -1;\n }\n if (!str2) {\n return 1;\n }\n\n // Using match to split the entire string ahead of time turns out to be faster\n // for most inputs than using RegExp.exec or iterating over each character.\n const tokens1 = str1.toLowerCase().match(tokenizerRegExp);\n const tokens2 = str2.toLowerCase().match(tokenizerRegExp);\n\n const count = Math.min(tokens1.length, tokens2.length);\n\n for (let i = 0; i < count; i++) {\n const a = tokens1[i];\n const b = tokens2[i];\n\n // Compare pairs of tokens, returning if one token sorts before the other.\n if (a != b) {\n // Only if both tokens are integers is a special comparison required.\n // Decimal numbers are sorted as strings (e.g., '.09' < '.1').\n const num1 = parseInt(a, 10);\n if (!isNaN(num1)) {\n const num2 = parseInt(b, 10);\n if (!isNaN(num2) && num1 - num2) {\n return num1 - num2;\n }\n }\n return a < b ? -1 : 1;\n }\n }\n\n // If one string is a substring of the other, the shorter string sorts first.\n if (tokens1.length != tokens2.length) {\n return tokens1.length - tokens2.length;\n }\n\n // The two strings must be equivalent except for case (perfect equality is\n // tested at the head of the function.) Revert to default ASCII string\n // comparison to stabilize the sort.\n return str1 < str2 ? -1 : 1;\n};\n\n\n/**\n * String comparison function that handles non-negative integer numbers in a\n * way humans might expect. Using this function, the string 'File 2.jpg' sorts\n * before 'File 10.jpg', and 'Version 1.9' before 'Version 1.10'. The comparison\n * is mostly case-insensitive, though strings that are identical except for case\n * are sorted with the upper-case strings before lower-case.\n *\n * This comparison function is up to 50x slower than either the default or the\n * case-insensitive compare. It should not be used in time-critical code, but\n * should be fast enough to sort several hundred short strings (like filenames)\n * with a reasonable delay.\n *\n * @param {string} str1 The string to compare in a numerically sensitive way.\n * @param {string} str2 The string to compare `str1` to.\n * @return {number} less than 0 if str1 < str2, 0 if str1 == str2, greater than\n * 0 if str1 > str2.\n */\ngoog.string.intAwareCompare = function(str1, str2) {\n 'use strict';\n return goog.string.numberAwareCompare_(str1, str2, /\\d+|\\D+/g);\n};\n\n\n/**\n * String comparison function that handles non-negative integer and fractional\n * numbers in a way humans might expect. Using this function, the string\n * 'File 2.jpg' sorts before 'File 10.jpg', and '3.14' before '3.2'. Equivalent\n * to {@link goog.string.intAwareCompare} apart from the way how it interprets\n * dots.\n *\n * @param {string} str1 The string to compare in a numerically sensitive way.\n * @param {string} str2 The string to compare `str1` to.\n * @return {number} less than 0 if str1 < str2, 0 if str1 == str2, greater than\n * 0 if str1 > str2.\n */\ngoog.string.floatAwareCompare = function(str1, str2) {\n 'use strict';\n return goog.string.numberAwareCompare_(str1, str2, /\\d+|\\.\\d+|\\D+/g);\n};\n\n\n/**\n * Alias for {@link goog.string.floatAwareCompare}.\n *\n * @param {string} str1\n * @param {string} str2\n * @return {number}\n */\ngoog.string.numerateCompare = goog.string.floatAwareCompare;\n\n\n/**\n * URL-encodes a string\n * @param {*} str The string to url-encode.\n * @return {string} An encoded copy of `str` that is safe for urls.\n * Note that '#', ':', and other characters used to delimit portions\n * of URLs *will* be encoded.\n */\ngoog.string.urlEncode = function(str) {\n 'use strict';\n return encodeURIComponent(String(str));\n};\n\n\n/**\n * URL-decodes the string. We need to specially handle '+'s because\n * the javascript library doesn't convert them to spaces.\n * @param {string} str The string to url decode.\n * @return {string} The decoded `str`.\n */\ngoog.string.urlDecode = function(str) {\n 'use strict';\n return decodeURIComponent(str.replace(/\\+/g, ' '));\n};\n\n\n/**\n * Converts \\n to <br>s or <br />s.\n * @param {string} str The string in which to convert newlines.\n * @param {boolean=} opt_xml Whether to use XML compatible tags.\n * @return {string} A copy of `str` with converted newlines.\n */\ngoog.string.newLineToBr = goog.string.internal.newLineToBr;\n\n\n/**\n * Escapes double quote '\"' and single quote '\\'' characters in addition to\n * '&', '<', and '>' so that a string can be included in an HTML tag attribute\n * value within double or single quotes.\n *\n * It should be noted that > doesn't need to be escaped for the HTML or XML to\n * be valid, but it has been decided to escape it for consistency with other\n * implementations.\n *\n * With goog.string.DETECT_DOUBLE_ESCAPING, this function escapes also the\n * lowercase letter \"e\".\n *\n * NOTE(user):\n * HtmlEscape is often called during the generation of large blocks of HTML.\n * Using statics for the regular expressions and strings is an optimization\n * that can more than half the amount of time IE spends in this function for\n * large apps, since strings and regexes both contribute to GC allocations.\n *\n * Testing for the presence of a character before escaping increases the number\n * of function calls, but actually provides a speed increase for the average\n * case -- since the average case often doesn't require the escaping of all 4\n * characters and indexOf() is much cheaper than replace().\n * The worst case does suffer slightly from the additional calls, therefore the\n * opt_isLikelyToContainHtmlChars option has been included for situations\n * where all 4 HTML entities are very likely to be present and need escaping.\n *\n * Some benchmarks (times tended to fluctuate +-0.05ms):\n * FireFox IE6\n * (no chars / average (mix of cases) / all 4 chars)\n * no checks 0.13 / 0.22 / 0.22 0.23 / 0.53 / 0.80\n * indexOf 0.08 / 0.17 / 0.26 0.22 / 0.54 / 0.84\n * indexOf + re test 0.07 / 0.17 / 0.28 0.19 / 0.50 / 0.85\n *\n * An additional advantage of checking if replace actually needs to be called\n * is a reduction in the number of object allocations, so as the size of the\n * application grows the difference between the various methods would increase.\n *\n * @param {string} str string to be escaped.\n * @param {boolean=} opt_isLikelyToContainHtmlChars Don't perform a check to see\n * if the character needs replacing - use this option if you expect each of\n * the characters to appear often. Leave false if you expect few html\n * characters to occur in your strings, such as if you are escaping HTML.\n * @return {string} An escaped copy of `str`.\n */\ngoog.string.htmlEscape = function(str, opt_isLikelyToContainHtmlChars) {\n 'use strict';\n str = goog.string.internal.htmlEscape(str, opt_isLikelyToContainHtmlChars);\n if (goog.string.DETECT_DOUBLE_ESCAPING) {\n str = str.replace(goog.string.E_RE_, '&#101;');\n }\n return str;\n};\n\n\n/**\n * Regular expression that matches a lowercase letter \"e\", for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.E_RE_ = /e/g;\n\n\n/**\n * Unescapes an HTML string.\n *\n * @param {string} str The string to unescape.\n * @return {string} An unescaped copy of `str`.\n */\ngoog.string.unescapeEntities = function(str) {\n 'use strict';\n if (goog.string.contains(str, '&')) {\n // We are careful not to use a DOM if we do not have one or we explicitly\n // requested non-DOM html unescaping.\n if (!goog.string.FORCE_NON_DOM_HTML_UNESCAPING &&\n 'document' in goog.global) {\n return goog.string.unescapeEntitiesUsingDom_(str);\n } else {\n // Fall back on pure XML entities\n return goog.string.unescapePureXmlEntities_(str);\n }\n }\n return str;\n};\n\n\n/**\n * Unescapes a HTML string using the provided document.\n *\n * @param {string} str The string to unescape.\n * @param {!Document} document A document to use in escaping the string.\n * @return {string} An unescaped copy of `str`.\n */\ngoog.string.unescapeEntitiesWithDocument = function(str, document) {\n 'use strict';\n if (goog.string.contains(str, '&')) {\n return goog.string.unescapeEntitiesUsingDom_(str, document);\n }\n return str;\n};\n\n\n/**\n * Unescapes an HTML string using a DOM to resolve non-XML, non-numeric\n * entities. This function is XSS-safe and whitespace-preserving.\n * @private\n * @param {string} str The string to unescape.\n * @param {Document=} opt_document An optional document to use for creating\n * elements. If this is not specified then the default window.document\n * will be used.\n * @return {string} The unescaped `str` string.\n */\ngoog.string.unescapeEntitiesUsingDom_ = function(str, opt_document) {\n 'use strict';\n /** @type {!Object<string, string>} */\n const seen = {'&amp;': '&', '&lt;': '<', '&gt;': '>', '&quot;': '\"'};\n /** @type {!Element} */\n let div;\n if (opt_document) {\n div = opt_document.createElement('div');\n } else {\n div = goog.global.document.createElement('div');\n }\n // Match as many valid entity characters as possible. If the actual entity\n // happens to be shorter, it will still work as innerHTML will return the\n // trailing characters unchanged. Since the entity characters do not include\n // open angle bracket, there is no chance of XSS from the innerHTML use.\n // Since no whitespace is passed to innerHTML, whitespace is preserved.\n return str.replace(goog.string.HTML_ENTITY_PATTERN_, function(s, entity) {\n 'use strict';\n // Check for cached entity.\n let value = seen[s];\n if (value) {\n return value;\n }\n // Check for numeric entity.\n if (entity.charAt(0) == '#') {\n // Prefix with 0 so that hex entities (e.g. &#x10) parse as hex numbers.\n const n = Number('0' + entity.substr(1));\n if (!isNaN(n)) {\n value = String.fromCharCode(n);\n }\n }\n // Fall back to innerHTML otherwise.\n if (!value) {\n // Append a non-entity character to avoid a bug in Webkit that parses\n // an invalid entity at the end of innerHTML text as the empty string.\n goog.dom.safe.setInnerHtml(\n div,\n goog.html.uncheckedconversions\n .safeHtmlFromStringKnownToSatisfyTypeContract(\n goog.string.Const.from('Single HTML entity.'), s + ' '));\n // Then remove the trailing character from the result.\n value = div.firstChild.nodeValue.slice(0, -1);\n }\n // Cache and return.\n return seen[s] = value;\n });\n};\n\n\n/**\n * Unescapes XML entities.\n * @private\n * @param {string} str The string to unescape.\n * @return {string} An unescaped copy of `str`.\n */\ngoog.string.unescapePureXmlEntities_ = function(str) {\n 'use strict';\n return str.replace(/&([^;]+);/g, function(s, entity) {\n 'use strict';\n switch (entity) {\n case 'amp':\n return '&';\n case 'lt':\n return '<';\n case 'gt':\n return '>';\n case 'quot':\n return '\"';\n default:\n if (entity.charAt(0) == '#') {\n // Prefix with 0 so that hex entities (e.g. &#x10) parse as hex.\n const n = Number('0' + entity.substr(1));\n if (!isNaN(n)) {\n return String.fromCharCode(n);\n }\n }\n // For invalid entities we just return the entity\n return s;\n }\n });\n};\n\n\n/**\n * Regular expression that matches an HTML entity.\n * See also HTML5: Tokenization / Tokenizing character references.\n * @private\n * @type {!RegExp}\n */\ngoog.string.HTML_ENTITY_PATTERN_ = /&([^;\\s<&]+);?/g;\n\n\n/**\n * Do escaping of whitespace to preserve spatial formatting. We use character\n * entity #160 to make it safer for xml.\n * @param {string} str The string in which to escape whitespace.\n * @param {boolean=} opt_xml Whether to use XML compatible tags.\n * @return {string} An escaped copy of `str`.\n */\ngoog.string.whitespaceEscape = function(str, opt_xml) {\n 'use strict';\n // This doesn't use goog.string.preserveSpaces for backwards compatibility.\n return goog.string.newLineToBr(str.replace(/ /g, ' &#160;'), opt_xml);\n};\n\n\n/**\n * Preserve spaces that would be otherwise collapsed in HTML by replacing them\n * with non-breaking space Unicode characters.\n * @param {string} str The string in which to preserve whitespace.\n * @return {string} A copy of `str` with preserved whitespace.\n */\ngoog.string.preserveSpaces = function(str) {\n 'use strict';\n return str.replace(/(^|[\\n ]) /g, '$1' + goog.string.Unicode.NBSP);\n};\n\n\n/**\n * Strip quote characters around a string. The second argument is a string of\n * characters to treat as quotes. This can be a single character or a string of\n * multiple character and in that case each of those are treated as possible\n * quote characters. For example:\n *\n * <pre>\n * goog.string.stripQuotes('\"abc\"', '\"`') --> 'abc'\n * goog.string.stripQuotes('`abc`', '\"`') --> 'abc'\n * </pre>\n *\n * @param {string} str The string to strip.\n * @param {string} quoteChars The quote characters to strip.\n * @return {string} A copy of `str` without the quotes.\n */\ngoog.string.stripQuotes = function(str, quoteChars) {\n 'use strict';\n const length = quoteChars.length;\n for (let i = 0; i < length; i++) {\n const quoteChar = length == 1 ? quoteChars : quoteChars.charAt(i);\n if (str.charAt(0) == quoteChar && str.charAt(str.length - 1) == quoteChar) {\n return str.substring(1, str.length - 1);\n }\n }\n return str;\n};\n\n\n/**\n * Truncates a string to a certain length and adds '...' if necessary. The\n * length also accounts for the ellipsis, so a maximum length of 10 and a string\n * 'Hello World!' produces 'Hello W...'.\n * @param {string} str The string to truncate.\n * @param {number} chars Max number of characters.\n * @param {boolean=} opt_protectEscapedCharacters Whether to protect escaped\n * characters from being cut off in the middle.\n * @return {string} The truncated `str` string.\n */\ngoog.string.truncate = function(str, chars, opt_protectEscapedCharacters) {\n 'use strict';\n if (opt_protectEscapedCharacters) {\n str = goog.string.unescapeEntities(str);\n }\n\n if (str.length > chars) {\n str = str.substring(0, chars - 3) + '...';\n }\n\n if (opt_protectEscapedCharacters) {\n str = goog.string.htmlEscape(str);\n }\n\n return str;\n};\n\n\n/**\n * Truncate a string in the middle, adding \"...\" if necessary,\n * and favoring the beginning of the string.\n * @param {string} str The string to truncate the middle of.\n * @param {number} chars Max number of characters.\n * @param {boolean=} opt_protectEscapedCharacters Whether to protect escaped\n * characters from being cutoff in the middle.\n * @param {number=} opt_trailingChars Optional number of trailing characters to\n * leave at the end of the string, instead of truncating as close to the\n * middle as possible.\n * @return {string} A truncated copy of `str`.\n */\ngoog.string.truncateMiddle = function(\n str, chars, opt_protectEscapedCharacters, opt_trailingChars) {\n 'use strict';\n if (opt_protectEscapedCharacters) {\n str = goog.string.unescapeEntities(str);\n }\n\n if (opt_trailingChars && str.length > chars) {\n if (opt_trailingChars > chars) {\n opt_trailingChars = chars;\n }\n const endPoint = str.length - opt_trailingChars;\n const startPoint = chars - opt_trailingChars;\n str = str.substring(0, startPoint) + '...' + str.substring(endPoint);\n } else if (str.length > chars) {\n // Favor the beginning of the string:\n let half = Math.floor(chars / 2);\n const endPos = str.length - half;\n half += chars % 2;\n str = str.substring(0, half) + '...' + str.substring(endPos);\n }\n\n if (opt_protectEscapedCharacters) {\n str = goog.string.htmlEscape(str);\n }\n\n return str;\n};\n\n\n/**\n * Special chars that need to be escaped for goog.string.quote.\n * @private {!Object<string, string>}\n */\ngoog.string.specialEscapeChars_ = {\n '\\0': '\\\\0',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n '\\x0B': '\\\\x0B', // '\\v' is not supported in JScript\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n // To support the use case of embedding quoted strings inside of script\n // tags, we have to make sure HTML comments and opening/closing script tags do\n // not appear in the resulting string. The specific strings that must be\n // escaped are documented at:\n // https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements\n '<': '\\\\u003C' // NOTE: JSON.parse crashes on '\\\\x3c'.\n};\n\n\n/**\n * Character mappings used internally for goog.string.escapeChar.\n * @private {!Object<string, string>}\n */\ngoog.string.jsEscapeCache_ = {\n '\\'': '\\\\\\''\n};\n\n\n/**\n * Encloses a string in double quotes and escapes characters so that the\n * string is a valid JS string. The resulting string is safe to embed in\n * `<script>` tags as \"<\" is escaped.\n * @param {string} s The string to quote.\n * @return {string} A copy of `s` surrounded by double quotes.\n */\ngoog.string.quote = function(s) {\n 'use strict';\n s = String(s);\n const sb = ['\"'];\n for (let i = 0; i < s.length; i++) {\n const ch = s.charAt(i);\n const cc = ch.charCodeAt(0);\n sb[i + 1] = goog.string.specialEscapeChars_[ch] ||\n ((cc > 31 && cc < 127) ? ch : goog.string.escapeChar(ch));\n }\n sb.push('\"');\n return sb.join('');\n};\n\n\n/**\n * Takes a string and returns the escaped string for that input string.\n * @param {string} str The string to escape.\n * @return {string} An escaped string representing `str`.\n */\ngoog.string.escapeString = function(str) {\n 'use strict';\n const sb = [];\n for (let i = 0; i < str.length; i++) {\n sb[i] = goog.string.escapeChar(str.charAt(i));\n }\n return sb.join('');\n};\n\n\n/**\n * Takes a character and returns the escaped string for that character. For\n * example escapeChar(String.fromCharCode(15)) -> \"\\\\x0E\".\n * @param {string} c The character to escape.\n * @return {string} An escaped string representing `c`.\n */\ngoog.string.escapeChar = function(c) {\n 'use strict';\n if (c in goog.string.jsEscapeCache_) {\n return goog.string.jsEscapeCache_[c];\n }\n\n if (c in goog.string.specialEscapeChars_) {\n return goog.string.jsEscapeCache_[c] = goog.string.specialEscapeChars_[c];\n }\n\n let rv = c;\n const cc = c.charCodeAt(0);\n if (cc > 31 && cc < 127) {\n rv = c;\n } else {\n // tab is 9 but handled above\n if (cc < 256) {\n rv = '\\\\x';\n if (cc < 16 || cc > 256) {\n rv += '0';\n }\n } else {\n rv = '\\\\u';\n if (cc < 4096) { // \\u1000\n rv += '0';\n }\n }\n rv += cc.toString(16).toUpperCase();\n }\n\n return goog.string.jsEscapeCache_[c] = rv;\n};\n\n\n/**\n * Determines whether a string contains a substring.\n * @param {string} str The string to search.\n * @param {string} subString The substring to search for.\n * @return {boolean} Whether `str` contains `subString`.\n */\ngoog.string.contains = goog.string.internal.contains;\n\n\n/**\n * Determines whether a string contains a substring, ignoring case.\n * @param {string} str The string to search.\n * @param {string} subString The substring to search for.\n * @return {boolean} Whether `str` contains `subString`.\n */\ngoog.string.caseInsensitiveContains =\n goog.string.internal.caseInsensitiveContains;\n\n\n/**\n * Returns the non-overlapping occurrences of ss in s.\n * If either s or ss evalutes to false, then returns zero.\n * @param {string} s The string to look in.\n * @param {string} ss The string to look for.\n * @return {number} Number of occurrences of ss in s.\n */\ngoog.string.countOf = function(s, ss) {\n 'use strict';\n return s && ss ? s.split(ss).length - 1 : 0;\n};\n\n\n/**\n * Removes a substring of a specified length at a specific\n * index in a string.\n * @param {string} s The base string from which to remove.\n * @param {number} index The index at which to remove the substring.\n * @param {number} stringLength The length of the substring to remove.\n * @return {string} A copy of `s` with the substring removed or the full\n * string if nothing is removed or the input is invalid.\n */\ngoog.string.removeAt = function(s, index, stringLength) {\n 'use strict';\n let resultStr = s;\n // If the index is greater or equal to 0 then remove substring\n if (index >= 0 && index < s.length && stringLength > 0) {\n resultStr = s.substr(0, index) +\n s.substr(index + stringLength, s.length - index - stringLength);\n }\n return resultStr;\n};\n\n\n/**\n * Removes the first occurrence of a substring from a string.\n * @param {string} str The base string from which to remove.\n * @param {string} substr The string to remove.\n * @return {string} A copy of `str` with `substr` removed or the\n * full string if nothing is removed.\n */\ngoog.string.remove = function(str, substr) {\n 'use strict';\n return str.replace(substr, '');\n};\n\n\n/**\n * Removes all occurrences of a substring from a string.\n * @param {string} s The base string from which to remove.\n * @param {string} ss The string to remove.\n * @return {string} A copy of `s` with `ss` removed or the full\n * string if nothing is removed.\n */\ngoog.string.removeAll = function(s, ss) {\n 'use strict';\n const re = new RegExp(goog.string.regExpEscape(ss), 'g');\n return s.replace(re, '');\n};\n\n\n/**\n * Replaces all occurrences of a substring of a string with a new substring.\n * @param {string} s The base string from which to remove.\n * @param {string} ss The string to replace.\n * @param {string} replacement The replacement string.\n * @return {string} A copy of `s` with `ss` replaced by\n * `replacement` or the original string if nothing is replaced.\n */\ngoog.string.replaceAll = function(s, ss, replacement) {\n 'use strict';\n const re = new RegExp(goog.string.regExpEscape(ss), 'g');\n return s.replace(re, replacement.replace(/\\$/g, '$$$$'));\n};\n\n\n/**\n * Escapes characters in the string that are not safe to use in a RegExp.\n * @param {*} s The string to escape. If not a string, it will be casted\n * to one.\n * @return {string} A RegExp safe, escaped copy of `s`.\n */\ngoog.string.regExpEscape = function(s) {\n 'use strict';\n return String(s)\n .replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g, '\\\\$1')\n .replace(/\\x08/g, '\\\\x08');\n};\n\n\n/**\n * Repeats a string n times.\n * @param {string} string The string to repeat.\n * @param {number} length The number of times to repeat.\n * @return {string} A string containing `length` repetitions of\n * `string`.\n */\ngoog.string.repeat = (String.prototype.repeat) ? function(string, length) {\n 'use strict';\n // The native method is over 100 times faster than the alternative.\n return string.repeat(length);\n} : function(string, length) {\n 'use strict';\n return new Array(length + 1).join(string);\n};\n\n\n/**\n * Pads number to given length and optionally rounds it to a given precision.\n * For example:\n * <pre>padNumber(1.25, 2, 3) -> '01.250'\n * padNumber(1.25, 2) -> '01.25'\n * padNumber(1.25, 2, 1) -> '01.3'\n * padNumber(1.25, 0) -> '1.25'</pre>\n *\n * @param {number} num The number to pad.\n * @param {number} length The desired length.\n * @param {number=} opt_precision The desired precision.\n * @return {string} `num` as a string with the given options.\n */\ngoog.string.padNumber = function(num, length, opt_precision) {\n 'use strict';\n const s =\n (opt_precision !== undefined) ? num.toFixed(opt_precision) : String(num);\n let index = s.indexOf('.');\n if (index == -1) {\n index = s.length;\n }\n return goog.string.repeat('0', Math.max(0, length - index)) + s;\n};\n\n\n/**\n * Returns a string representation of the given object, with\n * null and undefined being returned as the empty string.\n *\n * @param {*} obj The object to convert.\n * @return {string} A string representation of the `obj`.\n */\ngoog.string.makeSafe = function(obj) {\n 'use strict';\n return obj == null ? '' : String(obj);\n};\n\n\n/**\n * Concatenates string expressions. This is useful\n * since some browsers are very inefficient when it comes to using plus to\n * concat strings. Be careful when using null and undefined here since\n * these will not be included in the result. If you need to represent these\n * be sure to cast the argument to a String first.\n * For example:\n * <pre>buildString('a', 'b', 'c', 'd') -> 'abcd'\n * buildString(null, undefined) -> ''\n * </pre>\n * @param {...*} var_args A list of strings to concatenate. If not a string,\n * it will be casted to one.\n * @return {string} The concatenation of `var_args`.\n */\ngoog.string.buildString = function(var_args) {\n 'use strict';\n return Array.prototype.join.call(arguments, '');\n};\n\n\n/**\n * Returns a string with at least 64-bits of randomness.\n *\n * Doesn't trust JavaScript's random function entirely. Uses a combination of\n * random and current timestamp, and then encodes the string in base-36 to\n * make it shorter.\n *\n * @return {string} A random string, e.g. sn1s7vb4gcic.\n */\ngoog.string.getRandomString = function() {\n 'use strict';\n const x = 2147483648;\n return Math.floor(Math.random() * x).toString(36) +\n Math.abs(Math.floor(Math.random() * x) ^ goog.now()).toString(36);\n};\n\n\n/**\n * Compares two version numbers.\n *\n * @param {string|number} version1 Version of first item.\n * @param {string|number} version2 Version of second item.\n *\n * @return {number} 1 if `version1` is higher.\n * 0 if arguments are equal.\n * -1 if `version2` is higher.\n */\ngoog.string.compareVersions = goog.string.internal.compareVersions;\n\n\n/**\n * String hash function similar to java.lang.String.hashCode().\n * The hash code for a string is computed as\n * s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],\n * where s[i] is the ith character of the string and n is the length of\n * the string. We mod the result to make it between 0 (inclusive) and 2^32\n * (exclusive).\n * @param {string} str A string.\n * @return {number} Hash value for `str`, between 0 (inclusive) and 2^32\n * (exclusive). The empty string returns 0.\n */\ngoog.string.hashCode = function(str) {\n 'use strict';\n let result = 0;\n for (let i = 0; i < str.length; ++i) {\n // Normalize to 4 byte range, 0 ... 2^32.\n result = (31 * result + str.charCodeAt(i)) >>> 0;\n }\n return result;\n};\n\n\n/**\n * The most recent unique ID. |0 is equivalent to Math.floor in this case.\n * @type {number}\n * @private\n */\ngoog.string.uniqueStringCounter_ = Math.random() * 0x80000000 | 0;\n\n\n/**\n * Generates and returns a string which is unique in the current document.\n * This is useful, for example, to create unique IDs for DOM elements.\n * @return {string} A unique id.\n */\ngoog.string.createUniqueString = function() {\n 'use strict';\n return 'goog_' + goog.string.uniqueStringCounter_++;\n};\n\n\n/**\n * Converts the supplied string to a number, which may be Infinity or NaN.\n * This function strips whitespace: (toNumber(' 123') === 123)\n * This function accepts scientific notation: (toNumber('1e1') === 10)\n *\n * This is better than JavaScript's built-in conversions because, sadly:\n * (Number(' ') === 0) and (parseFloat('123a') === 123)\n *\n * @param {string} str The string to convert.\n * @return {number} The number the supplied string represents, or NaN.\n */\ngoog.string.toNumber = function(str) {\n 'use strict';\n const num = Number(str);\n if (num == 0 && goog.string.isEmptyOrWhitespace(str)) {\n return NaN;\n }\n return num;\n};\n\n\n/**\n * Returns whether the given string is lower camel case (e.g. \"isFooBar\").\n *\n * Note that this assumes the string is entirely letters.\n * @see http://en.wikipedia.org/wiki/CamelCase#Variations_and_synonyms\n *\n * @param {string} str String to test.\n * @return {boolean} Whether the string is lower camel case.\n */\ngoog.string.isLowerCamelCase = function(str) {\n 'use strict';\n return /^[a-z]+([A-Z][a-z]*)*$/.test(str);\n};\n\n\n/**\n * Returns whether the given string is upper camel case (e.g. \"FooBarBaz\").\n *\n * Note that this assumes the string is entirely letters.\n * @see http://en.wikipedia.org/wiki/CamelCase#Variations_and_synonyms\n *\n * @param {string} str String to test.\n * @return {boolean} Whether the string is upper camel case.\n */\ngoog.string.isUpperCamelCase = function(str) {\n 'use strict';\n return /^([A-Z][a-z]*)+$/.test(str);\n};\n\n\n/**\n * Converts a string from selector-case to camelCase (e.g. from\n * \"multi-part-string\" to \"multiPartString\"), useful for converting\n * CSS selectors and HTML dataset keys to their equivalent JS properties.\n * @param {string} str The string in selector-case form.\n * @return {string} The string in camelCase form.\n */\ngoog.string.toCamelCase = function(str) {\n 'use strict';\n return String(str).replace(/\\-([a-z])/g, function(all, match) {\n 'use strict';\n return match.toUpperCase();\n });\n};\n\n\n/**\n * Converts a string from camelCase to selector-case (e.g. from\n * \"multiPartString\" to \"multi-part-string\"), useful for converting JS\n * style and dataset properties to equivalent CSS selectors and HTML keys.\n * @param {string} str The string in camelCase form.\n * @return {string} The string in selector-case form.\n */\ngoog.string.toSelectorCase = function(str) {\n 'use strict';\n return String(str).replace(/([A-Z])/g, '-$1').toLowerCase();\n};\n\n\n/**\n * Converts a string into TitleCase. First character of the string is always\n * capitalized in addition to the first letter of every subsequent word.\n * Words are delimited by one or more whitespaces by default. Custom delimiters\n * can optionally be specified to replace the default, which doesn't preserve\n * whitespace delimiters and instead must be explicitly included if needed.\n *\n * Default delimiter => \" \":\n * goog.string.toTitleCase('oneTwoThree') => 'OneTwoThree'\n * goog.string.toTitleCase('one two three') => 'One Two Three'\n * goog.string.toTitleCase(' one two ') => ' One Two '\n * goog.string.toTitleCase('one_two_three') => 'One_two_three'\n * goog.string.toTitleCase('one-two-three') => 'One-two-three'\n *\n * Custom delimiter => \"_-.\":\n * goog.string.toTitleCase('oneTwoThree', '_-.') => 'OneTwoThree'\n * goog.string.toTitleCase('one two three', '_-.') => 'One two three'\n * goog.string.toTitleCase(' one two ', '_-.') => ' one two '\n * goog.string.toTitleCase('one_two_three', '_-.') => 'One_Two_Three'\n * goog.string.toTitleCase('one-two-three', '_-.') => 'One-Two-Three'\n * goog.string.toTitleCase('one...two...three', '_-.') => 'One...Two...Three'\n * goog.string.toTitleCase('one. two. three', '_-.') => 'One. two. three'\n * goog.string.toTitleCase('one-two.three', '_-.') => 'One-Two.Three'\n *\n * @param {string} str String value in camelCase form.\n * @param {string=} opt_delimiters Custom delimiter character set used to\n * distinguish words in the string value. Each character represents a\n * single delimiter. When provided, default whitespace delimiter is\n * overridden and must be explicitly included if needed.\n * @return {string} String value in TitleCase form.\n */\ngoog.string.toTitleCase = function(str, opt_delimiters) {\n 'use strict';\n let delimiters = (typeof opt_delimiters === 'string') ?\n goog.string.regExpEscape(opt_delimiters) :\n '\\\\s';\n\n // For IE8, we need to prevent using an empty character set. Otherwise,\n // incorrect matching will occur.\n delimiters = delimiters ? '|[' + delimiters + ']+' : '';\n\n const regexp = new RegExp('(^' + delimiters + ')([a-z])', 'g');\n return str.replace(regexp, function(all, p1, p2) {\n 'use strict';\n return p1 + p2.toUpperCase();\n });\n};\n\n\n/**\n * Capitalizes a string, i.e. converts the first letter to uppercase\n * and all other letters to lowercase, e.g.:\n *\n * goog.string.capitalize('one') => 'One'\n * goog.string.capitalize('ONE') => 'One'\n * goog.string.capitalize('one two') => 'One two'\n *\n * Note that this function does not trim initial whitespace.\n *\n * @param {string} str String value to capitalize.\n * @return {string} String value with first letter in uppercase.\n */\ngoog.string.capitalize = function(str) {\n 'use strict';\n return String(str.charAt(0)).toUpperCase() +\n String(str.substr(1)).toLowerCase();\n};\n\n\n/**\n * Parse a string in decimal or hexidecimal ('0xFFFF') form.\n *\n * To parse a particular radix, please use parseInt(string, radix) directly. See\n * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/parseInt\n *\n * This is a wrapper for the built-in parseInt function that will only parse\n * numbers as base 10 or base 16. Some JS implementations assume strings\n * starting with \"0\" are intended to be octal. ES3 allowed but discouraged\n * this behavior. ES5 forbids it. This function emulates the ES5 behavior.\n *\n * For more information, see Mozilla JS Reference: http://goo.gl/8RiFj\n *\n * @param {string|number|null|undefined} value The value to be parsed.\n * @return {number} The number, parsed. If the string failed to parse, this\n * will be NaN.\n */\ngoog.string.parseInt = function(value) {\n 'use strict';\n // Force finite numbers to strings.\n if (isFinite(value)) {\n value = String(value);\n }\n\n if (typeof value === 'string') {\n // If the string starts with '0x' or '-0x', parse as hex.\n return /^\\s*-?0x/i.test(value) ? parseInt(value, 16) : parseInt(value, 10);\n }\n\n return NaN;\n};\n\n\n/**\n * Splits a string on a separator a limited number of times.\n *\n * This implementation is more similar to Python or Java, where the limit\n * parameter specifies the maximum number of splits rather than truncating\n * the number of results.\n *\n * See http://docs.python.org/2/library/stdtypes.html#str.split\n * See JavaDoc: http://goo.gl/F2AsY\n * See Mozilla reference: http://goo.gl/dZdZs\n *\n * @param {string} str String to split.\n * @param {string} separator The separator.\n * @param {number} limit The limit to the number of splits. The resulting array\n * will have a maximum length of limit+1. Negative numbers are the same\n * as zero.\n * @return {!Array<string>} The string, split.\n */\ngoog.string.splitLimit = function(str, separator, limit) {\n 'use strict';\n const parts = str.split(separator);\n const returnVal = [];\n\n // Only continue doing this while we haven't hit the limit and we have\n // parts left.\n while (limit > 0 && parts.length) {\n returnVal.push(parts.shift());\n limit--;\n }\n\n // If there are remaining parts, append them to the end.\n if (parts.length) {\n returnVal.push(parts.join(separator));\n }\n\n return returnVal;\n};\n\n\n/**\n * Finds the characters to the right of the last instance of any separator\n *\n * This function is similar to goog.string.path.baseName, except it can take a\n * list of characters to split the string on. It will return the rightmost\n * grouping of characters to the right of any separator as a left-to-right\n * oriented string.\n *\n * @see goog.string.path.baseName\n * @param {string} str The string\n * @param {string|!Array<string>} separators A list of separator characters\n * @return {string} The last part of the string with respect to the separators\n */\ngoog.string.lastComponent = function(str, separators) {\n 'use strict';\n if (!separators) {\n return str;\n } else if (typeof separators == 'string') {\n separators = [separators];\n }\n\n let lastSeparatorIndex = -1;\n for (let i = 0; i < separators.length; i++) {\n if (separators[i] == '') {\n continue;\n }\n const currentSeparatorIndex = str.lastIndexOf(separators[i]);\n if (currentSeparatorIndex > lastSeparatorIndex) {\n lastSeparatorIndex = currentSeparatorIndex;\n }\n }\n if (lastSeparatorIndex == -1) {\n return str;\n }\n return str.slice(lastSeparatorIndex + 1);\n};\n\n\n/**\n * Computes the Levenshtein edit distance between two strings.\n * @param {string} a\n * @param {string} b\n * @return {number} The edit distance between the two strings.\n */\ngoog.string.editDistance = function(a, b) {\n 'use strict';\n const v0 = [];\n const v1 = [];\n\n if (a == b) {\n return 0;\n }\n\n if (!a.length || !b.length) {\n return Math.max(a.length, b.length);\n }\n\n for (let i = 0; i < b.length + 1; i++) {\n v0[i] = i;\n }\n\n for (let i = 0; i < a.length; i++) {\n v1[0] = i + 1;\n\n for (let j = 0; j < b.length; j++) {\n const cost = Number(a[i] != b[j]);\n // Cost for the substring is the minimum of adding one character, removing\n // one character, or a swap.\n v1[j + 1] = Math.min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost);\n }\n\n for (let j = 0; j < v0.length; j++) {\n v0[j] = v1[j];\n }\n }\n\n return v1[b.length];\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview The dispose method is used to clean up references and\n * resources.\n */\n\ngoog.module('goog.dispose');\ngoog.module.declareLegacyNamespace();\n\n/**\n * Calls `dispose` on the argument if it supports it. If obj is not an\n * object with a dispose() method, this is a no-op.\n * @param {*} obj The object to dispose of.\n */\nfunction dispose(obj) {\n if (obj && typeof obj.dispose == 'function') {\n obj.dispose();\n }\n}\nexports = dispose;\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Codec functions of the v8 wire protocol. Eventually we'd want\n * to support pluggable wire-format to improve wire efficiency and to enable\n * binary encoding. Such support will require an interface class, which\n * will be added later.\n *\n */\n\n\ngoog.provide('goog.labs.net.webChannel.WireV8');\n\ngoog.require('goog.asserts');\ngoog.require('goog.json');\ngoog.require('goog.json.NativeJsonProcessor');\ngoog.require('goog.labs.net.webChannel.Wire');\ngoog.require('goog.structs');\ngoog.requireType('goog.string.Parser');\ngoog.requireType('goog.structs.Map');\n\n\n\n/**\n * The v8 codec class.\n *\n * @constructor\n * @struct\n */\ngoog.labs.net.webChannel.WireV8 = function() {\n 'use strict';\n /**\n * Parser for a response payload. The parser should return an array.\n * @private {!goog.string.Parser}\n */\n this.parser_ = new goog.json.NativeJsonProcessor();\n};\n\n\ngoog.scope(function() {\n'use strict';\nconst WireV8 = goog.labs.net.webChannel.WireV8;\nconst Wire = goog.labs.net.webChannel.Wire;\n\n\n/**\n * Encodes a standalone message into the wire format.\n *\n * May throw exception if the message object contains any invalid elements.\n *\n * @param {!Object|!goog.structs.Map} message The message data.\n * V8 only support JS objects (or Map).\n * @param {!Array<string>} buffer The text buffer to write the message to.\n * @param {string=} opt_prefix The prefix for each field of the object.\n */\nWireV8.prototype.encodeMessage = function(message, buffer, opt_prefix) {\n 'use strict';\n const prefix = opt_prefix || '';\n try {\n goog.structs.forEach(message, function(value, key) {\n 'use strict';\n let encodedValue = value;\n if (goog.isObject(value)) {\n encodedValue = goog.json.serialize(value);\n } // keep the fast-path for primitive types\n buffer.push(prefix + key + '=' + encodeURIComponent(encodedValue));\n });\n } catch (ex) {\n // We send a map here because lots of the retry logic relies on map IDs,\n // so we have to send something (possibly redundant).\n buffer.push(\n prefix + 'type' +\n '=' + encodeURIComponent('_badmap'));\n throw ex;\n }\n};\n\n\n/**\n * Encodes all the buffered messages of the forward channel.\n *\n * @param {!Array<Wire.QueuedMap>} messageQueue The message data.\n * V8 only support JS objects.\n * @param {number} count The number of messages to be encoded.\n * @param {?function(!Object)} badMapHandler Callback for bad messages.\n * @return {string} the encoded messages\n */\nWireV8.prototype.encodeMessageQueue = function(\n messageQueue, count, badMapHandler) {\n 'use strict';\n let offset = -1;\n while (true) {\n const sb = ['count=' + count];\n // To save a bit of bandwidth, specify the base mapId and the rest as\n // offsets from it.\n if (offset == -1) {\n if (count > 0) {\n offset = messageQueue[0].mapId;\n sb.push('ofs=' + offset);\n } else {\n offset = 0;\n }\n } else {\n sb.push('ofs=' + offset);\n }\n let done = true;\n for (let i = 0; i < count; i++) {\n let mapId = messageQueue[i].mapId;\n const map = messageQueue[i].map;\n mapId -= offset;\n if (mapId < 0) {\n // redo the encoding in case of retry/reordering, plus extra space\n offset = Math.max(0, messageQueue[i].mapId - 100);\n done = false;\n continue;\n }\n try {\n this.encodeMessage(map, sb, 'req' + mapId + '_');\n } catch (ex) {\n if (badMapHandler) {\n badMapHandler(map);\n }\n }\n }\n if (done) {\n return sb.join('&');\n }\n }\n};\n\n\n/**\n * Decodes a standalone message received from the wire. May throw exception\n * if text is ill-formatted.\n *\n * Must be valid JSON as it is insecure to use eval() to decode JS literals;\n * and eval() is disallowed in Chrome apps too.\n *\n * Invalid JS literals include null array elements, quotas etc.\n *\n * @param {string} messageText The string content as received from the wire.\n * @return {*} The decoded message object.\n */\nWireV8.prototype.decodeMessage = function(messageText) {\n 'use strict';\n const response = this.parser_.parse(messageText);\n goog.asserts.assert(Array.isArray(response)); // throw exception\n return response;\n};\n}); // goog.scope\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview A pool of forward channel requests to enable real-time\n * messaging from the client to server.\n *\n */\n\ngoog.module('goog.labs.net.webChannel.ForwardChannelRequestPool');\n\ngoog.module.declareLegacyNamespace();\n\nconst ChannelRequest = goog.require('goog.labs.net.webChannel.ChannelRequest');\nconst Wire = goog.require('goog.labs.net.webChannel.Wire');\nconst array = goog.require('goog.array');\nconst googString = goog.require('goog.string');\n\n\n/**\n * This class represents the state of all forward channel requests.\n *\n * @param {number=} opt_maxPoolSize The maximum pool size.\n *\n * @struct @constructor @final\n */\nconst ForwardChannelRequestPool = function(opt_maxPoolSize) {\n /**\n * The max pool size as configured.\n *\n * @private {number}\n */\n this.maxPoolSizeConfigured_ =\n opt_maxPoolSize || ForwardChannelRequestPool.MAX_POOL_SIZE_;\n\n /**\n * The current size limit of the request pool. This limit is meant to be\n * read-only after the channel is fully opened.\n *\n * If SPDY or HTTP2 is enabled, set it to the max pool size, which is also\n * configurable.\n *\n * @private {number}\n */\n this.maxSize_ = ForwardChannelRequestPool.isSpdyOrHttp2Enabled_() ?\n this.maxPoolSizeConfigured_ :\n 1;\n\n /**\n * The container for all the pending request objects.\n *\n * @private {?Set<?ChannelRequest>}\n */\n this.requestPool_ = null;\n\n if (this.maxSize_ > 1) {\n this.requestPool_ = new Set();\n }\n\n /**\n * The single request object when the pool size is limited to one.\n *\n * @private {?ChannelRequest}\n */\n this.request_ = null;\n\n /**\n * Saved pending messages when the pool is cancelled.\n *\n * @private {!Array<Wire.QueuedMap>}\n */\n this.pendingMessages_ = [];\n};\n\n\n/**\n * The default size limit of the request pool.\n *\n * @private {number}\n */\nForwardChannelRequestPool.MAX_POOL_SIZE_ = 10;\n\n\n/**\n * @return {boolean} True if SPDY or HTTP2 is enabled. Uses chrome-specific APIs\n * as a fallback and will always return false for other browsers where\n * PerformanceNavigationTiming is not available.\n * @private\n */\nForwardChannelRequestPool.isSpdyOrHttp2Enabled_ = function() {\n if (goog.global.PerformanceNavigationTiming) {\n const entrys = /** @type {!Array<!PerformanceNavigationTiming>} */ (\n goog.global.performance.getEntriesByType('navigation'));\n return entrys.length > 0 &&\n (entrys[0].nextHopProtocol == 'hq' ||\n entrys[0].nextHopProtocol == 'h2');\n }\n return !!(\n goog.global.chrome && goog.global.chrome.loadTimes &&\n goog.global.chrome.loadTimes() &&\n goog.global.chrome.loadTimes().wasFetchedViaSpdy);\n};\n\n\n/**\n * Once we know the client protocol (from the handshake), check if we need\n * enable the request pool accordingly. This is more robust than using\n * browser-internal APIs (specific to Chrome).\n *\n * @param {string} clientProtocol The client protocol\n */\nForwardChannelRequestPool.prototype.applyClientProtocol = function(\n clientProtocol) {\n if (this.requestPool_) {\n return;\n }\n\n if (googString.contains(clientProtocol, 'spdy') ||\n googString.contains(clientProtocol, 'quic') ||\n googString.contains(clientProtocol, 'h2')) {\n this.maxSize_ = this.maxPoolSizeConfigured_;\n this.requestPool_ = new Set();\n if (this.request_) {\n this.addRequest(this.request_);\n this.request_ = null;\n }\n }\n};\n\n\n/**\n * @return {boolean} True if the pool is full.\n */\nForwardChannelRequestPool.prototype.isFull = function() {\n if (this.request_) {\n return true;\n }\n\n if (this.requestPool_) {\n return this.requestPool_.size >= this.maxSize_;\n }\n\n return false;\n};\n\n\n/**\n * @return {number} The current size limit.\n */\nForwardChannelRequestPool.prototype.getMaxSize = function() {\n return this.maxSize_;\n};\n\n\n/**\n * @return {number} The number of pending requests in the pool.\n */\nForwardChannelRequestPool.prototype.getRequestCount = function() {\n if (this.request_) {\n return 1;\n }\n\n if (this.requestPool_) {\n return this.requestPool_.size;\n }\n\n return 0;\n};\n\n\n/**\n * @param {ChannelRequest} req The channel request.\n * @return {boolean} True if the request is a included inside the pool.\n */\nForwardChannelRequestPool.prototype.hasRequest = function(req) {\n if (this.request_) {\n return this.request_ == req;\n }\n\n if (this.requestPool_) {\n return this.requestPool_.has(req);\n }\n\n return false;\n};\n\n\n/**\n * Adds a new request to the pool.\n *\n * @param {!ChannelRequest} req The new channel request.\n */\nForwardChannelRequestPool.prototype.addRequest = function(req) {\n if (this.requestPool_) {\n this.requestPool_.add(req);\n } else {\n this.request_ = req;\n }\n};\n\n\n/**\n * Removes the given request from the pool.\n *\n * @param {ChannelRequest} req The channel request.\n * @return {boolean} Whether the request has been removed from the pool.\n */\nForwardChannelRequestPool.prototype.removeRequest = function(req) {\n if (this.request_ && this.request_ == req) {\n this.request_ = null;\n return true;\n }\n\n if (this.requestPool_ && this.requestPool_.has(req)) {\n this.requestPool_.delete(req);\n return true;\n }\n\n return false;\n};\n\n\n/**\n * Clears the pool and cancel all the pending requests.\n */\nForwardChannelRequestPool.prototype.cancel = function() {\n // save any pending messages\n this.pendingMessages_ = this.getPendingMessages();\n\n if (this.request_) {\n this.request_.cancel();\n this.request_ = null;\n return;\n }\n\n if (this.requestPool_ && this.requestPool_.size !== 0) {\n for (const val of this.requestPool_.values()) {\n val.cancel();\n }\n this.requestPool_.clear();\n }\n};\n\n\n/**\n * @return {boolean} Whether there are any pending requests.\n */\nForwardChannelRequestPool.prototype.hasPendingRequest = function() {\n return (this.request_ != null) ||\n (this.requestPool_ != null && this.requestPool_.size !== 0);\n};\n\n\n/**\n * @return {!Array<Wire.QueuedMap>} All the pending messages from the pool,\n * as a new array.\n */\nForwardChannelRequestPool.prototype.getPendingMessages = function() {\n if (this.request_ != null) {\n return this.pendingMessages_.concat(this.request_.getPendingMessages());\n }\n\n if (this.requestPool_ != null && this.requestPool_.size !== 0) {\n let result = this.pendingMessages_;\n for (const val of this.requestPool_.values()) {\n result = result.concat(val.getPendingMessages());\n }\n return result;\n }\n\n return array.clone(this.pendingMessages_);\n};\n\n\n/**\n * Records pending messages, e.g. when a request receives a failed response.\n *\n * @param {!Array<Wire.QueuedMap>} messages Pending messages.\n */\nForwardChannelRequestPool.prototype.addPendingMessages = function(messages) {\n this.pendingMessages_ = this.pendingMessages_.concat(messages);\n};\n\n\n/**\n * Clears any recorded pending messages.\n */\nForwardChannelRequestPool.prototype.clearPendingMessages = function() {\n this.pendingMessages_.length = 0;\n};\n\n\n/**\n * Cancels all pending requests and force the completion of channel requests.\n *\n * Need go through the standard onRequestComplete logic to expose the max-retry\n * failure in the standard way.\n *\n * @param {function(!ChannelRequest)} onComplete The completion callback.\n * @return {boolean} true if any request has been forced to complete.\n */\nForwardChannelRequestPool.prototype.forceComplete = function(onComplete) {\n if (this.request_ != null) {\n this.request_.cancel();\n onComplete(this.request_);\n return true;\n }\n\n if (this.requestPool_ && this.requestPool_.size !== 0) {\n for (const val of this.requestPool_.values()) {\n val.cancel();\n onComplete(val);\n }\n return true;\n }\n\n return false;\n};\n\nexports = ForwardChannelRequestPool;\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generics method for collection-like classes and objects.\n *\n *\n * This file contains functions to work with collections. It supports using\n * Map, Set, Array and Object and other classes that implement collection-like\n * methods.\n * @suppress {strictMissingProperties}\n */\n\n\ngoog.provide('goog.structs');\n\ngoog.require('goog.array');\ngoog.require('goog.object');\n\n\n// We treat an object as a dictionary if it has getKeys or it is an object that\n// isn't arrayLike.\n\n\n/**\n * Returns the number of values in the collection-like object.\n * @param {Object} col The collection-like object.\n * @return {number} The number of values in the collection-like object.\n */\ngoog.structs.getCount = function(col) {\n 'use strict';\n if (col.getCount && typeof col.getCount == 'function') {\n return col.getCount();\n }\n if (goog.isArrayLike(col) || typeof col === 'string') {\n return col.length;\n }\n return goog.object.getCount(col);\n};\n\n\n/**\n * Returns the values of the collection-like object.\n * @param {Object} col The collection-like object.\n * @return {!Array<?>} The values in the collection-like object.\n */\ngoog.structs.getValues = function(col) {\n 'use strict';\n if (col.getValues && typeof col.getValues == 'function') {\n return col.getValues();\n }\n if (typeof col === 'string') {\n return col.split('');\n }\n if (goog.isArrayLike(col)) {\n var rv = [];\n var l = col.length;\n for (var i = 0; i < l; i++) {\n rv.push(col[i]);\n }\n return rv;\n }\n return goog.object.getValues(col);\n};\n\n\n/**\n * Returns the keys of the collection. Some collections have no notion of\n * keys/indexes and this function will return undefined in those cases.\n * @param {Object} col The collection-like object.\n * @return {!Array|undefined} The keys in the collection.\n */\ngoog.structs.getKeys = function(col) {\n 'use strict';\n if (col.getKeys && typeof col.getKeys == 'function') {\n return col.getKeys();\n }\n // if we have getValues but no getKeys we know this is a key-less collection\n if (col.getValues && typeof col.getValues == 'function') {\n return undefined;\n }\n if (goog.isArrayLike(col) || typeof col === 'string') {\n var rv = [];\n var l = col.length;\n for (var i = 0; i < l; i++) {\n rv.push(i);\n }\n return rv;\n }\n\n return goog.object.getKeys(col);\n};\n\n\n/**\n * Whether the collection contains the given value. This is O(n) and uses\n * equals (==) to test the existence.\n * @param {Object} col The collection-like object.\n * @param {*} val The value to check for.\n * @return {boolean} True if the map contains the value.\n */\ngoog.structs.contains = function(col, val) {\n 'use strict';\n if (col.contains && typeof col.contains == 'function') {\n return col.contains(val);\n }\n if (col.containsValue && typeof col.containsValue == 'function') {\n return col.containsValue(val);\n }\n if (goog.isArrayLike(col) || typeof col === 'string') {\n return goog.array.contains(/** @type {!Array<?>} */ (col), val);\n }\n return goog.object.containsValue(col, val);\n};\n\n\n/**\n * Whether the collection is empty.\n * @param {Object} col The collection-like object.\n * @return {boolean} True if empty.\n */\ngoog.structs.isEmpty = function(col) {\n 'use strict';\n if (col.isEmpty && typeof col.isEmpty == 'function') {\n return col.isEmpty();\n }\n\n // We do not use goog.string.isEmptyOrWhitespace because here we treat the\n // string as\n // collection and as such even whitespace matters\n\n if (goog.isArrayLike(col) || typeof col === 'string') {\n return goog.array.isEmpty(/** @type {!Array<?>} */ (col));\n }\n return goog.object.isEmpty(col);\n};\n\n\n/**\n * Removes all the elements from the collection.\n * @param {Object} col The collection-like object.\n * @return {void}\n */\ngoog.structs.clear = function(col) {\n 'use strict';\n // NOTE(arv): This should not contain strings because strings are immutable\n if (col.clear && typeof col.clear == 'function') {\n col.clear();\n } else if (goog.isArrayLike(col)) {\n goog.array.clear(/** @type {IArrayLike<?>} */ (col));\n } else {\n goog.object.clear(col);\n }\n};\n\n\n/**\n * Calls a function for each value in a collection. The function takes\n * three arguments; the value, the key and the collection.\n *\n * @param {S} col The collection-like object.\n * @param {function(this:T,?,?,S):?} f The function to call for every value.\n * This function takes\n * 3 arguments (the value, the key or undefined if the collection has no\n * notion of keys, and the collection) and the return value is irrelevant.\n * @param {T=} opt_obj The object to be used as the value of 'this'\n * within `f`.\n * @return {void}\n * @template T,S\n * @deprecated Use a more specific method, e.g. goog.array.forEach,\n * goog.object.forEach, or for-of.\n */\ngoog.structs.forEach = function(col, f, opt_obj) {\n 'use strict';\n if (col.forEach && typeof col.forEach == 'function') {\n col.forEach(f, opt_obj);\n } else if (goog.isArrayLike(col) || typeof col === 'string') {\n goog.array.forEach(/** @type {!Array<?>} */ (col), f, opt_obj);\n } else {\n var keys = goog.structs.getKeys(col);\n var values = goog.structs.getValues(col);\n var l = values.length;\n for (var i = 0; i < l; i++) {\n f.call(/** @type {?} */ (opt_obj), values[i], keys && keys[i], col);\n }\n }\n};\n\n\n/**\n * Calls a function for every value in the collection. When a call returns true,\n * adds the value to a new collection (Array is returned by default).\n *\n * @param {S} col The collection-like object.\n * @param {function(this:T,?,?,S):boolean} f The function to call for every\n * value. This function takes\n * 3 arguments (the value, the key or undefined if the collection has no\n * notion of keys, and the collection) and should return a Boolean. If the\n * return value is true the value is added to the result collection. If it\n * is false the value is not included.\n * @param {T=} opt_obj The object to be used as the value of 'this'\n * within `f`.\n * @return {!Object|!Array<?>} A new collection where the passed values are\n * present. If col is a key-less collection an array is returned. If col\n * has keys and values a plain old JS object is returned.\n * @template T,S\n */\ngoog.structs.filter = function(col, f, opt_obj) {\n 'use strict';\n if (typeof col.filter == 'function') {\n return col.filter(f, opt_obj);\n }\n if (goog.isArrayLike(col) || typeof col === 'string') {\n return goog.array.filter(/** @type {!Array<?>} */ (col), f, opt_obj);\n }\n\n var rv;\n var keys = goog.structs.getKeys(col);\n var values = goog.structs.getValues(col);\n var l = values.length;\n if (keys) {\n rv = {};\n for (var i = 0; i < l; i++) {\n if (f.call(/** @type {?} */ (opt_obj), values[i], keys[i], col)) {\n rv[keys[i]] = values[i];\n }\n }\n } else {\n // We should not use goog.array.filter here since we want to make sure that\n // the index is undefined as well as make sure that col is passed to the\n // function.\n rv = [];\n for (var i = 0; i < l; i++) {\n if (f.call(opt_obj, values[i], undefined, col)) {\n rv.push(values[i]);\n }\n }\n }\n return rv;\n};\n\n\n/**\n * Calls a function for every value in the collection and adds the result into a\n * new collection (defaults to creating a new Array).\n *\n * @param {S} col The collection-like object.\n * @param {function(this:T,?,?,S):V} f The function to call for every value.\n * This function takes 3 arguments (the value, the key or undefined if the\n * collection has no notion of keys, and the collection) and should return\n * something. The result will be used as the value in the new collection.\n * @param {T=} opt_obj The object to be used as the value of 'this'\n * within `f`.\n * @return {!Object<V>|!Array<V>} A new collection with the new values. If\n * col is a key-less collection an array is returned. If col has keys and\n * values a plain old JS object is returned.\n * @template T,S,V\n */\ngoog.structs.map = function(col, f, opt_obj) {\n 'use strict';\n if (typeof col.map == 'function') {\n return col.map(f, opt_obj);\n }\n if (goog.isArrayLike(col) || typeof col === 'string') {\n return goog.array.map(/** @type {!Array<?>} */ (col), f, opt_obj);\n }\n\n var rv;\n var keys = goog.structs.getKeys(col);\n var values = goog.structs.getValues(col);\n var l = values.length;\n if (keys) {\n rv = {};\n for (var i = 0; i < l; i++) {\n rv[keys[i]] = f.call(/** @type {?} */ (opt_obj), values[i], keys[i], col);\n }\n } else {\n // We should not use goog.array.map here since we want to make sure that\n // the index is undefined as well as make sure that col is passed to the\n // function.\n rv = [];\n for (var i = 0; i < l; i++) {\n rv[i] = f.call(/** @type {?} */ (opt_obj), values[i], undefined, col);\n }\n }\n return rv;\n};\n\n\n/**\n * Calls f for each value in a collection. If any call returns true this returns\n * true (without checking the rest). If all returns false this returns false.\n *\n * @param {S} col The collection-like object.\n * @param {function(this:T,?,?,S):boolean} f The function to call for every\n * value. This function takes 3 arguments (the value, the key or undefined\n * if the collection has no notion of keys, and the collection) and should\n * return a boolean.\n * @param {T=} opt_obj The object to be used as the value of 'this'\n * within `f`.\n * @return {boolean} True if any value passes the test.\n * @template T,S\n */\ngoog.structs.some = function(col, f, opt_obj) {\n 'use strict';\n if (typeof col.some == 'function') {\n return col.some(f, opt_obj);\n }\n if (goog.isArrayLike(col) || typeof col === 'string') {\n return goog.array.some(/** @type {!Array<?>} */ (col), f, opt_obj);\n }\n var keys = goog.structs.getKeys(col);\n var values = goog.structs.getValues(col);\n var l = values.length;\n for (var i = 0; i < l; i++) {\n if (f.call(/** @type {?} */ (opt_obj), values[i], keys && keys[i], col)) {\n return true;\n }\n }\n return false;\n};\n\n\n/**\n * Calls f for each value in a collection. If all calls return true this return\n * true this returns true. If any returns false this returns false at this point\n * and does not continue to check the remaining values.\n *\n * @param {S} col The collection-like object.\n * @param {function(this:T,?,?,S):boolean} f The function to call for every\n * value. This function takes 3 arguments (the value, the key or\n * undefined if the collection has no notion of keys, and the collection)\n * and should return a boolean.\n * @param {T=} opt_obj The object to be used as the value of 'this'\n * within `f`.\n * @return {boolean} True if all key-value pairs pass the test.\n * @template T,S\n */\ngoog.structs.every = function(col, f, opt_obj) {\n 'use strict';\n if (typeof col.every == 'function') {\n return col.every(f, opt_obj);\n }\n if (goog.isArrayLike(col) || typeof col === 'string') {\n return goog.array.every(/** @type {!Array<?>} */ (col), f, opt_obj);\n }\n var keys = goog.structs.getKeys(col);\n var values = goog.structs.getValues(col);\n var l = values.length;\n for (var i = 0; i < l; i++) {\n if (!f.call(/** @type {?} */ (opt_obj), values[i], keys && keys[i], col)) {\n return false;\n }\n }\n return true;\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Datastructure: Hash Map.\n *\n *\n * This file contains an implementation of a Map structure. It implements a lot\n * of the methods used in goog.structs so those functions work on hashes. This\n * is best suited for complex key types. For simple keys such as numbers and\n * strings consider using the lighter-weight utilities in goog.object.\n */\n\n\ngoog.provide('goog.structs.Map');\n\ngoog.require('goog.iter.Iterator');\ngoog.require('goog.iter.StopIteration');\n\n\n\n/**\n * Class for Hash Map datastructure.\n * @param {*=} opt_map Map or Object to initialize the map with.\n * @param {...*} var_args If 2 or more arguments are present then they\n * will be used as key-value pairs.\n * @constructor\n * @template K, V\n * @deprecated This type is misleading: use ES6 Map instead.\n */\ngoog.structs.Map = function(opt_map, var_args) {\n 'use strict';\n /**\n * Underlying JS object used to implement the map.\n * @private {!Object}\n */\n this.map_ = {};\n\n /**\n * An array of keys. This is necessary for two reasons:\n * 1. Iterating the keys using for (var key in this.map_) allocates an\n * object for every key in IE which is really bad for IE6 GC perf.\n * 2. Without a side data structure, we would need to escape all the keys\n * as that would be the only way we could tell during iteration if the\n * key was an internal key or a property of the object.\n *\n * This array can contain deleted keys so it's necessary to check the map\n * as well to see if the key is still in the map (this doesn't require a\n * memory allocation in IE).\n * @private {!Array<string>}\n */\n this.keys_ = [];\n\n /**\n * The number of key value pairs in the map.\n * @private {number}\n */\n this.count_ = 0;\n\n /**\n * Version used to detect changes while iterating.\n * @private {number}\n */\n this.version_ = 0;\n\n var argLength = arguments.length;\n\n if (argLength > 1) {\n if (argLength % 2) {\n throw new Error('Uneven number of arguments');\n }\n for (var i = 0; i < argLength; i += 2) {\n this.set(arguments[i], arguments[i + 1]);\n }\n } else if (opt_map) {\n this.addAll(/** @type {!Object} */ (opt_map));\n }\n};\n\n\n/**\n * @return {number} The number of key-value pairs in the map.\n */\ngoog.structs.Map.prototype.getCount = function() {\n 'use strict';\n return this.count_;\n};\n\n\n/**\n * Returns the values of the map.\n * @return {!Array<V>} The values in the map.\n */\ngoog.structs.Map.prototype.getValues = function() {\n 'use strict';\n this.cleanupKeysArray_();\n\n var rv = [];\n for (var i = 0; i < this.keys_.length; i++) {\n var key = this.keys_[i];\n rv.push(this.map_[key]);\n }\n return rv;\n};\n\n\n/**\n * Returns the keys of the map.\n * @return {!Array<string>} Array of string values.\n */\ngoog.structs.Map.prototype.getKeys = function() {\n 'use strict';\n this.cleanupKeysArray_();\n return /** @type {!Array<string>} */ (this.keys_.concat());\n};\n\n\n/**\n * Whether the map contains the given key.\n * @param {*} key The key to check for.\n * @return {boolean} Whether the map contains the key.\n */\ngoog.structs.Map.prototype.containsKey = function(key) {\n 'use strict';\n return goog.structs.Map.hasKey_(this.map_, key);\n};\n\n\n/**\n * Whether the map contains the given value. This is O(n).\n * @param {V} val The value to check for.\n * @return {boolean} Whether the map contains the value.\n */\ngoog.structs.Map.prototype.containsValue = function(val) {\n 'use strict';\n for (var i = 0; i < this.keys_.length; i++) {\n var key = this.keys_[i];\n if (goog.structs.Map.hasKey_(this.map_, key) && this.map_[key] == val) {\n return true;\n }\n }\n return false;\n};\n\n\n/**\n * Whether this map is equal to the argument map.\n * @param {goog.structs.Map} otherMap The map against which to test equality.\n * @param {function(V, V): boolean=} opt_equalityFn Optional equality function\n * to test equality of values. If not specified, this will test whether\n * the values contained in each map are identical objects.\n * @return {boolean} Whether the maps are equal.\n */\ngoog.structs.Map.prototype.equals = function(otherMap, opt_equalityFn) {\n 'use strict';\n if (this === otherMap) {\n return true;\n }\n\n if (this.count_ != otherMap.getCount()) {\n return false;\n }\n\n var equalityFn = opt_equalityFn || goog.structs.Map.defaultEquals;\n\n this.cleanupKeysArray_();\n for (var key, i = 0; key = this.keys_[i]; i++) {\n if (!equalityFn(this.get(key), otherMap.get(key))) {\n return false;\n }\n }\n\n return true;\n};\n\n\n/**\n * Default equality test for values.\n * @param {*} a The first value.\n * @param {*} b The second value.\n * @return {boolean} Whether a and b reference the same object.\n */\ngoog.structs.Map.defaultEquals = function(a, b) {\n 'use strict';\n return a === b;\n};\n\n\n/**\n * @return {boolean} Whether the map is empty.\n */\ngoog.structs.Map.prototype.isEmpty = function() {\n 'use strict';\n return this.count_ == 0;\n};\n\n\n/**\n * Removes all key-value pairs from the map.\n */\ngoog.structs.Map.prototype.clear = function() {\n 'use strict';\n this.map_ = {};\n this.keys_.length = 0;\n this.count_ = 0;\n this.version_ = 0;\n};\n\n\n/**\n * Removes a key-value pair based on the key. This is O(logN) amortized due to\n * updating the keys array whenever the count becomes half the size of the keys\n * in the keys array.\n * @param {*} key The key to remove.\n * @return {boolean} Whether object was removed.\n */\ngoog.structs.Map.prototype.remove = function(key) {\n 'use strict';\n if (goog.structs.Map.hasKey_(this.map_, key)) {\n delete this.map_[key];\n this.count_--;\n this.version_++;\n\n // clean up the keys array if the threshold is hit\n if (this.keys_.length > 2 * this.count_) {\n this.cleanupKeysArray_();\n }\n\n return true;\n }\n return false;\n};\n\n\n/**\n * Cleans up the temp keys array by removing entries that are no longer in the\n * map.\n * @private\n */\ngoog.structs.Map.prototype.cleanupKeysArray_ = function() {\n 'use strict';\n if (this.count_ != this.keys_.length) {\n // First remove keys that are no longer in the map.\n var srcIndex = 0;\n var destIndex = 0;\n while (srcIndex < this.keys_.length) {\n var key = this.keys_[srcIndex];\n if (goog.structs.Map.hasKey_(this.map_, key)) {\n this.keys_[destIndex++] = key;\n }\n srcIndex++;\n }\n this.keys_.length = destIndex;\n }\n\n if (this.count_ != this.keys_.length) {\n // If the count still isn't correct, that means we have duplicates. This can\n // happen when the same key is added and removed multiple times. Now we have\n // to allocate one extra Object to remove the duplicates. This could have\n // been done in the first pass, but in the common case, we can avoid\n // allocating an extra object by only doing this when necessary.\n var seen = {};\n var srcIndex = 0;\n var destIndex = 0;\n while (srcIndex < this.keys_.length) {\n var key = this.keys_[srcIndex];\n if (!(goog.structs.Map.hasKey_(seen, key))) {\n this.keys_[destIndex++] = key;\n seen[key] = 1;\n }\n srcIndex++;\n }\n this.keys_.length = destIndex;\n }\n};\n\n\n/**\n * Returns the value for the given key. If the key is not found and the default\n * value is not given this will return `undefined`.\n * @param {*} key The key to get the value for.\n * @param {DEFAULT=} opt_val The value to return if no item is found for the\n * given key, defaults to undefined.\n * @return {V|DEFAULT} The value for the given key.\n * @template DEFAULT\n */\ngoog.structs.Map.prototype.get = function(key, opt_val) {\n 'use strict';\n if (goog.structs.Map.hasKey_(this.map_, key)) {\n return this.map_[key];\n }\n return opt_val;\n};\n\n\n/**\n * Adds a key-value pair to the map.\n * @param {*} key The key.\n * @param {V} value The value to add.\n * @return {*} Some subclasses return a value.\n */\ngoog.structs.Map.prototype.set = function(key, value) {\n 'use strict';\n if (!(goog.structs.Map.hasKey_(this.map_, key))) {\n this.count_++;\n // TODO(johnlenz): This class lies, it claims to return an array of string\n // keys, but instead returns the original object used.\n this.keys_.push(/** @type {?} */ (key));\n // Only change the version if we add a new key.\n this.version_++;\n }\n this.map_[key] = value;\n};\n\n\n/**\n * Adds multiple key-value pairs from another goog.structs.Map or Object.\n * @param {?Object} map Object containing the data to add.\n */\ngoog.structs.Map.prototype.addAll = function(map) {\n 'use strict';\n if (map instanceof goog.structs.Map) {\n var keys = map.getKeys();\n for (var i = 0; i < keys.length; i++) {\n this.set(keys[i], map.get(keys[i]));\n }\n } else {\n for (var key in map) {\n this.set(key, map[key]);\n }\n }\n};\n\n\n/**\n * Calls the given function on each entry in the map.\n * @param {function(this:T, V, K, goog.structs.Map<K,V>)} f\n * @param {T=} opt_obj The value of \"this\" inside f.\n * @template T\n */\ngoog.structs.Map.prototype.forEach = function(f, opt_obj) {\n 'use strict';\n var keys = this.getKeys();\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = this.get(key);\n f.call(opt_obj, value, key, this);\n }\n};\n\n\n/**\n * Clones a map and returns a new map.\n * @return {!goog.structs.Map} A new map with the same key-value pairs.\n */\ngoog.structs.Map.prototype.clone = function() {\n 'use strict';\n return new goog.structs.Map(this);\n};\n\n\n/**\n * Returns a new map in which all the keys and values are interchanged\n * (keys become values and values become keys). If multiple keys map to the\n * same value, the chosen transposed value is implementation-dependent.\n *\n * It acts very similarly to {goog.object.transpose(Object)}.\n *\n * @return {!goog.structs.Map} The transposed map.\n */\ngoog.structs.Map.prototype.transpose = function() {\n 'use strict';\n var transposed = new goog.structs.Map();\n for (var i = 0; i < this.keys_.length; i++) {\n var key = this.keys_[i];\n var value = this.map_[key];\n transposed.set(value, key);\n }\n\n return transposed;\n};\n\n\n/**\n * @return {!Object} Object representation of the map.\n */\ngoog.structs.Map.prototype.toObject = function() {\n 'use strict';\n this.cleanupKeysArray_();\n var obj = {};\n for (var i = 0; i < this.keys_.length; i++) {\n var key = this.keys_[i];\n obj[key] = this.map_[key];\n }\n return obj;\n};\n\n\n/**\n * Returns an iterator that iterates over the keys in the map. Removal of keys\n * while iterating might have undesired side effects.\n * @return {!goog.iter.Iterator} An iterator over the keys in the map.\n */\ngoog.structs.Map.prototype.getKeyIterator = function() {\n 'use strict';\n return this.__iterator__(true);\n};\n\n\n/**\n * Returns an iterator that iterates over the values in the map. Removal of\n * keys while iterating might have undesired side effects.\n * @return {!goog.iter.Iterator} An iterator over the values in the map.\n */\ngoog.structs.Map.prototype.getValueIterator = function() {\n 'use strict';\n return this.__iterator__(false);\n};\n\n\n/**\n * Returns an iterator that iterates over the values or the keys in the map.\n * This throws an exception if the map was mutated since the iterator was\n * created.\n * @param {boolean=} opt_keys True to iterate over the keys. False to iterate\n * over the values. The default value is false.\n * @return {!goog.iter.Iterator} An iterator over the values or keys in the map.\n */\ngoog.structs.Map.prototype.__iterator__ = function(opt_keys) {\n 'use strict';\n // Clean up keys to minimize the risk of iterating over dead keys.\n this.cleanupKeysArray_();\n\n var i = 0;\n var version = this.version_;\n var selfObj = this;\n\n var newIter = new goog.iter.Iterator;\n newIter.next = function() {\n 'use strict';\n if (version != selfObj.version_) {\n throw new Error('The map has changed since the iterator was created');\n }\n if (i >= selfObj.keys_.length) {\n throw goog.iter.StopIteration;\n }\n var key = selfObj.keys_[i++];\n return opt_keys ? key : selfObj.map_[key];\n };\n return newIter;\n};\n\n\n/**\n * Safe way to test for hasOwnProperty. It even allows testing for\n * 'hasOwnProperty'.\n * @param {!Object} obj The object to test for presence of the given key.\n * @param {*} key The key to check for.\n * @return {boolean} Whether the object has the key.\n * @private\n */\ngoog.structs.Map.hasKey_ = function(obj, key) {\n 'use strict';\n return Object.prototype.hasOwnProperty.call(obj, key);\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Simple utilities for dealing with URI strings.\n *\n * This package is deprecated in favour of the Closure URL package (goog.url)\n * when manipulating URIs for use by a browser. This package uses regular\n * expressions to parse a potential URI which can fall out of sync with how a\n * browser will actually interpret the URI. See\n * `goog.uri.utils.setUrlPackageSupportLoggingHandler` for one way to identify\n * URIs that should instead be parsed using the URL package.\n *\n * This is intended to be a lightweight alternative to constructing goog.Uri\n * objects. Whereas goog.Uri adds several kilobytes to the binary regardless\n * of how much of its functionality you use, this is designed to be a set of\n * mostly-independent utilities so that the compiler includes only what is\n * necessary for the task. Estimated savings of porting is 5k pre-gzip and\n * 1.5k post-gzip. To ensure the savings remain, future developers should\n * avoid adding new functionality to existing functions, but instead create\n * new ones and factor out shared code.\n *\n * Many of these utilities have limited functionality, tailored to common\n * cases. The query parameter utilities assume that the parameter keys are\n * already encoded, since most keys are compile-time alphanumeric strings. The\n * query parameter mutation utilities also do not tolerate fragment identifiers.\n *\n * By design, these functions can be slower than goog.Uri equivalents.\n * Repeated calls to some of functions may be quadratic in behavior for IE,\n * although the effect is somewhat limited given the 2kb limit.\n *\n * One advantage of the limited functionality here is that this approach is\n * less sensitive to differences in URI encodings than goog.Uri, since these\n * functions operate on strings directly, rather than decoding them and\n * then re-encoding.\n *\n * Uses features of RFC 3986 for parsing/formatting URIs:\n * http://www.ietf.org/rfc/rfc3986.txt\n */\n\ngoog.provide('goog.uri.utils');\ngoog.provide('goog.uri.utils.ComponentIndex');\ngoog.provide('goog.uri.utils.QueryArray');\ngoog.provide('goog.uri.utils.QueryValue');\ngoog.provide('goog.uri.utils.StandardQueryParam');\n\ngoog.require('goog.asserts');\ngoog.require('goog.string');\n\n\n/**\n * Character codes inlined to avoid object allocations due to charCode.\n * @enum {number}\n * @private\n */\ngoog.uri.utils.CharCode_ = {\n AMPERSAND: 38,\n EQUAL: 61,\n HASH: 35,\n QUESTION: 63\n};\n\n\n/**\n * Builds a URI string from already-encoded parts.\n *\n * No encoding is performed. Any component may be omitted as either null or\n * undefined.\n *\n * @param {?string=} opt_scheme The scheme such as 'http'.\n * @param {?string=} opt_userInfo The user name before the '@'.\n * @param {?string=} opt_domain The domain such as 'www.google.com', already\n * URI-encoded.\n * @param {(string|number|null)=} opt_port The port number.\n * @param {?string=} opt_path The path, already URI-encoded. If it is not\n * empty, it must begin with a slash.\n * @param {?string=} opt_queryData The URI-encoded query data.\n * @param {?string=} opt_fragment The URI-encoded fragment identifier.\n * @return {string} The fully combined URI.\n */\ngoog.uri.utils.buildFromEncodedParts = function(\n opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData,\n opt_fragment) {\n 'use strict';\n var out = '';\n\n if (opt_scheme) {\n out += opt_scheme + ':';\n }\n\n if (opt_domain) {\n out += '//';\n\n if (opt_userInfo) {\n out += opt_userInfo + '@';\n }\n\n out += opt_domain;\n\n if (opt_port) {\n out += ':' + opt_port;\n }\n }\n\n if (opt_path) {\n out += opt_path;\n }\n\n if (opt_queryData) {\n out += '?' + opt_queryData;\n }\n\n if (opt_fragment) {\n out += '#' + opt_fragment;\n }\n\n return out;\n};\n\n\n/**\n * A regular expression for breaking a URI into its component parts.\n *\n * {@link http://www.ietf.org/rfc/rfc3986.txt} says in Appendix B\n * As the \"first-match-wins\" algorithm is identical to the \"greedy\"\n * disambiguation method used by POSIX regular expressions, it is natural and\n * commonplace to use a regular expression for parsing the potential five\n * components of a URI reference.\n *\n * The following line is the regular expression for breaking-down a\n * well-formed URI reference into its components.\n *\n * <pre>\n * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?\n * 12 3 4 5 6 7 8 9\n * </pre>\n *\n * The numbers in the second line above are only to assist readability; they\n * indicate the reference points for each subexpression (i.e., each paired\n * parenthesis). We refer to the value matched for subexpression <n> as $<n>.\n * For example, matching the above expression to\n * <pre>\n * http://www.ics.uci.edu/pub/ietf/uri/#Related\n * </pre>\n * results in the following subexpression matches:\n * <pre>\n * $1 = http:\n * $2 = http\n * $3 = //www.ics.uci.edu\n * $4 = www.ics.uci.edu\n * $5 = /pub/ietf/uri/\n * $6 = <undefined>\n * $7 = <undefined>\n * $8 = #Related\n * $9 = Related\n * </pre>\n * where <undefined> indicates that the component is not present, as is the\n * case for the query component in the above example. Therefore, we can\n * determine the value of the five components as\n * <pre>\n * scheme = $2\n * authority = $4\n * path = $5\n * query = $7\n * fragment = $9\n * </pre>\n *\n * The regular expression has been modified slightly to expose the\n * userInfo, domain, and port separately from the authority.\n * The modified version yields\n * <pre>\n * $1 = http scheme\n * $2 = <undefined> userInfo -\\\n * $3 = www.ics.uci.edu domain | authority\n * $4 = <undefined> port -/\n * $5 = /pub/ietf/uri/ path\n * $6 = <undefined> query without ?\n * $7 = Related fragment without #\n * </pre>\n *\n * TODO(user): separate out the authority terminating characters once this\n * file is moved to ES6.\n * @type {!RegExp}\n * @private\n */\ngoog.uri.utils.splitRe_ = new RegExp(\n '^' + // Anchor against the entire string.\n '(?:' +\n '([^:/?#.]+)' + // scheme - ignore special characters\n // used by other URL parts such as :,\n // ?, /, #, and .\n ':)?' +\n '(?://' +\n '(?:([^\\\\\\\\/?#]*)@)?' + // userInfo\n '([^\\\\\\\\/?#]*?)' + // domain\n '(?::([0-9]+))?' + // port\n '(?=[\\\\\\\\/?#]|$)' + // authority-terminating character.\n ')?' +\n '([^?#]+)?' + // path\n '(?:\\\\?([^#]*))?' + // query\n '(?:#([\\\\s\\\\S]*))?' + // fragment. Can't use '.*' with 's' flag as Firefox\n // doesn't support the flag, and can't use an\n // \"everything set\" ([^]) as IE10 doesn't match any\n // characters with it.\n '$');\n\n\n/**\n * The index of each URI component in the return value of goog.uri.utils.split.\n * @enum {number}\n */\ngoog.uri.utils.ComponentIndex = {\n SCHEME: 1,\n USER_INFO: 2,\n DOMAIN: 3,\n PORT: 4,\n PATH: 5,\n QUERY_DATA: 6,\n FRAGMENT: 7\n};\n\n/**\n * @type {?function(string)}\n * @private\n */\ngoog.uri.utils.urlPackageSupportLoggingHandler_ = null;\n\n/**\n * @param {?function(string)} handler The handler function to call when a URI\n * with a protocol that is better supported by the Closure URL package is\n * detected.\n */\ngoog.uri.utils.setUrlPackageSupportLoggingHandler = function(handler) {\n 'use strict';\n goog.uri.utils.urlPackageSupportLoggingHandler_ = handler;\n};\n\n/**\n * Splits a URI into its component parts.\n *\n * Each component can be accessed via the component indices; for example:\n * <pre>\n * goog.uri.utils.split(someStr)[goog.uri.utils.ComponentIndex.QUERY_DATA];\n * </pre>\n *\n * @param {string} uri The URI string to examine.\n * @return {!Array<string|undefined>} Each component still URI-encoded.\n * Each component that is present will contain the encoded value, whereas\n * components that are not present will be undefined or empty, depending\n * on the browser's regular expression implementation. Never null, since\n * arbitrary strings may still look like path names.\n */\ngoog.uri.utils.split = function(uri) {\n 'use strict';\n // See @return comment -- never null.\n var result = /** @type {!Array<string|undefined>} */ (\n uri.match(goog.uri.utils.splitRe_));\n if (goog.uri.utils.urlPackageSupportLoggingHandler_ &&\n ['http', 'https', 'ws', 'wss',\n 'ftp'].indexOf(result[goog.uri.utils.ComponentIndex.SCHEME]) >= 0) {\n goog.uri.utils.urlPackageSupportLoggingHandler_(uri);\n }\n return result;\n};\n\n\n/**\n * @param {?string} uri A possibly null string.\n * @param {boolean=} opt_preserveReserved If true, percent-encoding of RFC-3986\n * reserved characters will not be removed.\n * @return {?string} The string URI-decoded, or null if uri is null.\n * @private\n */\ngoog.uri.utils.decodeIfPossible_ = function(uri, opt_preserveReserved) {\n 'use strict';\n if (!uri) {\n return uri;\n }\n\n return opt_preserveReserved ? decodeURI(uri) : decodeURIComponent(uri);\n};\n\n\n/**\n * Gets a URI component by index.\n *\n * It is preferred to use the getPathEncoded() variety of functions ahead,\n * since they are more readable.\n *\n * @param {goog.uri.utils.ComponentIndex} componentIndex The component index.\n * @param {string} uri The URI to examine.\n * @return {?string} The still-encoded component, or null if the component\n * is not present.\n * @private\n */\ngoog.uri.utils.getComponentByIndex_ = function(componentIndex, uri) {\n 'use strict';\n // Convert undefined, null, and empty string into null.\n return goog.uri.utils.split(uri)[componentIndex] || null;\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The protocol or scheme, or null if none. Does not\n * include trailing colons or slashes.\n */\ngoog.uri.utils.getScheme = function(uri) {\n 'use strict';\n return goog.uri.utils.getComponentByIndex_(\n goog.uri.utils.ComponentIndex.SCHEME, uri);\n};\n\n\n/**\n * Gets the effective scheme for the URL. If the URL is relative then the\n * scheme is derived from the page's location.\n * @param {string} uri The URI to examine.\n * @return {string} The protocol or scheme, always lower case.\n */\ngoog.uri.utils.getEffectiveScheme = function(uri) {\n 'use strict';\n var scheme = goog.uri.utils.getScheme(uri);\n if (!scheme && goog.global.self && goog.global.self.location) {\n var protocol = goog.global.self.location.protocol;\n scheme = protocol.substr(0, protocol.length - 1);\n }\n // NOTE: When called from a web worker in Firefox 3.5, location may be null.\n // All other browsers with web workers support self.location from the worker.\n return scheme ? scheme.toLowerCase() : '';\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The user name still encoded, or null if none.\n */\ngoog.uri.utils.getUserInfoEncoded = function(uri) {\n 'use strict';\n return goog.uri.utils.getComponentByIndex_(\n goog.uri.utils.ComponentIndex.USER_INFO, uri);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The decoded user info, or null if none.\n */\ngoog.uri.utils.getUserInfo = function(uri) {\n 'use strict';\n return goog.uri.utils.decodeIfPossible_(\n goog.uri.utils.getUserInfoEncoded(uri));\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The domain name still encoded, or null if none.\n */\ngoog.uri.utils.getDomainEncoded = function(uri) {\n 'use strict';\n return goog.uri.utils.getComponentByIndex_(\n goog.uri.utils.ComponentIndex.DOMAIN, uri);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The decoded domain, or null if none.\n */\ngoog.uri.utils.getDomain = function(uri) {\n 'use strict';\n return goog.uri.utils.decodeIfPossible_(\n goog.uri.utils.getDomainEncoded(uri), true /* opt_preserveReserved */);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?number} The port number, or null if none.\n */\ngoog.uri.utils.getPort = function(uri) {\n 'use strict';\n // Coerce to a number. If the result of getComponentByIndex_ is null or\n // non-numeric, the number coersion yields NaN. This will then return\n // null for all non-numeric cases (though also zero, which isn't a relevant\n // port number).\n return Number(\n goog.uri.utils.getComponentByIndex_(\n goog.uri.utils.ComponentIndex.PORT, uri)) ||\n null;\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The path still encoded, or null if none. Includes the\n * leading slash, if any.\n */\ngoog.uri.utils.getPathEncoded = function(uri) {\n 'use strict';\n return goog.uri.utils.getComponentByIndex_(\n goog.uri.utils.ComponentIndex.PATH, uri);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The decoded path, or null if none. Includes the leading\n * slash, if any.\n */\ngoog.uri.utils.getPath = function(uri) {\n 'use strict';\n return goog.uri.utils.decodeIfPossible_(\n goog.uri.utils.getPathEncoded(uri), true /* opt_preserveReserved */);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The query data still encoded, or null if none. Does not\n * include the question mark itself.\n */\ngoog.uri.utils.getQueryData = function(uri) {\n 'use strict';\n return goog.uri.utils.getComponentByIndex_(\n goog.uri.utils.ComponentIndex.QUERY_DATA, uri);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The fragment identifier, or null if none. Does not\n * include the hash mark itself.\n */\ngoog.uri.utils.getFragmentEncoded = function(uri) {\n 'use strict';\n // The hash mark may not appear in any other part of the URL.\n var hashIndex = uri.indexOf('#');\n return hashIndex < 0 ? null : uri.substr(hashIndex + 1);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @param {?string} fragment The encoded fragment identifier, or null if none.\n * Does not include the hash mark itself.\n * @return {string} The URI with the fragment set.\n */\ngoog.uri.utils.setFragmentEncoded = function(uri, fragment) {\n 'use strict';\n return goog.uri.utils.removeFragment(uri) + (fragment ? '#' + fragment : '');\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The decoded fragment identifier, or null if none. Does\n * not include the hash mark.\n */\ngoog.uri.utils.getFragment = function(uri) {\n 'use strict';\n return goog.uri.utils.decodeIfPossible_(\n goog.uri.utils.getFragmentEncoded(uri));\n};\n\n\n/**\n * Extracts everything up to the port of the URI.\n * @param {string} uri The URI string.\n * @return {string} Everything up to and including the port.\n */\ngoog.uri.utils.getHost = function(uri) {\n 'use strict';\n var pieces = goog.uri.utils.split(uri);\n return goog.uri.utils.buildFromEncodedParts(\n pieces[goog.uri.utils.ComponentIndex.SCHEME],\n pieces[goog.uri.utils.ComponentIndex.USER_INFO],\n pieces[goog.uri.utils.ComponentIndex.DOMAIN],\n pieces[goog.uri.utils.ComponentIndex.PORT]);\n};\n\n\n/**\n * Returns the origin for a given URL.\n * @param {string} uri The URI string.\n * @return {string} Everything up to and including the port.\n */\ngoog.uri.utils.getOrigin = function(uri) {\n 'use strict';\n var pieces = goog.uri.utils.split(uri);\n return goog.uri.utils.buildFromEncodedParts(\n pieces[goog.uri.utils.ComponentIndex.SCHEME], null /* opt_userInfo */,\n pieces[goog.uri.utils.ComponentIndex.DOMAIN],\n pieces[goog.uri.utils.ComponentIndex.PORT]);\n};\n\n\n/**\n * Extracts the path of the URL and everything after.\n * @param {string} uri The URI string.\n * @return {string} The URI, starting at the path and including the query\n * parameters and fragment identifier.\n */\ngoog.uri.utils.getPathAndAfter = function(uri) {\n 'use strict';\n var pieces = goog.uri.utils.split(uri);\n return goog.uri.utils.buildFromEncodedParts(\n null, null, null, null, pieces[goog.uri.utils.ComponentIndex.PATH],\n pieces[goog.uri.utils.ComponentIndex.QUERY_DATA],\n pieces[goog.uri.utils.ComponentIndex.FRAGMENT]);\n};\n\n\n/**\n * Gets the URI with the fragment identifier removed.\n * @param {string} uri The URI to examine.\n * @return {string} Everything preceding the hash mark.\n */\ngoog.uri.utils.removeFragment = function(uri) {\n 'use strict';\n // The hash mark may not appear in any other part of the URL.\n var hashIndex = uri.indexOf('#');\n return hashIndex < 0 ? uri : uri.substr(0, hashIndex);\n};\n\n\n/**\n * Ensures that two URI's have the exact same domain, scheme, and port.\n *\n * Unlike the version in goog.Uri, this checks protocol, and therefore is\n * suitable for checking against the browser's same-origin policy.\n *\n * @param {string} uri1 The first URI.\n * @param {string} uri2 The second URI.\n * @return {boolean} Whether they have the same scheme, domain and port.\n */\ngoog.uri.utils.haveSameDomain = function(uri1, uri2) {\n 'use strict';\n var pieces1 = goog.uri.utils.split(uri1);\n var pieces2 = goog.uri.utils.split(uri2);\n return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] ==\n pieces2[goog.uri.utils.ComponentIndex.DOMAIN] &&\n pieces1[goog.uri.utils.ComponentIndex.SCHEME] ==\n pieces2[goog.uri.utils.ComponentIndex.SCHEME] &&\n pieces1[goog.uri.utils.ComponentIndex.PORT] ==\n pieces2[goog.uri.utils.ComponentIndex.PORT];\n};\n\n\n/**\n * Asserts that there are no fragment or query identifiers, only in uncompiled\n * mode.\n * @param {string} uri The URI to examine.\n * @private\n */\ngoog.uri.utils.assertNoFragmentsOrQueries_ = function(uri) {\n 'use strict';\n goog.asserts.assert(\n uri.indexOf('#') < 0 && uri.indexOf('?') < 0,\n 'goog.uri.utils: Fragment or query identifiers are not supported: [%s]',\n uri);\n};\n\n\n/**\n * Supported query parameter values by the parameter serializing utilities.\n *\n * If a value is null or undefined, the key-value pair is skipped, as an easy\n * way to omit parameters conditionally. Non-array parameters are converted\n * to a string and URI encoded. Array values are expanded into multiple\n * &key=value pairs, with each element stringized and URI-encoded.\n *\n * @typedef {*}\n */\ngoog.uri.utils.QueryValue;\n\n\n/**\n * An array representing a set of query parameters with alternating keys\n * and values.\n *\n * Keys are assumed to be URI encoded already and live at even indices. See\n * goog.uri.utils.QueryValue for details on how parameter values are encoded.\n *\n * Example:\n * <pre>\n * var data = [\n * // Simple param: ?name=BobBarker\n * 'name', 'BobBarker',\n * // Conditional param -- may be omitted entirely.\n * 'specialDietaryNeeds', hasDietaryNeeds() ? getDietaryNeeds() : null,\n * // Multi-valued param: &house=LosAngeles&house=NewYork&house=null\n * 'house', ['LosAngeles', 'NewYork', null]\n * ];\n * </pre>\n *\n * @typedef {!Array<string|goog.uri.utils.QueryValue>}\n */\ngoog.uri.utils.QueryArray;\n\n\n/**\n * Parses encoded query parameters and calls callback function for every\n * parameter found in the string.\n *\n * Missing value of parameter (e.g. \u201C\u2026&key&\u2026\u201D) is treated as if the value was an\n * empty string. Keys may be empty strings (e.g. \u201C\u2026&=value&\u2026\u201D) which also means\n * that \u201C\u2026&=&\u2026\u201D and \u201C\u2026&&\u2026\u201D will result in an empty key and value.\n *\n * @param {string} encodedQuery Encoded query string excluding question mark at\n * the beginning.\n * @param {function(string, string)} callback Function called for every\n * parameter found in query string. The first argument (name) will not be\n * urldecoded (so the function is consistent with buildQueryData), but the\n * second will. If the parameter has no value (i.e. \u201C=\u201D was not present)\n * the second argument (value) will be an empty string.\n */\ngoog.uri.utils.parseQueryData = function(encodedQuery, callback) {\n 'use strict';\n if (!encodedQuery) {\n return;\n }\n var pairs = encodedQuery.split('&');\n for (var i = 0; i < pairs.length; i++) {\n var indexOfEquals = pairs[i].indexOf('=');\n var name = null;\n var value = null;\n if (indexOfEquals >= 0) {\n name = pairs[i].substring(0, indexOfEquals);\n value = pairs[i].substring(indexOfEquals + 1);\n } else {\n name = pairs[i];\n }\n callback(name, value ? goog.string.urlDecode(value) : '');\n }\n};\n\n\n/**\n * Split the URI into 3 parts where the [1] is the queryData without a leading\n * '?'. For example, the URI http://foo.com/bar?a=b#abc returns\n * ['http://foo.com/bar','a=b','#abc'].\n * @param {string} uri The URI to parse.\n * @return {!Array<string>} An array representation of uri of length 3 where the\n * middle value is the queryData without a leading '?'.\n * @private\n */\ngoog.uri.utils.splitQueryData_ = function(uri) {\n 'use strict';\n // Find the query data and hash.\n var hashIndex = uri.indexOf('#');\n if (hashIndex < 0) {\n hashIndex = uri.length;\n }\n var questionIndex = uri.indexOf('?');\n var queryData;\n if (questionIndex < 0 || questionIndex > hashIndex) {\n questionIndex = hashIndex;\n queryData = '';\n } else {\n queryData = uri.substring(questionIndex + 1, hashIndex);\n }\n return [uri.substr(0, questionIndex), queryData, uri.substr(hashIndex)];\n};\n\n\n/**\n * Join an array created by splitQueryData_ back into a URI.\n * @param {!Array<string>} parts A URI in the form generated by splitQueryData_.\n * @return {string} The joined URI.\n * @private\n */\ngoog.uri.utils.joinQueryData_ = function(parts) {\n 'use strict';\n return parts[0] + (parts[1] ? '?' + parts[1] : '') + parts[2];\n};\n\n\n/**\n * @param {string} queryData\n * @param {string} newData\n * @return {string}\n * @private\n */\ngoog.uri.utils.appendQueryData_ = function(queryData, newData) {\n 'use strict';\n if (!newData) {\n return queryData;\n }\n return queryData ? queryData + '&' + newData : newData;\n};\n\n\n/**\n * @param {string} uri\n * @param {string} queryData\n * @return {string}\n * @private\n */\ngoog.uri.utils.appendQueryDataToUri_ = function(uri, queryData) {\n 'use strict';\n if (!queryData) {\n return uri;\n }\n var parts = goog.uri.utils.splitQueryData_(uri);\n parts[1] = goog.uri.utils.appendQueryData_(parts[1], queryData);\n return goog.uri.utils.joinQueryData_(parts);\n};\n\n\n/**\n * Appends key=value pairs to an array, supporting multi-valued objects.\n * @param {*} key The key prefix.\n * @param {goog.uri.utils.QueryValue} value The value to serialize.\n * @param {!Array<string>} pairs The array to which the 'key=value' strings\n * should be appended.\n * @private\n */\ngoog.uri.utils.appendKeyValuePairs_ = function(key, value, pairs) {\n 'use strict';\n goog.asserts.assertString(key);\n if (Array.isArray(value)) {\n // Convince the compiler it's an array.\n goog.asserts.assertArray(value);\n for (var j = 0; j < value.length; j++) {\n // Convert to string explicitly, to short circuit the null and array\n // logic in this function -- this ensures that null and undefined get\n // written as literal 'null' and 'undefined', and arrays don't get\n // expanded out but instead encoded in the default way.\n goog.uri.utils.appendKeyValuePairs_(key, String(value[j]), pairs);\n }\n } else if (value != null) {\n // Skip a top-level null or undefined entirely.\n pairs.push(\n key +\n // Check for empty string. Zero gets encoded into the url as literal\n // strings. For empty string, skip the equal sign, to be consistent\n // with UriBuilder.java.\n (value === '' ? '' : '=' + goog.string.urlEncode(value)));\n }\n};\n\n\n/**\n * Builds a query data string from a sequence of alternating keys and values.\n * Currently generates \"&key&\" for empty args.\n *\n * @param {!IArrayLike<string|goog.uri.utils.QueryValue>} keysAndValues\n * Alternating keys and values. See the QueryArray typedef.\n * @param {number=} opt_startIndex A start offset into the arary, defaults to 0.\n * @return {string} The encoded query string, in the form 'a=1&b=2'.\n */\ngoog.uri.utils.buildQueryData = function(keysAndValues, opt_startIndex) {\n 'use strict';\n goog.asserts.assert(\n Math.max(keysAndValues.length - (opt_startIndex || 0), 0) % 2 == 0,\n 'goog.uri.utils: Key/value lists must be even in length.');\n\n var params = [];\n for (var i = opt_startIndex || 0; i < keysAndValues.length; i += 2) {\n var key = /** @type {string} */ (keysAndValues[i]);\n goog.uri.utils.appendKeyValuePairs_(key, keysAndValues[i + 1], params);\n }\n return params.join('&');\n};\n\n\n/**\n * Builds a query data string from a map.\n * Currently generates \"&key&\" for empty args.\n *\n * @param {!Object<string, goog.uri.utils.QueryValue>} map An object where keys\n * are URI-encoded parameter keys, and the values are arbitrary types\n * or arrays. Keys with a null value are dropped.\n * @return {string} The encoded query string, in the form 'a=1&b=2'.\n */\ngoog.uri.utils.buildQueryDataFromMap = function(map) {\n 'use strict';\n var params = [];\n for (var key in map) {\n goog.uri.utils.appendKeyValuePairs_(key, map[key], params);\n }\n return params.join('&');\n};\n\n\n/**\n * Appends URI parameters to an existing URI.\n *\n * The variable arguments may contain alternating keys and values. Keys are\n * assumed to be already URI encoded. The values should not be URI-encoded,\n * and will instead be encoded by this function.\n * <pre>\n * appendParams('http://www.foo.com?existing=true',\n * 'key1', 'value1',\n * 'key2', 'value?willBeEncoded',\n * 'key3', ['valueA', 'valueB', 'valueC'],\n * 'key4', null);\n * result: 'http://www.foo.com?existing=true&' +\n * 'key1=value1&' +\n * 'key2=value%3FwillBeEncoded&' +\n * 'key3=valueA&key3=valueB&key3=valueC'\n * </pre>\n *\n * A single call to this function will not exhibit quadratic behavior in IE,\n * whereas multiple repeated calls may, although the effect is limited by\n * fact that URL's generally can't exceed 2kb.\n *\n * @param {string} uri The original URI, which may already have query data.\n * @param {...(goog.uri.utils.QueryArray|goog.uri.utils.QueryValue)}\n * var_args\n * An array or argument list conforming to goog.uri.utils.QueryArray.\n * @return {string} The URI with all query parameters added.\n */\ngoog.uri.utils.appendParams = function(uri, var_args) {\n 'use strict';\n var queryData = arguments.length == 2 ?\n goog.uri.utils.buildQueryData(arguments[1], 0) :\n goog.uri.utils.buildQueryData(arguments, 1);\n return goog.uri.utils.appendQueryDataToUri_(uri, queryData);\n};\n\n\n/**\n * Appends query parameters from a map.\n *\n * @param {string} uri The original URI, which may already have query data.\n * @param {!Object<goog.uri.utils.QueryValue>} map An object where keys are\n * URI-encoded parameter keys, and the values are arbitrary types or arrays.\n * Keys with a null value are dropped.\n * @return {string} The new parameters.\n */\ngoog.uri.utils.appendParamsFromMap = function(uri, map) {\n 'use strict';\n var queryData = goog.uri.utils.buildQueryDataFromMap(map);\n return goog.uri.utils.appendQueryDataToUri_(uri, queryData);\n};\n\n\n/**\n * Appends a single URI parameter.\n *\n * Repeated calls to this can exhibit quadratic behavior in IE6 due to the\n * way string append works, though it should be limited given the 2kb limit.\n *\n * @param {string} uri The original URI, which may already have query data.\n * @param {string} key The key, which must already be URI encoded.\n * @param {*=} opt_value The value, which will be stringized and encoded\n * (assumed not already to be encoded). If omitted, undefined, or null, the\n * key will be added as a valueless parameter.\n * @return {string} The URI with the query parameter added.\n */\ngoog.uri.utils.appendParam = function(uri, key, opt_value) {\n 'use strict';\n var value = (opt_value != null) ? '=' + goog.string.urlEncode(opt_value) : '';\n return goog.uri.utils.appendQueryDataToUri_(uri, key + value);\n};\n\n\n/**\n * Finds the next instance of a query parameter with the specified name.\n *\n * Does not instantiate any objects.\n *\n * @param {string} uri The URI to search. May contain a fragment identifier\n * if opt_hashIndex is specified.\n * @param {number} startIndex The index to begin searching for the key at. A\n * match may be found even if this is one character after the ampersand.\n * @param {string} keyEncoded The URI-encoded key.\n * @param {number} hashOrEndIndex Index to stop looking at. If a hash\n * mark is present, it should be its index, otherwise it should be the\n * length of the string.\n * @return {number} The position of the first character in the key's name,\n * immediately after either a question mark or a dot.\n * @private\n */\ngoog.uri.utils.findParam_ = function(\n uri, startIndex, keyEncoded, hashOrEndIndex) {\n 'use strict';\n var index = startIndex;\n var keyLength = keyEncoded.length;\n\n // Search for the key itself and post-filter for surronuding punctuation,\n // rather than expensively building a regexp.\n while ((index = uri.indexOf(keyEncoded, index)) >= 0 &&\n index < hashOrEndIndex) {\n var precedingChar = uri.charCodeAt(index - 1);\n // Ensure that the preceding character is '&' or '?'.\n if (precedingChar == goog.uri.utils.CharCode_.AMPERSAND ||\n precedingChar == goog.uri.utils.CharCode_.QUESTION) {\n // Ensure the following character is '&', '=', '#', or NaN\n // (end of string).\n var followingChar = uri.charCodeAt(index + keyLength);\n if (!followingChar || followingChar == goog.uri.utils.CharCode_.EQUAL ||\n followingChar == goog.uri.utils.CharCode_.AMPERSAND ||\n followingChar == goog.uri.utils.CharCode_.HASH) {\n return index;\n }\n }\n index += keyLength + 1;\n }\n\n return -1;\n};\n\n\n/**\n * Regular expression for finding a hash mark or end of string.\n * @type {RegExp}\n * @private\n */\ngoog.uri.utils.hashOrEndRe_ = /#|$/;\n\n\n/**\n * Determines if the URI contains a specific key.\n *\n * Performs no object instantiations.\n *\n * @param {string} uri The URI to process. May contain a fragment\n * identifier.\n * @param {string} keyEncoded The URI-encoded key. Case-sensitive.\n * @return {boolean} Whether the key is present.\n */\ngoog.uri.utils.hasParam = function(uri, keyEncoded) {\n 'use strict';\n return goog.uri.utils.findParam_(\n uri, 0, keyEncoded, uri.search(goog.uri.utils.hashOrEndRe_)) >= 0;\n};\n\n\n/**\n * Gets the first value of a query parameter.\n * @param {string} uri The URI to process. May contain a fragment.\n * @param {string} keyEncoded The URI-encoded key. Case-sensitive.\n * @return {?string} The first value of the parameter (URI-decoded), or null\n * if the parameter is not found.\n */\ngoog.uri.utils.getParamValue = function(uri, keyEncoded) {\n 'use strict';\n var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_);\n var foundIndex =\n goog.uri.utils.findParam_(uri, 0, keyEncoded, hashOrEndIndex);\n\n if (foundIndex < 0) {\n return null;\n } else {\n var endPosition = uri.indexOf('&', foundIndex);\n if (endPosition < 0 || endPosition > hashOrEndIndex) {\n endPosition = hashOrEndIndex;\n }\n // Progress forth to the end of the \"key=\" or \"key&\" substring.\n foundIndex += keyEncoded.length + 1;\n // Use substr, because it (unlike substring) will return empty string\n // if foundIndex > endPosition.\n return goog.string.urlDecode(\n uri.substr(foundIndex, endPosition - foundIndex));\n }\n};\n\n\n/**\n * Gets all values of a query parameter.\n * @param {string} uri The URI to process. May contain a fragment.\n * @param {string} keyEncoded The URI-encoded key. Case-sensitive.\n * @return {!Array<string>} All URI-decoded values with the given key.\n * If the key is not found, this will have length 0, but never be null.\n */\ngoog.uri.utils.getParamValues = function(uri, keyEncoded) {\n 'use strict';\n var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_);\n var position = 0;\n var foundIndex;\n var result = [];\n\n while ((foundIndex = goog.uri.utils.findParam_(\n uri, position, keyEncoded, hashOrEndIndex)) >= 0) {\n // Find where this parameter ends, either the '&' or the end of the\n // query parameters.\n position = uri.indexOf('&', foundIndex);\n if (position < 0 || position > hashOrEndIndex) {\n position = hashOrEndIndex;\n }\n\n // Progress forth to the end of the \"key=\" or \"key&\" substring.\n foundIndex += keyEncoded.length + 1;\n // Use substr, because it (unlike substring) will return empty string\n // if foundIndex > position.\n result.push(\n goog.string.urlDecode(uri.substr(foundIndex, position - foundIndex)));\n }\n\n return result;\n};\n\n\n/**\n * Regexp to find trailing question marks and ampersands.\n * @type {RegExp}\n * @private\n */\ngoog.uri.utils.trailingQueryPunctuationRe_ = /[?&]($|#)/;\n\n\n/**\n * Removes all instances of a query parameter.\n * @param {string} uri The URI to process. Must not contain a fragment.\n * @param {string} keyEncoded The URI-encoded key.\n * @return {string} The URI with all instances of the parameter removed.\n */\ngoog.uri.utils.removeParam = function(uri, keyEncoded) {\n 'use strict';\n var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_);\n var position = 0;\n var foundIndex;\n var buffer = [];\n\n // Look for a query parameter.\n while ((foundIndex = goog.uri.utils.findParam_(\n uri, position, keyEncoded, hashOrEndIndex)) >= 0) {\n // Get the portion of the query string up to, but not including, the ?\n // or & starting the parameter.\n buffer.push(uri.substring(position, foundIndex));\n // Progress to immediately after the '&'. If not found, go to the end.\n // Avoid including the hash mark.\n position = Math.min(\n (uri.indexOf('&', foundIndex) + 1) || hashOrEndIndex, hashOrEndIndex);\n }\n\n // Append everything that is remaining.\n buffer.push(uri.substr(position));\n\n // Join the buffer, and remove trailing punctuation that remains.\n return buffer.join('').replace(\n goog.uri.utils.trailingQueryPunctuationRe_, '$1');\n};\n\n\n/**\n * Replaces all existing definitions of a parameter with a single definition.\n *\n * Repeated calls to this can exhibit quadratic behavior due to the need to\n * find existing instances and reconstruct the string, though it should be\n * limited given the 2kb limit. Consider using appendParams or setParamsFromMap\n * to update multiple parameters in bulk.\n *\n * @param {string} uri The original URI, which may already have query data.\n * @param {string} keyEncoded The key, which must already be URI encoded.\n * @param {*} value The value, which will be stringized and encoded (assumed\n * not already to be encoded).\n * @return {string} The URI with the query parameter added.\n */\ngoog.uri.utils.setParam = function(uri, keyEncoded, value) {\n 'use strict';\n return goog.uri.utils.appendParam(\n goog.uri.utils.removeParam(uri, keyEncoded), keyEncoded, value);\n};\n\n\n/**\n * Effeciently set or remove multiple query parameters in a URI. Order of\n * unchanged parameters will not be modified, all updated parameters will be\n * appended to the end of the query. Params with values of null or undefined are\n * removed.\n *\n * @param {string} uri The URI to process.\n * @param {!Object<string, goog.uri.utils.QueryValue>} params A list of\n * parameters to update. If null or undefined, the param will be removed.\n * @return {string} An updated URI where the query data has been updated with\n * the params.\n */\ngoog.uri.utils.setParamsFromMap = function(uri, params) {\n 'use strict';\n var parts = goog.uri.utils.splitQueryData_(uri);\n var queryData = parts[1];\n var buffer = [];\n if (queryData) {\n queryData.split('&').forEach(function(pair) {\n 'use strict';\n var indexOfEquals = pair.indexOf('=');\n var name = indexOfEquals >= 0 ? pair.substr(0, indexOfEquals) : pair;\n if (!params.hasOwnProperty(name)) {\n buffer.push(pair);\n }\n });\n }\n parts[1] = goog.uri.utils.appendQueryData_(\n buffer.join('&'), goog.uri.utils.buildQueryDataFromMap(params));\n return goog.uri.utils.joinQueryData_(parts);\n};\n\n\n/**\n * Generates a URI path using a given URI and a path with checks to\n * prevent consecutive \"//\". The baseUri passed in must not contain\n * query or fragment identifiers. The path to append may not contain query or\n * fragment identifiers.\n *\n * @param {string} baseUri URI to use as the base.\n * @param {string} path Path to append.\n * @return {string} Updated URI.\n */\ngoog.uri.utils.appendPath = function(baseUri, path) {\n 'use strict';\n goog.uri.utils.assertNoFragmentsOrQueries_(baseUri);\n\n // Remove any trailing '/'\n if (goog.string.endsWith(baseUri, '/')) {\n baseUri = baseUri.substr(0, baseUri.length - 1);\n }\n // Remove any leading '/'\n if (goog.string.startsWith(path, '/')) {\n path = path.substr(1);\n }\n return '' + baseUri + '/' + path;\n};\n\n\n/**\n * Replaces the path.\n * @param {string} uri URI to use as the base.\n * @param {string} path New path.\n * @return {string} Updated URI.\n */\ngoog.uri.utils.setPath = function(uri, path) {\n 'use strict';\n // Add any missing '/'.\n if (!goog.string.startsWith(path, '/')) {\n path = '/' + path;\n }\n var parts = goog.uri.utils.split(uri);\n return goog.uri.utils.buildFromEncodedParts(\n parts[goog.uri.utils.ComponentIndex.SCHEME],\n parts[goog.uri.utils.ComponentIndex.USER_INFO],\n parts[goog.uri.utils.ComponentIndex.DOMAIN],\n parts[goog.uri.utils.ComponentIndex.PORT], path,\n parts[goog.uri.utils.ComponentIndex.QUERY_DATA],\n parts[goog.uri.utils.ComponentIndex.FRAGMENT]);\n};\n\n\n/**\n * Standard supported query parameters.\n * @enum {string}\n */\ngoog.uri.utils.StandardQueryParam = {\n\n /** Unused parameter for unique-ifying. */\n RANDOM: 'zx'\n};\n\n\n/**\n * Sets the zx parameter of a URI to a random value.\n * @param {string} uri Any URI.\n * @return {string} That URI with the \"zx\" parameter added or replaced to\n * contain a random string.\n */\ngoog.uri.utils.makeUnique = function(uri) {\n 'use strict';\n return goog.uri.utils.setParam(\n uri, goog.uri.utils.StandardQueryParam.RANDOM,\n goog.string.getRandomString());\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Interface and shared data structures for implementing\n * different wire protocol versions.\n */\ngoog.provide('goog.labs.net.webChannel.Wire');\ngoog.provide('goog.labs.net.webChannel.Wire.QueuedMap');\n\ngoog.requireType('goog.structs.Map');\n\n\n\n/**\n * The interface class.\n * @interface\n */\ngoog.labs.net.webChannel.Wire = class {\n constructor() {}\n};\n\n\n/**\n * The latest protocol version that this class supports. We request this version\n * from the server when opening the connection. Should match\n * LATEST_CHANNEL_VERSION on the server code.\n * @type {number}\n */\ngoog.labs.net.webChannel.Wire.LATEST_CHANNEL_VERSION = 8;\n\n\n/**\n * The JSON field key for the raw data wrapper object.\n * @type {string}\n */\ngoog.labs.net.webChannel.Wire.RAW_DATA_KEY = '__data__';\n\n\n\n/**\n * Simple container class for a (mapId, map) pair.\n */\ngoog.labs.net.webChannel.Wire.QueuedMap = class {\n /**\n * @param {number} mapId The id for this map.\n * @param {!Object|!goog.structs.Map} map The map itself.\n * @param {!Object=} opt_context The context associated with the map.\n */\n constructor(mapId, map, opt_context) {\n 'use strict';\n /**\n * The id for this map.\n * @type {number}\n */\n this.mapId = mapId;\n\n /**\n * The map itself.\n * @type {!Object|!goog.structs.Map}\n */\n this.map = map;\n\n /**\n * The context for the map.\n * @type {Object}\n */\n this.context = opt_context || null;\n }\n\n /**\n * @return {number|undefined} the size of the raw JSON message or\n * undefined if the message is not encoded as a raw JSON message\n */\n getRawDataSize() {\n 'use strict';\n if (goog.labs.net.webChannel.Wire.RAW_DATA_KEY in this.map) {\n const data = this.map[goog.labs.net.webChannel.Wire.RAW_DATA_KEY];\n if (typeof data === 'string') {\n return data.length;\n }\n }\n\n return undefined;\n }\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n/**\n * @fileoverview Defines a class for parsing JSON using the browser's built in\n * JSON library.\n * @suppress {missingRequire} TODO(user): this shouldn't be needed\n */\n\ngoog.provide('goog.json.NativeJsonProcessor');\n\ngoog.require('goog.asserts');\ngoog.require('goog.json.Processor');\n\n\n\n/**\n * A class that parses and stringifies JSON using the browser's built-in JSON\n * library, if it is available.\n *\n * Note that the native JSON api has subtle differences across browsers, so\n * use this implementation with care. See json_test#assertSerialize\n * for details on the differences from goog.json.\n *\n * This implementation is signficantly faster than goog.json, at least on\n * Chrome. See json_perf.html for a perf test showing the difference.\n *\n * @param {?goog.json.Replacer=} opt_replacer An optional replacer to use during\n * serialization.\n * @param {?goog.json.Reviver=} opt_reviver An optional reviver to use during\n * parsing.\n * @constructor\n * @implements {goog.json.Processor}\n * @final\n */\ngoog.json.NativeJsonProcessor = function(opt_replacer, opt_reviver) {\n 'use strict';\n goog.asserts.assert(goog.global['JSON'] !== undefined, 'JSON not defined');\n\n /**\n * @type {goog.json.Replacer|null|undefined}\n * @private\n */\n this.replacer_ = opt_replacer;\n\n /**\n * @type {goog.json.Reviver|null|undefined}\n * @private\n */\n this.reviver_ = opt_reviver;\n};\n\n\n/** @override */\ngoog.json.NativeJsonProcessor.prototype.stringify = function(object) {\n 'use strict';\n return goog.global['JSON'].stringify(object, this.replacer_);\n};\n\n\n/** @override */\ngoog.json.NativeJsonProcessor.prototype.parse = function(s) {\n 'use strict';\n return goog.global['JSON'].parse(s, this.reviver_);\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Utility functions for managing networking, such as\n * testing network connectivity.\n *\n */\n\n\ngoog.provide('goog.labs.net.webChannel.netUtils');\n\ngoog.require('goog.Uri');\ngoog.require('goog.labs.net.webChannel.WebChannelDebug');\n\ngoog.scope(function() {\n'use strict';\nconst netUtils = goog.labs.net.webChannel.netUtils;\nconst WebChannelDebug = goog.labs.net.webChannel.WebChannelDebug;\n\n\n/**\n * Default timeout to allow for URI pings.\n * @type {number}\n */\nnetUtils.NETWORK_TIMEOUT = 10000;\n\n\n/**\n * Pings the network with an image URI to check if an error is a server error\n * or user's network error.\n *\n * The caller needs to add a 'rand' parameter to make sure the response is\n * not fulfilled by browser cache.\n *\n * @param {function(boolean)} callback The function to call back with results.\n * @param {goog.Uri=} opt_imageUri The URI (of an image) to use for the network\n * test.\n */\nnetUtils.testNetwork = function(callback, opt_imageUri) {\n 'use strict';\n let uri = opt_imageUri;\n if (!uri) {\n // default google.com image\n uri = new goog.Uri('//www.google.com/images/cleardot.gif');\n\n if (!(goog.global.location && goog.global.location.protocol == 'http')) {\n uri.setScheme('https'); // e.g. chrome-extension\n }\n uri.makeUnique();\n }\n\n netUtils.testLoadImage(uri.toString(), netUtils.NETWORK_TIMEOUT, callback);\n};\n\n\n/**\n * Test loading the given image, retrying if necessary.\n * @param {string} url URL to the image.\n * @param {number} timeout Milliseconds before giving up.\n * @param {function(boolean)} callback Function to call with results.\n * @param {number} retries The number of times to retry.\n * @param {!WebChannelDebug} channelDebug The debug object\n * @param {number=} opt_pauseBetweenRetriesMS Optional number of milliseconds\n * between retries - defaults to 0.\n */\nnetUtils.testLoadImageWithRetries = function(\n url, timeout, callback, retries, channelDebug, opt_pauseBetweenRetriesMS) {\n 'use strict';\n channelDebug.debug('TestLoadImageWithRetries: ' + opt_pauseBetweenRetriesMS);\n if (retries == 0) {\n // no more retries, give up\n callback(false);\n return;\n }\n\n const pauseBetweenRetries = opt_pauseBetweenRetriesMS || 0;\n retries--;\n netUtils.testLoadImage(url, timeout, function(succeeded) {\n 'use strict';\n if (succeeded) {\n callback(true);\n } else {\n // try again\n goog.global.setTimeout(function() {\n 'use strict';\n netUtils.testLoadImageWithRetries(\n url, timeout, callback, retries, channelDebug, pauseBetweenRetries);\n }, pauseBetweenRetries);\n }\n });\n};\n\n\n/**\n * Test loading the given image.\n * @param {string} url URL to the image.\n * @param {number} timeout Milliseconds before giving up.\n * @param {function(boolean)} callback Function to call with results.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\nnetUtils.testLoadImage = function(url, timeout, callback) {\n 'use strict';\n const channelDebug = new WebChannelDebug();\n channelDebug.debug('TestLoadImage: loading ' + url);\n if (goog.global.Image) {\n const img = new Image();\n img.onload = goog.partial(\n netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: loaded',\n true, callback);\n img.onerror = goog.partial(\n netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: error',\n false, callback);\n img.onabort = goog.partial(\n netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: abort',\n false, callback);\n img.ontimeout = goog.partial(\n netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: timeout',\n false, callback);\n\n goog.global.setTimeout(function() {\n 'use strict';\n if (img.ontimeout) {\n img.ontimeout();\n }\n }, timeout);\n img.src = url;\n } else {\n // log ERROR_OTHER from environements where Image is not supported\n callback(false);\n }\n};\n\n\n/**\n * Wrap the image callback with debug and cleanup logic.\n * @param {!WebChannelDebug} channelDebug The WebChannelDebug object.\n * @param {!Image} img The image element.\n * @param {string} debugText The debug text.\n * @param {boolean} result The result of image loading.\n * @param {function(boolean)} callback The image callback.\n * @private\n */\nnetUtils.imageCallback_ = function(\n channelDebug, img, debugText, result, callback) {\n 'use strict';\n try {\n channelDebug.debug(debugText);\n netUtils.clearImageCallbacks_(img);\n callback(result);\n } catch (e) {\n channelDebug.dumpException(e);\n }\n};\n\n\n/**\n * Clears handlers to avoid memory leaks.\n * @param {Image} img The image to clear handlers from.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\nnetUtils.clearImageCallbacks_ = function(img) {\n 'use strict';\n img.onload = null;\n img.onerror = null;\n img.onabort = null;\n img.ontimeout = null;\n};\n}); // goog.scope\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('goog.net.FetchXmlHttp');\ngoog.provide('goog.net.FetchXmlHttpFactory');\n\ngoog.require('goog.asserts');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.functions');\ngoog.require('goog.log');\ngoog.require('goog.net.XhrLike');\ngoog.require('goog.net.XmlHttpFactory');\n\n\n\n/**\n * @record\n */\ngoog.net.FetchXmlHttpFactoryOptions = function() {\n /**\n * @type {!WorkerGlobalScope|undefined} The Service Worker global scope.\n */\n this.worker;\n\n /**\n * @type {boolean|undefined} Whether to store the FetchXmlHttp response as an\n * array of Uint8Arrays. If this is true then the 'responseType' attribute\n * must be empty.\n */\n this.streamBinaryChunks;\n};\n\n\n\n/**\n * Factory for creating Xhr objects that uses the native fetch() method.\n * https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\n * @param {!goog.net.FetchXmlHttpFactoryOptions} opts\n * @extends {goog.net.XmlHttpFactory}\n * @struct\n * @constructor\n */\ngoog.net.FetchXmlHttpFactory = function(opts) {\n 'use strict';\n goog.net.FetchXmlHttpFactory.base(this, 'constructor');\n\n /** @private @final {?WorkerGlobalScope} */\n this.worker_ = opts.worker || null;\n\n /** @private @final {boolean} */\n this.streamBinaryChunks_ = opts.streamBinaryChunks || false;\n\n /** @private {!RequestCredentials|undefined} */\n this.credentialsMode_ = undefined;\n\n /** @private {!RequestCache|undefined} */\n this.cacheMode_ = undefined;\n};\ngoog.inherits(goog.net.FetchXmlHttpFactory, goog.net.XmlHttpFactory);\n\n\n/** @override */\ngoog.net.FetchXmlHttpFactory.prototype.createInstance = function() {\n 'use strict';\n const instance =\n new goog.net.FetchXmlHttp(this.worker_, this.streamBinaryChunks_);\n if (this.credentialsMode_) {\n instance.setCredentialsMode(this.credentialsMode_);\n }\n if (this.cacheMode_) {\n instance.setCacheMode(this.cacheMode_);\n }\n return instance;\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttpFactory.prototype.internalGetOptions =\n goog.functions.constant({});\n\n\n/**\n * @param {!RequestCredentials} credentialsMode The credentials mode of the\n * Service Worker fetch.\n */\ngoog.net.FetchXmlHttpFactory.prototype.setCredentialsMode = function(\n credentialsMode) {\n 'use strict';\n this.credentialsMode_ = credentialsMode;\n};\n\n\n/**\n * @param {!RequestCache} cacheMode The cache mode of the Service Worker fetch.\n */\ngoog.net.FetchXmlHttpFactory.prototype.setCacheMode = function(cacheMode) {\n 'use strict';\n this.cacheMode_ = cacheMode;\n};\n\n\n\n/**\n * FetchXmlHttp object constructor.\n * @param {?WorkerGlobalScope} worker\n * @param {boolean} streamBinaryChunks\n * @extends {goog.events.EventTarget}\n * @implements {goog.net.XhrLike}\n * @constructor\n * @struct\n */\ngoog.net.FetchXmlHttp = function(worker, streamBinaryChunks) {\n 'use strict';\n goog.net.FetchXmlHttp.base(this, 'constructor');\n\n /** @private @final {?WorkerGlobalScope} */\n this.worker_ = worker;\n\n /** @private @final {boolean} */\n this.streamBinaryChunks_ = streamBinaryChunks;\n\n /** @private {RequestCredentials|undefined} */\n this.credentialsMode_ = undefined;\n\n /** @private {RequestCache|undefined} */\n this.cacheMode_ = undefined;\n\n /**\n * Request state.\n * @type {goog.net.FetchXmlHttp.RequestState}\n */\n this.readyState = goog.net.FetchXmlHttp.RequestState.UNSENT;\n\n /**\n * HTTP status.\n * @type {number}\n */\n this.status = 0;\n\n /**\n * HTTP status string.\n * @type {string}\n */\n this.statusText = '';\n\n /**\n * Content of the response.\n * @type {string|!ArrayBuffer|!Array<!Uint8Array>}\n */\n this.response = '';\n\n /**\n * Content of the response.\n * @type {string}\n */\n this.responseText = '';\n\n /**\n * The type of the response. If this is set to 'arraybuffer' the request will\n * be discrete, streaming is only supported for text encoded requests.\n * @type {string}\n */\n this.responseType = '';\n\n /**\n * Document response entity body.\n * NOTE: This is always null and not supported by this class.\n * @final {null}\n */\n this.responseXML = null;\n\n /**\n * Method to call when the state changes.\n * @type {?function()}\n */\n this.onreadystatechange = null;\n\n /** @private {!Headers} */\n this.requestHeaders_ = new Headers();\n\n /** @private {?Headers} */\n this.responseHeaders_ = null;\n\n /**\n * Request method (GET or POST).\n * @private {string}\n */\n this.method_ = 'GET';\n\n /**\n * Request URL.\n * @private {string}\n */\n this.url_ = '';\n\n /**\n * Whether the request is in progress.\n * @private {boolean}\n */\n this.inProgress_ = false;\n\n /** @private @final {?goog.log.Logger} */\n this.logger_ = goog.log.getLogger('goog.net.FetchXmlHttp');\n\n /** @private {?Response} */\n this.fetchResponse_ = null;\n\n /** @private {!ReadableStreamDefaultReader|null} */\n this.currentReader_ = null;\n\n /** @private {?TextDecoder} */\n this.textDecoder_ = null;\n};\ngoog.inherits(goog.net.FetchXmlHttp, goog.events.EventTarget);\n\n\n/**\n * State of the requests.\n * @enum {number}\n */\ngoog.net.FetchXmlHttp.RequestState = {\n UNSENT: 0,\n OPENED: 1,\n HEADER_RECEIVED: 2,\n LOADING: 3,\n DONE: 4,\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.open = function(method, url, opt_async) {\n 'use strict';\n goog.asserts.assert(!!opt_async, 'Only async requests are supported.');\n if (this.readyState != goog.net.FetchXmlHttp.RequestState.UNSENT) {\n this.abort();\n throw new Error('Error reopening a connection');\n }\n\n this.method_ = method;\n this.url_ = url;\n\n this.readyState = goog.net.FetchXmlHttp.RequestState.OPENED;\n this.dispatchCallback_();\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.send = function(opt_data) {\n 'use strict';\n if (this.readyState != goog.net.FetchXmlHttp.RequestState.OPENED) {\n this.abort();\n throw new Error('need to call open() first. ');\n }\n\n this.inProgress_ = true;\n const requestInit = {\n headers: this.requestHeaders_,\n method: this.method_,\n credentials: this.credentialsMode_,\n cache: this.cacheMode_,\n };\n if (opt_data) {\n requestInit['body'] = opt_data;\n }\n\n (this.worker_ || goog.global)\n .fetch(new Request(this.url_, /** @type {!RequestInit} */ (requestInit)))\n .then(\n this.handleResponse_.bind(this), this.handleSendFailure_.bind(this));\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.abort = function() {\n 'use strict';\n this.response = this.responseText = '';\n this.requestHeaders_ = new Headers();\n this.status = 0;\n\n if (!!this.currentReader_) {\n this.currentReader_.cancel('Request was aborted.');\n }\n\n if (((this.readyState >= goog.net.FetchXmlHttp.RequestState.OPENED) &&\n this.inProgress_) &&\n (this.readyState != goog.net.FetchXmlHttp.RequestState.DONE)) {\n this.inProgress_ = false;\n this.requestDone_();\n }\n\n this.readyState = goog.net.FetchXmlHttp.RequestState.UNSENT;\n};\n\n\n/**\n * Handles the fetch response.\n * @param {!Response} response\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.handleResponse_ = function(response) {\n 'use strict';\n if (!this.inProgress_) {\n // The request was aborted, ignore.\n return;\n }\n\n this.fetchResponse_ = response;\n\n if (!this.responseHeaders_) {\n this.status = this.fetchResponse_.status;\n this.statusText = this.fetchResponse_.statusText;\n this.responseHeaders_ = response.headers;\n this.readyState = goog.net.FetchXmlHttp.RequestState.HEADER_RECEIVED;\n this.dispatchCallback_();\n }\n // A callback may abort the request.\n if (!this.inProgress_) {\n // The request was aborted, ignore.\n return;\n }\n\n this.readyState = goog.net.FetchXmlHttp.RequestState.LOADING;\n this.dispatchCallback_();\n // A callback may abort the request.\n if (!this.inProgress_) {\n // The request was aborted, ignore.\n return;\n }\n\n if (this.responseType === 'arraybuffer') {\n response.arrayBuffer().then(\n this.handleResponseArrayBuffer_.bind(this),\n this.handleSendFailure_.bind(this));\n } else if (\n typeof (goog.global.ReadableStream) !== 'undefined' &&\n 'body' in response) {\n this.currentReader_ =\n /** @type {!ReadableStreamDefaultReader} */ (response.body.getReader());\n if (this.streamBinaryChunks_) {\n if (this.responseType) {\n throw new Error(\n 'responseType must be empty for \"streamBinaryChunks\" mode responses.');\n }\n this.response = [];\n } else {\n this.response = this.responseText = '';\n this.textDecoder_ = new TextDecoder();\n }\n this.readInputFromFetch_();\n } else {\n response.text().then(\n this.handleResponseText_.bind(this),\n this.handleSendFailure_.bind(this));\n }\n};\n\n\n/**\n * Reads the next chunk of data from the fetch response.\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.readInputFromFetch_ = function() {\n 'use strict';\n this.currentReader_.read()\n .then(this.handleDataFromStream_.bind(this))\n .catch(this.handleSendFailure_.bind(this));\n};\n\n\n/**\n * Handles a chunk of data from the fetch response stream reader.\n * @param {!IIterableResult} result\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.handleDataFromStream_ = function(result) {\n 'use strict';\n if (!this.inProgress_) {\n // The request was aborted, ignore.\n return;\n }\n\n if (this.streamBinaryChunks_ && result.value) {\n this.response.push(/** @type {!Uint8Array} */ (result.value));\n } else if (!this.streamBinaryChunks_) {\n const dataPacket = result.value ?\n /** @type {!Uint8Array} */ (result.value) :\n new Uint8Array(0);\n const newText =\n this.textDecoder_.decode(dataPacket, {stream: !result.done});\n if (newText) {\n this.responseText += newText;\n this.response = this.responseText;\n }\n }\n if (result.done) {\n this.requestDone_();\n } else {\n this.dispatchCallback_();\n }\n\n if (this.readyState == goog.net.FetchXmlHttp.RequestState.LOADING) {\n this.readInputFromFetch_();\n }\n};\n\n/**\n * Handles the response text.\n * @param {string} responseText\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.handleResponseText_ = function(responseText) {\n 'use strict';\n if (!this.inProgress_) {\n // The request was aborted, ignore.\n return;\n }\n this.response = this.responseText = responseText;\n this.requestDone_();\n};\n\n\n/**\n * Handles the response text.\n * @param {!ArrayBuffer} responseArrayBuffer\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.handleResponseArrayBuffer_ = function(\n responseArrayBuffer) {\n 'use strict';\n if (!this.inProgress_) {\n // The request was aborted, ignore.\n return;\n }\n this.response = responseArrayBuffer;\n this.requestDone_();\n};\n\n\n/**\n * Handles the send failure.\n * @param {*} error\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.handleSendFailure_ = function(error) {\n 'use strict';\n const e = error instanceof Error ? error : Error(error);\n goog.log.warning(this.logger_, 'Failed to fetch url ' + this.url_, e);\n if (!this.inProgress_) {\n // The request was aborted, ignore.\n return;\n }\n this.requestDone_();\n};\n\n\n/**\n * Sets the request state to DONE and performs cleanup.\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.requestDone_ = function() {\n 'use strict';\n this.readyState = goog.net.FetchXmlHttp.RequestState.DONE;\n\n this.fetchResponse_ = null;\n this.currentReader_ = null;\n this.textDecoder_ = null;\n\n this.dispatchCallback_();\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.setRequestHeader = function(header, value) {\n 'use strict';\n this.requestHeaders_.append(header, value);\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.getResponseHeader = function(header) {\n 'use strict';\n // TODO(user): This method should return null when the headers are not\n // present or the specified header is missing. The externs need to be fixed.\n if (!this.responseHeaders_) {\n goog.log.warning(\n this.logger_,\n 'Attempting to get response header but no headers have been received ' +\n 'for url: ' + this.url_);\n return '';\n }\n return this.responseHeaders_.get(header.toLowerCase()) || '';\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.getAllResponseHeaders = function() {\n 'use strict';\n if (!this.responseHeaders_) {\n goog.log.warning(\n this.logger_,\n 'Attempting to get all response headers but no headers have been ' +\n 'received for url: ' + this.url_);\n return '';\n }\n const lines = [];\n const iter = this.responseHeaders_.entries();\n let entry = iter.next();\n while (!entry.done) {\n const pair = entry.value;\n lines.push(pair[0] + ': ' + pair[1]);\n entry = iter.next();\n }\n return lines.join('\\r\\n');\n};\n\n\n/**\n * @param {!RequestCredentials} credentialsMode The credentials mode of the\n * Service Worker fetch.\n */\ngoog.net.FetchXmlHttp.prototype.setCredentialsMode = function(credentialsMode) {\n 'use strict';\n this.credentialsMode_ = credentialsMode;\n};\n\n/**\n * @return {!RequestCredentials|undefined} The credentials mode of the\n * Service Worker fetch.\n */\ngoog.net.FetchXmlHttp.prototype.getCredentialsMode = function() {\n 'use strict';\n return this.credentialsMode_;\n};\n\n/**\n * @param {!RequestCache} cacheMode The cache mode of the Service Worker fetch.\n */\ngoog.net.FetchXmlHttp.prototype.setCacheMode = function(cacheMode) {\n 'use strict';\n this.cacheMode_ = cacheMode;\n};\n\n\n/**\n * Dispatches the callback, if the callback attribute is defined.\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.dispatchCallback_ = function() {\n 'use strict';\n if (this.onreadystatechange) {\n this.onreadystatechange.call(this);\n }\n};\n\n// Polyfill XmlHttpRequest's withCredentials property for specifying whether to\n// include credentials on cross domain requests.\nObject.defineProperty(goog.net.FetchXmlHttp.prototype, 'withCredentials', {\n get:\n /**\n * @this {goog.net.FetchXmlHttp}\n * @return {boolean} Whether to include credentials in cross domain\n * requests.\n */\n function() {\n 'use strict';\n return this.getCredentialsMode() === 'include';\n },\n\n set:\n /**\n * @param {boolean} value Whether to include credentials in cross domain\n * requests.\n * @this {goog.net.FetchXmlHttp}\n **/\n function(value) {\n 'use strict';\n this.setCredentialsMode(value ? 'include' : 'same-origin');\n }\n});\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Utilities for creating functions. Loosely inspired by these\n * java classes from the Guava library:\n * com.google.common.base.Functions\n * https://google.github.io/guava/releases/snapshot-jre/api/docs/index.html?com/google/common/base/Functions.html\n *\n * com.google.common.base.Predicates\n * https://google.github.io/guava/releases/snapshot-jre/api/docs/index.html?com/google/common/base/Predicates.html\n *\n * More about these can be found at\n * https://github.com/google/guava/wiki/FunctionalExplained\n */\n\n\ngoog.provide('goog.functions');\n\n\n/**\n * Creates a function that always returns the same value.\n * @param {T} retValue The value to return.\n * @return {function():T} The new function.\n * @template T\n */\ngoog.functions.constant = function(retValue) {\n 'use strict';\n return function() {\n 'use strict';\n return retValue;\n };\n};\n\n\n/**\n * Always returns false.\n * @type {function(...): boolean}\n */\ngoog.functions.FALSE = function() {\n 'use strict';\n return false;\n};\n\n\n/**\n * Always returns true.\n * @type {function(...): boolean}\n */\ngoog.functions.TRUE = function() {\n 'use strict';\n return true;\n};\n\n\n/**\n * Always returns `null`.\n * @type {function(...): null}\n */\ngoog.functions.NULL = function() {\n 'use strict';\n return null;\n};\n\n\n/**\n * Always returns `undefined`.\n * @type {function(...): undefined}\n */\ngoog.functions.UNDEFINED = function() {\n return undefined;\n};\n\n/**\n * Always returns `undefined` (loosely-typed version).\n * @type {!Function}\n */\ngoog.functions.EMPTY = /** @type {?} */ (goog.functions.UNDEFINED);\n\n\n/**\n * A simple function that returns the first argument of whatever is passed\n * into it.\n * @param {T=} opt_returnValue The single value that will be returned.\n * @param {...*} var_args Optional trailing arguments. These are ignored.\n * @return {T} The first argument passed in, or undefined if nothing was passed.\n * @template T\n */\ngoog.functions.identity = function(opt_returnValue, var_args) {\n 'use strict';\n return opt_returnValue;\n};\n\n\n/**\n * Creates a function that always throws an error with the given message.\n * @param {string} message The error message.\n * @return {!Function} The error-throwing function.\n */\ngoog.functions.error = function(message) {\n 'use strict';\n return function() {\n 'use strict';\n throw new Error(message);\n };\n};\n\n\n/**\n * Creates a function that throws the given object.\n * @param {*} err An object to be thrown.\n * @return {!Function} The error-throwing function.\n */\ngoog.functions.fail = function(err) {\n 'use strict';\n return function() {\n 'use strict';\n throw err;\n };\n};\n\n\n/**\n * Given a function, create a function that keeps opt_numArgs arguments and\n * silently discards all additional arguments.\n * @param {Function} f The original function.\n * @param {number=} opt_numArgs The number of arguments to keep. Defaults to 0.\n * @return {!Function} A version of f that only keeps the first opt_numArgs\n * arguments.\n */\ngoog.functions.lock = function(f, opt_numArgs) {\n 'use strict';\n opt_numArgs = opt_numArgs || 0;\n return function() {\n 'use strict';\n const self = /** @type {*} */ (this);\n return f.apply(self, Array.prototype.slice.call(arguments, 0, opt_numArgs));\n };\n};\n\n\n/**\n * Creates a function that returns its nth argument.\n * @param {number} n The position of the return argument.\n * @return {!Function} A new function.\n */\ngoog.functions.nth = function(n) {\n 'use strict';\n return function() {\n 'use strict';\n return arguments[n];\n };\n};\n\n\n/**\n * Like goog.partial(), except that arguments are added after arguments to the\n * returned function.\n *\n * Usage:\n * function f(arg1, arg2, arg3, arg4) { ... }\n * var g = goog.functions.partialRight(f, arg3, arg4);\n * g(arg1, arg2);\n *\n * @param {!Function} fn A function to partially apply.\n * @param {...*} var_args Additional arguments that are partially applied to fn\n * at the end.\n * @return {!Function} A partially-applied form of the function goog.partial()\n * was invoked as a method of.\n */\ngoog.functions.partialRight = function(fn, var_args) {\n 'use strict';\n const rightArgs = Array.prototype.slice.call(arguments, 1);\n return function() {\n 'use strict';\n // Even in strict mode, IE10/11 and Edge (non-Chromium) use global context\n // when free-calling functions. To catch cases where people were using this\n // erroneously, we explicitly change the context to undefined to match\n // strict mode specifications.\n let self = /** @type {*} */ (this);\n if (self === goog.global) {\n self = undefined;\n }\n const newArgs = Array.prototype.slice.call(arguments);\n newArgs.push.apply(newArgs, rightArgs);\n return fn.apply(self, newArgs);\n };\n};\n\n\n/**\n * Given a function, create a new function that swallows its return value\n * and replaces it with a new one.\n * @param {Function} f A function.\n * @param {T} retValue A new return value.\n * @return {function(...?):T} A new function.\n * @template T\n */\ngoog.functions.withReturnValue = function(f, retValue) {\n 'use strict';\n return goog.functions.sequence(f, goog.functions.constant(retValue));\n};\n\n\n/**\n * Creates a function that returns whether its argument equals the given value.\n *\n * Example:\n * var key = goog.object.findKey(obj, goog.functions.equalTo('needle'));\n *\n * @param {*} value The value to compare to.\n * @param {boolean=} opt_useLooseComparison Whether to use a loose (==)\n * comparison rather than a strict (===) one. Defaults to false.\n * @return {function(*):boolean} The new function.\n */\ngoog.functions.equalTo = function(value, opt_useLooseComparison) {\n 'use strict';\n return function(other) {\n 'use strict';\n return opt_useLooseComparison ? (value == other) : (value === other);\n };\n};\n\n\n/**\n * Creates the composition of the functions passed in.\n * For example, (goog.functions.compose(f, g))(a) is equivalent to f(g(a)).\n * @param {function(...?):T} fn The final function.\n * @param {...Function} var_args A list of functions.\n * @return {function(...?):T} The composition of all inputs.\n * @template T\n */\ngoog.functions.compose = function(fn, var_args) {\n 'use strict';\n const functions = arguments;\n const length = functions.length;\n return function() {\n 'use strict';\n const self = /** @type {*} */ (this);\n let result;\n if (length) {\n result = functions[length - 1].apply(self, arguments);\n }\n\n for (let i = length - 2; i >= 0; i--) {\n result = functions[i].call(self, result);\n }\n return result;\n };\n};\n\n\n/**\n * Creates a function that calls the functions passed in in sequence, and\n * returns the value of the last function. For example,\n * (goog.functions.sequence(f, g))(x) is equivalent to f(x),g(x).\n * @param {...Function} var_args A list of functions.\n * @return {!Function} A function that calls all inputs in sequence.\n */\ngoog.functions.sequence = function(var_args) {\n 'use strict';\n const functions = arguments;\n const length = functions.length;\n return function() {\n 'use strict';\n const self = /** @type {*} */ (this);\n let result;\n for (let i = 0; i < length; i++) {\n result = functions[i].apply(self, arguments);\n }\n return result;\n };\n};\n\n\n/**\n * Creates a function that returns true if each of its components evaluates\n * to true. The components are evaluated in order, and the evaluation will be\n * short-circuited as soon as a function returns false.\n * For example, (goog.functions.and(f, g))(x) is equivalent to f(x) && g(x).\n * @param {...Function} var_args A list of functions.\n * @return {function(...?):boolean} A function that ANDs its component\n * functions.\n */\ngoog.functions.and = function(var_args) {\n 'use strict';\n const functions = arguments;\n const length = functions.length;\n return function() {\n 'use strict';\n const self = /** @type {*} */ (this);\n for (let i = 0; i < length; i++) {\n if (!functions[i].apply(self, arguments)) {\n return false;\n }\n }\n return true;\n };\n};\n\n\n/**\n * Creates a function that returns true if any of its components evaluates\n * to true. The components are evaluated in order, and the evaluation will be\n * short-circuited as soon as a function returns true.\n * For example, (goog.functions.or(f, g))(x) is equivalent to f(x) || g(x).\n * @param {...Function} var_args A list of functions.\n * @return {function(...?):boolean} A function that ORs its component\n * functions.\n */\ngoog.functions.or = function(var_args) {\n 'use strict';\n const functions = arguments;\n const length = functions.length;\n return function() {\n 'use strict';\n const self = /** @type {*} */ (this);\n for (let i = 0; i < length; i++) {\n if (functions[i].apply(self, arguments)) {\n return true;\n }\n }\n return false;\n };\n};\n\n\n/**\n * Creates a function that returns the Boolean opposite of a provided function.\n * For example, (goog.functions.not(f))(x) is equivalent to !f(x).\n * @param {!Function} f The original function.\n * @return {function(...?):boolean} A function that delegates to f and returns\n * opposite.\n */\ngoog.functions.not = function(f) {\n 'use strict';\n return function() {\n 'use strict';\n const self = /** @type {*} */ (this);\n return !f.apply(self, arguments);\n };\n};\n\n\n/**\n * Generic factory function to construct an object given the constructor\n * and the arguments. Intended to be bound to create object factories.\n *\n * Example:\n *\n * var factory = goog.partial(goog.functions.create, Class);\n *\n * @param {function(new:T, ...)} constructor The constructor for the Object.\n * @param {...*} var_args The arguments to be passed to the constructor.\n * @return {T} A new instance of the class given in `constructor`.\n * @template T\n * @deprecated This function does not work with ES6 class constructors. Use\n * arrow functions + spread args instead.\n */\ngoog.functions.create = function(constructor, var_args) {\n 'use strict';\n /**\n * @constructor\n * @final\n */\n const temp = function() {};\n temp.prototype = constructor.prototype;\n\n // obj will have constructor's prototype in its chain and\n // 'obj instanceof constructor' will be true.\n const obj = new temp();\n\n // obj is initialized by constructor.\n // arguments is only array-like so lacks shift(), but can be used with\n // the Array prototype function.\n constructor.apply(obj, Array.prototype.slice.call(arguments, 1));\n return obj;\n};\n\n\n/**\n * @define {boolean} Whether the return value cache should be used.\n * This should only be used to disable caches when testing.\n */\ngoog.functions.CACHE_RETURN_VALUE =\n goog.define('goog.functions.CACHE_RETURN_VALUE', true);\n\n\n/**\n * Gives a wrapper function that caches the return value of a parameterless\n * function when first called.\n *\n * When called for the first time, the given function is called and its\n * return value is cached (thus this is only appropriate for idempotent\n * functions). Subsequent calls will return the cached return value. This\n * allows the evaluation of expensive functions to be delayed until first used.\n *\n * To cache the return values of functions with parameters, see goog.memoize.\n *\n * @param {function():T} fn A function to lazily evaluate.\n * @return {function():T} A wrapped version the function.\n * @template T\n */\ngoog.functions.cacheReturnValue = function(fn) {\n 'use strict';\n let called = false;\n let value;\n\n return function() {\n 'use strict';\n if (!goog.functions.CACHE_RETURN_VALUE) {\n return fn();\n }\n\n if (!called) {\n value = fn();\n called = true;\n }\n\n return value;\n };\n};\n\n\n/**\n * Wraps a function to allow it to be called, at most, once. All\n * additional calls are no-ops.\n *\n * This is particularly useful for initialization functions\n * that should be called, at most, once.\n *\n * @param {function():*} f Function to call.\n * @return {function():undefined} Wrapped function.\n */\ngoog.functions.once = function(f) {\n 'use strict';\n // Keep a reference to the function that we null out when we're done with\n // it -- that way, the function can be GC'd when we're done with it.\n let inner = f;\n return function() {\n 'use strict';\n if (inner) {\n const tmp = inner;\n inner = null;\n tmp();\n }\n };\n};\n\n\n/**\n * Wraps a function to allow it to be called, at most, once per interval\n * (specified in milliseconds). If the wrapper function is called N times within\n * that interval, only the Nth call will go through.\n *\n * This is particularly useful for batching up repeated actions where the\n * last action should win. This can be used, for example, for refreshing an\n * autocomplete pop-up every so often rather than updating with every keystroke,\n * since the final text typed by the user is the one that should produce the\n * final autocomplete results. For more stateful debouncing with support for\n * pausing, resuming, and canceling debounced actions, use\n * `goog.async.Debouncer`.\n *\n * @param {function(this:SCOPE, ...?)} f Function to call.\n * @param {number} interval Interval over which to debounce. The function will\n * only be called after the full interval has elapsed since the last call.\n * @param {SCOPE=} opt_scope Object in whose scope to call the function.\n * @return {function(...?): undefined} Wrapped function.\n * @template SCOPE\n */\ngoog.functions.debounce = function(f, interval, opt_scope) {\n 'use strict';\n let timeout = 0;\n return /** @type {function(...?)} */ (function(var_args) {\n 'use strict';\n goog.global.clearTimeout(timeout);\n const args = arguments;\n timeout = goog.global.setTimeout(function() {\n 'use strict';\n f.apply(opt_scope, args);\n }, interval);\n });\n};\n\n\n/**\n * Wraps a function to allow it to be called, at most, once per interval\n * (specified in milliseconds). If the wrapper function is called N times in\n * that interval, both the 1st and the Nth calls will go through.\n *\n * This is particularly useful for limiting repeated user requests where the\n * the last action should win, but you also don't want to wait until the end of\n * the interval before sending a request out, as it leads to a perception of\n * slowness for the user.\n *\n * @param {function(this:SCOPE, ...?)} f Function to call.\n * @param {number} interval Interval over which to throttle. The function can\n * only be called once per interval.\n * @param {SCOPE=} opt_scope Object in whose scope to call the function.\n * @return {function(...?): undefined} Wrapped function.\n * @template SCOPE\n */\ngoog.functions.throttle = function(f, interval, opt_scope) {\n 'use strict';\n let timeout = 0;\n let shouldFire = false;\n let storedArgs = [];\n\n const handleTimeout = function() {\n 'use strict';\n timeout = 0;\n if (shouldFire) {\n shouldFire = false;\n fire();\n }\n };\n\n const fire = function() {\n 'use strict';\n timeout = goog.global.setTimeout(handleTimeout, interval);\n let args = storedArgs;\n storedArgs = []; // Avoid a space leak by clearing stored arguments.\n f.apply(opt_scope, args);\n };\n\n return /** @type {function(...?)} */ (function(var_args) {\n 'use strict';\n storedArgs = arguments;\n if (!timeout) {\n fire();\n } else {\n shouldFire = true;\n }\n });\n};\n\n\n/**\n * Wraps a function to allow it to be called, at most, once per interval\n * (specified in milliseconds). If the wrapper function is called N times within\n * that interval, only the 1st call will go through.\n *\n * This is particularly useful for limiting repeated user requests where the\n * first request is guaranteed to have all the data required to perform the\n * final action, so there's no need to wait until the end of the interval before\n * sending the request out.\n *\n * @param {function(this:SCOPE, ...?)} f Function to call.\n * @param {number} interval Interval over which to rate-limit. The function will\n * only be called once per interval, and ignored for the remainer of the\n * interval.\n * @param {SCOPE=} opt_scope Object in whose scope to call the function.\n * @return {function(...?): undefined} Wrapped function.\n * @template SCOPE\n */\ngoog.functions.rateLimit = function(f, interval, opt_scope) {\n 'use strict';\n let timeout = 0;\n\n const handleTimeout = function() {\n 'use strict';\n timeout = 0;\n };\n\n return /** @type {function(...?)} */ (function(var_args) {\n 'use strict';\n if (!timeout) {\n timeout = goog.global.setTimeout(handleTimeout, interval);\n f.apply(opt_scope, arguments);\n }\n });\n};\n\n/**\n * Returns true if the specified value is a function.\n * @param {*} val Variable to test.\n * @return {boolean} Whether variable is a function.\n */\ngoog.functions.isFunction = (val) => {\n return typeof val === 'function';\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n/**\n * @fileoverview Utility to attempt native JSON processing, falling back to\n * goog.json if not available.\n *\n * This is intended as a drop-in for current users of goog.json who want\n * to take advantage of native JSON if present.\n */\n\ngoog.provide('goog.json.hybrid');\n\ngoog.require('goog.asserts');\ngoog.require('goog.json');\n\n\n/**\n * Attempts to serialize the JSON string natively, falling back to\n * `goog.json.serialize` if unsuccessful.\n * @param {!Object} obj JavaScript object to serialize to JSON.\n * @return {string} Resulting JSON string.\n */\ngoog.json.hybrid.stringify = goog.json.USE_NATIVE_JSON ?\n goog.global['JSON']['stringify'] :\n function(obj) {\n 'use strict';\n if (goog.global.JSON) {\n try {\n return goog.global.JSON.stringify(obj);\n } catch (e) {\n // Native serialization failed. Fall through to retry with\n // goog.json.serialize.\n }\n }\n\n return goog.json.serialize(obj);\n };\n\n\n/**\n * Attempts to parse the JSON string natively, falling back to\n * the supplied `fallbackParser` if unsuccessful.\n * @param {string} jsonString JSON string to parse.\n * @param {function(string):Object} fallbackParser Fallback JSON parser used\n * if native\n * @return {?Object} Resulting JSON object.\n * @private\n */\ngoog.json.hybrid.parse_ = function(jsonString, fallbackParser) {\n 'use strict';\n if (goog.global.JSON) {\n try {\n var obj = goog.global.JSON.parse(jsonString);\n goog.asserts.assert(typeof obj == 'object');\n return /** @type {?Object} */ (obj);\n } catch (e) {\n // Native parse failed. Fall through to retry with goog.json.parse.\n }\n }\n\n return fallbackParser(jsonString);\n};\n\n\n/**\n * Attempts to parse the JSON string natively, falling back to\n * `goog.json.parse` if unsuccessful.\n * @param {string} jsonString JSON string to parse.\n * @return {?Object} Resulting JSON object.\n */\ngoog.json.hybrid.parse = goog.json.USE_NATIVE_JSON ?\n goog.global['JSON']['parse'] :\n function(jsonString) {\n 'use strict';\n return goog.json.hybrid.parse_(jsonString, goog.json.parse);\n };\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Constants for HTTP status codes.\n */\n\ngoog.provide('goog.net.HttpStatus');\n\n\n/**\n * HTTP Status Codes defined in RFC 2616, RFC 6585, RFC 4918 and RFC 7538.\n * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html\n * @see http://tools.ietf.org/html/rfc6585\n * @see https://tools.ietf.org/html/rfc4918\n * @see https://tools.ietf.org/html/rfc7538\n * @enum {number}\n */\ngoog.net.HttpStatus = {\n // Informational 1xx\n CONTINUE: 100,\n SWITCHING_PROTOCOLS: 101,\n\n // Successful 2xx\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NON_AUTHORITATIVE_INFORMATION: 203,\n NO_CONTENT: 204,\n RESET_CONTENT: 205,\n PARTIAL_CONTENT: 206,\n MULTI_STATUS: 207,\n\n // Redirection 3xx\n MULTIPLE_CHOICES: 300,\n MOVED_PERMANENTLY: 301,\n FOUND: 302,\n SEE_OTHER: 303,\n NOT_MODIFIED: 304,\n USE_PROXY: 305,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n\n // Client Error 4xx\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n NOT_ACCEPTABLE: 406,\n PROXY_AUTHENTICATION_REQUIRED: 407,\n REQUEST_TIMEOUT: 408,\n CONFLICT: 409,\n GONE: 410,\n LENGTH_REQUIRED: 411,\n PRECONDITION_FAILED: 412,\n REQUEST_ENTITY_TOO_LARGE: 413,\n REQUEST_URI_TOO_LONG: 414,\n UNSUPPORTED_MEDIA_TYPE: 415,\n REQUEST_RANGE_NOT_SATISFIABLE: 416,\n EXPECTATION_FAILED: 417,\n UNPROCESSABLE_ENTITY: 422,\n LOCKED: 423,\n FAILED_DEPENDENCY: 424,\n PRECONDITION_REQUIRED: 428,\n TOO_MANY_REQUESTS: 429,\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n\n // Server Error 5xx\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n INSUFFICIENT_STORAGE: 507,\n NETWORK_AUTHENTICATION_REQUIRED: 511,\n\n /*\n * IE returns this code for 204 due to its use of URLMon, which returns this\n * code for 'Operation Aborted'. The status text is 'Unknown', the response\n * headers are ''. Known to occur on IE 6 on XP through IE9 on Win7.\n */\n QUIRK_IE_NO_CONTENT: 1223,\n};\n\n\n/**\n * Returns whether the given status should be considered successful.\n *\n * Successful codes are OK (200), CREATED (201), ACCEPTED (202),\n * NO CONTENT (204), PARTIAL CONTENT (206), NOT MODIFIED (304),\n * and IE's no content code (1223).\n *\n * @param {number} status The status code to test.\n * @return {boolean} Whether the status code should be considered successful.\n */\ngoog.net.HttpStatus.isSuccess = function(status) {\n 'use strict';\n switch (status) {\n case goog.net.HttpStatus.OK:\n case goog.net.HttpStatus.CREATED:\n case goog.net.HttpStatus.ACCEPTED:\n case goog.net.HttpStatus.NO_CONTENT:\n case goog.net.HttpStatus.PARTIAL_CONTENT:\n case goog.net.HttpStatus.NOT_MODIFIED:\n case goog.net.HttpStatus.QUIRK_IE_NO_CONTENT:\n return true;\n\n default:\n return false;\n }\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Provides CORS support for HTTP based RPC requests.\n *\n * As part of net.rpc package, CORS features provided by this class\n * depend on the server support. Please check related specs to decide how\n * to enable any of the features provided by this class.\n */\n\ngoog.module('goog.net.rpc.HttpCors');\n\nconst GoogUri = goog.require('goog.Uri');\nconst googObject = goog.require('goog.object');\nconst googString = goog.require('goog.string');\nconst googUriUtils = goog.require('goog.uri.utils');\n\n\n/**\n * The default URL parameter name to overwrite http headers with a URL param\n * to avoid CORS preflight.\n *\n * See https://github.com/whatwg/fetch/issues/210#issue-129531743 for the spec.\n *\n * @type {string}\n */\nexports.HTTP_HEADERS_PARAM_NAME = '$httpHeaders';\n\n\n/**\n * The default URL parameter name to overwrite http method with a URL param\n * to avoid CORS preflight.\n *\n * See https://github.com/whatwg/fetch/issues/210#issue-129531743 for the spec.\n *\n * @type {string}\n */\nexports.HTTP_METHOD_PARAM_NAME = '$httpMethod';\n\n\n/**\n * Generates the URL parameter value with custom headers encoded as\n * HTTP/1.1 headers block.\n *\n * @param {!Object<string, string>} headers The custom headers.\n * @return {string} The URL param to overwrite custom HTTP headers.\n */\nexports.generateHttpHeadersOverwriteParam = function(headers) {\n let result = '';\n googObject.forEach(headers, function(value, key) {\n result += key;\n result += ':';\n result += value;\n result += '\\r\\n';\n });\n return result;\n};\n\n\n/**\n * Generates the URL-encoded URL parameter value with custom headers encoded as\n * HTTP/1.1 headers block.\n *\n * @param {!Object<string, string>} headers The custom headers.\n * @return {string} The URL param to overwrite custom HTTP headers.\n */\nexports.generateEncodedHttpHeadersOverwriteParam = function(headers) {\n return googString.urlEncode(\n exports.generateHttpHeadersOverwriteParam(headers));\n};\n\n\n/**\n * Sets custom HTTP headers via an overwrite URL param.\n *\n * @param {!GoogUri|string} url The URI object or a string path.\n * @param {string} urlParam The URL param name.\n * @param {!Object<string, string>} extraHeaders The HTTP headers.\n * @return {!GoogUri|string} The URI object or a string path with headers\n * encoded as a url param.\n */\nexports.setHttpHeadersWithOverwriteParam = function(\n url, urlParam, extraHeaders) {\n if (googObject.isEmpty(extraHeaders)) {\n return url;\n }\n const httpHeaders = exports.generateHttpHeadersOverwriteParam(extraHeaders);\n if (typeof url === 'string') {\n return googUriUtils.appendParam(\n url, googString.urlEncode(urlParam), httpHeaders);\n } else {\n url.setParameterValue(urlParam, httpHeaders); // duplicate removed!\n return url;\n }\n};\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Transport support for WebChannel.\n *\n * The <code>WebChannelTransport</code> implementation serves as the factory\n * for <code>WebChannel</code>, which offers an abstraction for\n * point-to-point socket-like communication similar to what BrowserChannel\n * or HTML5 WebSocket offers.\n */\n\ngoog.provide('goog.net.WebChannelTransport');\n\ngoog.requireType('goog.net.WebChannel');\ngoog.requireType('goog.net.WebChannel.Options');\n\n\n\n/**\n * A WebChannelTransport instance represents a shared context of logical\n * connectivity between a browser client and a remote origin.\n *\n * Over a single WebChannelTransport instance, multiple WebChannels may be\n * created against different URLs, which may all share the same\n * underlying connectivity (i.e. TCP connection) whenever possible.\n *\n * When multi-domains are supported, such as CORS, multiple origins may be\n * supported over a single WebChannelTransport instance at the same time.\n *\n * Sharing between different window contexts such as tabs is not addressed\n * by WebChannelTransport. Applications may choose HTML5 shared workers\n * or other techniques to access the same transport instance\n * across different window contexts.\n *\n * @interface\n */\ngoog.net.WebChannelTransport = function() {};\n\n\n/**\n * The client version. This integer value will be passed to the server\n * when a channel is opened to inform the server the client \"capabilities\".\n *\n * Wire protocol version is a different concept and is internal to the\n * transport implementation.\n *\n * @const\n * @type {number}\n */\ngoog.net.WebChannelTransport.CLIENT_VERSION = 22;\n\n\n/**\n * Create a new WebChannel instance.\n *\n * The new WebChannel is to be opened against the server-side resource\n * as specified by the given URL. See {@link goog.net.WebChannel} for detailed\n * semantics.\n *\n * @param {string} url The URL path for the new WebChannel instance.\n * @param {!goog.net.WebChannel.Options=} opt_options Configuration for the\n * new WebChannel instance. The configuration object is reusable after\n * the new channel instance is created.\n * @return {!goog.net.WebChannel} the newly created WebChannel instance.\n */\ngoog.net.WebChannelTransport.prototype.createWebChannel = goog.abstractMethod;\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Implementation of a WebChannel transport using WebChannelBase.\n *\n * When WebChannelBase is used as the underlying transport, the capabilities\n * of the WebChannel are limited to what's supported by the implementation.\n * Particularly, multiplexing is not possible, and only strings are\n * supported as message types.\n */\n\ngoog.provide('goog.labs.net.webChannel.WebChannelBaseTransport');\n\ngoog.require('goog.asserts');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.json');\ngoog.require('goog.labs.net.webChannel.ChannelRequest');\ngoog.require('goog.labs.net.webChannel.WebChannelBase');\ngoog.require('goog.labs.net.webChannel.Wire');\ngoog.require('goog.log');\ngoog.require('goog.net.WebChannel');\ngoog.require('goog.net.WebChannelTransport');\ngoog.require('goog.object');\ngoog.require('goog.string');\n\n\n\n/**\n * Implementation of {@link goog.net.WebChannelTransport} with\n * {@link goog.labs.net.webChannel.WebChannelBase} as the underlying channel\n * implementation.\n *\n * @constructor\n * @struct\n * @implements {goog.net.WebChannelTransport}\n * @final\n */\ngoog.labs.net.webChannel.WebChannelBaseTransport = function() {\n 'use strict';\n if (!goog.labs.net.webChannel.ChannelRequest.supportsXhrStreaming()) {\n throw new Error('Environmental error: no available transport.');\n }\n};\n\n\ngoog.scope(function() {\n'use strict';\nconst WebChannelBaseTransport =\n goog.labs.net.webChannel.WebChannelBaseTransport;\nconst WebChannelBase = goog.labs.net.webChannel.WebChannelBase;\nconst Wire = goog.labs.net.webChannel.Wire;\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.prototype.createWebChannel = function(\n url, opt_options) {\n 'use strict';\n return new WebChannelBaseTransport.Channel(url, opt_options);\n};\n\n\n\n/**\n * Implementation of the {@link goog.net.WebChannel} interface.\n *\n * @param {string} url The URL path for the new WebChannel instance.\n * @param {!goog.net.WebChannel.Options=} opt_options Configuration for the\n * new WebChannel instance.\n *\n * @constructor\n * @implements {goog.net.WebChannel}\n * @extends {goog.events.EventTarget}\n * @final\n */\nWebChannelBaseTransport.Channel = function(url, opt_options) {\n 'use strict';\n WebChannelBaseTransport.Channel.base(this, 'constructor');\n\n /**\n * @private {!WebChannelBase} The underlying channel object.\n */\n this.channel_ = new WebChannelBase(\n opt_options, goog.net.WebChannelTransport.CLIENT_VERSION);\n\n /**\n * @private {string} The URL of the target server end-point.\n */\n this.url_ = url;\n\n /**\n * @private {goog.log.Logger} The logger for this class.\n */\n this.logger_ =\n goog.log.getLogger('goog.labs.net.webChannel.WebChannelBaseTransport');\n\n /**\n * @private {Object<string, string>} Extra URL parameters\n * to be added to each HTTP request.\n */\n this.messageUrlParams_ =\n (opt_options && opt_options.messageUrlParams) || null;\n\n let messageHeaders = (opt_options && opt_options.messageHeaders) || null;\n\n // default is false\n if (opt_options && opt_options.clientProtocolHeaderRequired) {\n if (messageHeaders) {\n goog.object.set(\n messageHeaders, goog.net.WebChannel.X_CLIENT_PROTOCOL,\n goog.net.WebChannel.X_CLIENT_PROTOCOL_WEB_CHANNEL);\n } else {\n messageHeaders = goog.object.create(\n goog.net.WebChannel.X_CLIENT_PROTOCOL,\n goog.net.WebChannel.X_CLIENT_PROTOCOL_WEB_CHANNEL);\n }\n }\n\n this.channel_.setExtraHeaders(messageHeaders);\n\n let initHeaders = (opt_options && opt_options.initMessageHeaders) || null;\n\n if (opt_options && opt_options.messageContentType) {\n if (initHeaders) {\n goog.object.set(\n initHeaders, goog.net.WebChannel.X_WEBCHANNEL_CONTENT_TYPE,\n opt_options.messageContentType);\n } else {\n initHeaders = goog.object.create(\n goog.net.WebChannel.X_WEBCHANNEL_CONTENT_TYPE,\n opt_options.messageContentType);\n }\n }\n\n if (opt_options && opt_options.clientProfile) {\n if (initHeaders) {\n goog.object.set(\n initHeaders, goog.net.WebChannel.X_WEBCHANNEL_CLIENT_PROFILE,\n opt_options.clientProfile);\n } else {\n initHeaders = goog.object.create(\n goog.net.WebChannel.X_WEBCHANNEL_CLIENT_PROFILE,\n opt_options.clientProfile);\n }\n }\n\n this.channel_.setInitHeaders(initHeaders);\n\n const httpHeadersOverwriteParam =\n opt_options && opt_options.httpHeadersOverwriteParam;\n if (httpHeadersOverwriteParam &&\n !goog.string.isEmptyOrWhitespace(httpHeadersOverwriteParam)) {\n this.channel_.setHttpHeadersOverwriteParam(httpHeadersOverwriteParam);\n }\n\n /**\n * @private {boolean} Whether to enable CORS.\n */\n this.supportsCrossDomainXhr_ =\n (opt_options && opt_options.supportsCrossDomainXhr) || false;\n\n /**\n * @private {boolean} Whether to send raw Json and bypass v8 wire format.\n */\n this.sendRawJson_ = (opt_options && opt_options.sendRawJson) || false;\n\n // Note that httpSessionIdParam will be ignored if the same parameter name\n // has already been specified with messageUrlParams\n const httpSessionIdParam = opt_options && opt_options.httpSessionIdParam;\n if (httpSessionIdParam &&\n !goog.string.isEmptyOrWhitespace(httpSessionIdParam)) {\n this.channel_.setHttpSessionIdParam(httpSessionIdParam);\n if (goog.object.containsKey(this.messageUrlParams_, httpSessionIdParam)) {\n goog.object.remove(this.messageUrlParams_, httpSessionIdParam);\n goog.log.warning(this.logger_,\n 'Ignore httpSessionIdParam also specified with messageUrlParams: '\n + httpSessionIdParam);\n }\n }\n\n /**\n * The channel handler.\n *\n * @private {!WebChannelBaseTransport.Channel.Handler_}\n */\n this.channelHandler_ = new WebChannelBaseTransport.Channel.Handler_(this);\n};\ngoog.inherits(WebChannelBaseTransport.Channel, goog.events.EventTarget);\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.open = function() {\n 'use strict';\n this.channel_.setHandler(this.channelHandler_);\n if (this.supportsCrossDomainXhr_) {\n this.channel_.setSupportsCrossDomainXhrs(true);\n }\n this.channel_.connect(this.url_, (this.messageUrlParams_ || undefined));\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.close = function() {\n 'use strict';\n this.channel_.disconnect();\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.halfClose = function() {\n 'use strict';\n // to be implemented\n throw new Error('Not implemented');\n};\n\n\n/**\n * The WebChannelBase only supports object types.\n *\n * @param {!goog.net.WebChannel.MessageData} message The message to send.\n *\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.send = function(message) {\n 'use strict';\n goog.asserts.assert(\n goog.isObject(message) || typeof message === 'string',\n 'only object type or raw string is supported');\n\n if (typeof message === 'string') {\n const rawJson = {};\n rawJson[Wire.RAW_DATA_KEY] = message;\n this.channel_.sendMap(rawJson);\n } else if (this.sendRawJson_) {\n const rawJson = {};\n rawJson[Wire.RAW_DATA_KEY] = goog.json.serialize(message);\n this.channel_.sendMap(rawJson);\n } else {\n this.channel_.sendMap(message);\n }\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.disposeInternal = function() {\n 'use strict';\n this.channel_.setHandler(null);\n delete this.channelHandler_;\n this.channel_.disconnect();\n delete this.channel_;\n\n WebChannelBaseTransport.Channel.base(this, 'disposeInternal');\n};\n\n\n\n/**\n * The message event.\n *\n * @param {!Array<?>|!Object} array The data array from the underlying channel.\n * @constructor\n * @extends {goog.net.WebChannel.MessageEvent}\n * @final\n */\nWebChannelBaseTransport.Channel.MessageEvent = function(array) {\n 'use strict';\n WebChannelBaseTransport.Channel.MessageEvent.base(this, 'constructor');\n\n // single-metadata only\n const metadata = array['__sm__'];\n if (metadata) {\n this.metadataKey = goog.object.getAnyKey(metadata);\n if (this.metadataKey) {\n this.data = goog.object.get(metadata, this.metadataKey);\n } else {\n this.data = metadata; // empty\n }\n } else {\n this.data = array;\n }\n};\ngoog.inherits(\n WebChannelBaseTransport.Channel.MessageEvent,\n goog.net.WebChannel.MessageEvent);\n\n\n\n/**\n * The error event.\n *\n * @param {WebChannelBase.Error} error The error code.\n * @constructor\n * @extends {goog.net.WebChannel.ErrorEvent}\n * @final\n */\nWebChannelBaseTransport.Channel.ErrorEvent = function(error) {\n 'use strict';\n WebChannelBaseTransport.Channel.ErrorEvent.base(this, 'constructor');\n\n /**\n * High-level status code.\n */\n this.status = goog.net.WebChannel.ErrorStatus.NETWORK_ERROR;\n\n /**\n * @const {WebChannelBase.Error} Internal error code, for debugging use only.\n */\n this.errorCode = error;\n};\ngoog.inherits(\n WebChannelBaseTransport.Channel.ErrorEvent, goog.net.WebChannel.ErrorEvent);\n\n\n\n/**\n * Implementation of {@link WebChannelBase.Handler} interface.\n *\n * @param {!WebChannelBaseTransport.Channel} channel The enclosing WebChannel.\n *\n * @constructor\n * @extends {WebChannelBase.Handler}\n * @private\n */\nWebChannelBaseTransport.Channel.Handler_ = function(channel) {\n 'use strict';\n WebChannelBaseTransport.Channel.Handler_.base(this, 'constructor');\n\n /**\n * @type {!WebChannelBaseTransport.Channel}\n * @private\n */\n this.channel_ = channel;\n};\ngoog.inherits(WebChannelBaseTransport.Channel.Handler_, WebChannelBase.Handler);\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.Handler_.prototype.channelOpened = function(\n channel) {\n 'use strict';\n goog.log.info(\n this.channel_.logger_, 'WebChannel opened on ' + this.channel_.url_);\n this.channel_.dispatchEvent(goog.net.WebChannel.EventType.OPEN);\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.Handler_.prototype.channelHandleArray =\n function(channel, array) {\n 'use strict';\n goog.asserts.assert(array, 'array expected to be defined');\n this.channel_.dispatchEvent(\n new WebChannelBaseTransport.Channel.MessageEvent(array));\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.Handler_.prototype.channelError = function(\n channel, error) {\n 'use strict';\n goog.log.info(\n this.channel_.logger_,\n 'WebChannel aborted on ' + this.channel_.url_ +\n ' due to channel error: ' + error);\n this.channel_.dispatchEvent(\n new WebChannelBaseTransport.Channel.ErrorEvent(error));\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.Handler_.prototype.channelClosed = function(\n channel, opt_pendingMaps, opt_undeliveredMaps) {\n 'use strict';\n goog.log.info(\n this.channel_.logger_, 'WebChannel closed on ' + this.channel_.url_);\n this.channel_.dispatchEvent(goog.net.WebChannel.EventType.CLOSE);\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.getRuntimeProperties = function() {\n 'use strict';\n return new WebChannelBaseTransport.ChannelProperties(this.channel_);\n};\n\n\n\n/**\n * Implementation of the {@link goog.net.WebChannel.RuntimeProperties}.\n *\n * @param {!WebChannelBase} channel The underlying channel object.\n *\n * @constructor\n * @implements {goog.net.WebChannel.RuntimeProperties}\n * @final\n */\nWebChannelBaseTransport.ChannelProperties = function(channel) {\n 'use strict';\n /**\n * The underlying channel object.\n *\n * @private {!WebChannelBase}\n */\n this.channel_ = channel;\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.getConcurrentRequestLimit =\n function() {\n 'use strict';\n return this.channel_.getForwardChannelRequestPool().getMaxSize();\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.isSpdyEnabled = function() {\n 'use strict';\n return this.getConcurrentRequestLimit() > 1;\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.getPendingRequestCount =\n function() {\n 'use strict';\n return this.channel_.getForwardChannelRequestPool().getRequestCount();\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.getHttpSessionId =\n function() {\n 'use strict';\n return this.channel_.getHttpSessionId();\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.commit = function(\n callback) {\n 'use strict';\n this.channel_.setForwardChannelFlushCallback(callback);\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.getNonAckedMessageCount =\n goog.abstractMethod;\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.notifyNonAckedMessageCount =\n goog.abstractMethod;\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.onCommit =\n goog.abstractMethod;\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.ackCommit =\n goog.abstractMethod;\n\n\n/** @override */\nWebChannelBaseTransport.ChannelProperties.prototype.getLastStatusCode =\n function() {\n 'use strict';\n return this.channel_.getLastStatusCode();\n};\n}); // goog.scope\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Bring in closure-library dependencies\n */\n\ngoog.provide('firebase.webchannel.wrapper');\n\n// goog.net.WebChannelTransport\ngoog.require('goog.net.createWebChannelTransport');\ngoog.require('goog.net.FetchXmlHttpFactory');\ngoog.require('goog.labs.net.webChannel.requestStats');\ngoog.require('goog.labs.net.webChannel.WebChannelBaseTransport');\n\n/**\n * NOTE: The `createWebChannel` function takes an options object as a second param\n * whose properties are typically mangled. We override these in externs/overrides.js\n * Without those externs, this does not function properly.\n */\ngoog.labs.net.webChannel.WebChannelBaseTransport.prototype['createWebChannel'] =\n goog.labs.net.webChannel.WebChannelBaseTransport.prototype.createWebChannel;\ngoog.labs.net.webChannel.WebChannelBaseTransport.Channel.prototype['send'] =\n goog.labs.net.webChannel.WebChannelBaseTransport.Channel.prototype.send;\ngoog.labs.net.webChannel.WebChannelBaseTransport.Channel.prototype['open'] =\n goog.labs.net.webChannel.WebChannelBaseTransport.Channel.prototype.open;\ngoog.labs.net.webChannel.WebChannelBaseTransport.Channel.prototype['close'] =\n goog.labs.net.webChannel.WebChannelBaseTransport.Channel.prototype.close;\n\n// goog.net.ErrorCode\ngoog.require('goog.net.ErrorCode');\ngoog.net.ErrorCode['NO_ERROR'] = goog.net.ErrorCode.NO_ERROR;\ngoog.net.ErrorCode['TIMEOUT'] = goog.net.ErrorCode.TIMEOUT;\ngoog.net.ErrorCode['HTTP_ERROR'] = goog.net.ErrorCode.HTTP_ERROR;\n\n// goog.net.ErrorType\ngoog.require('goog.net.EventType');\ngoog.net.EventType['COMPLETE'] = goog.net.EventType.COMPLETE;\n\n// goog.net.WebChannel\ngoog.require('goog.net.WebChannel');\ngoog.require('goog.events.EventTarget');\ngoog.net.WebChannel['EventType'] = goog.net.WebChannel.EventType;\ngoog.net.WebChannel.EventType['OPEN'] = goog.net.WebChannel.EventType.OPEN;\ngoog.net.WebChannel.EventType['CLOSE'] = goog.net.WebChannel.EventType.CLOSE;\ngoog.net.WebChannel.EventType['ERROR'] = goog.net.WebChannel.EventType.ERROR;\ngoog.net.WebChannel.EventType['MESSAGE'] =\n goog.net.WebChannel.EventType.MESSAGE;\ngoog.events.EventTarget.prototype['listen'] =\n goog.events.EventTarget.prototype.listen;\n\ngoog.require('goog.net.XhrIo');\ngoog.net.XhrIo.prototype['listenOnce'] = goog.net.XhrIo.prototype.listenOnce;\ngoog.net.XhrIo.prototype['getLastError'] =\n goog.net.XhrIo.prototype.getLastError;\ngoog.net.XhrIo.prototype['getLastErrorCode'] =\n goog.net.XhrIo.prototype.getLastErrorCode;\ngoog.net.XhrIo.prototype['getStatus'] = goog.net.XhrIo.prototype.getStatus;\ngoog.net.XhrIo.prototype['getResponseJson'] =\n goog.net.XhrIo.prototype.getResponseJson;\ngoog.net.XhrIo.prototype['getResponseText'] =\n goog.net.XhrIo.prototype.getResponseText;\ngoog.net.XhrIo.prototype['send'] = goog.net.XhrIo.prototype.send;\n\nmodule['exports']['createWebChannelTransport'] =\n goog.net.createWebChannelTransport;\nmodule['exports']['getStatEventTarget'] =\n goog.labs.net.webChannel.requestStats.getStatEventTarget;\nmodule['exports']['ErrorCode'] = goog.net.ErrorCode;\nmodule['exports']['EventType'] = goog.net.EventType;\nmodule['exports']['Event'] = goog.labs.net.webChannel.requestStats.Event;\nmodule['exports']['Stat'] = goog.labs.net.webChannel.requestStats.Stat;\nmodule['exports']['FetchXmlHttpFactory'] = goog.net.FetchXmlHttpFactory;\nmodule['exports']['WebChannel'] = goog.net.WebChannel;\nmodule['exports']['XhrIo'] = goog.net.XhrIo;\n", "/**\n * @license\n * Copyright The Closure Library Authors.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Default factory for <code>WebChannelTransport</code> to\n * avoid exposing concrete classes to clients.\n */\n\ngoog.provide('goog.net.createWebChannelTransport');\n\ngoog.require('goog.labs.net.webChannel.WebChannelBaseTransport');\ngoog.requireType('goog.net.WebChannelTransport');\n\n\n/**\n * Create a new WebChannelTransport instance using the default implementation.\n * Throws an error message if no default transport available in the current\n * environment.\n *\n * @return {!goog.net.WebChannelTransport} the newly created transport instance.\n */\ngoog.net.createWebChannelTransport = function() {\n 'use strict';\n return new goog.labs.net.webChannel.WebChannelBaseTransport();\n};\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** The semver (www.semver.org) version of the SDK. */\nimport { version } from '../../../firebase/package.json';\nexport let SDK_VERSION = version;\nexport function setSDKVersion(version: string): void {\n SDK_VERSION = version;\n}\n", "/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListenSequenceNumber } from './types';\n\n/**\n * `SequenceNumberSyncer` defines the methods required to keep multiple instances of a\n * `ListenSequence` in sync.\n */\nexport interface SequenceNumberSyncer {\n // Notify the syncer that a new sequence number has been used.\n writeSequenceNumber(sequenceNumber: ListenSequenceNumber): void;\n // Setting this property allows the syncer to notify when a sequence number has been used, and\n // and lets the ListenSequence adjust its internal previous value accordingly.\n sequenceNumberHandler:\n | ((sequenceNumber: ListenSequenceNumber) => void)\n | null;\n}\n\n/**\n * `ListenSequence` is a monotonic sequence. It is initialized with a minimum value to\n * exceed. All subsequent calls to next will return increasing values. If provided with a\n * `SequenceNumberSyncer`, it will additionally bump its next value when told of a new value, as\n * well as write out sequence numbers that it produces via `next()`.\n */\nexport class ListenSequence {\n static readonly INVALID: ListenSequenceNumber = -1;\n\n private writeNewSequenceNumber?: (\n newSequenceNumber: ListenSequenceNumber\n ) => void;\n\n constructor(\n private previousValue: ListenSequenceNumber,\n sequenceNumberSyncer?: SequenceNumberSyncer\n ) {\n if (sequenceNumberSyncer) {\n sequenceNumberSyncer.sequenceNumberHandler = sequenceNumber =>\n this.setPreviousValue(sequenceNumber);\n this.writeNewSequenceNumber = sequenceNumber =>\n sequenceNumberSyncer.writeSequenceNumber(sequenceNumber);\n }\n }\n\n private setPreviousValue(\n externalPreviousValue: ListenSequenceNumber\n ): ListenSequenceNumber {\n this.previousValue = Math.max(externalPreviousValue, this.previousValue);\n return this.previousValue;\n }\n\n next(): ListenSequenceNumber {\n const nextValue = ++this.previousValue;\n if (this.writeNewSequenceNumber) {\n this.writeNewSequenceNumber(nextValue);\n }\n return nextValue;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The set of Firestore status codes. The codes are the same at the ones\n * exposed by gRPC here:\n * https://github.com/grpc/grpc/blob/master/doc/statuscodes.md\n *\n * Possible values:\n * - 'cancelled': The operation was cancelled (typically by the caller).\n * - 'unknown': Unknown error or an error from a different error domain.\n * - 'invalid-argument': Client specified an invalid argument. Note that this\n * differs from 'failed-precondition'. 'invalid-argument' indicates\n * arguments that are problematic regardless of the state of the system\n * (e.g. an invalid field name).\n * - 'deadline-exceeded': Deadline expired before operation could complete.\n * For operations that change the state of the system, this error may be\n * returned even if the operation has completed successfully. For example,\n * a successful response from a server could have been delayed long enough\n * for the deadline to expire.\n * - 'not-found': Some requested document was not found.\n * - 'already-exists': Some document that we attempted to create already\n * exists.\n * - 'permission-denied': The caller does not have permission to execute the\n * specified operation.\n * - 'resource-exhausted': Some resource has been exhausted, perhaps a\n * per-user quota, or perhaps the entire file system is out of space.\n * - 'failed-precondition': Operation was rejected because the system is not\n * in a state required for the operation's execution.\n * - 'aborted': The operation was aborted, typically due to a concurrency\n * issue like transaction aborts, etc.\n * - 'out-of-range': Operation was attempted past the valid range.\n * - 'unimplemented': Operation is not implemented or not supported/enabled.\n * - 'internal': Internal errors. Means some invariants expected by\n * underlying system has been broken. If you see one of these errors,\n * something is very broken.\n * - 'unavailable': The service is currently unavailable. This is most likely\n * a transient condition and may be corrected by retrying with a backoff.\n * - 'data-loss': Unrecoverable data loss or corruption.\n * - 'unauthenticated': The request does not have valid authentication\n * credentials for the operation.\n */\nexport type FirestoreErrorCode =\n | 'cancelled'\n | 'unknown'\n | 'invalid-argument'\n | 'deadline-exceeded'\n | 'not-found'\n | 'already-exists'\n | 'permission-denied'\n | 'resource-exhausted'\n | 'failed-precondition'\n | 'aborted'\n | 'out-of-range'\n | 'unimplemented'\n | 'internal'\n | 'unavailable'\n | 'data-loss'\n | 'unauthenticated';\n\n/**\n * Error Codes describing the different ways Firestore can fail. These come\n * directly from GRPC.\n */\nexport type Code = FirestoreErrorCode;\n\nexport const Code = {\n // Causes are copied from:\n // https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h\n /** Not an error; returned on success. */\n OK: 'ok' as FirestoreErrorCode,\n\n /** The operation was cancelled (typically by the caller). */\n CANCELLED: 'cancelled' as FirestoreErrorCode,\n\n /** Unknown error or an error from a different error domain. */\n UNKNOWN: 'unknown' as FirestoreErrorCode,\n\n /**\n * Client specified an invalid argument. Note that this differs from\n * FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are\n * problematic regardless of the state of the system (e.g., a malformed file\n * name).\n */\n INVALID_ARGUMENT: 'invalid-argument' as FirestoreErrorCode,\n\n /**\n * Deadline expired before operation could complete. For operations that\n * change the state of the system, this error may be returned even if the\n * operation has completed successfully. For example, a successful response\n * from a server could have been delayed long enough for the deadline to\n * expire.\n */\n DEADLINE_EXCEEDED: 'deadline-exceeded' as FirestoreErrorCode,\n\n /** Some requested entity (e.g., file or directory) was not found. */\n NOT_FOUND: 'not-found' as FirestoreErrorCode,\n\n /**\n * Some entity that we attempted to create (e.g., file or directory) already\n * exists.\n */\n ALREADY_EXISTS: 'already-exists' as FirestoreErrorCode,\n\n /**\n * The caller does not have permission to execute the specified operation.\n * PERMISSION_DENIED must not be used for rejections caused by exhausting\n * some resource (use RESOURCE_EXHAUSTED instead for those errors).\n * PERMISSION_DENIED must not be used if the caller can not be identified\n * (use UNAUTHENTICATED instead for those errors).\n */\n PERMISSION_DENIED: 'permission-denied' as FirestoreErrorCode,\n\n /**\n * The request does not have valid authentication credentials for the\n * operation.\n */\n UNAUTHENTICATED: 'unauthenticated' as FirestoreErrorCode,\n\n /**\n * Some resource has been exhausted, perhaps a per-user quota, or perhaps the\n * entire file system is out of space.\n */\n RESOURCE_EXHAUSTED: 'resource-exhausted' as FirestoreErrorCode,\n\n /**\n * Operation was rejected because the system is not in a state required for\n * the operation's execution. For example, directory to be deleted may be\n * non-empty, an rmdir operation is applied to a non-directory, etc.\n *\n * A litmus test that may help a service implementor in deciding\n * between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE:\n * (a) Use UNAVAILABLE if the client can retry just the failing call.\n * (b) Use ABORTED if the client should retry at a higher-level\n * (e.g., restarting a read-modify-write sequence).\n * (c) Use FAILED_PRECONDITION if the client should not retry until\n * the system state has been explicitly fixed. E.g., if an \"rmdir\"\n * fails because the directory is non-empty, FAILED_PRECONDITION\n * should be returned since the client should not retry unless\n * they have first fixed up the directory by deleting files from it.\n * (d) Use FAILED_PRECONDITION if the client performs conditional\n * REST Get/Update/Delete on a resource and the resource on the\n * server does not match the condition. E.g., conflicting\n * read-modify-write on the same resource.\n */\n FAILED_PRECONDITION: 'failed-precondition' as FirestoreErrorCode,\n\n /**\n * The operation was aborted, typically due to a concurrency issue like\n * sequencer check failures, transaction aborts, etc.\n *\n * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED,\n * and UNAVAILABLE.\n */\n ABORTED: 'aborted' as FirestoreErrorCode,\n\n /**\n * Operation was attempted past the valid range. E.g., seeking or reading\n * past end of file.\n *\n * Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed\n * if the system state changes. For example, a 32-bit file system will\n * generate INVALID_ARGUMENT if asked to read at an offset that is not in the\n * range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from\n * an offset past the current file size.\n *\n * There is a fair bit of overlap between FAILED_PRECONDITION and\n * OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error)\n * when it applies so that callers who are iterating through a space can\n * easily look for an OUT_OF_RANGE error to detect when they are done.\n */\n OUT_OF_RANGE: 'out-of-range' as FirestoreErrorCode,\n\n /** Operation is not implemented or not supported/enabled in this service. */\n UNIMPLEMENTED: 'unimplemented' as FirestoreErrorCode,\n\n /**\n * Internal errors. Means some invariants expected by underlying System has\n * been broken. If you see one of these errors, Something is very broken.\n */\n INTERNAL: 'internal' as FirestoreErrorCode,\n\n /**\n * The service is currently unavailable. This is a most likely a transient\n * condition and may be corrected by retrying with a backoff.\n *\n * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED,\n * and UNAVAILABLE.\n */\n UNAVAILABLE: 'unavailable' as FirestoreErrorCode,\n\n /** Unrecoverable data loss or corruption. */\n DATA_LOSS: 'data-loss' as FirestoreErrorCode\n};\n\n/** An error returned by a Firestore operation. */\nexport class FirestoreError extends Error {\n /** The custom name for all FirestoreErrors. */\n readonly name: string = 'FirebaseError';\n\n /** The stack of the error. */\n readonly stack?: string;\n\n /** @hideconstructor */\n constructor(\n /**\n * The backend error code associated with this error.\n */\n readonly code: FirestoreErrorCode,\n /**\n * A custom error description.\n */\n readonly message: string\n ) {\n super(message);\n\n // HACK: We write a toString property directly because Error is not a real\n // class and so inheritance does not work correctly. We could alternatively\n // do the same \"back-door inheritance\" trick that FirebaseError does.\n this.toString = () => `${this.name}: [code=${this.code}]: ${this.message}`;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Logger, LogLevel, LogLevelString } from '@firebase/logger';\n\nimport { SDK_VERSION } from '../core/version';\nimport { formatJSON } from '../platform/format_json';\n\nexport { LogLevel, LogLevelString };\n\nconst logClient = new Logger('@firebase/firestore');\n\n// Helper methods are needed because variables can't be exported as read/write\nexport function getLogLevel(): LogLevel {\n return logClient.logLevel;\n}\n\n/**\n * Sets the verbosity of Cloud Firestore logs (debug, error, or silent).\n *\n * @param logLevel - The verbosity you set for activity and error logging. Can\n * be any of the following values:\n *\n * <ul>\n * <li>`debug` for the most verbose logging level, primarily for\n * debugging.</li>\n * <li>`error` to log errors only.</li>\n * <li><code>`silent` to turn off logging.</li>\n * </ul>\n */\nexport function setLogLevel(logLevel: LogLevelString): void {\n logClient.setLogLevel(logLevel);\n}\n\nexport function logDebug(msg: string, ...obj: unknown[]): void {\n if (logClient.logLevel <= LogLevel.DEBUG) {\n const args = obj.map(argToString);\n logClient.debug(`Firestore (${SDK_VERSION}): ${msg}`, ...args);\n }\n}\n\nexport function logError(msg: string, ...obj: unknown[]): void {\n if (logClient.logLevel <= LogLevel.ERROR) {\n const args = obj.map(argToString);\n logClient.error(`Firestore (${SDK_VERSION}): ${msg}`, ...args);\n }\n}\n\nexport function logWarn(msg: string, ...obj: unknown[]): void {\n if (logClient.logLevel <= LogLevel.WARN) {\n const args = obj.map(argToString);\n logClient.warn(`Firestore (${SDK_VERSION}): ${msg}`, ...args);\n }\n}\n\n/**\n * Converts an additional log parameter to a string representation.\n */\nfunction argToString(obj: unknown): string | unknown {\n if (typeof obj === 'string') {\n return obj;\n } else {\n try {\n return formatJSON(obj);\n } catch (e) {\n // Converting to JSON failed, just log the object directly\n return obj;\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Formats an object as a JSON string, suitable for logging. */\nexport function formatJSON(value: unknown): string {\n return JSON.stringify(value);\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SDK_VERSION } from '../core/version';\n\nimport { logError } from './log';\n\n/**\n * Unconditionally fails, throwing an Error with the given message.\n * Messages are stripped in production builds.\n *\n * Returns `never` and can be used in expressions:\n * @example\n * let futureVar = fail('not implemented yet');\n */\nexport function fail(failure: string = 'Unexpected state'): never {\n // Log the failure in addition to throw an exception, just in case the\n // exception is swallowed.\n const message =\n `FIRESTORE (${SDK_VERSION}) INTERNAL ASSERTION FAILED: ` + failure;\n logError(message);\n\n // NOTE: We don't use FirestoreError here because these are internal failures\n // that cannot be handled by the user. (Also it would create a circular\n // dependency between the error and assert modules which doesn't work.)\n throw new Error(message);\n}\n\n/**\n * Fails if the given assertion condition is false, throwing an Error with the\n * given message if it did.\n *\n * Messages are stripped in production builds.\n */\nexport function hardAssert(\n assertion: boolean,\n message?: string\n): asserts assertion {\n if (!assertion) {\n fail(message);\n }\n}\n\n/**\n * Fails if the given assertion condition is false, throwing an Error with the\n * given message if it did.\n *\n * The code of callsites invoking this function are stripped out in production\n * builds. Any side-effects of code within the debugAssert() invocation will not\n * happen in this case.\n */\nexport function debugAssert(\n assertion: boolean,\n message: string\n): asserts assertion {\n if (!assertion) {\n fail(message);\n }\n}\n\n/**\n * Casts `obj` to `T`. In non-production builds, verifies that `obj` is an\n * instance of `T` before casting.\n */\nexport function debugCast<T>(\n obj: object,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor: { new (...args: any[]): T }\n): T | never {\n debugAssert(\n obj instanceof constructor,\n `Expected type '${constructor.name}', but was '${obj.constructor.name}'`\n );\n return obj as T;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from '../../util/assert';\n\n/**\n * Generates `nBytes` of random bytes.\n *\n * If `nBytes < 0` , an error will be thrown.\n */\nexport function randomBytes(nBytes: number): Uint8Array {\n debugAssert(nBytes >= 0, `Expecting non-negative nBytes, got: ${nBytes}`);\n\n // Polyfills for IE and WebWorker by using `self` and `msCrypto` when `crypto` is not available.\n const crypto =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof self !== 'undefined' && (self.crypto || (self as any)['msCrypto']);\n const bytes = new Uint8Array(nBytes);\n if (crypto && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(bytes);\n } else {\n // Falls back to Math.random\n for (let i = 0; i < nBytes; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return bytes;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { randomBytes } from '../platform/random_bytes';\n\nimport { debugAssert } from './assert';\n\nexport type EventHandler<E> = (value: E) => void;\nexport interface Indexable {\n [k: string]: unknown;\n}\n\nexport class AutoId {\n static newId(): string {\n // Alphanumeric characters\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n // The largest byte value that is a multiple of `char.length`.\n const maxMultiple = Math.floor(256 / chars.length) * chars.length;\n debugAssert(\n 0 < maxMultiple && maxMultiple < 256,\n `Expect maxMultiple to be (0, 256), but got ${maxMultiple}`\n );\n\n let autoId = '';\n const targetLength = 20;\n while (autoId.length < targetLength) {\n const bytes = randomBytes(40);\n for (let i = 0; i < bytes.length; ++i) {\n // Only accept values that are [0, maxMultiple), this ensures they can\n // be evenly mapped to indices of `chars` via a modulo operation.\n if (autoId.length < targetLength && bytes[i] < maxMultiple) {\n autoId += chars.charAt(bytes[i] % chars.length);\n }\n }\n }\n debugAssert(autoId.length === targetLength, 'Invalid auto ID: ' + autoId);\n\n return autoId;\n }\n}\n\nexport function primitiveComparator<T>(left: T, right: T): number {\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n return 0;\n}\n\nexport interface Equatable<T> {\n isEqual(other: T): boolean;\n}\n\n/** Helper to compare arrays using isEqual(). */\nexport function arrayEquals<T>(\n left: T[],\n right: T[],\n comparator: (l: T, r: T) => boolean\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n return left.every((value, index) => comparator(value, right[index]));\n}\n/**\n * Returns the immediate lexicographically-following string. This is useful to\n * construct an inclusive range for indexeddb iterators.\n */\nexport function immediateSuccessor(s: string): string {\n // Return the input string, with an additional NUL byte appended.\n return s + '\\0';\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Code, FirestoreError } from '../util/error';\nimport { primitiveComparator } from '../util/misc';\n\n// The earliest date supported by Firestore timestamps (0001-01-01T00:00:00Z).\nconst MIN_SECONDS = -62135596800;\n\n// Number of nanoseconds in a millisecond.\nconst MS_TO_NANOS = 1e6;\n\n/**\n * A `Timestamp` represents a point in time independent of any time zone or\n * calendar, represented as seconds and fractions of seconds at nanosecond\n * resolution in UTC Epoch time.\n *\n * It is encoded using the Proleptic Gregorian Calendar which extends the\n * Gregorian calendar backwards to year one. It is encoded assuming all minutes\n * are 60 seconds long, i.e. leap seconds are \"smeared\" so that no leap second\n * table is needed for interpretation. Range is from 0001-01-01T00:00:00Z to\n * 9999-12-31T23:59:59.999999999Z.\n *\n * For examples and further specifications, refer to the\n * {@link https://github.com/google/protobuf/blob/master/src/google/protobuf/timestamp.proto | Timestamp definition}.\n */\nexport class Timestamp {\n /**\n * Creates a new timestamp with the current date, with millisecond precision.\n *\n * @returns a new timestamp representing the current date.\n */\n static now(): Timestamp {\n return Timestamp.fromMillis(Date.now());\n }\n\n /**\n * Creates a new timestamp from the given date.\n *\n * @param date - The date to initialize the `Timestamp` from.\n * @returns A new `Timestamp` representing the same point in time as the given\n * date.\n */\n static fromDate(date: Date): Timestamp {\n return Timestamp.fromMillis(date.getTime());\n }\n\n /**\n * Creates a new timestamp from the given number of milliseconds.\n *\n * @param milliseconds - Number of milliseconds since Unix epoch\n * 1970-01-01T00:00:00Z.\n * @returns A new `Timestamp` representing the same point in time as the given\n * number of milliseconds.\n */\n static fromMillis(milliseconds: number): Timestamp {\n const seconds = Math.floor(milliseconds / 1000);\n const nanos = Math.floor((milliseconds - seconds * 1000) * MS_TO_NANOS);\n return new Timestamp(seconds, nanos);\n }\n\n /**\n * Creates a new timestamp.\n *\n * @param seconds - The number of seconds of UTC time since Unix epoch\n * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n * 9999-12-31T23:59:59Z inclusive.\n * @param nanoseconds - The non-negative fractions of a second at nanosecond\n * resolution. Negative second values with fractions must still have\n * non-negative nanoseconds values that count forward in time. Must be\n * from 0 to 999,999,999 inclusive.\n */\n constructor(\n /**\n * The number of seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z.\n */\n readonly seconds: number,\n /**\n * The fractions of a second at nanosecond resolution.*\n */\n readonly nanoseconds: number\n ) {\n if (nanoseconds < 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Timestamp nanoseconds out of range: ' + nanoseconds\n );\n }\n if (nanoseconds >= 1e9) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Timestamp nanoseconds out of range: ' + nanoseconds\n );\n }\n if (seconds < MIN_SECONDS) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Timestamp seconds out of range: ' + seconds\n );\n }\n // This will break in the year 10,000.\n if (seconds >= 253402300800) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Timestamp seconds out of range: ' + seconds\n );\n }\n }\n\n /**\n * Converts a `Timestamp` to a JavaScript `Date` object. This conversion\n * causes a loss of precision since `Date` objects only support millisecond\n * precision.\n *\n * @returns JavaScript `Date` object representing the same point in time as\n * this `Timestamp`, with millisecond precision.\n */\n toDate(): Date {\n return new Date(this.toMillis());\n }\n\n /**\n * Converts a `Timestamp` to a numeric timestamp (in milliseconds since\n * epoch). This operation causes a loss of precision.\n *\n * @returns The point in time corresponding to this timestamp, represented as\n * the number of milliseconds since Unix epoch 1970-01-01T00:00:00Z.\n */\n toMillis(): number {\n return this.seconds * 1000 + this.nanoseconds / MS_TO_NANOS;\n }\n\n _compareTo(other: Timestamp): number {\n if (this.seconds === other.seconds) {\n return primitiveComparator(this.nanoseconds, other.nanoseconds);\n }\n return primitiveComparator(this.seconds, other.seconds);\n }\n\n /**\n * Returns true if this `Timestamp` is equal to the provided one.\n *\n * @param other - The `Timestamp` to compare against.\n * @returns true if this `Timestamp` is equal to the provided one.\n */\n isEqual(other: Timestamp): boolean {\n return (\n other.seconds === this.seconds && other.nanoseconds === this.nanoseconds\n );\n }\n\n /** Returns a textual representation of this Timestamp. */\n toString(): string {\n return (\n 'Timestamp(seconds=' +\n this.seconds +\n ', nanoseconds=' +\n this.nanoseconds +\n ')'\n );\n }\n\n /** Returns a JSON-serializable representation of this Timestamp. */\n toJSON(): { seconds: number; nanoseconds: number } {\n return { seconds: this.seconds, nanoseconds: this.nanoseconds };\n }\n\n /**\n * Converts this object to a primitive string, which allows Timestamp objects\n * to be compared using the `>`, `<=`, `>=` and `>` operators.\n */\n valueOf(): string {\n // This method returns a string of the form <seconds>.<nanoseconds> where\n // <seconds> is translated to have a non-negative value and both <seconds>\n // and <nanoseconds> are left-padded with zeroes to be a consistent length.\n // Strings with this format then have a lexiographical ordering that matches\n // the expected ordering. The <seconds> translation is done to avoid having\n // a leading negative sign (i.e. a leading '-' character) in its string\n // representation, which would affect its lexiographical ordering.\n const adjustedSeconds = this.seconds - MIN_SECONDS;\n // Note: Up to 12 decimal digits are required to represent all valid\n // 'seconds' values.\n const formattedSeconds = String(adjustedSeconds).padStart(12, '0');\n const formattedNanoseconds = String(this.nanoseconds).padStart(9, '0');\n return formattedSeconds + '.' + formattedNanoseconds;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Timestamp } from '../lite/timestamp';\n\n/**\n * A version of a document in Firestore. This corresponds to the version\n * timestamp, such as update_time or read_time.\n */\nexport class SnapshotVersion {\n static fromTimestamp(value: Timestamp): SnapshotVersion {\n return new SnapshotVersion(value);\n }\n\n static min(): SnapshotVersion {\n return new SnapshotVersion(new Timestamp(0, 0));\n }\n\n private constructor(private timestamp: Timestamp) {}\n\n compareTo(other: SnapshotVersion): number {\n return this.timestamp._compareTo(other.timestamp);\n }\n\n isEqual(other: SnapshotVersion): boolean {\n return this.timestamp.isEqual(other.timestamp);\n }\n\n /** Returns a number representation of the version for use in spec tests. */\n toMicroseconds(): number {\n // Convert to microseconds.\n return this.timestamp.seconds * 1e6 + this.timestamp.nanoseconds / 1000;\n }\n\n toString(): string {\n return 'SnapshotVersion(' + this.timestamp.toString() + ')';\n }\n\n toTimestamp(): Timestamp {\n return this.timestamp;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from './assert';\n\nexport interface Dict<V> {\n [stringKey: string]: V;\n}\n\nexport function objectSize(obj: object): number {\n let count = 0;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n count++;\n }\n }\n return count;\n}\n\nexport function forEach<V>(\n obj: Dict<V> | undefined,\n fn: (key: string, val: V) => void\n): void {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn(key, obj[key]);\n }\n }\n}\n\nexport function isEmpty<V>(obj: Dict<V>): boolean {\n debugAssert(\n obj != null && typeof obj === 'object',\n 'isEmpty() expects object parameter.'\n );\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return false;\n }\n }\n return true;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert, fail } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\n\nexport const DOCUMENT_KEY_NAME = '__name__';\n\n/**\n * Path represents an ordered sequence of string segments.\n */\nabstract class BasePath<B extends BasePath<B>> {\n private segments: string[];\n private offset: number;\n private len: number;\n\n constructor(segments: string[], offset?: number, length?: number) {\n if (offset === undefined) {\n offset = 0;\n } else if (offset > segments.length) {\n fail('offset ' + offset + ' out of range ' + segments.length);\n }\n\n if (length === undefined) {\n length = segments.length - offset;\n } else if (length > segments.length - offset) {\n fail('length ' + length + ' out of range ' + (segments.length - offset));\n }\n this.segments = segments;\n this.offset = offset;\n this.len = length;\n }\n\n /**\n * Abstract constructor method to construct an instance of B with the given\n * parameters.\n */\n protected abstract construct(\n segments: string[],\n offset?: number,\n length?: number\n ): B;\n\n /**\n * Returns a String representation.\n *\n * Implementing classes are required to provide deterministic implementations as\n * the String representation is used to obtain canonical Query IDs.\n */\n abstract toString(): string;\n\n get length(): number {\n return this.len;\n }\n\n isEqual(other: B): boolean {\n return BasePath.comparator(this, other) === 0;\n }\n\n child(nameOrPath: string | B): B {\n const segments = this.segments.slice(this.offset, this.limit());\n if (nameOrPath instanceof BasePath) {\n nameOrPath.forEach(segment => {\n segments.push(segment);\n });\n } else {\n segments.push(nameOrPath);\n }\n return this.construct(segments);\n }\n\n /** The index of one past the last segment of the path. */\n private limit(): number {\n return this.offset + this.length;\n }\n\n popFirst(size?: number): B {\n size = size === undefined ? 1 : size;\n debugAssert(\n this.length >= size,\n \"Can't call popFirst() with less segments\"\n );\n return this.construct(\n this.segments,\n this.offset + size,\n this.length - size\n );\n }\n\n popLast(): B {\n debugAssert(!this.isEmpty(), \"Can't call popLast() on empty path\");\n return this.construct(this.segments, this.offset, this.length - 1);\n }\n\n firstSegment(): string {\n debugAssert(!this.isEmpty(), \"Can't call firstSegment() on empty path\");\n return this.segments[this.offset];\n }\n\n lastSegment(): string {\n return this.get(this.length - 1);\n }\n\n get(index: number): string {\n debugAssert(index < this.length, 'Index out of range');\n return this.segments[this.offset + index];\n }\n\n isEmpty(): boolean {\n return this.length === 0;\n }\n\n isPrefixOf(other: this): boolean {\n if (other.length < this.length) {\n return false;\n }\n\n for (let i = 0; i < this.length; i++) {\n if (this.get(i) !== other.get(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n isImmediateParentOf(potentialChild: this): boolean {\n if (this.length + 1 !== potentialChild.length) {\n return false;\n }\n\n for (let i = 0; i < this.length; i++) {\n if (this.get(i) !== potentialChild.get(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n forEach(fn: (segment: string) => void): void {\n for (let i = this.offset, end = this.limit(); i < end; i++) {\n fn(this.segments[i]);\n }\n }\n\n toArray(): string[] {\n return this.segments.slice(this.offset, this.limit());\n }\n\n static comparator<T extends BasePath<T>>(\n p1: BasePath<T>,\n p2: BasePath<T>\n ): number {\n const len = Math.min(p1.length, p2.length);\n for (let i = 0; i < len; i++) {\n const left = p1.get(i);\n const right = p2.get(i);\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n }\n if (p1.length < p2.length) {\n return -1;\n }\n if (p1.length > p2.length) {\n return 1;\n }\n return 0;\n }\n}\n\n/**\n * A slash-separated path for navigating resources (documents and collections)\n * within Firestore.\n */\nexport class ResourcePath extends BasePath<ResourcePath> {\n protected construct(\n segments: string[],\n offset?: number,\n length?: number\n ): ResourcePath {\n return new ResourcePath(segments, offset, length);\n }\n\n canonicalString(): string {\n // NOTE: The client is ignorant of any path segments containing escape\n // sequences (e.g. __id123__) and just passes them through raw (they exist\n // for legacy reasons and should not be used frequently).\n\n return this.toArray().join('/');\n }\n\n toString(): string {\n return this.canonicalString();\n }\n\n /**\n * Creates a resource path from the given slash-delimited string. If multiple\n * arguments are provided, all components are combined. Leading and trailing\n * slashes from all components are ignored.\n */\n static fromString(...pathComponents: string[]): ResourcePath {\n // NOTE: The client is ignorant of any path segments containing escape\n // sequences (e.g. __id123__) and just passes them through raw (they exist\n // for legacy reasons and should not be used frequently).\n\n const segments: string[] = [];\n for (const path of pathComponents) {\n if (path.indexOf('//') >= 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid segment (${path}). Paths must not contain // in them.`\n );\n }\n // Strip leading and traling slashed.\n segments.push(...path.split('/').filter(segment => segment.length > 0));\n }\n\n return new ResourcePath(segments);\n }\n\n static emptyPath(): ResourcePath {\n return new ResourcePath([]);\n }\n}\n\nconst identifierRegExp = /^[_a-zA-Z][_a-zA-Z0-9]*$/;\n\n/** A dot-separated path for navigating sub-objects within a document. */\nexport class FieldPath extends BasePath<FieldPath> {\n protected construct(\n segments: string[],\n offset?: number,\n length?: number\n ): FieldPath {\n return new FieldPath(segments, offset, length);\n }\n\n /**\n * Returns true if the string could be used as a segment in a field path\n * without escaping.\n */\n private static isValidIdentifier(segment: string): boolean {\n return identifierRegExp.test(segment);\n }\n\n canonicalString(): string {\n return this.toArray()\n .map(str => {\n str = str.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`');\n if (!FieldPath.isValidIdentifier(str)) {\n str = '`' + str + '`';\n }\n return str;\n })\n .join('.');\n }\n\n toString(): string {\n return this.canonicalString();\n }\n\n /**\n * Returns true if this field references the key of a document.\n */\n isKeyField(): boolean {\n return this.length === 1 && this.get(0) === DOCUMENT_KEY_NAME;\n }\n\n /**\n * The field designating the key of a document.\n */\n static keyField(): FieldPath {\n return new FieldPath([DOCUMENT_KEY_NAME]);\n }\n\n /**\n * Parses a field string from the given server-formatted string.\n *\n * - Splitting the empty string is not allowed (for now at least).\n * - Empty segments within the string (e.g. if there are two consecutive\n * separators) are not allowed.\n *\n * TODO(b/37244157): we should make this more strict. Right now, it allows\n * non-identifier path components, even if they aren't escaped.\n */\n static fromServerFormat(path: string): FieldPath {\n const segments: string[] = [];\n let current = '';\n let i = 0;\n\n const addCurrentSegment = (): void => {\n if (current.length === 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid field path (${path}). Paths must not be empty, begin ` +\n `with '.', end with '.', or contain '..'`\n );\n }\n segments.push(current);\n current = '';\n };\n\n let inBackticks = false;\n\n while (i < path.length) {\n const c = path[i];\n if (c === '\\\\') {\n if (i + 1 === path.length) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Path has trailing escape character: ' + path\n );\n }\n const next = path[i + 1];\n if (!(next === '\\\\' || next === '.' || next === '`')) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Path has invalid escape sequence: ' + path\n );\n }\n current += next;\n i += 2;\n } else if (c === '`') {\n inBackticks = !inBackticks;\n i++;\n } else if (c === '.' && !inBackticks) {\n addCurrentSegment();\n i++;\n } else {\n current += c;\n i++;\n }\n }\n addCurrentSegment();\n\n if (inBackticks) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Unterminated ` in path: ' + path\n );\n }\n\n return new FieldPath(segments);\n }\n\n static emptyPath(): FieldPath {\n return new FieldPath([]);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from '../util/assert';\nimport { arrayEquals } from '../util/misc';\n\nimport { FieldPath } from './path';\n\n/**\n * Provides a set of fields that can be used to partially patch a document.\n * FieldMask is used in conjunction with ObjectValue.\n * Examples:\n * foo - Overwrites foo entirely with the provided value. If foo is not\n * present in the companion ObjectValue, the field is deleted.\n * foo.bar - Overwrites only the field bar of the object foo.\n * If foo is not an object, foo is replaced with an object\n * containing foo\n */\nexport class FieldMask {\n constructor(readonly fields: FieldPath[]) {\n // TODO(dimond): validation of FieldMask\n // Sort the field mask to support `FieldMask.isEqual()` and assert below.\n fields.sort(FieldPath.comparator);\n debugAssert(\n !fields.some((v, i) => i !== 0 && v.isEqual(fields[i - 1])),\n 'FieldMask contains field that is not unique: ' +\n fields.find((v, i) => i !== 0 && v.isEqual(fields[i - 1]))!\n );\n }\n\n /**\n * Verifies that `fieldPath` is included by at least one field in this field\n * mask.\n *\n * This is an O(n) operation, where `n` is the size of the field mask.\n */\n covers(fieldPath: FieldPath): boolean {\n for (const fieldMaskPath of this.fields) {\n if (fieldMaskPath.isPrefixOf(fieldPath)) {\n return true;\n }\n }\n return false;\n }\n\n isEqual(other: FieldMask): boolean {\n return arrayEquals(this.fields, other.fields, (l, r) => l.isEqual(r));\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { decodeBase64, encodeBase64 } from '../platform/base64';\n\nimport { primitiveComparator } from './misc';\n\n/**\n * Immutable class that represents a \"proto\" byte string.\n *\n * Proto byte strings can either be Base64-encoded strings or Uint8Arrays when\n * sent on the wire. This class abstracts away this differentiation by holding\n * the proto byte string in a common class that must be converted into a string\n * before being sent as a proto.\n */\nexport class ByteString {\n static readonly EMPTY_BYTE_STRING = new ByteString('');\n\n private constructor(private readonly binaryString: string) {}\n\n static fromBase64String(base64: string): ByteString {\n const binaryString = decodeBase64(base64);\n return new ByteString(binaryString);\n }\n\n static fromUint8Array(array: Uint8Array): ByteString {\n const binaryString = binaryStringFromUint8Array(array);\n return new ByteString(binaryString);\n }\n\n toBase64(): string {\n return encodeBase64(this.binaryString);\n }\n\n toUint8Array(): Uint8Array {\n return uint8ArrayFromBinaryString(this.binaryString);\n }\n\n approximateByteSize(): number {\n return this.binaryString.length * 2;\n }\n\n compareTo(other: ByteString): number {\n return primitiveComparator(this.binaryString, other.binaryString);\n }\n\n isEqual(other: ByteString): boolean {\n return this.binaryString === other.binaryString;\n }\n}\n\n/**\n * Helper function to convert an Uint8array to a binary string.\n */\nexport function binaryStringFromUint8Array(array: Uint8Array): string {\n let binaryString = '';\n for (let i = 0; i < array.length; ++i) {\n binaryString += String.fromCharCode(array[i]);\n }\n return binaryString;\n}\n\n/**\n * Helper function to convert a binary string to an Uint8Array.\n */\nexport function uint8ArrayFromBinaryString(binaryString: string): Uint8Array {\n const buffer = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n buffer[i] = binaryString.charCodeAt(i);\n }\n return buffer;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Converts a Base64 encoded string to a binary string. */\nexport function decodeBase64(encoded: string): string {\n return atob(encoded);\n}\n\n/** Converts a binary string to a Base64 encoded string. */\nexport function encodeBase64(raw: string): string {\n return btoa(raw);\n}\n\n/** True if and only if the Base64 conversion functions are available. */\nexport function isBase64Available(): boolean {\n return typeof atob !== 'undefined';\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Timestamp } from '../protos/firestore_proto_api';\nimport { hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\n\n// A RegExp matching ISO 8601 UTC timestamps with optional fraction.\nconst ISO_TIMESTAMP_REG_EXP = new RegExp(\n /^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(?:\\.(\\d+))?Z$/\n);\n\n/**\n * Converts the possible Proto values for a timestamp value into a \"seconds and\n * nanos\" representation.\n */\nexport function normalizeTimestamp(\n date: Timestamp\n): { seconds: number; nanos: number } {\n hardAssert(!!date, 'Cannot normalize null or undefined timestamp.');\n\n // The json interface (for the browser) will return an iso timestamp string,\n // while the proto js library (for node) will return a\n // google.protobuf.Timestamp instance.\n if (typeof date === 'string') {\n // The date string can have higher precision (nanos) than the Date class\n // (millis), so we do some custom parsing here.\n\n // Parse the nanos right out of the string.\n let nanos = 0;\n const fraction = ISO_TIMESTAMP_REG_EXP.exec(date);\n hardAssert(!!fraction, 'invalid timestamp: ' + date);\n if (fraction[1]) {\n // Pad the fraction out to 9 digits (nanos).\n let nanoStr = fraction[1];\n nanoStr = (nanoStr + '000000000').substr(0, 9);\n nanos = Number(nanoStr);\n }\n\n // Parse the date to get the seconds.\n const parsedDate = new Date(date);\n const seconds = Math.floor(parsedDate.getTime() / 1000);\n\n return { seconds, nanos };\n } else {\n // TODO(b/37282237): Use strings for Proto3 timestamps\n // assert(!this.options.useProto3Json,\n // 'The timestamp instance format requires Proto JS.');\n const seconds = normalizeNumber(date.seconds);\n const nanos = normalizeNumber(date.nanos);\n return { seconds, nanos };\n }\n}\n\n/**\n * Converts the possible Proto types for numbers into a JavaScript number.\n * Returns 0 if the value is not numeric.\n */\nexport function normalizeNumber(value: number | string | undefined): number {\n // TODO(bjornick): Handle int64 greater than 53 bits.\n if (typeof value === 'number') {\n return value;\n } else if (typeof value === 'string') {\n return Number(value);\n } else {\n return 0;\n }\n}\n\n/** Converts the possible Proto types for Blobs into a ByteString. */\nexport function normalizeByteString(blob: string | Uint8Array): ByteString {\n if (typeof blob === 'string') {\n return ByteString.fromBase64String(blob);\n } else {\n return ByteString.fromUint8Array(blob);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Timestamp } from '../lite/timestamp';\nimport {\n Value as ProtoValue,\n MapValue as ProtoMapValue\n} from '../protos/firestore_proto_api';\n\nimport { normalizeTimestamp } from './normalize';\n\n/**\n * Represents a locally-applied ServerTimestamp.\n *\n * Server Timestamps are backed by MapValues that contain an internal field\n * `__type__` with a value of `server_timestamp`. The previous value and local\n * write time are stored in its `__previous_value__` and `__local_write_time__`\n * fields respectively.\n *\n * Notes:\n * - ServerTimestampValue instances are created as the result of applying a\n * transform. They can only exist in the local view of a document. Therefore\n * they do not need to be parsed or serialized.\n * - When evaluated locally (e.g. for snapshot.data()), they by default\n * evaluate to `null`. This behavior can be configured by passing custom\n * FieldValueOptions to value().\n * - With respect to other ServerTimestampValues, they sort by their\n * localWriteTime.\n */\n\nconst SERVER_TIMESTAMP_SENTINEL = 'server_timestamp';\nconst TYPE_KEY = '__type__';\nconst PREVIOUS_VALUE_KEY = '__previous_value__';\nconst LOCAL_WRITE_TIME_KEY = '__local_write_time__';\n\nexport function isServerTimestamp(value: ProtoValue | null): boolean {\n const type = (value?.mapValue?.fields || {})[TYPE_KEY]?.stringValue;\n return type === SERVER_TIMESTAMP_SENTINEL;\n}\n\n/**\n * Creates a new ServerTimestamp proto value (using the internal format).\n */\nexport function serverTimestamp(\n localWriteTime: Timestamp,\n previousValue: ProtoValue | null\n): ProtoValue {\n const mapValue: ProtoMapValue = {\n fields: {\n [TYPE_KEY]: {\n stringValue: SERVER_TIMESTAMP_SENTINEL\n },\n [LOCAL_WRITE_TIME_KEY]: {\n timestampValue: {\n seconds: localWriteTime.seconds,\n nanos: localWriteTime.nanoseconds\n }\n }\n }\n };\n\n if (previousValue) {\n mapValue.fields![PREVIOUS_VALUE_KEY] = previousValue;\n }\n\n return { mapValue };\n}\n\n/**\n * Returns the value of the field before this ServerTimestamp was set.\n *\n * Preserving the previous values allows the user to display the last resoled\n * value until the backend responds with the timestamp.\n */\nexport function getPreviousValue(value: ProtoValue): ProtoValue | null {\n const previousValue = value.mapValue!.fields![PREVIOUS_VALUE_KEY];\n\n if (isServerTimestamp(previousValue)) {\n return getPreviousValue(previousValue);\n }\n return previousValue;\n}\n\n/**\n * Returns the local time at which this timestamp was first set.\n */\nexport function getLocalWriteTime(value: ProtoValue): Timestamp {\n const localWriteTime = normalizeTimestamp(\n value.mapValue!.fields![LOCAL_WRITE_TIME_KEY].timestampValue!\n );\n return new Timestamp(localWriteTime.seconds, localWriteTime.nanos);\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Sentinel value that sorts before any Mutation Batch ID. */\nexport const BATCHID_UNKNOWN = -1;\n\n// An Object whose keys and values are strings.\nexport interface StringMap {\n [key: string]: string;\n}\n\n/**\n * Returns whether a variable is either undefined or null.\n */\nexport function isNullOrUndefined(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/** Returns whether the value represents -0. */\nexport function isNegativeZero(value: number): boolean {\n // Detect if the value is -0.0. Based on polyfill from\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n return value === 0 && 1 / value === 1 / -0;\n}\n\n/**\n * Returns whether a value is an integer and in the safe integer range\n * @param value - The value to test for being an integer and in the safe range\n */\nexport function isSafeInteger(value: unknown): boolean {\n return (\n typeof value === 'number' &&\n Number.isInteger(value) &&\n !isNegativeZero(value) &&\n value <= Number.MAX_SAFE_INTEGER &&\n value >= Number.MIN_SAFE_INTEGER\n );\n}\n\n/** The subset of the browser's Window interface used by the SDK. */\nexport interface WindowLike {\n readonly localStorage: Storage;\n readonly indexedDB: IDBFactory | null;\n addEventListener(type: string, listener: EventListener): void;\n removeEventListener(type: string, listener: EventListener): void;\n}\n\n/** The subset of the browser's Document interface used by the SDK. */\nexport interface DocumentLike {\n readonly visibilityState: VisibilityState;\n addEventListener(type: string, listener: EventListener): void;\n removeEventListener(type: string, listener: EventListener): void;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from '../util/assert';\n\nimport { ResourcePath } from './path';\n\nexport class DocumentKey {\n constructor(readonly path: ResourcePath) {\n debugAssert(\n DocumentKey.isDocumentKey(path),\n 'Invalid DocumentKey with an odd number of segments: ' +\n path.toArray().join('/')\n );\n }\n\n static fromPath(path: string): DocumentKey {\n return new DocumentKey(ResourcePath.fromString(path));\n }\n\n static fromName(name: string): DocumentKey {\n return new DocumentKey(ResourcePath.fromString(name).popFirst(5));\n }\n\n /** Returns true if the document is in the specified collectionId. */\n hasCollectionId(collectionId: string): boolean {\n return (\n this.path.length >= 2 &&\n this.path.get(this.path.length - 2) === collectionId\n );\n }\n\n isEqual(other: DocumentKey | null): boolean {\n return (\n other !== null && ResourcePath.comparator(this.path, other.path) === 0\n );\n }\n\n toString(): string {\n return this.path.toString();\n }\n\n static comparator(k1: DocumentKey, k2: DocumentKey): number {\n return ResourcePath.comparator(k1.path, k2.path);\n }\n\n static isDocumentKey(path: ResourcePath): boolean {\n return path.length % 2 === 0;\n }\n\n /**\n * Creates and returns a new document key with the given segments.\n *\n * @param segments - The segments of the path to the document\n * @returns A new instance of DocumentKey\n */\n static fromSegments(segments: string[]): DocumentKey {\n return new DocumentKey(new ResourcePath(segments.slice()));\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseId } from '../core/database_info';\nimport {\n ArrayValue,\n LatLng,\n MapValue,\n Timestamp,\n Value\n} from '../protos/firestore_proto_api';\nimport { fail } from '../util/assert';\nimport { arrayEquals, primitiveComparator } from '../util/misc';\nimport { forEach, objectSize } from '../util/obj';\nimport { isNegativeZero } from '../util/types';\n\nimport { DocumentKey } from './document_key';\nimport {\n normalizeByteString,\n normalizeNumber,\n normalizeTimestamp\n} from './normalize';\nimport {\n getLocalWriteTime,\n getPreviousValue,\n isServerTimestamp\n} from './server_timestamps';\nimport { TypeOrder } from './type_order';\n\n/** Extracts the backend's type order for the provided value. */\nexport function typeOrder(value: Value): TypeOrder {\n if ('nullValue' in value) {\n return TypeOrder.NullValue;\n } else if ('booleanValue' in value) {\n return TypeOrder.BooleanValue;\n } else if ('integerValue' in value || 'doubleValue' in value) {\n return TypeOrder.NumberValue;\n } else if ('timestampValue' in value) {\n return TypeOrder.TimestampValue;\n } else if ('stringValue' in value) {\n return TypeOrder.StringValue;\n } else if ('bytesValue' in value) {\n return TypeOrder.BlobValue;\n } else if ('referenceValue' in value) {\n return TypeOrder.RefValue;\n } else if ('geoPointValue' in value) {\n return TypeOrder.GeoPointValue;\n } else if ('arrayValue' in value) {\n return TypeOrder.ArrayValue;\n } else if ('mapValue' in value) {\n if (isServerTimestamp(value)) {\n return TypeOrder.ServerTimestampValue;\n }\n return TypeOrder.ObjectValue;\n } else {\n return fail('Invalid value type: ' + JSON.stringify(value));\n }\n}\n\n/** Tests `left` and `right` for equality based on the backend semantics. */\nexport function valueEquals(left: Value, right: Value): boolean {\n const leftType = typeOrder(left);\n const rightType = typeOrder(right);\n if (leftType !== rightType) {\n return false;\n }\n\n switch (leftType) {\n case TypeOrder.NullValue:\n return true;\n case TypeOrder.BooleanValue:\n return left.booleanValue === right.booleanValue;\n case TypeOrder.ServerTimestampValue:\n return getLocalWriteTime(left).isEqual(getLocalWriteTime(right));\n case TypeOrder.TimestampValue:\n return timestampEquals(left, right);\n case TypeOrder.StringValue:\n return left.stringValue === right.stringValue;\n case TypeOrder.BlobValue:\n return blobEquals(left, right);\n case TypeOrder.RefValue:\n return left.referenceValue === right.referenceValue;\n case TypeOrder.GeoPointValue:\n return geoPointEquals(left, right);\n case TypeOrder.NumberValue:\n return numberEquals(left, right);\n case TypeOrder.ArrayValue:\n return arrayEquals(\n left.arrayValue!.values || [],\n right.arrayValue!.values || [],\n valueEquals\n );\n case TypeOrder.ObjectValue:\n return objectEquals(left, right);\n default:\n return fail('Unexpected value type: ' + JSON.stringify(left));\n }\n}\n\nfunction timestampEquals(left: Value, right: Value): boolean {\n if (\n typeof left.timestampValue === 'string' &&\n typeof right.timestampValue === 'string' &&\n left.timestampValue.length === right.timestampValue.length\n ) {\n // Use string equality for ISO 8601 timestamps\n return left.timestampValue === right.timestampValue;\n }\n\n const leftTimestamp = normalizeTimestamp(left.timestampValue!);\n const rightTimestamp = normalizeTimestamp(right.timestampValue!);\n return (\n leftTimestamp.seconds === rightTimestamp.seconds &&\n leftTimestamp.nanos === rightTimestamp.nanos\n );\n}\n\nfunction geoPointEquals(left: Value, right: Value): boolean {\n return (\n normalizeNumber(left.geoPointValue!.latitude) ===\n normalizeNumber(right.geoPointValue!.latitude) &&\n normalizeNumber(left.geoPointValue!.longitude) ===\n normalizeNumber(right.geoPointValue!.longitude)\n );\n}\n\nfunction blobEquals(left: Value, right: Value): boolean {\n return normalizeByteString(left.bytesValue!).isEqual(\n normalizeByteString(right.bytesValue!)\n );\n}\n\nexport function numberEquals(left: Value, right: Value): boolean {\n if ('integerValue' in left && 'integerValue' in right) {\n return (\n normalizeNumber(left.integerValue) === normalizeNumber(right.integerValue)\n );\n } else if ('doubleValue' in left && 'doubleValue' in right) {\n const n1 = normalizeNumber(left.doubleValue!);\n const n2 = normalizeNumber(right.doubleValue!);\n\n if (n1 === n2) {\n return isNegativeZero(n1) === isNegativeZero(n2);\n } else {\n return isNaN(n1) && isNaN(n2);\n }\n }\n\n return false;\n}\n\nfunction objectEquals(left: Value, right: Value): boolean {\n const leftMap = left.mapValue!.fields || {};\n const rightMap = right.mapValue!.fields || {};\n\n if (objectSize(leftMap) !== objectSize(rightMap)) {\n return false;\n }\n\n for (const key in leftMap) {\n if (leftMap.hasOwnProperty(key)) {\n if (\n rightMap[key] === undefined ||\n !valueEquals(leftMap[key], rightMap[key])\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\n/** Returns true if the ArrayValue contains the specified element. */\nexport function arrayValueContains(\n haystack: ArrayValue,\n needle: Value\n): boolean {\n return (\n (haystack.values || []).find(v => valueEquals(v, needle)) !== undefined\n );\n}\n\nexport function valueCompare(left: Value, right: Value): number {\n const leftType = typeOrder(left);\n const rightType = typeOrder(right);\n\n if (leftType !== rightType) {\n return primitiveComparator(leftType, rightType);\n }\n\n switch (leftType) {\n case TypeOrder.NullValue:\n return 0;\n case TypeOrder.BooleanValue:\n return primitiveComparator(left.booleanValue!, right.booleanValue!);\n case TypeOrder.NumberValue:\n return compareNumbers(left, right);\n case TypeOrder.TimestampValue:\n return compareTimestamps(left.timestampValue!, right.timestampValue!);\n case TypeOrder.ServerTimestampValue:\n return compareTimestamps(\n getLocalWriteTime(left),\n getLocalWriteTime(right)\n );\n case TypeOrder.StringValue:\n return primitiveComparator(left.stringValue!, right.stringValue!);\n case TypeOrder.BlobValue:\n return compareBlobs(left.bytesValue!, right.bytesValue!);\n case TypeOrder.RefValue:\n return compareReferences(left.referenceValue!, right.referenceValue!);\n case TypeOrder.GeoPointValue:\n return compareGeoPoints(left.geoPointValue!, right.geoPointValue!);\n case TypeOrder.ArrayValue:\n return compareArrays(left.arrayValue!, right.arrayValue!);\n case TypeOrder.ObjectValue:\n return compareMaps(left.mapValue!, right.mapValue!);\n default:\n throw fail('Invalid value type: ' + leftType);\n }\n}\n\nfunction compareNumbers(left: Value, right: Value): number {\n const leftNumber = normalizeNumber(left.integerValue || left.doubleValue);\n const rightNumber = normalizeNumber(right.integerValue || right.doubleValue);\n\n if (leftNumber < rightNumber) {\n return -1;\n } else if (leftNumber > rightNumber) {\n return 1;\n } else if (leftNumber === rightNumber) {\n return 0;\n } else {\n // one or both are NaN.\n if (isNaN(leftNumber)) {\n return isNaN(rightNumber) ? 0 : -1;\n } else {\n return 1;\n }\n }\n}\n\nfunction compareTimestamps(left: Timestamp, right: Timestamp): number {\n if (\n typeof left === 'string' &&\n typeof right === 'string' &&\n left.length === right.length\n ) {\n return primitiveComparator(left, right);\n }\n\n const leftTimestamp = normalizeTimestamp(left);\n const rightTimestamp = normalizeTimestamp(right);\n\n const comparison = primitiveComparator(\n leftTimestamp.seconds,\n rightTimestamp.seconds\n );\n if (comparison !== 0) {\n return comparison;\n }\n return primitiveComparator(leftTimestamp.nanos, rightTimestamp.nanos);\n}\n\nfunction compareReferences(leftPath: string, rightPath: string): number {\n const leftSegments = leftPath.split('/');\n const rightSegments = rightPath.split('/');\n for (let i = 0; i < leftSegments.length && i < rightSegments.length; i++) {\n const comparison = primitiveComparator(leftSegments[i], rightSegments[i]);\n if (comparison !== 0) {\n return comparison;\n }\n }\n return primitiveComparator(leftSegments.length, rightSegments.length);\n}\n\nfunction compareGeoPoints(left: LatLng, right: LatLng): number {\n const comparison = primitiveComparator(\n normalizeNumber(left.latitude),\n normalizeNumber(right.latitude)\n );\n if (comparison !== 0) {\n return comparison;\n }\n return primitiveComparator(\n normalizeNumber(left.longitude),\n normalizeNumber(right.longitude)\n );\n}\n\nfunction compareBlobs(\n left: string | Uint8Array,\n right: string | Uint8Array\n): number {\n const leftBytes = normalizeByteString(left);\n const rightBytes = normalizeByteString(right);\n return leftBytes.compareTo(rightBytes);\n}\n\nfunction compareArrays(left: ArrayValue, right: ArrayValue): number {\n const leftArray = left.values || [];\n const rightArray = right.values || [];\n\n for (let i = 0; i < leftArray.length && i < rightArray.length; ++i) {\n const compare = valueCompare(leftArray[i], rightArray[i]);\n if (compare) {\n return compare;\n }\n }\n return primitiveComparator(leftArray.length, rightArray.length);\n}\n\nfunction compareMaps(left: MapValue, right: MapValue): number {\n const leftMap = left.fields || {};\n const leftKeys = Object.keys(leftMap);\n const rightMap = right.fields || {};\n const rightKeys = Object.keys(rightMap);\n\n // Even though MapValues are likely sorted correctly based on their insertion\n // order (e.g. when received from the backend), local modifications can bring\n // elements out of order. We need to re-sort the elements to ensure that\n // canonical IDs are independent of insertion order.\n leftKeys.sort();\n rightKeys.sort();\n\n for (let i = 0; i < leftKeys.length && i < rightKeys.length; ++i) {\n const keyCompare = primitiveComparator(leftKeys[i], rightKeys[i]);\n if (keyCompare !== 0) {\n return keyCompare;\n }\n const compare = valueCompare(leftMap[leftKeys[i]], rightMap[rightKeys[i]]);\n if (compare !== 0) {\n return compare;\n }\n }\n\n return primitiveComparator(leftKeys.length, rightKeys.length);\n}\n\n/**\n * Generates the canonical ID for the provided field value (as used in Target\n * serialization).\n */\nexport function canonicalId(value: Value): string {\n return canonifyValue(value);\n}\n\nfunction canonifyValue(value: Value): string {\n if ('nullValue' in value) {\n return 'null';\n } else if ('booleanValue' in value) {\n return '' + value.booleanValue!;\n } else if ('integerValue' in value) {\n return '' + value.integerValue!;\n } else if ('doubleValue' in value) {\n return '' + value.doubleValue!;\n } else if ('timestampValue' in value) {\n return canonifyTimestamp(value.timestampValue!);\n } else if ('stringValue' in value) {\n return value.stringValue!;\n } else if ('bytesValue' in value) {\n return canonifyByteString(value.bytesValue!);\n } else if ('referenceValue' in value) {\n return canonifyReference(value.referenceValue!);\n } else if ('geoPointValue' in value) {\n return canonifyGeoPoint(value.geoPointValue!);\n } else if ('arrayValue' in value) {\n return canonifyArray(value.arrayValue!);\n } else if ('mapValue' in value) {\n return canonifyMap(value.mapValue!);\n } else {\n return fail('Invalid value type: ' + JSON.stringify(value));\n }\n}\n\nfunction canonifyByteString(byteString: string | Uint8Array): string {\n return normalizeByteString(byteString).toBase64();\n}\n\nfunction canonifyTimestamp(timestamp: Timestamp): string {\n const normalizedTimestamp = normalizeTimestamp(timestamp);\n return `time(${normalizedTimestamp.seconds},${normalizedTimestamp.nanos})`;\n}\n\nfunction canonifyGeoPoint(geoPoint: LatLng): string {\n return `geo(${geoPoint.latitude},${geoPoint.longitude})`;\n}\n\nfunction canonifyReference(referenceValue: string): string {\n return DocumentKey.fromName(referenceValue).toString();\n}\n\nfunction canonifyMap(mapValue: MapValue): string {\n // Iteration order in JavaScript is not guaranteed. To ensure that we generate\n // matching canonical IDs for identical maps, we need to sort the keys.\n const sortedKeys = Object.keys(mapValue.fields || {}).sort();\n\n let result = '{';\n let first = true;\n for (const key of sortedKeys) {\n if (!first) {\n result += ',';\n } else {\n first = false;\n }\n result += `${key}:${canonifyValue(mapValue.fields![key])}`;\n }\n return result + '}';\n}\n\nfunction canonifyArray(arrayValue: ArrayValue): string {\n let result = '[';\n let first = true;\n for (const value of arrayValue.values || []) {\n if (!first) {\n result += ',';\n } else {\n first = false;\n }\n result += canonifyValue(value);\n }\n return result + ']';\n}\n\n/**\n * Returns an approximate (and wildly inaccurate) in-memory size for the field\n * value.\n *\n * The memory size takes into account only the actual user data as it resides\n * in memory and ignores object overhead.\n */\nexport function estimateByteSize(value: Value): number {\n switch (typeOrder(value)) {\n case TypeOrder.NullValue:\n return 4;\n case TypeOrder.BooleanValue:\n return 4;\n case TypeOrder.NumberValue:\n return 8;\n case TypeOrder.TimestampValue:\n // Timestamps are made up of two distinct numbers (seconds + nanoseconds)\n return 16;\n case TypeOrder.ServerTimestampValue:\n const previousValue = getPreviousValue(value);\n return previousValue ? 16 + estimateByteSize(previousValue) : 16;\n case TypeOrder.StringValue:\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures:\n // \"JavaScript's String type is [...] a set of elements of 16-bit unsigned\n // integer values\"\n return value.stringValue!.length * 2;\n case TypeOrder.BlobValue:\n return normalizeByteString(value.bytesValue!).approximateByteSize();\n case TypeOrder.RefValue:\n return value.referenceValue!.length;\n case TypeOrder.GeoPointValue:\n // GeoPoints are made up of two distinct numbers (latitude + longitude)\n return 16;\n case TypeOrder.ArrayValue:\n return estimateArrayByteSize(value.arrayValue!);\n case TypeOrder.ObjectValue:\n return estimateMapByteSize(value.mapValue!);\n default:\n throw fail('Invalid value type: ' + JSON.stringify(value));\n }\n}\n\nfunction estimateMapByteSize(mapValue: MapValue): number {\n let size = 0;\n forEach(mapValue.fields, (key, val) => {\n size += key.length + estimateByteSize(val);\n });\n return size;\n}\n\nfunction estimateArrayByteSize(arrayValue: ArrayValue): number {\n return (arrayValue.values || []).reduce(\n (previousSize, value) => previousSize + estimateByteSize(value),\n 0\n );\n}\n\n/** Returns a reference value for the provided database and key. */\nexport function refValue(databaseId: DatabaseId, key: DocumentKey): Value {\n return {\n referenceValue: `projects/${databaseId.projectId}/databases/${\n databaseId.database\n }/documents/${key.path.canonicalString()}`\n };\n}\n\n/** Returns true if `value` is an IntegerValue . */\nexport function isInteger(\n value?: Value | null\n): value is { integerValue: string | number } {\n return !!value && 'integerValue' in value;\n}\n\n/** Returns true if `value` is a DoubleValue. */\nexport function isDouble(\n value?: Value | null\n): value is { doubleValue: string | number } {\n return !!value && 'doubleValue' in value;\n}\n\n/** Returns true if `value` is either an IntegerValue or a DoubleValue. */\nexport function isNumber(value?: Value | null): boolean {\n return isInteger(value) || isDouble(value);\n}\n\n/** Returns true if `value` is an ArrayValue. */\nexport function isArray(\n value?: Value | null\n): value is { arrayValue: ArrayValue } {\n return !!value && 'arrayValue' in value;\n}\n\n/** Returns true if `value` is a ReferenceValue. */\nexport function isReferenceValue(\n value?: Value | null\n): value is { referenceValue: string } {\n return !!value && 'referenceValue' in value;\n}\n\n/** Returns true if `value` is a NullValue. */\nexport function isNullValue(\n value?: Value | null\n): value is { nullValue: 'NULL_VALUE' } {\n return !!value && 'nullValue' in value;\n}\n\n/** Returns true if `value` is NaN. */\nexport function isNanValue(\n value?: Value | null\n): value is { doubleValue: 'NaN' | number } {\n return !!value && 'doubleValue' in value && isNaN(Number(value.doubleValue));\n}\n\n/** Returns true if `value` is a MapValue. */\nexport function isMapValue(\n value?: Value | null\n): value is { mapValue: MapValue } {\n return !!value && 'mapValue' in value;\n}\n\n/** Creates a deep copy of `source`. */\nexport function deepClone(source: Value): Value {\n if (source.geoPointValue) {\n return { geoPointValue: { ...source.geoPointValue } };\n } else if (\n source.timestampValue &&\n typeof source.timestampValue === 'object'\n ) {\n return { timestampValue: { ...source.timestampValue } };\n } else if (source.mapValue) {\n const target: Value = { mapValue: { fields: {} } };\n forEach(\n source.mapValue.fields,\n (key, val) => (target.mapValue!.fields![key] = deepClone(val))\n );\n return target;\n } else if (source.arrayValue) {\n const target: Value = { arrayValue: { values: [] } };\n for (let i = 0; i < (source.arrayValue.values || []).length; ++i) {\n target.arrayValue!.values![i] = deepClone(source.arrayValue.values![i]);\n }\n return target;\n } else {\n return { ...source };\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n MapValue as ProtoMapValue,\n Value as ProtoValue\n} from '../protos/firestore_proto_api';\nimport { debugAssert } from '../util/assert';\nimport { forEach } from '../util/obj';\n\nimport { FieldMask } from './field_mask';\nimport { FieldPath } from './path';\nimport { isServerTimestamp } from './server_timestamps';\nimport { deepClone, isMapValue, valueEquals } from './values';\n\nexport interface JsonObject<T> {\n [name: string]: T;\n}\n/**\n * An ObjectValue represents a MapValue in the Firestore Proto and offers the\n * ability to add and remove fields (via the ObjectValueBuilder).\n */\nexport class ObjectValue {\n constructor(readonly value: { mapValue: ProtoMapValue }) {\n debugAssert(\n !isServerTimestamp(value),\n 'ServerTimestamps should be converted to ServerTimestampValue'\n );\n }\n\n static empty(): ObjectValue {\n return new ObjectValue({ mapValue: {} });\n }\n\n /**\n * Returns the value at the given path or null.\n *\n * @param path - the path to search\n * @returns The value at the path or null if the path is not set.\n */\n field(path: FieldPath): ProtoValue | null {\n if (path.isEmpty()) {\n return this.value;\n } else {\n let currentLevel: ProtoValue = this.value;\n for (let i = 0; i < path.length - 1; ++i) {\n currentLevel = (currentLevel.mapValue!.fields || {})[path.get(i)];\n if (!isMapValue(currentLevel)) {\n return null;\n }\n }\n currentLevel = (currentLevel.mapValue!.fields! || {})[path.lastSegment()];\n return currentLevel || null;\n }\n }\n\n /**\n * Sets the field to the provided value.\n *\n * @param path - The field path to set.\n * @param value - The value to set.\n */\n set(path: FieldPath, value: ProtoValue): void {\n debugAssert(\n !path.isEmpty(),\n 'Cannot set field for empty path on ObjectValue'\n );\n const fieldsMap = this.getFieldsMap(path.popLast());\n fieldsMap[path.lastSegment()] = deepClone(value);\n }\n\n /**\n * Sets the provided fields to the provided values.\n *\n * @param data - A map of fields to values (or null for deletes).\n */\n setAll(data: Map<FieldPath, ProtoValue | null>): void {\n let parent = FieldPath.emptyPath();\n\n let upserts: { [key: string]: ProtoValue } = {};\n let deletes: string[] = [];\n\n data.forEach((value, path) => {\n if (!parent.isImmediateParentOf(path)) {\n // Insert the accumulated changes at this parent location\n const fieldsMap = this.getFieldsMap(parent);\n this.applyChanges(fieldsMap, upserts, deletes);\n upserts = {};\n deletes = [];\n parent = path.popLast();\n }\n\n if (value) {\n upserts[path.lastSegment()] = deepClone(value);\n } else {\n deletes.push(path.lastSegment());\n }\n });\n\n const fieldsMap = this.getFieldsMap(parent);\n this.applyChanges(fieldsMap, upserts, deletes);\n }\n\n /**\n * Removes the field at the specified path. If there is no field at the\n * specified path, nothing is changed.\n *\n * @param path - The field path to remove.\n */\n delete(path: FieldPath): void {\n debugAssert(\n !path.isEmpty(),\n 'Cannot delete field for empty path on ObjectValue'\n );\n const nestedValue = this.field(path.popLast());\n if (isMapValue(nestedValue) && nestedValue.mapValue.fields) {\n delete nestedValue.mapValue.fields[path.lastSegment()];\n }\n }\n\n isEqual(other: ObjectValue): boolean {\n return valueEquals(this.value, other.value);\n }\n\n /**\n * Returns the map that contains the leaf element of `path`. If the parent\n * entry does not yet exist, or if it is not a map, a new map will be created.\n */\n private getFieldsMap(path: FieldPath): Record<string, ProtoValue> {\n let current = this.value;\n\n if (!current.mapValue!.fields) {\n current.mapValue = { fields: {} };\n }\n\n for (let i = 0; i < path.length; ++i) {\n let next = current.mapValue!.fields![path.get(i)];\n if (!isMapValue(next) || !next.mapValue.fields) {\n next = { mapValue: { fields: {} } };\n current.mapValue!.fields![path.get(i)] = next;\n }\n current = next as { mapValue: ProtoMapValue };\n }\n\n return current.mapValue!.fields!;\n }\n\n /**\n * Modifies `fieldsMap` by adding, replacing or deleting the specified\n * entries.\n */\n private applyChanges(\n fieldsMap: Record<string, ProtoValue>,\n inserts: { [key: string]: ProtoValue },\n deletes: string[]\n ): void {\n forEach(inserts, (key, val) => (fieldsMap[key] = val));\n for (const field of deletes) {\n delete fieldsMap[field];\n }\n }\n\n clone(): ObjectValue {\n return new ObjectValue(\n deepClone(this.value) as { mapValue: ProtoMapValue }\n );\n }\n}\n\n/**\n * Returns a FieldMask built from all fields in a MapValue.\n */\nexport function extractFieldMask(value: ProtoMapValue): FieldMask {\n const fields: FieldPath[] = [];\n forEach(value!.fields, (key, value) => {\n const currentPath = new FieldPath([key]);\n if (isMapValue(value)) {\n const nestedMask = extractFieldMask(value.mapValue!);\n const nestedFields = nestedMask.fields;\n if (nestedFields.length === 0) {\n // Preserve the empty map by adding it to the FieldMask.\n fields.push(currentPath);\n } else {\n // For nested and non-empty ObjectValues, add the FieldPath of the\n // leaf nodes.\n for (const nestedPath of nestedFields) {\n fields.push(currentPath.child(nestedPath));\n }\n }\n } else {\n // For nested and non-empty ObjectValues, add the FieldPath of the leaf\n // nodes.\n fields.push(currentPath);\n }\n });\n return new FieldMask(fields);\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { debugAssert, fail } from '../util/assert';\n\nimport { DocumentKey } from './document_key';\nimport { ObjectValue } from './object_value';\nimport { FieldPath } from './path';\nimport { valueCompare } from './values';\n\n/**\n * Whether the document represents an existing document, a document that is\n * known to exist or a document whose state or existence is unknown.\n */\nconst enum DocumentType {\n /**\n * Represents the initial state of a MutableDocument when only the document\n * key is known. Invalid documents transition to other states as mutations are\n * applied. If a document remains invalid after applying mutations, it should\n * be discarded.\n *\n * Invalid documents can have neither local nor committed mutations.\n */\n INVALID,\n /**\n * Represents a document in Firestore with a key, version, data and whether\n * the data has local mutations applied to it.\n *\n * Found documents can be sycned or have or committed mutations applied.\n */\n FOUND_DOCUMENT,\n /**\n * Represents that no documents exists for the key at the given version.\n *\n * Documents that are deleted based on a local mutation do not raise snapshots\n * with `hasPendingWrites`. As such, deleted documents never have\n * `HAS_LOCAL_MUTATIONS` set. Once a delete is committed, we store them with\n * `HAS_COMMITTED_MUTATIONS` until we received the delete from the Watch\n * stream.\n */\n NO_DOCUMENT,\n /**\n * Represents an existing document whose data is unknown (e.g. a document that\n * was updated without a known base document).\n *\n * An unknown document always has `HAS_COMMITTED_MUTATIONS` set, since unknown\n * documents can only be generated by applying a patch mutation from a write\n * acknowledgement.\n */\n UNKNOWN_DOCUMENT\n}\n\n/** Describes whether a document has latency-compensated edits applied. */\nconst enum DocumentState {\n /** No mutations applied. Document was sent to us by Watch. */\n SYNCED,\n /**\n * Local mutations applied via the mutation queue. Document is potentially\n * inconsistent.\n */\n HAS_LOCAL_MUTATIONS,\n /**\n * Mutations applied based on a write acknowledgment. Document is potentially\n * inconsistent.\n */\n HAS_COMMITTED_MUTATIONS\n}\n\n/**\n * Represents a document in Firestore with a key, version, data and whether the\n * data has local mutations applied to it.\n */\nexport interface Document {\n /** The key for this document */\n readonly key: DocumentKey;\n\n /**\n * The version of this document if it exists or a version at which this\n * document was guaranteed to not exist.\n */\n readonly version: SnapshotVersion;\n\n /** The underlying data of this document or an empty value if no data exists. */\n readonly data: ObjectValue;\n\n /** Returns whether local mutations were applied via the mutation queue. */\n readonly hasLocalMutations: boolean;\n\n /** Returns whether mutations were applied based on a write acknowledgment. */\n readonly hasCommittedMutations: boolean;\n\n /**\n * Whether this document had a local mutation applied that has not yet been\n * acknowledged by Watch.\n */\n readonly hasPendingWrites: boolean;\n\n /**\n * Returns whether this document is valid (i.e. it is an entry in the\n * RemoteDocumentCache, was created by a mutation or read from the backend).\n */\n isValidDocument(): boolean;\n\n /**\n * Returns whether the document exists and its data is known at the current\n * version.\n */\n isFoundDocument(): boolean;\n\n /**\n * Returns whether the document is known to not exist at the current version.\n */\n isNoDocument(): boolean;\n\n /**\n * Returns whether the document exists and its data is unknown at the current\n * version.\n */\n isUnknownDocument(): boolean;\n\n isEqual(other: Document | null | undefined): boolean;\n\n toString(): string;\n}\n\n/**\n * Represents a document in Firestore with a key, version, data and whether it\n * has local mutations applied to it.\n *\n * Documents can transition between states via `convertToFoundDocument()`,\n * `convertToNoDocument()` and `convertToUnknownDocument()`. If a document does\n * not transition to one of these states even after all mutations have been\n * applied, `isValidDocument()` returns false and the document should be removed\n * from all views.\n */\nexport class MutableDocument implements Document {\n private constructor(\n readonly key: DocumentKey,\n private documentType: DocumentType,\n public version: SnapshotVersion,\n public data: ObjectValue,\n private documentState: DocumentState\n ) {}\n\n /**\n * Creates a document with no known version or data, but which can serve as\n * base document for mutations.\n */\n static newInvalidDocument(documentKey: DocumentKey): MutableDocument {\n return new MutableDocument(\n documentKey,\n DocumentType.INVALID,\n SnapshotVersion.min(),\n ObjectValue.empty(),\n DocumentState.SYNCED\n );\n }\n\n /**\n * Creates a new document that is known to exist with the given data at the\n * given version.\n */\n static newFoundDocument(\n documentKey: DocumentKey,\n version: SnapshotVersion,\n value: ObjectValue\n ): MutableDocument {\n return new MutableDocument(\n documentKey,\n DocumentType.FOUND_DOCUMENT,\n version,\n value,\n DocumentState.SYNCED\n );\n }\n\n /** Creates a new document that is known to not exist at the given version. */\n static newNoDocument(\n documentKey: DocumentKey,\n version: SnapshotVersion\n ): MutableDocument {\n return new MutableDocument(\n documentKey,\n DocumentType.NO_DOCUMENT,\n version,\n ObjectValue.empty(),\n DocumentState.SYNCED\n );\n }\n\n /**\n * Creates a new document that is known to exist at the given version but\n * whose data is not known (e.g. a document that was updated without a known\n * base document).\n */\n static newUnknownDocument(\n documentKey: DocumentKey,\n version: SnapshotVersion\n ): MutableDocument {\n return new MutableDocument(\n documentKey,\n DocumentType.UNKNOWN_DOCUMENT,\n version,\n ObjectValue.empty(),\n DocumentState.HAS_COMMITTED_MUTATIONS\n );\n }\n\n /**\n * Changes the document type to indicate that it exists and that its version\n * and data are known.\n */\n convertToFoundDocument(\n version: SnapshotVersion,\n value: ObjectValue\n ): MutableDocument {\n this.version = version;\n this.documentType = DocumentType.FOUND_DOCUMENT;\n this.data = value;\n this.documentState = DocumentState.SYNCED;\n return this;\n }\n\n /**\n * Changes the document type to indicate that it doesn't exist at the given\n * version.\n */\n convertToNoDocument(version: SnapshotVersion): MutableDocument {\n this.version = version;\n this.documentType = DocumentType.NO_DOCUMENT;\n this.data = ObjectValue.empty();\n this.documentState = DocumentState.SYNCED;\n return this;\n }\n\n /**\n * Changes the document type to indicate that it exists at a given version but\n * that its data is not known (e.g. a document that was updated without a known\n * base document).\n */\n convertToUnknownDocument(version: SnapshotVersion): MutableDocument {\n this.version = version;\n this.documentType = DocumentType.UNKNOWN_DOCUMENT;\n this.data = ObjectValue.empty();\n this.documentState = DocumentState.HAS_COMMITTED_MUTATIONS;\n return this;\n }\n\n setHasCommittedMutations(): MutableDocument {\n debugAssert(\n this.isValidDocument(),\n 'Invalid documents cannot have committed mutations'\n );\n this.documentState = DocumentState.HAS_COMMITTED_MUTATIONS;\n return this;\n }\n\n setHasLocalMutations(): MutableDocument {\n debugAssert(\n this.isFoundDocument(),\n 'Only found documents can have local mutations'\n );\n this.documentState = DocumentState.HAS_LOCAL_MUTATIONS;\n return this;\n }\n\n get hasLocalMutations(): boolean {\n return this.documentState === DocumentState.HAS_LOCAL_MUTATIONS;\n }\n\n get hasCommittedMutations(): boolean {\n return this.documentState === DocumentState.HAS_COMMITTED_MUTATIONS;\n }\n\n get hasPendingWrites(): boolean {\n return this.hasLocalMutations || this.hasCommittedMutations;\n }\n\n isValidDocument(): boolean {\n return this.documentType !== DocumentType.INVALID;\n }\n\n isFoundDocument(): boolean {\n return this.documentType === DocumentType.FOUND_DOCUMENT;\n }\n\n isNoDocument(): boolean {\n return this.documentType === DocumentType.NO_DOCUMENT;\n }\n\n isUnknownDocument(): boolean {\n return this.documentType === DocumentType.UNKNOWN_DOCUMENT;\n }\n\n isEqual(other: Document | null | undefined): boolean {\n return (\n other instanceof MutableDocument &&\n this.key.isEqual(other.key) &&\n this.version.isEqual(other.version) &&\n this.documentType === other.documentType &&\n this.documentState === other.documentState &&\n this.data.isEqual(other.data)\n );\n }\n\n clone(): MutableDocument {\n return new MutableDocument(\n this.key,\n this.documentType,\n this.version,\n this.data.clone(),\n this.documentState\n );\n }\n\n toString(): string {\n return (\n `Document(${this.key}, ${this.version}, ${JSON.stringify(\n this.data.value\n )}, ` +\n `{documentType: ${this.documentType}}), ` +\n `{documentState: ${this.documentState}})`\n );\n }\n}\n\n/**\n * Compares the value for field `field` in the provided documents. Throws if\n * the field does not exist in both documents.\n */\nexport function compareDocumentsByField(\n field: FieldPath,\n d1: Document,\n d2: Document\n): number {\n const v1 = d1.data.field(field);\n const v2 = d2.data.field(field);\n if (v1 !== null && v2 !== null) {\n return valueCompare(v1, v2);\n } else {\n return fail(\"Trying to compare documents on fields that don't exist\");\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldPath, ResourcePath } from '../model/path';\nimport {\n arrayValueContains,\n canonicalId,\n isArray,\n isReferenceValue,\n typeOrder,\n valueCompare,\n valueEquals\n} from '../model/values';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { debugAssert, debugCast, fail } from '../util/assert';\nimport { isNullOrUndefined } from '../util/types';\n\n/**\n * A Target represents the WatchTarget representation of a Query, which is used\n * by the LocalStore and the RemoteStore to keep track of and to execute\n * backend queries. While a Query can represent multiple Targets, each Targets\n * maps to a single WatchTarget in RemoteStore and a single TargetData entry\n * in persistence.\n */\nexport interface Target {\n readonly path: ResourcePath;\n readonly collectionGroup: string | null;\n readonly orderBy: OrderBy[];\n readonly filters: Filter[];\n readonly limit: number | null;\n readonly startAt: Bound | null;\n readonly endAt: Bound | null;\n}\n\n// Visible for testing\nexport class TargetImpl implements Target {\n memoizedCanonicalId: string | null = null;\n constructor(\n readonly path: ResourcePath,\n readonly collectionGroup: string | null = null,\n readonly orderBy: OrderBy[] = [],\n readonly filters: Filter[] = [],\n readonly limit: number | null = null,\n readonly startAt: Bound | null = null,\n readonly endAt: Bound | null = null\n ) {}\n}\n\n/**\n * Initializes a Target with a path and optional additional query constraints.\n * Path must currently be empty if this is a collection group query.\n *\n * NOTE: you should always construct `Target` from `Query.toTarget` instead of\n * using this factory method, because `Query` provides an implicit `orderBy`\n * property.\n */\nexport function newTarget(\n path: ResourcePath,\n collectionGroup: string | null = null,\n orderBy: OrderBy[] = [],\n filters: Filter[] = [],\n limit: number | null = null,\n startAt: Bound | null = null,\n endAt: Bound | null = null\n): Target {\n return new TargetImpl(\n path,\n collectionGroup,\n orderBy,\n filters,\n limit,\n startAt,\n endAt\n );\n}\n\nexport function canonifyTarget(target: Target): string {\n const targetImpl = debugCast(target, TargetImpl);\n\n if (targetImpl.memoizedCanonicalId === null) {\n let canonicalId = targetImpl.path.canonicalString();\n if (targetImpl.collectionGroup !== null) {\n canonicalId += '|cg:' + targetImpl.collectionGroup;\n }\n canonicalId += '|f:';\n canonicalId += targetImpl.filters.map(f => canonifyFilter(f)).join(',');\n canonicalId += '|ob:';\n canonicalId += targetImpl.orderBy.map(o => canonifyOrderBy(o)).join(',');\n\n if (!isNullOrUndefined(targetImpl.limit)) {\n canonicalId += '|l:';\n canonicalId += targetImpl.limit!;\n }\n if (targetImpl.startAt) {\n canonicalId += '|lb:';\n canonicalId += canonifyBound(targetImpl.startAt);\n }\n if (targetImpl.endAt) {\n canonicalId += '|ub:';\n canonicalId += canonifyBound(targetImpl.endAt);\n }\n targetImpl.memoizedCanonicalId = canonicalId;\n }\n return targetImpl.memoizedCanonicalId;\n}\n\nexport function stringifyTarget(target: Target): string {\n let str = target.path.canonicalString();\n if (target.collectionGroup !== null) {\n str += ' collectionGroup=' + target.collectionGroup;\n }\n if (target.filters.length > 0) {\n str += `, filters: [${target.filters\n .map(f => stringifyFilter(f))\n .join(', ')}]`;\n }\n if (!isNullOrUndefined(target.limit)) {\n str += ', limit: ' + target.limit;\n }\n if (target.orderBy.length > 0) {\n str += `, orderBy: [${target.orderBy\n .map(o => stringifyOrderBy(o))\n .join(', ')}]`;\n }\n if (target.startAt) {\n str += ', startAt: ' + canonifyBound(target.startAt);\n }\n if (target.endAt) {\n str += ', endAt: ' + canonifyBound(target.endAt);\n }\n return `Target(${str})`;\n}\n\nexport function targetEquals(left: Target, right: Target): boolean {\n if (left.limit !== right.limit) {\n return false;\n }\n\n if (left.orderBy.length !== right.orderBy.length) {\n return false;\n }\n\n for (let i = 0; i < left.orderBy.length; i++) {\n if (!orderByEquals(left.orderBy[i], right.orderBy[i])) {\n return false;\n }\n }\n\n if (left.filters.length !== right.filters.length) {\n return false;\n }\n\n for (let i = 0; i < left.filters.length; i++) {\n if (!filterEquals(left.filters[i], right.filters[i])) {\n return false;\n }\n }\n\n if (left.collectionGroup !== right.collectionGroup) {\n return false;\n }\n\n if (!left.path.isEqual(right.path)) {\n return false;\n }\n\n if (!boundEquals(left.startAt, right.startAt)) {\n return false;\n }\n\n return boundEquals(left.endAt, right.endAt);\n}\n\nexport function isDocumentTarget(target: Target): boolean {\n return (\n DocumentKey.isDocumentKey(target.path) &&\n target.collectionGroup === null &&\n target.filters.length === 0\n );\n}\n\nexport abstract class Filter {\n abstract matches(doc: Document): boolean;\n}\n\nexport const enum Operator {\n LESS_THAN = '<',\n LESS_THAN_OR_EQUAL = '<=',\n EQUAL = '==',\n NOT_EQUAL = '!=',\n GREATER_THAN = '>',\n GREATER_THAN_OR_EQUAL = '>=',\n ARRAY_CONTAINS = 'array-contains',\n IN = 'in',\n NOT_IN = 'not-in',\n ARRAY_CONTAINS_ANY = 'array-contains-any'\n}\n\n/**\n * The direction of sorting in an order by.\n */\nexport const enum Direction {\n ASCENDING = 'asc',\n DESCENDING = 'desc'\n}\n\nexport class FieldFilter extends Filter {\n protected constructor(\n public field: FieldPath,\n public op: Operator,\n public value: ProtoValue\n ) {\n super();\n }\n\n /**\n * Creates a filter based on the provided arguments.\n */\n static create(\n field: FieldPath,\n op: Operator,\n value: ProtoValue\n ): FieldFilter {\n if (field.isKeyField()) {\n if (op === Operator.IN || op === Operator.NOT_IN) {\n return this.createKeyFieldInFilter(field, op, value);\n } else {\n debugAssert(\n isReferenceValue(value),\n 'Comparing on key, but filter value not a RefValue'\n );\n debugAssert(\n op !== Operator.ARRAY_CONTAINS && op !== Operator.ARRAY_CONTAINS_ANY,\n `'${op.toString()}' queries don't make sense on document keys.`\n );\n return new KeyFieldFilter(field, op, value);\n }\n } else if (op === Operator.ARRAY_CONTAINS) {\n return new ArrayContainsFilter(field, value);\n } else if (op === Operator.IN) {\n debugAssert(\n isArray(value),\n 'IN filter has invalid value: ' + value.toString()\n );\n return new InFilter(field, value);\n } else if (op === Operator.NOT_IN) {\n debugAssert(\n isArray(value),\n 'NOT_IN filter has invalid value: ' + value.toString()\n );\n return new NotInFilter(field, value);\n } else if (op === Operator.ARRAY_CONTAINS_ANY) {\n debugAssert(\n isArray(value),\n 'ARRAY_CONTAINS_ANY filter has invalid value: ' + value.toString()\n );\n return new ArrayContainsAnyFilter(field, value);\n } else {\n return new FieldFilter(field, op, value);\n }\n }\n\n private static createKeyFieldInFilter(\n field: FieldPath,\n op: Operator.IN | Operator.NOT_IN,\n value: ProtoValue\n ): FieldFilter {\n debugAssert(\n isArray(value),\n `Comparing on key with ${op.toString()}` +\n ', but filter value not an ArrayValue'\n );\n debugAssert(\n (value.arrayValue.values || []).every(elem => isReferenceValue(elem)),\n `Comparing on key with ${op.toString()}` +\n ', but an array value was not a RefValue'\n );\n\n return op === Operator.IN\n ? new KeyFieldInFilter(field, value)\n : new KeyFieldNotInFilter(field, value);\n }\n\n matches(doc: Document): boolean {\n const other = doc.data.field(this.field);\n // Types do not have to match in NOT_EQUAL filters.\n if (this.op === Operator.NOT_EQUAL) {\n return (\n other !== null &&\n this.matchesComparison(valueCompare(other!, this.value))\n );\n }\n\n // Only compare types with matching backend order (such as double and int).\n return (\n other !== null &&\n typeOrder(this.value) === typeOrder(other) &&\n this.matchesComparison(valueCompare(other, this.value))\n );\n }\n\n protected matchesComparison(comparison: number): boolean {\n switch (this.op) {\n case Operator.LESS_THAN:\n return comparison < 0;\n case Operator.LESS_THAN_OR_EQUAL:\n return comparison <= 0;\n case Operator.EQUAL:\n return comparison === 0;\n case Operator.NOT_EQUAL:\n return comparison !== 0;\n case Operator.GREATER_THAN:\n return comparison > 0;\n case Operator.GREATER_THAN_OR_EQUAL:\n return comparison >= 0;\n default:\n return fail('Unknown FieldFilter operator: ' + this.op);\n }\n }\n\n isInequality(): boolean {\n return (\n [\n Operator.LESS_THAN,\n Operator.LESS_THAN_OR_EQUAL,\n Operator.GREATER_THAN,\n Operator.GREATER_THAN_OR_EQUAL,\n Operator.NOT_EQUAL,\n Operator.NOT_IN\n ].indexOf(this.op) >= 0\n );\n }\n}\n\nexport function canonifyFilter(filter: Filter): string {\n debugAssert(\n filter instanceof FieldFilter,\n 'canonifyFilter() only supports FieldFilters'\n );\n // TODO(b/29183165): Technically, this won't be unique if two values have\n // the same description, such as the int 3 and the string \"3\". So we should\n // add the types in here somehow, too.\n return (\n filter.field.canonicalString() +\n filter.op.toString() +\n canonicalId(filter.value)\n );\n}\n\nexport function filterEquals(f1: Filter, f2: Filter): boolean {\n debugAssert(\n f1 instanceof FieldFilter && f2 instanceof FieldFilter,\n 'Only FieldFilters can be compared'\n );\n\n return (\n f1.op === f2.op &&\n f1.field.isEqual(f2.field) &&\n valueEquals(f1.value, f2.value)\n );\n}\n\n/** Returns a debug description for `filter`. */\nexport function stringifyFilter(filter: Filter): string {\n debugAssert(\n filter instanceof FieldFilter,\n 'stringifyFilter() only supports FieldFilters'\n );\n return `${filter.field.canonicalString()} ${filter.op} ${canonicalId(\n filter.value\n )}`;\n}\n\n/** Filter that matches on key fields (i.e. '__name__'). */\nexport class KeyFieldFilter extends FieldFilter {\n private readonly key: DocumentKey;\n\n constructor(field: FieldPath, op: Operator, value: ProtoValue) {\n super(field, op, value);\n debugAssert(\n isReferenceValue(value),\n 'KeyFieldFilter expects a ReferenceValue'\n );\n this.key = DocumentKey.fromName(value.referenceValue);\n }\n\n matches(doc: Document): boolean {\n const comparison = DocumentKey.comparator(doc.key, this.key);\n return this.matchesComparison(comparison);\n }\n}\n\n/** Filter that matches on key fields within an array. */\nexport class KeyFieldInFilter extends FieldFilter {\n private readonly keys: DocumentKey[];\n\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.IN, value);\n this.keys = extractDocumentKeysFromArrayValue(Operator.IN, value);\n }\n\n matches(doc: Document): boolean {\n return this.keys.some(key => key.isEqual(doc.key));\n }\n}\n\n/** Filter that matches on key fields not present within an array. */\nexport class KeyFieldNotInFilter extends FieldFilter {\n private readonly keys: DocumentKey[];\n\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.NOT_IN, value);\n this.keys = extractDocumentKeysFromArrayValue(Operator.NOT_IN, value);\n }\n\n matches(doc: Document): boolean {\n return !this.keys.some(key => key.isEqual(doc.key));\n }\n}\n\nfunction extractDocumentKeysFromArrayValue(\n op: Operator.IN | Operator.NOT_IN,\n value: ProtoValue\n): DocumentKey[] {\n debugAssert(\n isArray(value),\n 'KeyFieldInFilter/KeyFieldNotInFilter expects an ArrayValue'\n );\n return (value.arrayValue?.values || []).map(v => {\n debugAssert(\n isReferenceValue(v),\n `Comparing on key with ${op.toString()}, but an array value was not ` +\n `a ReferenceValue`\n );\n return DocumentKey.fromName(v.referenceValue);\n });\n}\n\n/** A Filter that implements the array-contains operator. */\nexport class ArrayContainsFilter extends FieldFilter {\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.ARRAY_CONTAINS, value);\n }\n\n matches(doc: Document): boolean {\n const other = doc.data.field(this.field);\n return isArray(other) && arrayValueContains(other.arrayValue, this.value);\n }\n}\n\n/** A Filter that implements the IN operator. */\nexport class InFilter extends FieldFilter {\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.IN, value);\n debugAssert(isArray(value), 'InFilter expects an ArrayValue');\n }\n\n matches(doc: Document): boolean {\n const other = doc.data.field(this.field);\n return other !== null && arrayValueContains(this.value.arrayValue!, other);\n }\n}\n\n/** A Filter that implements the not-in operator. */\nexport class NotInFilter extends FieldFilter {\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.NOT_IN, value);\n debugAssert(isArray(value), 'NotInFilter expects an ArrayValue');\n }\n\n matches(doc: Document): boolean {\n if (\n arrayValueContains(this.value.arrayValue!, { nullValue: 'NULL_VALUE' })\n ) {\n return false;\n }\n const other = doc.data.field(this.field);\n return other !== null && !arrayValueContains(this.value.arrayValue!, other);\n }\n}\n\n/** A Filter that implements the array-contains-any operator. */\nexport class ArrayContainsAnyFilter extends FieldFilter {\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.ARRAY_CONTAINS_ANY, value);\n debugAssert(isArray(value), 'ArrayContainsAnyFilter expects an ArrayValue');\n }\n\n matches(doc: Document): boolean {\n const other = doc.data.field(this.field);\n if (!isArray(other) || !other.arrayValue.values) {\n return false;\n }\n return other.arrayValue.values.some(val =>\n arrayValueContains(this.value.arrayValue!, val)\n );\n }\n}\n\n/**\n * Represents a bound of a query.\n *\n * The bound is specified with the given components representing a position and\n * whether it's just before or just after the position (relative to whatever the\n * query order is).\n *\n * The position represents a logical index position for a query. It's a prefix\n * of values for the (potentially implicit) order by clauses of a query.\n *\n * Bound provides a function to determine whether a document comes before or\n * after a bound. This is influenced by whether the position is just before or\n * just after the provided values.\n */\nexport class Bound {\n constructor(readonly position: ProtoValue[], readonly before: boolean) {}\n}\n\nexport function canonifyBound(bound: Bound): string {\n // TODO(b/29183165): Make this collision robust.\n return `${bound.before ? 'b' : 'a'}:${bound.position\n .map(p => canonicalId(p))\n .join(',')}`;\n}\n\n/**\n * An ordering on a field, in some Direction. Direction defaults to ASCENDING.\n */\nexport class OrderBy {\n constructor(\n readonly field: FieldPath,\n readonly dir: Direction = Direction.ASCENDING\n ) {}\n}\n\nexport function canonifyOrderBy(orderBy: OrderBy): string {\n // TODO(b/29183165): Make this collision robust.\n return orderBy.field.canonicalString() + orderBy.dir;\n}\n\nexport function stringifyOrderBy(orderBy: OrderBy): string {\n return `${orderBy.field.canonicalString()} (${orderBy.dir})`;\n}\n\nexport function orderByEquals(left: OrderBy, right: OrderBy): boolean {\n return left.dir === right.dir && left.field.isEqual(right.field);\n}\n\n/**\n * Returns true if a document sorts before a bound using the provided sort\n * order.\n */\nexport function sortsBeforeDocument(\n bound: Bound,\n orderBy: OrderBy[],\n doc: Document\n): boolean {\n debugAssert(\n bound.position.length <= orderBy.length,\n \"Bound has more components than query's orderBy\"\n );\n let comparison = 0;\n for (let i = 0; i < bound.position.length; i++) {\n const orderByComponent = orderBy[i];\n const component = bound.position[i];\n if (orderByComponent.field.isKeyField()) {\n debugAssert(\n isReferenceValue(component),\n 'Bound has a non-key value where the key path is being used.'\n );\n comparison = DocumentKey.comparator(\n DocumentKey.fromName(component.referenceValue),\n doc.key\n );\n } else {\n const docValue = doc.data.field(orderByComponent.field);\n debugAssert(\n docValue !== null,\n 'Field should exist since document matched the orderBy already.'\n );\n comparison = valueCompare(component, docValue);\n }\n if (orderByComponent.dir === Direction.DESCENDING) {\n comparison = comparison * -1;\n }\n if (comparison !== 0) {\n break;\n }\n }\n return bound.before ? comparison <= 0 : comparison < 0;\n}\n\nexport function boundEquals(left: Bound | null, right: Bound | null): boolean {\n if (left === null) {\n return right === null;\n } else if (right === null) {\n return false;\n }\n\n if (\n left.before !== right.before ||\n left.position.length !== right.position.length\n ) {\n return false;\n }\n for (let i = 0; i < left.position.length; i++) {\n const leftPosition = left.position[i];\n const rightPosition = right.position[i];\n if (!valueEquals(leftPosition, rightPosition)) {\n return false;\n }\n }\n return true;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { compareDocumentsByField, Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldPath, ResourcePath } from '../model/path';\nimport { debugAssert, debugCast, fail } from '../util/assert';\nimport { isNullOrUndefined } from '../util/types';\n\nimport {\n Bound,\n canonifyTarget,\n Direction,\n FieldFilter,\n Filter,\n newTarget,\n Operator,\n OrderBy,\n sortsBeforeDocument,\n stringifyTarget,\n Target,\n targetEquals\n} from './target';\n\nexport const enum LimitType {\n First = 'F',\n Last = 'L'\n}\n\n/**\n * The Query interface defines all external properties of a query.\n *\n * QueryImpl implements this interface to provide memoization for `queryOrderBy`\n * and `queryToTarget`.\n */\nexport interface Query {\n readonly path: ResourcePath;\n readonly collectionGroup: string | null;\n readonly explicitOrderBy: OrderBy[];\n readonly filters: Filter[];\n readonly limit: number | null;\n readonly limitType: LimitType;\n readonly startAt: Bound | null;\n readonly endAt: Bound | null;\n}\n\n/**\n * Query encapsulates all the query attributes we support in the SDK. It can\n * be run against the LocalStore, as well as be converted to a `Target` to\n * query the RemoteStore results.\n *\n * Visible for testing.\n */\nexport class QueryImpl implements Query {\n memoizedOrderBy: OrderBy[] | null = null;\n\n // The corresponding `Target` of this `Query` instance.\n memoizedTarget: Target | null = null;\n\n /**\n * Initializes a Query with a path and optional additional query constraints.\n * Path must currently be empty if this is a collection group query.\n */\n constructor(\n readonly path: ResourcePath,\n readonly collectionGroup: string | null = null,\n readonly explicitOrderBy: OrderBy[] = [],\n readonly filters: Filter[] = [],\n readonly limit: number | null = null,\n readonly limitType: LimitType = LimitType.First,\n readonly startAt: Bound | null = null,\n readonly endAt: Bound | null = null\n ) {\n if (this.startAt) {\n debugAssert(\n this.startAt.position.length <= queryOrderBy(this).length,\n 'Bound is longer than orderBy'\n );\n }\n if (this.endAt) {\n debugAssert(\n this.endAt.position.length <= queryOrderBy(this).length,\n 'Bound is longer than orderBy'\n );\n }\n }\n}\n\n/** Creates a new Query instance with the options provided. */\nexport function newQuery(\n path: ResourcePath,\n collectionGroup: string | null,\n explicitOrderBy: OrderBy[],\n filters: Filter[],\n limit: number | null,\n limitType: LimitType,\n startAt: Bound | null,\n endAt: Bound | null\n): Query {\n return new QueryImpl(\n path,\n collectionGroup,\n explicitOrderBy,\n filters,\n limit,\n limitType,\n startAt,\n endAt\n );\n}\n\n/** Creates a new Query for a query that matches all documents at `path` */\nexport function newQueryForPath(path: ResourcePath): Query {\n return new QueryImpl(path);\n}\n\n/**\n * Helper to convert a collection group query into a collection query at a\n * specific path. This is used when executing collection group queries, since\n * we have to split the query into a set of collection queries at multiple\n * paths.\n */\nexport function asCollectionQueryAtPath(\n query: Query,\n path: ResourcePath\n): Query {\n return new QueryImpl(\n path,\n /*collectionGroup=*/ null,\n query.explicitOrderBy.slice(),\n query.filters.slice(),\n query.limit,\n query.limitType,\n query.startAt,\n query.endAt\n );\n}\n\n/**\n * Returns true if this query does not specify any query constraints that\n * could remove results.\n */\nexport function matchesAllDocuments(query: Query): boolean {\n return (\n query.filters.length === 0 &&\n query.limit === null &&\n query.startAt == null &&\n query.endAt == null &&\n (query.explicitOrderBy.length === 0 ||\n (query.explicitOrderBy.length === 1 &&\n query.explicitOrderBy[0].field.isKeyField()))\n );\n}\n\nexport function hasLimitToFirst(query: Query): boolean {\n return !isNullOrUndefined(query.limit) && query.limitType === LimitType.First;\n}\n\nexport function hasLimitToLast(query: Query): boolean {\n return !isNullOrUndefined(query.limit) && query.limitType === LimitType.Last;\n}\n\nexport function getFirstOrderByField(query: Query): FieldPath | null {\n return query.explicitOrderBy.length > 0\n ? query.explicitOrderBy[0].field\n : null;\n}\n\nexport function getInequalityFilterField(query: Query): FieldPath | null {\n for (const filter of query.filters) {\n debugAssert(\n filter instanceof FieldFilter,\n 'Only FieldFilters are supported'\n );\n if (filter.isInequality()) {\n return filter.field;\n }\n }\n return null;\n}\n\n/**\n * Checks if any of the provided Operators are included in the query and\n * returns the first one that is, or null if none are.\n */\nexport function findFilterOperator(\n query: Query,\n operators: Operator[]\n): Operator | null {\n for (const filter of query.filters) {\n debugAssert(\n filter instanceof FieldFilter,\n 'Only FieldFilters are supported'\n );\n if (operators.indexOf(filter.op) >= 0) {\n return filter.op;\n }\n }\n return null;\n}\n\n/**\n * Creates a new Query for a collection group query that matches all documents\n * within the provided collection group.\n */\nexport function newQueryForCollectionGroup(collectionId: string): Query {\n return new QueryImpl(ResourcePath.emptyPath(), collectionId);\n}\n\n/**\n * Returns whether the query matches a single document by path (rather than a\n * collection).\n */\nexport function isDocumentQuery(query: Query): boolean {\n return (\n DocumentKey.isDocumentKey(query.path) &&\n query.collectionGroup === null &&\n query.filters.length === 0\n );\n}\n\n/**\n * Returns whether the query matches a collection group rather than a specific\n * collection.\n */\nexport function isCollectionGroupQuery(query: Query): boolean {\n return query.collectionGroup !== null;\n}\n\n/**\n * Returns the implicit order by constraint that is used to execute the Query,\n * which can be different from the order by constraints the user provided (e.g.\n * the SDK and backend always orders by `__name__`).\n */\nexport function queryOrderBy(query: Query): OrderBy[] {\n const queryImpl = debugCast(query, QueryImpl);\n if (queryImpl.memoizedOrderBy === null) {\n queryImpl.memoizedOrderBy = [];\n\n const inequalityField = getInequalityFilterField(queryImpl);\n const firstOrderByField = getFirstOrderByField(queryImpl);\n if (inequalityField !== null && firstOrderByField === null) {\n // In order to implicitly add key ordering, we must also add the\n // inequality filter field for it to be a valid query.\n // Note that the default inequality field and key ordering is ascending.\n if (!inequalityField.isKeyField()) {\n queryImpl.memoizedOrderBy.push(new OrderBy(inequalityField));\n }\n queryImpl.memoizedOrderBy.push(\n new OrderBy(FieldPath.keyField(), Direction.ASCENDING)\n );\n } else {\n debugAssert(\n inequalityField === null ||\n (firstOrderByField !== null &&\n inequalityField.isEqual(firstOrderByField)),\n 'First orderBy should match inequality field.'\n );\n let foundKeyOrdering = false;\n for (const orderBy of queryImpl.explicitOrderBy) {\n queryImpl.memoizedOrderBy.push(orderBy);\n if (orderBy.field.isKeyField()) {\n foundKeyOrdering = true;\n }\n }\n if (!foundKeyOrdering) {\n // The order of the implicit key ordering always matches the last\n // explicit order by\n const lastDirection =\n queryImpl.explicitOrderBy.length > 0\n ? queryImpl.explicitOrderBy[queryImpl.explicitOrderBy.length - 1]\n .dir\n : Direction.ASCENDING;\n queryImpl.memoizedOrderBy.push(\n new OrderBy(FieldPath.keyField(), lastDirection)\n );\n }\n }\n }\n return queryImpl.memoizedOrderBy;\n}\n\n/**\n * Converts this `Query` instance to it's corresponding `Target` representation.\n */\nexport function queryToTarget(query: Query): Target {\n const queryImpl = debugCast(query, QueryImpl);\n if (!queryImpl.memoizedTarget) {\n if (queryImpl.limitType === LimitType.First) {\n queryImpl.memoizedTarget = newTarget(\n queryImpl.path,\n queryImpl.collectionGroup,\n queryOrderBy(queryImpl),\n queryImpl.filters,\n queryImpl.limit,\n queryImpl.startAt,\n queryImpl.endAt\n );\n } else {\n // Flip the orderBy directions since we want the last results\n const orderBys = [] as OrderBy[];\n for (const orderBy of queryOrderBy(queryImpl)) {\n const dir =\n orderBy.dir === Direction.DESCENDING\n ? Direction.ASCENDING\n : Direction.DESCENDING;\n orderBys.push(new OrderBy(orderBy.field, dir));\n }\n\n // We need to swap the cursors to match the now-flipped query ordering.\n const startAt = queryImpl.endAt\n ? new Bound(queryImpl.endAt.position, !queryImpl.endAt.before)\n : null;\n const endAt = queryImpl.startAt\n ? new Bound(queryImpl.startAt.position, !queryImpl.startAt.before)\n : null;\n\n // Now return as a LimitType.First query.\n queryImpl.memoizedTarget = newTarget(\n queryImpl.path,\n queryImpl.collectionGroup,\n orderBys,\n queryImpl.filters,\n queryImpl.limit,\n startAt,\n endAt\n );\n }\n }\n return queryImpl.memoizedTarget!;\n}\n\nexport function queryWithAddedFilter(query: Query, filter: Filter): Query {\n debugAssert(\n getInequalityFilterField(query) == null ||\n !(filter instanceof FieldFilter) ||\n !filter.isInequality() ||\n filter.field.isEqual(getInequalityFilterField(query)!),\n 'Query must only have one inequality field.'\n );\n\n debugAssert(\n !isDocumentQuery(query),\n 'No filtering allowed for document query'\n );\n\n const newFilters = query.filters.concat([filter]);\n return new QueryImpl(\n query.path,\n query.collectionGroup,\n query.explicitOrderBy.slice(),\n newFilters,\n query.limit,\n query.limitType,\n query.startAt,\n query.endAt\n );\n}\n\nexport function queryWithAddedOrderBy(query: Query, orderBy: OrderBy): Query {\n debugAssert(\n !query.startAt && !query.endAt,\n 'Bounds must be set after orderBy'\n );\n // TODO(dimond): validate that orderBy does not list the same key twice.\n const newOrderBy = query.explicitOrderBy.concat([orderBy]);\n return new QueryImpl(\n query.path,\n query.collectionGroup,\n newOrderBy,\n query.filters.slice(),\n query.limit,\n query.limitType,\n query.startAt,\n query.endAt\n );\n}\n\nexport function queryWithLimit(\n query: Query,\n limit: number,\n limitType: LimitType\n): Query {\n return new QueryImpl(\n query.path,\n query.collectionGroup,\n query.explicitOrderBy.slice(),\n query.filters.slice(),\n limit,\n limitType,\n query.startAt,\n query.endAt\n );\n}\n\nexport function queryWithStartAt(query: Query, bound: Bound): Query {\n return new QueryImpl(\n query.path,\n query.collectionGroup,\n query.explicitOrderBy.slice(),\n query.filters.slice(),\n query.limit,\n query.limitType,\n bound,\n query.endAt\n );\n}\n\nexport function queryWithEndAt(query: Query, bound: Bound): Query {\n return new QueryImpl(\n query.path,\n query.collectionGroup,\n query.explicitOrderBy.slice(),\n query.filters.slice(),\n query.limit,\n query.limitType,\n query.startAt,\n bound\n );\n}\n\nexport function queryEquals(left: Query, right: Query): boolean {\n return (\n targetEquals(queryToTarget(left), queryToTarget(right)) &&\n left.limitType === right.limitType\n );\n}\n\n// TODO(b/29183165): This is used to get a unique string from a query to, for\n// example, use as a dictionary key, but the implementation is subject to\n// collisions. Make it collision-free.\nexport function canonifyQuery(query: Query): string {\n return `${canonifyTarget(queryToTarget(query))}|lt:${query.limitType}`;\n}\n\nexport function stringifyQuery(query: Query): string {\n return `Query(target=${stringifyTarget(queryToTarget(query))}; limitType=${\n query.limitType\n })`;\n}\n\n/** Returns whether `doc` matches the constraints of `query`. */\nexport function queryMatches(query: Query, doc: Document): boolean {\n return (\n doc.isFoundDocument() &&\n queryMatchesPathAndCollectionGroup(query, doc) &&\n queryMatchesOrderBy(query, doc) &&\n queryMatchesFilters(query, doc) &&\n queryMatchesBounds(query, doc)\n );\n}\n\nfunction queryMatchesPathAndCollectionGroup(\n query: Query,\n doc: Document\n): boolean {\n const docPath = doc.key.path;\n if (query.collectionGroup !== null) {\n // NOTE: this.path is currently always empty since we don't expose Collection\n // Group queries rooted at a document path yet.\n return (\n doc.key.hasCollectionId(query.collectionGroup) &&\n query.path.isPrefixOf(docPath)\n );\n } else if (DocumentKey.isDocumentKey(query.path)) {\n // exact match for document queries\n return query.path.isEqual(docPath);\n } else {\n // shallow ancestor queries by default\n return query.path.isImmediateParentOf(docPath);\n }\n}\n\n/**\n * A document must have a value for every ordering clause in order to show up\n * in the results.\n */\nfunction queryMatchesOrderBy(query: Query, doc: Document): boolean {\n for (const orderBy of query.explicitOrderBy) {\n // order by key always matches\n if (!orderBy.field.isKeyField() && doc.data.field(orderBy.field) === null) {\n return false;\n }\n }\n return true;\n}\n\nfunction queryMatchesFilters(query: Query, doc: Document): boolean {\n for (const filter of query.filters) {\n if (!filter.matches(doc)) {\n return false;\n }\n }\n return true;\n}\n\n/** Makes sure a document is within the bounds, if provided. */\nfunction queryMatchesBounds(query: Query, doc: Document): boolean {\n if (\n query.startAt &&\n !sortsBeforeDocument(query.startAt, queryOrderBy(query), doc)\n ) {\n return false;\n }\n if (\n query.endAt &&\n sortsBeforeDocument(query.endAt, queryOrderBy(query), doc)\n ) {\n return false;\n }\n return true;\n}\n\n/**\n * Returns a new comparator function that can be used to compare two documents\n * based on the Query's ordering constraint.\n */\nexport function newQueryComparator(\n query: Query\n): (d1: Document, d2: Document) => number {\n return (d1: Document, d2: Document): number => {\n let comparedOnKeyField = false;\n for (const orderBy of queryOrderBy(query)) {\n const comp = compareDocs(orderBy, d1, d2);\n if (comp !== 0) {\n return comp;\n }\n comparedOnKeyField = comparedOnKeyField || orderBy.field.isKeyField();\n }\n // Assert that we actually compared by key\n debugAssert(\n comparedOnKeyField,\n \"orderBy used that doesn't compare on key field\"\n );\n return 0;\n };\n}\n\nexport function compareDocs(\n orderBy: OrderBy,\n d1: Document,\n d2: Document\n): number {\n const comparison = orderBy.field.isKeyField()\n ? DocumentKey.comparator(d1.key, d2.key)\n : compareDocumentsByField(orderBy.field, d1, d2);\n switch (orderBy.dir) {\n case Direction.ASCENDING:\n return comparison;\n case Direction.DESCENDING:\n return -1 * comparison;\n default:\n return fail('Unknown direction: ' + orderBy.dir);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { isNegativeZero, isSafeInteger } from '../util/types';\n\n/** Base interface for the Serializer implementation. */\nexport interface Serializer {\n readonly useProto3Json: boolean;\n}\n\n/**\n * Returns an DoubleValue for `value` that is encoded based the serializer's\n * `useProto3Json` setting.\n */\nexport function toDouble(serializer: Serializer, value: number): ProtoValue {\n if (serializer.useProto3Json) {\n if (isNaN(value)) {\n return { doubleValue: 'NaN' };\n } else if (value === Infinity) {\n return { doubleValue: 'Infinity' };\n } else if (value === -Infinity) {\n return { doubleValue: '-Infinity' };\n }\n }\n return { doubleValue: isNegativeZero(value) ? '-0' : value };\n}\n\n/**\n * Returns an IntegerValue for `value`.\n */\nexport function toInteger(value: number): ProtoValue {\n return { integerValue: '' + value };\n}\n\n/**\n * Returns a value for a number that's appropriate to put into a proto.\n * The return value is an IntegerValue if it can safely represent the value,\n * otherwise a DoubleValue is returned.\n */\nexport function toNumber(serializer: Serializer, value: number): ProtoValue {\n return isSafeInteger(value) ? toInteger(value) : toDouble(serializer, value);\n}\n", "/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Timestamp } from '../lite/timestamp';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { Serializer, toDouble, toInteger } from '../remote/number_serializer';\nimport { debugAssert } from '../util/assert';\nimport { arrayEquals } from '../util/misc';\n\nimport { normalizeNumber } from './normalize';\nimport { serverTimestamp } from './server_timestamps';\nimport { isArray, isInteger, isNumber, valueEquals } from './values';\n\n/** Used to represent a field transform on a mutation. */\nexport class TransformOperation {\n // Make sure that the structural type of `TransformOperation` is unique.\n // See https://github.com/microsoft/TypeScript/issues/5451\n private _ = undefined;\n}\n\n/**\n * Computes the local transform result against the provided `previousValue`,\n * optionally using the provided localWriteTime.\n */\nexport function applyTransformOperationToLocalView(\n transform: TransformOperation,\n previousValue: ProtoValue | null,\n localWriteTime: Timestamp\n): ProtoValue {\n if (transform instanceof ServerTimestampTransform) {\n return serverTimestamp(localWriteTime, previousValue);\n } else if (transform instanceof ArrayUnionTransformOperation) {\n return applyArrayUnionTransformOperation(transform, previousValue);\n } else if (transform instanceof ArrayRemoveTransformOperation) {\n return applyArrayRemoveTransformOperation(transform, previousValue);\n } else {\n debugAssert(\n transform instanceof NumericIncrementTransformOperation,\n 'Expected NumericIncrementTransformOperation but was: ' + transform\n );\n return applyNumericIncrementTransformOperationToLocalView(\n transform,\n previousValue\n );\n }\n}\n\n/**\n * Computes a final transform result after the transform has been acknowledged\n * by the server, potentially using the server-provided transformResult.\n */\nexport function applyTransformOperationToRemoteDocument(\n transform: TransformOperation,\n previousValue: ProtoValue | null,\n transformResult: ProtoValue | null\n): ProtoValue {\n // The server just sends null as the transform result for array operations,\n // so we have to calculate a result the same as we do for local\n // applications.\n if (transform instanceof ArrayUnionTransformOperation) {\n return applyArrayUnionTransformOperation(transform, previousValue);\n } else if (transform instanceof ArrayRemoveTransformOperation) {\n return applyArrayRemoveTransformOperation(transform, previousValue);\n }\n\n debugAssert(\n transformResult !== null,\n \"Didn't receive transformResult for non-array transform\"\n );\n return transformResult;\n}\n\n/**\n * If this transform operation is not idempotent, returns the base value to\n * persist for this transform. If a base value is returned, the transform\n * operation is always applied to this base value, even if document has\n * already been updated.\n *\n * Base values provide consistent behavior for non-idempotent transforms and\n * allow us to return the same latency-compensated value even if the backend\n * has already applied the transform operation. The base value is null for\n * idempotent transforms, as they can be re-played even if the backend has\n * already applied them.\n *\n * @returns a base value to store along with the mutation, or null for\n * idempotent transforms.\n */\nexport function computeTransformOperationBaseValue(\n transform: TransformOperation,\n previousValue: ProtoValue | null\n): ProtoValue | null {\n if (transform instanceof NumericIncrementTransformOperation) {\n return isNumber(previousValue) ? previousValue! : { integerValue: 0 };\n }\n return null;\n}\n\nexport function transformOperationEquals(\n left: TransformOperation,\n right: TransformOperation\n): boolean {\n if (\n left instanceof ArrayUnionTransformOperation &&\n right instanceof ArrayUnionTransformOperation\n ) {\n return arrayEquals(left.elements, right.elements, valueEquals);\n } else if (\n left instanceof ArrayRemoveTransformOperation &&\n right instanceof ArrayRemoveTransformOperation\n ) {\n return arrayEquals(left.elements, right.elements, valueEquals);\n } else if (\n left instanceof NumericIncrementTransformOperation &&\n right instanceof NumericIncrementTransformOperation\n ) {\n return valueEquals(left.operand, right.operand);\n }\n\n return (\n left instanceof ServerTimestampTransform &&\n right instanceof ServerTimestampTransform\n );\n}\n\n/** Transforms a value into a server-generated timestamp. */\nexport class ServerTimestampTransform extends TransformOperation {}\n\n/** Transforms an array value via a union operation. */\nexport class ArrayUnionTransformOperation extends TransformOperation {\n constructor(readonly elements: ProtoValue[]) {\n super();\n }\n}\n\nfunction applyArrayUnionTransformOperation(\n transform: ArrayUnionTransformOperation,\n previousValue: ProtoValue | null\n): ProtoValue {\n const values = coercedFieldValuesArray(previousValue);\n for (const toUnion of transform.elements) {\n if (!values.some(element => valueEquals(element, toUnion))) {\n values.push(toUnion);\n }\n }\n return { arrayValue: { values } };\n}\n\n/** Transforms an array value via a remove operation. */\nexport class ArrayRemoveTransformOperation extends TransformOperation {\n constructor(readonly elements: ProtoValue[]) {\n super();\n }\n}\n\nfunction applyArrayRemoveTransformOperation(\n transform: ArrayRemoveTransformOperation,\n previousValue: ProtoValue | null\n): ProtoValue {\n let values = coercedFieldValuesArray(previousValue);\n for (const toRemove of transform.elements) {\n values = values.filter(element => !valueEquals(element, toRemove));\n }\n return { arrayValue: { values } };\n}\n\n/**\n * Implements the backend semantics for locally computed NUMERIC_ADD (increment)\n * transforms. Converts all field values to integers or doubles, but unlike the\n * backend does not cap integer values at 2^63. Instead, JavaScript number\n * arithmetic is used and precision loss can occur for values greater than 2^53.\n */\nexport class NumericIncrementTransformOperation extends TransformOperation {\n constructor(readonly serializer: Serializer, readonly operand: ProtoValue) {\n super();\n debugAssert(\n isNumber(operand),\n 'NumericIncrementTransform transform requires a NumberValue'\n );\n }\n}\n\nexport function applyNumericIncrementTransformOperationToLocalView(\n transform: NumericIncrementTransformOperation,\n previousValue: ProtoValue | null\n): ProtoValue {\n // PORTING NOTE: Since JavaScript's integer arithmetic is limited to 53 bit\n // precision and resolves overflows by reducing precision, we do not\n // manually cap overflows at 2^63.\n const baseValue = computeTransformOperationBaseValue(\n transform,\n previousValue\n )!;\n const sum = asNumber(baseValue) + asNumber(transform.operand);\n if (isInteger(baseValue) && isInteger(transform.operand)) {\n return toInteger(sum);\n } else {\n return toDouble(transform.serializer, sum);\n }\n}\n\nfunction asNumber(value: ProtoValue): number {\n return normalizeNumber(value.integerValue || value.doubleValue);\n}\n\nfunction coercedFieldValuesArray(value: ProtoValue | null): ProtoValue[] {\n return isArray(value) && value.arrayValue.values\n ? value.arrayValue.values.slice()\n : [];\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { Timestamp } from '../lite/timestamp';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { arrayEquals } from '../util/misc';\n\nimport { Document, MutableDocument } from './document';\nimport { DocumentKey } from './document_key';\nimport { FieldMask } from './field_mask';\nimport { ObjectValue } from './object_value';\nimport { FieldPath } from './path';\nimport {\n applyTransformOperationToLocalView,\n applyTransformOperationToRemoteDocument,\n computeTransformOperationBaseValue,\n TransformOperation,\n transformOperationEquals\n} from './transform_operation';\n\n/** A field path and the TransformOperation to perform upon it. */\nexport class FieldTransform {\n constructor(\n readonly field: FieldPath,\n readonly transform: TransformOperation\n ) {}\n}\n\nexport function fieldTransformEquals(\n left: FieldTransform,\n right: FieldTransform\n): boolean {\n return (\n left.field.isEqual(right.field) &&\n transformOperationEquals(left.transform, right.transform)\n );\n}\n\nexport function fieldTransformsAreEqual(\n left?: FieldTransform[],\n right?: FieldTransform[]\n): boolean {\n if (left === undefined && right === undefined) {\n return true;\n }\n\n if (left && right) {\n return arrayEquals(left, right, (l, r) => fieldTransformEquals(l, r));\n }\n\n return false;\n}\n\n/** The result of successfully applying a mutation to the backend. */\nexport class MutationResult {\n constructor(\n /**\n * The version at which the mutation was committed:\n *\n * - For most operations, this is the updateTime in the WriteResult.\n * - For deletes, the commitTime of the WriteResponse (because deletes are\n * not stored and have no updateTime).\n *\n * Note that these versions can be different: No-op writes will not change\n * the updateTime even though the commitTime advances.\n */\n readonly version: SnapshotVersion,\n /**\n * The resulting fields returned from the backend after a mutation\n * containing field transforms has been committed. Contains one FieldValue\n * for each FieldTransform that was in the mutation.\n *\n * Will be empty if the mutation did not contain any field transforms.\n */\n readonly transformResults: Array<ProtoValue | null>\n ) {}\n}\n\nexport const enum MutationType {\n Set,\n Patch,\n Delete,\n Verify\n}\n\n/**\n * Encodes a precondition for a mutation. This follows the model that the\n * backend accepts with the special case of an explicit \"empty\" precondition\n * (meaning no precondition).\n */\nexport class Precondition {\n private constructor(\n readonly updateTime?: SnapshotVersion,\n readonly exists?: boolean\n ) {\n debugAssert(\n updateTime === undefined || exists === undefined,\n 'Precondition can specify \"exists\" or \"updateTime\" but not both'\n );\n }\n\n /** Creates a new empty Precondition. */\n static none(): Precondition {\n return new Precondition();\n }\n\n /** Creates a new Precondition with an exists flag. */\n static exists(exists: boolean): Precondition {\n return new Precondition(undefined, exists);\n }\n\n /** Creates a new Precondition based on a version a document exists at. */\n static updateTime(version: SnapshotVersion): Precondition {\n return new Precondition(version);\n }\n\n /** Returns whether this Precondition is empty. */\n get isNone(): boolean {\n return this.updateTime === undefined && this.exists === undefined;\n }\n\n isEqual(other: Precondition): boolean {\n return (\n this.exists === other.exists &&\n (this.updateTime\n ? !!other.updateTime && this.updateTime.isEqual(other.updateTime)\n : !other.updateTime)\n );\n }\n}\n\n/** Returns true if the preconditions is valid for the given document. */\nexport function preconditionIsValidForDocument(\n precondition: Precondition,\n document: MutableDocument\n): boolean {\n if (precondition.updateTime !== undefined) {\n return (\n document.isFoundDocument() &&\n document.version.isEqual(precondition.updateTime)\n );\n } else if (precondition.exists !== undefined) {\n return precondition.exists === document.isFoundDocument();\n } else {\n debugAssert(precondition.isNone, 'Precondition should be empty');\n return true;\n }\n}\n\n/**\n * A mutation describes a self-contained change to a document. Mutations can\n * create, replace, delete, and update subsets of documents.\n *\n * Mutations not only act on the value of the document but also its version.\n *\n * For local mutations (mutations that haven't been committed yet), we preserve\n * the existing version for Set and Patch mutations. For Delete mutations, we\n * reset the version to 0.\n *\n * Here's the expected transition table.\n *\n * MUTATION APPLIED TO RESULTS IN\n *\n * SetMutation Document(v3) Document(v3)\n * SetMutation NoDocument(v3) Document(v0)\n * SetMutation InvalidDocument(v0) Document(v0)\n * PatchMutation Document(v3) Document(v3)\n * PatchMutation NoDocument(v3) NoDocument(v3)\n * PatchMutation InvalidDocument(v0) UnknownDocument(v3)\n * DeleteMutation Document(v3) NoDocument(v0)\n * DeleteMutation NoDocument(v3) NoDocument(v0)\n * DeleteMutation InvalidDocument(v0) NoDocument(v0)\n *\n * For acknowledged mutations, we use the updateTime of the WriteResponse as\n * the resulting version for Set and Patch mutations. As deletes have no\n * explicit update time, we use the commitTime of the WriteResponse for\n * Delete mutations.\n *\n * If a mutation is acknowledged by the backend but fails the precondition check\n * locally, we transition to an `UnknownDocument` and rely on Watch to send us\n * the updated version.\n *\n * Field transforms are used only with Patch and Set Mutations. We use the\n * `updateTransforms` message to store transforms, rather than the `transforms`s\n * messages.\n *\n * ## Subclassing Notes\n *\n * Every type of mutation needs to implement its own applyToRemoteDocument() and\n * applyToLocalView() to implement the actual behavior of applying the mutation\n * to some source document (see `applySetMutationToRemoteDocument()` for an\n * example).\n */\nexport abstract class Mutation {\n abstract readonly type: MutationType;\n abstract readonly key: DocumentKey;\n abstract readonly precondition: Precondition;\n abstract readonly fieldTransforms: FieldTransform[];\n}\n\n/**\n * Applies this mutation to the given document for the purposes of computing a\n * new remote document. If the input document doesn't match the expected state\n * (e.g. it is invalid or outdated), the document type may transition to\n * unknown.\n *\n * @param mutation - The mutation to apply.\n * @param document - The document to mutate. The input document can be an\n * invalid document if the client has no knowledge of the pre-mutation state\n * of the document.\n * @param mutationResult - The result of applying the mutation from the backend.\n */\nexport function applyMutationToRemoteDocument(\n mutation: Mutation,\n document: MutableDocument,\n mutationResult: MutationResult\n): void {\n verifyMutationKeyMatches(mutation, document);\n if (mutation instanceof SetMutation) {\n applySetMutationToRemoteDocument(mutation, document, mutationResult);\n } else if (mutation instanceof PatchMutation) {\n applyPatchMutationToRemoteDocument(mutation, document, mutationResult);\n } else {\n debugAssert(\n mutation instanceof DeleteMutation,\n 'Unexpected mutation type: ' + mutation\n );\n applyDeleteMutationToRemoteDocument(mutation, document, mutationResult);\n }\n}\n\n/**\n * Applies this mutation to the given document for the purposes of computing\n * the new local view of a document. If the input document doesn't match the\n * expected state, the document is not modified.\n *\n * @param mutation - The mutation to apply.\n * @param document - The document to mutate. The input document can be an\n * invalid document if the client has no knowledge of the pre-mutation state\n * of the document.\n * @param localWriteTime - A timestamp indicating the local write time of the\n * batch this mutation is a part of.\n */\nexport function applyMutationToLocalView(\n mutation: Mutation,\n document: MutableDocument,\n localWriteTime: Timestamp\n): void {\n verifyMutationKeyMatches(mutation, document);\n\n if (mutation instanceof SetMutation) {\n applySetMutationToLocalView(mutation, document, localWriteTime);\n } else if (mutation instanceof PatchMutation) {\n applyPatchMutationToLocalView(mutation, document, localWriteTime);\n } else {\n debugAssert(\n mutation instanceof DeleteMutation,\n 'Unexpected mutation type: ' + mutation\n );\n applyDeleteMutationToLocalView(mutation, document);\n }\n}\n\n/**\n * If this mutation is not idempotent, returns the base value to persist with\n * this mutation. If a base value is returned, the mutation is always applied\n * to this base value, even if document has already been updated.\n *\n * The base value is a sparse object that consists of only the document\n * fields for which this mutation contains a non-idempotent transformation\n * (e.g. a numeric increment). The provided value guarantees consistent\n * behavior for non-idempotent transforms and allow us to return the same\n * latency-compensated value even if the backend has already applied the\n * mutation. The base value is null for idempotent mutations, as they can be\n * re-played even if the backend has already applied them.\n *\n * @returns a base value to store along with the mutation, or null for\n * idempotent mutations.\n */\nexport function extractMutationBaseValue(\n mutation: Mutation,\n document: Document\n): ObjectValue | null {\n let baseObject: ObjectValue | null = null;\n for (const fieldTransform of mutation.fieldTransforms) {\n const existingValue = document.data.field(fieldTransform.field);\n const coercedValue = computeTransformOperationBaseValue(\n fieldTransform.transform,\n existingValue || null\n );\n\n if (coercedValue != null) {\n if (baseObject == null) {\n baseObject = ObjectValue.empty();\n }\n baseObject.set(fieldTransform.field, coercedValue);\n }\n }\n return baseObject ? baseObject : null;\n}\n\nexport function mutationEquals(left: Mutation, right: Mutation): boolean {\n if (left.type !== right.type) {\n return false;\n }\n\n if (!left.key.isEqual(right.key)) {\n return false;\n }\n\n if (!left.precondition.isEqual(right.precondition)) {\n return false;\n }\n\n if (!fieldTransformsAreEqual(left.fieldTransforms, right.fieldTransforms)) {\n return false;\n }\n\n if (left.type === MutationType.Set) {\n return (left as SetMutation).value.isEqual((right as SetMutation).value);\n }\n\n if (left.type === MutationType.Patch) {\n return (\n (left as PatchMutation).data.isEqual((right as PatchMutation).data) &&\n (left as PatchMutation).fieldMask.isEqual(\n (right as PatchMutation).fieldMask\n )\n );\n }\n\n return true;\n}\n\nfunction verifyMutationKeyMatches(\n mutation: Mutation,\n document: MutableDocument\n): void {\n debugAssert(\n document.key.isEqual(mutation.key),\n 'Can only apply a mutation to a document with the same key'\n );\n}\n\n/**\n * Returns the version from the given document for use as the result of a\n * mutation. Mutations are defined to return the version of the base document\n * only if it is an existing document. Deleted and unknown documents have a\n * post-mutation version of SnapshotVersion.min().\n */\nfunction getPostMutationVersion(document: MutableDocument): SnapshotVersion {\n return document.isFoundDocument() ? document.version : SnapshotVersion.min();\n}\n\n/**\n * A mutation that creates or replaces the document at the given key with the\n * object value contents.\n */\nexport class SetMutation extends Mutation {\n constructor(\n readonly key: DocumentKey,\n readonly value: ObjectValue,\n readonly precondition: Precondition,\n readonly fieldTransforms: FieldTransform[] = []\n ) {\n super();\n }\n\n readonly type: MutationType = MutationType.Set;\n}\n\nfunction applySetMutationToRemoteDocument(\n mutation: SetMutation,\n document: MutableDocument,\n mutationResult: MutationResult\n): void {\n // Unlike applySetMutationToLocalView, if we're applying a mutation to a\n // remote document the server has accepted the mutation so the precondition\n // must have held.\n const newData = mutation.value.clone();\n const transformResults = serverTransformResults(\n mutation.fieldTransforms,\n document,\n mutationResult.transformResults\n );\n newData.setAll(transformResults);\n document\n .convertToFoundDocument(mutationResult.version, newData)\n .setHasCommittedMutations();\n}\n\nfunction applySetMutationToLocalView(\n mutation: SetMutation,\n document: MutableDocument,\n localWriteTime: Timestamp\n): void {\n if (!preconditionIsValidForDocument(mutation.precondition, document)) {\n // The mutation failed to apply (e.g. a document ID created with add()\n // caused a name collision).\n return;\n }\n\n const newData = mutation.value.clone();\n const transformResults = localTransformResults(\n mutation.fieldTransforms,\n localWriteTime,\n document\n );\n newData.setAll(transformResults);\n document\n .convertToFoundDocument(getPostMutationVersion(document), newData)\n .setHasLocalMutations();\n}\n\n/**\n * A mutation that modifies fields of the document at the given key with the\n * given values. The values are applied through a field mask:\n *\n * * When a field is in both the mask and the values, the corresponding field\n * is updated.\n * * When a field is in neither the mask nor the values, the corresponding\n * field is unmodified.\n * * When a field is in the mask but not in the values, the corresponding field\n * is deleted.\n * * When a field is not in the mask but is in the values, the values map is\n * ignored.\n */\nexport class PatchMutation extends Mutation {\n constructor(\n readonly key: DocumentKey,\n readonly data: ObjectValue,\n readonly fieldMask: FieldMask,\n readonly precondition: Precondition,\n readonly fieldTransforms: FieldTransform[] = []\n ) {\n super();\n }\n\n readonly type: MutationType = MutationType.Patch;\n}\n\nfunction applyPatchMutationToRemoteDocument(\n mutation: PatchMutation,\n document: MutableDocument,\n mutationResult: MutationResult\n): void {\n if (!preconditionIsValidForDocument(mutation.precondition, document)) {\n // Since the mutation was not rejected, we know that the precondition\n // matched on the backend. We therefore must not have the expected version\n // of the document in our cache and convert to an UnknownDocument with a\n // known updateTime.\n document.convertToUnknownDocument(mutationResult.version);\n return;\n }\n\n const transformResults = serverTransformResults(\n mutation.fieldTransforms,\n document,\n mutationResult.transformResults\n );\n const newData = document.data;\n newData.setAll(getPatch(mutation));\n newData.setAll(transformResults);\n document\n .convertToFoundDocument(mutationResult.version, newData)\n .setHasCommittedMutations();\n}\n\nfunction applyPatchMutationToLocalView(\n mutation: PatchMutation,\n document: MutableDocument,\n localWriteTime: Timestamp\n): void {\n if (!preconditionIsValidForDocument(mutation.precondition, document)) {\n return;\n }\n\n const transformResults = localTransformResults(\n mutation.fieldTransforms,\n localWriteTime,\n document\n );\n const newData = document.data;\n newData.setAll(getPatch(mutation));\n newData.setAll(transformResults);\n document\n .convertToFoundDocument(getPostMutationVersion(document), newData)\n .setHasLocalMutations();\n}\n\n/**\n * Returns a FieldPath/Value map with the content of the PatchMutation.\n */\nfunction getPatch(mutation: PatchMutation): Map<FieldPath, ProtoValue | null> {\n const result = new Map<FieldPath, ProtoValue | null>();\n mutation.fieldMask.fields.forEach(fieldPath => {\n if (!fieldPath.isEmpty()) {\n const newValue = mutation.data.field(fieldPath);\n result.set(fieldPath, newValue);\n }\n });\n return result;\n}\n\n/**\n * Creates a list of \"transform results\" (a transform result is a field value\n * representing the result of applying a transform) for use after a mutation\n * containing transforms has been acknowledged by the server.\n *\n * @param fieldTransforms - The field transforms to apply the result to.\n * @param mutableDocument - The current state of the document after applying all\n * previous mutations.\n * @param serverTransformResults - The transform results received by the server.\n * @returns The transform results list.\n */\nfunction serverTransformResults(\n fieldTransforms: FieldTransform[],\n mutableDocument: MutableDocument,\n serverTransformResults: Array<ProtoValue | null>\n): Map<FieldPath, ProtoValue> {\n const transformResults = new Map<FieldPath, ProtoValue>();\n hardAssert(\n fieldTransforms.length === serverTransformResults.length,\n `server transform result count (${serverTransformResults.length}) ` +\n `should match field transform count (${fieldTransforms.length})`\n );\n\n for (let i = 0; i < serverTransformResults.length; i++) {\n const fieldTransform = fieldTransforms[i];\n const transform = fieldTransform.transform;\n const previousValue = mutableDocument.data.field(fieldTransform.field);\n transformResults.set(\n fieldTransform.field,\n applyTransformOperationToRemoteDocument(\n transform,\n previousValue,\n serverTransformResults[i]\n )\n );\n }\n return transformResults;\n}\n\n/**\n * Creates a list of \"transform results\" (a transform result is a field value\n * representing the result of applying a transform) for use when applying a\n * transform locally.\n *\n * @param fieldTransforms - The field transforms to apply the result to.\n * @param localWriteTime - The local time of the mutation (used to\n * generate ServerTimestampValues).\n * @param mutableDocument - The current state of the document after applying all\n * previous mutations.\n * @returns The transform results list.\n */\nfunction localTransformResults(\n fieldTransforms: FieldTransform[],\n localWriteTime: Timestamp,\n mutableDocument: MutableDocument\n): Map<FieldPath, ProtoValue> {\n const transformResults = new Map<FieldPath, ProtoValue>();\n for (const fieldTransform of fieldTransforms) {\n const transform = fieldTransform.transform;\n\n const previousValue = mutableDocument.data.field(fieldTransform.field);\n transformResults.set(\n fieldTransform.field,\n applyTransformOperationToLocalView(\n transform,\n previousValue,\n localWriteTime\n )\n );\n }\n return transformResults;\n}\n\n/** A mutation that deletes the document at the given key. */\nexport class DeleteMutation extends Mutation {\n constructor(readonly key: DocumentKey, readonly precondition: Precondition) {\n super();\n }\n\n readonly type: MutationType = MutationType.Delete;\n readonly fieldTransforms: FieldTransform[] = [];\n}\n\nfunction applyDeleteMutationToRemoteDocument(\n mutation: DeleteMutation,\n document: MutableDocument,\n mutationResult: MutationResult\n): void {\n debugAssert(\n mutationResult.transformResults.length === 0,\n 'Transform results received by DeleteMutation.'\n );\n\n // Unlike applyToLocalView, if we're applying a mutation to a remote\n // document the server has accepted the mutation so the precondition must\n // have held.\n document\n .convertToNoDocument(mutationResult.version)\n .setHasCommittedMutations();\n}\n\nfunction applyDeleteMutationToLocalView(\n mutation: DeleteMutation,\n document: MutableDocument\n): void {\n debugAssert(\n document.key.isEqual(mutation.key),\n 'Can only apply mutation to document with same key'\n );\n if (preconditionIsValidForDocument(mutation.precondition, document)) {\n // We don't call `setHasLocalMutations()` since we want to be backwards\n // compatible with the existing SDK behavior.\n document.convertToNoDocument(SnapshotVersion.min());\n }\n}\n\n/**\n * A mutation that verifies the existence of the document at the given key with\n * the provided precondition.\n *\n * The `verify` operation is only used in Transactions, and this class serves\n * primarily to facilitate serialization into protos.\n */\nexport class VerifyMutation extends Mutation {\n constructor(readonly key: DocumentKey, readonly precondition: Precondition) {\n super();\n }\n\n readonly type: MutationType = MutationType.Verify;\n readonly fieldTransforms: FieldTransform[] = [];\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class ExistenceFilter {\n // TODO(b/33078163): just use simplest form of existence filter for now\n constructor(public count: number) {}\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { fail } from '../util/assert';\nimport { Code } from '../util/error';\nimport { logError } from '../util/log';\n\n/**\n * Error Codes describing the different ways GRPC can fail. These are copied\n * directly from GRPC's sources here:\n *\n * https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h\n *\n * Important! The names of these identifiers matter because the string forms\n * are used for reverse lookups from the webchannel stream. Do NOT change the\n * names of these identifiers or change this into a const enum.\n */\nenum RpcCode {\n OK = 0,\n CANCELLED = 1,\n UNKNOWN = 2,\n INVALID_ARGUMENT = 3,\n DEADLINE_EXCEEDED = 4,\n NOT_FOUND = 5,\n ALREADY_EXISTS = 6,\n PERMISSION_DENIED = 7,\n UNAUTHENTICATED = 16,\n RESOURCE_EXHAUSTED = 8,\n FAILED_PRECONDITION = 9,\n ABORTED = 10,\n OUT_OF_RANGE = 11,\n UNIMPLEMENTED = 12,\n INTERNAL = 13,\n UNAVAILABLE = 14,\n DATA_LOSS = 15\n}\n\n/**\n * Determines whether an error code represents a permanent error when received\n * in response to a non-write operation.\n *\n * See isPermanentWriteError for classifying write errors.\n */\nexport function isPermanentError(code: Code): boolean {\n switch (code) {\n case Code.OK:\n return fail('Treated status OK as error');\n case Code.CANCELLED:\n case Code.UNKNOWN:\n case Code.DEADLINE_EXCEEDED:\n case Code.RESOURCE_EXHAUSTED:\n case Code.INTERNAL:\n case Code.UNAVAILABLE:\n // Unauthenticated means something went wrong with our token and we need\n // to retry with new credentials which will happen automatically.\n case Code.UNAUTHENTICATED:\n return false;\n case Code.INVALID_ARGUMENT:\n case Code.NOT_FOUND:\n case Code.ALREADY_EXISTS:\n case Code.PERMISSION_DENIED:\n case Code.FAILED_PRECONDITION:\n // Aborted might be retried in some scenarios, but that is dependant on\n // the context and should handled individually by the calling code.\n // See https://cloud.google.com/apis/design/errors.\n case Code.ABORTED:\n case Code.OUT_OF_RANGE:\n case Code.UNIMPLEMENTED:\n case Code.DATA_LOSS:\n return true;\n default:\n return fail('Unknown status code: ' + code);\n }\n}\n\n/**\n * Determines whether an error code represents a permanent error when received\n * in response to a write operation.\n *\n * Write operations must be handled specially because as of b/119437764, ABORTED\n * errors on the write stream should be retried too (even though ABORTED errors\n * are not generally retryable).\n *\n * Note that during the initial handshake on the write stream an ABORTED error\n * signals that we should discard our stream token (i.e. it is permanent). This\n * means a handshake error should be classified with isPermanentError, above.\n */\nexport function isPermanentWriteError(code: Code): boolean {\n return isPermanentError(code) && code !== Code.ABORTED;\n}\n\n/**\n * Maps an error Code from a GRPC status identifier like 'NOT_FOUND'.\n *\n * @returns The Code equivalent to the given status string or undefined if\n * there is no match.\n */\nexport function mapCodeFromRpcStatus(status: string): Code | undefined {\n // lookup by string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const code: RpcCode = RpcCode[status as any] as any;\n if (code === undefined) {\n return undefined;\n }\n\n return mapCodeFromRpcCode(code);\n}\n\n/**\n * Maps an error Code from GRPC status code number, like 0, 1, or 14. These\n * are not the same as HTTP status codes.\n *\n * @returns The Code equivalent to the given GRPC status code. Fails if there\n * is no match.\n */\nexport function mapCodeFromRpcCode(code: number | undefined): Code {\n if (code === undefined) {\n // This shouldn't normally happen, but in certain error cases (like trying\n // to send invalid proto messages) we may get an error with no GRPC code.\n logError('GRPC error has no .code');\n return Code.UNKNOWN;\n }\n\n switch (code) {\n case RpcCode.OK:\n return Code.OK;\n case RpcCode.CANCELLED:\n return Code.CANCELLED;\n case RpcCode.UNKNOWN:\n return Code.UNKNOWN;\n case RpcCode.DEADLINE_EXCEEDED:\n return Code.DEADLINE_EXCEEDED;\n case RpcCode.RESOURCE_EXHAUSTED:\n return Code.RESOURCE_EXHAUSTED;\n case RpcCode.INTERNAL:\n return Code.INTERNAL;\n case RpcCode.UNAVAILABLE:\n return Code.UNAVAILABLE;\n case RpcCode.UNAUTHENTICATED:\n return Code.UNAUTHENTICATED;\n case RpcCode.INVALID_ARGUMENT:\n return Code.INVALID_ARGUMENT;\n case RpcCode.NOT_FOUND:\n return Code.NOT_FOUND;\n case RpcCode.ALREADY_EXISTS:\n return Code.ALREADY_EXISTS;\n case RpcCode.PERMISSION_DENIED:\n return Code.PERMISSION_DENIED;\n case RpcCode.FAILED_PRECONDITION:\n return Code.FAILED_PRECONDITION;\n case RpcCode.ABORTED:\n return Code.ABORTED;\n case RpcCode.OUT_OF_RANGE:\n return Code.OUT_OF_RANGE;\n case RpcCode.UNIMPLEMENTED:\n return Code.UNIMPLEMENTED;\n case RpcCode.DATA_LOSS:\n return Code.DATA_LOSS;\n default:\n return fail('Unknown status code: ' + code);\n }\n}\n\n/**\n * Maps an RPC code from a Code. This is the reverse operation from\n * mapCodeFromRpcCode and should really only be used in tests.\n */\nexport function mapRpcCodeFromCode(code: Code | undefined): number {\n if (code === undefined) {\n return RpcCode.OK;\n }\n\n switch (code) {\n case Code.OK:\n return RpcCode.OK;\n case Code.CANCELLED:\n return RpcCode.CANCELLED;\n case Code.UNKNOWN:\n return RpcCode.UNKNOWN;\n case Code.DEADLINE_EXCEEDED:\n return RpcCode.DEADLINE_EXCEEDED;\n case Code.RESOURCE_EXHAUSTED:\n return RpcCode.RESOURCE_EXHAUSTED;\n case Code.INTERNAL:\n return RpcCode.INTERNAL;\n case Code.UNAVAILABLE:\n return RpcCode.UNAVAILABLE;\n case Code.UNAUTHENTICATED:\n return RpcCode.UNAUTHENTICATED;\n case Code.INVALID_ARGUMENT:\n return RpcCode.INVALID_ARGUMENT;\n case Code.NOT_FOUND:\n return RpcCode.NOT_FOUND;\n case Code.ALREADY_EXISTS:\n return RpcCode.ALREADY_EXISTS;\n case Code.PERMISSION_DENIED:\n return RpcCode.PERMISSION_DENIED;\n case Code.FAILED_PRECONDITION:\n return RpcCode.FAILED_PRECONDITION;\n case Code.ABORTED:\n return RpcCode.ABORTED;\n case Code.OUT_OF_RANGE:\n return RpcCode.OUT_OF_RANGE;\n case Code.UNIMPLEMENTED:\n return RpcCode.UNIMPLEMENTED;\n case Code.DATA_LOSS:\n return RpcCode.DATA_LOSS;\n default:\n return fail('Unknown status code: ' + code);\n }\n}\n\n/**\n * Converts an HTTP Status Code to the equivalent error code.\n *\n * @param status - An HTTP Status Code, like 200, 404, 503, etc.\n * @returns The equivalent Code. Unknown status codes are mapped to\n * Code.UNKNOWN.\n */\nexport function mapCodeFromHttpStatus(status?: number): Code {\n if (status === undefined) {\n logError('RPC_ERROR', 'HTTP error has no status');\n return Code.UNKNOWN;\n }\n\n // The canonical error codes for Google APIs [1] specify mapping onto HTTP\n // status codes but the mapping is not bijective. In each case of ambiguity\n // this function chooses a primary error.\n //\n // [1]\n // https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto\n switch (status) {\n case 200: // OK\n return Code.OK;\n\n case 400: // Bad Request\n return Code.FAILED_PRECONDITION;\n // Other possibilities based on the forward mapping\n // return Code.INVALID_ARGUMENT;\n // return Code.OUT_OF_RANGE;\n\n case 401: // Unauthorized\n return Code.UNAUTHENTICATED;\n\n case 403: // Forbidden\n return Code.PERMISSION_DENIED;\n\n case 404: // Not Found\n return Code.NOT_FOUND;\n\n case 409: // Conflict\n return Code.ABORTED;\n // Other possibilities:\n // return Code.ALREADY_EXISTS;\n\n case 416: // Range Not Satisfiable\n return Code.OUT_OF_RANGE;\n\n case 429: // Too Many Requests\n return Code.RESOURCE_EXHAUSTED;\n\n case 499: // Client Closed Request\n return Code.CANCELLED;\n\n case 500: // Internal Server Error\n return Code.UNKNOWN;\n // Other possibilities:\n // return Code.INTERNAL;\n // return Code.DATA_LOSS;\n\n case 501: // Unimplemented\n return Code.UNIMPLEMENTED;\n\n case 503: // Service Unavailable\n return Code.UNAVAILABLE;\n\n case 504: // Gateway Timeout\n return Code.DEADLINE_EXCEEDED;\n\n default:\n if (status >= 200 && status < 300) {\n return Code.OK;\n }\n if (status >= 400 && status < 500) {\n return Code.FAILED_PRECONDITION;\n }\n if (status >= 500 && status < 600) {\n return Code.INTERNAL;\n }\n return Code.UNKNOWN;\n }\n}\n\n/**\n * Converts an HTTP response's error status to the equivalent error code.\n *\n * @param status - An HTTP error response status (\"FAILED_PRECONDITION\",\n * \"UNKNOWN\", etc.)\n * @returns The equivalent Code. Non-matching responses are mapped to\n * Code.UNKNOWN.\n */\nexport function mapCodeFromHttpResponseErrorStatus(status: string): Code {\n const serverError = status.toLowerCase().replace(/_/g, '-');\n return Object.values(Code).indexOf(serverError as Code) >= 0\n ? (serverError as Code)\n : Code.UNKNOWN;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert, fail } from './assert';\n\n/*\n * Implementation of an immutable SortedMap using a Left-leaning\n * Red-Black Tree, adapted from the implementation in Mugs\n * (http://mads379.github.com/mugs/) by Mads Hartmann Jensen\n * (mads379@gmail.com).\n *\n * Original paper on Left-leaning Red-Black Trees:\n * http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf\n *\n * Invariant 1: No red node has a red child\n * Invariant 2: Every leaf path has the same number of black nodes\n * Invariant 3: Only the left child can be red (left leaning)\n */\n\nexport type Comparator<K> = (key1: K, key2: K) => number;\n\nexport interface Entry<K, V> {\n key: K;\n value: V;\n}\n\n// An immutable sorted map implementation, based on a Left-leaning Red-Black\n// tree.\nexport class SortedMap<K, V> {\n // visible for testing\n root: LLRBNode<K, V> | LLRBEmptyNode<K, V>;\n\n constructor(\n public comparator: Comparator<K>,\n root?: LLRBNode<K, V> | LLRBEmptyNode<K, V>\n ) {\n this.root = root ? root : LLRBNode.EMPTY;\n }\n\n // Returns a copy of the map, with the specified key/value added or replaced.\n insert(key: K, value: V): SortedMap<K, V> {\n return new SortedMap<K, V>(\n this.comparator,\n this.root\n .insert(key, value, this.comparator)\n .copy(null, null, LLRBNode.BLACK, null, null)\n );\n }\n\n // Returns a copy of the map, with the specified key removed.\n remove(key: K): SortedMap<K, V> {\n return new SortedMap<K, V>(\n this.comparator,\n this.root\n .remove(key, this.comparator)\n .copy(null, null, LLRBNode.BLACK, null, null)\n );\n }\n\n // Returns the value of the node with the given key, or null.\n get(key: K): V | null {\n let node = this.root;\n while (!node.isEmpty()) {\n const cmp = this.comparator(key, node.key);\n if (cmp === 0) {\n return node.value;\n } else if (cmp < 0) {\n node = node.left;\n } else if (cmp > 0) {\n node = node.right;\n }\n }\n return null;\n }\n\n // Returns the index of the element in this sorted map, or -1 if it doesn't\n // exist.\n indexOf(key: K): number {\n // Number of nodes that were pruned when descending right\n let prunedNodes = 0;\n let node = this.root;\n while (!node.isEmpty()) {\n const cmp = this.comparator(key, node.key);\n if (cmp === 0) {\n return prunedNodes + node.left.size;\n } else if (cmp < 0) {\n node = node.left;\n } else {\n // Count all nodes left of the node plus the node itself\n prunedNodes += node.left.size + 1;\n node = node.right;\n }\n }\n // Node not found\n return -1;\n }\n\n isEmpty(): boolean {\n return this.root.isEmpty();\n }\n\n // Returns the total number of nodes in the map.\n get size(): number {\n return this.root.size;\n }\n\n // Returns the minimum key in the map.\n minKey(): K | null {\n return this.root.minKey();\n }\n\n // Returns the maximum key in the map.\n maxKey(): K | null {\n return this.root.maxKey();\n }\n\n // Traverses the map in key order and calls the specified action function\n // for each key/value pair. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n inorderTraversal<T>(action: (k: K, v: V) => T): T {\n return (this.root as LLRBNode<K, V>).inorderTraversal(action);\n }\n\n forEach(fn: (k: K, v: V) => void): void {\n this.inorderTraversal((k, v) => {\n fn(k, v);\n return false;\n });\n }\n\n toString(): string {\n const descriptions: string[] = [];\n this.inorderTraversal((k, v) => {\n descriptions.push(`${k}:${v}`);\n return false;\n });\n return `{${descriptions.join(', ')}}`;\n }\n\n // Traverses the map in reverse key order and calls the specified action\n // function for each key/value pair. If action returns true, traversal is\n // aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n reverseTraversal<T>(action: (k: K, v: V) => T): T {\n return (this.root as LLRBNode<K, V>).reverseTraversal(action);\n }\n\n // Returns an iterator over the SortedMap.\n getIterator(): SortedMapIterator<K, V> {\n return new SortedMapIterator<K, V>(this.root, null, this.comparator, false);\n }\n\n getIteratorFrom(key: K): SortedMapIterator<K, V> {\n return new SortedMapIterator<K, V>(this.root, key, this.comparator, false);\n }\n\n getReverseIterator(): SortedMapIterator<K, V> {\n return new SortedMapIterator<K, V>(this.root, null, this.comparator, true);\n }\n\n getReverseIteratorFrom(key: K): SortedMapIterator<K, V> {\n return new SortedMapIterator<K, V>(this.root, key, this.comparator, true);\n }\n} // end SortedMap\n\n// An iterator over an LLRBNode.\nexport class SortedMapIterator<K, V> {\n private isReverse: boolean;\n private nodeStack: Array<LLRBNode<K, V> | LLRBEmptyNode<K, V>>;\n\n constructor(\n node: LLRBNode<K, V> | LLRBEmptyNode<K, V>,\n startKey: K | null,\n comparator: Comparator<K>,\n isReverse: boolean\n ) {\n this.isReverse = isReverse;\n this.nodeStack = [];\n\n let cmp = 1;\n while (!node.isEmpty()) {\n cmp = startKey ? comparator(node.key, startKey) : 1;\n // flip the comparison if we're going in reverse\n if (isReverse) {\n cmp *= -1;\n }\n\n if (cmp < 0) {\n // This node is less than our start key. ignore it\n if (this.isReverse) {\n node = node.left;\n } else {\n node = node.right;\n }\n } else if (cmp === 0) {\n // This node is exactly equal to our start key. Push it on the stack,\n // but stop iterating;\n this.nodeStack.push(node);\n break;\n } else {\n // This node is greater than our start key, add it to the stack and move\n // to the next one\n this.nodeStack.push(node);\n if (this.isReverse) {\n node = node.right;\n } else {\n node = node.left;\n }\n }\n }\n }\n\n getNext(): Entry<K, V> {\n debugAssert(\n this.nodeStack.length > 0,\n 'getNext() called on iterator when hasNext() is false.'\n );\n\n let node = this.nodeStack.pop()!;\n const result = { key: node.key, value: node.value };\n\n if (this.isReverse) {\n node = node.left;\n while (!node.isEmpty()) {\n this.nodeStack.push(node);\n node = node.right;\n }\n } else {\n node = node.right;\n while (!node.isEmpty()) {\n this.nodeStack.push(node);\n node = node.left;\n }\n }\n\n return result;\n }\n\n hasNext(): boolean {\n return this.nodeStack.length > 0;\n }\n\n peek(): Entry<K, V> | null {\n if (this.nodeStack.length === 0) {\n return null;\n }\n\n const node = this.nodeStack[this.nodeStack.length - 1];\n return { key: node.key, value: node.value };\n }\n} // end SortedMapIterator\n\n// Represents a node in a Left-leaning Red-Black tree.\nexport class LLRBNode<K, V> {\n readonly color: boolean;\n readonly left: LLRBNode<K, V> | LLRBEmptyNode<K, V>;\n readonly right: LLRBNode<K, V> | LLRBEmptyNode<K, V>;\n readonly size: number;\n\n // Empty node is shared between all LLRB trees.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static EMPTY: LLRBEmptyNode<any, any> = null as any;\n\n static RED = true;\n static BLACK = false;\n\n constructor(\n public key: K,\n public value: V,\n color?: boolean,\n left?: LLRBNode<K, V> | LLRBEmptyNode<K, V>,\n right?: LLRBNode<K, V> | LLRBEmptyNode<K, V>\n ) {\n this.color = color != null ? color : LLRBNode.RED;\n this.left = left != null ? left : LLRBNode.EMPTY;\n this.right = right != null ? right : LLRBNode.EMPTY;\n this.size = this.left.size + 1 + this.right.size;\n }\n\n // Returns a copy of the current node, optionally replacing pieces of it.\n copy(\n key: K | null,\n value: V | null,\n color: boolean | null,\n left: LLRBNode<K, V> | LLRBEmptyNode<K, V> | null,\n right: LLRBNode<K, V> | LLRBEmptyNode<K, V> | null\n ): LLRBNode<K, V> {\n return new LLRBNode<K, V>(\n key != null ? key : this.key,\n value != null ? value : this.value,\n color != null ? color : this.color,\n left != null ? left : this.left,\n right != null ? right : this.right\n );\n }\n\n isEmpty(): boolean {\n return false;\n }\n\n // Traverses the tree in key order and calls the specified action function\n // for each node. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n inorderTraversal<T>(action: (k: K, v: V) => T): T {\n return (\n (this.left as LLRBNode<K, V>).inorderTraversal(action) ||\n action(this.key, this.value) ||\n (this.right as LLRBNode<K, V>).inorderTraversal(action)\n );\n }\n\n // Traverses the tree in reverse key order and calls the specified action\n // function for each node. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n reverseTraversal<T>(action: (k: K, v: V) => T): T {\n return (\n (this.right as LLRBNode<K, V>).reverseTraversal(action) ||\n action(this.key, this.value) ||\n (this.left as LLRBNode<K, V>).reverseTraversal(action)\n );\n }\n\n // Returns the minimum node in the tree.\n private min(): LLRBNode<K, V> {\n if (this.left.isEmpty()) {\n return this;\n } else {\n return (this.left as LLRBNode<K, V>).min();\n }\n }\n\n // Returns the maximum key in the tree.\n minKey(): K | null {\n return this.min().key;\n }\n\n // Returns the maximum key in the tree.\n maxKey(): K | null {\n if (this.right.isEmpty()) {\n return this.key;\n } else {\n return this.right.maxKey();\n }\n }\n\n // Returns new tree, with the key/value added.\n insert(key: K, value: V, comparator: Comparator<K>): LLRBNode<K, V> {\n let n: LLRBNode<K, V> = this;\n const cmp = comparator(key, n.key);\n if (cmp < 0) {\n n = n.copy(null, null, null, n.left.insert(key, value, comparator), null);\n } else if (cmp === 0) {\n n = n.copy(null, value, null, null, null);\n } else {\n n = n.copy(\n null,\n null,\n null,\n null,\n n.right.insert(key, value, comparator)\n );\n }\n return n.fixUp();\n }\n\n private removeMin(): LLRBNode<K, V> | LLRBEmptyNode<K, V> {\n if (this.left.isEmpty()) {\n return LLRBNode.EMPTY;\n }\n let n: LLRBNode<K, V> = this;\n if (!n.left.isRed() && !n.left.left.isRed()) {\n n = n.moveRedLeft();\n }\n n = n.copy(null, null, null, (n.left as LLRBNode<K, V>).removeMin(), null);\n return n.fixUp();\n }\n\n // Returns new tree, with the specified item removed.\n remove(\n key: K,\n comparator: Comparator<K>\n ): LLRBNode<K, V> | LLRBEmptyNode<K, V> {\n let smallest: LLRBNode<K, V>;\n let n: LLRBNode<K, V> = this;\n if (comparator(key, n.key) < 0) {\n if (!n.left.isEmpty() && !n.left.isRed() && !n.left.left.isRed()) {\n n = n.moveRedLeft();\n }\n n = n.copy(null, null, null, n.left.remove(key, comparator), null);\n } else {\n if (n.left.isRed()) {\n n = n.rotateRight();\n }\n if (!n.right.isEmpty() && !n.right.isRed() && !n.right.left.isRed()) {\n n = n.moveRedRight();\n }\n if (comparator(key, n.key) === 0) {\n if (n.right.isEmpty()) {\n return LLRBNode.EMPTY;\n } else {\n smallest = (n.right as LLRBNode<K, V>).min();\n n = n.copy(\n smallest.key,\n smallest.value,\n null,\n null,\n (n.right as LLRBNode<K, V>).removeMin()\n );\n }\n }\n n = n.copy(null, null, null, null, n.right.remove(key, comparator));\n }\n return n.fixUp();\n }\n\n isRed(): boolean {\n return this.color;\n }\n\n // Returns new tree after performing any needed rotations.\n private fixUp(): LLRBNode<K, V> {\n let n: LLRBNode<K, V> = this;\n if (n.right.isRed() && !n.left.isRed()) {\n n = n.rotateLeft();\n }\n if (n.left.isRed() && n.left.left.isRed()) {\n n = n.rotateRight();\n }\n if (n.left.isRed() && n.right.isRed()) {\n n = n.colorFlip();\n }\n return n;\n }\n\n private moveRedLeft(): LLRBNode<K, V> {\n let n = this.colorFlip();\n if (n.right.left.isRed()) {\n n = n.copy(\n null,\n null,\n null,\n null,\n (n.right as LLRBNode<K, V>).rotateRight()\n );\n n = n.rotateLeft();\n n = n.colorFlip();\n }\n return n;\n }\n\n private moveRedRight(): LLRBNode<K, V> {\n let n = this.colorFlip();\n if (n.left.left.isRed()) {\n n = n.rotateRight();\n n = n.colorFlip();\n }\n return n;\n }\n\n private rotateLeft(): LLRBNode<K, V> {\n const nl = this.copy(null, null, LLRBNode.RED, null, this.right.left);\n return (this.right as LLRBNode<K, V>).copy(\n null,\n null,\n this.color,\n nl,\n null\n );\n }\n\n private rotateRight(): LLRBNode<K, V> {\n const nr = this.copy(null, null, LLRBNode.RED, this.left.right, null);\n return (this.left as LLRBNode<K, V>).copy(null, null, this.color, null, nr);\n }\n\n private colorFlip(): LLRBNode<K, V> {\n const left = this.left.copy(null, null, !this.left.color, null, null);\n const right = this.right.copy(null, null, !this.right.color, null, null);\n return this.copy(null, null, !this.color, left, right);\n }\n\n // For testing.\n checkMaxDepth(): boolean {\n const blackDepth = this.check();\n if (Math.pow(2.0, blackDepth) <= this.size + 1) {\n return true;\n } else {\n return false;\n }\n }\n\n // In a balanced RB tree, the black-depth (number of black nodes) from root to\n // leaves is equal on both sides. This function verifies that or asserts.\n protected check(): number {\n if (this.isRed() && this.left.isRed()) {\n throw fail('Red node has red child(' + this.key + ',' + this.value + ')');\n }\n if (this.right.isRed()) {\n throw fail('Right child of (' + this.key + ',' + this.value + ') is red');\n }\n const blackDepth = (this.left as LLRBNode<K, V>).check();\n if (blackDepth !== (this.right as LLRBNode<K, V>).check()) {\n throw fail('Black depths differ');\n } else {\n return blackDepth + (this.isRed() ? 0 : 1);\n }\n }\n} // end LLRBNode\n\n// Represents an empty node (a leaf node in the Red-Black Tree).\nexport class LLRBEmptyNode<K, V> {\n get key(): never {\n throw fail('LLRBEmptyNode has no key.');\n }\n get value(): never {\n throw fail('LLRBEmptyNode has no value.');\n }\n get color(): never {\n throw fail('LLRBEmptyNode has no color.');\n }\n get left(): never {\n throw fail('LLRBEmptyNode has no left child.');\n }\n get right(): never {\n throw fail('LLRBEmptyNode has no right child.');\n }\n size = 0;\n\n // Returns a copy of the current node.\n copy(\n key: K | null,\n value: V | null,\n color: boolean | null,\n left: LLRBNode<K, V> | LLRBEmptyNode<K, V> | null,\n right: LLRBNode<K, V> | LLRBEmptyNode<K, V> | null\n ): LLRBEmptyNode<K, V> {\n return this;\n }\n\n // Returns a copy of the tree, with the specified key/value added.\n insert(key: K, value: V, comparator: Comparator<K>): LLRBNode<K, V> {\n return new LLRBNode<K, V>(key, value);\n }\n\n // Returns a copy of the tree, with the specified key removed.\n remove(key: K, comparator: Comparator<K>): LLRBEmptyNode<K, V> {\n return this;\n }\n\n isEmpty(): boolean {\n return true;\n }\n\n inorderTraversal(action: (k: K, v: V) => boolean): boolean {\n return false;\n }\n\n reverseTraversal(action: (k: K, v: V) => boolean): boolean {\n return false;\n }\n\n minKey(): K | null {\n return null;\n }\n\n maxKey(): K | null {\n return null;\n }\n\n isRed(): boolean {\n return false;\n }\n\n // For testing.\n checkMaxDepth(): boolean {\n return true;\n }\n\n protected check(): 0 {\n return 0;\n }\n} // end LLRBEmptyNode\n\nLLRBNode.EMPTY = new LLRBEmptyNode<unknown, unknown>();\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SortedMap, SortedMapIterator } from './sorted_map';\n\n/**\n * SortedSet is an immutable (copy-on-write) collection that holds elements\n * in order specified by the provided comparator.\n *\n * NOTE: if provided comparator returns 0 for two elements, we consider them to\n * be equal!\n */\nexport class SortedSet<T> {\n private data: SortedMap<T, boolean>;\n\n constructor(private comparator: (left: T, right: T) => number) {\n this.data = new SortedMap<T, boolean>(this.comparator);\n }\n\n has(elem: T): boolean {\n return this.data.get(elem) !== null;\n }\n\n first(): T | null {\n return this.data.minKey();\n }\n\n last(): T | null {\n return this.data.maxKey();\n }\n\n get size(): number {\n return this.data.size;\n }\n\n indexOf(elem: T): number {\n return this.data.indexOf(elem);\n }\n\n /** Iterates elements in order defined by \"comparator\" */\n forEach(cb: (elem: T) => void): void {\n this.data.inorderTraversal((k: T, v: boolean) => {\n cb(k);\n return false;\n });\n }\n\n /** Iterates over `elem`s such that: range[0] &lt;= elem &lt; range[1]. */\n forEachInRange(range: [T, T], cb: (elem: T) => void): void {\n const iter = this.data.getIteratorFrom(range[0]);\n while (iter.hasNext()) {\n const elem = iter.getNext();\n if (this.comparator(elem.key, range[1]) >= 0) {\n return;\n }\n cb(elem.key);\n }\n }\n\n /**\n * Iterates over `elem`s such that: start &lt;= elem until false is returned.\n */\n forEachWhile(cb: (elem: T) => boolean, start?: T): void {\n let iter: SortedMapIterator<T, boolean>;\n if (start !== undefined) {\n iter = this.data.getIteratorFrom(start);\n } else {\n iter = this.data.getIterator();\n }\n while (iter.hasNext()) {\n const elem = iter.getNext();\n const result = cb(elem.key);\n if (!result) {\n return;\n }\n }\n }\n\n /** Finds the least element greater than or equal to `elem`. */\n firstAfterOrEqual(elem: T): T | null {\n const iter = this.data.getIteratorFrom(elem);\n return iter.hasNext() ? iter.getNext().key : null;\n }\n\n getIterator(): SortedSetIterator<T> {\n return new SortedSetIterator<T>(this.data.getIterator());\n }\n\n getIteratorFrom(key: T): SortedSetIterator<T> {\n return new SortedSetIterator<T>(this.data.getIteratorFrom(key));\n }\n\n /** Inserts or updates an element */\n add(elem: T): SortedSet<T> {\n return this.copy(this.data.remove(elem).insert(elem, true));\n }\n\n /** Deletes an element */\n delete(elem: T): SortedSet<T> {\n if (!this.has(elem)) {\n return this;\n }\n return this.copy(this.data.remove(elem));\n }\n\n isEmpty(): boolean {\n return this.data.isEmpty();\n }\n\n unionWith(other: SortedSet<T>): SortedSet<T> {\n let result: SortedSet<T> = this;\n\n // Make sure `result` always refers to the larger one of the two sets.\n if (result.size < other.size) {\n result = other;\n other = this;\n }\n\n other.forEach(elem => {\n result = result.add(elem);\n });\n return result;\n }\n\n isEqual(other: SortedSet<T>): boolean {\n if (!(other instanceof SortedSet)) {\n return false;\n }\n if (this.size !== other.size) {\n return false;\n }\n\n const thisIt = this.data.getIterator();\n const otherIt = other.data.getIterator();\n while (thisIt.hasNext()) {\n const thisElem = thisIt.getNext().key;\n const otherElem = otherIt.getNext().key;\n if (this.comparator(thisElem, otherElem) !== 0) {\n return false;\n }\n }\n return true;\n }\n\n toArray(): T[] {\n const res: T[] = [];\n this.forEach(targetId => {\n res.push(targetId);\n });\n return res;\n }\n\n toString(): string {\n const result: T[] = [];\n this.forEach(elem => result.push(elem));\n return 'SortedSet(' + result.toString() + ')';\n }\n\n private copy(data: SortedMap<T, boolean>): SortedSet<T> {\n const result = new SortedSet(this.comparator);\n result.data = data;\n return result;\n }\n}\n\nexport class SortedSetIterator<T> {\n constructor(private iter: SortedMapIterator<T, boolean>) {}\n\n getNext(): T {\n return this.iter.getNext().key;\n }\n\n hasNext(): boolean {\n return this.iter.hasNext();\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { TargetId } from '../core/types';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { Document, MutableDocument } from './document';\nimport { DocumentKey } from './document_key';\n\n/** Miscellaneous collection types / constants. */\nexport interface DocumentSizeEntry {\n document: MutableDocument;\n size: number;\n}\n\nexport type MutableDocumentMap = SortedMap<DocumentKey, MutableDocument>;\nconst EMPTY_MUTABLE_DOCUMENT_MAP = new SortedMap<DocumentKey, MutableDocument>(\n DocumentKey.comparator\n);\nexport function mutableDocumentMap(): MutableDocumentMap {\n return EMPTY_MUTABLE_DOCUMENT_MAP;\n}\n\nexport interface DocumentSizeEntries {\n documents: MutableDocumentMap;\n sizeMap: SortedMap<DocumentKey, number>;\n}\n\nexport type DocumentMap = SortedMap<DocumentKey, Document>;\nconst EMPTY_DOCUMENT_MAP = new SortedMap<DocumentKey, Document>(\n DocumentKey.comparator\n);\nexport function documentMap(): DocumentMap {\n return EMPTY_DOCUMENT_MAP;\n}\n\nexport type DocumentVersionMap = SortedMap<DocumentKey, SnapshotVersion>;\nconst EMPTY_DOCUMENT_VERSION_MAP = new SortedMap<DocumentKey, SnapshotVersion>(\n DocumentKey.comparator\n);\nexport function documentVersionMap(): DocumentVersionMap {\n return EMPTY_DOCUMENT_VERSION_MAP;\n}\n\nexport type DocumentKeySet = SortedSet<DocumentKey>;\nconst EMPTY_DOCUMENT_KEY_SET = new SortedSet(DocumentKey.comparator);\nexport function documentKeySet(...keys: DocumentKey[]): DocumentKeySet {\n let set = EMPTY_DOCUMENT_KEY_SET;\n for (const key of keys) {\n set = set.add(key);\n }\n return set;\n}\n\nexport type TargetIdSet = SortedSet<TargetId>;\nconst EMPTY_TARGET_ID_SET = new SortedSet<TargetId>(primitiveComparator);\nexport function targetIdSet(): SortedSet<TargetId> {\n return EMPTY_TARGET_ID_SET;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { TargetId } from '../core/types';\nimport {\n documentKeySet,\n DocumentKeySet,\n mutableDocumentMap,\n MutableDocumentMap,\n targetIdSet\n} from '../model/collections';\nimport { ByteString } from '../util/byte_string';\nimport { SortedSet } from '../util/sorted_set';\n\n/**\n * An event from the RemoteStore. It is split into targetChanges (changes to the\n * state or the set of documents in our watched targets) and documentUpdates\n * (changes to the actual documents).\n */\nexport class RemoteEvent {\n constructor(\n /**\n * The snapshot version this event brings us up to, or MIN if not set.\n */\n readonly snapshotVersion: SnapshotVersion,\n /**\n * A map from target to changes to the target. See TargetChange.\n */\n readonly targetChanges: Map<TargetId, TargetChange>,\n /**\n * A set of targets that is known to be inconsistent. Listens for these\n * targets should be re-established without resume tokens.\n */\n readonly targetMismatches: SortedSet<TargetId>,\n /**\n * A set of which documents have changed or been deleted, along with the\n * doc's new values (if not deleted).\n */\n readonly documentUpdates: MutableDocumentMap,\n /**\n * A set of which document updates are due only to limbo resolution targets.\n */\n readonly resolvedLimboDocuments: DocumentKeySet\n ) {}\n\n /**\n * HACK: Views require RemoteEvents in order to determine whether the view is\n * CURRENT, but secondary tabs don't receive remote events. So this method is\n * used to create a synthesized RemoteEvent that can be used to apply a\n * CURRENT status change to a View, for queries executed in a different tab.\n */\n // PORTING NOTE: Multi-tab only\n static createSynthesizedRemoteEventForCurrentChange(\n targetId: TargetId,\n current: boolean\n ): RemoteEvent {\n const targetChanges = new Map<TargetId, TargetChange>();\n targetChanges.set(\n targetId,\n TargetChange.createSynthesizedTargetChangeForCurrentChange(\n targetId,\n current\n )\n );\n return new RemoteEvent(\n SnapshotVersion.min(),\n targetChanges,\n targetIdSet(),\n mutableDocumentMap(),\n documentKeySet()\n );\n }\n}\n\n/**\n * A TargetChange specifies the set of changes for a specific target as part of\n * a RemoteEvent. These changes track which documents are added, modified or\n * removed, as well as the target's resume token and whether the target is\n * marked CURRENT.\n * The actual changes *to* documents are not part of the TargetChange since\n * documents may be part of multiple targets.\n */\nexport class TargetChange {\n constructor(\n /**\n * An opaque, server-assigned token that allows watching a query to be resumed\n * after disconnecting without retransmitting all the data that matches the\n * query. The resume token essentially identifies a point in time from which\n * the server should resume sending results.\n */\n readonly resumeToken: ByteString,\n /**\n * The \"current\" (synced) status of this target. Note that \"current\"\n * has special meaning in the RPC protocol that implies that a target is\n * both up-to-date and consistent with the rest of the watch stream.\n */\n readonly current: boolean,\n /**\n * The set of documents that were newly assigned to this target as part of\n * this remote event.\n */\n readonly addedDocuments: DocumentKeySet,\n /**\n * The set of documents that were already assigned to this target but received\n * an update during this remote event.\n */\n readonly modifiedDocuments: DocumentKeySet,\n /**\n * The set of documents that were removed from this target as part of this\n * remote event.\n */\n readonly removedDocuments: DocumentKeySet\n ) {}\n\n /**\n * This method is used to create a synthesized TargetChanges that can be used to\n * apply a CURRENT status change to a View (for queries executed in a different\n * tab) or for new queries (to raise snapshots with correct CURRENT status).\n */\n static createSynthesizedTargetChangeForCurrentChange(\n targetId: TargetId,\n current: boolean\n ): TargetChange {\n return new TargetChange(\n ByteString.EMPTY_BYTE_STRING,\n current,\n documentKeySet(),\n documentKeySet(),\n documentKeySet()\n );\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { isDocumentTarget } from '../core/target';\nimport { TargetId } from '../core/types';\nimport { ChangeType } from '../core/view_snapshot';\nimport { TargetData, TargetPurpose } from '../local/target_data';\nimport {\n documentKeySet,\n DocumentKeySet,\n mutableDocumentMap\n} from '../model/collections';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { debugAssert, fail, hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { FirestoreError } from '../util/error';\nimport { logDebug } from '../util/log';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { ExistenceFilter } from './existence_filter';\nimport { RemoteEvent, TargetChange } from './remote_event';\n\n/**\n * Internal representation of the watcher API protocol buffers.\n */\nexport type WatchChange =\n | DocumentWatchChange\n | WatchTargetChange\n | ExistenceFilterChange;\n\n/**\n * Represents a changed document and a list of target ids to which this change\n * applies.\n *\n * If document has been deleted NoDocument will be provided.\n */\nexport class DocumentWatchChange {\n constructor(\n /** The new document applies to all of these targets. */\n public updatedTargetIds: TargetId[],\n /** The new document is removed from all of these targets. */\n public removedTargetIds: TargetId[],\n /** The key of the document for this change. */\n public key: DocumentKey,\n /**\n * The new document or NoDocument if it was deleted. Is null if the\n * document went out of view without the server sending a new document.\n */\n public newDoc: MutableDocument | null\n ) {}\n}\n\nexport class ExistenceFilterChange {\n constructor(\n public targetId: TargetId,\n public existenceFilter: ExistenceFilter\n ) {}\n}\n\nexport const enum WatchTargetChangeState {\n NoChange,\n Added,\n Removed,\n Current,\n Reset\n}\n\nexport class WatchTargetChange {\n constructor(\n /** What kind of change occurred to the watch target. */\n public state: WatchTargetChangeState,\n /** The target IDs that were added/removed/set. */\n public targetIds: TargetId[],\n /**\n * An opaque, server-assigned token that allows watching a target to be\n * resumed after disconnecting without retransmitting all the data that\n * matches the target. The resume token essentially identifies a point in\n * time from which the server should resume sending results.\n */\n public resumeToken: ByteString = ByteString.EMPTY_BYTE_STRING,\n /** An RPC error indicating why the watch failed. */\n public cause: FirestoreError | null = null\n ) {}\n}\n\n/** Tracks the internal state of a Watch target. */\nclass TargetState {\n /**\n * The number of pending responses (adds or removes) that we are waiting on.\n * We only consider targets active that have no pending responses.\n */\n private pendingResponses = 0;\n\n /**\n * Keeps track of the document changes since the last raised snapshot.\n *\n * These changes are continuously updated as we receive document updates and\n * always reflect the current set of changes against the last issued snapshot.\n */\n private documentChanges: SortedMap<\n DocumentKey,\n ChangeType\n > = snapshotChangesMap();\n\n /** See public getters for explanations of these fields. */\n private _resumeToken: ByteString = ByteString.EMPTY_BYTE_STRING;\n private _current = false;\n\n /**\n * Whether this target state should be included in the next snapshot. We\n * initialize to true so that newly-added targets are included in the next\n * RemoteEvent.\n */\n private _hasPendingChanges = true;\n\n /**\n * Whether this target has been marked 'current'.\n *\n * 'Current' has special meaning in the RPC protocol: It implies that the\n * Watch backend has sent us all changes up to the point at which the target\n * was added and that the target is consistent with the rest of the watch\n * stream.\n */\n get current(): boolean {\n return this._current;\n }\n\n /** The last resume token sent to us for this target. */\n get resumeToken(): ByteString {\n return this._resumeToken;\n }\n\n /** Whether this target has pending target adds or target removes. */\n get isPending(): boolean {\n return this.pendingResponses !== 0;\n }\n\n /** Whether we have modified any state that should trigger a snapshot. */\n get hasPendingChanges(): boolean {\n return this._hasPendingChanges;\n }\n\n /**\n * Applies the resume token to the TargetChange, but only when it has a new\n * value. Empty resumeTokens are discarded.\n */\n updateResumeToken(resumeToken: ByteString): void {\n if (resumeToken.approximateByteSize() > 0) {\n this._hasPendingChanges = true;\n this._resumeToken = resumeToken;\n }\n }\n\n /**\n * Creates a target change from the current set of changes.\n *\n * To reset the document changes after raising this snapshot, call\n * `clearPendingChanges()`.\n */\n toTargetChange(): TargetChange {\n let addedDocuments = documentKeySet();\n let modifiedDocuments = documentKeySet();\n let removedDocuments = documentKeySet();\n\n this.documentChanges.forEach((key, changeType) => {\n switch (changeType) {\n case ChangeType.Added:\n addedDocuments = addedDocuments.add(key);\n break;\n case ChangeType.Modified:\n modifiedDocuments = modifiedDocuments.add(key);\n break;\n case ChangeType.Removed:\n removedDocuments = removedDocuments.add(key);\n break;\n default:\n fail('Encountered invalid change type: ' + changeType);\n }\n });\n\n return new TargetChange(\n this._resumeToken,\n this._current,\n addedDocuments,\n modifiedDocuments,\n removedDocuments\n );\n }\n\n /**\n * Resets the document changes and sets `hasPendingChanges` to false.\n */\n clearPendingChanges(): void {\n this._hasPendingChanges = false;\n this.documentChanges = snapshotChangesMap();\n }\n\n addDocumentChange(key: DocumentKey, changeType: ChangeType): void {\n this._hasPendingChanges = true;\n this.documentChanges = this.documentChanges.insert(key, changeType);\n }\n\n removeDocumentChange(key: DocumentKey): void {\n this._hasPendingChanges = true;\n this.documentChanges = this.documentChanges.remove(key);\n }\n\n recordPendingTargetRequest(): void {\n this.pendingResponses += 1;\n }\n\n recordTargetResponse(): void {\n this.pendingResponses -= 1;\n }\n\n markCurrent(): void {\n this._hasPendingChanges = true;\n this._current = true;\n }\n}\n\n/**\n * Interface implemented by RemoteStore to expose target metadata to the\n * WatchChangeAggregator.\n */\nexport interface TargetMetadataProvider {\n /**\n * Returns the set of remote document keys for the given target ID as of the\n * last raised snapshot.\n */\n getRemoteKeysForTarget(targetId: TargetId): DocumentKeySet;\n\n /**\n * Returns the TargetData for an active target ID or 'null' if this target\n * has become inactive\n */\n getTargetDataForTarget(targetId: TargetId): TargetData | null;\n}\n\nconst LOG_TAG = 'WatchChangeAggregator';\n\n/**\n * A helper class to accumulate watch changes into a RemoteEvent.\n */\nexport class WatchChangeAggregator {\n constructor(private metadataProvider: TargetMetadataProvider) {}\n\n /** The internal state of all tracked targets. */\n private targetStates = new Map<TargetId, TargetState>();\n\n /** Keeps track of the documents to update since the last raised snapshot. */\n private pendingDocumentUpdates = mutableDocumentMap();\n\n /** A mapping of document keys to their set of target IDs. */\n private pendingDocumentTargetMapping = documentTargetMap();\n\n /**\n * A list of targets with existence filter mismatches. These targets are\n * known to be inconsistent and their listens needs to be re-established by\n * RemoteStore.\n */\n private pendingTargetResets = new SortedSet<TargetId>(primitiveComparator);\n\n /**\n * Processes and adds the DocumentWatchChange to the current set of changes.\n */\n handleDocumentChange(docChange: DocumentWatchChange): void {\n for (const targetId of docChange.updatedTargetIds) {\n if (docChange.newDoc && docChange.newDoc.isFoundDocument()) {\n this.addDocumentToTarget(targetId, docChange.newDoc);\n } else {\n this.removeDocumentFromTarget(\n targetId,\n docChange.key,\n docChange.newDoc\n );\n }\n }\n\n for (const targetId of docChange.removedTargetIds) {\n this.removeDocumentFromTarget(targetId, docChange.key, docChange.newDoc);\n }\n }\n\n /** Processes and adds the WatchTargetChange to the current set of changes. */\n handleTargetChange(targetChange: WatchTargetChange): void {\n this.forEachTarget(targetChange, targetId => {\n const targetState = this.ensureTargetState(targetId);\n switch (targetChange.state) {\n case WatchTargetChangeState.NoChange:\n if (this.isActiveTarget(targetId)) {\n targetState.updateResumeToken(targetChange.resumeToken);\n }\n break;\n case WatchTargetChangeState.Added:\n // We need to decrement the number of pending acks needed from watch\n // for this targetId.\n targetState.recordTargetResponse();\n if (!targetState.isPending) {\n // We have a freshly added target, so we need to reset any state\n // that we had previously. This can happen e.g. when remove and add\n // back a target for existence filter mismatches.\n targetState.clearPendingChanges();\n }\n targetState.updateResumeToken(targetChange.resumeToken);\n break;\n case WatchTargetChangeState.Removed:\n // We need to keep track of removed targets to we can post-filter and\n // remove any target changes.\n // We need to decrement the number of pending acks needed from watch\n // for this targetId.\n targetState.recordTargetResponse();\n if (!targetState.isPending) {\n this.removeTarget(targetId);\n }\n debugAssert(\n !targetChange.cause,\n 'WatchChangeAggregator does not handle errored targets'\n );\n break;\n case WatchTargetChangeState.Current:\n if (this.isActiveTarget(targetId)) {\n targetState.markCurrent();\n targetState.updateResumeToken(targetChange.resumeToken);\n }\n break;\n case WatchTargetChangeState.Reset:\n if (this.isActiveTarget(targetId)) {\n // Reset the target and synthesizes removes for all existing\n // documents. The backend will re-add any documents that still\n // match the target before it sends the next global snapshot.\n this.resetTarget(targetId);\n targetState.updateResumeToken(targetChange.resumeToken);\n }\n break;\n default:\n fail('Unknown target watch change state: ' + targetChange.state);\n }\n });\n }\n\n /**\n * Iterates over all targetIds that the watch change applies to: either the\n * targetIds explicitly listed in the change or the targetIds of all currently\n * active targets.\n */\n forEachTarget(\n targetChange: WatchTargetChange,\n fn: (targetId: TargetId) => void\n ): void {\n if (targetChange.targetIds.length > 0) {\n targetChange.targetIds.forEach(fn);\n } else {\n this.targetStates.forEach((_, targetId) => {\n if (this.isActiveTarget(targetId)) {\n fn(targetId);\n }\n });\n }\n }\n\n /**\n * Handles existence filters and synthesizes deletes for filter mismatches.\n * Targets that are invalidated by filter mismatches are added to\n * `pendingTargetResets`.\n */\n handleExistenceFilter(watchChange: ExistenceFilterChange): void {\n const targetId = watchChange.targetId;\n const expectedCount = watchChange.existenceFilter.count;\n\n const targetData = this.targetDataForActiveTarget(targetId);\n if (targetData) {\n const target = targetData.target;\n if (isDocumentTarget(target)) {\n if (expectedCount === 0) {\n // The existence filter told us the document does not exist. We deduce\n // that this document does not exist and apply a deleted document to\n // our updates. Without applying this deleted document there might be\n // another query that will raise this document as part of a snapshot\n // until it is resolved, essentially exposing inconsistency between\n // queries.\n const key = new DocumentKey(target.path);\n this.removeDocumentFromTarget(\n targetId,\n key,\n MutableDocument.newNoDocument(key, SnapshotVersion.min())\n );\n } else {\n hardAssert(\n expectedCount === 1,\n 'Single document existence filter with count: ' + expectedCount\n );\n }\n } else {\n const currentSize = this.getCurrentDocumentCountForTarget(targetId);\n if (currentSize !== expectedCount) {\n // Existence filter mismatch: We reset the mapping and raise a new\n // snapshot with `isFromCache:true`.\n this.resetTarget(targetId);\n this.pendingTargetResets = this.pendingTargetResets.add(targetId);\n }\n }\n }\n }\n\n /**\n * Converts the currently accumulated state into a remote event at the\n * provided snapshot version. Resets the accumulated changes before returning.\n */\n createRemoteEvent(snapshotVersion: SnapshotVersion): RemoteEvent {\n const targetChanges = new Map<TargetId, TargetChange>();\n\n this.targetStates.forEach((targetState, targetId) => {\n const targetData = this.targetDataForActiveTarget(targetId);\n if (targetData) {\n if (targetState.current && isDocumentTarget(targetData.target)) {\n // Document queries for document that don't exist can produce an empty\n // result set. To update our local cache, we synthesize a document\n // delete if we have not previously received the document. This\n // resolves the limbo state of the document, removing it from\n // limboDocumentRefs.\n //\n // TODO(dimond): Ideally we would have an explicit lookup target\n // instead resulting in an explicit delete message and we could\n // remove this special logic.\n const key = new DocumentKey(targetData.target.path);\n if (\n this.pendingDocumentUpdates.get(key) === null &&\n !this.targetContainsDocument(targetId, key)\n ) {\n this.removeDocumentFromTarget(\n targetId,\n key,\n MutableDocument.newNoDocument(key, snapshotVersion)\n );\n }\n }\n\n if (targetState.hasPendingChanges) {\n targetChanges.set(targetId, targetState.toTargetChange());\n targetState.clearPendingChanges();\n }\n }\n });\n\n let resolvedLimboDocuments = documentKeySet();\n\n // We extract the set of limbo-only document updates as the GC logic\n // special-cases documents that do not appear in the target cache.\n //\n // TODO(gsoltis): Expand on this comment once GC is available in the JS\n // client.\n this.pendingDocumentTargetMapping.forEach((key, targets) => {\n let isOnlyLimboTarget = true;\n\n targets.forEachWhile(targetId => {\n const targetData = this.targetDataForActiveTarget(targetId);\n if (\n targetData &&\n targetData.purpose !== TargetPurpose.LimboResolution\n ) {\n isOnlyLimboTarget = false;\n return false;\n }\n\n return true;\n });\n\n if (isOnlyLimboTarget) {\n resolvedLimboDocuments = resolvedLimboDocuments.add(key);\n }\n });\n\n const remoteEvent = new RemoteEvent(\n snapshotVersion,\n targetChanges,\n this.pendingTargetResets,\n this.pendingDocumentUpdates,\n resolvedLimboDocuments\n );\n\n this.pendingDocumentUpdates = mutableDocumentMap();\n this.pendingDocumentTargetMapping = documentTargetMap();\n this.pendingTargetResets = new SortedSet<TargetId>(primitiveComparator);\n\n return remoteEvent;\n }\n\n /**\n * Adds the provided document to the internal list of document updates and\n * its document key to the given target's mapping.\n */\n // Visible for testing.\n addDocumentToTarget(targetId: TargetId, document: MutableDocument): void {\n if (!this.isActiveTarget(targetId)) {\n return;\n }\n\n const changeType = this.targetContainsDocument(targetId, document.key)\n ? ChangeType.Modified\n : ChangeType.Added;\n\n const targetState = this.ensureTargetState(targetId);\n targetState.addDocumentChange(document.key, changeType);\n\n this.pendingDocumentUpdates = this.pendingDocumentUpdates.insert(\n document.key,\n document\n );\n\n this.pendingDocumentTargetMapping = this.pendingDocumentTargetMapping.insert(\n document.key,\n this.ensureDocumentTargetMapping(document.key).add(targetId)\n );\n }\n\n /**\n * Removes the provided document from the target mapping. If the\n * document no longer matches the target, but the document's state is still\n * known (e.g. we know that the document was deleted or we received the change\n * that caused the filter mismatch), the new document can be provided\n * to update the remote document cache.\n */\n // Visible for testing.\n removeDocumentFromTarget(\n targetId: TargetId,\n key: DocumentKey,\n updatedDocument: MutableDocument | null\n ): void {\n if (!this.isActiveTarget(targetId)) {\n return;\n }\n\n const targetState = this.ensureTargetState(targetId);\n if (this.targetContainsDocument(targetId, key)) {\n targetState.addDocumentChange(key, ChangeType.Removed);\n } else {\n // The document may have entered and left the target before we raised a\n // snapshot, so we can just ignore the change.\n targetState.removeDocumentChange(key);\n }\n\n this.pendingDocumentTargetMapping = this.pendingDocumentTargetMapping.insert(\n key,\n this.ensureDocumentTargetMapping(key).delete(targetId)\n );\n\n if (updatedDocument) {\n this.pendingDocumentUpdates = this.pendingDocumentUpdates.insert(\n key,\n updatedDocument\n );\n }\n }\n\n removeTarget(targetId: TargetId): void {\n this.targetStates.delete(targetId);\n }\n\n /**\n * Returns the current count of documents in the target. This includes both\n * the number of documents that the LocalStore considers to be part of the\n * target as well as any accumulated changes.\n */\n private getCurrentDocumentCountForTarget(targetId: TargetId): number {\n const targetState = this.ensureTargetState(targetId);\n const targetChange = targetState.toTargetChange();\n return (\n this.metadataProvider.getRemoteKeysForTarget(targetId).size +\n targetChange.addedDocuments.size -\n targetChange.removedDocuments.size\n );\n }\n\n /**\n * Increment the number of acks needed from watch before we can consider the\n * server to be 'in-sync' with the client's active targets.\n */\n recordPendingTargetRequest(targetId: TargetId): void {\n // For each request we get we need to record we need a response for it.\n const targetState = this.ensureTargetState(targetId);\n targetState.recordPendingTargetRequest();\n }\n\n private ensureTargetState(targetId: TargetId): TargetState {\n let result = this.targetStates.get(targetId);\n if (!result) {\n result = new TargetState();\n this.targetStates.set(targetId, result);\n }\n return result;\n }\n\n private ensureDocumentTargetMapping(key: DocumentKey): SortedSet<TargetId> {\n let targetMapping = this.pendingDocumentTargetMapping.get(key);\n\n if (!targetMapping) {\n targetMapping = new SortedSet<TargetId>(primitiveComparator);\n this.pendingDocumentTargetMapping = this.pendingDocumentTargetMapping.insert(\n key,\n targetMapping\n );\n }\n\n return targetMapping;\n }\n\n /**\n * Verifies that the user is still interested in this target (by calling\n * `getTargetDataForTarget()`) and that we are not waiting for pending ADDs\n * from watch.\n */\n protected isActiveTarget(targetId: TargetId): boolean {\n const targetActive = this.targetDataForActiveTarget(targetId) !== null;\n if (!targetActive) {\n logDebug(LOG_TAG, 'Detected inactive target', targetId);\n }\n return targetActive;\n }\n\n /**\n * Returns the TargetData for an active target (i.e. a target that the user\n * is still interested in that has no outstanding target change requests).\n */\n protected targetDataForActiveTarget(targetId: TargetId): TargetData | null {\n const targetState = this.targetStates.get(targetId);\n return targetState && targetState.isPending\n ? null\n : this.metadataProvider.getTargetDataForTarget(targetId);\n }\n\n /**\n * Resets the state of a Watch target to its initial state (e.g. sets\n * 'current' to false, clears the resume token and removes its target mapping\n * from all documents).\n */\n private resetTarget(targetId: TargetId): void {\n debugAssert(\n !this.targetStates.get(targetId)!.isPending,\n 'Should only reset active targets'\n );\n this.targetStates.set(targetId, new TargetState());\n\n // Trigger removal for any documents currently mapped to this target.\n // These removals will be part of the initial snapshot if Watch does not\n // resend these documents.\n const existingKeys = this.metadataProvider.getRemoteKeysForTarget(targetId);\n existingKeys.forEach(key => {\n this.removeDocumentFromTarget(targetId, key, /*updatedDocument=*/ null);\n });\n }\n /**\n * Returns whether the LocalStore considers the document to be part of the\n * specified target.\n */\n private targetContainsDocument(\n targetId: TargetId,\n key: DocumentKey\n ): boolean {\n const existingKeys = this.metadataProvider.getRemoteKeysForTarget(targetId);\n return existingKeys.has(key);\n }\n}\n\nfunction documentTargetMap(): SortedMap<DocumentKey, SortedSet<TargetId>> {\n return new SortedMap<DocumentKey, SortedSet<TargetId>>(\n DocumentKey.comparator\n );\n}\n\nfunction snapshotChangesMap(): SortedMap<DocumentKey, ChangeType> {\n return new SortedMap<DocumentKey, ChangeType>(DocumentKey.comparator);\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseId } from '../core/database_info';\nimport {\n LimitType,\n newQuery,\n newQueryForPath,\n Query,\n queryToTarget\n} from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport {\n Bound,\n Direction,\n FieldFilter,\n Filter,\n isDocumentTarget,\n Operator,\n OrderBy,\n Target\n} from '../core/target';\nimport { TargetId } from '../core/types';\nimport { Timestamp } from '../lite/timestamp';\nimport { TargetData, TargetPurpose } from '../local/target_data';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldMask } from '../model/field_mask';\nimport {\n DeleteMutation,\n FieldTransform,\n Mutation,\n MutationResult,\n PatchMutation,\n Precondition,\n SetMutation,\n VerifyMutation\n} from '../model/mutation';\nimport { normalizeTimestamp } from '../model/normalize';\nimport { ObjectValue } from '../model/object_value';\nimport { FieldPath, ResourcePath } from '../model/path';\nimport {\n ArrayRemoveTransformOperation,\n ArrayUnionTransformOperation,\n NumericIncrementTransformOperation,\n ServerTimestampTransform,\n TransformOperation\n} from '../model/transform_operation';\nimport { isNanValue, isNullValue } from '../model/values';\nimport {\n ApiClientObjectMap as ProtoApiClientObjectMap,\n BatchGetDocumentsResponse as ProtoBatchGetDocumentsResponse,\n Cursor as ProtoCursor,\n Document as ProtoDocument,\n DocumentMask as ProtoDocumentMask,\n DocumentsTarget as ProtoDocumentsTarget,\n FieldFilterOp as ProtoFieldFilterOp,\n FieldReference as ProtoFieldReference,\n FieldTransform as ProtoFieldTransform,\n Filter as ProtoFilter,\n ListenResponse as ProtoListenResponse,\n Order as ProtoOrder,\n OrderDirection as ProtoOrderDirection,\n Precondition as ProtoPrecondition,\n QueryTarget as ProtoQueryTarget,\n Status as ProtoStatus,\n Target as ProtoTarget,\n TargetChangeTargetChangeType as ProtoTargetChangeTargetChangeType,\n Timestamp as ProtoTimestamp,\n Write as ProtoWrite,\n WriteResult as ProtoWriteResult\n} from '../protos/firestore_proto_api';\nimport { debugAssert, fail, hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { Code, FirestoreError } from '../util/error';\nimport { isNullOrUndefined } from '../util/types';\n\nimport { ExistenceFilter } from './existence_filter';\nimport { Serializer } from './number_serializer';\nimport { mapCodeFromRpcCode } from './rpc_error';\nimport {\n DocumentWatchChange,\n ExistenceFilterChange,\n WatchChange,\n WatchTargetChange,\n WatchTargetChangeState\n} from './watch_change';\n\nconst DIRECTIONS = (() => {\n const dirs: { [dir: string]: ProtoOrderDirection } = {};\n dirs[Direction.ASCENDING] = 'ASCENDING';\n dirs[Direction.DESCENDING] = 'DESCENDING';\n return dirs;\n})();\n\nconst OPERATORS = (() => {\n const ops: { [op: string]: ProtoFieldFilterOp } = {};\n ops[Operator.LESS_THAN] = 'LESS_THAN';\n ops[Operator.LESS_THAN_OR_EQUAL] = 'LESS_THAN_OR_EQUAL';\n ops[Operator.GREATER_THAN] = 'GREATER_THAN';\n ops[Operator.GREATER_THAN_OR_EQUAL] = 'GREATER_THAN_OR_EQUAL';\n ops[Operator.EQUAL] = 'EQUAL';\n ops[Operator.NOT_EQUAL] = 'NOT_EQUAL';\n ops[Operator.ARRAY_CONTAINS] = 'ARRAY_CONTAINS';\n ops[Operator.IN] = 'IN';\n ops[Operator.NOT_IN] = 'NOT_IN';\n ops[Operator.ARRAY_CONTAINS_ANY] = 'ARRAY_CONTAINS_ANY';\n return ops;\n})();\n\nfunction assertPresent(value: unknown, description: string): asserts value {\n debugAssert(!isNullOrUndefined(value), description + ' is missing');\n}\n\n/**\n * This class generates JsonObject values for the Datastore API suitable for\n * sending to either GRPC stub methods or via the JSON/HTTP REST API.\n *\n * The serializer supports both Protobuf.js and Proto3 JSON formats. By\n * setting `useProto3Json` to true, the serializer will use the Proto3 JSON\n * format.\n *\n * For a description of the Proto3 JSON format check\n * https://developers.google.com/protocol-buffers/docs/proto3#json\n *\n * TODO(klimt): We can remove the databaseId argument if we keep the full\n * resource name in documents.\n */\nexport class JsonProtoSerializer implements Serializer {\n constructor(\n readonly databaseId: DatabaseId,\n readonly useProto3Json: boolean\n ) {}\n}\n\nfunction fromRpcStatus(status: ProtoStatus): FirestoreError {\n const code =\n status.code === undefined ? Code.UNKNOWN : mapCodeFromRpcCode(status.code);\n return new FirestoreError(code, status.message || '');\n}\n\n/**\n * Returns a value for a number (or null) that's appropriate to put into\n * a google.protobuf.Int32Value proto.\n * DO NOT USE THIS FOR ANYTHING ELSE.\n * This method cheats. It's typed as returning \"number\" because that's what\n * our generated proto interfaces say Int32Value must be. But GRPC actually\n * expects a { value: <number> } struct.\n */\nfunction toInt32Proto(\n serializer: JsonProtoSerializer,\n val: number | null\n): number | { value: number } | null {\n if (serializer.useProto3Json || isNullOrUndefined(val)) {\n return val;\n } else {\n return { value: val };\n }\n}\n\n/**\n * Returns a number (or null) from a google.protobuf.Int32Value proto.\n */\nfunction fromInt32Proto(\n val: number | { value: number } | undefined\n): number | null {\n let result;\n if (typeof val === 'object') {\n result = val.value;\n } else {\n result = val;\n }\n return isNullOrUndefined(result) ? null : result;\n}\n\n/**\n * Returns a value for a Date that's appropriate to put into a proto.\n */\nexport function toTimestamp(\n serializer: JsonProtoSerializer,\n timestamp: Timestamp\n): ProtoTimestamp {\n if (serializer.useProto3Json) {\n // Serialize to ISO-8601 date format, but with full nano resolution.\n // Since JS Date has only millis, let's only use it for the seconds and\n // then manually add the fractions to the end.\n const jsDateStr = new Date(timestamp.seconds * 1000).toISOString();\n // Remove .xxx frac part and Z in the end.\n const strUntilSeconds = jsDateStr.replace(/\\.\\d*/, '').replace('Z', '');\n // Pad the fraction out to 9 digits (nanos).\n const nanoStr = ('000000000' + timestamp.nanoseconds).slice(-9);\n\n return `${strUntilSeconds}.${nanoStr}Z`;\n } else {\n return {\n seconds: '' + timestamp.seconds,\n nanos: timestamp.nanoseconds\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n }\n}\n\nfunction fromTimestamp(date: ProtoTimestamp): Timestamp {\n const timestamp = normalizeTimestamp(date);\n return new Timestamp(timestamp.seconds, timestamp.nanos);\n}\n\n/**\n * Returns a value for bytes that's appropriate to put in a proto.\n *\n * Visible for testing.\n */\nexport function toBytes(\n serializer: JsonProtoSerializer,\n bytes: ByteString\n): string | Uint8Array {\n if (serializer.useProto3Json) {\n return bytes.toBase64();\n } else {\n return bytes.toUint8Array();\n }\n}\n\n/**\n * Returns a ByteString based on the proto string value.\n */\nexport function fromBytes(\n serializer: JsonProtoSerializer,\n value: string | Uint8Array | undefined\n): ByteString {\n if (serializer.useProto3Json) {\n hardAssert(\n value === undefined || typeof value === 'string',\n 'value must be undefined or a string when using proto3 Json'\n );\n return ByteString.fromBase64String(value ? value : '');\n } else {\n hardAssert(\n value === undefined || value instanceof Uint8Array,\n 'value must be undefined or Uint8Array'\n );\n return ByteString.fromUint8Array(value ? value : new Uint8Array());\n }\n}\n\nexport function toVersion(\n serializer: JsonProtoSerializer,\n version: SnapshotVersion\n): ProtoTimestamp {\n return toTimestamp(serializer, version.toTimestamp());\n}\n\nexport function fromVersion(version: ProtoTimestamp): SnapshotVersion {\n hardAssert(!!version, \"Trying to deserialize version that isn't set\");\n return SnapshotVersion.fromTimestamp(fromTimestamp(version));\n}\n\nexport function toResourceName(\n databaseId: DatabaseId,\n path: ResourcePath\n): string {\n return fullyQualifiedPrefixPath(databaseId)\n .child('documents')\n .child(path)\n .canonicalString();\n}\n\nfunction fromResourceName(name: string): ResourcePath {\n const resource = ResourcePath.fromString(name);\n hardAssert(\n isValidResourceName(resource),\n 'Tried to deserialize invalid key ' + resource.toString()\n );\n return resource;\n}\n\nexport function toName(\n serializer: JsonProtoSerializer,\n key: DocumentKey\n): string {\n return toResourceName(serializer.databaseId, key.path);\n}\n\nexport function fromName(\n serializer: JsonProtoSerializer,\n name: string\n): DocumentKey {\n const resource = fromResourceName(name);\n\n if (resource.get(1) !== serializer.databaseId.projectId) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Tried to deserialize key from different project: ' +\n resource.get(1) +\n ' vs ' +\n serializer.databaseId.projectId\n );\n }\n\n if (resource.get(3) !== serializer.databaseId.database) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Tried to deserialize key from different database: ' +\n resource.get(3) +\n ' vs ' +\n serializer.databaseId.database\n );\n }\n return new DocumentKey(extractLocalPathFromResourceName(resource));\n}\n\nfunction toQueryPath(\n serializer: JsonProtoSerializer,\n path: ResourcePath\n): string {\n return toResourceName(serializer.databaseId, path);\n}\n\nfunction fromQueryPath(name: string): ResourcePath {\n const resourceName = fromResourceName(name);\n // In v1beta1 queries for collections at the root did not have a trailing\n // \"/documents\". In v1 all resource paths contain \"/documents\". Preserve the\n // ability to read the v1beta1 form for compatibility with queries persisted\n // in the local target cache.\n if (resourceName.length === 4) {\n return ResourcePath.emptyPath();\n }\n return extractLocalPathFromResourceName(resourceName);\n}\n\nexport function getEncodedDatabaseId(serializer: JsonProtoSerializer): string {\n const path = new ResourcePath([\n 'projects',\n serializer.databaseId.projectId,\n 'databases',\n serializer.databaseId.database\n ]);\n return path.canonicalString();\n}\n\nfunction fullyQualifiedPrefixPath(databaseId: DatabaseId): ResourcePath {\n return new ResourcePath([\n 'projects',\n databaseId.projectId,\n 'databases',\n databaseId.database\n ]);\n}\n\nfunction extractLocalPathFromResourceName(\n resourceName: ResourcePath\n): ResourcePath {\n hardAssert(\n resourceName.length > 4 && resourceName.get(4) === 'documents',\n 'tried to deserialize invalid key ' + resourceName.toString()\n );\n return resourceName.popFirst(5);\n}\n\n/** Creates a Document proto from key and fields (but no create/update time) */\nexport function toMutationDocument(\n serializer: JsonProtoSerializer,\n key: DocumentKey,\n fields: ObjectValue\n): ProtoDocument {\n return {\n name: toName(serializer, key),\n fields: fields.value.mapValue.fields\n };\n}\n\nexport function toDocument(\n serializer: JsonProtoSerializer,\n document: MutableDocument\n): ProtoDocument {\n debugAssert(\n !document.hasLocalMutations,\n \"Can't serialize documents with mutations.\"\n );\n return {\n name: toName(serializer, document.key),\n fields: document.data.value.mapValue.fields,\n updateTime: toTimestamp(serializer, document.version.toTimestamp())\n };\n}\n\nexport function fromDocument(\n serializer: JsonProtoSerializer,\n document: ProtoDocument,\n hasCommittedMutations?: boolean\n): MutableDocument {\n const key = fromName(serializer, document.name!);\n const version = fromVersion(document.updateTime!);\n const data = new ObjectValue({ mapValue: { fields: document.fields } });\n const result = MutableDocument.newFoundDocument(key, version, data);\n if (hasCommittedMutations) {\n result.setHasCommittedMutations();\n }\n return hasCommittedMutations ? result.setHasCommittedMutations() : result;\n}\n\nfunction fromFound(\n serializer: JsonProtoSerializer,\n doc: ProtoBatchGetDocumentsResponse\n): MutableDocument {\n hardAssert(\n !!doc.found,\n 'Tried to deserialize a found document from a missing document.'\n );\n assertPresent(doc.found.name, 'doc.found.name');\n assertPresent(doc.found.updateTime, 'doc.found.updateTime');\n const key = fromName(serializer, doc.found.name);\n const version = fromVersion(doc.found.updateTime);\n const data = new ObjectValue({ mapValue: { fields: doc.found.fields } });\n return MutableDocument.newFoundDocument(key, version, data);\n}\n\nfunction fromMissing(\n serializer: JsonProtoSerializer,\n result: ProtoBatchGetDocumentsResponse\n): MutableDocument {\n hardAssert(\n !!result.missing,\n 'Tried to deserialize a missing document from a found document.'\n );\n hardAssert(\n !!result.readTime,\n 'Tried to deserialize a missing document without a read time.'\n );\n const key = fromName(serializer, result.missing);\n const version = fromVersion(result.readTime);\n return MutableDocument.newNoDocument(key, version);\n}\n\nexport function fromBatchGetDocumentsResponse(\n serializer: JsonProtoSerializer,\n result: ProtoBatchGetDocumentsResponse\n): MutableDocument {\n if ('found' in result) {\n return fromFound(serializer, result);\n } else if ('missing' in result) {\n return fromMissing(serializer, result);\n }\n return fail('invalid batch get response: ' + JSON.stringify(result));\n}\n\nexport function fromWatchChange(\n serializer: JsonProtoSerializer,\n change: ProtoListenResponse\n): WatchChange {\n let watchChange: WatchChange;\n if ('targetChange' in change) {\n assertPresent(change.targetChange, 'targetChange');\n // proto3 default value is unset in JSON (undefined), so use 'NO_CHANGE'\n // if unset\n const state = fromWatchTargetChangeState(\n change.targetChange.targetChangeType || 'NO_CHANGE'\n );\n const targetIds: TargetId[] = change.targetChange.targetIds || [];\n\n const resumeToken = fromBytes(serializer, change.targetChange.resumeToken);\n const causeProto = change.targetChange!.cause;\n const cause = causeProto && fromRpcStatus(causeProto);\n watchChange = new WatchTargetChange(\n state,\n targetIds,\n resumeToken,\n cause || null\n );\n } else if ('documentChange' in change) {\n assertPresent(change.documentChange, 'documentChange');\n const entityChange = change.documentChange;\n assertPresent(entityChange.document, 'documentChange.name');\n assertPresent(entityChange.document.name, 'documentChange.document.name');\n assertPresent(\n entityChange.document.updateTime,\n 'documentChange.document.updateTime'\n );\n const key = fromName(serializer, entityChange.document.name);\n const version = fromVersion(entityChange.document.updateTime);\n const data = new ObjectValue({\n mapValue: { fields: entityChange.document.fields }\n });\n const doc = MutableDocument.newFoundDocument(key, version, data);\n const updatedTargetIds = entityChange.targetIds || [];\n const removedTargetIds = entityChange.removedTargetIds || [];\n watchChange = new DocumentWatchChange(\n updatedTargetIds,\n removedTargetIds,\n doc.key,\n doc\n );\n } else if ('documentDelete' in change) {\n assertPresent(change.documentDelete, 'documentDelete');\n const docDelete = change.documentDelete;\n assertPresent(docDelete.document, 'documentDelete.document');\n const key = fromName(serializer, docDelete.document);\n const version = docDelete.readTime\n ? fromVersion(docDelete.readTime)\n : SnapshotVersion.min();\n const doc = MutableDocument.newNoDocument(key, version);\n const removedTargetIds = docDelete.removedTargetIds || [];\n watchChange = new DocumentWatchChange([], removedTargetIds, doc.key, doc);\n } else if ('documentRemove' in change) {\n assertPresent(change.documentRemove, 'documentRemove');\n const docRemove = change.documentRemove;\n assertPresent(docRemove.document, 'documentRemove');\n const key = fromName(serializer, docRemove.document);\n const removedTargetIds = docRemove.removedTargetIds || [];\n watchChange = new DocumentWatchChange([], removedTargetIds, key, null);\n } else if ('filter' in change) {\n // TODO(dimond): implement existence filter parsing with strategy.\n assertPresent(change.filter, 'filter');\n const filter = change.filter;\n assertPresent(filter.targetId, 'filter.targetId');\n const count = filter.count || 0;\n const existenceFilter = new ExistenceFilter(count);\n const targetId = filter.targetId;\n watchChange = new ExistenceFilterChange(targetId, existenceFilter);\n } else {\n return fail('Unknown change type ' + JSON.stringify(change));\n }\n return watchChange;\n}\n\nfunction fromWatchTargetChangeState(\n state: ProtoTargetChangeTargetChangeType\n): WatchTargetChangeState {\n if (state === 'NO_CHANGE') {\n return WatchTargetChangeState.NoChange;\n } else if (state === 'ADD') {\n return WatchTargetChangeState.Added;\n } else if (state === 'REMOVE') {\n return WatchTargetChangeState.Removed;\n } else if (state === 'CURRENT') {\n return WatchTargetChangeState.Current;\n } else if (state === 'RESET') {\n return WatchTargetChangeState.Reset;\n } else {\n return fail('Got unexpected TargetChange.state: ' + state);\n }\n}\n\nexport function versionFromListenResponse(\n change: ProtoListenResponse\n): SnapshotVersion {\n // We have only reached a consistent snapshot for the entire stream if there\n // is a read_time set and it applies to all targets (i.e. the list of\n // targets is empty). The backend is guaranteed to send such responses.\n if (!('targetChange' in change)) {\n return SnapshotVersion.min();\n }\n const targetChange = change.targetChange!;\n if (targetChange.targetIds && targetChange.targetIds.length) {\n return SnapshotVersion.min();\n }\n if (!targetChange.readTime) {\n return SnapshotVersion.min();\n }\n return fromVersion(targetChange.readTime);\n}\n\nexport function toMutation(\n serializer: JsonProtoSerializer,\n mutation: Mutation\n): ProtoWrite {\n let result: ProtoWrite;\n if (mutation instanceof SetMutation) {\n result = {\n update: toMutationDocument(serializer, mutation.key, mutation.value)\n };\n } else if (mutation instanceof DeleteMutation) {\n result = { delete: toName(serializer, mutation.key) };\n } else if (mutation instanceof PatchMutation) {\n result = {\n update: toMutationDocument(serializer, mutation.key, mutation.data),\n updateMask: toDocumentMask(mutation.fieldMask)\n };\n } else if (mutation instanceof VerifyMutation) {\n result = {\n verify: toName(serializer, mutation.key)\n };\n } else {\n return fail('Unknown mutation type ' + mutation.type);\n }\n\n if (mutation.fieldTransforms.length > 0) {\n result.updateTransforms = mutation.fieldTransforms.map(transform =>\n toFieldTransform(serializer, transform)\n );\n }\n\n if (!mutation.precondition.isNone) {\n result.currentDocument = toPrecondition(serializer, mutation.precondition);\n }\n\n return result;\n}\n\nexport function fromMutation(\n serializer: JsonProtoSerializer,\n proto: ProtoWrite\n): Mutation {\n const precondition = proto.currentDocument\n ? fromPrecondition(proto.currentDocument)\n : Precondition.none();\n\n const fieldTransforms = proto.updateTransforms\n ? proto.updateTransforms.map(transform =>\n fromFieldTransform(serializer, transform)\n )\n : [];\n\n if (proto.update) {\n assertPresent(proto.update.name, 'name');\n const key = fromName(serializer, proto.update.name);\n const value = new ObjectValue({\n mapValue: { fields: proto.update.fields }\n });\n\n if (proto.updateMask) {\n const fieldMask = fromDocumentMask(proto.updateMask);\n return new PatchMutation(\n key,\n value,\n fieldMask,\n precondition,\n fieldTransforms\n );\n } else {\n return new SetMutation(key, value, precondition, fieldTransforms);\n }\n } else if (proto.delete) {\n const key = fromName(serializer, proto.delete);\n return new DeleteMutation(key, precondition);\n } else if (proto.verify) {\n const key = fromName(serializer, proto.verify);\n return new VerifyMutation(key, precondition);\n } else {\n return fail('unknown mutation proto: ' + JSON.stringify(proto));\n }\n}\n\nfunction toPrecondition(\n serializer: JsonProtoSerializer,\n precondition: Precondition\n): ProtoPrecondition {\n debugAssert(!precondition.isNone, \"Can't serialize an empty precondition\");\n if (precondition.updateTime !== undefined) {\n return {\n updateTime: toVersion(serializer, precondition.updateTime)\n };\n } else if (precondition.exists !== undefined) {\n return { exists: precondition.exists };\n } else {\n return fail('Unknown precondition');\n }\n}\n\nfunction fromPrecondition(precondition: ProtoPrecondition): Precondition {\n if (precondition.updateTime !== undefined) {\n return Precondition.updateTime(fromVersion(precondition.updateTime));\n } else if (precondition.exists !== undefined) {\n return Precondition.exists(precondition.exists);\n } else {\n return Precondition.none();\n }\n}\n\nfunction fromWriteResult(\n proto: ProtoWriteResult,\n commitTime: ProtoTimestamp\n): MutationResult {\n // NOTE: Deletes don't have an updateTime.\n let version = proto.updateTime\n ? fromVersion(proto.updateTime)\n : fromVersion(commitTime);\n\n if (version.isEqual(SnapshotVersion.min())) {\n // The Firestore Emulator currently returns an update time of 0 for\n // deletes of non-existing documents (rather than null). This breaks the\n // test \"get deleted doc while offline with source=cache\" as NoDocuments\n // with version 0 are filtered by IndexedDb's RemoteDocumentCache.\n // TODO(#2149): Remove this when Emulator is fixed\n version = fromVersion(commitTime);\n }\n\n return new MutationResult(version, proto.transformResults || []);\n}\n\nexport function fromWriteResults(\n protos: ProtoWriteResult[] | undefined,\n commitTime?: ProtoTimestamp\n): MutationResult[] {\n if (protos && protos.length > 0) {\n hardAssert(\n commitTime !== undefined,\n 'Received a write result without a commit time'\n );\n return protos.map(proto => fromWriteResult(proto, commitTime));\n } else {\n return [];\n }\n}\n\nfunction toFieldTransform(\n serializer: JsonProtoSerializer,\n fieldTransform: FieldTransform\n): ProtoFieldTransform {\n const transform = fieldTransform.transform;\n if (transform instanceof ServerTimestampTransform) {\n return {\n fieldPath: fieldTransform.field.canonicalString(),\n setToServerValue: 'REQUEST_TIME'\n };\n } else if (transform instanceof ArrayUnionTransformOperation) {\n return {\n fieldPath: fieldTransform.field.canonicalString(),\n appendMissingElements: {\n values: transform.elements\n }\n };\n } else if (transform instanceof ArrayRemoveTransformOperation) {\n return {\n fieldPath: fieldTransform.field.canonicalString(),\n removeAllFromArray: {\n values: transform.elements\n }\n };\n } else if (transform instanceof NumericIncrementTransformOperation) {\n return {\n fieldPath: fieldTransform.field.canonicalString(),\n increment: transform.operand\n };\n } else {\n throw fail('Unknown transform: ' + fieldTransform.transform);\n }\n}\n\nfunction fromFieldTransform(\n serializer: JsonProtoSerializer,\n proto: ProtoFieldTransform\n): FieldTransform {\n let transform: TransformOperation | null = null;\n if ('setToServerValue' in proto) {\n hardAssert(\n proto.setToServerValue === 'REQUEST_TIME',\n 'Unknown server value transform proto: ' + JSON.stringify(proto)\n );\n transform = new ServerTimestampTransform();\n } else if ('appendMissingElements' in proto) {\n const values = proto.appendMissingElements!.values || [];\n transform = new ArrayUnionTransformOperation(values);\n } else if ('removeAllFromArray' in proto) {\n const values = proto.removeAllFromArray!.values || [];\n transform = new ArrayRemoveTransformOperation(values);\n } else if ('increment' in proto) {\n transform = new NumericIncrementTransformOperation(\n serializer,\n proto.increment!\n );\n } else {\n fail('Unknown transform proto: ' + JSON.stringify(proto));\n }\n const fieldPath = FieldPath.fromServerFormat(proto.fieldPath!);\n return new FieldTransform(fieldPath, transform!);\n}\n\nexport function toDocumentsTarget(\n serializer: JsonProtoSerializer,\n target: Target\n): ProtoDocumentsTarget {\n return { documents: [toQueryPath(serializer, target.path)] };\n}\n\nexport function fromDocumentsTarget(\n documentsTarget: ProtoDocumentsTarget\n): Target {\n const count = documentsTarget.documents!.length;\n hardAssert(\n count === 1,\n 'DocumentsTarget contained other than 1 document: ' + count\n );\n const name = documentsTarget.documents![0];\n return queryToTarget(newQueryForPath(fromQueryPath(name)));\n}\n\nexport function toQueryTarget(\n serializer: JsonProtoSerializer,\n target: Target\n): ProtoQueryTarget {\n // Dissect the path into parent, collectionId, and optional key filter.\n const result: ProtoQueryTarget = { structuredQuery: {} };\n const path = target.path;\n if (target.collectionGroup !== null) {\n debugAssert(\n path.length % 2 === 0,\n 'Collection Group queries should be within a document path or root.'\n );\n result.parent = toQueryPath(serializer, path);\n result.structuredQuery!.from = [\n {\n collectionId: target.collectionGroup,\n allDescendants: true\n }\n ];\n } else {\n debugAssert(\n path.length % 2 !== 0,\n 'Document queries with filters are not supported.'\n );\n result.parent = toQueryPath(serializer, path.popLast());\n result.structuredQuery!.from = [{ collectionId: path.lastSegment() }];\n }\n\n const where = toFilter(target.filters);\n if (where) {\n result.structuredQuery!.where = where;\n }\n\n const orderBy = toOrder(target.orderBy);\n if (orderBy) {\n result.structuredQuery!.orderBy = orderBy;\n }\n\n const limit = toInt32Proto(serializer, target.limit);\n if (limit !== null) {\n result.structuredQuery!.limit = limit;\n }\n\n if (target.startAt) {\n result.structuredQuery!.startAt = toCursor(target.startAt);\n }\n if (target.endAt) {\n result.structuredQuery!.endAt = toCursor(target.endAt);\n }\n\n return result;\n}\n\nexport function convertQueryTargetToQuery(target: ProtoQueryTarget): Query {\n let path = fromQueryPath(target.parent!);\n\n const query = target.structuredQuery!;\n const fromCount = query.from ? query.from.length : 0;\n let collectionGroup: string | null = null;\n if (fromCount > 0) {\n hardAssert(\n fromCount === 1,\n 'StructuredQuery.from with more than one collection is not supported.'\n );\n const from = query.from![0];\n if (from.allDescendants) {\n collectionGroup = from.collectionId!;\n } else {\n path = path.child(from.collectionId!);\n }\n }\n\n let filterBy: Filter[] = [];\n if (query.where) {\n filterBy = fromFilter(query.where);\n }\n\n let orderBy: OrderBy[] = [];\n if (query.orderBy) {\n orderBy = fromOrder(query.orderBy);\n }\n\n let limit: number | null = null;\n if (query.limit) {\n limit = fromInt32Proto(query.limit);\n }\n\n let startAt: Bound | null = null;\n if (query.startAt) {\n startAt = fromCursor(query.startAt);\n }\n\n let endAt: Bound | null = null;\n if (query.endAt) {\n endAt = fromCursor(query.endAt);\n }\n\n return newQuery(\n path,\n collectionGroup,\n orderBy,\n filterBy,\n limit,\n LimitType.First,\n startAt,\n endAt\n );\n}\n\nexport function fromQueryTarget(target: ProtoQueryTarget): Target {\n return queryToTarget(convertQueryTargetToQuery(target));\n}\n\nexport function toListenRequestLabels(\n serializer: JsonProtoSerializer,\n targetData: TargetData\n): ProtoApiClientObjectMap<string> | null {\n const value = toLabel(serializer, targetData.purpose);\n if (value == null) {\n return null;\n } else {\n return {\n 'goog-listen-tags': value\n };\n }\n}\n\nfunction toLabel(\n serializer: JsonProtoSerializer,\n purpose: TargetPurpose\n): string | null {\n switch (purpose) {\n case TargetPurpose.Listen:\n return null;\n case TargetPurpose.ExistenceFilterMismatch:\n return 'existence-filter-mismatch';\n case TargetPurpose.LimboResolution:\n return 'limbo-document';\n default:\n return fail('Unrecognized query purpose: ' + purpose);\n }\n}\n\nexport function toTarget(\n serializer: JsonProtoSerializer,\n targetData: TargetData\n): ProtoTarget {\n let result: ProtoTarget;\n const target = targetData.target;\n\n if (isDocumentTarget(target)) {\n result = { documents: toDocumentsTarget(serializer, target) };\n } else {\n result = { query: toQueryTarget(serializer, target) };\n }\n\n result.targetId = targetData.targetId;\n\n if (targetData.resumeToken.approximateByteSize() > 0) {\n result.resumeToken = toBytes(serializer, targetData.resumeToken);\n } else if (targetData.snapshotVersion.compareTo(SnapshotVersion.min()) > 0) {\n // TODO(wuandy): Consider removing above check because it is most likely true.\n // Right now, many tests depend on this behaviour though (leaving min() out\n // of serialization).\n result.readTime = toTimestamp(\n serializer,\n targetData.snapshotVersion.toTimestamp()\n );\n }\n\n return result;\n}\n\nfunction toFilter(filters: Filter[]): ProtoFilter | undefined {\n if (filters.length === 0) {\n return;\n }\n const protos = filters.map(filter => {\n debugAssert(\n filter instanceof FieldFilter,\n 'Only FieldFilters are supported'\n );\n return toUnaryOrFieldFilter(filter);\n });\n if (protos.length === 1) {\n return protos[0];\n }\n return { compositeFilter: { op: 'AND', filters: protos } };\n}\n\nfunction fromFilter(filter: ProtoFilter | undefined): Filter[] {\n if (!filter) {\n return [];\n } else if (filter.unaryFilter !== undefined) {\n return [fromUnaryFilter(filter)];\n } else if (filter.fieldFilter !== undefined) {\n return [fromFieldFilter(filter)];\n } else if (filter.compositeFilter !== undefined) {\n return filter.compositeFilter\n .filters!.map(f => fromFilter(f))\n .reduce((accum, current) => accum.concat(current));\n } else {\n return fail('Unknown filter: ' + JSON.stringify(filter));\n }\n}\n\nfunction toOrder(orderBys: OrderBy[]): ProtoOrder[] | undefined {\n if (orderBys.length === 0) {\n return;\n }\n return orderBys.map(order => toPropertyOrder(order));\n}\n\nfunction fromOrder(orderBys: ProtoOrder[]): OrderBy[] {\n return orderBys.map(order => fromPropertyOrder(order));\n}\n\nfunction toCursor(cursor: Bound): ProtoCursor {\n return {\n before: cursor.before,\n values: cursor.position\n };\n}\n\nfunction fromCursor(cursor: ProtoCursor): Bound {\n const before = !!cursor.before;\n const position = cursor.values || [];\n return new Bound(position, before);\n}\n\n// visible for testing\nexport function toDirection(dir: Direction): ProtoOrderDirection {\n return DIRECTIONS[dir];\n}\n\n// visible for testing\nexport function fromDirection(\n dir: ProtoOrderDirection | undefined\n): Direction | undefined {\n switch (dir) {\n case 'ASCENDING':\n return Direction.ASCENDING;\n case 'DESCENDING':\n return Direction.DESCENDING;\n default:\n return undefined;\n }\n}\n\n// visible for testing\nexport function toOperatorName(op: Operator): ProtoFieldFilterOp {\n return OPERATORS[op];\n}\n\nexport function fromOperatorName(op: ProtoFieldFilterOp): Operator {\n switch (op) {\n case 'EQUAL':\n return Operator.EQUAL;\n case 'NOT_EQUAL':\n return Operator.NOT_EQUAL;\n case 'GREATER_THAN':\n return Operator.GREATER_THAN;\n case 'GREATER_THAN_OR_EQUAL':\n return Operator.GREATER_THAN_OR_EQUAL;\n case 'LESS_THAN':\n return Operator.LESS_THAN;\n case 'LESS_THAN_OR_EQUAL':\n return Operator.LESS_THAN_OR_EQUAL;\n case 'ARRAY_CONTAINS':\n return Operator.ARRAY_CONTAINS;\n case 'IN':\n return Operator.IN;\n case 'NOT_IN':\n return Operator.NOT_IN;\n case 'ARRAY_CONTAINS_ANY':\n return Operator.ARRAY_CONTAINS_ANY;\n case 'OPERATOR_UNSPECIFIED':\n return fail('Unspecified operator');\n default:\n return fail('Unknown operator');\n }\n}\n\nexport function toFieldPathReference(path: FieldPath): ProtoFieldReference {\n return { fieldPath: path.canonicalString() };\n}\n\nexport function fromFieldPathReference(\n fieldReference: ProtoFieldReference\n): FieldPath {\n return FieldPath.fromServerFormat(fieldReference.fieldPath!);\n}\n\n// visible for testing\nexport function toPropertyOrder(orderBy: OrderBy): ProtoOrder {\n return {\n field: toFieldPathReference(orderBy.field),\n direction: toDirection(orderBy.dir)\n };\n}\n\nexport function fromPropertyOrder(orderBy: ProtoOrder): OrderBy {\n return new OrderBy(\n fromFieldPathReference(orderBy.field!),\n fromDirection(orderBy.direction)\n );\n}\n\nexport function fromFieldFilter(filter: ProtoFilter): Filter {\n return FieldFilter.create(\n fromFieldPathReference(filter.fieldFilter!.field!),\n fromOperatorName(filter.fieldFilter!.op!),\n filter.fieldFilter!.value!\n );\n}\n\n// visible for testing\nexport function toUnaryOrFieldFilter(filter: FieldFilter): ProtoFilter {\n if (filter.op === Operator.EQUAL) {\n if (isNanValue(filter.value)) {\n return {\n unaryFilter: {\n field: toFieldPathReference(filter.field),\n op: 'IS_NAN'\n }\n };\n } else if (isNullValue(filter.value)) {\n return {\n unaryFilter: {\n field: toFieldPathReference(filter.field),\n op: 'IS_NULL'\n }\n };\n }\n } else if (filter.op === Operator.NOT_EQUAL) {\n if (isNanValue(filter.value)) {\n return {\n unaryFilter: {\n field: toFieldPathReference(filter.field),\n op: 'IS_NOT_NAN'\n }\n };\n } else if (isNullValue(filter.value)) {\n return {\n unaryFilter: {\n field: toFieldPathReference(filter.field),\n op: 'IS_NOT_NULL'\n }\n };\n }\n }\n return {\n fieldFilter: {\n field: toFieldPathReference(filter.field),\n op: toOperatorName(filter.op),\n value: filter.value\n }\n };\n}\n\nexport function fromUnaryFilter(filter: ProtoFilter): Filter {\n switch (filter.unaryFilter!.op!) {\n case 'IS_NAN':\n const nanField = fromFieldPathReference(filter.unaryFilter!.field!);\n return FieldFilter.create(nanField, Operator.EQUAL, {\n doubleValue: NaN\n });\n case 'IS_NULL':\n const nullField = fromFieldPathReference(filter.unaryFilter!.field!);\n return FieldFilter.create(nullField, Operator.EQUAL, {\n nullValue: 'NULL_VALUE'\n });\n case 'IS_NOT_NAN':\n const notNanField = fromFieldPathReference(filter.unaryFilter!.field!);\n return FieldFilter.create(notNanField, Operator.NOT_EQUAL, {\n doubleValue: NaN\n });\n case 'IS_NOT_NULL':\n const notNullField = fromFieldPathReference(filter.unaryFilter!.field!);\n return FieldFilter.create(notNullField, Operator.NOT_EQUAL, {\n nullValue: 'NULL_VALUE'\n });\n case 'OPERATOR_UNSPECIFIED':\n return fail('Unspecified filter');\n default:\n return fail('Unknown filter');\n }\n}\n\nexport function toDocumentMask(fieldMask: FieldMask): ProtoDocumentMask {\n const canonicalFields: string[] = [];\n fieldMask.fields.forEach(field =>\n canonicalFields.push(field.canonicalString())\n );\n return {\n fieldPaths: canonicalFields\n };\n}\n\nexport function fromDocumentMask(proto: ProtoDocumentMask): FieldMask {\n const paths = proto.fieldPaths || [];\n return new FieldMask(paths.map(path => FieldPath.fromServerFormat(path)));\n}\n\nexport function isValidResourceName(path: ResourcePath): boolean {\n // Resource names have at least 4 components (project ID, database ID)\n return (\n path.length >= 4 &&\n path.get(0) === 'projects' &&\n path.get(2) === 'databases'\n );\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ResourcePath } from '../model/path';\nimport { fail, hardAssert } from '../util/assert';\n\n/**\n * Helpers for dealing with resource paths stored in IndexedDB.\n *\n * Resource paths in their canonical string form do not sort as the server\n * sorts them. Specifically the server splits paths into segments first and then\n * sorts, putting end-of-segment before any character. In a UTF-8 string\n * encoding the slash ('/') that denotes the end-of-segment naturally comes\n * after other characters so the intent here is to encode the path delimiters in\n * such a way that the resulting strings sort naturally.\n *\n * Resource paths are also used for prefix scans so it's important to\n * distinguish whole segments from any longer segments of which they might be a\n * prefix. For example, it's important to make it possible to scan documents in\n * a collection \"foo\" without encountering documents in a collection \"foobar\".\n *\n * Separate from the concerns about resource path ordering and separation,\n * On Android, SQLite imposes additional restrictions since it does not handle\n * keys with embedded NUL bytes particularly well. Rather than change the\n * implementation we keep the encoding identical to keep the ports similar.\n *\n * Taken together this means resource paths when encoded for storage in\n * IndexedDB have the following characteristics:\n *\n * * Segment separators (\"/\") sort before everything else.\n * * All paths have a trailing separator.\n * * NUL bytes do not exist in the output, since IndexedDB doesn't treat them\n * well.\n *\n * Therefore resource paths are encoded into string form using the following\n * rules:\n *\n * * '\\x01' is used as an escape character.\n * * Path separators are encoded as \"\\x01\\x01\"\n * * NUL bytes are encoded as \"\\x01\\x10\"\n * * '\\x01' is encoded as \"\\x01\\x11\"\n *\n * This encoding leaves some room between path separators and the NUL byte\n * just in case we decide to support integer document ids after all.\n *\n * Note that characters treated specially by the backend ('.', '/', and '~')\n * are not treated specially here. This class assumes that any unescaping of\n * resource path strings into actual ResourcePath objects will handle these\n * characters there.\n */\nexport type EncodedResourcePath = string;\n\nconst escapeChar = '\\u0001';\nconst encodedSeparatorChar = '\\u0001';\nconst encodedNul = '\\u0010';\nconst encodedEscape = '\\u0011';\n\n/**\n * Encodes a resource path into a IndexedDb-compatible string form.\n */\nexport function encodeResourcePath(path: ResourcePath): EncodedResourcePath {\n let result = '';\n for (let i = 0; i < path.length; i++) {\n if (result.length > 0) {\n result = encodeSeparator(result);\n }\n result = encodeSegment(path.get(i), result);\n }\n return encodeSeparator(result);\n}\n\n/** Encodes a single segment of a resource path into the given result */\nfunction encodeSegment(segment: string, resultBuf: string): string {\n let result = resultBuf;\n const length = segment.length;\n for (let i = 0; i < length; i++) {\n const c = segment.charAt(i);\n switch (c) {\n case '\\0':\n result += escapeChar + encodedNul;\n break;\n case escapeChar:\n result += escapeChar + encodedEscape;\n break;\n default:\n result += c;\n }\n }\n return result;\n}\n\n/** Encodes a path separator into the given result */\nfunction encodeSeparator(result: string): string {\n return result + escapeChar + encodedSeparatorChar;\n}\n\n/**\n * Decodes the given IndexedDb-compatible string form of a resource path into\n * a ResourcePath instance. Note that this method is not suitable for use with\n * decoding resource names from the server; those are One Platform format\n * strings.\n */\nexport function decodeResourcePath(path: EncodedResourcePath): ResourcePath {\n // Event the empty path must encode as a path of at least length 2. A path\n // with exactly 2 must be the empty path.\n const length = path.length;\n hardAssert(length >= 2, 'Invalid path ' + path);\n if (length === 2) {\n hardAssert(\n path.charAt(0) === escapeChar && path.charAt(1) === encodedSeparatorChar,\n 'Non-empty path ' + path + ' had length 2'\n );\n return ResourcePath.emptyPath();\n }\n\n // Escape characters cannot exist past the second-to-last position in the\n // source value.\n const lastReasonableEscapeIndex = length - 2;\n\n const segments: string[] = [];\n let segmentBuilder = '';\n\n for (let start = 0; start < length; ) {\n // The last two characters of a valid encoded path must be a separator, so\n // there must be an end to this segment.\n const end = path.indexOf(escapeChar, start);\n if (end < 0 || end > lastReasonableEscapeIndex) {\n fail('Invalid encoded resource path: \"' + path + '\"');\n }\n\n const next = path.charAt(end + 1);\n switch (next) {\n case encodedSeparatorChar:\n const currentPiece = path.substring(start, end);\n let segment;\n if (segmentBuilder.length === 0) {\n // Avoid copying for the common case of a segment that excludes \\0\n // and \\001\n segment = currentPiece;\n } else {\n segmentBuilder += currentPiece;\n segment = segmentBuilder;\n segmentBuilder = '';\n }\n segments.push(segment);\n break;\n case encodedNul:\n segmentBuilder += path.substring(start, end);\n segmentBuilder += '\\0';\n break;\n case encodedEscape:\n // The escape character can be used in the output to encode itself.\n segmentBuilder += path.substring(start, end + 1);\n break;\n default:\n fail('Invalid encoded resource path: \"' + path + '\"');\n }\n\n start = end + 2;\n }\n\n return new ResourcePath(segments);\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BatchId, ListenSequenceNumber, TargetId } from '../core/types';\nimport { ResourcePath } from '../model/path';\nimport { BundledQuery } from '../protos/firestore_bundle_proto';\nimport {\n Document as ProtoDocument,\n DocumentsTarget as ProtoDocumentsTarget,\n QueryTarget as ProtoQueryTarget,\n Write as ProtoWrite\n} from '../protos/firestore_proto_api';\nimport { debugAssert } from '../util/assert';\n\nimport {\n EncodedResourcePath,\n encodeResourcePath\n} from './encoded_resource_path';\n\n/**\n * Schema Version for the Web client:\n * 1. Initial version including Mutation Queue, Query Cache, and Remote\n * Document Cache\n * 2. Used to ensure a targetGlobal object exists and add targetCount to it. No\n * longer required because migration 3 unconditionally clears it.\n * 3. Dropped and re-created Query Cache to deal with cache corruption related\n * to limbo resolution. Addresses\n * https://github.com/firebase/firebase-ios-sdk/issues/1548\n * 4. Multi-Tab Support.\n * 5. Removal of held write acks.\n * 6. Create document global for tracking document cache size.\n * 7. Ensure every cached document has a sentinel row with a sequence number.\n * 8. Add collection-parent index for Collection Group queries.\n * 9. Change RemoteDocumentChanges store to be keyed by readTime rather than\n * an auto-incrementing ID. This is required for Index-Free queries.\n * 10. Rewrite the canonical IDs to the explicit Protobuf-based format.\n * 11. Add bundles and named_queries for bundle support.\n */\nexport const SCHEMA_VERSION = 11;\n\n/**\n * Wrapper class to store timestamps (seconds and nanos) in IndexedDb objects.\n */\nexport class DbTimestamp {\n constructor(public seconds: number, public nanoseconds: number) {}\n}\n\n/** A timestamp type that can be used in IndexedDb keys. */\nexport type DbTimestampKey = [/* seconds */ number, /* nanos */ number];\n\n// The key for the singleton object in the DbPrimaryClient is a single string.\nexport type DbPrimaryClientKey = typeof DbPrimaryClient.key;\n\n/**\n * A singleton object to be stored in the 'owner' store in IndexedDb.\n *\n * A given database can have a single primary tab assigned at a given time. That\n * tab must validate that it is still holding the primary lease before every\n * operation that requires locked access. The primary tab should regularly\n * write an updated timestamp to this lease to prevent other tabs from\n * \"stealing\" the primary lease\n */\nexport class DbPrimaryClient {\n /**\n * Name of the IndexedDb object store.\n *\n * Note that the name 'owner' is chosen to ensure backwards compatibility with\n * older clients that only supported single locked access to the persistence\n * layer.\n */\n static store = 'owner';\n\n /**\n * The key string used for the single object that exists in the\n * DbPrimaryClient store.\n */\n static key = 'owner';\n\n constructor(\n public ownerId: string,\n /** Whether to allow shared access from multiple tabs. */\n public allowTabSynchronization: boolean,\n public leaseTimestampMs: number\n ) {}\n}\n\n/** Object keys in the 'mutationQueues' store are userId strings. */\nexport type DbMutationQueueKey = string;\n\n/**\n * An object to be stored in the 'mutationQueues' store in IndexedDb.\n *\n * Each user gets a single queue of MutationBatches to apply to the server.\n * DbMutationQueue tracks the metadata about the queue.\n */\nexport class DbMutationQueue {\n /** Name of the IndexedDb object store. */\n static store = 'mutationQueues';\n\n /** Keys are automatically assigned via the userId property. */\n static keyPath = 'userId';\n\n constructor(\n /**\n * The normalized user ID to which this queue belongs.\n */\n public userId: string,\n /**\n * An identifier for the highest numbered batch that has been acknowledged\n * by the server. All MutationBatches in this queue with batchIds less\n * than or equal to this value are considered to have been acknowledged by\n * the server.\n *\n * NOTE: this is deprecated and no longer used by the code.\n */\n public lastAcknowledgedBatchId: number,\n /**\n * A stream token that was previously sent by the server.\n *\n * See StreamingWriteRequest in datastore.proto for more details about\n * usage.\n *\n * After sending this token, earlier tokens may not be used anymore so\n * only a single stream token is retained.\n *\n * NOTE: this is deprecated and no longer used by the code.\n */\n public lastStreamToken: string\n ) {}\n}\n\n/** The 'mutations' store is keyed by batch ID. */\nexport type DbMutationBatchKey = BatchId;\n\n/**\n * An object to be stored in the 'mutations' store in IndexedDb.\n *\n * Represents a batch of user-level mutations intended to be sent to the server\n * in a single write. Each user-level batch gets a separate DbMutationBatch\n * with a new batchId.\n */\nexport class DbMutationBatch {\n /** Name of the IndexedDb object store. */\n static store = 'mutations';\n\n /** Keys are automatically assigned via the userId, batchId properties. */\n static keyPath = 'batchId';\n\n /** The index name for lookup of mutations by user. */\n static userMutationsIndex = 'userMutationsIndex';\n\n /** The user mutations index is keyed by [userId, batchId] pairs. */\n static userMutationsKeyPath = ['userId', 'batchId'];\n\n constructor(\n /**\n * The normalized user ID to which this batch belongs.\n */\n public userId: string,\n /**\n * An identifier for this batch, allocated using an auto-generated key.\n */\n public batchId: BatchId,\n /**\n * The local write time of the batch, stored as milliseconds since the\n * epoch.\n */\n public localWriteTimeMs: number,\n /**\n * A list of \"mutations\" that represent a partial base state from when this\n * write batch was initially created. During local application of the write\n * batch, these baseMutations are applied prior to the real writes in order\n * to override certain document fields from the remote document cache. This\n * is necessary in the case of non-idempotent writes (e.g. `increment()`\n * transforms) to make sure that the local view of the modified documents\n * doesn't flicker if the remote document cache receives the result of the\n * non-idempotent write before the write is removed from the queue.\n *\n * These mutations are never sent to the backend.\n */\n public baseMutations: ProtoWrite[] | undefined,\n /**\n * A list of mutations to apply. All mutations will be applied atomically.\n *\n * Mutations are serialized via toMutation().\n */\n public mutations: ProtoWrite[]\n ) {}\n}\n\n/**\n * The key for a db document mutation, which is made up of a userID, path, and\n * batchId. Note that the path must be serialized into a form that indexedDB can\n * sort.\n */\nexport type DbDocumentMutationKey = [string, EncodedResourcePath, BatchId];\n\n/**\n * An object to be stored in the 'documentMutations' store in IndexedDb.\n *\n * A manually maintained index of all the mutation batches that affect a given\n * document key. The rows in this table are references based on the contents of\n * DbMutationBatch.mutations.\n */\nexport class DbDocumentMutation {\n static store = 'documentMutations';\n\n /**\n * Creates a [userId] key for use in the DbDocumentMutations index to iterate\n * over all of a user's document mutations.\n */\n static prefixForUser(userId: string): [string] {\n return [userId];\n }\n\n /**\n * Creates a [userId, encodedPath] key for use in the DbDocumentMutations\n * index to iterate over all at document mutations for a given path or lower.\n */\n static prefixForPath(\n userId: string,\n path: ResourcePath\n ): [string, EncodedResourcePath] {\n return [userId, encodeResourcePath(path)];\n }\n\n /**\n * Creates a full index key of [userId, encodedPath, batchId] for inserting\n * and deleting into the DbDocumentMutations index.\n */\n static key(\n userId: string,\n path: ResourcePath,\n batchId: BatchId\n ): DbDocumentMutationKey {\n return [userId, encodeResourcePath(path), batchId];\n }\n\n /**\n * Because we store all the useful information for this store in the key,\n * there is no useful information to store as the value. The raw (unencoded)\n * path cannot be stored because IndexedDb doesn't store prototype\n * information.\n */\n static PLACEHOLDER = new DbDocumentMutation();\n\n private constructor() {}\n}\n\n/**\n * A key in the 'remoteDocuments' object store is a string array containing the\n * segments that make up the path.\n */\nexport type DbRemoteDocumentKey = string[];\n\n/**\n * Represents the known absence of a document at a particular version.\n * Stored in IndexedDb as part of a DbRemoteDocument object.\n */\nexport class DbNoDocument {\n constructor(public path: string[], public readTime: DbTimestamp) {}\n}\n\n/**\n * Represents a document that is known to exist but whose data is unknown.\n * Stored in IndexedDb as part of a DbRemoteDocument object.\n */\nexport class DbUnknownDocument {\n constructor(public path: string[], public version: DbTimestamp) {}\n}\n\n/**\n * An object to be stored in the 'remoteDocuments' store in IndexedDb.\n * It represents either:\n *\n * - A complete document.\n * - A \"no document\" representing a document that is known not to exist (at\n * some version).\n * - An \"unknown document\" representing a document that is known to exist (at\n * some version) but whose contents are unknown.\n *\n * Note: This is the persisted equivalent of a MaybeDocument and could perhaps\n * be made more general if necessary.\n */\nexport class DbRemoteDocument {\n static store = 'remoteDocuments';\n\n /**\n * An index that provides access to all entries sorted by read time (which\n * corresponds to the last modification time of each row).\n *\n * This index is used to provide a changelog for Multi-Tab.\n */\n static readTimeIndex = 'readTimeIndex';\n\n static readTimeIndexPath = 'readTime';\n\n /**\n * An index that provides access to documents in a collection sorted by read\n * time.\n *\n * This index is used to allow the RemoteDocumentCache to fetch newly changed\n * documents in a collection.\n */\n static collectionReadTimeIndex = 'collectionReadTimeIndex';\n\n static collectionReadTimeIndexPath = ['parentPath', 'readTime'];\n\n // TODO: We are currently storing full document keys almost three times\n // (once as part of the primary key, once - partly - as `parentPath` and once\n // inside the encoded documents). During our next migration, we should\n // rewrite the primary key as parentPath + document ID which would allow us\n // to drop one value.\n\n constructor(\n /**\n * Set to an instance of DbUnknownDocument if the data for a document is\n * not known, but it is known that a document exists at the specified\n * version (e.g. it had a successful update applied to it)\n */\n public unknownDocument: DbUnknownDocument | null | undefined,\n /**\n * Set to an instance of a DbNoDocument if it is known that no document\n * exists.\n */\n public noDocument: DbNoDocument | null,\n /**\n * Set to an instance of a Document if there's a cached version of the\n * document.\n */\n public document: ProtoDocument | null,\n /**\n * Documents that were written to the remote document store based on\n * a write acknowledgment are marked with `hasCommittedMutations`. These\n * documents are potentially inconsistent with the backend's copy and use\n * the write's commit version as their document version.\n */\n public hasCommittedMutations: boolean | undefined,\n\n /**\n * When the document was read from the backend. Undefined for data written\n * prior to schema version 9.\n */\n public readTime: DbTimestampKey | undefined,\n\n /**\n * The path of the collection this document is part of. Undefined for data\n * written prior to schema version 9.\n */\n public parentPath: string[] | undefined\n ) {}\n}\n\n/**\n * Contains a single entry that has metadata about the remote document cache.\n */\nexport class DbRemoteDocumentGlobal {\n static store = 'remoteDocumentGlobal';\n\n static key = 'remoteDocumentGlobalKey';\n\n /**\n * @param byteSize - Approximately the total size in bytes of all the\n * documents in the document cache.\n */\n constructor(public byteSize: number) {}\n}\n\nexport type DbRemoteDocumentGlobalKey = typeof DbRemoteDocumentGlobal.key;\n\n/**\n * A key in the 'targets' object store is a targetId of the query.\n */\nexport type DbTargetKey = TargetId;\n\n/**\n * The persisted type for a query nested with in the 'targets' store in\n * IndexedDb. We use the proto definitions for these two kinds of queries in\n * order to avoid writing extra serialization logic.\n */\nexport type DbQuery = ProtoQueryTarget | ProtoDocumentsTarget;\n\n/**\n * An object to be stored in the 'targets' store in IndexedDb.\n *\n * This is based on and should be kept in sync with the proto used in the iOS\n * client.\n *\n * Each query the client listens to against the server is tracked on disk so\n * that the query can be efficiently resumed on restart.\n */\nexport class DbTarget {\n static store = 'targets';\n\n /** Keys are automatically assigned via the targetId property. */\n static keyPath = 'targetId';\n\n /** The name of the queryTargets index. */\n static queryTargetsIndexName = 'queryTargetsIndex';\n\n /**\n * The index of all canonicalIds to the targets that they match. This is not\n * a unique mapping because canonicalId does not promise a unique name for all\n * possible queries, so we append the targetId to make the mapping unique.\n */\n static queryTargetsKeyPath = ['canonicalId', 'targetId'];\n\n constructor(\n /**\n * An auto-generated sequential numeric identifier for the query.\n *\n * Queries are stored using their canonicalId as the key, but these\n * canonicalIds can be quite long so we additionally assign a unique\n * queryId which can be used by referenced data structures (e.g.\n * indexes) to minimize the on-disk cost.\n */\n public targetId: TargetId,\n /**\n * The canonical string representing this query. This is not unique.\n */\n public canonicalId: string,\n /**\n * The last readTime received from the Watch Service for this query.\n *\n * This is the same value as TargetChange.read_time in the protos.\n */\n public readTime: DbTimestamp,\n /**\n * An opaque, server-assigned token that allows watching a query to be\n * resumed after disconnecting without retransmitting all the data\n * that matches the query. The resume token essentially identifies a\n * point in time from which the server should resume sending results.\n *\n * This is related to the snapshotVersion in that the resumeToken\n * effectively also encodes that value, but the resumeToken is opaque\n * and sometimes encodes additional information.\n *\n * A consequence of this is that the resumeToken should be used when\n * asking the server to reason about where this client is in the watch\n * stream, but the client should use the snapshotVersion for its own\n * purposes.\n *\n * This is the same value as TargetChange.resume_token in the protos.\n */\n public resumeToken: string,\n /**\n * A sequence number representing the last time this query was\n * listened to, used for garbage collection purposes.\n *\n * Conventionally this would be a timestamp value, but device-local\n * clocks are unreliable and they must be able to create new listens\n * even while disconnected. Instead this should be a monotonically\n * increasing number that's incremented on each listen call.\n *\n * This is different from the queryId since the queryId is an\n * immutable identifier assigned to the Query on first use while\n * lastListenSequenceNumber is updated every time the query is\n * listened to.\n */\n public lastListenSequenceNumber: number,\n /**\n * Denotes the maximum snapshot version at which the associated query view\n * contained no limbo documents. Undefined for data written prior to\n * schema version 9.\n */\n public lastLimboFreeSnapshotVersion: DbTimestamp | undefined,\n /**\n * The query for this target.\n *\n * Because canonical ids are not unique we must store the actual query. We\n * use the proto to have an object we can persist without having to\n * duplicate translation logic to and from a `Query` object.\n */\n public query: DbQuery\n ) {}\n}\n\n/**\n * The key for a DbTargetDocument, containing a targetId and an encoded resource\n * path.\n */\nexport type DbTargetDocumentKey = [TargetId, EncodedResourcePath];\n\n/**\n * An object representing an association between a target and a document, or a\n * sentinel row marking the last sequence number at which a document was used.\n * Each document cached must have a corresponding sentinel row before lru\n * garbage collection is enabled.\n *\n * The target associations and sentinel rows are co-located so that orphaned\n * documents and their sequence numbers can be identified efficiently via a scan\n * of this store.\n */\nexport class DbTargetDocument {\n /** Name of the IndexedDb object store. */\n static store = 'targetDocuments';\n\n /** Keys are automatically assigned via the targetId, path properties. */\n static keyPath = ['targetId', 'path'];\n\n /** The index name for the reverse index. */\n static documentTargetsIndex = 'documentTargetsIndex';\n\n /** We also need to create the reverse index for these properties. */\n static documentTargetsKeyPath = ['path', 'targetId'];\n\n constructor(\n /**\n * The targetId identifying a target or 0 for a sentinel row.\n */\n public targetId: TargetId,\n /**\n * The path to the document, as encoded in the key.\n */\n public path: EncodedResourcePath,\n /**\n * If this is a sentinel row, this should be the sequence number of the last\n * time the document specified by `path` was used. Otherwise, it should be\n * `undefined`.\n */\n public sequenceNumber?: ListenSequenceNumber\n ) {\n debugAssert(\n (targetId === 0) === (sequenceNumber !== undefined),\n 'A target-document row must either have targetId == 0 and a defined sequence number, or a non-zero targetId and no sequence number'\n );\n }\n}\n\n/**\n * The type to represent the single allowed key for the DbTargetGlobal store.\n */\nexport type DbTargetGlobalKey = typeof DbTargetGlobal.key;\n\n/**\n * A record of global state tracked across all Targets, tracked separately\n * to avoid the need for extra indexes.\n *\n * This should be kept in-sync with the proto used in the iOS client.\n */\nexport class DbTargetGlobal {\n /**\n * The key string used for the single object that exists in the\n * DbTargetGlobal store.\n */\n static key = 'targetGlobalKey';\n static store = 'targetGlobal';\n\n constructor(\n /**\n * The highest numbered target id across all targets.\n *\n * See DbTarget.targetId.\n */\n public highestTargetId: TargetId,\n /**\n * The highest numbered lastListenSequenceNumber across all targets.\n *\n * See DbTarget.lastListenSequenceNumber.\n */\n public highestListenSequenceNumber: number,\n /**\n * A global snapshot version representing the last consistent snapshot we\n * received from the backend. This is monotonically increasing and any\n * snapshots received from the backend prior to this version (e.g. for\n * targets resumed with a resumeToken) should be suppressed (buffered)\n * until the backend has caught up to this snapshot version again. This\n * prevents our cache from ever going backwards in time.\n */\n public lastRemoteSnapshotVersion: DbTimestamp,\n /**\n * The number of targets persisted.\n */\n public targetCount: number\n ) {}\n}\n\n/**\n * The key for a DbCollectionParent entry, containing the collection ID\n * and the parent path that contains it. Note that the parent path will be an\n * empty path in the case of root-level collections.\n */\nexport type DbCollectionParentKey = [string, EncodedResourcePath];\n\n/**\n * An object representing an association between a Collection id (e.g. 'messages')\n * to a parent path (e.g. '/chats/123') that contains it as a (sub)collection.\n * This is used to efficiently find all collections to query when performing\n * a Collection Group query.\n */\nexport class DbCollectionParent {\n /** Name of the IndexedDb object store. */\n static store = 'collectionParents';\n\n /** Keys are automatically assigned via the collectionId, parent properties. */\n static keyPath = ['collectionId', 'parent'];\n\n constructor(\n /**\n * The collectionId (e.g. 'messages')\n */\n public collectionId: string,\n /**\n * The path to the parent (either a document location or an empty path for\n * a root-level collection).\n */\n public parent: EncodedResourcePath\n ) {}\n}\n\n/**\n * A record of the metadata state of each client.\n *\n * PORTING NOTE: This is used to synchronize multi-tab state and does not need\n * to be ported to iOS or Android.\n */\nexport class DbClientMetadata {\n /** Name of the IndexedDb object store. */\n static store = 'clientMetadata';\n\n /** Keys are automatically assigned via the clientId properties. */\n static keyPath = 'clientId';\n\n constructor(\n // Note: Previous schema versions included a field\n // \"lastProcessedDocumentChangeId\". Don't use anymore.\n\n /** The auto-generated client id assigned at client startup. */\n public clientId: string,\n /** The last time this state was updated. */\n public updateTimeMs: number,\n /** Whether the client's network connection is enabled. */\n public networkEnabled: boolean,\n /** Whether this client is running in a foreground tab. */\n public inForeground: boolean\n ) {}\n}\n\n/** Object keys in the 'clientMetadata' store are clientId strings. */\nexport type DbClientMetadataKey = string;\n\nexport type DbBundlesKey = string;\n\n/**\n * A object representing a bundle loaded by the SDK.\n */\nexport class DbBundle {\n /** Name of the IndexedDb object store. */\n static store = 'bundles';\n\n static keyPath = 'bundleId';\n\n constructor(\n /** The ID of the loaded bundle. */\n public bundleId: string,\n /** The create time of the loaded bundle. */\n public createTime: DbTimestamp,\n /** The schema version of the loaded bundle. */\n public version: number\n ) {}\n}\n\nexport type DbNamedQueriesKey = string;\n\n/**\n * A object representing a named query loaded by the SDK via a bundle.\n */\nexport class DbNamedQuery {\n /** Name of the IndexedDb object store. */\n static store = 'namedQueries';\n\n static keyPath = 'name';\n\n constructor(\n /** The name of the query. */\n public name: string,\n /** The read time of the results saved in the bundle from the named query. */\n public readTime: DbTimestamp,\n /** The query saved in the bundle. */\n public bundledQuery: BundledQuery\n ) {}\n}\n\n// Visible for testing\nexport const V1_STORES = [\n DbMutationQueue.store,\n DbMutationBatch.store,\n DbDocumentMutation.store,\n DbRemoteDocument.store,\n DbTarget.store,\n DbPrimaryClient.store,\n DbTargetGlobal.store,\n DbTargetDocument.store\n];\n\n// V2 is no longer usable (see comment at top of file)\n\n// Visible for testing\nexport const V3_STORES = V1_STORES;\n\n// Visible for testing\n// Note: DbRemoteDocumentChanges is no longer used and dropped with v9.\nexport const V4_STORES = [...V3_STORES, DbClientMetadata.store];\n\n// V5 does not change the set of stores.\n\nexport const V6_STORES = [...V4_STORES, DbRemoteDocumentGlobal.store];\n\n// V7 does not change the set of stores.\n\nexport const V8_STORES = [...V6_STORES, DbCollectionParent.store];\n\n// V9 does not change the set of stores.\n\n// V10 does not change the set of stores.\n\nexport const V11_STORES = [...V8_STORES, DbBundle.store, DbNamedQuery.store];\n\n/**\n * The list of all default IndexedDB stores used throughout the SDK. This is\n * used when creating transactions so that access across all stores is done\n * atomically.\n */\nexport const ALL_STORES = V11_STORES;\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListenSequenceNumber } from '../core/types';\nexport const PRIMARY_LEASE_LOST_ERROR_MSG =\n 'The current tab is not in the required state to perform this operation. ' +\n 'It might be necessary to refresh the browser tab.';\n\n/** The different modes supported by `Persistence.runTransaction()`. */\nexport type PersistenceTransactionMode =\n | 'readonly'\n | 'readwrite'\n | 'readwrite-primary';\n\n/**\n * A base class representing a persistence transaction, encapsulating both the\n * transaction's sequence numbers as well as a list of onCommitted listeners.\n *\n * When you call Persistence.runTransaction(), it will create a transaction and\n * pass it to your callback. You then pass it to any method that operates\n * on persistence.\n */\nexport abstract class PersistenceTransaction {\n private readonly onCommittedListeners: Array<() => void> = [];\n\n abstract readonly currentSequenceNumber: ListenSequenceNumber;\n\n addOnCommittedListener(listener: () => void): void {\n this.onCommittedListeners.push(listener);\n }\n\n raiseOnCommittedEvent(): void {\n this.onCommittedListeners.forEach(listener => listener());\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface Resolver<R> {\n (value: R | Promise<R>): void;\n}\n\nexport interface Rejecter {\n (reason?: Error): void;\n}\n\nexport class Deferred<R = void> {\n promise: Promise<R>;\n // Assigned synchronously in constructor by Promise constructor callback.\n resolve!: Resolver<R>;\n reject!: Rejecter;\n\n constructor() {\n this.promise = new Promise((resolve: Resolver<R>, reject: Rejecter) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n\n/**\n * Takes an array of values and a function from a value to a Promise. The function is run on each\n * value sequentially, waiting for the previous promise to resolve before starting the next one.\n * The returned promise resolves once the function has been run on all values.\n */\nexport function sequence<T>(\n values: T[],\n fn: (value: T) => Promise<void>\n): Promise<void> {\n let p = Promise.resolve();\n for (const value of values) {\n p = p.then(() => fn(value));\n }\n return p;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { fail } from '../util/assert';\n\nexport type FulfilledHandler<T, R> =\n | ((result: T) => R | PersistencePromise<R>)\n | null;\nexport type RejectedHandler<R> =\n | ((reason: Error) => R | PersistencePromise<R>)\n | null;\nexport type Resolver<T> = (value?: T) => void;\nexport type Rejector = (error: Error) => void;\n\n/**\n * PersistencePromise is essentially a re-implementation of Promise except\n * it has a .next() method instead of .then() and .next() and .catch() callbacks\n * are executed synchronously when a PersistencePromise resolves rather than\n * asynchronously (Promise implementations use setImmediate() or similar).\n *\n * This is necessary to interoperate with IndexedDB which will automatically\n * commit transactions if control is returned to the event loop without\n * synchronously initiating another operation on the transaction.\n *\n * NOTE: .then() and .catch() only allow a single consumer, unlike normal\n * Promises.\n */\nexport class PersistencePromise<T> {\n // NOTE: next/catchCallback will always point to our own wrapper functions,\n // not the user's raw next() or catch() callbacks.\n private nextCallback: FulfilledHandler<T, unknown> = null;\n private catchCallback: RejectedHandler<unknown> = null;\n\n // When the operation resolves, we'll set result or error and mark isDone.\n private result: T | undefined = undefined;\n private error: Error | undefined = undefined;\n private isDone = false;\n\n // Set to true when .then() or .catch() are called and prevents additional\n // chaining.\n private callbackAttached = false;\n\n constructor(callback: (resolve: Resolver<T>, reject: Rejector) => void) {\n callback(\n value => {\n this.isDone = true;\n this.result = value;\n if (this.nextCallback) {\n // value should be defined unless T is Void, but we can't express\n // that in the type system.\n this.nextCallback(value!);\n }\n },\n error => {\n this.isDone = true;\n this.error = error;\n if (this.catchCallback) {\n this.catchCallback(error);\n }\n }\n );\n }\n\n catch<R>(\n fn: (error: Error) => R | PersistencePromise<R>\n ): PersistencePromise<R> {\n return this.next(undefined, fn);\n }\n\n next<R>(\n nextFn?: FulfilledHandler<T, R>,\n catchFn?: RejectedHandler<R>\n ): PersistencePromise<R> {\n if (this.callbackAttached) {\n fail('Called next() or catch() twice for PersistencePromise');\n }\n this.callbackAttached = true;\n if (this.isDone) {\n if (!this.error) {\n return this.wrapSuccess(nextFn, this.result!);\n } else {\n return this.wrapFailure(catchFn, this.error);\n }\n } else {\n return new PersistencePromise<R>((resolve, reject) => {\n this.nextCallback = (value: T) => {\n this.wrapSuccess(nextFn, value).next(resolve, reject);\n };\n this.catchCallback = (error: Error) => {\n this.wrapFailure(catchFn, error).next(resolve, reject);\n };\n });\n }\n }\n\n toPromise(): Promise<T> {\n return new Promise((resolve, reject) => {\n this.next(resolve, reject);\n });\n }\n\n private wrapUserFunction<R>(\n fn: () => R | PersistencePromise<R>\n ): PersistencePromise<R> {\n try {\n const result = fn();\n if (result instanceof PersistencePromise) {\n return result;\n } else {\n return PersistencePromise.resolve(result);\n }\n } catch (e) {\n return PersistencePromise.reject<R>(e);\n }\n }\n\n private wrapSuccess<R>(\n nextFn: FulfilledHandler<T, R> | undefined,\n value: T\n ): PersistencePromise<R> {\n if (nextFn) {\n return this.wrapUserFunction(() => nextFn(value));\n } else {\n // If there's no nextFn, then R must be the same as T\n return PersistencePromise.resolve<R>((value as unknown) as R);\n }\n }\n\n private wrapFailure<R>(\n catchFn: RejectedHandler<R> | undefined,\n error: Error\n ): PersistencePromise<R> {\n if (catchFn) {\n return this.wrapUserFunction(() => catchFn(error));\n } else {\n return PersistencePromise.reject<R>(error);\n }\n }\n\n static resolve(): PersistencePromise<void>;\n static resolve<R>(result: R): PersistencePromise<R>;\n static resolve<R>(result?: R): PersistencePromise<R | void> {\n return new PersistencePromise<R | void>((resolve, reject) => {\n resolve(result);\n });\n }\n\n static reject<R>(error: Error): PersistencePromise<R> {\n return new PersistencePromise<R>((resolve, reject) => {\n reject(error);\n });\n }\n\n static waitFor(\n // Accept all Promise types in waitFor().\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n all: { forEach: (cb: (el: PersistencePromise<any>) => void) => void }\n ): PersistencePromise<void> {\n return new PersistencePromise<void>((resolve, reject) => {\n let expectedCount = 0;\n let resolvedCount = 0;\n let done = false;\n\n all.forEach(element => {\n ++expectedCount;\n element.next(\n () => {\n ++resolvedCount;\n if (done && resolvedCount === expectedCount) {\n resolve();\n }\n },\n err => reject(err)\n );\n });\n\n done = true;\n if (resolvedCount === expectedCount) {\n resolve();\n }\n });\n }\n\n /**\n * Given an array of predicate functions that asynchronously evaluate to a\n * boolean, implements a short-circuiting `or` between the results. Predicates\n * will be evaluated until one of them returns `true`, then stop. The final\n * result will be whether any of them returned `true`.\n */\n static or(\n predicates: Array<() => PersistencePromise<boolean>>\n ): PersistencePromise<boolean> {\n let p: PersistencePromise<boolean> = PersistencePromise.resolve<boolean>(\n false\n );\n for (const predicate of predicates) {\n p = p.next(isTrue => {\n if (isTrue) {\n return PersistencePromise.resolve<boolean>(isTrue);\n } else {\n return predicate();\n }\n });\n }\n return p;\n }\n\n /**\n * Given an iterable, call the given function on each element in the\n * collection and wait for all of the resulting concurrent PersistencePromises\n * to resolve.\n */\n static forEach<R, S>(\n collection: { forEach: (cb: (r: R, s: S) => void) => void },\n f:\n | ((r: R, s: S) => PersistencePromise<void>)\n | ((r: R) => PersistencePromise<void>)\n ): PersistencePromise<void>;\n static forEach<R>(\n collection: { forEach: (cb: (r: R) => void) => void },\n f: (r: R) => PersistencePromise<void>\n ): PersistencePromise<void>;\n static forEach<R, S>(\n collection: { forEach: (cb: (r: R, s?: S) => void) => void },\n f: (r: R, s?: S) => PersistencePromise<void>\n ): PersistencePromise<void> {\n const promises: Array<PersistencePromise<void>> = [];\n collection.forEach((r, s) => {\n promises.push(f.call(this, r, s));\n });\n return this.waitFor(promises);\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getUA } from '@firebase/util';\n\nimport { debugAssert } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug, logError } from '../util/log';\nimport { Deferred } from '../util/promise';\n\nimport { PersistencePromise } from './persistence_promise';\n\n// References to `window` are guarded by SimpleDb.isAvailable()\n/* eslint-disable no-restricted-globals */\n\nconst LOG_TAG = 'SimpleDb';\n\n/**\n * The maximum number of retry attempts for an IndexedDb transaction that fails\n * with a DOMException.\n */\nconst TRANSACTION_RETRY_COUNT = 3;\n\n// The different modes supported by `SimpleDb.runTransaction()`\ntype SimpleDbTransactionMode = 'readonly' | 'readwrite';\n\nexport interface SimpleDbSchemaConverter {\n createOrUpgrade(\n db: IDBDatabase,\n txn: IDBTransaction,\n fromVersion: number,\n toVersion: number\n ): PersistencePromise<void>;\n}\n\n/**\n * Wraps an IDBTransaction and exposes a store() method to get a handle to a\n * specific object store.\n */\nexport class SimpleDbTransaction {\n private aborted = false;\n\n /**\n * A promise that resolves with the result of the IndexedDb transaction.\n */\n private readonly completionDeferred = new Deferred<void>();\n\n static open(\n db: IDBDatabase,\n action: string,\n mode: IDBTransactionMode,\n objectStoreNames: string[]\n ): SimpleDbTransaction {\n try {\n return new SimpleDbTransaction(\n action,\n db.transaction(objectStoreNames, mode)\n );\n } catch (e) {\n throw new IndexedDbTransactionError(action, e);\n }\n }\n\n constructor(\n private readonly action: string,\n private readonly transaction: IDBTransaction\n ) {\n this.transaction.oncomplete = () => {\n this.completionDeferred.resolve();\n };\n this.transaction.onabort = () => {\n if (transaction.error) {\n this.completionDeferred.reject(\n new IndexedDbTransactionError(action, transaction.error)\n );\n } else {\n this.completionDeferred.resolve();\n }\n };\n this.transaction.onerror = (event: Event) => {\n const error = checkForAndReportiOSError(\n (event.target as IDBRequest).error!\n );\n this.completionDeferred.reject(\n new IndexedDbTransactionError(action, error)\n );\n };\n }\n\n get completionPromise(): Promise<void> {\n return this.completionDeferred.promise;\n }\n\n abort(error?: Error): void {\n if (error) {\n this.completionDeferred.reject(error);\n }\n\n if (!this.aborted) {\n logDebug(\n LOG_TAG,\n 'Aborting transaction:',\n error ? error.message : 'Client-initiated abort'\n );\n this.aborted = true;\n this.transaction.abort();\n }\n }\n\n /**\n * Returns a SimpleDbStore<KeyType, ValueType> for the specified store. All\n * operations performed on the SimpleDbStore happen within the context of this\n * transaction and it cannot be used anymore once the transaction is\n * completed.\n *\n * Note that we can't actually enforce that the KeyType and ValueType are\n * correct, but they allow type safety through the rest of the consuming code.\n */\n store<KeyType extends IDBValidKey, ValueType extends unknown>(\n storeName: string\n ): SimpleDbStore<KeyType, ValueType> {\n const store = this.transaction.objectStore(storeName);\n debugAssert(!!store, 'Object store not part of transaction: ' + storeName);\n return new SimpleDbStore<KeyType, ValueType>(store);\n }\n}\n\n/**\n * Provides a wrapper around IndexedDb with a simplified interface that uses\n * Promise-like return values to chain operations. Real promises cannot be used\n * since .then() continuations are executed asynchronously (e.g. via\n * .setImmediate), which would cause IndexedDB to end the transaction.\n * See PersistencePromise for more details.\n */\nexport class SimpleDb {\n private db?: IDBDatabase;\n private versionchangelistener?: (event: IDBVersionChangeEvent) => void;\n\n /** Deletes the specified database. */\n static delete(name: string): Promise<void> {\n logDebug(LOG_TAG, 'Removing database:', name);\n return wrapRequest<void>(window.indexedDB.deleteDatabase(name)).toPromise();\n }\n\n /** Returns true if IndexedDB is available in the current environment. */\n static isAvailable(): boolean {\n if (typeof indexedDB === 'undefined') {\n return false;\n }\n\n if (SimpleDb.isMockPersistence()) {\n return true;\n }\n\n // We extensively use indexed array values and compound keys,\n // which IE and Edge do not support. However, they still have indexedDB\n // defined on the window, so we need to check for them here and make sure\n // to return that persistence is not enabled for those browsers.\n // For tracking support of this feature, see here:\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/status/indexeddbarraysandmultientrysupport/\n\n // Check the UA string to find out the browser.\n const ua = getUA();\n\n // IE 10\n // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';\n\n // IE 11\n // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';\n\n // Edge\n // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,\n // like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';\n\n // iOS Safari: Disable for users running iOS version < 10.\n const iOSVersion = SimpleDb.getIOSVersion(ua);\n const isUnsupportedIOS = 0 < iOSVersion && iOSVersion < 10;\n\n // Android browser: Disable for userse running version < 4.5.\n const androidVersion = SimpleDb.getAndroidVersion(ua);\n const isUnsupportedAndroid = 0 < androidVersion && androidVersion < 4.5;\n\n if (\n ua.indexOf('MSIE ') > 0 ||\n ua.indexOf('Trident/') > 0 ||\n ua.indexOf('Edge/') > 0 ||\n isUnsupportedIOS ||\n isUnsupportedAndroid\n ) {\n return false;\n } else {\n return true;\n }\n }\n\n /**\n * Returns true if the backing IndexedDB store is the Node IndexedDBShim\n * (see https://github.com/axemclion/IndexedDBShim).\n */\n static isMockPersistence(): boolean {\n return (\n typeof process !== 'undefined' &&\n process.env?.USE_MOCK_PERSISTENCE === 'YES'\n );\n }\n\n /** Helper to get a typed SimpleDbStore from a transaction. */\n static getStore<KeyType extends IDBValidKey, ValueType extends unknown>(\n txn: SimpleDbTransaction,\n store: string\n ): SimpleDbStore<KeyType, ValueType> {\n return txn.store<KeyType, ValueType>(store);\n }\n\n // visible for testing\n /** Parse User Agent to determine iOS version. Returns -1 if not found. */\n static getIOSVersion(ua: string): number {\n const iOSVersionRegex = ua.match(/i(?:phone|pad|pod) os ([\\d_]+)/i);\n const version = iOSVersionRegex\n ? iOSVersionRegex[1].split('_').slice(0, 2).join('.')\n : '-1';\n return Number(version);\n }\n\n // visible for testing\n /** Parse User Agent to determine Android version. Returns -1 if not found. */\n static getAndroidVersion(ua: string): number {\n const androidVersionRegex = ua.match(/Android ([\\d.]+)/i);\n const version = androidVersionRegex\n ? androidVersionRegex[1].split('.').slice(0, 2).join('.')\n : '-1';\n return Number(version);\n }\n\n /*\n * Creates a new SimpleDb wrapper for IndexedDb database `name`.\n *\n * Note that `version` must not be a downgrade. IndexedDB does not support\n * downgrading the schema version. We currently do not support any way to do\n * versioning outside of IndexedDB's versioning mechanism, as only\n * version-upgrade transactions are allowed to do things like create\n * objectstores.\n */\n constructor(\n private readonly name: string,\n private readonly version: number,\n private readonly schemaConverter: SimpleDbSchemaConverter\n ) {\n debugAssert(\n SimpleDb.isAvailable(),\n 'IndexedDB not supported in current environment.'\n );\n\n const iOSVersion = SimpleDb.getIOSVersion(getUA());\n // NOTE: According to https://bugs.webkit.org/show_bug.cgi?id=197050, the\n // bug we're checking for should exist in iOS >= 12.2 and < 13, but for\n // whatever reason it's much harder to hit after 12.2 so we only proactively\n // log on 12.2.\n if (iOSVersion === 12.2) {\n logError(\n 'Firestore persistence suffers from a bug in iOS 12.2 ' +\n 'Safari that may cause your app to stop working. See ' +\n 'https://stackoverflow.com/q/56496296/110915 for details ' +\n 'and a potential workaround.'\n );\n }\n }\n\n /**\n * Opens the specified database, creating or upgrading it if necessary.\n */\n async ensureDb(action: string): Promise<IDBDatabase> {\n if (!this.db) {\n logDebug(LOG_TAG, 'Opening database:', this.name);\n this.db = await new Promise<IDBDatabase>((resolve, reject) => {\n // TODO(mikelehen): Investigate browser compatibility.\n // https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB\n // suggests IE9 and older WebKit browsers handle upgrade\n // differently. They expect setVersion, as described here:\n // https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeRequest/setVersion\n const request = indexedDB.open(this.name, this.version);\n\n request.onsuccess = (event: Event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n resolve(db);\n };\n\n request.onblocked = () => {\n reject(\n new IndexedDbTransactionError(\n action,\n 'Cannot upgrade IndexedDB schema while another tab is open. ' +\n 'Close all tabs that access Firestore and reload this page to proceed.'\n )\n );\n };\n\n request.onerror = (event: Event) => {\n const error: DOMException = (event.target as IDBOpenDBRequest).error!;\n if (error.name === 'VersionError') {\n reject(\n new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'A newer version of the Firestore SDK was previously used and so the persisted ' +\n 'data is not compatible with the version of the SDK you are now using. The SDK ' +\n 'will operate with persistence disabled. If you need persistence, please ' +\n 're-upgrade to a newer version of the SDK or else clear the persisted IndexedDB ' +\n 'data for your app to start fresh.'\n )\n );\n } else {\n reject(new IndexedDbTransactionError(action, error));\n }\n };\n\n request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\n logDebug(\n LOG_TAG,\n 'Database \"' + this.name + '\" requires upgrade from version:',\n event.oldVersion\n );\n const db = (event.target as IDBOpenDBRequest).result;\n this.schemaConverter\n .createOrUpgrade(\n db,\n request.transaction!,\n event.oldVersion,\n this.version\n )\n .next(() => {\n logDebug(\n LOG_TAG,\n 'Database upgrade to version ' + this.version + ' complete'\n );\n });\n };\n });\n }\n\n if (this.versionchangelistener) {\n this.db.onversionchange = event => this.versionchangelistener!(event);\n }\n return this.db;\n }\n\n setVersionChangeListener(\n versionChangeListener: (event: IDBVersionChangeEvent) => void\n ): void {\n this.versionchangelistener = versionChangeListener;\n if (this.db) {\n this.db.onversionchange = (event: IDBVersionChangeEvent) => {\n return versionChangeListener(event);\n };\n }\n }\n\n async runTransaction<T>(\n action: string,\n mode: SimpleDbTransactionMode,\n objectStores: string[],\n transactionFn: (transaction: SimpleDbTransaction) => PersistencePromise<T>\n ): Promise<T> {\n const readonly = mode === 'readonly';\n let attemptNumber = 0;\n\n while (true) {\n ++attemptNumber;\n\n try {\n this.db = await this.ensureDb(action);\n\n const transaction = SimpleDbTransaction.open(\n this.db,\n action,\n readonly ? 'readonly' : 'readwrite',\n objectStores\n );\n const transactionFnResult = transactionFn(transaction)\n .catch(error => {\n // Abort the transaction if there was an error.\n transaction.abort(error);\n // We cannot actually recover, and calling `abort()` will cause the transaction's\n // completion promise to be rejected. This in turn means that we won't use\n // `transactionFnResult` below. We return a rejection here so that we don't add the\n // possibility of returning `void` to the type of `transactionFnResult`.\n return PersistencePromise.reject<T>(error);\n })\n .toPromise();\n\n // As noted above, errors are propagated by aborting the transaction. So\n // we swallow any error here to avoid the browser logging it as unhandled.\n transactionFnResult.catch(() => {});\n\n // Wait for the transaction to complete (i.e. IndexedDb's onsuccess event to\n // fire), but still return the original transactionFnResult back to the\n // caller.\n await transaction.completionPromise;\n return transactionFnResult;\n } catch (error) {\n // TODO(schmidt-sebastian): We could probably be smarter about this and\n // not retry exceptions that are likely unrecoverable (such as quota\n // exceeded errors).\n\n // Note: We cannot use an instanceof check for FirestoreException, since the\n // exception is wrapped in a generic error by our async/await handling.\n const retryable =\n error.name !== 'FirebaseError' &&\n attemptNumber < TRANSACTION_RETRY_COUNT;\n logDebug(\n LOG_TAG,\n 'Transaction failed with error:',\n error.message,\n 'Retrying:',\n retryable\n );\n\n this.close();\n\n if (!retryable) {\n return Promise.reject(error);\n }\n }\n }\n }\n\n close(): void {\n if (this.db) {\n this.db.close();\n }\n this.db = undefined;\n }\n}\n\n/**\n * A controller for iterating over a key range or index. It allows an iterate\n * callback to delete the currently-referenced object, or jump to a new key\n * within the key range or index.\n */\nexport class IterationController {\n private shouldStop = false;\n private nextKey: IDBValidKey | null = null;\n\n constructor(private dbCursor: IDBCursorWithValue) {}\n\n get isDone(): boolean {\n return this.shouldStop;\n }\n\n get skipToKey(): IDBValidKey | null {\n return this.nextKey;\n }\n\n set cursor(value: IDBCursorWithValue) {\n this.dbCursor = value;\n }\n\n /**\n * This function can be called to stop iteration at any point.\n */\n done(): void {\n this.shouldStop = true;\n }\n\n /**\n * This function can be called to skip to that next key, which could be\n * an index or a primary key.\n */\n skip(key: IDBValidKey): void {\n this.nextKey = key;\n }\n\n /**\n * Delete the current cursor value from the object store.\n *\n * NOTE: You CANNOT do this with a keysOnly query.\n */\n delete(): PersistencePromise<void> {\n return wrapRequest<void>(this.dbCursor.delete());\n }\n}\n\n/**\n * Callback used with iterate() method.\n */\nexport type IterateCallback<KeyType, ValueType> = (\n key: KeyType,\n value: ValueType,\n control: IterationController\n) => void | PersistencePromise<void>;\n\n/** Options available to the iterate() method. */\nexport interface IterateOptions {\n /** Index to iterate over (else primary keys will be iterated) */\n index?: string;\n\n /** IndxedDB Range to iterate over (else entire store will be iterated) */\n range?: IDBKeyRange;\n\n /** If true, values aren't read while iterating. */\n keysOnly?: boolean;\n\n /** If true, iterate over the store in reverse. */\n reverse?: boolean;\n}\n\n/** An error that wraps exceptions that thrown during IndexedDB execution. */\nexport class IndexedDbTransactionError extends FirestoreError {\n name = 'IndexedDbTransactionError';\n\n constructor(actionName: string, cause: Error | string) {\n super(\n Code.UNAVAILABLE,\n `IndexedDB transaction '${actionName}' failed: ${cause}`\n );\n }\n}\n\n/** Verifies whether `e` is an IndexedDbTransactionError. */\nexport function isIndexedDbTransactionError(e: Error): boolean {\n // Use name equality, as instanceof checks on errors don't work with errors\n // that wrap other errors.\n return e.name === 'IndexedDbTransactionError';\n}\n\n/**\n * A wrapper around an IDBObjectStore providing an API that:\n *\n * 1) Has generic KeyType / ValueType parameters to provide strongly-typed\n * methods for acting against the object store.\n * 2) Deals with IndexedDB's onsuccess / onerror event callbacks, making every\n * method return a PersistencePromise instead.\n * 3) Provides a higher-level API to avoid needing to do excessive wrapping of\n * intermediate IndexedDB types (IDBCursorWithValue, etc.)\n */\nexport class SimpleDbStore<\n KeyType extends IDBValidKey,\n ValueType extends unknown\n> {\n constructor(private store: IDBObjectStore) {}\n\n /**\n * Writes a value into the Object Store.\n *\n * @param key - Optional explicit key to use when writing the object, else the\n * key will be auto-assigned (e.g. via the defined keyPath for the store).\n * @param value - The object to write.\n */\n put(value: ValueType): PersistencePromise<void>;\n put(key: KeyType, value: ValueType): PersistencePromise<void>;\n put(\n keyOrValue: KeyType | ValueType,\n value?: ValueType\n ): PersistencePromise<void> {\n let request;\n if (value !== undefined) {\n logDebug(LOG_TAG, 'PUT', this.store.name, keyOrValue, value);\n request = this.store.put(value, keyOrValue as KeyType);\n } else {\n logDebug(LOG_TAG, 'PUT', this.store.name, '<auto-key>', keyOrValue);\n request = this.store.put(keyOrValue as ValueType);\n }\n return wrapRequest<void>(request);\n }\n\n /**\n * Adds a new value into an Object Store and returns the new key. Similar to\n * IndexedDb's `add()`, this method will fail on primary key collisions.\n *\n * @param value - The object to write.\n * @returns The key of the value to add.\n */\n add(value: ValueType): PersistencePromise<KeyType> {\n logDebug(LOG_TAG, 'ADD', this.store.name, value, value);\n const request = this.store.add(value as ValueType);\n return wrapRequest<KeyType>(request);\n }\n\n /**\n * Gets the object with the specified key from the specified store, or null\n * if no object exists with the specified key.\n *\n * @key The key of the object to get.\n * @returns The object with the specified key or null if no object exists.\n */\n get(key: KeyType): PersistencePromise<ValueType | null> {\n const request = this.store.get(key);\n // We're doing an unsafe cast to ValueType.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return wrapRequest<any>(request).next(result => {\n // Normalize nonexistence to null.\n if (result === undefined) {\n result = null;\n }\n logDebug(LOG_TAG, 'GET', this.store.name, key, result);\n return result;\n });\n }\n\n delete(key: KeyType | IDBKeyRange): PersistencePromise<void> {\n logDebug(LOG_TAG, 'DELETE', this.store.name, key);\n const request = this.store.delete(key);\n return wrapRequest<void>(request);\n }\n\n /**\n * If we ever need more of the count variants, we can add overloads. For now,\n * all we need is to count everything in a store.\n *\n * Returns the number of rows in the store.\n */\n count(): PersistencePromise<number> {\n logDebug(LOG_TAG, 'COUNT', this.store.name);\n const request = this.store.count();\n return wrapRequest<number>(request);\n }\n\n loadAll(): PersistencePromise<ValueType[]>;\n loadAll(range: IDBKeyRange): PersistencePromise<ValueType[]>;\n loadAll(index: string, range: IDBKeyRange): PersistencePromise<ValueType[]>;\n loadAll(\n indexOrRange?: string | IDBKeyRange,\n range?: IDBKeyRange\n ): PersistencePromise<ValueType[]> {\n const cursor = this.cursor(this.options(indexOrRange, range));\n const results: ValueType[] = [];\n return this.iterateCursor(cursor, (key, value) => {\n results.push(value);\n }).next(() => {\n return results;\n });\n }\n\n deleteAll(): PersistencePromise<void>;\n deleteAll(range: IDBKeyRange): PersistencePromise<void>;\n deleteAll(index: string, range: IDBKeyRange): PersistencePromise<void>;\n deleteAll(\n indexOrRange?: string | IDBKeyRange,\n range?: IDBKeyRange\n ): PersistencePromise<void> {\n logDebug(LOG_TAG, 'DELETE ALL', this.store.name);\n const options = this.options(indexOrRange, range);\n options.keysOnly = false;\n const cursor = this.cursor(options);\n return this.iterateCursor(cursor, (key, value, control) => {\n // NOTE: Calling delete() on a cursor is documented as more efficient than\n // calling delete() on an object store with a single key\n // (https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/delete),\n // however, this requires us *not* to use a keysOnly cursor\n // (https://developer.mozilla.org/en-US/docs/Web/API/IDBCursor/delete). We\n // may want to compare the performance of each method.\n return control.delete();\n });\n }\n\n /**\n * Iterates over keys and values in an object store.\n *\n * @param options - Options specifying how to iterate the objects in the\n * store.\n * @param callback - will be called for each iterated object. Iteration can be\n * canceled at any point by calling the doneFn passed to the callback.\n * The callback can return a PersistencePromise if it performs async\n * operations but note that iteration will continue without waiting for them\n * to complete.\n * @returns A PersistencePromise that resolves once all PersistencePromises\n * returned by callbacks resolve.\n */\n iterate(\n callback: IterateCallback<KeyType, ValueType>\n ): PersistencePromise<void>;\n iterate(\n options: IterateOptions,\n callback: IterateCallback<KeyType, ValueType>\n ): PersistencePromise<void>;\n iterate(\n optionsOrCallback: IterateOptions | IterateCallback<KeyType, ValueType>,\n callback?: IterateCallback<KeyType, ValueType>\n ): PersistencePromise<void> {\n let options;\n if (!callback) {\n options = {};\n callback = optionsOrCallback as IterateCallback<KeyType, ValueType>;\n } else {\n options = optionsOrCallback as IterateOptions;\n }\n const cursor = this.cursor(options);\n return this.iterateCursor(cursor, callback);\n }\n\n /**\n * Iterates over a store, but waits for the given callback to complete for\n * each entry before iterating the next entry. This allows the callback to do\n * asynchronous work to determine if this iteration should continue.\n *\n * The provided callback should return `true` to continue iteration, and\n * `false` otherwise.\n */\n iterateSerial(\n callback: (k: KeyType, v: ValueType) => PersistencePromise<boolean>\n ): PersistencePromise<void> {\n const cursorRequest = this.cursor({});\n return new PersistencePromise((resolve, reject) => {\n cursorRequest.onerror = (event: Event) => {\n const error = checkForAndReportiOSError(\n (event.target as IDBRequest).error!\n );\n reject(error);\n };\n cursorRequest.onsuccess = (event: Event) => {\n const cursor: IDBCursorWithValue = (event.target as IDBRequest).result;\n if (!cursor) {\n resolve();\n return;\n }\n\n callback(cursor.primaryKey as KeyType, cursor.value).next(\n shouldContinue => {\n if (shouldContinue) {\n cursor.continue();\n } else {\n resolve();\n }\n }\n );\n };\n });\n }\n\n private iterateCursor(\n cursorRequest: IDBRequest,\n fn: IterateCallback<KeyType, ValueType>\n ): PersistencePromise<void> {\n const results: Array<PersistencePromise<void>> = [];\n return new PersistencePromise((resolve, reject) => {\n cursorRequest.onerror = (event: Event) => {\n reject((event.target as IDBRequest).error!);\n };\n cursorRequest.onsuccess = (event: Event) => {\n const cursor: IDBCursorWithValue = (event.target as IDBRequest).result;\n if (!cursor) {\n resolve();\n return;\n }\n const controller = new IterationController(cursor);\n const userResult = fn(\n cursor.primaryKey as KeyType,\n cursor.value,\n controller\n );\n if (userResult instanceof PersistencePromise) {\n const userPromise: PersistencePromise<void> = userResult.catch(\n err => {\n controller.done();\n return PersistencePromise.reject(err);\n }\n );\n results.push(userPromise);\n }\n if (controller.isDone) {\n resolve();\n } else if (controller.skipToKey === null) {\n cursor.continue();\n } else {\n cursor.continue(controller.skipToKey);\n }\n };\n }).next(() => {\n return PersistencePromise.waitFor(results);\n });\n }\n\n private options(\n indexOrRange?: string | IDBKeyRange,\n range?: IDBKeyRange\n ): IterateOptions {\n let indexName: string | undefined = undefined;\n if (indexOrRange !== undefined) {\n if (typeof indexOrRange === 'string') {\n indexName = indexOrRange;\n } else {\n debugAssert(\n range === undefined,\n '3rd argument must not be defined if 2nd is a range.'\n );\n range = indexOrRange;\n }\n }\n return { index: indexName, range };\n }\n\n private cursor(options: IterateOptions): IDBRequest {\n let direction: IDBCursorDirection = 'next';\n if (options.reverse) {\n direction = 'prev';\n }\n if (options.index) {\n const index = this.store.index(options.index);\n if (options.keysOnly) {\n return index.openKeyCursor(options.range, direction);\n } else {\n return index.openCursor(options.range, direction);\n }\n } else {\n return this.store.openCursor(options.range, direction);\n }\n }\n}\n\n/**\n * Wraps an IDBRequest in a PersistencePromise, using the onsuccess / onerror\n * handlers to resolve / reject the PersistencePromise as appropriate.\n */\nfunction wrapRequest<R>(request: IDBRequest): PersistencePromise<R> {\n return new PersistencePromise<R>((resolve, reject) => {\n request.onsuccess = (event: Event) => {\n const result = (event.target as IDBRequest).result;\n resolve(result);\n };\n\n request.onerror = (event: Event) => {\n const error = checkForAndReportiOSError(\n (event.target as IDBRequest).error!\n );\n reject(error);\n };\n });\n}\n\n// Guard so we only report the error once.\nlet reportedIOSError = false;\nfunction checkForAndReportiOSError(error: DOMException): Error {\n const iOSVersion = SimpleDb.getIOSVersion(getUA());\n if (iOSVersion >= 12.2 && iOSVersion < 13) {\n const IOS_ERROR =\n 'An internal error was encountered in the Indexed Database server';\n if (error.message.indexOf(IOS_ERROR) >= 0) {\n // Wrap error in a more descriptive one.\n const newError = new FirestoreError(\n 'internal',\n `IOS_INDEXEDDB_BUG1: IndexedDb has thrown '${IOS_ERROR}'. This is likely ` +\n `due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 ` +\n `for details and a potential workaround.`\n );\n if (!reportedIOSError) {\n reportedIOSError = true;\n // Throw a global exception outside of this promise chain, for the user to\n // potentially catch.\n setTimeout(() => {\n throw newError;\n }, 0);\n }\n return newError;\n }\n }\n return error;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListenSequenceNumber } from '../core/types';\nimport { debugCast } from '../util/assert';\n\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { SimpleDb, SimpleDbStore, SimpleDbTransaction } from './simple_db';\n\nexport class IndexedDbTransaction extends PersistenceTransaction {\n constructor(\n readonly simpleDbTransaction: SimpleDbTransaction,\n readonly currentSequenceNumber: ListenSequenceNumber\n ) {\n super();\n }\n}\n\nexport function getStore<Key extends IDBValidKey, Value>(\n txn: PersistenceTransaction,\n store: string\n): SimpleDbStore<Key, Value> {\n const indexedDbTransaction = debugCast(txn, IndexedDbTransaction);\n return SimpleDb.getStore<Key, Value>(\n indexedDbTransaction.simpleDbTransaction,\n store\n );\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { BatchId } from '../core/types';\nimport { Timestamp } from '../lite/timestamp';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { arrayEquals } from '../util/misc';\n\nimport {\n documentKeySet,\n DocumentKeySet,\n DocumentMap,\n DocumentVersionMap,\n documentVersionMap\n} from './collections';\nimport { MutableDocument } from './document';\nimport {\n applyMutationToLocalView,\n applyMutationToRemoteDocument,\n Mutation,\n mutationEquals,\n MutationResult\n} from './mutation';\n\n/**\n * A batch of mutations that will be sent as one unit to the backend.\n */\nexport class MutationBatch {\n /**\n * @param batchId - The unique ID of this mutation batch.\n * @param localWriteTime - The original write time of this mutation.\n * @param baseMutations - Mutations that are used to populate the base\n * values when this mutation is applied locally. This can be used to locally\n * overwrite values that are persisted in the remote document cache. Base\n * mutations are never sent to the backend.\n * @param mutations - The user-provided mutations in this mutation batch.\n * User-provided mutations are applied both locally and remotely on the\n * backend.\n */\n constructor(\n public batchId: BatchId,\n public localWriteTime: Timestamp,\n public baseMutations: Mutation[],\n public mutations: Mutation[]\n ) {\n debugAssert(mutations.length > 0, 'Cannot create an empty mutation batch');\n }\n\n /**\n * Applies all the mutations in this MutationBatch to the specified document\n * to compute the state of the remote document\n *\n * @param document - The document to apply mutations to.\n * @param batchResult - The result of applying the MutationBatch to the\n * backend.\n */\n applyToRemoteDocument(\n document: MutableDocument,\n batchResult: MutationBatchResult\n ): void {\n const mutationResults = batchResult.mutationResults;\n debugAssert(\n mutationResults.length === this.mutations.length,\n `Mismatch between mutations length\n (${this.mutations.length}) and mutation results length\n (${mutationResults.length}).`\n );\n\n for (let i = 0; i < this.mutations.length; i++) {\n const mutation = this.mutations[i];\n if (mutation.key.isEqual(document.key)) {\n const mutationResult = mutationResults[i];\n applyMutationToRemoteDocument(mutation, document, mutationResult);\n }\n }\n }\n\n /**\n * Computes the local view of a document given all the mutations in this\n * batch.\n *\n * @param document - The document to apply mutations to.\n */\n applyToLocalView(document: MutableDocument): void {\n // First, apply the base state. This allows us to apply non-idempotent\n // transform against a consistent set of values.\n for (const mutation of this.baseMutations) {\n if (mutation.key.isEqual(document.key)) {\n applyMutationToLocalView(mutation, document, this.localWriteTime);\n }\n }\n\n // Second, apply all user-provided mutations.\n for (const mutation of this.mutations) {\n if (mutation.key.isEqual(document.key)) {\n applyMutationToLocalView(mutation, document, this.localWriteTime);\n }\n }\n }\n\n /**\n * Computes the local view for all provided documents given the mutations in\n * this batch.\n */\n applyToLocalDocumentSet(documentMap: DocumentMap): void {\n // TODO(mrschmidt): This implementation is O(n^2). If we apply the mutations\n // directly (as done in `applyToLocalView()`), we can reduce the complexity\n // to O(n).\n this.mutations.forEach(m => {\n const document = documentMap.get(m.key)!;\n // TODO(mutabledocuments): This method should take a MutableDocumentMap\n // and we should remove this cast.\n const mutableDocument = document as MutableDocument;\n this.applyToLocalView(mutableDocument);\n if (!document.isValidDocument()) {\n mutableDocument.convertToNoDocument(SnapshotVersion.min());\n }\n });\n }\n\n keys(): DocumentKeySet {\n return this.mutations.reduce(\n (keys, m) => keys.add(m.key),\n documentKeySet()\n );\n }\n\n isEqual(other: MutationBatch): boolean {\n return (\n this.batchId === other.batchId &&\n arrayEquals(this.mutations, other.mutations, (l, r) =>\n mutationEquals(l, r)\n ) &&\n arrayEquals(this.baseMutations, other.baseMutations, (l, r) =>\n mutationEquals(l, r)\n )\n );\n }\n}\n\n/** The result of applying a mutation batch to the backend. */\nexport class MutationBatchResult {\n private constructor(\n readonly batch: MutationBatch,\n readonly commitVersion: SnapshotVersion,\n readonly mutationResults: MutationResult[],\n /**\n * A pre-computed mapping from each mutated document to the resulting\n * version.\n */\n readonly docVersions: DocumentVersionMap\n ) {}\n\n /**\n * Creates a new MutationBatchResult for the given batch and results. There\n * must be one result for each mutation in the batch. This static factory\n * caches a document=&gt;version mapping (docVersions).\n */\n static from(\n batch: MutationBatch,\n commitVersion: SnapshotVersion,\n results: MutationResult[]\n ): MutationBatchResult {\n hardAssert(\n batch.mutations.length === results.length,\n 'Mutations sent ' +\n batch.mutations.length +\n ' must equal results received ' +\n results.length\n );\n\n let versionMap = documentVersionMap();\n const mutations = batch.mutations;\n for (let i = 0; i < mutations.length; i++) {\n versionMap = versionMap.insert(mutations[i].key, results[i].version);\n }\n\n return new MutationBatchResult(batch, commitVersion, results, versionMap);\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { Target } from '../core/target';\nimport { ListenSequenceNumber, TargetId } from '../core/types';\nimport { ByteString } from '../util/byte_string';\n\n/** An enumeration of the different purposes we have for targets. */\nexport const enum TargetPurpose {\n /** A regular, normal query target. */\n Listen,\n\n /**\n * The query target was used to refill a query after an existence filter mismatch.\n */\n ExistenceFilterMismatch,\n\n /** The query target was used to resolve a limbo document. */\n LimboResolution\n}\n\n/**\n * An immutable set of metadata that the local store tracks for each target.\n */\nexport class TargetData {\n constructor(\n /** The target being listened to. */\n readonly target: Target,\n /**\n * The target ID to which the target corresponds; Assigned by the\n * LocalStore for user listens and by the SyncEngine for limbo watches.\n */\n readonly targetId: TargetId,\n /** The purpose of the target. */\n readonly purpose: TargetPurpose,\n /**\n * The sequence number of the last transaction during which this target data\n * was modified.\n */\n readonly sequenceNumber: ListenSequenceNumber,\n /** The latest snapshot version seen for this target. */\n readonly snapshotVersion: SnapshotVersion = SnapshotVersion.min(),\n /**\n * The maximum snapshot version at which the associated view\n * contained no limbo documents.\n */\n readonly lastLimboFreeSnapshotVersion: SnapshotVersion = SnapshotVersion.min(),\n /**\n * An opaque, server-assigned token that allows watching a target to be\n * resumed after disconnecting without retransmitting all the data that\n * matches the target. The resume token essentially identifies a point in\n * time from which the server should resume sending results.\n */\n readonly resumeToken: ByteString = ByteString.EMPTY_BYTE_STRING\n ) {}\n\n /** Creates a new target data instance with an updated sequence number. */\n withSequenceNumber(sequenceNumber: number): TargetData {\n return new TargetData(\n this.target,\n this.targetId,\n this.purpose,\n sequenceNumber,\n this.snapshotVersion,\n this.lastLimboFreeSnapshotVersion,\n this.resumeToken\n );\n }\n\n /**\n * Creates a new target data instance with an updated resume token and\n * snapshot version.\n */\n withResumeToken(\n resumeToken: ByteString,\n snapshotVersion: SnapshotVersion\n ): TargetData {\n return new TargetData(\n this.target,\n this.targetId,\n this.purpose,\n this.sequenceNumber,\n snapshotVersion,\n this.lastLimboFreeSnapshotVersion,\n resumeToken\n );\n }\n\n /**\n * Creates a new target data instance with an updated last limbo free\n * snapshot version number.\n */\n withLastLimboFreeSnapshotVersion(\n lastLimboFreeSnapshotVersion: SnapshotVersion\n ): TargetData {\n return new TargetData(\n this.target,\n this.targetId,\n this.purpose,\n this.sequenceNumber,\n this.snapshotVersion,\n lastLimboFreeSnapshotVersion,\n this.resumeToken\n );\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BundleMetadata, NamedQuery } from '../core/bundle';\nimport { LimitType, Query, queryWithLimit } from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { canonifyTarget, isDocumentTarget, Target } from '../core/target';\nimport { Timestamp } from '../exp/timestamp';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { MutationBatch } from '../model/mutation_batch';\nimport {\n BundleMetadata as ProtoBundleMetadata,\n NamedQuery as ProtoNamedQuery,\n BundledQuery as ProtoBundledQuery\n} from '../protos/firestore_bundle_proto';\nimport { DocumentsTarget as PublicDocumentsTarget } from '../protos/firestore_proto_api';\nimport {\n convertQueryTargetToQuery,\n fromDocument,\n fromDocumentsTarget,\n fromMutation,\n fromQueryTarget,\n fromVersion,\n JsonProtoSerializer,\n toDocument,\n toDocumentsTarget,\n toMutation,\n toQueryTarget\n} from '../remote/serializer';\nimport { debugAssert, fail } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\n\nimport {\n DbBundle,\n DbMutationBatch,\n DbNamedQuery,\n DbNoDocument,\n DbQuery,\n DbRemoteDocument,\n DbTarget,\n DbTimestamp,\n DbTimestampKey,\n DbUnknownDocument\n} from './indexeddb_schema';\nimport { TargetData, TargetPurpose } from './target_data';\n\n/** Serializer for values stored in the LocalStore. */\nexport class LocalSerializer {\n constructor(readonly remoteSerializer: JsonProtoSerializer) {}\n}\n\n/** Decodes a remote document from storage locally to a Document. */\nexport function fromDbRemoteDocument(\n localSerializer: LocalSerializer,\n remoteDoc: DbRemoteDocument\n): MutableDocument {\n if (remoteDoc.document) {\n return fromDocument(\n localSerializer.remoteSerializer,\n remoteDoc.document,\n !!remoteDoc.hasCommittedMutations\n );\n } else if (remoteDoc.noDocument) {\n const key = DocumentKey.fromSegments(remoteDoc.noDocument.path);\n const version = fromDbTimestamp(remoteDoc.noDocument.readTime);\n const document = MutableDocument.newNoDocument(key, version);\n return remoteDoc.hasCommittedMutations\n ? document.setHasCommittedMutations()\n : document;\n } else if (remoteDoc.unknownDocument) {\n const key = DocumentKey.fromSegments(remoteDoc.unknownDocument.path);\n const version = fromDbTimestamp(remoteDoc.unknownDocument.version);\n return MutableDocument.newUnknownDocument(key, version);\n } else {\n return fail('Unexpected DbRemoteDocument');\n }\n}\n\n/** Encodes a document for storage locally. */\nexport function toDbRemoteDocument(\n localSerializer: LocalSerializer,\n document: MutableDocument,\n readTime: SnapshotVersion\n): DbRemoteDocument {\n const dbReadTime = toDbTimestampKey(readTime);\n const parentPath = document.key.path.popLast().toArray();\n if (document.isFoundDocument()) {\n const doc = toDocument(localSerializer.remoteSerializer, document);\n const hasCommittedMutations = document.hasCommittedMutations;\n return new DbRemoteDocument(\n /* unknownDocument= */ null,\n /* noDocument= */ null,\n doc,\n hasCommittedMutations,\n dbReadTime,\n parentPath\n );\n } else if (document.isNoDocument()) {\n const path = document.key.path.toArray();\n const readTime = toDbTimestamp(document.version);\n const hasCommittedMutations = document.hasCommittedMutations;\n return new DbRemoteDocument(\n /* unknownDocument= */ null,\n new DbNoDocument(path, readTime),\n /* document= */ null,\n hasCommittedMutations,\n dbReadTime,\n parentPath\n );\n } else if (document.isUnknownDocument()) {\n const path = document.key.path.toArray();\n const readTime = toDbTimestamp(document.version);\n return new DbRemoteDocument(\n new DbUnknownDocument(path, readTime),\n /* noDocument= */ null,\n /* document= */ null,\n /* hasCommittedMutations= */ true,\n dbReadTime,\n parentPath\n );\n } else {\n return fail('Unexpected Document ' + document);\n }\n}\n\nexport function toDbTimestampKey(\n snapshotVersion: SnapshotVersion\n): DbTimestampKey {\n const timestamp = snapshotVersion.toTimestamp();\n return [timestamp.seconds, timestamp.nanoseconds];\n}\n\nexport function fromDbTimestampKey(\n dbTimestampKey: DbTimestampKey\n): SnapshotVersion {\n const timestamp = new Timestamp(dbTimestampKey[0], dbTimestampKey[1]);\n return SnapshotVersion.fromTimestamp(timestamp);\n}\n\nfunction toDbTimestamp(snapshotVersion: SnapshotVersion): DbTimestamp {\n const timestamp = snapshotVersion.toTimestamp();\n return new DbTimestamp(timestamp.seconds, timestamp.nanoseconds);\n}\n\nfunction fromDbTimestamp(dbTimestamp: DbTimestamp): SnapshotVersion {\n const timestamp = new Timestamp(dbTimestamp.seconds, dbTimestamp.nanoseconds);\n return SnapshotVersion.fromTimestamp(timestamp);\n}\n\n/** Encodes a batch of mutations into a DbMutationBatch for local storage. */\nexport function toDbMutationBatch(\n localSerializer: LocalSerializer,\n userId: string,\n batch: MutationBatch\n): DbMutationBatch {\n const serializedBaseMutations = batch.baseMutations.map(m =>\n toMutation(localSerializer.remoteSerializer, m)\n );\n const serializedMutations = batch.mutations.map(m =>\n toMutation(localSerializer.remoteSerializer, m)\n );\n return new DbMutationBatch(\n userId,\n batch.batchId,\n batch.localWriteTime.toMillis(),\n serializedBaseMutations,\n serializedMutations\n );\n}\n\n/** Decodes a DbMutationBatch into a MutationBatch */\nexport function fromDbMutationBatch(\n localSerializer: LocalSerializer,\n dbBatch: DbMutationBatch\n): MutationBatch {\n const baseMutations = (dbBatch.baseMutations || []).map(m =>\n fromMutation(localSerializer.remoteSerializer, m)\n );\n\n // Squash old transform mutations into existing patch or set mutations.\n // The replacement of representing `transforms` with `update_transforms`\n // on the SDK means that old `transform` mutations stored in IndexedDB need\n // to be updated to `update_transforms`.\n // TODO(b/174608374): Remove this code once we perform a schema migration.\n for (let i = 0; i < dbBatch.mutations.length - 1; ++i) {\n const currentMutation = dbBatch.mutations[i];\n const hasTransform =\n i + 1 < dbBatch.mutations.length &&\n dbBatch.mutations[i + 1].transform !== undefined;\n if (hasTransform) {\n debugAssert(\n dbBatch.mutations[i].transform === undefined &&\n dbBatch.mutations[i].update !== undefined,\n 'TransformMutation should be preceded by a patch or set mutation'\n );\n const transformMutation = dbBatch.mutations[i + 1];\n currentMutation.updateTransforms = transformMutation.transform!.fieldTransforms;\n dbBatch.mutations.splice(i + 1, 1);\n ++i;\n }\n }\n\n const mutations = dbBatch.mutations.map(m =>\n fromMutation(localSerializer.remoteSerializer, m)\n );\n const timestamp = Timestamp.fromMillis(dbBatch.localWriteTimeMs);\n return new MutationBatch(\n dbBatch.batchId,\n timestamp,\n baseMutations,\n mutations\n );\n}\n\n/** Decodes a DbTarget into TargetData */\nexport function fromDbTarget(dbTarget: DbTarget): TargetData {\n const version = fromDbTimestamp(dbTarget.readTime);\n const lastLimboFreeSnapshotVersion =\n dbTarget.lastLimboFreeSnapshotVersion !== undefined\n ? fromDbTimestamp(dbTarget.lastLimboFreeSnapshotVersion)\n : SnapshotVersion.min();\n\n let target: Target;\n if (isDocumentQuery(dbTarget.query)) {\n target = fromDocumentsTarget(dbTarget.query);\n } else {\n target = fromQueryTarget(dbTarget.query);\n }\n return new TargetData(\n target,\n dbTarget.targetId,\n TargetPurpose.Listen,\n dbTarget.lastListenSequenceNumber,\n version,\n lastLimboFreeSnapshotVersion,\n ByteString.fromBase64String(dbTarget.resumeToken)\n );\n}\n\n/** Encodes TargetData into a DbTarget for storage locally. */\nexport function toDbTarget(\n localSerializer: LocalSerializer,\n targetData: TargetData\n): DbTarget {\n debugAssert(\n TargetPurpose.Listen === targetData.purpose,\n 'Only queries with purpose ' +\n TargetPurpose.Listen +\n ' may be stored, got ' +\n targetData.purpose\n );\n const dbTimestamp = toDbTimestamp(targetData.snapshotVersion);\n const dbLastLimboFreeTimestamp = toDbTimestamp(\n targetData.lastLimboFreeSnapshotVersion\n );\n let queryProto: DbQuery;\n if (isDocumentTarget(targetData.target)) {\n queryProto = toDocumentsTarget(\n localSerializer.remoteSerializer,\n targetData.target\n );\n } else {\n queryProto = toQueryTarget(\n localSerializer.remoteSerializer,\n targetData.target\n );\n }\n\n // We can't store the resumeToken as a ByteString in IndexedDb, so we\n // convert it to a base64 string for storage.\n const resumeToken = targetData.resumeToken.toBase64();\n\n // lastListenSequenceNumber is always 0 until we do real GC.\n return new DbTarget(\n targetData.targetId,\n canonifyTarget(targetData.target),\n dbTimestamp,\n resumeToken,\n targetData.sequenceNumber,\n dbLastLimboFreeTimestamp,\n queryProto\n );\n}\n\n/**\n * A helper function for figuring out what kind of query has been stored.\n */\nfunction isDocumentQuery(dbQuery: DbQuery): dbQuery is PublicDocumentsTarget {\n return (dbQuery as PublicDocumentsTarget).documents !== undefined;\n}\n\n/** Encodes a DbBundle to a BundleMetadata object. */\nexport function fromDbBundle(dbBundle: DbBundle): BundleMetadata {\n return {\n id: dbBundle.bundleId,\n createTime: fromDbTimestamp(dbBundle.createTime),\n version: dbBundle.version\n };\n}\n\n/** Encodes a BundleMetadata to a DbBundle. */\nexport function toDbBundle(metadata: ProtoBundleMetadata): DbBundle {\n return {\n bundleId: metadata.id!,\n createTime: toDbTimestamp(fromVersion(metadata.createTime!)),\n version: metadata.version!\n };\n}\n\n/** Encodes a DbNamedQuery to a NamedQuery. */\nexport function fromDbNamedQuery(dbNamedQuery: DbNamedQuery): NamedQuery {\n return {\n name: dbNamedQuery.name,\n query: fromBundledQuery(dbNamedQuery.bundledQuery),\n readTime: fromDbTimestamp(dbNamedQuery.readTime)\n };\n}\n\n/** Encodes a NamedQuery from a bundle proto to a DbNamedQuery. */\nexport function toDbNamedQuery(query: ProtoNamedQuery): DbNamedQuery {\n return {\n name: query.name!,\n readTime: toDbTimestamp(fromVersion(query.readTime!)),\n bundledQuery: query.bundledQuery!\n };\n}\n\n/**\n * Encodes a `BundledQuery` from bundle proto to a Query object.\n *\n * This reconstructs the original query used to build the bundle being loaded,\n * including features exists only in SDKs (for example: limit-to-last).\n */\nexport function fromBundledQuery(bundledQuery: ProtoBundledQuery): Query {\n const query = convertQueryTargetToQuery({\n parent: bundledQuery.parent!,\n structuredQuery: bundledQuery.structuredQuery!\n });\n if (bundledQuery.limitType === 'LAST') {\n debugAssert(\n !!query.limit,\n 'Bundled query has limitType LAST, but limit is null'\n );\n return queryWithLimit(query, query.limit, LimitType.Last);\n }\n return query;\n}\n\n/** Encodes a NamedQuery proto object to a NamedQuery model object. */\nexport function fromProtoNamedQuery(namedQuery: ProtoNamedQuery): NamedQuery {\n return {\n name: namedQuery.name!,\n query: fromBundledQuery(namedQuery.bundledQuery!),\n readTime: fromVersion(namedQuery.readTime!)\n };\n}\n\n/** Decodes a BundleMetadata proto into a BundleMetadata object. */\nexport function fromBundleMetadata(\n metadata: ProtoBundleMetadata\n): BundleMetadata {\n return {\n id: metadata.id!,\n version: metadata.version!,\n createTime: fromVersion(metadata.createTime!)\n };\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BundleMetadata, NamedQuery } from '../core/bundle';\nimport {\n BundleMetadata as ProtoBundleMetadata,\n NamedQuery as ProtoNamedQuery\n} from '../protos/firestore_bundle_proto';\n\nimport { BundleCache } from './bundle_cache';\nimport {\n DbBundle,\n DbBundlesKey,\n DbNamedQueriesKey,\n DbNamedQuery\n} from './indexeddb_schema';\nimport { getStore } from './indexeddb_transaction';\nimport {\n fromDbBundle,\n fromDbNamedQuery,\n toDbBundle,\n toDbNamedQuery\n} from './local_serializer';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { SimpleDbStore } from './simple_db';\n\nexport class IndexedDbBundleCache implements BundleCache {\n getBundleMetadata(\n transaction: PersistenceTransaction,\n bundleId: string\n ): PersistencePromise<BundleMetadata | undefined> {\n return bundlesStore(transaction)\n .get(bundleId)\n .next(bundle => {\n if (bundle) {\n return fromDbBundle(bundle);\n }\n return undefined;\n });\n }\n\n saveBundleMetadata(\n transaction: PersistenceTransaction,\n bundleMetadata: ProtoBundleMetadata\n ): PersistencePromise<void> {\n return bundlesStore(transaction).put(toDbBundle(bundleMetadata));\n }\n\n getNamedQuery(\n transaction: PersistenceTransaction,\n queryName: string\n ): PersistencePromise<NamedQuery | undefined> {\n return namedQueriesStore(transaction)\n .get(queryName)\n .next(query => {\n if (query) {\n return fromDbNamedQuery(query);\n }\n return undefined;\n });\n }\n\n saveNamedQuery(\n transaction: PersistenceTransaction,\n query: ProtoNamedQuery\n ): PersistencePromise<void> {\n return namedQueriesStore(transaction).put(toDbNamedQuery(query));\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the bundles object store.\n */\nfunction bundlesStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbBundlesKey, DbBundle> {\n return getStore<DbBundlesKey, DbBundle>(txn, DbBundle.store);\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the namedQueries object store.\n */\nfunction namedQueriesStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbNamedQueriesKey, DbNamedQuery> {\n return getStore<DbNamedQueriesKey, DbNamedQuery>(txn, DbNamedQuery.store);\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ResourcePath } from '../model/path';\nimport { debugAssert } from '../util/assert';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { IndexManager } from './index_manager';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\n\n/**\n * An in-memory implementation of IndexManager.\n */\nexport class MemoryIndexManager implements IndexManager {\n private collectionParentIndex = new MemoryCollectionParentIndex();\n\n addToCollectionParentIndex(\n transaction: PersistenceTransaction,\n collectionPath: ResourcePath\n ): PersistencePromise<void> {\n this.collectionParentIndex.add(collectionPath);\n return PersistencePromise.resolve();\n }\n\n getCollectionParents(\n transaction: PersistenceTransaction,\n collectionId: string\n ): PersistencePromise<ResourcePath[]> {\n return PersistencePromise.resolve(\n this.collectionParentIndex.getEntries(collectionId)\n );\n }\n}\n\n/**\n * Internal implementation of the collection-parent index exposed by MemoryIndexManager.\n * Also used for in-memory caching by IndexedDbIndexManager and initial index population\n * in indexeddb_schema.ts\n */\nexport class MemoryCollectionParentIndex {\n private index = {} as {\n [collectionId: string]: SortedSet<ResourcePath>;\n };\n\n // Returns false if the entry already existed.\n add(collectionPath: ResourcePath): boolean {\n debugAssert(collectionPath.length % 2 === 1, 'Expected a collection path.');\n const collectionId = collectionPath.lastSegment();\n const parentPath = collectionPath.popLast();\n const existingParents =\n this.index[collectionId] ||\n new SortedSet<ResourcePath>(ResourcePath.comparator);\n const added = !existingParents.has(parentPath);\n this.index[collectionId] = existingParents.add(parentPath);\n return added;\n }\n\n has(collectionPath: ResourcePath): boolean {\n const collectionId = collectionPath.lastSegment();\n const parentPath = collectionPath.popLast();\n const existingParents = this.index[collectionId];\n return existingParents && existingParents.has(parentPath);\n }\n\n getEntries(collectionId: string): ResourcePath[] {\n const parentPaths =\n this.index[collectionId] ||\n new SortedSet<ResourcePath>(ResourcePath.comparator);\n return parentPaths.toArray();\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ResourcePath } from '../model/path';\nimport { debugAssert } from '../util/assert';\nimport { immediateSuccessor } from '../util/misc';\n\nimport {\n decodeResourcePath,\n encodeResourcePath\n} from './encoded_resource_path';\nimport { IndexManager } from './index_manager';\nimport { DbCollectionParent, DbCollectionParentKey } from './indexeddb_schema';\nimport { getStore } from './indexeddb_transaction';\nimport { MemoryCollectionParentIndex } from './memory_index_manager';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { SimpleDbStore } from './simple_db';\n\n/**\n * A persisted implementation of IndexManager.\n */\nexport class IndexedDbIndexManager implements IndexManager {\n /**\n * An in-memory copy of the index entries we've already written since the SDK\n * launched. Used to avoid re-writing the same entry repeatedly.\n *\n * This is *NOT* a complete cache of what's in persistence and so can never be used to\n * satisfy reads.\n */\n private collectionParentsCache = new MemoryCollectionParentIndex();\n\n /**\n * Adds a new entry to the collection parent index.\n *\n * Repeated calls for the same collectionPath should be avoided within a\n * transaction as IndexedDbIndexManager only caches writes once a transaction\n * has been committed.\n */\n addToCollectionParentIndex(\n transaction: PersistenceTransaction,\n collectionPath: ResourcePath\n ): PersistencePromise<void> {\n debugAssert(collectionPath.length % 2 === 1, 'Expected a collection path.');\n if (!this.collectionParentsCache.has(collectionPath)) {\n const collectionId = collectionPath.lastSegment();\n const parentPath = collectionPath.popLast();\n\n transaction.addOnCommittedListener(() => {\n // Add the collection to the in memory cache only if the transaction was\n // successfully committed.\n this.collectionParentsCache.add(collectionPath);\n });\n\n const collectionParent: DbCollectionParent = {\n collectionId,\n parent: encodeResourcePath(parentPath)\n };\n return collectionParentsStore(transaction).put(collectionParent);\n }\n return PersistencePromise.resolve();\n }\n\n getCollectionParents(\n transaction: PersistenceTransaction,\n collectionId: string\n ): PersistencePromise<ResourcePath[]> {\n const parentPaths = [] as ResourcePath[];\n const range = IDBKeyRange.bound(\n [collectionId, ''],\n [immediateSuccessor(collectionId), ''],\n /*lowerOpen=*/ false,\n /*upperOpen=*/ true\n );\n return collectionParentsStore(transaction)\n .loadAll(range)\n .next(entries => {\n for (const entry of entries) {\n // This collectionId guard shouldn't be necessary (and isn't as long\n // as we're running in a real browser), but there's a bug in\n // indexeddbshim that breaks our range in our tests running in node:\n // https://github.com/axemclion/IndexedDBShim/issues/334\n if (entry.collectionId !== collectionId) {\n break;\n }\n parentPaths.push(decodeResourcePath(entry.parent));\n }\n return parentPaths;\n });\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the collectionParents\n * document store.\n */\nfunction collectionParentsStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbCollectionParentKey, DbCollectionParent> {\n return getStore<DbCollectionParentKey, DbCollectionParent>(\n txn,\n DbCollectionParent.store\n );\n}\n", "/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListenSequenceNumber, TargetId } from '../core/types';\nimport { SortedMap } from '../util/sorted_map';\n\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { TargetData } from './target_data';\n\n/**\n * Describes a map whose keys are active target ids. We do not care about the type of the\n * values.\n */\nexport type ActiveTargets = SortedMap<TargetId, unknown>;\n\nexport const GC_DID_NOT_RUN: LruResults = {\n didRun: false,\n sequenceNumbersCollected: 0,\n targetsRemoved: 0,\n documentsRemoved: 0\n};\n\nexport const LRU_COLLECTION_DISABLED = -1;\nexport const LRU_DEFAULT_CACHE_SIZE_BYTES = 40 * 1024 * 1024;\n\nexport class LruParams {\n private static readonly DEFAULT_COLLECTION_PERCENTILE = 10;\n private static readonly DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT = 1000;\n\n static withCacheSize(cacheSize: number): LruParams {\n return new LruParams(\n cacheSize,\n LruParams.DEFAULT_COLLECTION_PERCENTILE,\n LruParams.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT\n );\n }\n\n static readonly DEFAULT: LruParams = new LruParams(\n LRU_DEFAULT_CACHE_SIZE_BYTES,\n LruParams.DEFAULT_COLLECTION_PERCENTILE,\n LruParams.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT\n );\n\n static readonly DISABLED: LruParams = new LruParams(\n LRU_COLLECTION_DISABLED,\n 0,\n 0\n );\n\n constructor(\n // When we attempt to collect, we will only do so if the cache size is greater than this\n // threshold. Passing `COLLECTION_DISABLED` here will cause collection to always be skipped.\n readonly cacheSizeCollectionThreshold: number,\n // The percentage of sequence numbers that we will attempt to collect\n readonly percentileToCollect: number,\n // A cap on the total number of sequence numbers that will be collected. This prevents\n // us from collecting a huge number of sequence numbers if the cache has grown very large.\n readonly maximumSequenceNumbersToCollect: number\n ) {}\n}\n\nexport interface LruGarbageCollector {\n readonly params: LruParams;\n\n collect(\n txn: PersistenceTransaction,\n activeTargetIds: ActiveTargets\n ): PersistencePromise<LruResults>;\n\n /** Given a percentile of target to collect, returns the number of targets to collect. */\n calculateTargetCount(\n txn: PersistenceTransaction,\n percentile: number\n ): PersistencePromise<number>;\n\n /** Returns the nth sequence number, counting in order from the smallest. */\n nthSequenceNumber(\n txn: PersistenceTransaction,\n n: number\n ): PersistencePromise<number>;\n\n /**\n * Removes documents that have a sequence number equal to or less than the\n * upper bound and are not otherwise pinned.\n */\n removeOrphanedDocuments(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber\n ): PersistencePromise<number>;\n\n getCacheSize(txn: PersistenceTransaction): PersistencePromise<number>;\n\n /**\n * Removes targets with a sequence number equal to or less than the given\n * upper bound, and removes document associations with those targets.\n */\n removeTargets(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise<number>;\n}\n\n/**\n * Describes the results of a garbage collection run. `didRun` will be set to\n * `false` if collection was skipped (either it is disabled or the cache size\n * has not hit the threshold). If collection ran, the other fields will be\n * filled in with the details of the results.\n */\nexport interface LruResults {\n readonly didRun: boolean;\n readonly sequenceNumbersCollected: number;\n readonly targetsRemoved: number;\n readonly documentsRemoved: number;\n}\n\n/**\n * Persistence layers intending to use LRU Garbage collection should have\n * reference delegates that implement this interface. This interface defines the\n * operations that the LRU garbage collector needs from the persistence layer.\n */\nexport interface LruDelegate {\n readonly garbageCollector: LruGarbageCollector;\n\n /** Enumerates all the targets in the TargetCache. */\n forEachTarget(\n txn: PersistenceTransaction,\n f: (target: TargetData) => void\n ): PersistencePromise<void>;\n\n getSequenceNumberCount(\n txn: PersistenceTransaction\n ): PersistencePromise<number>;\n\n /**\n * Enumerates sequence numbers for documents not associated with a target.\n * Note that this may include duplicate sequence numbers.\n */\n forEachOrphanedDocumentSequenceNumber(\n txn: PersistenceTransaction,\n f: (sequenceNumber: ListenSequenceNumber) => void\n ): PersistencePromise<void>;\n\n /**\n * Removes all targets that have a sequence number less than or equal to\n * `upperBound`, and are not present in the `activeTargetIds` set.\n *\n * @returns the number of targets removed.\n */\n removeTargets(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise<number>;\n\n /**\n * Removes all unreferenced documents from the cache that have a sequence\n * number less than or equal to the given `upperBound`.\n *\n * @returns the number of documents removed.\n */\n removeOrphanedDocuments(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber\n ): PersistencePromise<number>;\n\n getCacheSize(txn: PersistenceTransaction): PersistencePromise<number>;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DocumentKey } from '../model/document_key';\nimport { fail, hardAssert } from '../util/assert';\n\nimport {\n DbDocumentMutation,\n DbDocumentMutationKey,\n DbMutationBatch,\n DbMutationBatchKey,\n DbRemoteDocument\n} from './indexeddb_schema';\nimport { PersistencePromise } from './persistence_promise';\nimport { SimpleDbTransaction } from './simple_db';\n\n/**\n * Delete a mutation batch and the associated document mutations.\n * @returns A PersistencePromise of the document mutations that were removed.\n */\nexport function removeMutationBatch(\n txn: SimpleDbTransaction,\n userId: string,\n batch: { batchId: number; mutations: Array<{ key: DocumentKey }> }\n): PersistencePromise<DocumentKey[]> {\n const mutationStore = txn.store<DbMutationBatchKey, DbMutationBatch>(\n DbMutationBatch.store\n );\n const indexTxn = txn.store<DbDocumentMutationKey, DbDocumentMutation>(\n DbDocumentMutation.store\n );\n const promises: Array<PersistencePromise<void>> = [];\n\n const range = IDBKeyRange.only(batch.batchId);\n let numDeleted = 0;\n const removePromise = mutationStore.iterate(\n { range },\n (key, value, control) => {\n numDeleted++;\n return control.delete();\n }\n );\n promises.push(\n removePromise.next(() => {\n hardAssert(\n numDeleted === 1,\n 'Dangling document-mutation reference found: Missing batch ' +\n batch.batchId\n );\n })\n );\n const removedDocuments: DocumentKey[] = [];\n for (const mutation of batch.mutations) {\n const indexKey = DbDocumentMutation.key(\n userId,\n mutation.key.path,\n batch.batchId\n );\n promises.push(indexTxn.delete(indexKey));\n removedDocuments.push(mutation.key);\n }\n return PersistencePromise.waitFor(promises).next(() => removedDocuments);\n}\n\n/**\n * Returns an approximate size for the given document.\n */\nexport function dbDocumentSize(doc: DbRemoteDocument | null): number {\n if (!doc) {\n return 0;\n }\n\n let value: unknown;\n if (doc.document) {\n value = doc.document;\n } else if (doc.unknownDocument) {\n value = doc.unknownDocument;\n } else if (doc.noDocument) {\n value = doc.noDocument;\n } else {\n throw fail('Unknown remote document type');\n }\n return JSON.stringify(value).length;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { isCollectionGroupQuery, isDocumentQuery, Query } from '../core/query';\nimport { BatchId } from '../core/types';\nimport { Timestamp } from '../lite/timestamp';\nimport { DocumentKeySet } from '../model/collections';\nimport { DocumentKey } from '../model/document_key';\nimport { Mutation } from '../model/mutation';\nimport { MutationBatch } from '../model/mutation_batch';\nimport { ResourcePath } from '../model/path';\nimport { debugAssert, fail, hardAssert } from '../util/assert';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\nimport { BATCHID_UNKNOWN } from '../util/types';\n\nimport { decodeResourcePath } from './encoded_resource_path';\nimport { IndexManager } from './index_manager';\nimport { removeMutationBatch } from './indexeddb_mutation_batch_impl';\nimport {\n DbDocumentMutation,\n DbDocumentMutationKey,\n DbMutationBatch,\n DbMutationBatchKey,\n DbMutationQueue,\n DbMutationQueueKey\n} from './indexeddb_schema';\nimport { IndexedDbTransaction, getStore } from './indexeddb_transaction';\nimport {\n fromDbMutationBatch,\n LocalSerializer,\n toDbMutationBatch\n} from './local_serializer';\nimport { MutationQueue } from './mutation_queue';\nimport { ReferenceDelegate } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { SimpleDbStore } from './simple_db';\n\n/** A mutation queue for a specific user, backed by IndexedDB. */\nexport class IndexedDbMutationQueue implements MutationQueue {\n /**\n * Caches the document keys for pending mutation batches. If the mutation\n * has been removed from IndexedDb, the cached value may continue to\n * be used to retrieve the batch's document keys. To remove a cached value\n * locally, `removeCachedMutationKeys()` should be invoked either directly\n * or through `removeMutationBatches()`.\n *\n * With multi-tab, when the primary client acknowledges or rejects a mutation,\n * this cache is used by secondary clients to invalidate the local\n * view of the documents that were previously affected by the mutation.\n */\n // PORTING NOTE: Multi-tab only.\n private documentKeysByBatchId = {} as { [batchId: number]: DocumentKeySet };\n\n constructor(\n /**\n * The normalized userId (e.g. null UID => \"\" userId) used to store /\n * retrieve mutations.\n */\n private userId: string,\n private readonly serializer: LocalSerializer,\n private readonly indexManager: IndexManager,\n private readonly referenceDelegate: ReferenceDelegate\n ) {}\n\n /**\n * Creates a new mutation queue for the given user.\n * @param user - The user for which to create a mutation queue.\n * @param serializer - The serializer to use when persisting to IndexedDb.\n */\n static forUser(\n user: User,\n serializer: LocalSerializer,\n indexManager: IndexManager,\n referenceDelegate: ReferenceDelegate\n ): IndexedDbMutationQueue {\n // TODO(mcg): Figure out what constraints there are on userIDs\n // In particular, are there any reserved characters? are empty ids allowed?\n // For the moment store these together in the same mutations table assuming\n // that empty userIDs aren't allowed.\n hardAssert(user.uid !== '', 'UserID must not be an empty string.');\n const userId = user.isAuthenticated() ? user.uid! : '';\n return new IndexedDbMutationQueue(\n userId,\n serializer,\n indexManager,\n referenceDelegate\n );\n }\n\n checkEmpty(transaction: PersistenceTransaction): PersistencePromise<boolean> {\n let empty = true;\n const range = IDBKeyRange.bound(\n [this.userId, Number.NEGATIVE_INFINITY],\n [this.userId, Number.POSITIVE_INFINITY]\n );\n return mutationsStore(transaction)\n .iterate(\n { index: DbMutationBatch.userMutationsIndex, range },\n (key, value, control) => {\n empty = false;\n control.done();\n }\n )\n .next(() => empty);\n }\n\n addMutationBatch(\n transaction: PersistenceTransaction,\n localWriteTime: Timestamp,\n baseMutations: Mutation[],\n mutations: Mutation[]\n ): PersistencePromise<MutationBatch> {\n const documentStore = documentMutationsStore(transaction);\n const mutationStore = mutationsStore(transaction);\n\n // The IndexedDb implementation in Chrome (and Firefox) does not handle\n // compound indices that include auto-generated keys correctly. To ensure\n // that the index entry is added correctly in all browsers, we perform two\n // writes: The first write is used to retrieve the next auto-generated Batch\n // ID, and the second write populates the index and stores the actual\n // mutation batch.\n // See: https://bugs.chromium.org/p/chromium/issues/detail?id=701972\n\n // We write an empty object to obtain key\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return mutationStore.add({} as any).next(batchId => {\n hardAssert(\n typeof batchId === 'number',\n 'Auto-generated key is not a number'\n );\n\n const batch = new MutationBatch(\n batchId,\n localWriteTime,\n baseMutations,\n mutations\n );\n const dbBatch = toDbMutationBatch(this.serializer, this.userId, batch);\n\n const promises: Array<PersistencePromise<void>> = [];\n let collectionParents = new SortedSet<ResourcePath>((l, r) =>\n primitiveComparator(l.canonicalString(), r.canonicalString())\n );\n for (const mutation of mutations) {\n const indexKey = DbDocumentMutation.key(\n this.userId,\n mutation.key.path,\n batchId\n );\n collectionParents = collectionParents.add(mutation.key.path.popLast());\n promises.push(mutationStore.put(dbBatch));\n promises.push(\n documentStore.put(indexKey, DbDocumentMutation.PLACEHOLDER)\n );\n }\n\n collectionParents.forEach(parent => {\n promises.push(\n this.indexManager.addToCollectionParentIndex(transaction, parent)\n );\n });\n\n transaction.addOnCommittedListener(() => {\n this.documentKeysByBatchId[batchId] = batch.keys();\n });\n\n return PersistencePromise.waitFor(promises).next(() => batch);\n });\n }\n\n lookupMutationBatch(\n transaction: PersistenceTransaction,\n batchId: BatchId\n ): PersistencePromise<MutationBatch | null> {\n return mutationsStore(transaction)\n .get(batchId)\n .next(dbBatch => {\n if (dbBatch) {\n hardAssert(\n dbBatch.userId === this.userId,\n `Unexpected user '${dbBatch.userId}' for mutation batch ${batchId}`\n );\n return fromDbMutationBatch(this.serializer, dbBatch);\n }\n return null;\n });\n }\n\n /**\n * Returns the document keys for the mutation batch with the given batchId.\n * For primary clients, this method returns `null` after\n * `removeMutationBatches()` has been called. Secondary clients return a\n * cached result until `removeCachedMutationKeys()` is invoked.\n */\n // PORTING NOTE: Multi-tab only.\n lookupMutationKeys(\n transaction: PersistenceTransaction,\n batchId: BatchId\n ): PersistencePromise<DocumentKeySet | null> {\n if (this.documentKeysByBatchId[batchId]) {\n return PersistencePromise.resolve<DocumentKeySet | null>(\n this.documentKeysByBatchId[batchId]\n );\n } else {\n return this.lookupMutationBatch(transaction, batchId).next(batch => {\n if (batch) {\n const keys = batch.keys();\n this.documentKeysByBatchId[batchId] = keys;\n return keys;\n } else {\n return null;\n }\n });\n }\n }\n\n getNextMutationBatchAfterBatchId(\n transaction: PersistenceTransaction,\n batchId: BatchId\n ): PersistencePromise<MutationBatch | null> {\n const nextBatchId = batchId + 1;\n\n const range = IDBKeyRange.lowerBound([this.userId, nextBatchId]);\n let foundBatch: MutationBatch | null = null;\n return mutationsStore(transaction)\n .iterate(\n { index: DbMutationBatch.userMutationsIndex, range },\n (key, dbBatch, control) => {\n if (dbBatch.userId === this.userId) {\n hardAssert(\n dbBatch.batchId >= nextBatchId,\n 'Should have found mutation after ' + nextBatchId\n );\n foundBatch = fromDbMutationBatch(this.serializer, dbBatch);\n }\n control.done();\n }\n )\n .next(() => foundBatch);\n }\n\n getHighestUnacknowledgedBatchId(\n transaction: PersistenceTransaction\n ): PersistencePromise<BatchId> {\n const range = IDBKeyRange.upperBound([\n this.userId,\n Number.POSITIVE_INFINITY\n ]);\n\n let batchId = BATCHID_UNKNOWN;\n return mutationsStore(transaction)\n .iterate(\n { index: DbMutationBatch.userMutationsIndex, range, reverse: true },\n (key, dbBatch, control) => {\n batchId = dbBatch.batchId;\n control.done();\n }\n )\n .next(() => batchId);\n }\n\n getAllMutationBatches(\n transaction: PersistenceTransaction\n ): PersistencePromise<MutationBatch[]> {\n const range = IDBKeyRange.bound(\n [this.userId, BATCHID_UNKNOWN],\n [this.userId, Number.POSITIVE_INFINITY]\n );\n return mutationsStore(transaction)\n .loadAll(DbMutationBatch.userMutationsIndex, range)\n .next(dbBatches =>\n dbBatches.map(dbBatch => fromDbMutationBatch(this.serializer, dbBatch))\n );\n }\n\n getAllMutationBatchesAffectingDocumentKey(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise<MutationBatch[]> {\n // Scan the document-mutation index starting with a prefix starting with\n // the given documentKey.\n const indexPrefix = DbDocumentMutation.prefixForPath(\n this.userId,\n documentKey.path\n );\n const indexStart = IDBKeyRange.lowerBound(indexPrefix);\n\n const results: MutationBatch[] = [];\n return documentMutationsStore(transaction)\n .iterate({ range: indexStart }, (indexKey, _, control) => {\n const [userID, encodedPath, batchId] = indexKey;\n\n // Only consider rows matching exactly the specific key of\n // interest. Note that because we order by path first, and we\n // order terminators before path separators, we'll encounter all\n // the index rows for documentKey contiguously. In particular, all\n // the rows for documentKey will occur before any rows for\n // documents nested in a subcollection beneath documentKey so we\n // can stop as soon as we hit any such row.\n const path = decodeResourcePath(encodedPath);\n if (userID !== this.userId || !documentKey.path.isEqual(path)) {\n control.done();\n return;\n }\n // Look up the mutation batch in the store.\n return mutationsStore(transaction)\n .get(batchId)\n .next(mutation => {\n if (!mutation) {\n throw fail(\n 'Dangling document-mutation reference found: ' +\n indexKey +\n ' which points to ' +\n batchId\n );\n }\n hardAssert(\n mutation.userId === this.userId,\n `Unexpected user '${mutation.userId}' for mutation batch ${batchId}`\n );\n results.push(fromDbMutationBatch(this.serializer, mutation));\n });\n })\n .next(() => results);\n }\n\n getAllMutationBatchesAffectingDocumentKeys(\n transaction: PersistenceTransaction,\n documentKeys: SortedMap<DocumentKey, unknown>\n ): PersistencePromise<MutationBatch[]> {\n let uniqueBatchIDs = new SortedSet<BatchId>(primitiveComparator);\n\n const promises: Array<PersistencePromise<void>> = [];\n documentKeys.forEach(documentKey => {\n const indexStart = DbDocumentMutation.prefixForPath(\n this.userId,\n documentKey.path\n );\n const range = IDBKeyRange.lowerBound(indexStart);\n\n const promise = documentMutationsStore(transaction).iterate(\n { range },\n (indexKey, _, control) => {\n const [userID, encodedPath, batchID] = indexKey;\n\n // Only consider rows matching exactly the specific key of\n // interest. Note that because we order by path first, and we\n // order terminators before path separators, we'll encounter all\n // the index rows for documentKey contiguously. In particular, all\n // the rows for documentKey will occur before any rows for\n // documents nested in a subcollection beneath documentKey so we\n // can stop as soon as we hit any such row.\n const path = decodeResourcePath(encodedPath);\n if (userID !== this.userId || !documentKey.path.isEqual(path)) {\n control.done();\n return;\n }\n\n uniqueBatchIDs = uniqueBatchIDs.add(batchID);\n }\n );\n\n promises.push(promise);\n });\n\n return PersistencePromise.waitFor(promises).next(() =>\n this.lookupMutationBatches(transaction, uniqueBatchIDs)\n );\n }\n\n getAllMutationBatchesAffectingQuery(\n transaction: PersistenceTransaction,\n query: Query\n ): PersistencePromise<MutationBatch[]> {\n debugAssert(\n !isDocumentQuery(query),\n \"Document queries shouldn't go down this path\"\n );\n debugAssert(\n !isCollectionGroupQuery(query),\n 'CollectionGroup queries should be handled in LocalDocumentsView'\n );\n\n const queryPath = query.path;\n const immediateChildrenLength = queryPath.length + 1;\n\n // TODO(mcg): Actually implement a single-collection query\n //\n // This is actually executing an ancestor query, traversing the whole\n // subtree below the collection which can be horrifically inefficient for\n // some structures. The right way to solve this is to implement the full\n // value index, but that's not in the cards in the near future so this is\n // the best we can do for the moment.\n //\n // Since we don't yet index the actual properties in the mutations, our\n // current approach is to just return all mutation batches that affect\n // documents in the collection being queried.\n const indexPrefix = DbDocumentMutation.prefixForPath(\n this.userId,\n queryPath\n );\n const indexStart = IDBKeyRange.lowerBound(indexPrefix);\n\n // Collect up unique batchIDs encountered during a scan of the index. Use a\n // SortedSet to accumulate batch IDs so they can be traversed in order in a\n // scan of the main table.\n let uniqueBatchIDs = new SortedSet<BatchId>(primitiveComparator);\n return documentMutationsStore(transaction)\n .iterate({ range: indexStart }, (indexKey, _, control) => {\n const [userID, encodedPath, batchID] = indexKey;\n const path = decodeResourcePath(encodedPath);\n if (userID !== this.userId || !queryPath.isPrefixOf(path)) {\n control.done();\n return;\n }\n // Rows with document keys more than one segment longer than the\n // query path can't be matches. For example, a query on 'rooms'\n // can't match the document /rooms/abc/messages/xyx.\n // TODO(mcg): we'll need a different scanner when we implement\n // ancestor queries.\n if (path.length !== immediateChildrenLength) {\n return;\n }\n uniqueBatchIDs = uniqueBatchIDs.add(batchID);\n })\n .next(() => this.lookupMutationBatches(transaction, uniqueBatchIDs));\n }\n\n private lookupMutationBatches(\n transaction: PersistenceTransaction,\n batchIDs: SortedSet<BatchId>\n ): PersistencePromise<MutationBatch[]> {\n const results: MutationBatch[] = [];\n const promises: Array<PersistencePromise<void>> = [];\n // TODO(rockwood): Implement this using iterate.\n batchIDs.forEach(batchId => {\n promises.push(\n mutationsStore(transaction)\n .get(batchId)\n .next(mutation => {\n if (mutation === null) {\n throw fail(\n 'Dangling document-mutation reference found, ' +\n 'which points to ' +\n batchId\n );\n }\n hardAssert(\n mutation.userId === this.userId,\n `Unexpected user '${mutation.userId}' for mutation batch ${batchId}`\n );\n results.push(fromDbMutationBatch(this.serializer, mutation));\n })\n );\n });\n return PersistencePromise.waitFor(promises).next(() => results);\n }\n\n removeMutationBatch(\n transaction: PersistenceTransaction,\n batch: MutationBatch\n ): PersistencePromise<void> {\n return removeMutationBatch(\n (transaction as IndexedDbTransaction).simpleDbTransaction,\n this.userId,\n batch\n ).next(removedDocuments => {\n transaction.addOnCommittedListener(() => {\n this.removeCachedMutationKeys(batch.batchId);\n });\n return PersistencePromise.forEach(\n removedDocuments,\n (key: DocumentKey) => {\n return this.referenceDelegate.markPotentiallyOrphaned(\n transaction,\n key\n );\n }\n );\n });\n }\n\n /**\n * Clears the cached keys for a mutation batch. This method should be\n * called by secondary clients after they process mutation updates.\n *\n * Note that this method does not have to be called from primary clients as\n * the corresponding cache entries are cleared when an acknowledged or\n * rejected batch is removed from the mutation queue.\n */\n // PORTING NOTE: Multi-tab only\n removeCachedMutationKeys(batchId: BatchId): void {\n delete this.documentKeysByBatchId[batchId];\n }\n\n performConsistencyCheck(\n txn: PersistenceTransaction\n ): PersistencePromise<void> {\n return this.checkEmpty(txn).next(empty => {\n if (!empty) {\n return PersistencePromise.resolve();\n }\n\n // Verify that there are no entries in the documentMutations index if\n // the queue is empty.\n const startRange = IDBKeyRange.lowerBound(\n DbDocumentMutation.prefixForUser(this.userId)\n );\n const danglingMutationReferences: ResourcePath[] = [];\n return documentMutationsStore(txn)\n .iterate({ range: startRange }, (key, _, control) => {\n const userID = key[0];\n if (userID !== this.userId) {\n control.done();\n return;\n } else {\n const path = decodeResourcePath(key[1]);\n danglingMutationReferences.push(path);\n }\n })\n .next(() => {\n hardAssert(\n danglingMutationReferences.length === 0,\n 'Document leak -- detected dangling mutation references when queue is empty. ' +\n 'Dangling keys: ' +\n danglingMutationReferences.map(p => p.canonicalString())\n );\n });\n });\n }\n\n containsKey(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<boolean> {\n return mutationQueueContainsKey(txn, this.userId, key);\n }\n\n // PORTING NOTE: Multi-tab only (state is held in memory in other clients).\n /** Returns the mutation queue's metadata from IndexedDb. */\n private getMutationQueueMetadata(\n transaction: PersistenceTransaction\n ): PersistencePromise<DbMutationQueue> {\n return mutationQueuesStore(transaction)\n .get(this.userId)\n .next((metadata: DbMutationQueue | null) => {\n return (\n metadata ||\n new DbMutationQueue(\n this.userId,\n BATCHID_UNKNOWN,\n /*lastStreamToken=*/ ''\n )\n );\n });\n }\n}\n\n/**\n * @returns true if the mutation queue for the given user contains a pending\n * mutation for the given key.\n */\nfunction mutationQueueContainsKey(\n txn: PersistenceTransaction,\n userId: string,\n key: DocumentKey\n): PersistencePromise<boolean> {\n const indexKey = DbDocumentMutation.prefixForPath(userId, key.path);\n const encodedPath = indexKey[1];\n const startRange = IDBKeyRange.lowerBound(indexKey);\n let containsKey = false;\n return documentMutationsStore(txn)\n .iterate({ range: startRange, keysOnly: true }, (key, value, control) => {\n const [userID, keyPath, /*batchID*/ _] = key;\n if (userID === userId && keyPath === encodedPath) {\n containsKey = true;\n }\n control.done();\n })\n .next(() => containsKey);\n}\n\n/** Returns true if any mutation queue contains the given document. */\nexport function mutationQueuesContainKey(\n txn: PersistenceTransaction,\n docKey: DocumentKey\n): PersistencePromise<boolean> {\n let found = false;\n return mutationQueuesStore(txn)\n .iterateSerial(userId => {\n return mutationQueueContainsKey(txn, userId, docKey).next(containsKey => {\n if (containsKey) {\n found = true;\n }\n return PersistencePromise.resolve(!containsKey);\n });\n })\n .next(() => found);\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the mutations object store.\n */\nfunction mutationsStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbMutationBatchKey, DbMutationBatch> {\n return getStore<DbMutationBatchKey, DbMutationBatch>(\n txn,\n DbMutationBatch.store\n );\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the mutationQueues object store.\n */\nfunction documentMutationsStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbDocumentMutationKey, DbDocumentMutation> {\n return getStore<DbDocumentMutationKey, DbDocumentMutation>(\n txn,\n DbDocumentMutation.store\n );\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the mutationQueues object store.\n */\nfunction mutationQueuesStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbMutationQueueKey, DbMutationQueue> {\n return getStore<DbMutationQueueKey, DbMutationQueue>(\n txn,\n DbMutationQueue.store\n );\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TargetId } from './types';\n\n/** Offset to ensure non-overlapping target ids. */\nconst OFFSET = 2;\n\n/**\n * Generates monotonically increasing target IDs for sending targets to the\n * watch stream.\n *\n * The client constructs two generators, one for the target cache, and one for\n * for the sync engine (to generate limbo documents targets). These\n * generators produce non-overlapping IDs (by using even and odd IDs\n * respectively).\n *\n * By separating the target ID space, the query cache can generate target IDs\n * that persist across client restarts, while sync engine can independently\n * generate in-memory target IDs that are transient and can be reused after a\n * restart.\n */\nexport class TargetIdGenerator {\n constructor(private lastId: number) {}\n\n next(): TargetId {\n this.lastId += OFFSET;\n return this.lastId;\n }\n\n static forTargetCache(): TargetIdGenerator {\n // The target cache generator must return '2' in its first call to `next()`\n // as there is no differentiation in the protocol layer between an unset\n // number and the number '0'. If we were to sent a target with target ID\n // '0', the backend would consider it unset and replace it with its own ID.\n return new TargetIdGenerator(2 - OFFSET);\n }\n\n static forSyncEngine(): TargetIdGenerator {\n // Sync engine assigns target IDs for limbo document detection.\n return new TargetIdGenerator(1 - OFFSET);\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { canonifyTarget, Target, targetEquals } from '../core/target';\nimport { TargetIdGenerator } from '../core/target_id_generator';\nimport { ListenSequenceNumber, TargetId } from '../core/types';\nimport { Timestamp } from '../lite/timestamp';\nimport { DocumentKeySet, documentKeySet } from '../model/collections';\nimport { DocumentKey } from '../model/document_key';\nimport { hardAssert } from '../util/assert';\nimport { immediateSuccessor } from '../util/misc';\n\nimport {\n decodeResourcePath,\n encodeResourcePath\n} from './encoded_resource_path';\nimport { IndexedDbLruDelegate } from './indexeddb_lru_delegate';\nimport {\n DbTarget,\n DbTargetDocument,\n DbTargetDocumentKey,\n DbTargetGlobal,\n DbTargetGlobalKey,\n DbTargetKey\n} from './indexeddb_schema';\nimport { getStore } from './indexeddb_transaction';\nimport { fromDbTarget, LocalSerializer, toDbTarget } from './local_serializer';\nimport { ActiveTargets } from './lru_garbage_collector';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { SimpleDbStore } from './simple_db';\nimport { TargetCache } from './target_cache';\nimport { TargetData } from './target_data';\n\nexport class IndexedDbTargetCache implements TargetCache {\n constructor(\n private readonly referenceDelegate: IndexedDbLruDelegate,\n private serializer: LocalSerializer\n ) {}\n\n // PORTING NOTE: We don't cache global metadata for the target cache, since\n // some of it (in particular `highestTargetId`) can be modified by secondary\n // tabs. We could perhaps be more granular (and e.g. still cache\n // `lastRemoteSnapshotVersion` in memory) but for simplicity we currently go\n // to IndexedDb whenever we need to read metadata. We can revisit if it turns\n // out to have a meaningful performance impact.\n\n allocateTargetId(\n transaction: PersistenceTransaction\n ): PersistencePromise<TargetId> {\n return this.retrieveMetadata(transaction).next(metadata => {\n const targetIdGenerator = new TargetIdGenerator(metadata.highestTargetId);\n metadata.highestTargetId = targetIdGenerator.next();\n return this.saveMetadata(transaction, metadata).next(\n () => metadata.highestTargetId\n );\n });\n }\n\n getLastRemoteSnapshotVersion(\n transaction: PersistenceTransaction\n ): PersistencePromise<SnapshotVersion> {\n return this.retrieveMetadata(transaction).next(metadata => {\n return SnapshotVersion.fromTimestamp(\n new Timestamp(\n metadata.lastRemoteSnapshotVersion.seconds,\n metadata.lastRemoteSnapshotVersion.nanoseconds\n )\n );\n });\n }\n\n getHighestSequenceNumber(\n transaction: PersistenceTransaction\n ): PersistencePromise<ListenSequenceNumber> {\n return this.retrieveMetadata(transaction).next(\n targetGlobal => targetGlobal.highestListenSequenceNumber\n );\n }\n\n setTargetsMetadata(\n transaction: PersistenceTransaction,\n highestListenSequenceNumber: number,\n lastRemoteSnapshotVersion?: SnapshotVersion\n ): PersistencePromise<void> {\n return this.retrieveMetadata(transaction).next(metadata => {\n metadata.highestListenSequenceNumber = highestListenSequenceNumber;\n if (lastRemoteSnapshotVersion) {\n metadata.lastRemoteSnapshotVersion = lastRemoteSnapshotVersion.toTimestamp();\n }\n if (highestListenSequenceNumber > metadata.highestListenSequenceNumber) {\n metadata.highestListenSequenceNumber = highestListenSequenceNumber;\n }\n return this.saveMetadata(transaction, metadata);\n });\n }\n\n addTargetData(\n transaction: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise<void> {\n return this.saveTargetData(transaction, targetData).next(() => {\n return this.retrieveMetadata(transaction).next(metadata => {\n metadata.targetCount += 1;\n this.updateMetadataFromTargetData(targetData, metadata);\n return this.saveMetadata(transaction, metadata);\n });\n });\n }\n\n updateTargetData(\n transaction: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise<void> {\n return this.saveTargetData(transaction, targetData);\n }\n\n removeTargetData(\n transaction: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise<void> {\n return this.removeMatchingKeysForTargetId(transaction, targetData.targetId)\n .next(() => targetsStore(transaction).delete(targetData.targetId))\n .next(() => this.retrieveMetadata(transaction))\n .next(metadata => {\n hardAssert(\n metadata.targetCount > 0,\n 'Removing from an empty target cache'\n );\n metadata.targetCount -= 1;\n return this.saveMetadata(transaction, metadata);\n });\n }\n\n /**\n * Drops any targets with sequence number less than or equal to the upper bound, excepting those\n * present in `activeTargetIds`. Document associations for the removed targets are also removed.\n * Returns the number of targets removed.\n */\n removeTargets(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise<number> {\n let count = 0;\n const promises: Array<PersistencePromise<void>> = [];\n return targetsStore(txn)\n .iterate((key, value) => {\n const targetData = fromDbTarget(value);\n if (\n targetData.sequenceNumber <= upperBound &&\n activeTargetIds.get(targetData.targetId) === null\n ) {\n count++;\n promises.push(this.removeTargetData(txn, targetData));\n }\n })\n .next(() => PersistencePromise.waitFor(promises))\n .next(() => count);\n }\n\n /**\n * Call provided function with each `TargetData` that we have cached.\n */\n forEachTarget(\n txn: PersistenceTransaction,\n f: (q: TargetData) => void\n ): PersistencePromise<void> {\n return targetsStore(txn).iterate((key, value) => {\n const targetData = fromDbTarget(value);\n f(targetData);\n });\n }\n\n private retrieveMetadata(\n transaction: PersistenceTransaction\n ): PersistencePromise<DbTargetGlobal> {\n return globalTargetStore(transaction)\n .get(DbTargetGlobal.key)\n .next(metadata => {\n hardAssert(metadata !== null, 'Missing metadata row.');\n return metadata;\n });\n }\n\n private saveMetadata(\n transaction: PersistenceTransaction,\n metadata: DbTargetGlobal\n ): PersistencePromise<void> {\n return globalTargetStore(transaction).put(DbTargetGlobal.key, metadata);\n }\n\n private saveTargetData(\n transaction: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise<void> {\n return targetsStore(transaction).put(\n toDbTarget(this.serializer, targetData)\n );\n }\n\n /**\n * In-place updates the provided metadata to account for values in the given\n * TargetData. Saving is done separately. Returns true if there were any\n * changes to the metadata.\n */\n private updateMetadataFromTargetData(\n targetData: TargetData,\n metadata: DbTargetGlobal\n ): boolean {\n let updated = false;\n if (targetData.targetId > metadata.highestTargetId) {\n metadata.highestTargetId = targetData.targetId;\n updated = true;\n }\n\n if (targetData.sequenceNumber > metadata.highestListenSequenceNumber) {\n metadata.highestListenSequenceNumber = targetData.sequenceNumber;\n updated = true;\n }\n return updated;\n }\n\n getTargetCount(\n transaction: PersistenceTransaction\n ): PersistencePromise<number> {\n return this.retrieveMetadata(transaction).next(\n metadata => metadata.targetCount\n );\n }\n\n getTargetData(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise<TargetData | null> {\n // Iterating by the canonicalId may yield more than one result because\n // canonicalId values are not required to be unique per target. This query\n // depends on the queryTargets index to be efficient.\n const canonicalId = canonifyTarget(target);\n const range = IDBKeyRange.bound(\n [canonicalId, Number.NEGATIVE_INFINITY],\n [canonicalId, Number.POSITIVE_INFINITY]\n );\n let result: TargetData | null = null;\n return targetsStore(transaction)\n .iterate(\n { range, index: DbTarget.queryTargetsIndexName },\n (key, value, control) => {\n const found = fromDbTarget(value);\n // After finding a potential match, check that the target is\n // actually equal to the requested target.\n if (targetEquals(target, found.target)) {\n result = found;\n control.done();\n }\n }\n )\n .next(() => result);\n }\n\n addMatchingKeys(\n txn: PersistenceTransaction,\n keys: DocumentKeySet,\n targetId: TargetId\n ): PersistencePromise<void> {\n // PORTING NOTE: The reverse index (documentsTargets) is maintained by\n // IndexedDb.\n const promises: Array<PersistencePromise<void>> = [];\n const store = documentTargetStore(txn);\n keys.forEach(key => {\n const path = encodeResourcePath(key.path);\n promises.push(store.put(new DbTargetDocument(targetId, path)));\n promises.push(this.referenceDelegate.addReference(txn, targetId, key));\n });\n return PersistencePromise.waitFor(promises);\n }\n\n removeMatchingKeys(\n txn: PersistenceTransaction,\n keys: DocumentKeySet,\n targetId: TargetId\n ): PersistencePromise<void> {\n // PORTING NOTE: The reverse index (documentsTargets) is maintained by\n // IndexedDb.\n const store = documentTargetStore(txn);\n return PersistencePromise.forEach(keys, (key: DocumentKey) => {\n const path = encodeResourcePath(key.path);\n return PersistencePromise.waitFor([\n store.delete([targetId, path]),\n this.referenceDelegate.removeReference(txn, targetId, key)\n ]);\n });\n }\n\n removeMatchingKeysForTargetId(\n txn: PersistenceTransaction,\n targetId: TargetId\n ): PersistencePromise<void> {\n const store = documentTargetStore(txn);\n const range = IDBKeyRange.bound(\n [targetId],\n [targetId + 1],\n /*lowerOpen=*/ false,\n /*upperOpen=*/ true\n );\n return store.delete(range);\n }\n\n getMatchingKeysForTargetId(\n txn: PersistenceTransaction,\n targetId: TargetId\n ): PersistencePromise<DocumentKeySet> {\n const range = IDBKeyRange.bound(\n [targetId],\n [targetId + 1],\n /*lowerOpen=*/ false,\n /*upperOpen=*/ true\n );\n const store = documentTargetStore(txn);\n let result = documentKeySet();\n\n return store\n .iterate({ range, keysOnly: true }, (key, _, control) => {\n const path = decodeResourcePath(key[1]);\n const docKey = new DocumentKey(path);\n result = result.add(docKey);\n })\n .next(() => result);\n }\n\n containsKey(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<boolean> {\n const path = encodeResourcePath(key.path);\n const range = IDBKeyRange.bound(\n [path],\n [immediateSuccessor(path)],\n /*lowerOpen=*/ false,\n /*upperOpen=*/ true\n );\n let count = 0;\n return documentTargetStore(txn!)\n .iterate(\n {\n index: DbTargetDocument.documentTargetsIndex,\n keysOnly: true,\n range\n },\n ([targetId, path], _, control) => {\n // Having a sentinel row for a document does not count as containing that document;\n // For the target cache, containing the document means the document is part of some\n // target.\n if (targetId !== 0) {\n count++;\n control.done();\n }\n }\n )\n .next(() => count > 0);\n }\n\n /**\n * Looks up a TargetData entry by target ID.\n *\n * @param targetId - The target ID of the TargetData entry to look up.\n * @returns The cached TargetData entry, or null if the cache has no entry for\n * the target.\n */\n // PORTING NOTE: Multi-tab only.\n getTargetDataForTarget(\n transaction: PersistenceTransaction,\n targetId: TargetId\n ): PersistencePromise<TargetData | null> {\n return targetsStore(transaction)\n .get(targetId)\n .next(found => {\n if (found) {\n return fromDbTarget(found);\n } else {\n return null;\n }\n });\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the queries object store.\n */\nfunction targetsStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbTargetKey, DbTarget> {\n return getStore<DbTargetKey, DbTarget>(txn, DbTarget.store);\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the target globals object store.\n */\nfunction globalTargetStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbTargetGlobalKey, DbTargetGlobal> {\n return getStore<DbTargetGlobalKey, DbTargetGlobal>(txn, DbTargetGlobal.store);\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the document target object store.\n */\nexport function documentTargetStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbTargetDocumentKey, DbTargetDocument> {\n return getStore<DbTargetDocumentKey, DbTargetDocument>(\n txn,\n DbTargetDocument.store\n );\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug } from '../util/log';\n\nimport { LruGarbageCollector, LruResults } from './lru_garbage_collector';\nimport { PRIMARY_LEASE_LOST_ERROR_MSG } from './persistence_transaction';\n\nexport interface LocalStore {\n collectGarbage(garbageCollector: LruGarbageCollector): Promise<LruResults>;\n}\n\n/**\n * Verifies the error thrown by a LocalStore operation. If a LocalStore\n * operation fails because the primary lease has been taken by another client,\n * we ignore the error (the persistence layer will immediately call\n * `applyPrimaryLease` to propagate the primary state change). All other errors\n * are re-thrown.\n *\n * @param err - An error returned by a LocalStore operation.\n * @returns A Promise that resolves after we recovered, or the original error.\n */\nexport async function ignoreIfPrimaryLeaseLoss(\n err: FirestoreError\n): Promise<void> {\n if (\n err.code === Code.FAILED_PRECONDITION &&\n err.message === PRIMARY_LEASE_LOST_ERROR_MSG\n ) {\n logDebug('LocalStore', 'Unexpectedly lost primary lease');\n } else {\n throw err;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListenSequence } from '../core/listen_sequence';\nimport { ListenSequenceNumber } from '../core/types';\nimport { debugAssert } from '../util/assert';\nimport { AsyncQueue, DelayedOperation, TimerId } from '../util/async_queue';\nimport { getLogLevel, logDebug, LogLevel } from '../util/log';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { ignoreIfPrimaryLeaseLoss, LocalStore } from './local_store';\nimport {\n ActiveTargets,\n GC_DID_NOT_RUN,\n LRU_COLLECTION_DISABLED,\n LruDelegate,\n LruGarbageCollector,\n LruParams,\n LruResults\n} from './lru_garbage_collector';\nimport { GarbageCollectionScheduler } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { isIndexedDbTransactionError } from './simple_db';\n\nconst LOG_TAG = 'LruGarbageCollector';\n\nexport const LRU_MINIMUM_CACHE_SIZE_BYTES = 1 * 1024 * 1024;\n\n/** How long we wait to try running LRU GC after SDK initialization. */\nconst INITIAL_GC_DELAY_MS = 1 * 60 * 1000;\n/** Minimum amount of time between GC checks, after the first one. */\nconst REGULAR_GC_DELAY_MS = 5 * 60 * 1000;\n\n// The type and comparator for the items contained in the SortedSet used in\n// place of a priority queue for the RollingSequenceNumberBuffer.\ntype BufferEntry = [ListenSequenceNumber, number];\n\nfunction bufferEntryComparator(\n [aSequence, aIndex]: BufferEntry,\n [bSequence, bIndex]: BufferEntry\n): number {\n const seqCmp = primitiveComparator(aSequence, bSequence);\n if (seqCmp === 0) {\n // This order doesn't matter, but we can bias against churn by sorting\n // entries created earlier as less than newer entries.\n return primitiveComparator(aIndex, bIndex);\n } else {\n return seqCmp;\n }\n}\n\n/**\n * Used to calculate the nth sequence number. Keeps a rolling buffer of the\n * lowest n values passed to `addElement`, and finally reports the largest of\n * them in `maxValue`.\n */\nclass RollingSequenceNumberBuffer {\n private buffer: SortedSet<BufferEntry> = new SortedSet<BufferEntry>(\n bufferEntryComparator\n );\n\n private previousIndex = 0;\n\n constructor(private readonly maxElements: number) {}\n\n private nextIndex(): number {\n return ++this.previousIndex;\n }\n\n addElement(sequenceNumber: ListenSequenceNumber): void {\n const entry: BufferEntry = [sequenceNumber, this.nextIndex()];\n if (this.buffer.size < this.maxElements) {\n this.buffer = this.buffer.add(entry);\n } else {\n const highestValue = this.buffer.last()!;\n if (bufferEntryComparator(entry, highestValue) < 0) {\n this.buffer = this.buffer.delete(highestValue).add(entry);\n }\n }\n }\n\n get maxValue(): ListenSequenceNumber {\n // Guaranteed to be non-empty. If we decide we are not collecting any\n // sequence numbers, nthSequenceNumber below short-circuits. If we have\n // decided that we are collecting n sequence numbers, it's because n is some\n // percentage of the existing sequence numbers. That means we should never\n // be in a situation where we are collecting sequence numbers but don't\n // actually have any.\n return this.buffer.last()![0];\n }\n}\n\n/**\n * This class is responsible for the scheduling of LRU garbage collection. It handles checking\n * whether or not GC is enabled, as well as which delay to use before the next run.\n */\nexport class LruScheduler implements GarbageCollectionScheduler {\n private hasRun: boolean = false;\n private gcTask: DelayedOperation<void> | null;\n\n constructor(\n private readonly garbageCollector: LruGarbageCollector,\n private readonly asyncQueue: AsyncQueue\n ) {\n this.gcTask = null;\n }\n\n start(localStore: LocalStore): void {\n debugAssert(\n this.gcTask === null,\n 'Cannot start an already started LruScheduler'\n );\n if (\n this.garbageCollector.params.cacheSizeCollectionThreshold !==\n LRU_COLLECTION_DISABLED\n ) {\n this.scheduleGC(localStore);\n }\n }\n\n stop(): void {\n if (this.gcTask) {\n this.gcTask.cancel();\n this.gcTask = null;\n }\n }\n\n get started(): boolean {\n return this.gcTask !== null;\n }\n\n private scheduleGC(localStore: LocalStore): void {\n debugAssert(\n this.gcTask === null,\n 'Cannot schedule GC while a task is pending'\n );\n const delay = this.hasRun ? REGULAR_GC_DELAY_MS : INITIAL_GC_DELAY_MS;\n logDebug(\n 'LruGarbageCollector',\n `Garbage collection scheduled in ${delay}ms`\n );\n this.gcTask = this.asyncQueue.enqueueAfterDelay(\n TimerId.LruGarbageCollection,\n delay,\n async () => {\n this.gcTask = null;\n this.hasRun = true;\n try {\n await localStore.collectGarbage(this.garbageCollector);\n } catch (e) {\n if (isIndexedDbTransactionError(e)) {\n logDebug(\n LOG_TAG,\n 'Ignoring IndexedDB error during garbage collection: ',\n e\n );\n } else {\n await ignoreIfPrimaryLeaseLoss(e);\n }\n }\n await this.scheduleGC(localStore);\n }\n );\n }\n}\n\n/** Implements the steps for LRU garbage collection. */\nclass LruGarbageCollectorImpl implements LruGarbageCollector {\n constructor(\n private readonly delegate: LruDelegate,\n readonly params: LruParams\n ) {}\n\n calculateTargetCount(\n txn: PersistenceTransaction,\n percentile: number\n ): PersistencePromise<number> {\n return this.delegate.getSequenceNumberCount(txn).next(targetCount => {\n return Math.floor((percentile / 100.0) * targetCount);\n });\n }\n\n nthSequenceNumber(\n txn: PersistenceTransaction,\n n: number\n ): PersistencePromise<ListenSequenceNumber> {\n if (n === 0) {\n return PersistencePromise.resolve(ListenSequence.INVALID);\n }\n\n const buffer = new RollingSequenceNumberBuffer(n);\n return this.delegate\n .forEachTarget(txn, target => buffer.addElement(target.sequenceNumber))\n .next(() => {\n return this.delegate.forEachOrphanedDocumentSequenceNumber(\n txn,\n sequenceNumber => buffer.addElement(sequenceNumber)\n );\n })\n .next(() => buffer.maxValue);\n }\n\n removeTargets(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise<number> {\n return this.delegate.removeTargets(txn, upperBound, activeTargetIds);\n }\n\n removeOrphanedDocuments(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber\n ): PersistencePromise<number> {\n return this.delegate.removeOrphanedDocuments(txn, upperBound);\n }\n\n collect(\n txn: PersistenceTransaction,\n activeTargetIds: ActiveTargets\n ): PersistencePromise<LruResults> {\n if (this.params.cacheSizeCollectionThreshold === LRU_COLLECTION_DISABLED) {\n logDebug('LruGarbageCollector', 'Garbage collection skipped; disabled');\n return PersistencePromise.resolve(GC_DID_NOT_RUN);\n }\n\n return this.getCacheSize(txn).next(cacheSize => {\n if (cacheSize < this.params.cacheSizeCollectionThreshold) {\n logDebug(\n 'LruGarbageCollector',\n `Garbage collection skipped; Cache size ${cacheSize} ` +\n `is lower than threshold ${this.params.cacheSizeCollectionThreshold}`\n );\n return GC_DID_NOT_RUN;\n } else {\n return this.runGarbageCollection(txn, activeTargetIds);\n }\n });\n }\n\n getCacheSize(txn: PersistenceTransaction): PersistencePromise<number> {\n return this.delegate.getCacheSize(txn);\n }\n\n private runGarbageCollection(\n txn: PersistenceTransaction,\n activeTargetIds: ActiveTargets\n ): PersistencePromise<LruResults> {\n let upperBoundSequenceNumber: number;\n let sequenceNumbersToCollect: number, targetsRemoved: number;\n // Timestamps for various pieces of the process\n let countedTargetsTs: number,\n foundUpperBoundTs: number,\n removedTargetsTs: number,\n removedDocumentsTs: number;\n const startTs = Date.now();\n return this.calculateTargetCount(txn, this.params.percentileToCollect)\n .next(sequenceNumbers => {\n // Cap at the configured max\n if (sequenceNumbers > this.params.maximumSequenceNumbersToCollect) {\n logDebug(\n 'LruGarbageCollector',\n 'Capping sequence numbers to collect down ' +\n `to the maximum of ${this.params.maximumSequenceNumbersToCollect} ` +\n `from ${sequenceNumbers}`\n );\n sequenceNumbersToCollect = this.params\n .maximumSequenceNumbersToCollect;\n } else {\n sequenceNumbersToCollect = sequenceNumbers;\n }\n countedTargetsTs = Date.now();\n\n return this.nthSequenceNumber(txn, sequenceNumbersToCollect);\n })\n .next(upperBound => {\n upperBoundSequenceNumber = upperBound;\n foundUpperBoundTs = Date.now();\n\n return this.removeTargets(\n txn,\n upperBoundSequenceNumber,\n activeTargetIds\n );\n })\n .next(numTargetsRemoved => {\n targetsRemoved = numTargetsRemoved;\n removedTargetsTs = Date.now();\n\n return this.removeOrphanedDocuments(txn, upperBoundSequenceNumber);\n })\n .next(documentsRemoved => {\n removedDocumentsTs = Date.now();\n\n if (getLogLevel() <= LogLevel.DEBUG) {\n const desc =\n 'LRU Garbage Collection\\n' +\n `\\tCounted targets in ${countedTargetsTs - startTs}ms\\n` +\n `\\tDetermined least recently used ${sequenceNumbersToCollect} in ` +\n `${foundUpperBoundTs - countedTargetsTs}ms\\n` +\n `\\tRemoved ${targetsRemoved} targets in ` +\n `${removedTargetsTs - foundUpperBoundTs}ms\\n` +\n `\\tRemoved ${documentsRemoved} documents in ` +\n `${removedDocumentsTs - removedTargetsTs}ms\\n` +\n `Total Duration: ${removedDocumentsTs - startTs}ms`;\n logDebug('LruGarbageCollector', desc);\n }\n\n return PersistencePromise.resolve<LruResults>({\n didRun: true,\n sequenceNumbersCollected: sequenceNumbersToCollect,\n targetsRemoved,\n documentsRemoved\n });\n });\n }\n}\n\nexport function newLruGarbageCollector(\n delegate: LruDelegate,\n params: LruParams\n): LruGarbageCollector {\n return new LruGarbageCollectorImpl(delegate, params);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListenSequence } from '../core/listen_sequence';\nimport { ListenSequenceNumber, TargetId } from '../core/types';\nimport { DocumentKey } from '../model/document_key';\n\nimport {\n decodeResourcePath,\n EncodedResourcePath,\n encodeResourcePath\n} from './encoded_resource_path';\nimport { IndexedDbLruDelegate } from './indexeddb_lru_delegate';\nimport { mutationQueuesContainKey } from './indexeddb_mutation_queue';\nimport { DbTargetDocument } from './indexeddb_schema';\nimport {\n documentTargetStore,\n IndexedDbTargetCache\n} from './indexeddb_target_cache';\nimport {\n ActiveTargets,\n LruGarbageCollector,\n LruParams\n} from './lru_garbage_collector';\nimport { newLruGarbageCollector } from './lru_garbage_collector_impl';\nimport { Persistence } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { TargetData } from './target_data';\n\n/** Provides LRU functionality for IndexedDB persistence. */\nexport class IndexedDbLruDelegateImpl implements IndexedDbLruDelegate {\n readonly garbageCollector: LruGarbageCollector;\n\n constructor(private readonly db: Persistence, params: LruParams) {\n this.garbageCollector = newLruGarbageCollector(this, params);\n }\n\n getSequenceNumberCount(\n txn: PersistenceTransaction\n ): PersistencePromise<number> {\n const docCountPromise = this.orphanedDocumentCount(txn);\n const targetCountPromise = this.db.getTargetCache().getTargetCount(txn);\n return targetCountPromise.next(targetCount =>\n docCountPromise.next(docCount => targetCount + docCount)\n );\n }\n\n private orphanedDocumentCount(\n txn: PersistenceTransaction\n ): PersistencePromise<number> {\n let orphanedCount = 0;\n return this.forEachOrphanedDocumentSequenceNumber(txn, _ => {\n orphanedCount++;\n }).next(() => orphanedCount);\n }\n\n forEachTarget(\n txn: PersistenceTransaction,\n f: (q: TargetData) => void\n ): PersistencePromise<void> {\n return this.db.getTargetCache().forEachTarget(txn, f);\n }\n\n forEachOrphanedDocumentSequenceNumber(\n txn: PersistenceTransaction,\n f: (sequenceNumber: ListenSequenceNumber) => void\n ): PersistencePromise<void> {\n return this.forEachOrphanedDocument(txn, (docKey, sequenceNumber) =>\n f(sequenceNumber)\n );\n }\n\n addReference(\n txn: PersistenceTransaction,\n targetId: TargetId,\n key: DocumentKey\n ): PersistencePromise<void> {\n return writeSentinelKey(txn, key);\n }\n\n removeReference(\n txn: PersistenceTransaction,\n targetId: TargetId,\n key: DocumentKey\n ): PersistencePromise<void> {\n return writeSentinelKey(txn, key);\n }\n\n removeTargets(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise<number> {\n return (this.db.getTargetCache() as IndexedDbTargetCache).removeTargets(\n txn,\n upperBound,\n activeTargetIds\n );\n }\n\n markPotentiallyOrphaned(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<void> {\n return writeSentinelKey(txn, key);\n }\n\n /**\n * Returns true if anything would prevent this document from being garbage\n * collected, given that the document in question is not present in any\n * targets and has a sequence number less than or equal to the upper bound for\n * the collection run.\n */\n private isPinned(\n txn: PersistenceTransaction,\n docKey: DocumentKey\n ): PersistencePromise<boolean> {\n return mutationQueuesContainKey(txn, docKey);\n }\n\n removeOrphanedDocuments(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber\n ): PersistencePromise<number> {\n const documentCache = this.db.getRemoteDocumentCache();\n const changeBuffer = documentCache.newChangeBuffer();\n\n const promises: Array<PersistencePromise<void>> = [];\n let documentCount = 0;\n\n const iteration = this.forEachOrphanedDocument(\n txn,\n (docKey, sequenceNumber) => {\n if (sequenceNumber <= upperBound) {\n const p = this.isPinned(txn, docKey).next(isPinned => {\n if (!isPinned) {\n documentCount++;\n // Our size accounting requires us to read all documents before\n // removing them.\n return changeBuffer.getEntry(txn, docKey).next(() => {\n changeBuffer.removeEntry(docKey);\n return documentTargetStore(txn).delete(sentinelKey(docKey));\n });\n }\n });\n promises.push(p);\n }\n }\n );\n\n return iteration\n .next(() => PersistencePromise.waitFor(promises))\n .next(() => changeBuffer.apply(txn))\n .next(() => documentCount);\n }\n\n removeTarget(\n txn: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise<void> {\n const updated = targetData.withSequenceNumber(txn.currentSequenceNumber);\n return this.db.getTargetCache().updateTargetData(txn, updated);\n }\n\n updateLimboDocument(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<void> {\n return writeSentinelKey(txn, key);\n }\n\n /**\n * Call provided function for each document in the cache that is 'orphaned'. Orphaned\n * means not a part of any target, so the only entry in the target-document index for\n * that document will be the sentinel row (targetId 0), which will also have the sequence\n * number for the last time the document was accessed.\n */\n private forEachOrphanedDocument(\n txn: PersistenceTransaction,\n f: (docKey: DocumentKey, sequenceNumber: ListenSequenceNumber) => void\n ): PersistencePromise<void> {\n const store = documentTargetStore(txn);\n let nextToReport: ListenSequenceNumber = ListenSequence.INVALID;\n let nextPath: EncodedResourcePath;\n return store\n .iterate(\n {\n index: DbTargetDocument.documentTargetsIndex\n },\n ([targetId, docKey], { path, sequenceNumber }) => {\n if (targetId === 0) {\n // if nextToReport is valid, report it, this is a new key so the\n // last one must not be a member of any targets.\n if (nextToReport !== ListenSequence.INVALID) {\n f(new DocumentKey(decodeResourcePath(nextPath)), nextToReport);\n }\n // set nextToReport to be this sequence number. It's the next one we\n // might report, if we don't find any targets for this document.\n // Note that the sequence number must be defined when the targetId\n // is 0.\n nextToReport = sequenceNumber!;\n nextPath = path;\n } else {\n // set nextToReport to be invalid, we know we don't need to report\n // this one since we found a target for it.\n nextToReport = ListenSequence.INVALID;\n }\n }\n )\n .next(() => {\n // Since we report sequence numbers after getting to the next key, we\n // need to check if the last key we iterated over was an orphaned\n // document and report it.\n if (nextToReport !== ListenSequence.INVALID) {\n f(new DocumentKey(decodeResourcePath(nextPath)), nextToReport);\n }\n });\n }\n\n getCacheSize(txn: PersistenceTransaction): PersistencePromise<number> {\n return this.db.getRemoteDocumentCache().getSize(txn);\n }\n}\n\nfunction sentinelKey(key: DocumentKey): [TargetId, EncodedResourcePath] {\n return [0, encodeResourcePath(key.path)];\n}\n\n/**\n * @returns A value suitable for writing a sentinel row in the target-document\n * store.\n */\nfunction sentinelRow(\n key: DocumentKey,\n sequenceNumber: ListenSequenceNumber\n): DbTargetDocument {\n return new DbTargetDocument(0, encodeResourcePath(key.path), sequenceNumber);\n}\n\nfunction writeSentinelKey(\n txn: PersistenceTransaction,\n key: DocumentKey\n): PersistencePromise<void> {\n return documentTargetStore(txn).put(\n sentinelRow(key, txn.currentSequenceNumber)\n );\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { forEach, isEmpty } from './obj';\n\ntype Entry<K, V> = [K, V];\n\n/**\n * A map implementation that uses objects as keys. Objects must have an\n * associated equals function and must be immutable. Entries in the map are\n * stored together with the key being produced from the mapKeyFn. This map\n * automatically handles collisions of keys.\n */\nexport class ObjectMap<KeyType, ValueType> {\n /**\n * The inner map for a key/value pair. Due to the possibility of collisions we\n * keep a list of entries that we do a linear search through to find an actual\n * match. Note that collisions should be rare, so we still expect near\n * constant time lookups in practice.\n */\n private inner: {\n [canonicalId: string]: Array<Entry<KeyType, ValueType>>;\n } = {};\n\n constructor(\n private mapKeyFn: (key: KeyType) => string,\n private equalsFn: (l: KeyType, r: KeyType) => boolean\n ) {}\n\n /** Get a value for this key, or undefined if it does not exist. */\n get(key: KeyType): ValueType | undefined {\n const id = this.mapKeyFn(key);\n const matches = this.inner[id];\n if (matches === undefined) {\n return undefined;\n }\n for (const [otherKey, value] of matches) {\n if (this.equalsFn(otherKey, key)) {\n return value;\n }\n }\n return undefined;\n }\n\n has(key: KeyType): boolean {\n return this.get(key) !== undefined;\n }\n\n /** Put this key and value in the map. */\n set(key: KeyType, value: ValueType): void {\n const id = this.mapKeyFn(key);\n const matches = this.inner[id];\n if (matches === undefined) {\n this.inner[id] = [[key, value]];\n return;\n }\n for (let i = 0; i < matches.length; i++) {\n if (this.equalsFn(matches[i][0], key)) {\n matches[i] = [key, value];\n return;\n }\n }\n matches.push([key, value]);\n }\n\n /**\n * Remove this key from the map. Returns a boolean if anything was deleted.\n */\n delete(key: KeyType): boolean {\n const id = this.mapKeyFn(key);\n const matches = this.inner[id];\n if (matches === undefined) {\n return false;\n }\n for (let i = 0; i < matches.length; i++) {\n if (this.equalsFn(matches[i][0], key)) {\n if (matches.length === 1) {\n delete this.inner[id];\n } else {\n matches.splice(i, 1);\n }\n return true;\n }\n }\n return false;\n }\n\n forEach(fn: (key: KeyType, val: ValueType) => void): void {\n forEach(this.inner, (_, entries) => {\n for (const [k, v] of entries) {\n fn(k, v);\n }\n });\n }\n\n isEmpty(): boolean {\n return isEmpty(this.inner);\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { DocumentKeySet, MutableDocumentMap } from '../model/collections';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { debugAssert } from '../util/assert';\nimport { ObjectMap } from '../util/obj_map';\n\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\n\n/**\n * Represents a document change to be applied to remote document cache.\n */\ninterface RemoteDocumentChange {\n // The document in this change. Contains an invalid document if it is a\n // removed from the cache.\n readonly document: MutableDocument;\n // The timestamp when this change is read.\n readonly readTime: SnapshotVersion | null;\n}\n\n/**\n * An in-memory buffer of entries to be written to a RemoteDocumentCache.\n * It can be used to batch up a set of changes to be written to the cache, but\n * additionally supports reading entries back with the `getEntry()` method,\n * falling back to the underlying RemoteDocumentCache if no entry is\n * buffered.\n *\n * Entries added to the cache *must* be read first. This is to facilitate\n * calculating the size delta of the pending changes.\n *\n * PORTING NOTE: This class was implemented then removed from other platforms.\n * If byte-counting ends up being needed on the other platforms, consider\n * porting this class as part of that implementation work.\n */\nexport abstract class RemoteDocumentChangeBuffer {\n // A mapping of document key to the new cache entry that should be written (or null if any\n // existing cache entry should be removed).\n protected changes: ObjectMap<\n DocumentKey,\n RemoteDocumentChange\n > = new ObjectMap(\n key => key.toString(),\n (l, r) => l.isEqual(r)\n );\n\n private changesApplied = false;\n\n protected abstract getFromCache(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise<MutableDocument>;\n\n protected abstract getAllFromCache(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise<MutableDocumentMap>;\n\n protected abstract applyChanges(\n transaction: PersistenceTransaction\n ): PersistencePromise<void>;\n\n protected getReadTime(key: DocumentKey): SnapshotVersion {\n const change = this.changes.get(key);\n if (change) {\n debugAssert(\n !!change.readTime,\n `Read time is not set for ${key}. All removeEntry() calls must include a readTime if 'trackRemovals' is used.`\n );\n return change.readTime;\n }\n return SnapshotVersion.min();\n }\n\n /**\n * Buffers a `RemoteDocumentCache.addEntry()` call.\n *\n * You can only modify documents that have already been retrieved via\n * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`).\n */\n addEntry(document: MutableDocument, readTime: SnapshotVersion): void {\n this.assertNotApplied();\n this.changes.set(document.key, { document, readTime });\n }\n\n /**\n * Buffers a `RemoteDocumentCache.removeEntry()` call.\n *\n * You can only remove documents that have already been retrieved via\n * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`).\n */\n removeEntry(key: DocumentKey, readTime: SnapshotVersion | null = null): void {\n this.assertNotApplied();\n this.changes.set(key, {\n document: MutableDocument.newInvalidDocument(key),\n readTime\n });\n }\n\n /**\n * Looks up an entry in the cache. The buffered changes will first be checked,\n * and if no buffered change applies, this will forward to\n * `RemoteDocumentCache.getEntry()`.\n *\n * @param transaction - The transaction in which to perform any persistence\n * operations.\n * @param documentKey - The key of the entry to look up.\n * @returns The cached document or an invalid document if we have nothing\n * cached.\n */\n getEntry(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise<MutableDocument> {\n this.assertNotApplied();\n const bufferedEntry = this.changes.get(documentKey);\n if (bufferedEntry !== undefined) {\n return PersistencePromise.resolve(bufferedEntry.document);\n } else {\n return this.getFromCache(transaction, documentKey);\n }\n }\n\n /**\n * Looks up several entries in the cache, forwarding to\n * `RemoteDocumentCache.getEntry()`.\n *\n * @param transaction - The transaction in which to perform any persistence\n * operations.\n * @param documentKeys - The keys of the entries to look up.\n * @returns A map of cached documents, indexed by key. If an entry cannot be\n * found, the corresponding key will be mapped to an invalid document.\n */\n getEntries(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise<MutableDocumentMap> {\n return this.getAllFromCache(transaction, documentKeys);\n }\n\n /**\n * Applies buffered changes to the underlying RemoteDocumentCache, using\n * the provided transaction.\n */\n apply(transaction: PersistenceTransaction): PersistencePromise<void> {\n this.assertNotApplied();\n this.changesApplied = true;\n return this.applyChanges(transaction);\n }\n\n /** Helper to assert this.changes is not null */\n protected assertNotApplied(): void {\n debugAssert(!this.changesApplied, 'Changes have already been applied.');\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isCollectionGroupQuery, Query, queryMatches } from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport {\n DocumentKeySet,\n DocumentSizeEntries,\n DocumentSizeEntry,\n MutableDocumentMap,\n mutableDocumentMap\n} from '../model/collections';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { ResourcePath } from '../model/path';\nimport { debugAssert, debugCast, hardAssert } from '../util/assert';\nimport { primitiveComparator } from '../util/misc';\nimport { ObjectMap } from '../util/obj_map';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { IndexManager } from './index_manager';\nimport { dbDocumentSize } from './indexeddb_mutation_batch_impl';\nimport {\n DbRemoteDocument,\n DbRemoteDocumentGlobal,\n DbRemoteDocumentGlobalKey,\n DbRemoteDocumentKey\n} from './indexeddb_schema';\nimport { getStore } from './indexeddb_transaction';\nimport {\n fromDbRemoteDocument,\n fromDbTimestampKey,\n LocalSerializer,\n toDbRemoteDocument,\n toDbTimestampKey\n} from './local_serializer';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { RemoteDocumentCache } from './remote_document_cache';\nimport { RemoteDocumentChangeBuffer } from './remote_document_change_buffer';\nimport { IterateOptions, SimpleDbStore } from './simple_db';\n\nexport interface IndexedDbRemoteDocumentCache extends RemoteDocumentCache {\n // The IndexedDbRemoteDocumentCache doesn't implement any methods on top\n // of RemoteDocumentCache. This class exists for consistency.\n}\n\n/**\n * The RemoteDocumentCache for IndexedDb. To construct, invoke\n * `newIndexedDbRemoteDocumentCache()`.\n */\nclass IndexedDbRemoteDocumentCacheImpl implements IndexedDbRemoteDocumentCache {\n /**\n * @param serializer - The document serializer.\n * @param indexManager - The query indexes that need to be maintained.\n */\n constructor(\n readonly serializer: LocalSerializer,\n readonly indexManager: IndexManager\n ) {}\n\n /**\n * Adds the supplied entries to the cache.\n *\n * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()` to ensure proper accounting of metadata.\n */\n addEntry(\n transaction: PersistenceTransaction,\n key: DocumentKey,\n doc: DbRemoteDocument\n ): PersistencePromise<void> {\n const documentStore = remoteDocumentsStore(transaction);\n return documentStore.put(dbKey(key), doc);\n }\n\n /**\n * Removes a document from the cache.\n *\n * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()` to ensure proper accounting of metadata.\n */\n removeEntry(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise<void> {\n const store = remoteDocumentsStore(transaction);\n const key = dbKey(documentKey);\n return store.delete(key);\n }\n\n /**\n * Updates the current cache size.\n *\n * Callers to `addEntry()` and `removeEntry()` *must* call this afterwards to update the\n * cache's metadata.\n */\n updateMetadata(\n transaction: PersistenceTransaction,\n sizeDelta: number\n ): PersistencePromise<void> {\n return this.getMetadata(transaction).next(metadata => {\n metadata.byteSize += sizeDelta;\n return this.setMetadata(transaction, metadata);\n });\n }\n\n getEntry(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise<MutableDocument> {\n return remoteDocumentsStore(transaction)\n .get(dbKey(documentKey))\n .next(dbRemoteDoc => {\n return this.maybeDecodeDocument(documentKey, dbRemoteDoc);\n });\n }\n\n /**\n * Looks up an entry in the cache.\n *\n * @param documentKey - The key of the entry to look up.\n * @returns The cached document entry and its size.\n */\n getSizedEntry(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise<DocumentSizeEntry> {\n return remoteDocumentsStore(transaction)\n .get(dbKey(documentKey))\n .next(dbRemoteDoc => {\n const doc = this.maybeDecodeDocument(documentKey, dbRemoteDoc);\n return {\n document: doc,\n size: dbDocumentSize(dbRemoteDoc)\n };\n });\n }\n\n getEntries(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise<MutableDocumentMap> {\n let results = mutableDocumentMap();\n return this.forEachDbEntry(\n transaction,\n documentKeys,\n (key, dbRemoteDoc) => {\n const doc = this.maybeDecodeDocument(key, dbRemoteDoc);\n results = results.insert(key, doc);\n }\n ).next(() => results);\n }\n\n /**\n * Looks up several entries in the cache.\n *\n * @param documentKeys - The set of keys entries to look up.\n * @returns A map of documents indexed by key and a map of sizes indexed by\n * key (zero if the document does not exist).\n */\n getSizedEntries(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise<DocumentSizeEntries> {\n let results = mutableDocumentMap();\n let sizeMap = new SortedMap<DocumentKey, number>(DocumentKey.comparator);\n return this.forEachDbEntry(\n transaction,\n documentKeys,\n (key, dbRemoteDoc) => {\n const doc = this.maybeDecodeDocument(key, dbRemoteDoc);\n results = results.insert(key, doc);\n sizeMap = sizeMap.insert(key, dbDocumentSize(dbRemoteDoc));\n }\n ).next(() => {\n return { documents: results, sizeMap };\n });\n }\n\n private forEachDbEntry(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet,\n callback: (key: DocumentKey, doc: DbRemoteDocument | null) => void\n ): PersistencePromise<void> {\n if (documentKeys.isEmpty()) {\n return PersistencePromise.resolve();\n }\n\n const range = IDBKeyRange.bound(\n documentKeys.first()!.path.toArray(),\n documentKeys.last()!.path.toArray()\n );\n const keyIter = documentKeys.getIterator();\n let nextKey: DocumentKey | null = keyIter.getNext();\n\n return remoteDocumentsStore(transaction)\n .iterate({ range }, (potentialKeyRaw, dbRemoteDoc, control) => {\n const potentialKey = DocumentKey.fromSegments(potentialKeyRaw);\n\n // Go through keys not found in cache.\n while (nextKey && DocumentKey.comparator(nextKey!, potentialKey) < 0) {\n callback(nextKey!, null);\n nextKey = keyIter.getNext();\n }\n\n if (nextKey && nextKey!.isEqual(potentialKey)) {\n // Key found in cache.\n callback(nextKey!, dbRemoteDoc);\n nextKey = keyIter.hasNext() ? keyIter.getNext() : null;\n }\n\n // Skip to the next key (if there is one).\n if (nextKey) {\n control.skip(nextKey!.path.toArray());\n } else {\n control.done();\n }\n })\n .next(() => {\n // The rest of the keys are not in the cache. One case where `iterate`\n // above won't go through them is when the cache is empty.\n while (nextKey) {\n callback(nextKey!, null);\n nextKey = keyIter.hasNext() ? keyIter.getNext() : null;\n }\n });\n }\n\n getDocumentsMatchingQuery(\n transaction: PersistenceTransaction,\n query: Query,\n sinceReadTime: SnapshotVersion\n ): PersistencePromise<MutableDocumentMap> {\n debugAssert(\n !isCollectionGroupQuery(query),\n 'CollectionGroup queries should be handled in LocalDocumentsView'\n );\n let results = mutableDocumentMap();\n\n const immediateChildrenPathLength = query.path.length + 1;\n\n const iterationOptions: IterateOptions = {};\n if (sinceReadTime.isEqual(SnapshotVersion.min())) {\n // Documents are ordered by key, so we can use a prefix scan to narrow\n // down the documents we need to match the query against.\n const startKey = query.path.toArray();\n iterationOptions.range = IDBKeyRange.lowerBound(startKey);\n } else {\n // Execute an index-free query and filter by read time. This is safe\n // since all document changes to queries that have a\n // lastLimboFreeSnapshotVersion (`sinceReadTime`) have a read time set.\n const collectionKey = query.path.toArray();\n const readTimeKey = toDbTimestampKey(sinceReadTime);\n iterationOptions.range = IDBKeyRange.lowerBound(\n [collectionKey, readTimeKey],\n /* open= */ true\n );\n iterationOptions.index = DbRemoteDocument.collectionReadTimeIndex;\n }\n\n return remoteDocumentsStore(transaction)\n .iterate(iterationOptions, (key, dbRemoteDoc, control) => {\n // The query is actually returning any path that starts with the query\n // path prefix which may include documents in subcollections. For\n // example, a query on 'rooms' will return rooms/abc/messages/xyx but we\n // shouldn't match it. Fix this by discarding rows with document keys\n // more than one segment longer than the query path.\n if (key.length !== immediateChildrenPathLength) {\n return;\n }\n\n const document = fromDbRemoteDocument(this.serializer, dbRemoteDoc);\n if (!query.path.isPrefixOf(document.key.path)) {\n control.done();\n } else if (queryMatches(query, document)) {\n results = results.insert(document.key, document);\n }\n })\n .next(() => results);\n }\n\n newChangeBuffer(options?: {\n trackRemovals: boolean;\n }): RemoteDocumentChangeBuffer {\n return new IndexedDbRemoteDocumentChangeBuffer(\n this,\n !!options && options.trackRemovals\n );\n }\n\n getSize(txn: PersistenceTransaction): PersistencePromise<number> {\n return this.getMetadata(txn).next(metadata => metadata.byteSize);\n }\n\n private getMetadata(\n txn: PersistenceTransaction\n ): PersistencePromise<DbRemoteDocumentGlobal> {\n return documentGlobalStore(txn)\n .get(DbRemoteDocumentGlobal.key)\n .next(metadata => {\n hardAssert(!!metadata, 'Missing document cache metadata');\n return metadata!;\n });\n }\n\n private setMetadata(\n txn: PersistenceTransaction,\n metadata: DbRemoteDocumentGlobal\n ): PersistencePromise<void> {\n return documentGlobalStore(txn).put(DbRemoteDocumentGlobal.key, metadata);\n }\n\n /**\n * Decodes `remoteDoc` and returns the document (or null, if the document\n * corresponds to the format used for sentinel deletes).\n */\n private maybeDecodeDocument(\n documentKey: DocumentKey,\n dbRemoteDoc: DbRemoteDocument | null\n ): MutableDocument {\n if (dbRemoteDoc) {\n const doc = fromDbRemoteDocument(this.serializer, dbRemoteDoc);\n\n // Whether the document is a sentinel removal and should only be used in the\n // `getNewDocumentChanges()`\n const isSentinelRemoval =\n doc.isNoDocument() && doc.version.isEqual(SnapshotVersion.min());\n if (!isSentinelRemoval) {\n return doc;\n }\n }\n return MutableDocument.newInvalidDocument(documentKey);\n }\n}\n\n/**\n * Creates a new IndexedDbRemoteDocumentCache.\n *\n * @param serializer - The document serializer.\n * @param indexManager - The query indexes that need to be maintained.\n */\nexport function newIndexedDbRemoteDocumentCache(\n serializer: LocalSerializer,\n indexManager: IndexManager\n): IndexedDbRemoteDocumentCache {\n return new IndexedDbRemoteDocumentCacheImpl(serializer, indexManager);\n}\n\n/**\n * Returns the set of documents that have changed since the specified read\n * time.\n */\n// PORTING NOTE: This is only used for multi-tab synchronization.\nexport function remoteDocumentCacheGetNewDocumentChanges(\n remoteDocumentCache: IndexedDbRemoteDocumentCache,\n transaction: PersistenceTransaction,\n sinceReadTime: SnapshotVersion\n): PersistencePromise<{\n changedDocs: MutableDocumentMap;\n readTime: SnapshotVersion;\n}> {\n const remoteDocumentCacheImpl = debugCast(\n remoteDocumentCache,\n IndexedDbRemoteDocumentCacheImpl // We only support IndexedDb in multi-tab mode.\n );\n let changedDocs = mutableDocumentMap();\n\n let lastReadTime = toDbTimestampKey(sinceReadTime);\n\n const documentsStore = remoteDocumentsStore(transaction);\n const range = IDBKeyRange.lowerBound(lastReadTime, true);\n return documentsStore\n .iterate(\n { index: DbRemoteDocument.readTimeIndex, range },\n (_, dbRemoteDoc) => {\n // Unlike `getEntry()` and others, `getNewDocumentChanges()` parses\n // the documents directly since we want to keep sentinel deletes.\n const doc = fromDbRemoteDocument(\n remoteDocumentCacheImpl.serializer,\n dbRemoteDoc\n );\n changedDocs = changedDocs.insert(doc.key, doc);\n lastReadTime = dbRemoteDoc.readTime!;\n }\n )\n .next(() => {\n return {\n changedDocs,\n readTime: fromDbTimestampKey(lastReadTime)\n };\n });\n}\n\n/**\n * Returns the read time of the most recently read document in the cache, or\n * SnapshotVersion.min() if not available.\n */\n// PORTING NOTE: This is only used for multi-tab synchronization.\nexport function remoteDocumentCacheGetLastReadTime(\n transaction: PersistenceTransaction\n): PersistencePromise<SnapshotVersion> {\n const documentsStore = remoteDocumentsStore(transaction);\n\n // If there are no existing entries, we return SnapshotVersion.min().\n let readTime = SnapshotVersion.min();\n\n return documentsStore\n .iterate(\n { index: DbRemoteDocument.readTimeIndex, reverse: true },\n (key, dbRemoteDoc, control) => {\n if (dbRemoteDoc.readTime) {\n readTime = fromDbTimestampKey(dbRemoteDoc.readTime);\n }\n control.done();\n }\n )\n .next(() => readTime);\n}\n\n/**\n * Handles the details of adding and updating documents in the IndexedDbRemoteDocumentCache.\n *\n * Unlike the MemoryRemoteDocumentChangeBuffer, the IndexedDb implementation computes the size\n * delta for all submitted changes. This avoids having to re-read all documents from IndexedDb\n * when we apply the changes.\n */\nclass IndexedDbRemoteDocumentChangeBuffer extends RemoteDocumentChangeBuffer {\n // A map of document sizes prior to applying the changes in this buffer.\n protected documentSizes: ObjectMap<DocumentKey, number> = new ObjectMap(\n key => key.toString(),\n (l, r) => l.isEqual(r)\n );\n\n /**\n * @param documentCache - The IndexedDbRemoteDocumentCache to apply the changes to.\n * @param trackRemovals - Whether to create sentinel deletes that can be tracked by\n * `getNewDocumentChanges()`.\n */\n constructor(\n private readonly documentCache: IndexedDbRemoteDocumentCacheImpl,\n private readonly trackRemovals: boolean\n ) {\n super();\n }\n\n protected applyChanges(\n transaction: PersistenceTransaction\n ): PersistencePromise<void> {\n const promises: Array<PersistencePromise<void>> = [];\n\n let sizeDelta = 0;\n\n let collectionParents = new SortedSet<ResourcePath>((l, r) =>\n primitiveComparator(l.canonicalString(), r.canonicalString())\n );\n\n this.changes.forEach((key, documentChange) => {\n const previousSize = this.documentSizes.get(key);\n debugAssert(\n previousSize !== undefined,\n `Cannot modify a document that wasn't read (for ${key})`\n );\n if (documentChange.document.isValidDocument()) {\n debugAssert(\n !this.getReadTime(key).isEqual(SnapshotVersion.min()),\n 'Cannot add a document with a read time of zero'\n );\n const doc = toDbRemoteDocument(\n this.documentCache.serializer,\n documentChange.document,\n this.getReadTime(key)\n );\n collectionParents = collectionParents.add(key.path.popLast());\n\n const size = dbDocumentSize(doc);\n sizeDelta += size - previousSize!;\n promises.push(this.documentCache.addEntry(transaction, key, doc));\n } else {\n sizeDelta -= previousSize!;\n if (this.trackRemovals) {\n // In order to track removals, we store a \"sentinel delete\" in the\n // RemoteDocumentCache. This entry is represented by a NoDocument\n // with a version of 0 and ignored by `maybeDecodeDocument()` but\n // preserved in `getNewDocumentChanges()`.\n const deletedDoc = toDbRemoteDocument(\n this.documentCache.serializer,\n MutableDocument.newNoDocument(key, SnapshotVersion.min()),\n this.getReadTime(key)\n );\n promises.push(\n this.documentCache.addEntry(transaction, key, deletedDoc)\n );\n } else {\n promises.push(this.documentCache.removeEntry(transaction, key));\n }\n }\n });\n\n collectionParents.forEach(parent => {\n promises.push(\n this.documentCache.indexManager.addToCollectionParentIndex(\n transaction,\n parent\n )\n );\n });\n\n promises.push(this.documentCache.updateMetadata(transaction, sizeDelta));\n\n return PersistencePromise.waitFor(promises);\n }\n\n protected getFromCache(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise<MutableDocument> {\n // Record the size of everything we load from the cache so we can compute a delta later.\n return this.documentCache\n .getSizedEntry(transaction, documentKey)\n .next(getResult => {\n this.documentSizes.set(documentKey, getResult.size);\n return getResult.document;\n });\n }\n\n protected getAllFromCache(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise<MutableDocumentMap> {\n // Record the size of everything we load from the cache so we can compute\n // a delta later.\n return this.documentCache\n .getSizedEntries(transaction, documentKeys)\n .next(({ documents, sizeMap }) => {\n // Note: `getAllFromCache` returns two maps instead of a single map from\n // keys to `DocumentSizeEntry`s. This is to allow returning the\n // `MutableDocumentMap` directly, without a conversion.\n sizeMap.forEach((documentKey, size) => {\n this.documentSizes.set(documentKey, size);\n });\n return documents;\n });\n }\n}\n\nfunction documentGlobalStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbRemoteDocumentGlobalKey, DbRemoteDocumentGlobal> {\n return getStore<DbRemoteDocumentGlobalKey, DbRemoteDocumentGlobal>(\n txn,\n DbRemoteDocumentGlobal.store\n );\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the remoteDocuments object store.\n */\nfunction remoteDocumentsStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbRemoteDocumentKey, DbRemoteDocument> {\n return getStore<DbRemoteDocumentKey, DbRemoteDocument>(\n txn,\n DbRemoteDocument.store\n );\n}\n\nfunction dbKey(docKey: DocumentKey): DbRemoteDocumentKey {\n return docKey.path.toArray();\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { ResourcePath } from '../model/path';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { BATCHID_UNKNOWN } from '../util/types';\n\nimport {\n decodeResourcePath,\n encodeResourcePath\n} from './encoded_resource_path';\nimport {\n dbDocumentSize,\n removeMutationBatch\n} from './indexeddb_mutation_batch_impl';\nimport {\n DbBundle,\n DbClientMetadata,\n DbCollectionParent,\n DbCollectionParentKey,\n DbDocumentMutation,\n DbDocumentMutationKey,\n DbMutationBatch,\n DbMutationBatchKey,\n DbMutationQueue,\n DbMutationQueueKey,\n DbNamedQuery,\n DbPrimaryClient,\n DbRemoteDocument,\n DbRemoteDocumentGlobal,\n DbRemoteDocumentGlobalKey,\n DbRemoteDocumentKey,\n DbTarget,\n DbTargetDocument,\n DbTargetDocumentKey,\n DbTargetGlobal,\n DbTargetGlobalKey,\n DbTargetKey,\n SCHEMA_VERSION\n} from './indexeddb_schema';\nimport {\n fromDbMutationBatch,\n fromDbTarget,\n LocalSerializer,\n toDbTarget\n} from './local_serializer';\nimport { MemoryCollectionParentIndex } from './memory_index_manager';\nimport { PersistencePromise } from './persistence_promise';\nimport { SimpleDbSchemaConverter, SimpleDbTransaction } from './simple_db';\n\n/** Performs database creation and schema upgrades. */\nexport class SchemaConverter implements SimpleDbSchemaConverter {\n constructor(private readonly serializer: LocalSerializer) {}\n\n /**\n * Performs database creation and schema upgrades.\n *\n * Note that in production, this method is only ever used to upgrade the schema\n * to SCHEMA_VERSION. Different values of toVersion are only used for testing\n * and local feature development.\n */\n createOrUpgrade(\n db: IDBDatabase,\n txn: IDBTransaction,\n fromVersion: number,\n toVersion: number\n ): PersistencePromise<void> {\n hardAssert(\n fromVersion < toVersion &&\n fromVersion >= 0 &&\n toVersion <= SCHEMA_VERSION,\n `Unexpected schema upgrade from v${fromVersion} to v${toVersion}.`\n );\n\n const simpleDbTransaction = new SimpleDbTransaction('createOrUpgrade', txn);\n\n if (fromVersion < 1 && toVersion >= 1) {\n createPrimaryClientStore(db);\n createMutationQueue(db);\n createQueryCache(db);\n createRemoteDocumentCache(db);\n }\n\n // Migration 2 to populate the targetGlobal object no longer needed since\n // migration 3 unconditionally clears it.\n\n let p = PersistencePromise.resolve();\n if (fromVersion < 3 && toVersion >= 3) {\n // Brand new clients don't need to drop and recreate--only clients that\n // potentially have corrupt data.\n if (fromVersion !== 0) {\n dropQueryCache(db);\n createQueryCache(db);\n }\n p = p.next(() => writeEmptyTargetGlobalEntry(simpleDbTransaction));\n }\n\n if (fromVersion < 4 && toVersion >= 4) {\n if (fromVersion !== 0) {\n // Schema version 3 uses auto-generated keys to generate globally unique\n // mutation batch IDs (this was previously ensured internally by the\n // client). To migrate to the new schema, we have to read all mutations\n // and write them back out. We preserve the existing batch IDs to guarantee\n // consistency with other object stores. Any further mutation batch IDs will\n // be auto-generated.\n p = p.next(() =>\n upgradeMutationBatchSchemaAndMigrateData(db, simpleDbTransaction)\n );\n }\n\n p = p.next(() => {\n createClientMetadataStore(db);\n });\n }\n\n if (fromVersion < 5 && toVersion >= 5) {\n p = p.next(() => this.removeAcknowledgedMutations(simpleDbTransaction));\n }\n\n if (fromVersion < 6 && toVersion >= 6) {\n p = p.next(() => {\n createDocumentGlobalStore(db);\n return this.addDocumentGlobal(simpleDbTransaction);\n });\n }\n\n if (fromVersion < 7 && toVersion >= 7) {\n p = p.next(() => this.ensureSequenceNumbers(simpleDbTransaction));\n }\n\n if (fromVersion < 8 && toVersion >= 8) {\n p = p.next(() =>\n this.createCollectionParentIndex(db, simpleDbTransaction)\n );\n }\n\n if (fromVersion < 9 && toVersion >= 9) {\n p = p.next(() => {\n // Multi-Tab used to manage its own changelog, but this has been moved\n // to the DbRemoteDocument object store itself. Since the previous change\n // log only contained transient data, we can drop its object store.\n dropRemoteDocumentChangesStore(db);\n createRemoteDocumentReadTimeIndex(txn);\n });\n }\n\n if (fromVersion < 10 && toVersion >= 10) {\n p = p.next(() => this.rewriteCanonicalIds(simpleDbTransaction));\n }\n\n if (fromVersion < 11 && toVersion >= 11) {\n p = p.next(() => {\n createBundlesStore(db);\n createNamedQueriesStore(db);\n });\n }\n return p;\n }\n\n private addDocumentGlobal(\n txn: SimpleDbTransaction\n ): PersistencePromise<void> {\n let byteCount = 0;\n return txn\n .store<DbRemoteDocumentKey, DbRemoteDocument>(DbRemoteDocument.store)\n .iterate((_, doc) => {\n byteCount += dbDocumentSize(doc);\n })\n .next(() => {\n const metadata = new DbRemoteDocumentGlobal(byteCount);\n return txn\n .store<DbRemoteDocumentGlobalKey, DbRemoteDocumentGlobal>(\n DbRemoteDocumentGlobal.store\n )\n .put(DbRemoteDocumentGlobal.key, metadata);\n });\n }\n\n private removeAcknowledgedMutations(\n txn: SimpleDbTransaction\n ): PersistencePromise<void> {\n const queuesStore = txn.store<DbMutationQueueKey, DbMutationQueue>(\n DbMutationQueue.store\n );\n const mutationsStore = txn.store<DbMutationBatchKey, DbMutationBatch>(\n DbMutationBatch.store\n );\n\n return queuesStore.loadAll().next(queues => {\n return PersistencePromise.forEach(queues, (queue: DbMutationQueue) => {\n const range = IDBKeyRange.bound(\n [queue.userId, BATCHID_UNKNOWN],\n [queue.userId, queue.lastAcknowledgedBatchId]\n );\n\n return mutationsStore\n .loadAll(DbMutationBatch.userMutationsIndex, range)\n .next(dbBatches => {\n return PersistencePromise.forEach(\n dbBatches,\n (dbBatch: DbMutationBatch) => {\n hardAssert(\n dbBatch.userId === queue.userId,\n `Cannot process batch ${dbBatch.batchId} from unexpected user`\n );\n const batch = fromDbMutationBatch(this.serializer, dbBatch);\n\n return removeMutationBatch(\n txn,\n queue.userId,\n batch\n ).next(() => {});\n }\n );\n });\n });\n });\n }\n\n /**\n * Ensures that every document in the remote document cache has a corresponding sentinel row\n * with a sequence number. Missing rows are given the most recently used sequence number.\n */\n private ensureSequenceNumbers(\n txn: SimpleDbTransaction\n ): PersistencePromise<void> {\n const documentTargetStore = txn.store<\n DbTargetDocumentKey,\n DbTargetDocument\n >(DbTargetDocument.store);\n const documentsStore = txn.store<DbRemoteDocumentKey, DbRemoteDocument>(\n DbRemoteDocument.store\n );\n const globalTargetStore = txn.store<DbTargetGlobalKey, DbTargetGlobal>(\n DbTargetGlobal.store\n );\n\n return globalTargetStore.get(DbTargetGlobal.key).next(metadata => {\n debugAssert(\n !!metadata,\n 'Metadata should have been written during the version 3 migration'\n );\n const writeSentinelKey = (\n path: ResourcePath\n ): PersistencePromise<void> => {\n return documentTargetStore.put(\n new DbTargetDocument(\n 0,\n encodeResourcePath(path),\n metadata!.highestListenSequenceNumber!\n )\n );\n };\n\n const promises: Array<PersistencePromise<void>> = [];\n return documentsStore\n .iterate((key, doc) => {\n const path = new ResourcePath(key);\n const docSentinelKey = sentinelKey(path);\n promises.push(\n documentTargetStore.get(docSentinelKey).next(maybeSentinel => {\n if (!maybeSentinel) {\n return writeSentinelKey(path);\n } else {\n return PersistencePromise.resolve();\n }\n })\n );\n })\n .next(() => PersistencePromise.waitFor(promises));\n });\n }\n\n private createCollectionParentIndex(\n db: IDBDatabase,\n txn: SimpleDbTransaction\n ): PersistencePromise<void> {\n // Create the index.\n db.createObjectStore(DbCollectionParent.store, {\n keyPath: DbCollectionParent.keyPath\n });\n\n const collectionParentsStore = txn.store<\n DbCollectionParentKey,\n DbCollectionParent\n >(DbCollectionParent.store);\n\n // Helper to add an index entry iff we haven't already written it.\n const cache = new MemoryCollectionParentIndex();\n const addEntry = (\n collectionPath: ResourcePath\n ): PersistencePromise<void> | undefined => {\n if (cache.add(collectionPath)) {\n const collectionId = collectionPath.lastSegment();\n const parentPath = collectionPath.popLast();\n return collectionParentsStore.put({\n collectionId,\n parent: encodeResourcePath(parentPath)\n });\n }\n };\n\n // Index existing remote documents.\n return txn\n .store<DbRemoteDocumentKey, DbRemoteDocument>(DbRemoteDocument.store)\n .iterate({ keysOnly: true }, (pathSegments, _) => {\n const path = new ResourcePath(pathSegments);\n return addEntry(path.popLast());\n })\n .next(() => {\n // Index existing mutations.\n return txn\n .store<DbDocumentMutationKey, DbDocumentMutation>(\n DbDocumentMutation.store\n )\n .iterate({ keysOnly: true }, ([userID, encodedPath, batchId], _) => {\n const path = decodeResourcePath(encodedPath);\n return addEntry(path.popLast());\n });\n });\n }\n\n private rewriteCanonicalIds(\n txn: SimpleDbTransaction\n ): PersistencePromise<void> {\n const targetStore = txn.store<DbTargetKey, DbTarget>(DbTarget.store);\n return targetStore.iterate((key, originalDbTarget) => {\n const originalTargetData = fromDbTarget(originalDbTarget);\n const updatedDbTarget = toDbTarget(this.serializer, originalTargetData);\n return targetStore.put(updatedDbTarget);\n });\n }\n}\n\nfunction sentinelKey(path: ResourcePath): DbTargetDocumentKey {\n return [0, encodeResourcePath(path)];\n}\n\nfunction createPrimaryClientStore(db: IDBDatabase): void {\n db.createObjectStore(DbPrimaryClient.store);\n}\n\nfunction createMutationQueue(db: IDBDatabase): void {\n db.createObjectStore(DbMutationQueue.store, {\n keyPath: DbMutationQueue.keyPath\n });\n\n const mutationBatchesStore = db.createObjectStore(DbMutationBatch.store, {\n keyPath: DbMutationBatch.keyPath,\n autoIncrement: true\n });\n mutationBatchesStore.createIndex(\n DbMutationBatch.userMutationsIndex,\n DbMutationBatch.userMutationsKeyPath,\n { unique: true }\n );\n\n db.createObjectStore(DbDocumentMutation.store);\n}\n\n/**\n * Upgrade function to migrate the 'mutations' store from V1 to V3. Loads\n * and rewrites all data.\n */\nfunction upgradeMutationBatchSchemaAndMigrateData(\n db: IDBDatabase,\n txn: SimpleDbTransaction\n): PersistencePromise<void> {\n const v1MutationsStore = txn.store<[string, number], DbMutationBatch>(\n DbMutationBatch.store\n );\n return v1MutationsStore.loadAll().next(existingMutations => {\n db.deleteObjectStore(DbMutationBatch.store);\n\n const mutationsStore = db.createObjectStore(DbMutationBatch.store, {\n keyPath: DbMutationBatch.keyPath,\n autoIncrement: true\n });\n mutationsStore.createIndex(\n DbMutationBatch.userMutationsIndex,\n DbMutationBatch.userMutationsKeyPath,\n { unique: true }\n );\n\n const v3MutationsStore = txn.store<DbMutationBatchKey, DbMutationBatch>(\n DbMutationBatch.store\n );\n const writeAll = existingMutations.map(mutation =>\n v3MutationsStore.put(mutation)\n );\n\n return PersistencePromise.waitFor(writeAll);\n });\n}\n\nfunction createRemoteDocumentCache(db: IDBDatabase): void {\n db.createObjectStore(DbRemoteDocument.store);\n}\n\nfunction createDocumentGlobalStore(db: IDBDatabase): void {\n db.createObjectStore(DbRemoteDocumentGlobal.store);\n}\n\nfunction createQueryCache(db: IDBDatabase): void {\n const targetDocumentsStore = db.createObjectStore(DbTargetDocument.store, {\n keyPath: DbTargetDocument.keyPath\n });\n targetDocumentsStore.createIndex(\n DbTargetDocument.documentTargetsIndex,\n DbTargetDocument.documentTargetsKeyPath,\n { unique: true }\n );\n\n const targetStore = db.createObjectStore(DbTarget.store, {\n keyPath: DbTarget.keyPath\n });\n\n // NOTE: This is unique only because the TargetId is the suffix.\n targetStore.createIndex(\n DbTarget.queryTargetsIndexName,\n DbTarget.queryTargetsKeyPath,\n { unique: true }\n );\n db.createObjectStore(DbTargetGlobal.store);\n}\n\nfunction dropQueryCache(db: IDBDatabase): void {\n db.deleteObjectStore(DbTargetDocument.store);\n db.deleteObjectStore(DbTarget.store);\n db.deleteObjectStore(DbTargetGlobal.store);\n}\n\nfunction dropRemoteDocumentChangesStore(db: IDBDatabase): void {\n if (db.objectStoreNames.contains('remoteDocumentChanges')) {\n db.deleteObjectStore('remoteDocumentChanges');\n }\n}\n\n/**\n * Creates the target global singleton row.\n *\n * @param txn - The version upgrade transaction for indexeddb\n */\nfunction writeEmptyTargetGlobalEntry(\n txn: SimpleDbTransaction\n): PersistencePromise<void> {\n const globalStore = txn.store<DbTargetGlobalKey, DbTargetGlobal>(\n DbTargetGlobal.store\n );\n const metadata = new DbTargetGlobal(\n /*highestTargetId=*/ 0,\n /*lastListenSequenceNumber=*/ 0,\n SnapshotVersion.min().toTimestamp(),\n /*targetCount=*/ 0\n );\n return globalStore.put(DbTargetGlobal.key, metadata);\n}\n\n/**\n * Creates indices on the RemoteDocuments store used for both multi-tab\n * and Index-Free queries.\n */\nfunction createRemoteDocumentReadTimeIndex(txn: IDBTransaction): void {\n const remoteDocumentStore = txn.objectStore(DbRemoteDocument.store);\n remoteDocumentStore.createIndex(\n DbRemoteDocument.readTimeIndex,\n DbRemoteDocument.readTimeIndexPath,\n { unique: false }\n );\n remoteDocumentStore.createIndex(\n DbRemoteDocument.collectionReadTimeIndex,\n DbRemoteDocument.collectionReadTimeIndexPath,\n { unique: false }\n );\n}\n\nfunction createClientMetadataStore(db: IDBDatabase): void {\n db.createObjectStore(DbClientMetadata.store, {\n keyPath: DbClientMetadata.keyPath\n });\n}\n\nfunction createBundlesStore(db: IDBDatabase): void {\n db.createObjectStore(DbBundle.store, {\n keyPath: DbBundle.keyPath\n });\n}\n\nfunction createNamedQueriesStore(db: IDBDatabase): void {\n db.createObjectStore(DbNamedQuery.store, {\n keyPath: DbNamedQuery.keyPath\n });\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isSafari } from '@firebase/util';\n\nimport { User } from '../auth/user';\nimport { DatabaseId } from '../core/database_info';\nimport { ListenSequence, SequenceNumberSyncer } from '../core/listen_sequence';\nimport { JsonProtoSerializer } from '../remote/serializer';\nimport { debugAssert } from '../util/assert';\nimport { AsyncQueue, DelayedOperation, TimerId } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug, logError } from '../util/log';\nimport { DocumentLike, WindowLike } from '../util/types';\n\nimport { BundleCache } from './bundle_cache';\nimport { IndexManager } from './index_manager';\nimport { IndexedDbBundleCache } from './indexeddb_bundle_cache';\nimport { IndexedDbIndexManager } from './indexeddb_index_manager';\nimport { IndexedDbLruDelegateImpl } from './indexeddb_lru_delegate_impl';\nimport { IndexedDbMutationQueue } from './indexeddb_mutation_queue';\nimport {\n IndexedDbRemoteDocumentCache,\n newIndexedDbRemoteDocumentCache\n} from './indexeddb_remote_document_cache';\nimport {\n ALL_STORES,\n DbClientMetadata,\n DbClientMetadataKey,\n DbPrimaryClient,\n DbPrimaryClientKey,\n SCHEMA_VERSION\n} from './indexeddb_schema';\nimport { SchemaConverter } from './indexeddb_schema_converter';\nimport { IndexedDbTargetCache } from './indexeddb_target_cache';\nimport { getStore, IndexedDbTransaction } from './indexeddb_transaction';\nimport { LocalSerializer } from './local_serializer';\nimport { LruParams } from './lru_garbage_collector';\nimport { Persistence, PrimaryStateListener } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport {\n PersistenceTransaction,\n PersistenceTransactionMode,\n PRIMARY_LEASE_LOST_ERROR_MSG\n} from './persistence_transaction';\nimport { ClientId } from './shared_client_state';\nimport {\n isIndexedDbTransactionError,\n SimpleDb,\n SimpleDbStore\n} from './simple_db';\n\nconst LOG_TAG = 'IndexedDbPersistence';\n\n/**\n * Oldest acceptable age in milliseconds for client metadata before the client\n * is considered inactive and its associated data is garbage collected.\n */\nconst MAX_CLIENT_AGE_MS = 30 * 60 * 1000; // 30 minutes\n\n/**\n * Oldest acceptable metadata age for clients that may participate in the\n * primary lease election. Clients that have not updated their client metadata\n * within 5 seconds are not eligible to receive a primary lease.\n */\nconst MAX_PRIMARY_ELIGIBLE_AGE_MS = 5000;\n\n/**\n * The interval at which clients will update their metadata, including\n * refreshing their primary lease if held or potentially trying to acquire it if\n * not held.\n *\n * Primary clients may opportunistically refresh their metadata earlier\n * if they're already performing an IndexedDB operation.\n */\nconst CLIENT_METADATA_REFRESH_INTERVAL_MS = 4000;\n/** User-facing error when the primary lease is required but not available. */\nconst PRIMARY_LEASE_EXCLUSIVE_ERROR_MSG =\n 'Failed to obtain exclusive access to the persistence layer. To allow ' +\n 'shared access, multi-tab synchronization has to be enabled in all tabs. ' +\n 'If you are using `experimentalForceOwningTab:true`, make sure that only ' +\n 'one tab has persistence enabled at any given time.';\nconst UNSUPPORTED_PLATFORM_ERROR_MSG =\n 'This platform is either missing IndexedDB or is known to have ' +\n 'an incomplete implementation. Offline persistence has been disabled.';\n\n// The format of the LocalStorage key that stores zombied client is:\n// firestore_zombie_<persistence_prefix>_<instance_key>\nconst ZOMBIED_CLIENTS_KEY_PREFIX = 'firestore_zombie';\n\n/**\n * The name of the main (and currently only) IndexedDB database. This name is\n * appended to the prefix provided to the IndexedDbPersistence constructor.\n */\nexport const MAIN_DATABASE = 'main';\n\n/**\n * An IndexedDB-backed instance of Persistence. Data is stored persistently\n * across sessions.\n *\n * On Web only, the Firestore SDKs support shared access to its persistence\n * layer. This allows multiple browser tabs to read and write to IndexedDb and\n * to synchronize state even without network connectivity. Shared access is\n * currently optional and not enabled unless all clients invoke\n * `enablePersistence()` with `{synchronizeTabs:true}`.\n *\n * In multi-tab mode, if multiple clients are active at the same time, the SDK\n * will designate one client as the \u201Cprimary client\u201D. An effort is made to pick\n * a visible, network-connected and active client, and this client is\n * responsible for letting other clients know about its presence. The primary\n * client writes a unique client-generated identifier (the client ID) to\n * IndexedDb\u2019s \u201Cowner\u201D store every 4 seconds. If the primary client fails to\n * update this entry, another client can acquire the lease and take over as\n * primary.\n *\n * Some persistence operations in the SDK are designated as primary-client only\n * operations. This includes the acknowledgment of mutations and all updates of\n * remote documents. The effects of these operations are written to persistence\n * and then broadcast to other tabs via LocalStorage (see\n * `WebStorageSharedClientState`), which then refresh their state from\n * persistence.\n *\n * Similarly, the primary client listens to notifications sent by secondary\n * clients to discover persistence changes written by secondary clients, such as\n * the addition of new mutations and query targets.\n *\n * If multi-tab is not enabled and another tab already obtained the primary\n * lease, IndexedDbPersistence enters a failed state and all subsequent\n * operations will automatically fail.\n *\n * Additionally, there is an optimization so that when a tab is closed, the\n * primary lease is released immediately (this is especially important to make\n * sure that a refreshed tab is able to immediately re-acquire the primary\n * lease). Unfortunately, IndexedDB cannot be reliably used in window.unload\n * since it is an asynchronous API. So in addition to attempting to give up the\n * lease, the leaseholder writes its client ID to a \"zombiedClient\" entry in\n * LocalStorage which acts as an indicator that another tab should go ahead and\n * take the primary lease immediately regardless of the current lease timestamp.\n *\n * TODO(b/114226234): Remove `synchronizeTabs` section when multi-tab is no\n * longer optional.\n */\nexport class IndexedDbPersistence implements Persistence {\n private simpleDb: SimpleDb;\n\n private listenSequence: ListenSequence | null = null;\n\n private _started = false;\n private isPrimary = false;\n private networkEnabled = true;\n private dbName: string;\n\n /** Our window.unload handler, if registered. */\n private windowUnloadHandler: (() => void) | null = null;\n private inForeground = false;\n\n private serializer: LocalSerializer;\n\n /** Our 'visibilitychange' listener if registered. */\n private documentVisibilityHandler: ((e?: Event) => void) | null = null;\n\n /** The client metadata refresh task. */\n private clientMetadataRefresher: DelayedOperation<void> | null = null;\n\n /** The last time we garbage collected the client metadata object store. */\n private lastGarbageCollectionTime = Number.NEGATIVE_INFINITY;\n\n /** A listener to notify on primary state changes. */\n private primaryStateListener: PrimaryStateListener = _ => Promise.resolve();\n\n private readonly targetCache: IndexedDbTargetCache;\n private readonly indexManager: IndexedDbIndexManager;\n private readonly remoteDocumentCache: IndexedDbRemoteDocumentCache;\n private readonly bundleCache: IndexedDbBundleCache;\n private readonly webStorage: Storage | null;\n readonly referenceDelegate: IndexedDbLruDelegateImpl;\n\n constructor(\n /**\n * Whether to synchronize the in-memory state of multiple tabs and share\n * access to local persistence.\n */\n private readonly allowTabSynchronization: boolean,\n\n private readonly persistenceKey: string,\n private readonly clientId: ClientId,\n lruParams: LruParams,\n private readonly queue: AsyncQueue,\n private readonly window: WindowLike | null,\n private readonly document: DocumentLike | null,\n serializer: JsonProtoSerializer,\n private readonly sequenceNumberSyncer: SequenceNumberSyncer,\n\n /**\n * If set to true, forcefully obtains database access. Existing tabs will\n * no longer be able to access IndexedDB.\n */\n private readonly forceOwningTab: boolean\n ) {\n if (!IndexedDbPersistence.isAvailable()) {\n throw new FirestoreError(\n Code.UNIMPLEMENTED,\n UNSUPPORTED_PLATFORM_ERROR_MSG\n );\n }\n\n this.referenceDelegate = new IndexedDbLruDelegateImpl(this, lruParams);\n this.dbName = persistenceKey + MAIN_DATABASE;\n this.serializer = new LocalSerializer(serializer);\n this.simpleDb = new SimpleDb(\n this.dbName,\n SCHEMA_VERSION,\n new SchemaConverter(this.serializer)\n );\n this.targetCache = new IndexedDbTargetCache(\n this.referenceDelegate,\n this.serializer\n );\n this.indexManager = new IndexedDbIndexManager();\n this.remoteDocumentCache = newIndexedDbRemoteDocumentCache(\n this.serializer,\n this.indexManager\n );\n this.bundleCache = new IndexedDbBundleCache();\n if (this.window && this.window.localStorage) {\n this.webStorage = this.window.localStorage;\n } else {\n this.webStorage = null;\n if (forceOwningTab === false) {\n logError(\n LOG_TAG,\n 'LocalStorage is unavailable. As a result, persistence may not work ' +\n 'reliably. In particular enablePersistence() could fail immediately ' +\n 'after refreshing the page.'\n );\n }\n }\n }\n\n /**\n * Attempt to start IndexedDb persistence.\n *\n * @returns Whether persistence was enabled.\n */\n start(): Promise<void> {\n debugAssert(!this.started, 'IndexedDbPersistence double-started!');\n debugAssert(this.window !== null, \"Expected 'window' to be defined\");\n\n // NOTE: This is expected to fail sometimes (in the case of another tab\n // already having the persistence lock), so it's the first thing we should\n // do.\n return this.updateClientMetadataAndTryBecomePrimary()\n .then(() => {\n if (!this.isPrimary && !this.allowTabSynchronization) {\n // Fail `start()` if `synchronizeTabs` is disabled and we cannot\n // obtain the primary lease.\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n PRIMARY_LEASE_EXCLUSIVE_ERROR_MSG\n );\n }\n this.attachVisibilityHandler();\n this.attachWindowUnloadHook();\n\n this.scheduleClientMetadataAndPrimaryLeaseRefreshes();\n\n return this.runTransaction(\n 'getHighestListenSequenceNumber',\n 'readonly',\n txn => this.targetCache.getHighestSequenceNumber(txn)\n );\n })\n .then(highestListenSequenceNumber => {\n this.listenSequence = new ListenSequence(\n highestListenSequenceNumber,\n this.sequenceNumberSyncer\n );\n })\n .then(() => {\n this._started = true;\n })\n .catch(reason => {\n this.simpleDb && this.simpleDb.close();\n return Promise.reject(reason);\n });\n }\n\n /**\n * Registers a listener that gets called when the primary state of the\n * instance changes. Upon registering, this listener is invoked immediately\n * with the current primary state.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */\n setPrimaryStateListener(\n primaryStateListener: PrimaryStateListener\n ): Promise<void> {\n this.primaryStateListener = async primaryState => {\n if (this.started) {\n return primaryStateListener(primaryState);\n }\n };\n return primaryStateListener(this.isPrimary);\n }\n\n /**\n * Registers a listener that gets called when the database receives a\n * version change event indicating that it has deleted.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */\n setDatabaseDeletedListener(\n databaseDeletedListener: () => Promise<void>\n ): void {\n this.simpleDb.setVersionChangeListener(async event => {\n // Check if an attempt is made to delete IndexedDB.\n if (event.newVersion === null) {\n await databaseDeletedListener();\n }\n });\n }\n\n /**\n * Adjusts the current network state in the client's metadata, potentially\n * affecting the primary lease.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */\n setNetworkEnabled(networkEnabled: boolean): void {\n if (this.networkEnabled !== networkEnabled) {\n this.networkEnabled = networkEnabled;\n // Schedule a primary lease refresh for immediate execution. The eventual\n // lease update will be propagated via `primaryStateListener`.\n this.queue.enqueueAndForget(async () => {\n if (this.started) {\n await this.updateClientMetadataAndTryBecomePrimary();\n }\n });\n }\n }\n\n /**\n * Updates the client metadata in IndexedDb and attempts to either obtain or\n * extend the primary lease for the local client. Asynchronously notifies the\n * primary state listener if the client either newly obtained or released its\n * primary lease.\n */\n private updateClientMetadataAndTryBecomePrimary(): Promise<void> {\n return this.runTransaction(\n 'updateClientMetadataAndTryBecomePrimary',\n 'readwrite',\n txn => {\n const metadataStore = clientMetadataStore(txn);\n return metadataStore\n .put(\n new DbClientMetadata(\n this.clientId,\n Date.now(),\n this.networkEnabled,\n this.inForeground\n )\n )\n .next(() => {\n if (this.isPrimary) {\n return this.verifyPrimaryLease(txn).next(success => {\n if (!success) {\n this.isPrimary = false;\n this.queue.enqueueRetryable(() =>\n this.primaryStateListener(false)\n );\n }\n });\n }\n })\n .next(() => this.canActAsPrimary(txn))\n .next(canActAsPrimary => {\n if (this.isPrimary && !canActAsPrimary) {\n return this.releasePrimaryLeaseIfHeld(txn).next(() => false);\n } else if (canActAsPrimary) {\n return this.acquireOrExtendPrimaryLease(txn).next(() => true);\n } else {\n return /* canActAsPrimary= */ false;\n }\n });\n }\n )\n .catch(e => {\n if (isIndexedDbTransactionError(e)) {\n logDebug(LOG_TAG, 'Failed to extend owner lease: ', e);\n // Proceed with the existing state. Any subsequent access to\n // IndexedDB will verify the lease.\n return this.isPrimary;\n }\n\n if (!this.allowTabSynchronization) {\n throw e;\n }\n\n logDebug(\n LOG_TAG,\n 'Releasing owner lease after error during lease refresh',\n e\n );\n return /* isPrimary= */ false;\n })\n .then(isPrimary => {\n if (this.isPrimary !== isPrimary) {\n this.queue.enqueueRetryable(() =>\n this.primaryStateListener(isPrimary)\n );\n }\n this.isPrimary = isPrimary;\n });\n }\n\n private verifyPrimaryLease(\n txn: PersistenceTransaction\n ): PersistencePromise<boolean> {\n const store = primaryClientStore(txn);\n return store.get(DbPrimaryClient.key).next(primaryClient => {\n return PersistencePromise.resolve(this.isLocalClient(primaryClient));\n });\n }\n\n private removeClientMetadata(\n txn: PersistenceTransaction\n ): PersistencePromise<void> {\n const metadataStore = clientMetadataStore(txn);\n return metadataStore.delete(this.clientId);\n }\n\n /**\n * If the garbage collection threshold has passed, prunes the\n * RemoteDocumentChanges and the ClientMetadata store based on the last update\n * time of all clients.\n */\n private async maybeGarbageCollectMultiClientState(): Promise<void> {\n if (\n this.isPrimary &&\n !this.isWithinAge(this.lastGarbageCollectionTime, MAX_CLIENT_AGE_MS)\n ) {\n this.lastGarbageCollectionTime = Date.now();\n\n const inactiveClients = await this.runTransaction(\n 'maybeGarbageCollectMultiClientState',\n 'readwrite-primary',\n txn => {\n const metadataStore = getStore<DbClientMetadataKey, DbClientMetadata>(\n txn,\n DbClientMetadata.store\n );\n\n return metadataStore.loadAll().next(existingClients => {\n const active = this.filterActiveClients(\n existingClients,\n MAX_CLIENT_AGE_MS\n );\n const inactive = existingClients.filter(\n client => active.indexOf(client) === -1\n );\n\n // Delete metadata for clients that are no longer considered active.\n return PersistencePromise.forEach(\n inactive,\n (inactiveClient: DbClientMetadata) =>\n metadataStore.delete(inactiveClient.clientId)\n ).next(() => inactive);\n });\n }\n ).catch(() => {\n // Ignore primary lease violations or any other type of error. The next\n // primary will run `maybeGarbageCollectMultiClientState()` again.\n // We don't use `ignoreIfPrimaryLeaseLoss()` since we don't want to depend\n // on LocalStore.\n return [];\n });\n\n // Delete potential leftover entries that may continue to mark the\n // inactive clients as zombied in LocalStorage.\n // Ideally we'd delete the IndexedDb and LocalStorage zombie entries for\n // the client atomically, but we can't. So we opt to delete the IndexedDb\n // entries first to avoid potentially reviving a zombied client.\n if (this.webStorage) {\n for (const inactiveClient of inactiveClients) {\n this.webStorage.removeItem(\n this.zombiedClientLocalStorageKey(inactiveClient.clientId)\n );\n }\n }\n }\n }\n\n /**\n * Schedules a recurring timer to update the client metadata and to either\n * extend or acquire the primary lease if the client is eligible.\n */\n private scheduleClientMetadataAndPrimaryLeaseRefreshes(): void {\n this.clientMetadataRefresher = this.queue.enqueueAfterDelay(\n TimerId.ClientMetadataRefresh,\n CLIENT_METADATA_REFRESH_INTERVAL_MS,\n () => {\n return this.updateClientMetadataAndTryBecomePrimary()\n .then(() => this.maybeGarbageCollectMultiClientState())\n .then(() => this.scheduleClientMetadataAndPrimaryLeaseRefreshes());\n }\n );\n }\n\n /** Checks whether `client` is the local client. */\n private isLocalClient(client: DbPrimaryClient | null): boolean {\n return client ? client.ownerId === this.clientId : false;\n }\n\n /**\n * Evaluate the state of all active clients and determine whether the local\n * client is or can act as the holder of the primary lease. Returns whether\n * the client is eligible for the lease, but does not actually acquire it.\n * May return 'false' even if there is no active leaseholder and another\n * (foreground) client should become leaseholder instead.\n */\n private canActAsPrimary(\n txn: PersistenceTransaction\n ): PersistencePromise<boolean> {\n if (this.forceOwningTab) {\n return PersistencePromise.resolve<boolean>(true);\n }\n const store = primaryClientStore(txn);\n return store\n .get(DbPrimaryClient.key)\n .next(currentPrimary => {\n const currentLeaseIsValid =\n currentPrimary !== null &&\n this.isWithinAge(\n currentPrimary.leaseTimestampMs,\n MAX_PRIMARY_ELIGIBLE_AGE_MS\n ) &&\n !this.isClientZombied(currentPrimary.ownerId);\n\n // A client is eligible for the primary lease if:\n // - its network is enabled and the client's tab is in the foreground.\n // - its network is enabled and no other client's tab is in the\n // foreground.\n // - every clients network is disabled and the client's tab is in the\n // foreground.\n // - every clients network is disabled and no other client's tab is in\n // the foreground.\n // - the `forceOwningTab` setting was passed in.\n if (currentLeaseIsValid) {\n if (this.isLocalClient(currentPrimary) && this.networkEnabled) {\n return true;\n }\n\n if (!this.isLocalClient(currentPrimary)) {\n if (!currentPrimary!.allowTabSynchronization) {\n // Fail the `canActAsPrimary` check if the current leaseholder has\n // not opted into multi-tab synchronization. If this happens at\n // client startup, we reject the Promise returned by\n // `enablePersistence()` and the user can continue to use Firestore\n // with in-memory persistence.\n // If this fails during a lease refresh, we will instead block the\n // AsyncQueue from executing further operations. Note that this is\n // acceptable since mixing & matching different `synchronizeTabs`\n // settings is not supported.\n //\n // TODO(b/114226234): Remove this check when `synchronizeTabs` can\n // no longer be turned off.\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n PRIMARY_LEASE_EXCLUSIVE_ERROR_MSG\n );\n }\n\n return false;\n }\n }\n\n if (this.networkEnabled && this.inForeground) {\n return true;\n }\n\n return clientMetadataStore(txn)\n .loadAll()\n .next(existingClients => {\n // Process all existing clients and determine whether at least one of\n // them is better suited to obtain the primary lease.\n const preferredCandidate = this.filterActiveClients(\n existingClients,\n MAX_PRIMARY_ELIGIBLE_AGE_MS\n ).find(otherClient => {\n if (this.clientId !== otherClient.clientId) {\n const otherClientHasBetterNetworkState =\n !this.networkEnabled && otherClient.networkEnabled;\n const otherClientHasBetterVisibility =\n !this.inForeground && otherClient.inForeground;\n const otherClientHasSameNetworkState =\n this.networkEnabled === otherClient.networkEnabled;\n if (\n otherClientHasBetterNetworkState ||\n (otherClientHasBetterVisibility &&\n otherClientHasSameNetworkState)\n ) {\n return true;\n }\n }\n return false;\n });\n return preferredCandidate === undefined;\n });\n })\n .next(canActAsPrimary => {\n if (this.isPrimary !== canActAsPrimary) {\n logDebug(\n LOG_TAG,\n `Client ${\n canActAsPrimary ? 'is' : 'is not'\n } eligible for a primary lease.`\n );\n }\n return canActAsPrimary;\n });\n }\n\n async shutdown(): Promise<void> {\n // The shutdown() operations are idempotent and can be called even when\n // start() aborted (e.g. because it couldn't acquire the persistence lease).\n this._started = false;\n\n this.markClientZombied();\n if (this.clientMetadataRefresher) {\n this.clientMetadataRefresher.cancel();\n this.clientMetadataRefresher = null;\n }\n this.detachVisibilityHandler();\n this.detachWindowUnloadHook();\n\n // Use `SimpleDb.runTransaction` directly to avoid failing if another tab\n // has obtained the primary lease.\n await this.simpleDb.runTransaction(\n 'shutdown',\n 'readwrite',\n [DbPrimaryClient.store, DbClientMetadata.store],\n simpleDbTxn => {\n const persistenceTransaction = new IndexedDbTransaction(\n simpleDbTxn,\n ListenSequence.INVALID\n );\n return this.releasePrimaryLeaseIfHeld(persistenceTransaction).next(() =>\n this.removeClientMetadata(persistenceTransaction)\n );\n }\n );\n this.simpleDb.close();\n\n // Remove the entry marking the client as zombied from LocalStorage since\n // we successfully deleted its metadata from IndexedDb.\n this.removeClientZombiedEntry();\n }\n\n /**\n * Returns clients that are not zombied and have an updateTime within the\n * provided threshold.\n */\n private filterActiveClients(\n clients: DbClientMetadata[],\n activityThresholdMs: number\n ): DbClientMetadata[] {\n return clients.filter(\n client =>\n this.isWithinAge(client.updateTimeMs, activityThresholdMs) &&\n !this.isClientZombied(client.clientId)\n );\n }\n\n /**\n * Returns the IDs of the clients that are currently active. If multi-tab\n * is not supported, returns an array that only contains the local client's\n * ID.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */\n getActiveClients(): Promise<ClientId[]> {\n return this.runTransaction('getActiveClients', 'readonly', txn => {\n return clientMetadataStore(txn)\n .loadAll()\n .next(clients =>\n this.filterActiveClients(clients, MAX_CLIENT_AGE_MS).map(\n clientMetadata => clientMetadata.clientId\n )\n );\n });\n }\n\n get started(): boolean {\n return this._started;\n }\n\n getMutationQueue(user: User): IndexedDbMutationQueue {\n debugAssert(\n this.started,\n 'Cannot initialize MutationQueue before persistence is started.'\n );\n return IndexedDbMutationQueue.forUser(\n user,\n this.serializer,\n this.indexManager,\n this.referenceDelegate\n );\n }\n\n getTargetCache(): IndexedDbTargetCache {\n debugAssert(\n this.started,\n 'Cannot initialize TargetCache before persistence is started.'\n );\n return this.targetCache;\n }\n\n getRemoteDocumentCache(): IndexedDbRemoteDocumentCache {\n debugAssert(\n this.started,\n 'Cannot initialize RemoteDocumentCache before persistence is started.'\n );\n return this.remoteDocumentCache;\n }\n\n getIndexManager(): IndexManager {\n debugAssert(\n this.started,\n 'Cannot initialize IndexManager before persistence is started.'\n );\n return this.indexManager;\n }\n\n getBundleCache(): BundleCache {\n debugAssert(\n this.started,\n 'Cannot initialize BundleCache before persistence is started.'\n );\n return this.bundleCache;\n }\n\n runTransaction<T>(\n action: string,\n mode: PersistenceTransactionMode,\n transactionOperation: (\n transaction: PersistenceTransaction\n ) => PersistencePromise<T>\n ): Promise<T> {\n logDebug(LOG_TAG, 'Starting transaction:', action);\n\n const simpleDbMode = mode === 'readonly' ? 'readonly' : 'readwrite';\n\n let persistenceTransaction: PersistenceTransaction;\n\n // Do all transactions as readwrite against all object stores, since we\n // are the only reader/writer.\n return this.simpleDb\n .runTransaction(action, simpleDbMode, ALL_STORES, simpleDbTxn => {\n persistenceTransaction = new IndexedDbTransaction(\n simpleDbTxn,\n this.listenSequence\n ? this.listenSequence.next()\n : ListenSequence.INVALID\n );\n\n if (mode === 'readwrite-primary') {\n // While we merely verify that we have (or can acquire) the lease\n // immediately, we wait to extend the primary lease until after\n // executing transactionOperation(). This ensures that even if the\n // transactionOperation takes a long time, we'll use a recent\n // leaseTimestampMs in the extended (or newly acquired) lease.\n return this.verifyPrimaryLease(persistenceTransaction)\n .next(holdsPrimaryLease => {\n if (holdsPrimaryLease) {\n return /* holdsPrimaryLease= */ true;\n }\n return this.canActAsPrimary(persistenceTransaction);\n })\n .next(holdsPrimaryLease => {\n if (!holdsPrimaryLease) {\n logError(\n `Failed to obtain primary lease for action '${action}'.`\n );\n this.isPrimary = false;\n this.queue.enqueueRetryable(() =>\n this.primaryStateListener(false)\n );\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n PRIMARY_LEASE_LOST_ERROR_MSG\n );\n }\n return transactionOperation(persistenceTransaction);\n })\n .next(result => {\n return this.acquireOrExtendPrimaryLease(\n persistenceTransaction\n ).next(() => result);\n });\n } else {\n return this.verifyAllowTabSynchronization(\n persistenceTransaction\n ).next(() => transactionOperation(persistenceTransaction));\n }\n })\n .then(result => {\n persistenceTransaction.raiseOnCommittedEvent();\n return result;\n });\n }\n\n /**\n * Verifies that the current tab is the primary leaseholder or alternatively\n * that the leaseholder has opted into multi-tab synchronization.\n */\n // TODO(b/114226234): Remove this check when `synchronizeTabs` can no longer\n // be turned off.\n private verifyAllowTabSynchronization(\n txn: PersistenceTransaction\n ): PersistencePromise<void> {\n const store = primaryClientStore(txn);\n return store.get(DbPrimaryClient.key).next(currentPrimary => {\n const currentLeaseIsValid =\n currentPrimary !== null &&\n this.isWithinAge(\n currentPrimary.leaseTimestampMs,\n MAX_PRIMARY_ELIGIBLE_AGE_MS\n ) &&\n !this.isClientZombied(currentPrimary.ownerId);\n\n if (currentLeaseIsValid && !this.isLocalClient(currentPrimary)) {\n if (\n !this.forceOwningTab &&\n (!this.allowTabSynchronization ||\n !currentPrimary!.allowTabSynchronization)\n ) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n PRIMARY_LEASE_EXCLUSIVE_ERROR_MSG\n );\n }\n }\n });\n }\n\n /**\n * Obtains or extends the new primary lease for the local client. This\n * method does not verify that the client is eligible for this lease.\n */\n private acquireOrExtendPrimaryLease(\n txn: PersistenceTransaction\n ): PersistencePromise<void> {\n const newPrimary = new DbPrimaryClient(\n this.clientId,\n this.allowTabSynchronization,\n Date.now()\n );\n return primaryClientStore(txn).put(DbPrimaryClient.key, newPrimary);\n }\n\n static isAvailable(): boolean {\n return SimpleDb.isAvailable();\n }\n\n /** Checks the primary lease and removes it if we are the current primary. */\n private releasePrimaryLeaseIfHeld(\n txn: PersistenceTransaction\n ): PersistencePromise<void> {\n const store = primaryClientStore(txn);\n return store.get(DbPrimaryClient.key).next(primaryClient => {\n if (this.isLocalClient(primaryClient)) {\n logDebug(LOG_TAG, 'Releasing primary lease.');\n return store.delete(DbPrimaryClient.key);\n } else {\n return PersistencePromise.resolve();\n }\n });\n }\n\n /** Verifies that `updateTimeMs` is within `maxAgeMs`. */\n private isWithinAge(updateTimeMs: number, maxAgeMs: number): boolean {\n const now = Date.now();\n const minAcceptable = now - maxAgeMs;\n const maxAcceptable = now;\n if (updateTimeMs < minAcceptable) {\n return false;\n } else if (updateTimeMs > maxAcceptable) {\n logError(\n `Detected an update time that is in the future: ${updateTimeMs} > ${maxAcceptable}`\n );\n return false;\n }\n\n return true;\n }\n\n private attachVisibilityHandler(): void {\n if (\n this.document !== null &&\n typeof this.document.addEventListener === 'function'\n ) {\n this.documentVisibilityHandler = () => {\n this.queue.enqueueAndForget(() => {\n this.inForeground = this.document!.visibilityState === 'visible';\n return this.updateClientMetadataAndTryBecomePrimary();\n });\n };\n\n this.document.addEventListener(\n 'visibilitychange',\n this.documentVisibilityHandler\n );\n\n this.inForeground = this.document.visibilityState === 'visible';\n }\n }\n\n private detachVisibilityHandler(): void {\n if (this.documentVisibilityHandler) {\n debugAssert(\n this.document !== null &&\n typeof this.document.addEventListener === 'function',\n \"Expected 'document.addEventListener' to be a function\"\n );\n this.document.removeEventListener(\n 'visibilitychange',\n this.documentVisibilityHandler\n );\n this.documentVisibilityHandler = null;\n }\n }\n\n /**\n * Attaches a window.unload handler that will synchronously write our\n * clientId to a \"zombie client id\" location in LocalStorage. This can be used\n * by tabs trying to acquire the primary lease to determine that the lease\n * is no longer valid even if the timestamp is recent. This is particularly\n * important for the refresh case (so the tab correctly re-acquires the\n * primary lease). LocalStorage is used for this rather than IndexedDb because\n * it is a synchronous API and so can be used reliably from an unload\n * handler.\n */\n private attachWindowUnloadHook(): void {\n if (typeof this.window?.addEventListener === 'function') {\n this.windowUnloadHandler = () => {\n // Note: In theory, this should be scheduled on the AsyncQueue since it\n // accesses internal state. We execute this code directly during shutdown\n // to make sure it gets a chance to run.\n this.markClientZombied();\n\n if (isSafari() && navigator.appVersion.match(`Version/14`)) {\n // On Safari 14, we do not run any cleanup actions as it might trigger\n // a bug that prevents Safari from re-opening IndexedDB during the\n // next page load.\n // See https://bugs.webkit.org/show_bug.cgi?id=226547\n this.queue.enterRestrictedMode(/* purgeExistingTasks= */ true);\n }\n\n this.queue.enqueueAndForget(() => {\n // Attempt graceful shutdown (including releasing our primary lease),\n // but there's no guarantee it will complete.\n return this.shutdown();\n });\n };\n this.window.addEventListener('pagehide', this.windowUnloadHandler);\n }\n }\n\n private detachWindowUnloadHook(): void {\n if (this.windowUnloadHandler) {\n debugAssert(\n typeof this.window?.removeEventListener === 'function',\n \"Expected 'window.removeEventListener' to be a function\"\n );\n this.window!.removeEventListener('pagehide', this.windowUnloadHandler);\n this.windowUnloadHandler = null;\n }\n }\n\n /**\n * Returns whether a client is \"zombied\" based on its LocalStorage entry.\n * Clients become zombied when their tab closes without running all of the\n * cleanup logic in `shutdown()`.\n */\n private isClientZombied(clientId: ClientId): boolean {\n try {\n const isZombied =\n this.webStorage?.getItem(\n this.zombiedClientLocalStorageKey(clientId)\n ) !== null;\n logDebug(\n LOG_TAG,\n `Client '${clientId}' ${\n isZombied ? 'is' : 'is not'\n } zombied in LocalStorage`\n );\n return isZombied;\n } catch (e) {\n // Gracefully handle if LocalStorage isn't working.\n logError(LOG_TAG, 'Failed to get zombied client id.', e);\n return false;\n }\n }\n\n /**\n * Record client as zombied (a client that had its tab closed). Zombied\n * clients are ignored during primary tab selection.\n */\n private markClientZombied(): void {\n if (!this.webStorage) {\n return;\n }\n try {\n this.webStorage.setItem(\n this.zombiedClientLocalStorageKey(this.clientId),\n String(Date.now())\n );\n } catch (e) {\n // Gracefully handle if LocalStorage isn't available / working.\n logError('Failed to set zombie client id.', e);\n }\n }\n\n /** Removes the zombied client entry if it exists. */\n private removeClientZombiedEntry(): void {\n if (!this.webStorage) {\n return;\n }\n try {\n this.webStorage.removeItem(\n this.zombiedClientLocalStorageKey(this.clientId)\n );\n } catch (e) {\n // Ignore\n }\n }\n\n private zombiedClientLocalStorageKey(clientId: ClientId): string {\n return `${ZOMBIED_CLIENTS_KEY_PREFIX}_${this.persistenceKey}_${clientId}`;\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the primary client object store.\n */\nfunction primaryClientStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbPrimaryClientKey, DbPrimaryClient> {\n return getStore<DbPrimaryClientKey, DbPrimaryClient>(\n txn,\n DbPrimaryClient.store\n );\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the client metadata object store.\n */\nfunction clientMetadataStore(\n txn: PersistenceTransaction\n): SimpleDbStore<DbClientMetadataKey, DbClientMetadata> {\n return getStore<DbClientMetadataKey, DbClientMetadata>(\n txn,\n DbClientMetadata.store\n );\n}\n\n/**\n * Generates a string used as a prefix when storing data in IndexedDB and\n * LocalStorage.\n */\nexport function indexedDbStoragePrefix(\n databaseId: DatabaseId,\n persistenceKey: string\n): string {\n // Use two different prefix formats:\n //\n // * firestore / persistenceKey / projectID . databaseID / ...\n // * firestore / persistenceKey / projectID / ...\n //\n // projectIDs are DNS-compatible names and cannot contain dots\n // so there's no danger of collisions.\n let database = databaseId.projectId;\n if (!databaseId.isDefaultDatabase) {\n database += '.' + databaseId.database;\n }\n\n return 'firestore/' + persistenceKey + '/' + database + '/';\n}\n\nexport async function indexedDbClearPersistence(\n persistenceKey: string\n): Promise<void> {\n if (!SimpleDb.isAvailable()) {\n return Promise.resolve();\n }\n const dbName = persistenceKey + MAIN_DATABASE;\n await SimpleDb.delete(dbName);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoadBundleTaskProgress } from '@firebase/firestore-types';\n\nimport { DocumentMap } from '../model/collections';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { BundledDocumentMetadata as ProtoBundledDocumentMetadata } from '../protos/firestore_bundle_proto';\nimport {\n Document as ApiDocument,\n Timestamp as ApiTimestamp\n} from '../protos/firestore_proto_api';\n\nimport { Query } from './query';\nimport { SnapshotVersion } from './snapshot_version';\n\n/**\n * Represents a bundled document, including the metadata and the document\n * itself, if it exists.\n */\nexport interface BundledDocument {\n metadata: ProtoBundledDocumentMetadata;\n document?: ApiDocument;\n}\n\n/**\n * An array of `BundledDocument`.\n */\nexport type BundledDocuments = BundledDocument[];\n\nexport class BundleLoadResult {\n constructor(\n readonly progress: LoadBundleTaskProgress,\n readonly changedDocs: DocumentMap\n ) {}\n}\n\n/**\n * Represents a Firestore bundle saved by the SDK in its local storage.\n */\nexport interface BundleMetadata {\n /**\n * Id of the bundle. It is used together with `createTime` to determine if a\n * bundle has been loaded by the SDK.\n */\n readonly id: string;\n\n /** Schema version of the bundle. */\n readonly version: number;\n\n /**\n * Set to the snapshot version of the bundle if created by the Server SDKs.\n * Otherwise set to SnapshotVersion.MIN.\n */\n readonly createTime: SnapshotVersion;\n}\n\n/**\n * Represents a Query saved by the SDK in its local storage.\n */\nexport interface NamedQuery {\n /** The name of the query. */\n readonly name: string;\n /** The underlying query associated with `name`. */\n readonly query: Query;\n /** The time at which the results for this query were read. */\n readonly readTime: SnapshotVersion;\n}\n\n/**\n * Helper to convert objects from bundles to model objects in the SDK.\n */\nexport interface BundleConverter {\n toDocumentKey(name: string): DocumentKey;\n\n /**\n * Converts a BundleDocument to a MutableDocument.\n */\n toMutableDocument(bundledDoc: BundledDocument): MutableDocument;\n\n toSnapshotVersion(time: ApiTimestamp): SnapshotVersion;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n asCollectionQueryAtPath,\n isCollectionGroupQuery,\n isDocumentQuery,\n Query,\n queryMatches\n} from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport {\n DocumentKeySet,\n documentKeySet,\n DocumentMap,\n documentMap,\n MutableDocumentMap\n} from '../model/collections';\nimport { Document, MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { applyMutationToLocalView, PatchMutation } from '../model/mutation';\nimport { MutationBatch } from '../model/mutation_batch';\nimport { ResourcePath } from '../model/path';\nimport { debugAssert } from '../util/assert';\n\nimport { IndexManager } from './index_manager';\nimport { MutationQueue } from './mutation_queue';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { RemoteDocumentCache } from './remote_document_cache';\n\n/**\n * A readonly view of the local state of all documents we're tracking (i.e. we\n * have a cached version in remoteDocumentCache or local mutations for the\n * document). The view is computed by applying the mutations in the\n * MutationQueue to the RemoteDocumentCache.\n */\nexport class LocalDocumentsView {\n constructor(\n readonly remoteDocumentCache: RemoteDocumentCache,\n readonly mutationQueue: MutationQueue,\n readonly indexManager: IndexManager\n ) {}\n\n /**\n * Get the local view of the document identified by `key`.\n *\n * @returns Local view of the document or null if we don't have any cached\n * state for it.\n */\n getDocument(\n transaction: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<Document> {\n return this.mutationQueue\n .getAllMutationBatchesAffectingDocumentKey(transaction, key)\n .next(batches => this.getDocumentInternal(transaction, key, batches));\n }\n\n /** Internal version of `getDocument` that allows reusing batches. */\n private getDocumentInternal(\n transaction: PersistenceTransaction,\n key: DocumentKey,\n inBatches: MutationBatch[]\n ): PersistencePromise<Document> {\n return this.remoteDocumentCache.getEntry(transaction, key).next(doc => {\n for (const batch of inBatches) {\n batch.applyToLocalView(doc);\n }\n return doc as Document;\n });\n }\n\n // Returns the view of the given `docs` as they would appear after applying\n // all mutations in the given `batches`.\n private applyLocalMutationsToDocuments(\n docs: MutableDocumentMap,\n batches: MutationBatch[]\n ): void {\n docs.forEach((key, localView) => {\n for (const batch of batches) {\n batch.applyToLocalView(localView);\n }\n });\n }\n\n /**\n * Gets the local view of the documents identified by `keys`.\n *\n * If we don't have cached state for a document in `keys`, a NoDocument will\n * be stored for that key in the resulting set.\n */\n getDocuments(\n transaction: PersistenceTransaction,\n keys: DocumentKeySet\n ): PersistencePromise<DocumentMap> {\n return this.remoteDocumentCache\n .getEntries(transaction, keys)\n .next(docs =>\n this.applyLocalViewToDocuments(transaction, docs).next(\n () => docs as DocumentMap\n )\n );\n }\n\n /**\n * Applies the local view the given `baseDocs` without retrieving documents\n * from the local store.\n */\n applyLocalViewToDocuments(\n transaction: PersistenceTransaction,\n baseDocs: MutableDocumentMap\n ): PersistencePromise<void> {\n return this.mutationQueue\n .getAllMutationBatchesAffectingDocumentKeys(transaction, baseDocs)\n .next(batches => this.applyLocalMutationsToDocuments(baseDocs, batches));\n }\n\n /**\n * Performs a query against the local view of all documents.\n *\n * @param transaction - The persistence transaction.\n * @param query - The query to match documents against.\n * @param sinceReadTime - If not set to SnapshotVersion.min(), return only\n * documents that have been read since this snapshot version (exclusive).\n */\n getDocumentsMatchingQuery(\n transaction: PersistenceTransaction,\n query: Query,\n sinceReadTime: SnapshotVersion\n ): PersistencePromise<DocumentMap> {\n if (isDocumentQuery(query)) {\n return this.getDocumentsMatchingDocumentQuery(transaction, query.path);\n } else if (isCollectionGroupQuery(query)) {\n return this.getDocumentsMatchingCollectionGroupQuery(\n transaction,\n query,\n sinceReadTime\n );\n } else {\n return this.getDocumentsMatchingCollectionQuery(\n transaction,\n query,\n sinceReadTime\n );\n }\n }\n\n private getDocumentsMatchingDocumentQuery(\n transaction: PersistenceTransaction,\n docPath: ResourcePath\n ): PersistencePromise<DocumentMap> {\n // Just do a simple document lookup.\n return this.getDocument(transaction, new DocumentKey(docPath)).next(\n document => {\n let result = documentMap();\n if (document.isFoundDocument()) {\n result = result.insert(document.key, document);\n }\n return result;\n }\n );\n }\n\n private getDocumentsMatchingCollectionGroupQuery(\n transaction: PersistenceTransaction,\n query: Query,\n sinceReadTime: SnapshotVersion\n ): PersistencePromise<DocumentMap> {\n debugAssert(\n query.path.isEmpty(),\n 'Currently we only support collection group queries at the root.'\n );\n const collectionId = query.collectionGroup!;\n let results = documentMap();\n return this.indexManager\n .getCollectionParents(transaction, collectionId)\n .next(parents => {\n // Perform a collection query against each parent that contains the\n // collectionId and aggregate the results.\n return PersistencePromise.forEach(parents, (parent: ResourcePath) => {\n const collectionQuery = asCollectionQueryAtPath(\n query,\n parent.child(collectionId)\n );\n return this.getDocumentsMatchingCollectionQuery(\n transaction,\n collectionQuery,\n sinceReadTime\n ).next(r => {\n r.forEach((key, doc) => {\n results = results.insert(key, doc);\n });\n });\n }).next(() => results);\n });\n }\n\n private getDocumentsMatchingCollectionQuery(\n transaction: PersistenceTransaction,\n query: Query,\n sinceReadTime: SnapshotVersion\n ): PersistencePromise<DocumentMap> {\n // Query the remote documents and overlay mutations.\n let results: MutableDocumentMap;\n let mutationBatches: MutationBatch[];\n return this.remoteDocumentCache\n .getDocumentsMatchingQuery(transaction, query, sinceReadTime)\n .next(queryResults => {\n results = queryResults;\n return this.mutationQueue.getAllMutationBatchesAffectingQuery(\n transaction,\n query\n );\n })\n .next(matchingMutationBatches => {\n mutationBatches = matchingMutationBatches;\n // It is possible that a PatchMutation can make a document match a query, even if\n // the version in the RemoteDocumentCache is not a match yet (waiting for server\n // to ack). To handle this, we find all document keys affected by the PatchMutations\n // that are not in `result` yet, and back fill them via `remoteDocumentCache.getEntries`,\n // otherwise those `PatchMutations` will be ignored because no base document can be found,\n // and lead to missing result for the query.\n return this.addMissingBaseDocuments(\n transaction,\n mutationBatches,\n results\n ).next(mergedDocuments => {\n results = mergedDocuments;\n\n for (const batch of mutationBatches) {\n for (const mutation of batch.mutations) {\n const key = mutation.key;\n let document = results.get(key);\n if (document == null) {\n // Create invalid document to apply mutations on top of\n document = MutableDocument.newInvalidDocument(key);\n results = results.insert(key, document);\n }\n applyMutationToLocalView(\n mutation,\n document,\n batch.localWriteTime\n );\n if (!document.isFoundDocument()) {\n results = results.remove(key);\n }\n }\n }\n });\n })\n .next(() => {\n // Finally, filter out any documents that don't actually match\n // the query.\n results.forEach((key, doc) => {\n if (!queryMatches(query, doc)) {\n results = results.remove(key);\n }\n });\n\n return results as DocumentMap;\n });\n }\n\n private addMissingBaseDocuments(\n transaction: PersistenceTransaction,\n matchingMutationBatches: MutationBatch[],\n existingDocuments: MutableDocumentMap\n ): PersistencePromise<MutableDocumentMap> {\n let missingBaseDocEntriesForPatching = documentKeySet();\n for (const batch of matchingMutationBatches) {\n for (const mutation of batch.mutations) {\n if (\n mutation instanceof PatchMutation &&\n existingDocuments.get(mutation.key) === null\n ) {\n missingBaseDocEntriesForPatching = missingBaseDocEntriesForPatching.add(\n mutation.key\n );\n }\n }\n }\n\n let mergedDocuments = existingDocuments;\n return this.remoteDocumentCache\n .getEntries(transaction, missingBaseDocEntriesForPatching)\n .next(missingBaseDocs => {\n missingBaseDocs.forEach((key, doc) => {\n if (doc.isFoundDocument()) {\n mergedDocuments = mergedDocuments.insert(key, doc);\n }\n });\n return mergedDocuments;\n });\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TargetId } from '../core/types';\nimport { ChangeType, ViewSnapshot } from '../core/view_snapshot';\nimport { documentKeySet, DocumentKeySet } from '../model/collections';\n\n/**\n * A set of changes to what documents are currently in view and out of view for\n * a given query. These changes are sent to the LocalStore by the View (via\n * the SyncEngine) and are used to pin / unpin documents as appropriate.\n */\nexport class LocalViewChanges {\n constructor(\n readonly targetId: TargetId,\n readonly fromCache: boolean,\n readonly addedKeys: DocumentKeySet,\n readonly removedKeys: DocumentKeySet\n ) {}\n\n static fromSnapshot(\n targetId: TargetId,\n viewSnapshot: ViewSnapshot\n ): LocalViewChanges {\n let addedKeys = documentKeySet();\n let removedKeys = documentKeySet();\n\n for (const docChange of viewSnapshot.docChanges) {\n switch (docChange.type) {\n case ChangeType.Added:\n addedKeys = addedKeys.add(docChange.doc.key);\n break;\n case ChangeType.Removed:\n removedKeys = removedKeys.add(docChange.doc.key);\n break;\n default:\n // do nothing\n }\n }\n\n return new LocalViewChanges(\n targetId,\n viewSnapshot.fromCache,\n addedKeys,\n removedKeys\n );\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n hasLimitToFirst,\n hasLimitToLast,\n LimitType,\n matchesAllDocuments,\n newQueryComparator,\n Query,\n queryMatches,\n stringifyQuery\n} from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { DocumentKeySet, DocumentMap } from '../model/collections';\nimport { Document } from '../model/document';\nimport { debugAssert } from '../util/assert';\nimport { getLogLevel, LogLevel, logDebug } from '../util/log';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { LocalDocumentsView } from './local_documents_view';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\n\n/**\n * A query engine that takes advantage of the target document mapping in the\n * QueryCache. Query execution is optimized by only reading the documents that\n * previously matched a query plus any documents that were edited after the\n * query was last listened to.\n *\n * There are some cases when this optimization is not guaranteed to produce\n * the same results as full collection scans. In these cases, query\n * processing falls back to full scans. These cases are:\n *\n * - Limit queries where a document that matched the query previously no longer\n * matches the query.\n *\n * - Limit queries where a document edit may cause the document to sort below\n * another document that is in the local cache.\n *\n * - Queries that have never been CURRENT or free of limbo documents.\n */\nexport class QueryEngine {\n private localDocumentsView: LocalDocumentsView | undefined;\n\n /** Sets the document view to query against. */\n setLocalDocumentsView(localDocuments: LocalDocumentsView): void {\n this.localDocumentsView = localDocuments;\n }\n\n /** Returns all local documents matching the specified query. */\n getDocumentsMatchingQuery(\n transaction: PersistenceTransaction,\n query: Query,\n lastLimboFreeSnapshotVersion: SnapshotVersion,\n remoteKeys: DocumentKeySet\n ): PersistencePromise<DocumentMap> {\n debugAssert(\n this.localDocumentsView !== undefined,\n 'setLocalDocumentsView() not called'\n );\n\n // Queries that match all documents don't benefit from using\n // key-based lookups. It is more efficient to scan all documents in a\n // collection, rather than to perform individual lookups.\n if (matchesAllDocuments(query)) {\n return this.executeFullCollectionScan(transaction, query);\n }\n\n // Queries that have never seen a snapshot without limbo free documents\n // should also be run as a full collection scan.\n if (lastLimboFreeSnapshotVersion.isEqual(SnapshotVersion.min())) {\n return this.executeFullCollectionScan(transaction, query);\n }\n\n return this.localDocumentsView!.getDocuments(transaction, remoteKeys).next(\n documents => {\n const previousResults = this.applyQuery(query, documents);\n\n if (\n (hasLimitToFirst(query) || hasLimitToLast(query)) &&\n this.needsRefill(\n query.limitType,\n previousResults,\n remoteKeys,\n lastLimboFreeSnapshotVersion\n )\n ) {\n return this.executeFullCollectionScan(transaction, query);\n }\n\n if (getLogLevel() <= LogLevel.DEBUG) {\n logDebug(\n 'QueryEngine',\n 'Re-using previous result from %s to execute query: %s',\n lastLimboFreeSnapshotVersion.toString(),\n stringifyQuery(query)\n );\n }\n\n // Retrieve all results for documents that were updated since the last\n // limbo-document free remote snapshot.\n return this.localDocumentsView!.getDocumentsMatchingQuery(\n transaction,\n query,\n lastLimboFreeSnapshotVersion\n ).next(updatedResults => {\n // We merge `previousResults` into `updateResults`, since\n // `updateResults` is already a DocumentMap. If a document is\n // contained in both lists, then its contents are the same.\n previousResults.forEach(doc => {\n updatedResults = updatedResults.insert(doc.key, doc);\n });\n return updatedResults;\n });\n }\n );\n }\n\n /** Applies the query filter and sorting to the provided documents. */\n private applyQuery(\n query: Query,\n documents: DocumentMap\n ): SortedSet<Document> {\n // Sort the documents and re-apply the query filter since previously\n // matching documents do not necessarily still match the query.\n let queryResults = new SortedSet<Document>(newQueryComparator(query));\n documents.forEach((_, maybeDoc) => {\n if (queryMatches(query, maybeDoc)) {\n queryResults = queryResults.add(maybeDoc);\n }\n });\n return queryResults;\n }\n\n /**\n * Determines if a limit query needs to be refilled from cache, making it\n * ineligible for index-free execution.\n *\n * @param sortedPreviousResults - The documents that matched the query when it\n * was last synchronized, sorted by the query's comparator.\n * @param remoteKeys - The document keys that matched the query at the last\n * snapshot.\n * @param limboFreeSnapshotVersion - The version of the snapshot when the\n * query was last synchronized.\n */\n private needsRefill(\n limitType: LimitType,\n sortedPreviousResults: SortedSet<Document>,\n remoteKeys: DocumentKeySet,\n limboFreeSnapshotVersion: SnapshotVersion\n ): boolean {\n // The query needs to be refilled if a previously matching document no\n // longer matches.\n if (remoteKeys.size !== sortedPreviousResults.size) {\n return true;\n }\n\n // Limit queries are not eligible for index-free query execution if there is\n // a potential that an older document from cache now sorts before a document\n // that was previously part of the limit. This, however, can only happen if\n // the document at the edge of the limit goes out of limit.\n // If a document that is not the limit boundary sorts differently,\n // the boundary of the limit itself did not change and documents from cache\n // will continue to be \"rejected\" by this boundary. Therefore, we can ignore\n // any modifications that don't affect the last document.\n const docAtLimitEdge =\n limitType === LimitType.First\n ? sortedPreviousResults.last()\n : sortedPreviousResults.first();\n if (!docAtLimitEdge) {\n // We don't need to refill the query if there were already no documents.\n return false;\n }\n return (\n docAtLimitEdge.hasPendingWrites ||\n docAtLimitEdge.version.compareTo(limboFreeSnapshotVersion) > 0\n );\n }\n\n private executeFullCollectionScan(\n transaction: PersistenceTransaction,\n query: Query\n ): PersistencePromise<DocumentMap> {\n if (getLogLevel() <= LogLevel.DEBUG) {\n logDebug(\n 'QueryEngine',\n 'Using full collection scan to execute query:',\n stringifyQuery(query)\n );\n }\n\n return this.localDocumentsView!.getDocumentsMatchingQuery(\n transaction,\n query,\n SnapshotVersion.min()\n );\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { BundleConverter, BundledDocuments, NamedQuery } from '../core/bundle';\nimport { newQueryForPath, Query, queryToTarget } from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { canonifyTarget, Target, targetEquals } from '../core/target';\nimport { BatchId, TargetId } from '../core/types';\nimport { Timestamp } from '../lite/timestamp';\nimport {\n documentKeySet,\n DocumentKeySet,\n DocumentMap,\n DocumentVersionMap,\n documentVersionMap,\n mutableDocumentMap,\n MutableDocumentMap\n} from '../model/collections';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport {\n extractMutationBaseValue,\n Mutation,\n PatchMutation,\n Precondition\n} from '../model/mutation';\nimport { MutationBatch, MutationBatchResult } from '../model/mutation_batch';\nimport { extractFieldMask } from '../model/object_value';\nimport { ResourcePath } from '../model/path';\nimport {\n BundleMetadata,\n NamedQuery as ProtoNamedQuery\n} from '../protos/firestore_bundle_proto';\nimport { RemoteEvent, TargetChange } from '../remote/remote_event';\nimport { fromVersion, JsonProtoSerializer } from '../remote/serializer';\nimport { debugAssert, debugCast, hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { logDebug } from '../util/log';\nimport { primitiveComparator } from '../util/misc';\nimport { ObjectMap } from '../util/obj_map';\nimport { SortedMap } from '../util/sorted_map';\nimport { BATCHID_UNKNOWN } from '../util/types';\n\nimport { BundleCache } from './bundle_cache';\nimport { IndexedDbMutationQueue } from './indexeddb_mutation_queue';\nimport { IndexedDbPersistence } from './indexeddb_persistence';\nimport {\n remoteDocumentCacheGetLastReadTime,\n remoteDocumentCacheGetNewDocumentChanges\n} from './indexeddb_remote_document_cache';\nimport { IndexedDbTargetCache } from './indexeddb_target_cache';\nimport { LocalDocumentsView } from './local_documents_view';\nimport { fromBundledQuery } from './local_serializer';\nimport { LocalStore } from './local_store';\nimport { LocalViewChanges } from './local_view_changes';\nimport { LruGarbageCollector, LruResults } from './lru_garbage_collector';\nimport { MutationQueue } from './mutation_queue';\nimport { Persistence } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { QueryEngine } from './query_engine';\nimport { RemoteDocumentCache } from './remote_document_cache';\nimport { RemoteDocumentChangeBuffer } from './remote_document_change_buffer';\nimport { ClientId } from './shared_client_state';\nimport { isIndexedDbTransactionError } from './simple_db';\nimport { TargetCache } from './target_cache';\nimport { TargetData, TargetPurpose } from './target_data';\n\nexport const LOG_TAG = 'LocalStore';\n\n/**\n * The maximum time to leave a resume token buffered without writing it out.\n * This value is arbitrary: it's long enough to avoid several writes\n * (possibly indefinitely if updates come more frequently than this) but\n * short enough that restarting after crashing will still have a pretty\n * recent resume token.\n */\nconst RESUME_TOKEN_MAX_AGE_MICROS = 5 * 60 * 1e6;\n\n/** The result of a write to the local store. */\nexport interface LocalWriteResult {\n batchId: BatchId;\n changes: DocumentMap;\n}\n\n/** The result of a user-change operation in the local store. */\nexport interface UserChangeResult {\n readonly affectedDocuments: DocumentMap;\n readonly removedBatchIds: BatchId[];\n readonly addedBatchIds: BatchId[];\n}\n\n/** The result of executing a query against the local store. */\nexport interface QueryResult {\n readonly documents: DocumentMap;\n readonly remoteKeys: DocumentKeySet;\n}\n\n/**\n * Implements `LocalStore` interface.\n *\n * Note: some field defined in this class might have public access level, but\n * the class is not exported so they are only accessible from this module.\n * This is useful to implement optional features (like bundles) in free\n * functions, such that they are tree-shakeable.\n */\nclass LocalStoreImpl implements LocalStore {\n /**\n * The set of all mutations that have been sent but not yet been applied to\n * the backend.\n */\n mutationQueue: MutationQueue;\n\n /** The set of all cached remote documents. */\n remoteDocuments: RemoteDocumentCache;\n\n /**\n * The \"local\" view of all documents (layering mutationQueue on top of\n * remoteDocumentCache).\n */\n localDocuments: LocalDocumentsView;\n\n /** The set of all cached bundle metadata and named queries. */\n bundleCache: BundleCache;\n\n /** Maps a target to its `TargetData`. */\n targetCache: TargetCache;\n\n /**\n * Maps a targetID to data about its target.\n *\n * PORTING NOTE: We are using an immutable data structure on Web to make re-runs\n * of `applyRemoteEvent()` idempotent.\n */\n targetDataByTarget = new SortedMap<TargetId, TargetData>(primitiveComparator);\n\n /** Maps a target to its targetID. */\n // TODO(wuandy): Evaluate if TargetId can be part of Target.\n targetIdByTarget = new ObjectMap<Target, TargetId>(\n t => canonifyTarget(t),\n targetEquals\n );\n\n /**\n * The read time of the last entry processed by `getNewDocumentChanges()`.\n *\n * PORTING NOTE: This is only used for multi-tab synchronization.\n */\n lastDocumentChangeReadTime = SnapshotVersion.min();\n\n constructor(\n /** Manages our in-memory or durable persistence. */\n readonly persistence: Persistence,\n readonly queryEngine: QueryEngine,\n initialUser: User,\n readonly serializer: JsonProtoSerializer\n ) {\n debugAssert(\n persistence.started,\n 'LocalStore was passed an unstarted persistence implementation'\n );\n this.mutationQueue = persistence.getMutationQueue(initialUser);\n this.remoteDocuments = persistence.getRemoteDocumentCache();\n this.targetCache = persistence.getTargetCache();\n this.localDocuments = new LocalDocumentsView(\n this.remoteDocuments,\n this.mutationQueue,\n this.persistence.getIndexManager()\n );\n this.bundleCache = persistence.getBundleCache();\n this.queryEngine.setLocalDocumentsView(this.localDocuments);\n }\n\n collectGarbage(garbageCollector: LruGarbageCollector): Promise<LruResults> {\n return this.persistence.runTransaction(\n 'Collect garbage',\n 'readwrite-primary',\n txn => garbageCollector.collect(txn, this.targetDataByTarget)\n );\n }\n}\n\nexport function newLocalStore(\n /** Manages our in-memory or durable persistence. */\n persistence: Persistence,\n queryEngine: QueryEngine,\n initialUser: User,\n serializer: JsonProtoSerializer\n): LocalStore {\n return new LocalStoreImpl(persistence, queryEngine, initialUser, serializer);\n}\n\n/**\n * Tells the LocalStore that the currently authenticated user has changed.\n *\n * In response the local store switches the mutation queue to the new user and\n * returns any resulting document changes.\n */\n// PORTING NOTE: Android and iOS only return the documents affected by the\n// change.\nexport async function localStoreHandleUserChange(\n localStore: LocalStore,\n user: User\n): Promise<UserChangeResult> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n let newMutationQueue = localStoreImpl.mutationQueue;\n let newLocalDocuments = localStoreImpl.localDocuments;\n\n const result = await localStoreImpl.persistence.runTransaction(\n 'Handle user change',\n 'readonly',\n txn => {\n // Swap out the mutation queue, grabbing the pending mutation batches\n // before and after.\n let oldBatches: MutationBatch[];\n return localStoreImpl.mutationQueue\n .getAllMutationBatches(txn)\n .next(promisedOldBatches => {\n oldBatches = promisedOldBatches;\n\n newMutationQueue = localStoreImpl.persistence.getMutationQueue(user);\n\n // Recreate our LocalDocumentsView using the new\n // MutationQueue.\n newLocalDocuments = new LocalDocumentsView(\n localStoreImpl.remoteDocuments,\n newMutationQueue,\n localStoreImpl.persistence.getIndexManager()\n );\n return newMutationQueue.getAllMutationBatches(txn);\n })\n .next(newBatches => {\n const removedBatchIds: BatchId[] = [];\n const addedBatchIds: BatchId[] = [];\n\n // Union the old/new changed keys.\n let changedKeys = documentKeySet();\n\n for (const batch of oldBatches) {\n removedBatchIds.push(batch.batchId);\n for (const mutation of batch.mutations) {\n changedKeys = changedKeys.add(mutation.key);\n }\n }\n\n for (const batch of newBatches) {\n addedBatchIds.push(batch.batchId);\n for (const mutation of batch.mutations) {\n changedKeys = changedKeys.add(mutation.key);\n }\n }\n\n // Return the set of all (potentially) changed documents and the list\n // of mutation batch IDs that were affected by change.\n return newLocalDocuments\n .getDocuments(txn, changedKeys)\n .next(affectedDocuments => {\n return {\n affectedDocuments,\n removedBatchIds,\n addedBatchIds\n };\n });\n });\n }\n );\n\n localStoreImpl.mutationQueue = newMutationQueue;\n localStoreImpl.localDocuments = newLocalDocuments;\n localStoreImpl.queryEngine.setLocalDocumentsView(\n localStoreImpl.localDocuments\n );\n\n return result;\n}\n\n/* Accepts locally generated Mutations and commit them to storage. */\nexport function localStoreWriteLocally(\n localStore: LocalStore,\n mutations: Mutation[]\n): Promise<LocalWriteResult> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const localWriteTime = Timestamp.now();\n const keys = mutations.reduce((keys, m) => keys.add(m.key), documentKeySet());\n\n let existingDocs: DocumentMap;\n\n return localStoreImpl.persistence\n .runTransaction('Locally write mutations', 'readwrite', txn => {\n // Load and apply all existing mutations. This lets us compute the\n // current base state for all non-idempotent transforms before applying\n // any additional user-provided writes.\n return localStoreImpl.localDocuments\n .getDocuments(txn, keys)\n .next(docs => {\n existingDocs = docs;\n\n // For non-idempotent mutations (such as `FieldValue.increment()`),\n // we record the base state in a separate patch mutation. This is\n // later used to guarantee consistent values and prevents flicker\n // even if the backend sends us an update that already includes our\n // transform.\n const baseMutations: Mutation[] = [];\n\n for (const mutation of mutations) {\n const baseValue = extractMutationBaseValue(\n mutation,\n existingDocs.get(mutation.key)!\n );\n if (baseValue != null) {\n // NOTE: The base state should only be applied if there's some\n // existing document to override, so use a Precondition of\n // exists=true\n baseMutations.push(\n new PatchMutation(\n mutation.key,\n baseValue,\n extractFieldMask(baseValue.value.mapValue),\n Precondition.exists(true)\n )\n );\n }\n }\n\n return localStoreImpl.mutationQueue.addMutationBatch(\n txn,\n localWriteTime,\n baseMutations,\n mutations\n );\n });\n })\n .then(batch => {\n batch.applyToLocalDocumentSet(existingDocs);\n return { batchId: batch.batchId, changes: existingDocs };\n });\n}\n\n/**\n * Acknowledges the given batch.\n *\n * On the happy path when a batch is acknowledged, the local store will\n *\n * + remove the batch from the mutation queue;\n * + apply the changes to the remote document cache;\n * + recalculate the latency compensated view implied by those changes (there\n * may be mutations in the queue that affect the documents but haven't been\n * acknowledged yet); and\n * + give the changed documents back the sync engine\n *\n * @returns The resulting (modified) documents.\n */\nexport function localStoreAcknowledgeBatch(\n localStore: LocalStore,\n batchResult: MutationBatchResult\n): Promise<DocumentMap> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Acknowledge batch',\n 'readwrite-primary',\n txn => {\n const affected = batchResult.batch.keys();\n const documentBuffer = localStoreImpl.remoteDocuments.newChangeBuffer({\n trackRemovals: true // Make sure document removals show up in `getNewDocumentChanges()`\n });\n return applyWriteToRemoteDocuments(\n localStoreImpl,\n txn,\n batchResult,\n documentBuffer\n )\n .next(() => documentBuffer.apply(txn))\n .next(() => localStoreImpl.mutationQueue.performConsistencyCheck(txn))\n .next(() => localStoreImpl.localDocuments.getDocuments(txn, affected));\n }\n );\n}\n\n/**\n * Removes mutations from the MutationQueue for the specified batch;\n * LocalDocuments will be recalculated.\n *\n * @returns The resulting modified documents.\n */\nexport function localStoreRejectBatch(\n localStore: LocalStore,\n batchId: BatchId\n): Promise<DocumentMap> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Reject batch',\n 'readwrite-primary',\n txn => {\n let affectedKeys: DocumentKeySet;\n return localStoreImpl.mutationQueue\n .lookupMutationBatch(txn, batchId)\n .next((batch: MutationBatch | null) => {\n hardAssert(batch !== null, 'Attempt to reject nonexistent batch!');\n affectedKeys = batch.keys();\n return localStoreImpl.mutationQueue.removeMutationBatch(txn, batch);\n })\n .next(() => localStoreImpl.mutationQueue.performConsistencyCheck(txn))\n .next(() =>\n localStoreImpl.localDocuments.getDocuments(txn, affectedKeys)\n );\n }\n );\n}\n\n/**\n * Returns the largest (latest) batch id in mutation queue that is pending\n * server response.\n *\n * Returns `BATCHID_UNKNOWN` if the queue is empty.\n */\nexport function localStoreGetHighestUnacknowledgedBatchId(\n localStore: LocalStore\n): Promise<BatchId> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Get highest unacknowledged batch id',\n 'readonly',\n txn => localStoreImpl.mutationQueue.getHighestUnacknowledgedBatchId(txn)\n );\n}\n\n/**\n * Returns the last consistent snapshot processed (used by the RemoteStore to\n * determine whether to buffer incoming snapshots from the backend).\n */\nexport function localStoreGetLastRemoteSnapshotVersion(\n localStore: LocalStore\n): Promise<SnapshotVersion> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Get last remote snapshot version',\n 'readonly',\n txn => localStoreImpl.targetCache.getLastRemoteSnapshotVersion(txn)\n );\n}\n\n/**\n * Updates the \"ground-state\" (remote) documents. We assume that the remote\n * event reflects any write batches that have been acknowledged or rejected\n * (i.e. we do not re-apply local mutations to updates from this event).\n *\n * LocalDocuments are re-calculated if there are remaining mutations in the\n * queue.\n */\nexport function localStoreApplyRemoteEventToLocalCache(\n localStore: LocalStore,\n remoteEvent: RemoteEvent\n): Promise<DocumentMap> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const remoteVersion = remoteEvent.snapshotVersion;\n let newTargetDataByTargetMap = localStoreImpl.targetDataByTarget;\n\n return localStoreImpl.persistence\n .runTransaction('Apply remote event', 'readwrite-primary', txn => {\n const documentBuffer = localStoreImpl.remoteDocuments.newChangeBuffer({\n trackRemovals: true // Make sure document removals show up in `getNewDocumentChanges()`\n });\n\n // Reset newTargetDataByTargetMap in case this transaction gets re-run.\n newTargetDataByTargetMap = localStoreImpl.targetDataByTarget;\n\n const promises = [] as Array<PersistencePromise<void>>;\n remoteEvent.targetChanges.forEach((change, targetId) => {\n const oldTargetData = newTargetDataByTargetMap.get(targetId);\n if (!oldTargetData) {\n return;\n }\n\n // Only update the remote keys if the target is still active. This\n // ensures that we can persist the updated target data along with\n // the updated assignment.\n promises.push(\n localStoreImpl.targetCache\n .removeMatchingKeys(txn, change.removedDocuments, targetId)\n .next(() => {\n return localStoreImpl.targetCache.addMatchingKeys(\n txn,\n change.addedDocuments,\n targetId\n );\n })\n );\n\n const resumeToken = change.resumeToken;\n // Update the resume token if the change includes one.\n if (resumeToken.approximateByteSize() > 0) {\n const newTargetData = oldTargetData\n .withResumeToken(resumeToken, remoteVersion)\n .withSequenceNumber(txn.currentSequenceNumber);\n newTargetDataByTargetMap = newTargetDataByTargetMap.insert(\n targetId,\n newTargetData\n );\n\n // Update the target data if there are target changes (or if\n // sufficient time has passed since the last update).\n if (shouldPersistTargetData(oldTargetData, newTargetData, change)) {\n promises.push(\n localStoreImpl.targetCache.updateTargetData(txn, newTargetData)\n );\n }\n }\n });\n\n let changedDocs = mutableDocumentMap();\n remoteEvent.documentUpdates.forEach((key, doc) => {\n if (remoteEvent.resolvedLimboDocuments.has(key)) {\n promises.push(\n localStoreImpl.persistence.referenceDelegate.updateLimboDocument(\n txn,\n key\n )\n );\n }\n });\n\n // Each loop iteration only affects its \"own\" doc, so it's safe to get all the remote\n // documents in advance in a single call.\n promises.push(\n populateDocumentChangeBuffer(\n txn,\n documentBuffer,\n remoteEvent.documentUpdates,\n remoteVersion,\n undefined\n ).next(result => {\n changedDocs = result;\n })\n );\n\n // HACK: The only reason we allow a null snapshot version is so that we\n // can synthesize remote events when we get permission denied errors while\n // trying to resolve the state of a locally cached document that is in\n // limbo.\n if (!remoteVersion.isEqual(SnapshotVersion.min())) {\n const updateRemoteVersion = localStoreImpl.targetCache\n .getLastRemoteSnapshotVersion(txn)\n .next(lastRemoteSnapshotVersion => {\n debugAssert(\n remoteVersion.compareTo(lastRemoteSnapshotVersion) >= 0,\n 'Watch stream reverted to previous snapshot?? ' +\n remoteVersion +\n ' < ' +\n lastRemoteSnapshotVersion\n );\n return localStoreImpl.targetCache.setTargetsMetadata(\n txn,\n txn.currentSequenceNumber,\n remoteVersion\n );\n });\n promises.push(updateRemoteVersion);\n }\n\n return PersistencePromise.waitFor(promises)\n .next(() => documentBuffer.apply(txn))\n .next(() =>\n localStoreImpl.localDocuments.applyLocalViewToDocuments(\n txn,\n changedDocs\n )\n )\n .next(() => changedDocs);\n })\n .then(changedDocs => {\n localStoreImpl.targetDataByTarget = newTargetDataByTargetMap;\n return changedDocs;\n });\n}\n\n/**\n * Populates document change buffer with documents from backend or a bundle.\n * Returns the document changes resulting from applying those documents.\n *\n * @param txn - Transaction to use to read existing documents from storage.\n * @param documentBuffer - Document buffer to collect the resulted changes to be\n * applied to storage.\n * @param documents - Documents to be applied.\n * @param globalVersion - A `SnapshotVersion` representing the read time if all\n * documents have the same read time.\n * @param documentVersions - A DocumentKey-to-SnapshotVersion map if documents\n * have their own read time.\n *\n * Note: this function will use `documentVersions` if it is defined;\n * when it is not defined, resorts to `globalVersion`.\n */\nfunction populateDocumentChangeBuffer(\n txn: PersistenceTransaction,\n documentBuffer: RemoteDocumentChangeBuffer,\n documents: MutableDocumentMap,\n globalVersion: SnapshotVersion,\n // TODO(wuandy): We could add `readTime` to MaybeDocument instead to remove\n // this parameter.\n documentVersions: DocumentVersionMap | undefined\n): PersistencePromise<MutableDocumentMap> {\n let updatedKeys = documentKeySet();\n documents.forEach(k => (updatedKeys = updatedKeys.add(k)));\n return documentBuffer.getEntries(txn, updatedKeys).next(existingDocs => {\n let changedDocs = mutableDocumentMap();\n documents.forEach((key, doc) => {\n const existingDoc = existingDocs.get(key)!;\n const docReadTime = documentVersions?.get(key) || globalVersion;\n\n // Note: The order of the steps below is important, since we want\n // to ensure that rejected limbo resolutions (which fabricate\n // NoDocuments with SnapshotVersion.min()) never add documents to\n // cache.\n if (doc.isNoDocument() && doc.version.isEqual(SnapshotVersion.min())) {\n // NoDocuments with SnapshotVersion.min() are used in manufactured\n // events. We remove these documents from cache since we lost\n // access.\n documentBuffer.removeEntry(key, docReadTime);\n changedDocs = changedDocs.insert(key, doc);\n } else if (\n !existingDoc.isValidDocument() ||\n doc.version.compareTo(existingDoc.version) > 0 ||\n (doc.version.compareTo(existingDoc.version) === 0 &&\n existingDoc.hasPendingWrites)\n ) {\n debugAssert(\n !SnapshotVersion.min().isEqual(docReadTime),\n 'Cannot add a document when the remote version is zero'\n );\n documentBuffer.addEntry(doc, docReadTime);\n changedDocs = changedDocs.insert(key, doc);\n } else {\n logDebug(\n LOG_TAG,\n 'Ignoring outdated watch update for ',\n key,\n '. Current version:',\n existingDoc.version,\n ' Watch version:',\n doc.version\n );\n }\n });\n return changedDocs;\n });\n}\n\n/**\n * Returns true if the newTargetData should be persisted during an update of\n * an active target. TargetData should always be persisted when a target is\n * being released and should not call this function.\n *\n * While the target is active, TargetData updates can be omitted when nothing\n * about the target has changed except metadata like the resume token or\n * snapshot version. Occasionally it's worth the extra write to prevent these\n * values from getting too stale after a crash, but this doesn't have to be\n * too frequent.\n */\nfunction shouldPersistTargetData(\n oldTargetData: TargetData,\n newTargetData: TargetData,\n change: TargetChange\n): boolean {\n hardAssert(\n newTargetData.resumeToken.approximateByteSize() > 0,\n 'Attempted to persist target data with no resume token'\n );\n\n // Always persist target data if we don't already have a resume token.\n if (oldTargetData.resumeToken.approximateByteSize() === 0) {\n return true;\n }\n\n // Don't allow resume token changes to be buffered indefinitely. This\n // allows us to be reasonably up-to-date after a crash and avoids needing\n // to loop over all active queries on shutdown. Especially in the browser\n // we may not get time to do anything interesting while the current tab is\n // closing.\n const timeDelta =\n newTargetData.snapshotVersion.toMicroseconds() -\n oldTargetData.snapshotVersion.toMicroseconds();\n if (timeDelta >= RESUME_TOKEN_MAX_AGE_MICROS) {\n return true;\n }\n\n // Otherwise if the only thing that has changed about a target is its resume\n // token it's not worth persisting. Note that the RemoteStore keeps an\n // in-memory view of the currently active targets which includes the current\n // resume token, so stream failure or user changes will still use an\n // up-to-date resume token regardless of what we do here.\n const changes =\n change.addedDocuments.size +\n change.modifiedDocuments.size +\n change.removedDocuments.size;\n return changes > 0;\n}\n\n/**\n * Notifies local store of the changed views to locally pin documents.\n */\nexport async function localStoreNotifyLocalViewChanges(\n localStore: LocalStore,\n viewChanges: LocalViewChanges[]\n): Promise<void> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n try {\n await localStoreImpl.persistence.runTransaction(\n 'notifyLocalViewChanges',\n 'readwrite',\n txn => {\n return PersistencePromise.forEach(\n viewChanges,\n (viewChange: LocalViewChanges) => {\n return PersistencePromise.forEach(\n viewChange.addedKeys,\n (key: DocumentKey) =>\n localStoreImpl.persistence.referenceDelegate.addReference(\n txn,\n viewChange.targetId,\n key\n )\n ).next(() =>\n PersistencePromise.forEach(\n viewChange.removedKeys,\n (key: DocumentKey) =>\n localStoreImpl.persistence.referenceDelegate.removeReference(\n txn,\n viewChange.targetId,\n key\n )\n )\n );\n }\n );\n }\n );\n } catch (e) {\n if (isIndexedDbTransactionError(e)) {\n // If `notifyLocalViewChanges` fails, we did not advance the sequence\n // number for the documents that were included in this transaction.\n // This might trigger them to be deleted earlier than they otherwise\n // would have, but it should not invalidate the integrity of the data.\n logDebug(LOG_TAG, 'Failed to update sequence numbers: ' + e);\n } else {\n throw e;\n }\n }\n\n for (const viewChange of viewChanges) {\n const targetId = viewChange.targetId;\n\n if (!viewChange.fromCache) {\n const targetData = localStoreImpl.targetDataByTarget.get(targetId);\n debugAssert(\n targetData !== null,\n `Can't set limbo-free snapshot version for unknown target: ${targetId}`\n );\n\n // Advance the last limbo free snapshot version\n const lastLimboFreeSnapshotVersion = targetData.snapshotVersion;\n const updatedTargetData = targetData.withLastLimboFreeSnapshotVersion(\n lastLimboFreeSnapshotVersion\n );\n localStoreImpl.targetDataByTarget = localStoreImpl.targetDataByTarget.insert(\n targetId,\n updatedTargetData\n );\n }\n }\n}\n\n/**\n * Gets the mutation batch after the passed in batchId in the mutation queue\n * or null if empty.\n * @param afterBatchId - If provided, the batch to search after.\n * @returns The next mutation or null if there wasn't one.\n */\nexport function localStoreGetNextMutationBatch(\n localStore: LocalStore,\n afterBatchId?: BatchId\n): Promise<MutationBatch | null> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Get next mutation batch',\n 'readonly',\n txn => {\n if (afterBatchId === undefined) {\n afterBatchId = BATCHID_UNKNOWN;\n }\n return localStoreImpl.mutationQueue.getNextMutationBatchAfterBatchId(\n txn,\n afterBatchId\n );\n }\n );\n}\n\n/**\n * Reads the current value of a Document with a given key or null if not\n * found - used for testing.\n */\nexport function localStoreReadDocument(\n localStore: LocalStore,\n key: DocumentKey\n): Promise<Document> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'read document',\n 'readonly',\n txn => localStoreImpl.localDocuments.getDocument(txn, key)\n );\n}\n\n/**\n * Assigns the given target an internal ID so that its results can be pinned so\n * they don't get GC'd. A target must be allocated in the local store before\n * the store can be used to manage its view.\n *\n * Allocating an already allocated `Target` will return the existing `TargetData`\n * for that `Target`.\n */\nexport function localStoreAllocateTarget(\n localStore: LocalStore,\n target: Target\n): Promise<TargetData> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence\n .runTransaction('Allocate target', 'readwrite', txn => {\n let targetData: TargetData;\n return localStoreImpl.targetCache\n .getTargetData(txn, target)\n .next((cached: TargetData | null) => {\n if (cached) {\n // This target has been listened to previously, so reuse the\n // previous targetID.\n // TODO(mcg): freshen last accessed date?\n targetData = cached;\n return PersistencePromise.resolve(targetData);\n } else {\n return localStoreImpl.targetCache\n .allocateTargetId(txn)\n .next(targetId => {\n targetData = new TargetData(\n target,\n targetId,\n TargetPurpose.Listen,\n txn.currentSequenceNumber\n );\n return localStoreImpl.targetCache\n .addTargetData(txn, targetData)\n .next(() => targetData);\n });\n }\n });\n })\n .then(targetData => {\n // If Multi-Tab is enabled, the existing target data may be newer than\n // the in-memory data\n const cachedTargetData = localStoreImpl.targetDataByTarget.get(\n targetData.targetId\n );\n if (\n cachedTargetData === null ||\n targetData.snapshotVersion.compareTo(cachedTargetData.snapshotVersion) >\n 0\n ) {\n localStoreImpl.targetDataByTarget = localStoreImpl.targetDataByTarget.insert(\n targetData.targetId,\n targetData\n );\n localStoreImpl.targetIdByTarget.set(target, targetData.targetId);\n }\n return targetData;\n });\n}\n\n/**\n * Returns the TargetData as seen by the LocalStore, including updates that may\n * have not yet been persisted to the TargetCache.\n */\n// Visible for testing.\nexport function localStoreGetTargetData(\n localStore: LocalStore,\n transaction: PersistenceTransaction,\n target: Target\n): PersistencePromise<TargetData | null> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const targetId = localStoreImpl.targetIdByTarget.get(target);\n if (targetId !== undefined) {\n return PersistencePromise.resolve<TargetData | null>(\n localStoreImpl.targetDataByTarget.get(targetId)\n );\n } else {\n return localStoreImpl.targetCache.getTargetData(transaction, target);\n }\n}\n\n/**\n * Unpins all the documents associated with the given target. If\n * `keepPersistedTargetData` is set to false and Eager GC enabled, the method\n * directly removes the associated target data from the target cache.\n *\n * Releasing a non-existing `Target` is a no-op.\n */\n// PORTING NOTE: `keepPersistedTargetData` is multi-tab only.\nexport async function localStoreReleaseTarget(\n localStore: LocalStore,\n targetId: number,\n keepPersistedTargetData: boolean\n): Promise<void> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const targetData = localStoreImpl.targetDataByTarget.get(targetId);\n debugAssert(\n targetData !== null,\n `Tried to release nonexistent target: ${targetId}`\n );\n\n const mode = keepPersistedTargetData ? 'readwrite' : 'readwrite-primary';\n\n try {\n if (!keepPersistedTargetData) {\n await localStoreImpl.persistence.runTransaction(\n 'Release target',\n mode,\n txn => {\n return localStoreImpl.persistence.referenceDelegate.removeTarget(\n txn,\n targetData!\n );\n }\n );\n }\n } catch (e) {\n if (isIndexedDbTransactionError(e)) {\n // All `releaseTarget` does is record the final metadata state for the\n // target, but we've been recording this periodically during target\n // activity. If we lose this write this could cause a very slight\n // difference in the order of target deletion during GC, but we\n // don't define exact LRU semantics so this is acceptable.\n logDebug(\n LOG_TAG,\n `Failed to update sequence numbers for target ${targetId}: ${e}`\n );\n } else {\n throw e;\n }\n }\n\n localStoreImpl.targetDataByTarget = localStoreImpl.targetDataByTarget.remove(\n targetId\n );\n localStoreImpl.targetIdByTarget.delete(targetData!.target);\n}\n\n/**\n * Runs the specified query against the local store and returns the results,\n * potentially taking advantage of query data from previous executions (such\n * as the set of remote keys).\n *\n * @param usePreviousResults - Whether results from previous executions can\n * be used to optimize this query execution.\n */\nexport function localStoreExecuteQuery(\n localStore: LocalStore,\n query: Query,\n usePreviousResults: boolean\n): Promise<QueryResult> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n let lastLimboFreeSnapshotVersion = SnapshotVersion.min();\n let remoteKeys = documentKeySet();\n\n return localStoreImpl.persistence.runTransaction(\n 'Execute query',\n 'readonly',\n txn => {\n return localStoreGetTargetData(localStoreImpl, txn, queryToTarget(query))\n .next(targetData => {\n if (targetData) {\n lastLimboFreeSnapshotVersion =\n targetData.lastLimboFreeSnapshotVersion;\n return localStoreImpl.targetCache\n .getMatchingKeysForTargetId(txn, targetData.targetId)\n .next(result => {\n remoteKeys = result;\n });\n }\n })\n .next(() =>\n localStoreImpl.queryEngine.getDocumentsMatchingQuery(\n txn,\n query,\n usePreviousResults\n ? lastLimboFreeSnapshotVersion\n : SnapshotVersion.min(),\n usePreviousResults ? remoteKeys : documentKeySet()\n )\n )\n .next(documents => {\n return { documents, remoteKeys };\n });\n }\n );\n}\n\nfunction applyWriteToRemoteDocuments(\n localStoreImpl: LocalStoreImpl,\n txn: PersistenceTransaction,\n batchResult: MutationBatchResult,\n documentBuffer: RemoteDocumentChangeBuffer\n): PersistencePromise<void> {\n const batch = batchResult.batch;\n const docKeys = batch.keys();\n let promiseChain = PersistencePromise.resolve();\n docKeys.forEach(docKey => {\n promiseChain = promiseChain\n .next(() => documentBuffer.getEntry(txn, docKey))\n .next(doc => {\n const ackVersion = batchResult.docVersions.get(docKey);\n hardAssert(\n ackVersion !== null,\n 'ackVersions should contain every doc in the write.'\n );\n if (doc.version.compareTo(ackVersion!) < 0) {\n batch.applyToRemoteDocument(doc, batchResult);\n if (doc.isValidDocument()) {\n // We use the commitVersion as the readTime rather than the\n // document's updateTime since the updateTime is not advanced\n // for updates that do not modify the underlying document.\n documentBuffer.addEntry(doc, batchResult.commitVersion);\n }\n }\n });\n });\n return promiseChain.next(() =>\n localStoreImpl.mutationQueue.removeMutationBatch(txn, batch)\n );\n}\n\n/** Returns the local view of the documents affected by a mutation batch. */\n// PORTING NOTE: Multi-Tab only.\nexport function localStoreLookupMutationDocuments(\n localStore: LocalStore,\n batchId: BatchId\n): Promise<DocumentMap | null> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const mutationQueueImpl = debugCast(\n localStoreImpl.mutationQueue,\n IndexedDbMutationQueue // We only support IndexedDb in multi-tab mode.\n );\n return localStoreImpl.persistence.runTransaction(\n 'Lookup mutation documents',\n 'readonly',\n txn => {\n return mutationQueueImpl.lookupMutationKeys(txn, batchId).next(keys => {\n if (keys) {\n return localStoreImpl.localDocuments.getDocuments(\n txn,\n keys\n ) as PersistencePromise<DocumentMap | null>;\n } else {\n return PersistencePromise.resolve<DocumentMap | null>(null);\n }\n });\n }\n );\n}\n\n// PORTING NOTE: Multi-Tab only.\nexport function localStoreRemoveCachedMutationBatchMetadata(\n localStore: LocalStore,\n batchId: BatchId\n): void {\n const mutationQueueImpl = debugCast(\n debugCast(localStore, LocalStoreImpl).mutationQueue,\n IndexedDbMutationQueue // We only support IndexedDb in multi-tab mode.\n );\n mutationQueueImpl.removeCachedMutationKeys(batchId);\n}\n\n// PORTING NOTE: Multi-Tab only.\nexport function localStoreGetActiveClients(\n localStore: LocalStore\n): Promise<ClientId[]> {\n const persistenceImpl = debugCast(\n debugCast(localStore, LocalStoreImpl).persistence,\n IndexedDbPersistence // We only support IndexedDb in multi-tab mode.\n );\n return persistenceImpl.getActiveClients();\n}\n\n// PORTING NOTE: Multi-Tab only.\nexport function localStoreGetCachedTarget(\n localStore: LocalStore,\n targetId: TargetId\n): Promise<Target | null> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const targetCacheImpl = debugCast(\n localStoreImpl.targetCache,\n IndexedDbTargetCache // We only support IndexedDb in multi-tab mode.\n );\n const cachedTargetData = localStoreImpl.targetDataByTarget.get(targetId);\n if (cachedTargetData) {\n return Promise.resolve(cachedTargetData.target);\n } else {\n return localStoreImpl.persistence.runTransaction(\n 'Get target data',\n 'readonly',\n txn => {\n return targetCacheImpl\n .getTargetDataForTarget(txn, targetId)\n .next(targetData => (targetData ? targetData.target : null));\n }\n );\n }\n}\n\n/**\n * Returns the set of documents that have been updated since the last call.\n * If this is the first call, returns the set of changes since client\n * initialization. Further invocations will return document that have changed\n * since the prior call.\n */\n// PORTING NOTE: Multi-Tab only.\nexport function localStoreGetNewDocumentChanges(\n localStore: LocalStore\n): Promise<DocumentMap> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence\n .runTransaction('Get new document changes', 'readonly', txn =>\n remoteDocumentCacheGetNewDocumentChanges(\n localStoreImpl.remoteDocuments,\n txn,\n localStoreImpl.lastDocumentChangeReadTime\n )\n )\n .then(({ changedDocs, readTime }) => {\n localStoreImpl.lastDocumentChangeReadTime = readTime;\n return changedDocs;\n });\n}\n\n/**\n * Reads the newest document change from persistence and moves the internal\n * synchronization marker forward so that calls to `getNewDocumentChanges()`\n * only return changes that happened after client initialization.\n */\n// PORTING NOTE: Multi-Tab only.\nexport async function localStoreSynchronizeLastDocumentChangeReadTime(\n localStore: LocalStore\n): Promise<void> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence\n .runTransaction(\n 'Synchronize last document change read time',\n 'readonly',\n txn => remoteDocumentCacheGetLastReadTime(txn)\n )\n .then(readTime => {\n localStoreImpl.lastDocumentChangeReadTime = readTime;\n });\n}\n\n/**\n * Creates a new target using the given bundle name, which will be used to\n * hold the keys of all documents from the bundle in query-document mappings.\n * This ensures that the loaded documents do not get garbage collected\n * right away.\n */\nfunction umbrellaTarget(bundleName: string): Target {\n // It is OK that the path used for the query is not valid, because this will\n // not be read and queried.\n return queryToTarget(\n newQueryForPath(ResourcePath.fromString(`__bundle__/docs/${bundleName}`))\n );\n}\n\n/**\n * Applies the documents from a bundle to the \"ground-state\" (remote)\n * documents.\n *\n * LocalDocuments are re-calculated if there are remaining mutations in the\n * queue.\n */\nexport async function localStoreApplyBundledDocuments(\n localStore: LocalStore,\n bundleConverter: BundleConverter,\n documents: BundledDocuments,\n bundleName: string\n): Promise<DocumentMap> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n let documentKeys = documentKeySet();\n let documentMap = mutableDocumentMap();\n let versionMap = documentVersionMap();\n for (const bundleDoc of documents) {\n const documentKey = bundleConverter.toDocumentKey(bundleDoc.metadata.name!);\n if (bundleDoc.document) {\n documentKeys = documentKeys.add(documentKey);\n }\n documentMap = documentMap.insert(\n documentKey,\n bundleConverter.toMutableDocument(bundleDoc)\n );\n versionMap = versionMap.insert(\n documentKey,\n bundleConverter.toSnapshotVersion(bundleDoc.metadata.readTime!)\n );\n }\n\n const documentBuffer = localStoreImpl.remoteDocuments.newChangeBuffer({\n trackRemovals: true // Make sure document removals show up in `getNewDocumentChanges()`\n });\n\n // Allocates a target to hold all document keys from the bundle, such that\n // they will not get garbage collected right away.\n const umbrellaTargetData = await localStoreAllocateTarget(\n localStoreImpl,\n umbrellaTarget(bundleName)\n );\n return localStoreImpl.persistence.runTransaction(\n 'Apply bundle documents',\n 'readwrite',\n txn => {\n return populateDocumentChangeBuffer(\n txn,\n documentBuffer,\n documentMap,\n SnapshotVersion.min(),\n versionMap\n )\n .next(changedDocs => {\n documentBuffer.apply(txn);\n return changedDocs;\n })\n .next(changedDocs => {\n return localStoreImpl.targetCache\n .removeMatchingKeysForTargetId(txn, umbrellaTargetData.targetId)\n .next(() =>\n localStoreImpl.targetCache.addMatchingKeys(\n txn,\n documentKeys,\n umbrellaTargetData.targetId\n )\n )\n .next(() =>\n localStoreImpl.localDocuments.applyLocalViewToDocuments(\n txn,\n changedDocs\n )\n )\n .next(() => changedDocs);\n });\n }\n );\n}\n\n/**\n * Returns a promise of a boolean to indicate if the given bundle has already\n * been loaded and the create time is newer than the current loading bundle.\n */\nexport function localStoreHasNewerBundle(\n localStore: LocalStore,\n bundleMetadata: BundleMetadata\n): Promise<boolean> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const currentReadTime = fromVersion(bundleMetadata.createTime!);\n return localStoreImpl.persistence\n .runTransaction('hasNewerBundle', 'readonly', transaction => {\n return localStoreImpl.bundleCache.getBundleMetadata(\n transaction,\n bundleMetadata.id!\n );\n })\n .then(cached => {\n return !!cached && cached.createTime!.compareTo(currentReadTime) >= 0;\n });\n}\n\n/**\n * Saves the given `BundleMetadata` to local persistence.\n */\nexport function localStoreSaveBundle(\n localStore: LocalStore,\n bundleMetadata: BundleMetadata\n): Promise<void> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Save bundle',\n 'readwrite',\n transaction => {\n return localStoreImpl.bundleCache.saveBundleMetadata(\n transaction,\n bundleMetadata\n );\n }\n );\n}\n\n/**\n * Returns a promise of a `NamedQuery` associated with given query name. Promise\n * resolves to undefined if no persisted data can be found.\n */\nexport function localStoreGetNamedQuery(\n localStore: LocalStore,\n queryName: string\n): Promise<NamedQuery | undefined> {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Get named query',\n 'readonly',\n transaction =>\n localStoreImpl.bundleCache.getNamedQuery(transaction, queryName)\n );\n}\n\n/**\n * Saves the given `NamedQuery` to local persistence.\n */\nexport async function localStoreSaveNamedQuery(\n localStore: LocalStore,\n query: ProtoNamedQuery,\n documents: DocumentKeySet = documentKeySet()\n): Promise<void> {\n // Allocate a target for the named query such that it can be resumed\n // from associated read time if users use it to listen.\n // NOTE: this also means if no corresponding target exists, the new target\n // will remain active and will not get collected, unless users happen to\n // unlisten the query somehow.\n const allocated = await localStoreAllocateTarget(\n localStore,\n queryToTarget(fromBundledQuery(query.bundledQuery!))\n );\n\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Save named query',\n 'readwrite',\n transaction => {\n const readTime = fromVersion(query.readTime!);\n // Simply save the query itself if it is older than what the SDK already\n // has.\n if (allocated.snapshotVersion.compareTo(readTime) >= 0) {\n return localStoreImpl.bundleCache.saveNamedQuery(transaction, query);\n }\n\n // Update existing target data because the query from the bundle is newer.\n const newTargetData = allocated.withResumeToken(\n ByteString.EMPTY_BYTE_STRING,\n readTime\n );\n localStoreImpl.targetDataByTarget = localStoreImpl.targetDataByTarget.insert(\n newTargetData.targetId,\n newTargetData\n );\n return localStoreImpl.targetCache\n .updateTargetData(transaction, newTargetData)\n .next(() =>\n localStoreImpl.targetCache.removeMatchingKeysForTargetId(\n transaction,\n allocated.targetId\n )\n )\n .next(() =>\n localStoreImpl.targetCache.addMatchingKeys(\n transaction,\n documents,\n allocated.targetId\n )\n )\n .next(() =>\n localStoreImpl.bundleCache.saveNamedQuery(transaction, query)\n );\n }\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BundleMetadata, NamedQuery } from '../core/bundle';\nimport {\n NamedQuery as ProtoNamedQuery,\n BundleMetadata as ProtoBundleMetadata\n} from '../protos/firestore_bundle_proto';\n\nimport { BundleCache } from './bundle_cache';\nimport {\n fromBundleMetadata,\n fromProtoNamedQuery,\n LocalSerializer\n} from './local_serializer';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\n\nexport class MemoryBundleCache implements BundleCache {\n private bundles = new Map<string, BundleMetadata>();\n private namedQueries = new Map<string, NamedQuery>();\n\n constructor(private serializer: LocalSerializer) {}\n\n getBundleMetadata(\n transaction: PersistenceTransaction,\n bundleId: string\n ): PersistencePromise<BundleMetadata | undefined> {\n return PersistencePromise.resolve(this.bundles.get(bundleId));\n }\n\n saveBundleMetadata(\n transaction: PersistenceTransaction,\n bundleMetadata: ProtoBundleMetadata\n ): PersistencePromise<void> {\n this.bundles.set(bundleMetadata.id!, fromBundleMetadata(bundleMetadata));\n return PersistencePromise.resolve();\n }\n\n getNamedQuery(\n transaction: PersistenceTransaction,\n queryName: string\n ): PersistencePromise<NamedQuery | undefined> {\n return PersistencePromise.resolve(this.namedQueries.get(queryName));\n }\n\n saveNamedQuery(\n transaction: PersistenceTransaction,\n query: ProtoNamedQuery\n ): PersistencePromise<void> {\n this.namedQueries.set(query.name!, fromProtoNamedQuery(query));\n return PersistencePromise.resolve();\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BatchId, TargetId } from '../core/types';\nimport { documentKeySet, DocumentKeySet } from '../model/collections';\nimport { DocumentKey } from '../model/document_key';\nimport { ResourcePath } from '../model/path';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedSet } from '../util/sorted_set';\n\n/**\n * A collection of references to a document from some kind of numbered entity\n * (either a target ID or batch ID). As references are added to or removed from\n * the set corresponding events are emitted to a registered garbage collector.\n *\n * Each reference is represented by a DocumentReference object. Each of them\n * contains enough information to uniquely identify the reference. They are all\n * stored primarily in a set sorted by key. A document is considered garbage if\n * there's no references in that set (this can be efficiently checked thanks to\n * sorting by key).\n *\n * ReferenceSet also keeps a secondary set that contains references sorted by\n * IDs. This one is used to efficiently implement removal of all references by\n * some target ID.\n */\nexport class ReferenceSet {\n // A set of outstanding references to a document sorted by key.\n private refsByKey = new SortedSet(DocReference.compareByKey);\n\n // A set of outstanding references to a document sorted by target id.\n private refsByTarget = new SortedSet(DocReference.compareByTargetId);\n\n /** Returns true if the reference set contains no references. */\n isEmpty(): boolean {\n return this.refsByKey.isEmpty();\n }\n\n /** Adds a reference to the given document key for the given ID. */\n addReference(key: DocumentKey, id: TargetId | BatchId): void {\n const ref = new DocReference(key, id);\n this.refsByKey = this.refsByKey.add(ref);\n this.refsByTarget = this.refsByTarget.add(ref);\n }\n\n /** Add references to the given document keys for the given ID. */\n addReferences(keys: DocumentKeySet, id: TargetId | BatchId): void {\n keys.forEach(key => this.addReference(key, id));\n }\n\n /**\n * Removes a reference to the given document key for the given\n * ID.\n */\n removeReference(key: DocumentKey, id: TargetId | BatchId): void {\n this.removeRef(new DocReference(key, id));\n }\n\n removeReferences(keys: DocumentKeySet, id: TargetId | BatchId): void {\n keys.forEach(key => this.removeReference(key, id));\n }\n\n /**\n * Clears all references with a given ID. Calls removeRef() for each key\n * removed.\n */\n removeReferencesForId(id: TargetId | BatchId): DocumentKey[] {\n const emptyKey = new DocumentKey(new ResourcePath([]));\n const startRef = new DocReference(emptyKey, id);\n const endRef = new DocReference(emptyKey, id + 1);\n const keys: DocumentKey[] = [];\n this.refsByTarget.forEachInRange([startRef, endRef], ref => {\n this.removeRef(ref);\n keys.push(ref.key);\n });\n return keys;\n }\n\n removeAllReferences(): void {\n this.refsByKey.forEach(ref => this.removeRef(ref));\n }\n\n private removeRef(ref: DocReference): void {\n this.refsByKey = this.refsByKey.delete(ref);\n this.refsByTarget = this.refsByTarget.delete(ref);\n }\n\n referencesForId(id: TargetId | BatchId): DocumentKeySet {\n const emptyKey = new DocumentKey(new ResourcePath([]));\n const startRef = new DocReference(emptyKey, id);\n const endRef = new DocReference(emptyKey, id + 1);\n let keys = documentKeySet();\n this.refsByTarget.forEachInRange([startRef, endRef], ref => {\n keys = keys.add(ref.key);\n });\n return keys;\n }\n\n containsKey(key: DocumentKey): boolean {\n const ref = new DocReference(key, 0);\n const firstRef = this.refsByKey.firstAfterOrEqual(ref);\n return firstRef !== null && key.isEqual(firstRef.key);\n }\n}\n\nexport class DocReference {\n constructor(\n public key: DocumentKey,\n public targetOrBatchId: TargetId | BatchId\n ) {}\n\n /** Compare by key then by ID */\n static compareByKey(left: DocReference, right: DocReference): number {\n return (\n DocumentKey.comparator(left.key, right.key) ||\n primitiveComparator(left.targetOrBatchId, right.targetOrBatchId)\n );\n }\n\n /** Compare by ID then by key */\n static compareByTargetId(left: DocReference, right: DocReference): number {\n return (\n primitiveComparator(left.targetOrBatchId, right.targetOrBatchId) ||\n DocumentKey.comparator(left.key, right.key)\n );\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isCollectionGroupQuery, Query } from '../core/query';\nimport { BatchId } from '../core/types';\nimport { Timestamp } from '../lite/timestamp';\nimport { DocumentKey } from '../model/document_key';\nimport { Mutation } from '../model/mutation';\nimport { MutationBatch } from '../model/mutation_batch';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\nimport { BATCHID_UNKNOWN } from '../util/types';\n\nimport { IndexManager } from './index_manager';\nimport { MutationQueue } from './mutation_queue';\nimport { ReferenceDelegate } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { DocReference } from './reference_set';\n\nexport class MemoryMutationQueue implements MutationQueue {\n /**\n * The set of all mutations that have been sent but not yet been applied to\n * the backend.\n */\n private mutationQueue: MutationBatch[] = [];\n\n /** Next value to use when assigning sequential IDs to each mutation batch. */\n private nextBatchId: BatchId = 1;\n\n /** An ordered mapping between documents and the mutations batch IDs. */\n private batchesByDocumentKey = new SortedSet(DocReference.compareByKey);\n\n constructor(\n private readonly indexManager: IndexManager,\n private readonly referenceDelegate: ReferenceDelegate\n ) {}\n\n checkEmpty(transaction: PersistenceTransaction): PersistencePromise<boolean> {\n return PersistencePromise.resolve(this.mutationQueue.length === 0);\n }\n\n addMutationBatch(\n transaction: PersistenceTransaction,\n localWriteTime: Timestamp,\n baseMutations: Mutation[],\n mutations: Mutation[]\n ): PersistencePromise<MutationBatch> {\n debugAssert(mutations.length !== 0, 'Mutation batches should not be empty');\n\n const batchId = this.nextBatchId;\n this.nextBatchId++;\n\n if (this.mutationQueue.length > 0) {\n const prior = this.mutationQueue[this.mutationQueue.length - 1];\n debugAssert(\n prior.batchId < batchId,\n 'Mutation batchIDs must be monotonically increasing order'\n );\n }\n\n const batch = new MutationBatch(\n batchId,\n localWriteTime,\n baseMutations,\n mutations\n );\n this.mutationQueue.push(batch);\n\n // Track references by document key and index collection parents.\n for (const mutation of mutations) {\n this.batchesByDocumentKey = this.batchesByDocumentKey.add(\n new DocReference(mutation.key, batchId)\n );\n\n this.indexManager.addToCollectionParentIndex(\n transaction,\n mutation.key.path.popLast()\n );\n }\n\n return PersistencePromise.resolve(batch);\n }\n\n lookupMutationBatch(\n transaction: PersistenceTransaction,\n batchId: BatchId\n ): PersistencePromise<MutationBatch | null> {\n return PersistencePromise.resolve(this.findMutationBatch(batchId));\n }\n\n getNextMutationBatchAfterBatchId(\n transaction: PersistenceTransaction,\n batchId: BatchId\n ): PersistencePromise<MutationBatch | null> {\n const nextBatchId = batchId + 1;\n\n // The requested batchId may still be out of range so normalize it to the\n // start of the queue.\n const rawIndex = this.indexOfBatchId(nextBatchId);\n const index = rawIndex < 0 ? 0 : rawIndex;\n return PersistencePromise.resolve(\n this.mutationQueue.length > index ? this.mutationQueue[index] : null\n );\n }\n\n getHighestUnacknowledgedBatchId(): PersistencePromise<BatchId> {\n return PersistencePromise.resolve(\n this.mutationQueue.length === 0 ? BATCHID_UNKNOWN : this.nextBatchId - 1\n );\n }\n\n getAllMutationBatches(\n transaction: PersistenceTransaction\n ): PersistencePromise<MutationBatch[]> {\n return PersistencePromise.resolve(this.mutationQueue.slice());\n }\n\n getAllMutationBatchesAffectingDocumentKey(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise<MutationBatch[]> {\n const start = new DocReference(documentKey, 0);\n const end = new DocReference(documentKey, Number.POSITIVE_INFINITY);\n const result: MutationBatch[] = [];\n this.batchesByDocumentKey.forEachInRange([start, end], ref => {\n debugAssert(\n documentKey.isEqual(ref.key),\n \"Should only iterate over a single key's batches\"\n );\n const batch = this.findMutationBatch(ref.targetOrBatchId);\n debugAssert(\n batch !== null,\n 'Batches in the index must exist in the main table'\n );\n result.push(batch!);\n });\n\n return PersistencePromise.resolve(result);\n }\n\n getAllMutationBatchesAffectingDocumentKeys(\n transaction: PersistenceTransaction,\n documentKeys: SortedMap<DocumentKey, unknown>\n ): PersistencePromise<MutationBatch[]> {\n let uniqueBatchIDs = new SortedSet<number>(primitiveComparator);\n\n documentKeys.forEach(documentKey => {\n const start = new DocReference(documentKey, 0);\n const end = new DocReference(documentKey, Number.POSITIVE_INFINITY);\n this.batchesByDocumentKey.forEachInRange([start, end], ref => {\n debugAssert(\n documentKey.isEqual(ref.key),\n \"For each key, should only iterate over a single key's batches\"\n );\n\n uniqueBatchIDs = uniqueBatchIDs.add(ref.targetOrBatchId);\n });\n });\n\n return PersistencePromise.resolve(this.findMutationBatches(uniqueBatchIDs));\n }\n\n getAllMutationBatchesAffectingQuery(\n transaction: PersistenceTransaction,\n query: Query\n ): PersistencePromise<MutationBatch[]> {\n debugAssert(\n !isCollectionGroupQuery(query),\n 'CollectionGroup queries should be handled in LocalDocumentsView'\n );\n // Use the query path as a prefix for testing if a document matches the\n // query.\n const prefix = query.path;\n const immediateChildrenPathLength = prefix.length + 1;\n\n // Construct a document reference for actually scanning the index. Unlike\n // the prefix the document key in this reference must have an even number of\n // segments. The empty segment can be used a suffix of the query path\n // because it precedes all other segments in an ordered traversal.\n let startPath = prefix;\n if (!DocumentKey.isDocumentKey(startPath)) {\n startPath = startPath.child('');\n }\n\n const start = new DocReference(new DocumentKey(startPath), 0);\n\n // Find unique batchIDs referenced by all documents potentially matching the\n // query.\n let uniqueBatchIDs = new SortedSet<number>(primitiveComparator);\n\n this.batchesByDocumentKey.forEachWhile(ref => {\n const rowKeyPath = ref.key.path;\n if (!prefix.isPrefixOf(rowKeyPath)) {\n return false;\n } else {\n // Rows with document keys more than one segment longer than the query\n // path can't be matches. For example, a query on 'rooms' can't match\n // the document /rooms/abc/messages/xyx.\n // TODO(mcg): we'll need a different scanner when we implement\n // ancestor queries.\n if (rowKeyPath.length === immediateChildrenPathLength) {\n uniqueBatchIDs = uniqueBatchIDs.add(ref.targetOrBatchId);\n }\n return true;\n }\n }, start);\n\n return PersistencePromise.resolve(this.findMutationBatches(uniqueBatchIDs));\n }\n\n private findMutationBatches(batchIDs: SortedSet<number>): MutationBatch[] {\n // Construct an array of matching batches, sorted by batchID to ensure that\n // multiple mutations affecting the same document key are applied in order.\n const result: MutationBatch[] = [];\n batchIDs.forEach(batchId => {\n const batch = this.findMutationBatch(batchId);\n if (batch !== null) {\n result.push(batch);\n }\n });\n return result;\n }\n\n removeMutationBatch(\n transaction: PersistenceTransaction,\n batch: MutationBatch\n ): PersistencePromise<void> {\n // Find the position of the first batch for removal.\n const batchIndex = this.indexOfExistingBatchId(batch.batchId, 'removed');\n hardAssert(\n batchIndex === 0,\n 'Can only remove the first entry of the mutation queue'\n );\n this.mutationQueue.shift();\n\n let references = this.batchesByDocumentKey;\n return PersistencePromise.forEach(batch.mutations, (mutation: Mutation) => {\n const ref = new DocReference(mutation.key, batch.batchId);\n references = references.delete(ref);\n return this.referenceDelegate.markPotentiallyOrphaned(\n transaction,\n mutation.key\n );\n }).next(() => {\n this.batchesByDocumentKey = references;\n });\n }\n\n removeCachedMutationKeys(batchId: BatchId): void {\n // No-op since the memory mutation queue does not maintain a separate cache.\n }\n\n containsKey(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<boolean> {\n const ref = new DocReference(key, 0);\n const firstRef = this.batchesByDocumentKey.firstAfterOrEqual(ref);\n return PersistencePromise.resolve(key.isEqual(firstRef && firstRef.key));\n }\n\n performConsistencyCheck(\n txn: PersistenceTransaction\n ): PersistencePromise<void> {\n if (this.mutationQueue.length === 0) {\n debugAssert(\n this.batchesByDocumentKey.isEmpty(),\n 'Document leak -- detected dangling mutation references when queue is empty.'\n );\n }\n return PersistencePromise.resolve();\n }\n\n /**\n * Finds the index of the given batchId in the mutation queue and asserts that\n * the resulting index is within the bounds of the queue.\n *\n * @param batchId - The batchId to search for\n * @param action - A description of what the caller is doing, phrased in passive\n * form (e.g. \"acknowledged\" in a routine that acknowledges batches).\n */\n private indexOfExistingBatchId(batchId: BatchId, action: string): number {\n const index = this.indexOfBatchId(batchId);\n debugAssert(\n index >= 0 && index < this.mutationQueue.length,\n 'Batches must exist to be ' + action\n );\n return index;\n }\n\n /**\n * Finds the index of the given batchId in the mutation queue. This operation\n * is O(1).\n *\n * @returns The computed index of the batch with the given batchId, based on\n * the state of the queue. Note this index can be negative if the requested\n * batchId has already been remvoed from the queue or past the end of the\n * queue if the batchId is larger than the last added batch.\n */\n private indexOfBatchId(batchId: BatchId): number {\n if (this.mutationQueue.length === 0) {\n // As an index this is past the end of the queue\n return 0;\n }\n\n // Examine the front of the queue to figure out the difference between the\n // batchId and indexes in the array. Note that since the queue is ordered\n // by batchId, if the first batch has a larger batchId then the requested\n // batchId doesn't exist in the queue.\n const firstBatchId = this.mutationQueue[0].batchId;\n return batchId - firstBatchId;\n }\n\n /**\n * A version of lookupMutationBatch that doesn't return a promise, this makes\n * other functions that uses this code easier to read and more efficent.\n */\n private findMutationBatch(batchId: BatchId): MutationBatch | null {\n const index = this.indexOfBatchId(batchId);\n if (index < 0 || index >= this.mutationQueue.length) {\n return null;\n }\n\n const batch = this.mutationQueue[index];\n debugAssert(batch.batchId === batchId, 'If found batch must match');\n return batch;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isCollectionGroupQuery, Query, queryMatches } from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport {\n DocumentKeySet,\n DocumentSizeEntry,\n MutableDocumentMap,\n mutableDocumentMap\n} from '../model/collections';\nimport { Document, MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { debugAssert } from '../util/assert';\nimport { SortedMap } from '../util/sorted_map';\n\nimport { IndexManager } from './index_manager';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { RemoteDocumentCache } from './remote_document_cache';\nimport { RemoteDocumentChangeBuffer } from './remote_document_change_buffer';\n\nexport type DocumentSizer = (doc: Document) => number;\n\n/** Miscellaneous collection types / constants. */\ninterface MemoryRemoteDocumentCacheEntry extends DocumentSizeEntry {\n readTime: SnapshotVersion;\n}\n\ntype DocumentEntryMap = SortedMap<DocumentKey, MemoryRemoteDocumentCacheEntry>;\nfunction documentEntryMap(): DocumentEntryMap {\n return new SortedMap<DocumentKey, MemoryRemoteDocumentCacheEntry>(\n DocumentKey.comparator\n );\n}\n\nexport interface MemoryRemoteDocumentCache extends RemoteDocumentCache {\n forEachDocumentKey(\n transaction: PersistenceTransaction,\n f: (key: DocumentKey) => PersistencePromise<void>\n ): PersistencePromise<void>;\n}\n\n/**\n * The memory-only RemoteDocumentCache for IndexedDb. To construct, invoke\n * `newMemoryRemoteDocumentCache()`.\n */\nclass MemoryRemoteDocumentCacheImpl implements MemoryRemoteDocumentCache {\n /** Underlying cache of documents and their read times. */\n private docs = documentEntryMap();\n\n /** Size of all cached documents. */\n private size = 0;\n\n /**\n * @param sizer - Used to assess the size of a document. For eager GC, this is\n * expected to just return 0 to avoid unnecessarily doing the work of\n * calculating the size.\n */\n constructor(\n private readonly indexManager: IndexManager,\n private readonly sizer: DocumentSizer\n ) {}\n\n /**\n * Adds the supplied entry to the cache and updates the cache size as appropriate.\n *\n * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()`.\n */\n addEntry(\n transaction: PersistenceTransaction,\n doc: MutableDocument,\n readTime: SnapshotVersion\n ): PersistencePromise<void> {\n debugAssert(\n !readTime.isEqual(SnapshotVersion.min()),\n 'Cannot add a document with a read time of zero'\n );\n\n const key = doc.key;\n const entry = this.docs.get(key);\n const previousSize = entry ? entry.size : 0;\n const currentSize = this.sizer(doc);\n\n this.docs = this.docs.insert(key, {\n document: doc.clone(),\n size: currentSize,\n readTime\n });\n\n this.size += currentSize - previousSize;\n\n return this.indexManager.addToCollectionParentIndex(\n transaction,\n key.path.popLast()\n );\n }\n\n /**\n * Removes the specified entry from the cache and updates the cache size as appropriate.\n *\n * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()`.\n */\n removeEntry(documentKey: DocumentKey): void {\n const entry = this.docs.get(documentKey);\n if (entry) {\n this.docs = this.docs.remove(documentKey);\n this.size -= entry.size;\n }\n }\n\n getEntry(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise<MutableDocument> {\n const entry = this.docs.get(documentKey);\n return PersistencePromise.resolve(\n entry\n ? entry.document.clone()\n : MutableDocument.newInvalidDocument(documentKey)\n );\n }\n\n getEntries(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise<MutableDocumentMap> {\n let results = mutableDocumentMap();\n documentKeys.forEach(documentKey => {\n const entry = this.docs.get(documentKey);\n results = results.insert(\n documentKey,\n entry\n ? entry.document.clone()\n : MutableDocument.newInvalidDocument(documentKey)\n );\n });\n return PersistencePromise.resolve(results);\n }\n\n getDocumentsMatchingQuery(\n transaction: PersistenceTransaction,\n query: Query,\n sinceReadTime: SnapshotVersion\n ): PersistencePromise<MutableDocumentMap> {\n debugAssert(\n !isCollectionGroupQuery(query),\n 'CollectionGroup queries should be handled in LocalDocumentsView'\n );\n let results = mutableDocumentMap();\n\n // Documents are ordered by key, so we can use a prefix scan to narrow down\n // the documents we need to match the query against.\n const prefix = new DocumentKey(query.path.child(''));\n const iterator = this.docs.getIteratorFrom(prefix);\n while (iterator.hasNext()) {\n const {\n key,\n value: { document, readTime }\n } = iterator.getNext();\n if (!query.path.isPrefixOf(key.path)) {\n break;\n }\n if (readTime.compareTo(sinceReadTime) <= 0) {\n continue;\n }\n if (!queryMatches(query, document)) {\n continue;\n }\n results = results.insert(document.key, document.clone());\n }\n return PersistencePromise.resolve(results);\n }\n\n forEachDocumentKey(\n transaction: PersistenceTransaction,\n f: (key: DocumentKey) => PersistencePromise<void>\n ): PersistencePromise<void> {\n return PersistencePromise.forEach(this.docs, (key: DocumentKey) => f(key));\n }\n\n newChangeBuffer(options?: {\n trackRemovals: boolean;\n }): RemoteDocumentChangeBuffer {\n // `trackRemovals` is ignores since the MemoryRemoteDocumentCache keeps\n // a separate changelog and does not need special handling for removals.\n return new MemoryRemoteDocumentChangeBuffer(this);\n }\n\n getSize(txn: PersistenceTransaction): PersistencePromise<number> {\n return PersistencePromise.resolve(this.size);\n }\n}\n\n/**\n * Creates a new memory-only RemoteDocumentCache.\n *\n * @param indexManager - A class that manages collection group indices.\n * @param sizer - Used to assess the size of a document. For eager GC, this is\n * expected to just return 0 to avoid unnecessarily doing the work of\n * calculating the size.\n */\nexport function newMemoryRemoteDocumentCache(\n indexManager: IndexManager,\n sizer: DocumentSizer\n): MemoryRemoteDocumentCache {\n return new MemoryRemoteDocumentCacheImpl(indexManager, sizer);\n}\n\n/**\n * Handles the details of adding and updating documents in the MemoryRemoteDocumentCache.\n */\nclass MemoryRemoteDocumentChangeBuffer extends RemoteDocumentChangeBuffer {\n constructor(private readonly documentCache: MemoryRemoteDocumentCacheImpl) {\n super();\n }\n\n protected applyChanges(\n transaction: PersistenceTransaction\n ): PersistencePromise<void> {\n const promises: Array<PersistencePromise<void>> = [];\n this.changes.forEach((key, doc) => {\n if (doc.document.isValidDocument()) {\n promises.push(\n this.documentCache.addEntry(\n transaction,\n doc.document,\n this.getReadTime(key)\n )\n );\n } else {\n this.documentCache.removeEntry(key);\n }\n });\n return PersistencePromise.waitFor(promises);\n }\n\n protected getFromCache(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise<MutableDocument> {\n return this.documentCache.getEntry(transaction, documentKey);\n }\n\n protected getAllFromCache(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise<MutableDocumentMap> {\n return this.documentCache.getEntries(transaction, documentKeys);\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { canonifyTarget, Target, targetEquals } from '../core/target';\nimport { TargetIdGenerator } from '../core/target_id_generator';\nimport { ListenSequenceNumber, TargetId } from '../core/types';\nimport { DocumentKeySet } from '../model/collections';\nimport { DocumentKey } from '../model/document_key';\nimport { debugAssert } from '../util/assert';\nimport { ObjectMap } from '../util/obj_map';\n\nimport { ActiveTargets } from './lru_garbage_collector';\nimport { Persistence } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { ReferenceSet } from './reference_set';\nimport { TargetCache } from './target_cache';\nimport { TargetData } from './target_data';\n\nexport class MemoryTargetCache implements TargetCache {\n /**\n * Maps a target to the data about that target\n */\n private targets = new ObjectMap<Target, TargetData>(\n t => canonifyTarget(t),\n targetEquals\n );\n\n /** The last received snapshot version. */\n private lastRemoteSnapshotVersion = SnapshotVersion.min();\n /** The highest numbered target ID encountered. */\n private highestTargetId: TargetId = 0;\n /** The highest sequence number encountered. */\n private highestSequenceNumber: ListenSequenceNumber = 0;\n /**\n * A ordered bidirectional mapping between documents and the remote target\n * IDs.\n */\n private references = new ReferenceSet();\n\n private targetCount = 0;\n\n private targetIdGenerator = TargetIdGenerator.forTargetCache();\n\n constructor(private readonly persistence: Persistence) {}\n\n forEachTarget(\n txn: PersistenceTransaction,\n f: (q: TargetData) => void\n ): PersistencePromise<void> {\n this.targets.forEach((_, targetData) => f(targetData));\n return PersistencePromise.resolve();\n }\n\n getLastRemoteSnapshotVersion(\n transaction: PersistenceTransaction\n ): PersistencePromise<SnapshotVersion> {\n return PersistencePromise.resolve(this.lastRemoteSnapshotVersion);\n }\n\n getHighestSequenceNumber(\n transaction: PersistenceTransaction\n ): PersistencePromise<ListenSequenceNumber> {\n return PersistencePromise.resolve(this.highestSequenceNumber);\n }\n\n allocateTargetId(\n transaction: PersistenceTransaction\n ): PersistencePromise<TargetId> {\n this.highestTargetId = this.targetIdGenerator.next();\n return PersistencePromise.resolve(this.highestTargetId);\n }\n\n setTargetsMetadata(\n transaction: PersistenceTransaction,\n highestListenSequenceNumber: number,\n lastRemoteSnapshotVersion?: SnapshotVersion\n ): PersistencePromise<void> {\n if (lastRemoteSnapshotVersion) {\n this.lastRemoteSnapshotVersion = lastRemoteSnapshotVersion;\n }\n if (highestListenSequenceNumber > this.highestSequenceNumber) {\n this.highestSequenceNumber = highestListenSequenceNumber;\n }\n return PersistencePromise.resolve();\n }\n\n private saveTargetData(targetData: TargetData): void {\n this.targets.set(targetData.target, targetData);\n const targetId = targetData.targetId;\n if (targetId > this.highestTargetId) {\n this.targetIdGenerator = new TargetIdGenerator(targetId);\n this.highestTargetId = targetId;\n }\n if (targetData.sequenceNumber > this.highestSequenceNumber) {\n this.highestSequenceNumber = targetData.sequenceNumber;\n }\n }\n\n addTargetData(\n transaction: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise<void> {\n debugAssert(\n !this.targets.has(targetData.target),\n 'Adding a target that already exists'\n );\n this.saveTargetData(targetData);\n this.targetCount += 1;\n return PersistencePromise.resolve();\n }\n\n updateTargetData(\n transaction: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise<void> {\n debugAssert(\n this.targets.has(targetData.target),\n 'Updating a non-existent target'\n );\n this.saveTargetData(targetData);\n return PersistencePromise.resolve();\n }\n\n removeTargetData(\n transaction: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise<void> {\n debugAssert(this.targetCount > 0, 'Removing a target from an empty cache');\n debugAssert(\n this.targets.has(targetData.target),\n 'Removing a non-existent target from the cache'\n );\n this.targets.delete(targetData.target);\n this.references.removeReferencesForId(targetData.targetId);\n this.targetCount -= 1;\n return PersistencePromise.resolve();\n }\n\n removeTargets(\n transaction: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise<number> {\n let count = 0;\n const removals: Array<PersistencePromise<void>> = [];\n this.targets.forEach((key, targetData) => {\n if (\n targetData.sequenceNumber <= upperBound &&\n activeTargetIds.get(targetData.targetId) === null\n ) {\n this.targets.delete(key);\n removals.push(\n this.removeMatchingKeysForTargetId(transaction, targetData.targetId)\n );\n count++;\n }\n });\n return PersistencePromise.waitFor(removals).next(() => count);\n }\n\n getTargetCount(\n transaction: PersistenceTransaction\n ): PersistencePromise<number> {\n return PersistencePromise.resolve(this.targetCount);\n }\n\n getTargetData(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise<TargetData | null> {\n const targetData = this.targets.get(target) || null;\n return PersistencePromise.resolve(targetData);\n }\n\n addMatchingKeys(\n txn: PersistenceTransaction,\n keys: DocumentKeySet,\n targetId: TargetId\n ): PersistencePromise<void> {\n this.references.addReferences(keys, targetId);\n return PersistencePromise.resolve();\n }\n\n removeMatchingKeys(\n txn: PersistenceTransaction,\n keys: DocumentKeySet,\n targetId: TargetId\n ): PersistencePromise<void> {\n this.references.removeReferences(keys, targetId);\n const referenceDelegate = this.persistence.referenceDelegate;\n const promises: Array<PersistencePromise<void>> = [];\n if (referenceDelegate) {\n keys.forEach(key => {\n promises.push(referenceDelegate.markPotentiallyOrphaned(txn, key));\n });\n }\n return PersistencePromise.waitFor(promises);\n }\n\n removeMatchingKeysForTargetId(\n txn: PersistenceTransaction,\n targetId: TargetId\n ): PersistencePromise<void> {\n this.references.removeReferencesForId(targetId);\n return PersistencePromise.resolve();\n }\n\n getMatchingKeysForTargetId(\n txn: PersistenceTransaction,\n targetId: TargetId\n ): PersistencePromise<DocumentKeySet> {\n const matchingKeys = this.references.referencesForId(targetId);\n return PersistencePromise.resolve(matchingKeys);\n }\n\n containsKey(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<boolean> {\n return PersistencePromise.resolve(this.references.containsKey(key));\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { ListenSequence } from '../core/listen_sequence';\nimport { ListenSequenceNumber, TargetId } from '../core/types';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { estimateByteSize } from '../model/values';\nimport { JsonProtoSerializer } from '../remote/serializer';\nimport { fail } from '../util/assert';\nimport { logDebug } from '../util/log';\nimport { ObjectMap } from '../util/obj_map';\n\nimport { encodeResourcePath } from './encoded_resource_path';\nimport { LocalSerializer } from './local_serializer';\nimport {\n ActiveTargets,\n LruDelegate,\n LruGarbageCollector,\n LruParams\n} from './lru_garbage_collector';\nimport { newLruGarbageCollector } from './lru_garbage_collector_impl';\nimport { MemoryBundleCache } from './memory_bundle_cache';\nimport { MemoryIndexManager } from './memory_index_manager';\nimport { MemoryMutationQueue } from './memory_mutation_queue';\nimport {\n MemoryRemoteDocumentCache,\n newMemoryRemoteDocumentCache\n} from './memory_remote_document_cache';\nimport { MemoryTargetCache } from './memory_target_cache';\nimport { MutationQueue } from './mutation_queue';\nimport { Persistence, ReferenceDelegate } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport {\n PersistenceTransaction,\n PersistenceTransactionMode\n} from './persistence_transaction';\nimport { ReferenceSet } from './reference_set';\nimport { TargetData } from './target_data';\n\nconst LOG_TAG = 'MemoryPersistence';\n/**\n * A memory-backed instance of Persistence. Data is stored only in RAM and\n * not persisted across sessions.\n */\nexport class MemoryPersistence implements Persistence {\n /**\n * Note that these are retained here to make it easier to write tests\n * affecting both the in-memory and IndexedDB-backed persistence layers. Tests\n * can create a new LocalStore wrapping this Persistence instance and this\n * will make the in-memory persistence layer behave as if it were actually\n * persisting values.\n */\n private readonly indexManager: MemoryIndexManager;\n private mutationQueues: { [user: string]: MemoryMutationQueue } = {};\n private readonly remoteDocumentCache: MemoryRemoteDocumentCache;\n private readonly targetCache: MemoryTargetCache;\n private readonly bundleCache: MemoryBundleCache;\n private readonly listenSequence = new ListenSequence(0);\n private serializer: LocalSerializer;\n\n private _started = false;\n\n readonly referenceDelegate: MemoryReferenceDelegate;\n\n /**\n * The constructor accepts a factory for creating a reference delegate. This\n * allows both the delegate and this instance to have strong references to\n * each other without having nullable fields that would then need to be\n * checked or asserted on every access.\n */\n constructor(\n referenceDelegateFactory: (p: MemoryPersistence) => MemoryReferenceDelegate,\n serializer: JsonProtoSerializer\n ) {\n this._started = true;\n this.referenceDelegate = referenceDelegateFactory(this);\n this.targetCache = new MemoryTargetCache(this);\n const sizer = (doc: Document): number =>\n this.referenceDelegate.documentSize(doc);\n this.indexManager = new MemoryIndexManager();\n this.remoteDocumentCache = newMemoryRemoteDocumentCache(\n this.indexManager,\n sizer\n );\n this.serializer = new LocalSerializer(serializer);\n this.bundleCache = new MemoryBundleCache(this.serializer);\n }\n\n start(): Promise<void> {\n return Promise.resolve();\n }\n\n shutdown(): Promise<void> {\n // No durable state to ensure is closed on shutdown.\n this._started = false;\n return Promise.resolve();\n }\n\n get started(): boolean {\n return this._started;\n }\n\n setDatabaseDeletedListener(): void {\n // No op.\n }\n\n setNetworkEnabled(): void {\n // No op.\n }\n\n getIndexManager(): MemoryIndexManager {\n return this.indexManager;\n }\n\n getMutationQueue(user: User): MutationQueue {\n let queue = this.mutationQueues[user.toKey()];\n if (!queue) {\n queue = new MemoryMutationQueue(\n this.indexManager,\n this.referenceDelegate\n );\n this.mutationQueues[user.toKey()] = queue;\n }\n return queue;\n }\n\n getTargetCache(): MemoryTargetCache {\n return this.targetCache;\n }\n\n getRemoteDocumentCache(): MemoryRemoteDocumentCache {\n return this.remoteDocumentCache;\n }\n\n getBundleCache(): MemoryBundleCache {\n return this.bundleCache;\n }\n\n runTransaction<T>(\n action: string,\n mode: PersistenceTransactionMode,\n transactionOperation: (\n transaction: PersistenceTransaction\n ) => PersistencePromise<T>\n ): Promise<T> {\n logDebug(LOG_TAG, 'Starting transaction:', action);\n const txn = new MemoryTransaction(this.listenSequence.next());\n this.referenceDelegate.onTransactionStarted();\n return transactionOperation(txn)\n .next(result => {\n return this.referenceDelegate\n .onTransactionCommitted(txn)\n .next(() => result);\n })\n .toPromise()\n .then(result => {\n txn.raiseOnCommittedEvent();\n return result;\n });\n }\n\n mutationQueuesContainKey(\n transaction: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<boolean> {\n return PersistencePromise.or(\n Object.values(this.mutationQueues).map(queue => () =>\n queue.containsKey(transaction, key)\n )\n );\n }\n}\n\n/**\n * Memory persistence is not actually transactional, but future implementations\n * may have transaction-scoped state.\n */\nexport class MemoryTransaction extends PersistenceTransaction {\n constructor(readonly currentSequenceNumber: ListenSequenceNumber) {\n super();\n }\n}\n\nexport interface MemoryReferenceDelegate extends ReferenceDelegate {\n documentSize(doc: Document): number;\n onTransactionStarted(): void;\n onTransactionCommitted(txn: PersistenceTransaction): PersistencePromise<void>;\n}\n\nexport class MemoryEagerDelegate implements MemoryReferenceDelegate {\n /** Tracks all documents that are active in Query views. */\n private localViewReferences: ReferenceSet = new ReferenceSet();\n /** The list of documents that are potentially GCed after each transaction. */\n private _orphanedDocuments: Set</* path= */ string> | null = null;\n\n private constructor(private readonly persistence: MemoryPersistence) {}\n\n static factory(persistence: MemoryPersistence): MemoryEagerDelegate {\n return new MemoryEagerDelegate(persistence);\n }\n\n private get orphanedDocuments(): Set<string> {\n if (!this._orphanedDocuments) {\n throw fail('orphanedDocuments is only valid during a transaction.');\n } else {\n return this._orphanedDocuments;\n }\n }\n\n addReference(\n txn: PersistenceTransaction,\n targetId: TargetId,\n key: DocumentKey\n ): PersistencePromise<void> {\n this.localViewReferences.addReference(key, targetId);\n this.orphanedDocuments.delete(key.toString());\n return PersistencePromise.resolve();\n }\n\n removeReference(\n txn: PersistenceTransaction,\n targetId: TargetId,\n key: DocumentKey\n ): PersistencePromise<void> {\n this.localViewReferences.removeReference(key, targetId);\n this.orphanedDocuments.add(key.toString());\n return PersistencePromise.resolve();\n }\n\n markPotentiallyOrphaned(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<void> {\n this.orphanedDocuments.add(key.toString());\n return PersistencePromise.resolve();\n }\n\n removeTarget(\n txn: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise<void> {\n const orphaned = this.localViewReferences.removeReferencesForId(\n targetData.targetId\n );\n orphaned.forEach(key => this.orphanedDocuments.add(key.toString()));\n const cache = this.persistence.getTargetCache();\n return cache\n .getMatchingKeysForTargetId(txn, targetData.targetId)\n .next(keys => {\n keys.forEach(key => this.orphanedDocuments.add(key.toString()));\n })\n .next(() => cache.removeTargetData(txn, targetData));\n }\n\n onTransactionStarted(): void {\n this._orphanedDocuments = new Set<string>();\n }\n\n onTransactionCommitted(\n txn: PersistenceTransaction\n ): PersistencePromise<void> {\n // Remove newly orphaned documents.\n const cache = this.persistence.getRemoteDocumentCache();\n const changeBuffer = cache.newChangeBuffer();\n return PersistencePromise.forEach(\n this.orphanedDocuments,\n (path: string) => {\n const key = DocumentKey.fromPath(path);\n return this.isReferenced(txn, key).next(isReferenced => {\n if (!isReferenced) {\n changeBuffer.removeEntry(key);\n }\n });\n }\n ).next(() => {\n this._orphanedDocuments = null;\n return changeBuffer.apply(txn);\n });\n }\n\n updateLimboDocument(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<void> {\n return this.isReferenced(txn, key).next(isReferenced => {\n if (isReferenced) {\n this.orphanedDocuments.delete(key.toString());\n } else {\n this.orphanedDocuments.add(key.toString());\n }\n });\n }\n\n documentSize(doc: Document): number {\n // For eager GC, we don't care about the document size, there are no size thresholds.\n return 0;\n }\n\n private isReferenced(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<boolean> {\n return PersistencePromise.or([\n () =>\n PersistencePromise.resolve(this.localViewReferences.containsKey(key)),\n () => this.persistence.getTargetCache().containsKey(txn, key),\n () => this.persistence.mutationQueuesContainKey(txn, key)\n ]);\n }\n}\n\nexport class MemoryLruDelegate implements ReferenceDelegate, LruDelegate {\n private orphanedSequenceNumbers: ObjectMap<\n DocumentKey,\n ListenSequenceNumber\n > = new ObjectMap(\n k => encodeResourcePath(k.path),\n (l, r) => l.isEqual(r)\n );\n\n readonly garbageCollector: LruGarbageCollector;\n\n constructor(\n private readonly persistence: MemoryPersistence,\n lruParams: LruParams\n ) {\n this.garbageCollector = newLruGarbageCollector(this, lruParams);\n }\n\n // No-ops, present so memory persistence doesn't have to care which delegate\n // it has.\n onTransactionStarted(): void {}\n\n onTransactionCommitted(\n txn: PersistenceTransaction\n ): PersistencePromise<void> {\n return PersistencePromise.resolve();\n }\n\n forEachTarget(\n txn: PersistenceTransaction,\n f: (q: TargetData) => void\n ): PersistencePromise<void> {\n return this.persistence.getTargetCache().forEachTarget(txn, f);\n }\n\n getSequenceNumberCount(\n txn: PersistenceTransaction\n ): PersistencePromise<number> {\n const docCountPromise = this.orphanedDocumentCount(txn);\n const targetCountPromise = this.persistence\n .getTargetCache()\n .getTargetCount(txn);\n return targetCountPromise.next(targetCount =>\n docCountPromise.next(docCount => targetCount + docCount)\n );\n }\n\n private orphanedDocumentCount(\n txn: PersistenceTransaction\n ): PersistencePromise<number> {\n let orphanedCount = 0;\n return this.forEachOrphanedDocumentSequenceNumber(txn, _ => {\n orphanedCount++;\n }).next(() => orphanedCount);\n }\n\n forEachOrphanedDocumentSequenceNumber(\n txn: PersistenceTransaction,\n f: (sequenceNumber: ListenSequenceNumber) => void\n ): PersistencePromise<void> {\n return PersistencePromise.forEach(\n this.orphanedSequenceNumbers,\n (key, sequenceNumber) => {\n // Pass in the exact sequence number as the upper bound so we know it won't be pinned by\n // being too recent.\n return this.isPinned(txn, key, sequenceNumber).next(isPinned => {\n if (!isPinned) {\n return f(sequenceNumber);\n } else {\n return PersistencePromise.resolve();\n }\n });\n }\n );\n }\n\n removeTargets(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise<number> {\n return this.persistence\n .getTargetCache()\n .removeTargets(txn, upperBound, activeTargetIds);\n }\n\n removeOrphanedDocuments(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber\n ): PersistencePromise<number> {\n let count = 0;\n const cache = this.persistence.getRemoteDocumentCache();\n const changeBuffer = cache.newChangeBuffer();\n const p = cache.forEachDocumentKey(txn, key => {\n return this.isPinned(txn, key, upperBound).next(isPinned => {\n if (!isPinned) {\n count++;\n changeBuffer.removeEntry(key);\n }\n });\n });\n return p.next(() => changeBuffer.apply(txn)).next(() => count);\n }\n\n markPotentiallyOrphaned(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<void> {\n this.orphanedSequenceNumbers.set(key, txn.currentSequenceNumber);\n return PersistencePromise.resolve();\n }\n\n removeTarget(\n txn: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise<void> {\n const updated = targetData.withSequenceNumber(txn.currentSequenceNumber);\n return this.persistence.getTargetCache().updateTargetData(txn, updated);\n }\n\n addReference(\n txn: PersistenceTransaction,\n targetId: TargetId,\n key: DocumentKey\n ): PersistencePromise<void> {\n this.orphanedSequenceNumbers.set(key, txn.currentSequenceNumber);\n return PersistencePromise.resolve();\n }\n\n removeReference(\n txn: PersistenceTransaction,\n targetId: TargetId,\n key: DocumentKey\n ): PersistencePromise<void> {\n this.orphanedSequenceNumbers.set(key, txn.currentSequenceNumber);\n return PersistencePromise.resolve();\n }\n\n updateLimboDocument(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise<void> {\n this.orphanedSequenceNumbers.set(key, txn.currentSequenceNumber);\n return PersistencePromise.resolve();\n }\n\n documentSize(document: Document): number {\n let documentSize = document.key.toString().length;\n if (document.isFoundDocument()) {\n documentSize += estimateByteSize(document.data.value);\n }\n return documentSize;\n }\n\n private isPinned(\n txn: PersistenceTransaction,\n key: DocumentKey,\n upperBound: ListenSequenceNumber\n ): PersistencePromise<boolean> {\n return PersistencePromise.or([\n () => this.persistence.mutationQueuesContainKey(txn, key),\n () => this.persistence.getTargetCache().containsKey(txn, key),\n () => {\n const orphanedAt = this.orphanedSequenceNumbers.get(key);\n return PersistencePromise.resolve(\n orphanedAt !== undefined && orphanedAt > upperBound\n );\n }\n ]);\n }\n\n getCacheSize(txn: PersistenceTransaction): PersistencePromise<number> {\n return this.persistence.getRemoteDocumentCache().getSize(txn);\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Simple wrapper around a nullable UID. Mostly exists to make code more\n * readable.\n */\nexport class User {\n /** A user with a null UID. */\n static readonly UNAUTHENTICATED = new User(null);\n\n // TODO(mikelehen): Look into getting a proper uid-equivalent for\n // non-FirebaseAuth providers.\n static readonly GOOGLE_CREDENTIALS = new User('google-credentials-uid');\n static readonly FIRST_PARTY = new User('first-party-uid');\n\n constructor(readonly uid: string | null) {}\n\n isAuthenticated(): boolean {\n return this.uid != null;\n }\n\n /**\n * Returns a key representing this user, suitable for inclusion in a\n * dictionary.\n */\n toKey(): string {\n if (this.isAuthenticated()) {\n return 'uid:' + this.uid;\n } else {\n return 'anonymous-user';\n }\n }\n\n isEqual(otherUser: User): boolean {\n return otherUser.uid === this.uid;\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { BatchId, MutationBatchState, TargetId } from '../core/types';\nimport { debugAssert } from '../util/assert';\n\nimport { ClientId } from './shared_client_state';\nimport { QueryTargetState } from './shared_client_state_syncer';\n\n// The format of the LocalStorage key that stores the client state is:\n// firestore_clients_<persistence_prefix>_<instance_key>\nexport const CLIENT_STATE_KEY_PREFIX = 'firestore_clients';\n\n/** Assembles the key for a client state in WebStorage */\nexport function createWebStorageClientStateKey(\n persistenceKey: string,\n clientId: ClientId\n): string {\n debugAssert(\n clientId.indexOf('_') === -1,\n `Client key cannot contain '_', but was '${clientId}'`\n );\n\n return `${CLIENT_STATE_KEY_PREFIX}_${persistenceKey}_${clientId}`;\n}\n\n/**\n * The JSON representation of a clients's metadata as used during WebStorage\n * serialization. The ClientId is omitted here as it is encoded as part of the\n * key.\n */\nexport interface ClientStateSchema {\n activeTargetIds: number[];\n updateTimeMs: number;\n}\n\n// The format of the WebStorage key that stores the mutation state is:\n// firestore_mutations_<persistence_prefix>_<batch_id>\n// (for unauthenticated users)\n// or: firestore_mutations_<persistence_prefix>_<batch_id>_<user_uid>\n//\n// 'user_uid' is last to avoid needing to escape '_' characters that it might\n// contain.\nexport const MUTATION_BATCH_KEY_PREFIX = 'firestore_mutations';\n\n/** Assembles the key for a mutation batch in WebStorage */\nexport function createWebStorageMutationBatchKey(\n persistenceKey: string,\n user: User,\n batchId: BatchId\n): string {\n let mutationKey = `${MUTATION_BATCH_KEY_PREFIX}_${persistenceKey}_${batchId}`;\n\n if (user.isAuthenticated()) {\n mutationKey += `_${user.uid}`;\n }\n\n return mutationKey;\n}\n\n/**\n * The JSON representation of a mutation batch's metadata as used during\n * WebStorage serialization. The UserId and BatchId is omitted as it is\n * encoded as part of the key.\n */\nexport interface MutationMetadataSchema {\n state: MutationBatchState;\n error?: { code: string; message: string }; // Only set when state === 'rejected'\n updateTimeMs: number;\n}\n\n// The format of the WebStorage key that stores a query target's metadata is:\n// firestore_targets_<persistence_prefix>_<target_id>\nexport const QUERY_TARGET_KEY_PREFIX = 'firestore_targets';\n\n/** Assembles the key for a query state in WebStorage */\nexport function createWebStorageQueryTargetMetadataKey(\n persistenceKey: string,\n targetId: TargetId\n): string {\n return `${QUERY_TARGET_KEY_PREFIX}_${persistenceKey}_${targetId}`;\n}\n\n/**\n * The JSON representation of a query target's state as used during WebStorage\n * serialization. The TargetId is omitted as it is encoded as part of the key.\n */\nexport interface QueryTargetStateSchema {\n state: QueryTargetState;\n error?: { code: string; message: string }; // Only set when state === 'rejected'\n updateTimeMs: number;\n}\n\n// The WebStorage prefix that stores the primary tab's online state. The\n// format of the key is:\n// firestore_online_state_<persistence_prefix>\nexport const ONLINE_STATE_KEY_PREFIX = 'firestore_online_state';\n\n/** Assembles the key for the online state of the primary tab. */\nexport function createWebStorageOnlineStateKey(persistenceKey: string): string {\n return `${ONLINE_STATE_KEY_PREFIX}_${persistenceKey}`;\n}\n\n// The WebStorage prefix that plays as a event to indicate the remote documents\n// might have changed due to some secondary tabs loading a bundle.\n// format of the key is:\n// firestore_bundle_loaded_<persistenceKey>\nexport const BUNDLE_LOADED_KEY_PREFIX = 'firestore_bundle_loaded';\nexport function createBundleLoadedKey(persistenceKey: string): string {\n return `${BUNDLE_LOADED_KEY_PREFIX}_${persistenceKey}`;\n}\n\n/**\n * The JSON representation of the system's online state, as written by the\n * primary client.\n */\nexport interface SharedOnlineStateSchema {\n /**\n * The clientId of the client that wrote this onlineState value. Tracked so\n * that on startup, clients can check if this client is still active when\n * determining whether to apply this value or not.\n */\n readonly clientId: string;\n readonly onlineState: string;\n}\n\n// The WebStorage key prefix for the key that stores the last sequence number allocated. The key\n// looks like 'firestore_sequence_number_<persistence_prefix>'.\nexport const SEQUENCE_NUMBER_KEY_PREFIX = 'firestore_sequence_number';\n\n/** Assembles the key for the current sequence number. */\nexport function createWebStorageSequenceNumberKey(\n persistenceKey: string\n): string {\n return `${SEQUENCE_NUMBER_KEY_PREFIX}_${persistenceKey}`;\n}\n", "/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { ListenSequence } from '../core/listen_sequence';\nimport {\n BatchId,\n ListenSequenceNumber,\n MutationBatchState,\n OnlineState,\n TargetId\n} from '../core/types';\nimport { TargetIdSet, targetIdSet } from '../model/collections';\nimport { hardAssert, debugAssert } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\nimport { logError, logDebug } from '../util/log';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\nimport { isSafeInteger, WindowLike } from '../util/types';\n\nimport {\n CLIENT_STATE_KEY_PREFIX,\n ClientStateSchema,\n createBundleLoadedKey,\n createWebStorageClientStateKey,\n createWebStorageMutationBatchKey,\n createWebStorageOnlineStateKey,\n createWebStorageQueryTargetMetadataKey,\n createWebStorageSequenceNumberKey,\n MUTATION_BATCH_KEY_PREFIX,\n MutationMetadataSchema,\n QUERY_TARGET_KEY_PREFIX,\n QueryTargetStateSchema,\n SharedOnlineStateSchema\n} from './shared_client_state_schema';\nimport {\n QueryTargetState,\n SharedClientStateSyncer\n} from './shared_client_state_syncer';\n\nconst LOG_TAG = 'SharedClientState';\n\n/**\n * A randomly-generated key assigned to each Firestore instance at startup.\n */\nexport type ClientId = string;\n\n/**\n * A `SharedClientState` keeps track of the global state of the mutations\n * and query targets for all active clients with the same persistence key (i.e.\n * project ID and FirebaseApp name). It relays local changes to other clients\n * and updates its local state as new state is observed.\n *\n * `SharedClientState` is primarily used for synchronization in Multi-Tab\n * environments. Each tab is responsible for registering its active query\n * targets and mutations. `SharedClientState` will then notify the listener\n * assigned to `.syncEngine` for updates to mutations and queries that\n * originated in other clients.\n *\n * To receive notifications, `.syncEngine` and `.onlineStateHandler` has to be\n * assigned before calling `start()`.\n */\nexport interface SharedClientState {\n onlineStateHandler: ((onlineState: OnlineState) => void) | null;\n sequenceNumberHandler:\n | ((sequenceNumber: ListenSequenceNumber) => void)\n | null;\n\n /** Registers the Mutation Batch ID of a newly pending mutation. */\n addPendingMutation(batchId: BatchId): void;\n\n /**\n * Records that a pending mutation has been acknowledged or rejected.\n * Called by the primary client to notify secondary clients of mutation\n * results as they come back from the backend.\n */\n updateMutationState(\n batchId: BatchId,\n state: 'acknowledged' | 'rejected',\n error?: FirestoreError\n ): void;\n\n /**\n * Associates a new Query Target ID with the local Firestore client. Returns\n * the new query state for the query (which can be 'current' if the query is\n * already associated with another tab).\n *\n * If the target id is already associated with local client, the method simply\n * returns its `QueryTargetState`.\n */\n addLocalQueryTarget(targetId: TargetId): QueryTargetState;\n\n /** Removes the Query Target ID association from the local client. */\n removeLocalQueryTarget(targetId: TargetId): void;\n\n /** Checks whether the target is associated with the local client. */\n isLocalQueryTarget(targetId: TargetId): boolean;\n\n /**\n * Processes an update to a query target.\n *\n * Called by the primary client to notify secondary clients of document\n * changes or state transitions that affect the provided query target.\n */\n updateQueryState(\n targetId: TargetId,\n state: QueryTargetState,\n error?: FirestoreError\n ): void;\n\n /**\n * Removes the target's metadata entry.\n *\n * Called by the primary client when all clients stopped listening to a query\n * target.\n */\n clearQueryState(targetId: TargetId): void;\n\n /**\n * Gets the active Query Targets IDs for all active clients.\n *\n * The implementation for this may require O(n) runtime, where 'n' is the size\n * of the result set.\n */\n // Visible for testing\n getAllActiveQueryTargets(): SortedSet<TargetId>;\n\n /**\n * Checks whether the provided target ID is currently being listened to by\n * any of the active clients.\n *\n * The implementation may require O(n*log m) runtime, where 'n' is the number\n * of clients and 'm' the number of targets.\n */\n isActiveQueryTarget(targetId: TargetId): boolean;\n\n /**\n * Starts the SharedClientState, reads existing client data and registers\n * listeners for updates to new and existing clients.\n */\n start(): Promise<void>;\n\n /** Shuts down the `SharedClientState` and its listeners. */\n shutdown(): void;\n\n /**\n * Changes the active user and removes all existing user-specific data. The\n * user change does not call back into SyncEngine (for example, no mutations\n * will be marked as removed).\n */\n handleUserChange(\n user: User,\n removedBatchIds: BatchId[],\n addedBatchIds: BatchId[]\n ): void;\n\n /** Changes the shared online state of all clients. */\n setOnlineState(onlineState: OnlineState): void;\n\n writeSequenceNumber(sequenceNumber: ListenSequenceNumber): void;\n\n /**\n * Notifies other clients when remote documents have changed due to loading\n * a bundle.\n */\n notifyBundleLoaded(): void;\n}\n\n/**\n * Holds the state of a mutation batch, including its user ID, batch ID and\n * whether the batch is 'pending', 'acknowledged' or 'rejected'.\n */\n// Visible for testing\nexport class MutationMetadata {\n constructor(\n readonly user: User,\n readonly batchId: BatchId,\n readonly state: MutationBatchState,\n readonly error?: FirestoreError\n ) {\n debugAssert(\n (error !== undefined) === (state === 'rejected'),\n `MutationMetadata must contain an error iff state is 'rejected'`\n );\n }\n\n /**\n * Parses a MutationMetadata from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */\n static fromWebStorageEntry(\n user: User,\n batchId: BatchId,\n value: string\n ): MutationMetadata | null {\n const mutationBatch = JSON.parse(value) as MutationMetadataSchema;\n\n let validData =\n typeof mutationBatch === 'object' &&\n ['pending', 'acknowledged', 'rejected'].indexOf(mutationBatch.state) !==\n -1 &&\n (mutationBatch.error === undefined ||\n typeof mutationBatch.error === 'object');\n\n let firestoreError: FirestoreError | undefined = undefined;\n\n if (validData && mutationBatch.error) {\n validData =\n typeof mutationBatch.error.message === 'string' &&\n typeof mutationBatch.error.code === 'string';\n if (validData) {\n firestoreError = new FirestoreError(\n mutationBatch.error.code as Code,\n mutationBatch.error.message\n );\n }\n }\n\n if (validData) {\n return new MutationMetadata(\n user,\n batchId,\n mutationBatch.state,\n firestoreError\n );\n } else {\n logError(\n LOG_TAG,\n `Failed to parse mutation state for ID '${batchId}': ${value}`\n );\n return null;\n }\n }\n\n toWebStorageJSON(): string {\n const batchMetadata: MutationMetadataSchema = {\n state: this.state,\n updateTimeMs: Date.now() // Modify the existing value to trigger update.\n };\n\n if (this.error) {\n batchMetadata.error = {\n code: this.error.code,\n message: this.error.message\n };\n }\n\n return JSON.stringify(batchMetadata);\n }\n}\n\n/**\n * Holds the state of a query target, including its target ID and whether the\n * target is 'not-current', 'current' or 'rejected'.\n */\n// Visible for testing\nexport class QueryTargetMetadata {\n constructor(\n readonly targetId: TargetId,\n readonly state: QueryTargetState,\n readonly error?: FirestoreError\n ) {\n debugAssert(\n (error !== undefined) === (state === 'rejected'),\n `QueryTargetMetadata must contain an error iff state is 'rejected'`\n );\n }\n\n /**\n * Parses a QueryTargetMetadata from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */\n static fromWebStorageEntry(\n targetId: TargetId,\n value: string\n ): QueryTargetMetadata | null {\n const targetState = JSON.parse(value) as QueryTargetStateSchema;\n\n let validData =\n typeof targetState === 'object' &&\n ['not-current', 'current', 'rejected'].indexOf(targetState.state) !==\n -1 &&\n (targetState.error === undefined ||\n typeof targetState.error === 'object');\n\n let firestoreError: FirestoreError | undefined = undefined;\n\n if (validData && targetState.error) {\n validData =\n typeof targetState.error.message === 'string' &&\n typeof targetState.error.code === 'string';\n if (validData) {\n firestoreError = new FirestoreError(\n targetState.error.code as Code,\n targetState.error.message\n );\n }\n }\n\n if (validData) {\n return new QueryTargetMetadata(\n targetId,\n targetState.state,\n firestoreError\n );\n } else {\n logError(\n LOG_TAG,\n `Failed to parse target state for ID '${targetId}': ${value}`\n );\n return null;\n }\n }\n\n toWebStorageJSON(): string {\n const targetState: QueryTargetStateSchema = {\n state: this.state,\n updateTimeMs: Date.now() // Modify the existing value to trigger update.\n };\n\n if (this.error) {\n targetState.error = {\n code: this.error.code,\n message: this.error.message\n };\n }\n\n return JSON.stringify(targetState);\n }\n}\n\n/**\n * Metadata state of a single client denoting the query targets it is actively\n * listening to.\n */\n// Visible for testing.\nexport interface ClientState {\n readonly activeTargetIds: TargetIdSet;\n}\n\n/**\n * This class represents the immutable ClientState for a client read from\n * WebStorage, containing the list of active query targets.\n */\nclass RemoteClientState implements ClientState {\n private constructor(\n readonly clientId: ClientId,\n readonly activeTargetIds: TargetIdSet\n ) {}\n\n /**\n * Parses a RemoteClientState from the JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */\n static fromWebStorageEntry(\n clientId: ClientId,\n value: string\n ): RemoteClientState | null {\n const clientState = JSON.parse(value) as ClientStateSchema;\n\n let validData =\n typeof clientState === 'object' &&\n clientState.activeTargetIds instanceof Array;\n\n let activeTargetIdsSet = targetIdSet();\n\n for (let i = 0; validData && i < clientState.activeTargetIds.length; ++i) {\n validData = isSafeInteger(clientState.activeTargetIds[i]);\n activeTargetIdsSet = activeTargetIdsSet.add(\n clientState.activeTargetIds[i]\n );\n }\n\n if (validData) {\n return new RemoteClientState(clientId, activeTargetIdsSet);\n } else {\n logError(\n LOG_TAG,\n `Failed to parse client data for instance '${clientId}': ${value}`\n );\n return null;\n }\n }\n}\n\n/**\n * This class represents the online state for all clients participating in\n * multi-tab. The online state is only written to by the primary client, and\n * used in secondary clients to update their query views.\n */\nexport class SharedOnlineState {\n constructor(readonly clientId: string, readonly onlineState: OnlineState) {}\n\n /**\n * Parses a SharedOnlineState from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */\n static fromWebStorageEntry(value: string): SharedOnlineState | null {\n const onlineState = JSON.parse(value) as SharedOnlineStateSchema;\n\n const validData =\n typeof onlineState === 'object' &&\n ['Unknown', 'Online', 'Offline'].indexOf(onlineState.onlineState) !==\n -1 &&\n typeof onlineState.clientId === 'string';\n\n if (validData) {\n return new SharedOnlineState(\n onlineState.clientId,\n onlineState.onlineState as OnlineState\n );\n } else {\n logError(LOG_TAG, `Failed to parse online state: ${value}`);\n return null;\n }\n }\n}\n\n/**\n * Metadata state of the local client. Unlike `RemoteClientState`, this class is\n * mutable and keeps track of all pending mutations, which allows us to\n * update the range of pending mutation batch IDs as new mutations are added or\n * removed.\n *\n * The data in `LocalClientState` is not read from WebStorage and instead\n * updated via its instance methods. The updated state can be serialized via\n * `toWebStorageJSON()`.\n */\n// Visible for testing.\nexport class LocalClientState implements ClientState {\n activeTargetIds = targetIdSet();\n\n addQueryTarget(targetId: TargetId): void {\n this.activeTargetIds = this.activeTargetIds.add(targetId);\n }\n\n removeQueryTarget(targetId: TargetId): void {\n this.activeTargetIds = this.activeTargetIds.delete(targetId);\n }\n\n /**\n * Converts this entry into a JSON-encoded format we can use for WebStorage.\n * Does not encode `clientId` as it is part of the key in WebStorage.\n */\n toWebStorageJSON(): string {\n const data: ClientStateSchema = {\n activeTargetIds: this.activeTargetIds.toArray(),\n updateTimeMs: Date.now() // Modify the existing value to trigger update.\n };\n return JSON.stringify(data);\n }\n}\n\n/**\n * `WebStorageSharedClientState` uses WebStorage (window.localStorage) as the\n * backing store for the SharedClientState. It keeps track of all active\n * clients and supports modifications of the local client's data.\n */\nexport class WebStorageSharedClientState implements SharedClientState {\n syncEngine: SharedClientStateSyncer | null = null;\n onlineStateHandler: ((onlineState: OnlineState) => void) | null = null;\n sequenceNumberHandler:\n | ((sequenceNumber: ListenSequenceNumber) => void)\n | null = null;\n\n private readonly storage: Storage;\n private readonly localClientStorageKey: string;\n private readonly sequenceNumberKey: string;\n private readonly storageListener = this.handleWebStorageEvent.bind(this);\n private readonly onlineStateKey: string;\n private readonly bundleLoadedKey: string;\n private readonly clientStateKeyRe: RegExp;\n private readonly mutationBatchKeyRe: RegExp;\n private readonly queryTargetKeyRe: RegExp;\n private activeClients = new SortedMap<string, ClientState>(\n primitiveComparator\n );\n private started = false;\n private currentUser: User;\n\n /**\n * Captures WebStorage events that occur before `start()` is called. These\n * events are replayed once `WebStorageSharedClientState` is started.\n */\n private earlyEvents: StorageEvent[] = [];\n\n constructor(\n private readonly window: WindowLike,\n private readonly queue: AsyncQueue,\n private readonly persistenceKey: string,\n private readonly localClientId: ClientId,\n initialUser: User\n ) {\n // Escape the special characters mentioned here:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n const escapedPersistenceKey = persistenceKey.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n );\n\n this.storage = this.window.localStorage;\n this.currentUser = initialUser;\n this.localClientStorageKey = createWebStorageClientStateKey(\n this.persistenceKey,\n this.localClientId\n );\n this.sequenceNumberKey = createWebStorageSequenceNumberKey(\n this.persistenceKey\n );\n this.activeClients = this.activeClients.insert(\n this.localClientId,\n new LocalClientState()\n );\n\n this.clientStateKeyRe = new RegExp(\n `^${CLIENT_STATE_KEY_PREFIX}_${escapedPersistenceKey}_([^_]*)$`\n );\n this.mutationBatchKeyRe = new RegExp(\n `^${MUTATION_BATCH_KEY_PREFIX}_${escapedPersistenceKey}_(\\\\d+)(?:_(.*))?$`\n );\n this.queryTargetKeyRe = new RegExp(\n `^${QUERY_TARGET_KEY_PREFIX}_${escapedPersistenceKey}_(\\\\d+)$`\n );\n\n this.onlineStateKey = createWebStorageOnlineStateKey(this.persistenceKey);\n\n this.bundleLoadedKey = createBundleLoadedKey(this.persistenceKey);\n\n // Rather than adding the storage observer during start(), we add the\n // storage observer during initialization. This ensures that we collect\n // events before other components populate their initial state (during their\n // respective start() calls). Otherwise, we might for example miss a\n // mutation that is added after LocalStore's start() processed the existing\n // mutations but before we observe WebStorage events.\n this.window.addEventListener('storage', this.storageListener);\n }\n\n /** Returns 'true' if WebStorage is available in the current environment. */\n static isAvailable(window: WindowLike | null): window is WindowLike {\n return !!(window && window.localStorage);\n }\n\n async start(): Promise<void> {\n debugAssert(!this.started, 'WebStorageSharedClientState already started');\n debugAssert(\n this.syncEngine !== null,\n 'syncEngine property must be set before calling start()'\n );\n debugAssert(\n this.onlineStateHandler !== null,\n 'onlineStateHandler property must be set before calling start()'\n );\n\n // Retrieve the list of existing clients to backfill the data in\n // SharedClientState.\n const existingClients = await this.syncEngine!.getActiveClients();\n\n for (const clientId of existingClients) {\n if (clientId === this.localClientId) {\n continue;\n }\n\n const storageItem = this.getItem(\n createWebStorageClientStateKey(this.persistenceKey, clientId)\n );\n if (storageItem) {\n const clientState = RemoteClientState.fromWebStorageEntry(\n clientId,\n storageItem\n );\n if (clientState) {\n this.activeClients = this.activeClients.insert(\n clientState.clientId,\n clientState\n );\n }\n }\n }\n\n this.persistClientState();\n\n // Check if there is an existing online state and call the callback handler\n // if applicable.\n const onlineStateJSON = this.storage.getItem(this.onlineStateKey);\n if (onlineStateJSON) {\n const onlineState = this.fromWebStorageOnlineState(onlineStateJSON);\n if (onlineState) {\n this.handleOnlineStateEvent(onlineState);\n }\n }\n\n for (const event of this.earlyEvents) {\n this.handleWebStorageEvent(event);\n }\n\n this.earlyEvents = [];\n\n // Register a window unload hook to remove the client metadata entry from\n // WebStorage even if `shutdown()` was not called.\n this.window.addEventListener('pagehide', () => this.shutdown());\n\n this.started = true;\n }\n\n writeSequenceNumber(sequenceNumber: ListenSequenceNumber): void {\n this.setItem(this.sequenceNumberKey, JSON.stringify(sequenceNumber));\n }\n\n getAllActiveQueryTargets(): TargetIdSet {\n return this.extractActiveQueryTargets(this.activeClients);\n }\n\n isActiveQueryTarget(targetId: TargetId): boolean {\n let found = false;\n this.activeClients.forEach((key, value) => {\n if (value.activeTargetIds.has(targetId)) {\n found = true;\n }\n });\n return found;\n }\n\n addPendingMutation(batchId: BatchId): void {\n this.persistMutationState(batchId, 'pending');\n }\n\n updateMutationState(\n batchId: BatchId,\n state: 'acknowledged' | 'rejected',\n error?: FirestoreError\n ): void {\n this.persistMutationState(batchId, state, error);\n\n // Once a final mutation result is observed by other clients, they no longer\n // access the mutation's metadata entry. Since WebStorage replays events\n // in order, it is safe to delete the entry right after updating it.\n this.removeMutationState(batchId);\n }\n\n addLocalQueryTarget(targetId: TargetId): QueryTargetState {\n let queryState: QueryTargetState = 'not-current';\n\n // Lookup an existing query state if the target ID was already registered\n // by another tab\n if (this.isActiveQueryTarget(targetId)) {\n const storageItem = this.storage.getItem(\n createWebStorageQueryTargetMetadataKey(this.persistenceKey, targetId)\n );\n\n if (storageItem) {\n const metadata = QueryTargetMetadata.fromWebStorageEntry(\n targetId,\n storageItem\n );\n if (metadata) {\n queryState = metadata.state;\n }\n }\n }\n\n this.localClientState.addQueryTarget(targetId);\n this.persistClientState();\n\n return queryState;\n }\n\n removeLocalQueryTarget(targetId: TargetId): void {\n this.localClientState.removeQueryTarget(targetId);\n this.persistClientState();\n }\n\n isLocalQueryTarget(targetId: TargetId): boolean {\n return this.localClientState.activeTargetIds.has(targetId);\n }\n\n clearQueryState(targetId: TargetId): void {\n this.removeItem(\n createWebStorageQueryTargetMetadataKey(this.persistenceKey, targetId)\n );\n }\n\n updateQueryState(\n targetId: TargetId,\n state: QueryTargetState,\n error?: FirestoreError\n ): void {\n this.persistQueryTargetState(targetId, state, error);\n }\n\n handleUserChange(\n user: User,\n removedBatchIds: BatchId[],\n addedBatchIds: BatchId[]\n ): void {\n removedBatchIds.forEach(batchId => {\n this.removeMutationState(batchId);\n });\n this.currentUser = user;\n addedBatchIds.forEach(batchId => {\n this.addPendingMutation(batchId);\n });\n }\n\n setOnlineState(onlineState: OnlineState): void {\n this.persistOnlineState(onlineState);\n }\n\n notifyBundleLoaded(): void {\n this.persistBundleLoadedState();\n }\n\n shutdown(): void {\n if (this.started) {\n this.window.removeEventListener('storage', this.storageListener);\n this.removeItem(this.localClientStorageKey);\n this.started = false;\n }\n }\n\n private getItem(key: string): string | null {\n const value = this.storage.getItem(key);\n logDebug(LOG_TAG, 'READ', key, value);\n return value;\n }\n\n private setItem(key: string, value: string): void {\n logDebug(LOG_TAG, 'SET', key, value);\n this.storage.setItem(key, value);\n }\n\n private removeItem(key: string): void {\n logDebug(LOG_TAG, 'REMOVE', key);\n this.storage.removeItem(key);\n }\n\n private handleWebStorageEvent(event: Event): void {\n // Note: The function is typed to take Event to be interface-compatible with\n // `Window.addEventListener`.\n const storageEvent = event as StorageEvent;\n if (storageEvent.storageArea === this.storage) {\n logDebug(LOG_TAG, 'EVENT', storageEvent.key, storageEvent.newValue);\n\n if (storageEvent.key === this.localClientStorageKey) {\n logError(\n 'Received WebStorage notification for local change. Another client might have ' +\n 'garbage-collected our state'\n );\n return;\n }\n\n this.queue.enqueueRetryable(async () => {\n if (!this.started) {\n this.earlyEvents.push(storageEvent);\n return;\n }\n\n if (storageEvent.key === null) {\n return;\n }\n\n if (this.clientStateKeyRe.test(storageEvent.key)) {\n if (storageEvent.newValue != null) {\n const clientState = this.fromWebStorageClientState(\n storageEvent.key,\n storageEvent.newValue\n );\n if (clientState) {\n return this.handleClientStateEvent(\n clientState.clientId,\n clientState\n );\n }\n } else {\n const clientId = this.fromWebStorageClientStateKey(\n storageEvent.key\n )!;\n return this.handleClientStateEvent(clientId, null);\n }\n } else if (this.mutationBatchKeyRe.test(storageEvent.key)) {\n if (storageEvent.newValue !== null) {\n const mutationMetadata = this.fromWebStorageMutationMetadata(\n storageEvent.key,\n storageEvent.newValue\n );\n if (mutationMetadata) {\n return this.handleMutationBatchEvent(mutationMetadata);\n }\n }\n } else if (this.queryTargetKeyRe.test(storageEvent.key)) {\n if (storageEvent.newValue !== null) {\n const queryTargetMetadata = this.fromWebStorageQueryTargetMetadata(\n storageEvent.key,\n storageEvent.newValue\n );\n if (queryTargetMetadata) {\n return this.handleQueryTargetEvent(queryTargetMetadata);\n }\n }\n } else if (storageEvent.key === this.onlineStateKey) {\n if (storageEvent.newValue !== null) {\n const onlineState = this.fromWebStorageOnlineState(\n storageEvent.newValue\n );\n if (onlineState) {\n return this.handleOnlineStateEvent(onlineState);\n }\n }\n } else if (storageEvent.key === this.sequenceNumberKey) {\n debugAssert(\n !!this.sequenceNumberHandler,\n 'Missing sequenceNumberHandler'\n );\n const sequenceNumber = fromWebStorageSequenceNumber(\n storageEvent.newValue\n );\n if (sequenceNumber !== ListenSequence.INVALID) {\n this.sequenceNumberHandler!(sequenceNumber);\n }\n } else if (storageEvent.key === this.bundleLoadedKey) {\n return this.syncEngine!.synchronizeWithChangedDocuments();\n }\n });\n }\n }\n\n private get localClientState(): LocalClientState {\n return this.activeClients.get(this.localClientId) as LocalClientState;\n }\n\n private persistClientState(): void {\n this.setItem(\n this.localClientStorageKey,\n this.localClientState.toWebStorageJSON()\n );\n }\n\n private persistMutationState(\n batchId: BatchId,\n state: MutationBatchState,\n error?: FirestoreError\n ): void {\n const mutationState = new MutationMetadata(\n this.currentUser,\n batchId,\n state,\n error\n );\n const mutationKey = createWebStorageMutationBatchKey(\n this.persistenceKey,\n this.currentUser,\n batchId\n );\n this.setItem(mutationKey, mutationState.toWebStorageJSON());\n }\n\n private removeMutationState(batchId: BatchId): void {\n const mutationKey = createWebStorageMutationBatchKey(\n this.persistenceKey,\n this.currentUser,\n batchId\n );\n this.removeItem(mutationKey);\n }\n\n private persistOnlineState(onlineState: OnlineState): void {\n const entry: SharedOnlineStateSchema = {\n clientId: this.localClientId,\n onlineState\n };\n this.storage.setItem(this.onlineStateKey, JSON.stringify(entry));\n }\n\n private persistQueryTargetState(\n targetId: TargetId,\n state: QueryTargetState,\n error?: FirestoreError\n ): void {\n const targetKey = createWebStorageQueryTargetMetadataKey(\n this.persistenceKey,\n targetId\n );\n const targetMetadata = new QueryTargetMetadata(targetId, state, error);\n this.setItem(targetKey, targetMetadata.toWebStorageJSON());\n }\n\n private persistBundleLoadedState(): void {\n this.setItem(this.bundleLoadedKey, 'value-not-used');\n }\n\n /**\n * Parses a client state key in WebStorage. Returns null if the key does not\n * match the expected key format.\n */\n private fromWebStorageClientStateKey(key: string): ClientId | null {\n const match = this.clientStateKeyRe.exec(key);\n return match ? match[1] : null;\n }\n\n /**\n * Parses a client state in WebStorage. Returns 'null' if the value could not\n * be parsed.\n */\n private fromWebStorageClientState(\n key: string,\n value: string\n ): RemoteClientState | null {\n const clientId = this.fromWebStorageClientStateKey(key);\n debugAssert(clientId !== null, `Cannot parse client state key '${key}'`);\n return RemoteClientState.fromWebStorageEntry(clientId, value);\n }\n\n /**\n * Parses a mutation batch state in WebStorage. Returns 'null' if the value\n * could not be parsed.\n */\n private fromWebStorageMutationMetadata(\n key: string,\n value: string\n ): MutationMetadata | null {\n const match = this.mutationBatchKeyRe.exec(key);\n debugAssert(match !== null, `Cannot parse mutation batch key '${key}'`);\n\n const batchId = Number(match[1]);\n const userId = match[2] !== undefined ? match[2] : null;\n return MutationMetadata.fromWebStorageEntry(\n new User(userId),\n batchId,\n value\n );\n }\n\n /**\n * Parses a query target state from WebStorage. Returns 'null' if the value\n * could not be parsed.\n */\n private fromWebStorageQueryTargetMetadata(\n key: string,\n value: string\n ): QueryTargetMetadata | null {\n const match = this.queryTargetKeyRe.exec(key);\n debugAssert(match !== null, `Cannot parse query target key '${key}'`);\n\n const targetId = Number(match[1]);\n return QueryTargetMetadata.fromWebStorageEntry(targetId, value);\n }\n\n /**\n * Parses an online state from WebStorage. Returns 'null' if the value\n * could not be parsed.\n */\n private fromWebStorageOnlineState(value: string): SharedOnlineState | null {\n return SharedOnlineState.fromWebStorageEntry(value);\n }\n\n private async handleMutationBatchEvent(\n mutationBatch: MutationMetadata\n ): Promise<void> {\n if (mutationBatch.user.uid !== this.currentUser.uid) {\n logDebug(\n LOG_TAG,\n `Ignoring mutation for non-active user ${mutationBatch.user.uid}`\n );\n return;\n }\n\n return this.syncEngine!.applyBatchState(\n mutationBatch.batchId,\n mutationBatch.state,\n mutationBatch.error\n );\n }\n\n private handleQueryTargetEvent(\n targetMetadata: QueryTargetMetadata\n ): Promise<void> {\n return this.syncEngine!.applyTargetState(\n targetMetadata.targetId,\n targetMetadata.state,\n targetMetadata.error\n );\n }\n\n private handleClientStateEvent(\n clientId: ClientId,\n clientState: RemoteClientState | null\n ): Promise<void> {\n const updatedClients = clientState\n ? this.activeClients.insert(clientId, clientState)\n : this.activeClients.remove(clientId);\n\n const existingTargets = this.extractActiveQueryTargets(this.activeClients);\n const newTargets = this.extractActiveQueryTargets(updatedClients);\n\n const addedTargets: TargetId[] = [];\n const removedTargets: TargetId[] = [];\n\n newTargets.forEach(targetId => {\n if (!existingTargets.has(targetId)) {\n addedTargets.push(targetId);\n }\n });\n\n existingTargets.forEach(targetId => {\n if (!newTargets.has(targetId)) {\n removedTargets.push(targetId);\n }\n });\n\n return this.syncEngine!.applyActiveTargetsChange(\n addedTargets,\n removedTargets\n ).then(() => {\n this.activeClients = updatedClients;\n });\n }\n\n private handleOnlineStateEvent(onlineState: SharedOnlineState): void {\n // We check whether the client that wrote this online state is still active\n // by comparing its client ID to the list of clients kept active in\n // IndexedDb. If a client does not update their IndexedDb client state\n // within 5 seconds, it is considered inactive and we don't emit an online\n // state event.\n if (this.activeClients.get(onlineState.clientId)) {\n this.onlineStateHandler!(onlineState.onlineState);\n }\n }\n\n private extractActiveQueryTargets(\n clients: SortedMap<string, ClientState>\n ): SortedSet<TargetId> {\n let activeTargets = targetIdSet();\n clients.forEach((kev, value) => {\n activeTargets = activeTargets.unionWith(value.activeTargetIds);\n });\n return activeTargets;\n }\n}\n\nfunction fromWebStorageSequenceNumber(\n seqString: string | null\n): ListenSequenceNumber {\n let sequenceNumber = ListenSequence.INVALID;\n if (seqString != null) {\n try {\n const parsed = JSON.parse(seqString);\n hardAssert(\n typeof parsed === 'number',\n 'Found non-numeric sequence number'\n );\n sequenceNumber = parsed;\n } catch (e) {\n logError(LOG_TAG, 'Failed to read sequence number from WebStorage', e);\n }\n }\n return sequenceNumber;\n}\n\n/**\n * `MemorySharedClientState` is a simple implementation of SharedClientState for\n * clients using memory persistence. The state in this class remains fully\n * isolated and no synchronization is performed.\n */\nexport class MemorySharedClientState implements SharedClientState {\n private localState = new LocalClientState();\n private queryState: { [targetId: number]: QueryTargetState } = {};\n onlineStateHandler: ((onlineState: OnlineState) => void) | null = null;\n sequenceNumberHandler:\n | ((sequenceNumber: ListenSequenceNumber) => void)\n | null = null;\n\n addPendingMutation(batchId: BatchId): void {\n // No op.\n }\n\n updateMutationState(\n batchId: BatchId,\n state: 'acknowledged' | 'rejected',\n error?: FirestoreError\n ): void {\n // No op.\n }\n\n addLocalQueryTarget(targetId: TargetId): QueryTargetState {\n this.localState.addQueryTarget(targetId);\n return this.queryState[targetId] || 'not-current';\n }\n\n updateQueryState(\n targetId: TargetId,\n state: QueryTargetState,\n error?: FirestoreError\n ): void {\n this.queryState[targetId] = state;\n }\n\n removeLocalQueryTarget(targetId: TargetId): void {\n this.localState.removeQueryTarget(targetId);\n }\n\n isLocalQueryTarget(targetId: TargetId): boolean {\n return this.localState.activeTargetIds.has(targetId);\n }\n\n clearQueryState(targetId: TargetId): void {\n delete this.queryState[targetId];\n }\n\n getAllActiveQueryTargets(): TargetIdSet {\n return this.localState.activeTargetIds;\n }\n\n isActiveQueryTarget(targetId: TargetId): boolean {\n return this.localState.activeTargetIds.has(targetId);\n }\n\n start(): Promise<void> {\n this.localState = new LocalClientState();\n return Promise.resolve();\n }\n\n handleUserChange(\n user: User,\n removedBatchIds: BatchId[],\n addedBatchIds: BatchId[]\n ): void {\n // No op.\n }\n\n setOnlineState(onlineState: OnlineState): void {\n // No op.\n }\n\n shutdown(): void {}\n\n writeSequenceNumber(sequenceNumber: ListenSequenceNumber): void {}\n\n notifyBundleLoaded(): void {\n // No op.\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ConnectivityMonitor, NetworkStatus } from './connectivity_monitor';\n\nexport class NoopConnectivityMonitor implements ConnectivityMonitor {\n addCallback(callback: (status: NetworkStatus) => void): void {\n // No-op.\n }\n\n shutdown(): void {\n // No-op.\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ConnectivityMonitor,\n ConnectivityMonitorCallback,\n NetworkStatus\n} from '../../remote/connectivity_monitor';\nimport { logDebug } from '../../util/log';\n\n// References to `window` are guarded by BrowserConnectivityMonitor.isAvailable()\n/* eslint-disable no-restricted-globals */\n\nconst LOG_TAG = 'ConnectivityMonitor';\n\n/**\n * Browser implementation of ConnectivityMonitor.\n */\nexport class BrowserConnectivityMonitor implements ConnectivityMonitor {\n private readonly networkAvailableListener = (): void =>\n this.onNetworkAvailable();\n private readonly networkUnavailableListener = (): void =>\n this.onNetworkUnavailable();\n private callbacks: ConnectivityMonitorCallback[] = [];\n\n constructor() {\n this.configureNetworkMonitoring();\n }\n\n addCallback(callback: (status: NetworkStatus) => void): void {\n this.callbacks.push(callback);\n }\n\n shutdown(): void {\n window.removeEventListener('online', this.networkAvailableListener);\n window.removeEventListener('offline', this.networkUnavailableListener);\n }\n\n private configureNetworkMonitoring(): void {\n window.addEventListener('online', this.networkAvailableListener);\n window.addEventListener('offline', this.networkUnavailableListener);\n }\n\n private onNetworkAvailable(): void {\n logDebug(LOG_TAG, 'Network connectivity changed: AVAILABLE');\n for (const callback of this.callbacks) {\n callback(NetworkStatus.AVAILABLE);\n }\n }\n\n private onNetworkUnavailable(): void {\n logDebug(LOG_TAG, 'Network connectivity changed: UNAVAILABLE');\n for (const callback of this.callbacks) {\n callback(NetworkStatus.UNAVAILABLE);\n }\n }\n\n // TODO(chenbrian): Consider passing in window either into this component or\n // here for testing via FakeWindow.\n /** Checks that all used attributes of window are available. */\n static isAvailable(): boolean {\n return (\n typeof window !== 'undefined' &&\n window.addEventListener !== undefined &&\n window.removeEventListener !== undefined\n );\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SDK_VERSION } from '../../src/core/version';\nimport { Token } from '../api/credentials';\nimport { DatabaseId, DatabaseInfo } from '../core/database_info';\nimport { debugAssert } from '../util/assert';\nimport { FirestoreError } from '../util/error';\nimport { logDebug, logWarn } from '../util/log';\nimport { StringMap } from '../util/types';\n\nimport { Connection, Stream } from './connection';\n\nconst LOG_TAG = 'RestConnection';\n\n/**\n * Maps RPC names to the corresponding REST endpoint name.\n *\n * We use array notation to avoid mangling.\n */\nconst RPC_NAME_URL_MAPPING: StringMap = {};\n\nRPC_NAME_URL_MAPPING['BatchGetDocuments'] = 'batchGet';\nRPC_NAME_URL_MAPPING['Commit'] = 'commit';\nRPC_NAME_URL_MAPPING['RunQuery'] = 'runQuery';\n\nconst RPC_URL_VERSION = 'v1';\n\n// SDK_VERSION is updated to different value at runtime depending on the entry point,\n// so we need to get its value when we need it in a function.\nfunction getGoogApiClientValue(): string {\n return 'gl-js/ fire/' + SDK_VERSION;\n}\n/**\n * Base class for all Rest-based connections to the backend (WebChannel and\n * HTTP).\n */\nexport abstract class RestConnection implements Connection {\n protected readonly databaseId: DatabaseId;\n protected readonly baseUrl: string;\n private readonly databaseRoot: string;\n\n constructor(private readonly databaseInfo: DatabaseInfo) {\n this.databaseId = databaseInfo.databaseId;\n const proto = databaseInfo.ssl ? 'https' : 'http';\n this.baseUrl = proto + '://' + databaseInfo.host;\n this.databaseRoot =\n 'projects/' +\n this.databaseId.projectId +\n '/databases/' +\n this.databaseId.database +\n '/documents';\n }\n\n invokeRPC<Req, Resp>(\n rpcName: string,\n path: string,\n req: Req,\n token: Token | null\n ): Promise<Resp> {\n const url = this.makeUrl(rpcName, path);\n logDebug(LOG_TAG, 'Sending: ', url, req);\n\n const headers = {};\n this.modifyHeadersForRequest(headers, token);\n\n return this.performRPCRequest<Req, Resp>(rpcName, url, headers, req).then(\n response => {\n logDebug(LOG_TAG, 'Received: ', response);\n return response;\n },\n (err: FirestoreError) => {\n logWarn(\n LOG_TAG,\n `${rpcName} failed with error: `,\n err,\n 'url: ',\n url,\n 'request:',\n req\n );\n throw err;\n }\n );\n }\n\n invokeStreamingRPC<Req, Resp>(\n rpcName: string,\n path: string,\n request: Req,\n token: Token | null\n ): Promise<Resp[]> {\n // The REST API automatically aggregates all of the streamed results, so we\n // can just use the normal invoke() method.\n return this.invokeRPC<Req, Resp[]>(rpcName, path, request, token);\n }\n\n abstract openStream<Req, Resp>(\n rpcName: string,\n token: Token | null\n ): Stream<Req, Resp>;\n\n /**\n * Modifies the headers for a request, adding any authorization token if\n * present and any additional headers for the request.\n */\n protected modifyHeadersForRequest(\n headers: StringMap,\n token: Token | null\n ): void {\n headers['X-Goog-Api-Client'] = getGoogApiClientValue();\n\n // Content-Type: text/plain will avoid preflight requests which might\n // mess with CORS and redirects by proxies. If we add custom headers\n // we will need to change this code to potentially use the $httpOverwrite\n // parameter supported by ESF to avoid triggering preflight requests.\n headers['Content-Type'] = 'text/plain';\n\n if (this.databaseInfo.appId) {\n headers['X-Firebase-GMPID'] = this.databaseInfo.appId;\n }\n if (token) {\n for (const header in token.authHeaders) {\n if (token.authHeaders.hasOwnProperty(header)) {\n headers[header] = token.authHeaders[header];\n }\n }\n }\n }\n\n /**\n * Performs an RPC request using an implementation specific networking layer.\n */\n protected abstract performRPCRequest<Req, Resp>(\n rpcName: string,\n url: string,\n headers: StringMap,\n body: Req\n ): Promise<Resp>;\n\n private makeUrl(rpcName: string, path: string): string {\n const urlRpcName = RPC_NAME_URL_MAPPING[rpcName];\n debugAssert(\n urlRpcName !== undefined,\n 'Unknown REST mapping for: ' + rpcName\n );\n return `${this.baseUrl}/${RPC_URL_VERSION}/${path}:${urlRpcName}`;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from '../util/assert';\nimport { FirestoreError } from '../util/error';\n\nimport { Stream } from './connection';\n\n/**\n * Provides a simple helper class that implements the Stream interface to\n * bridge to other implementations that are streams but do not implement the\n * interface. The stream callbacks are invoked with the callOn... methods.\n */\nexport class StreamBridge<I, O> implements Stream<I, O> {\n private wrappedOnOpen: (() => void) | undefined;\n private wrappedOnClose: ((err?: FirestoreError) => void) | undefined;\n private wrappedOnMessage: ((msg: O) => void) | undefined;\n\n private sendFn: (msg: I) => void;\n private closeFn: () => void;\n\n constructor(args: { sendFn: (msg: I) => void; closeFn: () => void }) {\n this.sendFn = args.sendFn;\n this.closeFn = args.closeFn;\n }\n\n onOpen(callback: () => void): void {\n debugAssert(!this.wrappedOnOpen, 'Called onOpen on stream twice!');\n this.wrappedOnOpen = callback;\n }\n\n onClose(callback: (err?: FirestoreError) => void): void {\n debugAssert(!this.wrappedOnClose, 'Called onClose on stream twice!');\n this.wrappedOnClose = callback;\n }\n\n onMessage(callback: (msg: O) => void): void {\n debugAssert(!this.wrappedOnMessage, 'Called onMessage on stream twice!');\n this.wrappedOnMessage = callback;\n }\n\n close(): void {\n this.closeFn();\n }\n\n send(msg: I): void {\n this.sendFn(msg);\n }\n\n callOnOpen(): void {\n debugAssert(\n this.wrappedOnOpen !== undefined,\n 'Cannot call onOpen because no callback was set'\n );\n this.wrappedOnOpen();\n }\n\n callOnClose(err?: FirestoreError): void {\n debugAssert(\n this.wrappedOnClose !== undefined,\n 'Cannot call onClose because no callback was set'\n );\n this.wrappedOnClose(err);\n }\n\n callOnMessage(msg: O): void {\n debugAssert(\n this.wrappedOnMessage !== undefined,\n 'Cannot call onMessage because no callback was set'\n );\n this.wrappedOnMessage(msg);\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n isBrowserExtension,\n isElectron,\n isIE,\n isMobileCordova,\n isReactNative,\n isUWP\n} from '@firebase/util';\nimport {\n createWebChannelTransport,\n ErrorCode,\n EventType,\n WebChannel,\n WebChannelError,\n WebChannelOptions,\n FetchXmlHttpFactory,\n XhrIo,\n getStatEventTarget,\n EventTarget,\n StatEvent,\n Event,\n Stat\n} from '@firebase/webchannel-wrapper';\n\nimport { Token } from '../../api/credentials';\nimport { DatabaseInfo } from '../../core/database_info';\nimport { Stream } from '../../remote/connection';\nimport { RestConnection } from '../../remote/rest_connection';\nimport {\n mapCodeFromRpcStatus,\n mapCodeFromHttpResponseErrorStatus\n} from '../../remote/rpc_error';\nimport { StreamBridge } from '../../remote/stream_bridge';\nimport { fail, hardAssert } from '../../util/assert';\nimport { Code, FirestoreError } from '../../util/error';\nimport { logDebug, logWarn } from '../../util/log';\nimport { Rejecter, Resolver } from '../../util/promise';\nimport { StringMap } from '../../util/types';\n\nconst LOG_TAG = 'Connection';\n\nconst RPC_STREAM_SERVICE = 'google.firestore.v1.Firestore';\n\nconst XHR_TIMEOUT_SECS = 15;\n\nexport class WebChannelConnection extends RestConnection {\n private readonly forceLongPolling: boolean;\n private readonly autoDetectLongPolling: boolean;\n private readonly useFetchStreams: boolean;\n\n constructor(info: DatabaseInfo) {\n super(info);\n this.forceLongPolling = info.forceLongPolling;\n this.autoDetectLongPolling = info.autoDetectLongPolling;\n this.useFetchStreams = info.useFetchStreams;\n }\n\n protected performRPCRequest<Req, Resp>(\n rpcName: string,\n url: string,\n headers: StringMap,\n body: Req\n ): Promise<Resp> {\n return new Promise((resolve: Resolver<Resp>, reject: Rejecter) => {\n const xhr = new XhrIo();\n xhr.listenOnce(EventType.COMPLETE, () => {\n try {\n switch (xhr.getLastErrorCode()) {\n case ErrorCode.NO_ERROR:\n const json = xhr.getResponseJson() as Resp;\n logDebug(LOG_TAG, 'XHR received:', JSON.stringify(json));\n resolve(json);\n break;\n case ErrorCode.TIMEOUT:\n logDebug(LOG_TAG, 'RPC \"' + rpcName + '\" timed out');\n reject(\n new FirestoreError(Code.DEADLINE_EXCEEDED, 'Request time out')\n );\n break;\n case ErrorCode.HTTP_ERROR:\n const status = xhr.getStatus();\n logDebug(\n LOG_TAG,\n 'RPC \"' + rpcName + '\" failed with status:',\n status,\n 'response text:',\n xhr.getResponseText()\n );\n if (status > 0) {\n const responseError = (xhr.getResponseJson() as WebChannelError)\n .error;\n if (\n !!responseError &&\n !!responseError.status &&\n !!responseError.message\n ) {\n const firestoreErrorCode = mapCodeFromHttpResponseErrorStatus(\n responseError.status\n );\n reject(\n new FirestoreError(\n firestoreErrorCode,\n responseError.message\n )\n );\n } else {\n reject(\n new FirestoreError(\n Code.UNKNOWN,\n 'Server responded with status ' + xhr.getStatus()\n )\n );\n }\n } else {\n // If we received an HTTP_ERROR but there's no status code,\n // it's most probably a connection issue\n reject(\n new FirestoreError(Code.UNAVAILABLE, 'Connection failed.')\n );\n }\n break;\n default:\n fail(\n 'RPC \"' +\n rpcName +\n '\" failed with unanticipated ' +\n 'webchannel error ' +\n xhr.getLastErrorCode() +\n ': ' +\n xhr.getLastError() +\n ', giving up.'\n );\n }\n } finally {\n logDebug(LOG_TAG, 'RPC \"' + rpcName + '\" completed.');\n }\n });\n\n const requestString = JSON.stringify(body);\n xhr.send(url, 'POST', requestString, headers, XHR_TIMEOUT_SECS);\n });\n }\n\n openStream<Req, Resp>(\n rpcName: string,\n token: Token | null\n ): Stream<Req, Resp> {\n const urlParts = [\n this.baseUrl,\n '/',\n RPC_STREAM_SERVICE,\n '/',\n rpcName,\n '/channel'\n ];\n const webchannelTransport = createWebChannelTransport();\n const requestStats = getStatEventTarget();\n const request: WebChannelOptions = {\n // Required for backend stickiness, routing behavior is based on this\n // parameter.\n httpSessionIdParam: 'gsessionid',\n initMessageHeaders: {},\n messageUrlParams: {\n // This param is used to improve routing and project isolation by the\n // backend and must be included in every request.\n database: `projects/${this.databaseId.projectId}/databases/${this.databaseId.database}`\n },\n sendRawJson: true,\n supportsCrossDomainXhr: true,\n internalChannelParams: {\n // Override the default timeout (randomized between 10-20 seconds) since\n // a large write batch on a slow internet connection may take a long\n // time to send to the backend. Rather than have WebChannel impose a\n // tight timeout which could lead to infinite timeouts and retries, we\n // set it very large (5-10 minutes) and rely on the browser's builtin\n // timeouts to kick in if the request isn't working.\n forwardChannelRequestTimeoutMs: 10 * 60 * 1000\n },\n forceLongPolling: this.forceLongPolling,\n detectBufferingProxy: this.autoDetectLongPolling\n };\n\n if (this.useFetchStreams) {\n request.xmlHttpFactory = new FetchXmlHttpFactory({});\n }\n\n this.modifyHeadersForRequest(request.initMessageHeaders!, token);\n\n // Sending the custom headers we just added to request.initMessageHeaders\n // (Authorization, etc.) will trigger the browser to make a CORS preflight\n // request because the XHR will no longer meet the criteria for a \"simple\"\n // CORS request:\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests\n //\n // Therefore to avoid the CORS preflight request (an extra network\n // roundtrip), we use the httpHeadersOverwriteParam option to specify that\n // the headers should instead be encoded into a special \"$httpHeaders\" query\n // parameter, which is recognized by the webchannel backend. This is\n // formally defined here:\n // https://github.com/google/closure-library/blob/b0e1815b13fb92a46d7c9b3c30de5d6a396a3245/closure/goog/net/rpc/httpcors.js#L32\n //\n // TODO(b/145624756): There is a backend bug where $httpHeaders isn't respected if the request\n // doesn't have an Origin header. So we have to exclude a few browser environments that are\n // known to (sometimes) not include an Origin. See\n // https://github.com/firebase/firebase-js-sdk/issues/1491.\n if (\n !isMobileCordova() &&\n !isReactNative() &&\n !isElectron() &&\n !isIE() &&\n !isUWP() &&\n !isBrowserExtension()\n ) {\n request.httpHeadersOverwriteParam = '$httpHeaders';\n }\n\n const url = urlParts.join('');\n logDebug(LOG_TAG, 'Creating WebChannel: ' + url, request);\n const channel = webchannelTransport.createWebChannel(url, request);\n\n // WebChannel supports sending the first message with the handshake - saving\n // a network round trip. However, it will have to call send in the same\n // JS event loop as open. In order to enforce this, we delay actually\n // opening the WebChannel until send is called. Whether we have called\n // open is tracked with this variable.\n let opened = false;\n\n // A flag to determine whether the stream was closed (by us or through an\n // error/close event) to avoid delivering multiple close events or sending\n // on a closed stream\n let closed = false;\n\n const streamBridge = new StreamBridge<Req, Resp>({\n sendFn: (msg: Req) => {\n if (!closed) {\n if (!opened) {\n logDebug(LOG_TAG, 'Opening WebChannel transport.');\n channel.open();\n opened = true;\n }\n logDebug(LOG_TAG, 'WebChannel sending:', msg);\n channel.send(msg);\n } else {\n logDebug(LOG_TAG, 'Not sending because WebChannel is closed:', msg);\n }\n },\n closeFn: () => channel.close()\n });\n\n // Closure events are guarded and exceptions are swallowed, so catch any\n // exception and rethrow using a setTimeout so they become visible again.\n // Note that eventually this function could go away if we are confident\n // enough the code is exception free.\n const unguardedEventListen = <T>(\n target: EventTarget,\n type: string | number,\n fn: (param: T) => void\n ): void => {\n // TODO(dimond): closure typing seems broken because WebChannel does\n // not implement goog.events.Listenable\n target.listen(type, (param: unknown) => {\n try {\n fn(param as T);\n } catch (e) {\n setTimeout(() => {\n throw e;\n }, 0);\n }\n });\n };\n\n unguardedEventListen(channel, WebChannel.EventType.OPEN, () => {\n if (!closed) {\n logDebug(LOG_TAG, 'WebChannel transport opened.');\n }\n });\n\n unguardedEventListen(channel, WebChannel.EventType.CLOSE, () => {\n if (!closed) {\n closed = true;\n logDebug(LOG_TAG, 'WebChannel transport closed');\n streamBridge.callOnClose();\n }\n });\n\n unguardedEventListen<Error>(channel, WebChannel.EventType.ERROR, err => {\n if (!closed) {\n closed = true;\n logWarn(LOG_TAG, 'WebChannel transport errored:', err);\n streamBridge.callOnClose(\n new FirestoreError(\n Code.UNAVAILABLE,\n 'The operation could not be completed'\n )\n );\n }\n });\n\n // WebChannel delivers message events as array. If batching is not enabled\n // (it's off by default) each message will be delivered alone, resulting in\n // a single element array.\n interface WebChannelResponse {\n data: Resp[];\n }\n\n unguardedEventListen<WebChannelResponse>(\n channel,\n WebChannel.EventType.MESSAGE,\n msg => {\n if (!closed) {\n const msgData = msg.data[0];\n hardAssert(!!msgData, 'Got a webchannel message without data.');\n // TODO(b/35143891): There is a bug in One Platform that caused errors\n // (and only errors) to be wrapped in an extra array. To be forward\n // compatible with the bug we need to check either condition. The latter\n // can be removed once the fix has been rolled out.\n // Use any because msgData.error is not typed.\n const msgDataOrError: WebChannelError | object = msgData;\n const error =\n msgDataOrError.error ||\n (msgDataOrError as WebChannelError[])[0]?.error;\n if (error) {\n logDebug(LOG_TAG, 'WebChannel received error:', error);\n // error.status will be a string like 'OK' or 'NOT_FOUND'.\n const status: string = error.status;\n let code = mapCodeFromRpcStatus(status);\n let message = error.message;\n if (code === undefined) {\n code = Code.INTERNAL;\n message =\n 'Unknown error status: ' +\n status +\n ' with message ' +\n error.message;\n }\n // Mark closed so no further events are propagated\n closed = true;\n streamBridge.callOnClose(new FirestoreError(code, message));\n channel.close();\n } else {\n logDebug(LOG_TAG, 'WebChannel received:', msgData);\n streamBridge.callOnMessage(msgData);\n }\n }\n }\n );\n\n unguardedEventListen<StatEvent>(requestStats, Event.STAT_EVENT, event => {\n if (event.stat === Stat.PROXY) {\n logDebug(LOG_TAG, 'Detected buffering proxy');\n } else if (event.stat === Stat.NOPROXY) {\n logDebug(LOG_TAG, 'Detected no buffering proxy');\n }\n });\n\n setTimeout(() => {\n // Technically we could/should wait for the WebChannel opened event,\n // but because we want to send the first message with the WebChannel\n // handshake we pretend the channel opened here (asynchronously), and\n // then delay the actual open until the first message is sent.\n streamBridge.callOnOpen();\n }, 0);\n return streamBridge;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** The Platform's 'window' implementation or null if not available. */\nexport function getWindow(): Window | null {\n // `window` is not always available, e.g. in ReactNative and WebWorkers.\n // eslint-disable-next-line no-restricted-globals\n return typeof window !== 'undefined' ? window : null;\n}\n\n/** The Platform's 'document' implementation or null if not available. */\nexport function getDocument(): Document | null {\n // `document` is not always available, e.g. in ReactNative and WebWorkers.\n // eslint-disable-next-line no-restricted-globals\n return typeof document !== 'undefined' ? document : null;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Return the Platform-specific serializer monitor. */\nimport { DatabaseId } from '../../core/database_info';\nimport { JsonProtoSerializer } from '../../remote/serializer';\n\nexport function newSerializer(databaseId: DatabaseId): JsonProtoSerializer {\n return new JsonProtoSerializer(databaseId, /* useProto3Json= */ true);\n}\n\n/**\n * An instance of the Platform's 'TextEncoder' implementation.\n */\nexport function newTextEncoder(): TextEncoder {\n return new TextEncoder();\n}\n\n/**\n * An instance of the Platform's 'TextDecoder' implementation.\n */\nexport function newTextDecoder(): TextDecoder {\n return new TextDecoder('utf-8');\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AsyncQueue, DelayedOperation, TimerId } from '../util/async_queue';\nimport { logDebug } from '../util/log';\n\nconst LOG_TAG = 'ExponentialBackoff';\n\n/**\n * Initial backoff time in milliseconds after an error.\n * Set to 1s according to https://cloud.google.com/apis/design/errors.\n */\nconst DEFAULT_BACKOFF_INITIAL_DELAY_MS = 1000;\n\nconst DEFAULT_BACKOFF_FACTOR = 1.5;\n\n/** Maximum backoff time in milliseconds */\nconst DEFAULT_BACKOFF_MAX_DELAY_MS = 60 * 1000;\n\n/**\n * A helper for running delayed tasks following an exponential backoff curve\n * between attempts.\n *\n * Each delay is made up of a \"base\" delay which follows the exponential\n * backoff curve, and a +/- 50% \"jitter\" that is calculated and added to the\n * base delay. This prevents clients from accidentally synchronizing their\n * delays causing spikes of load to the backend.\n */\nexport class ExponentialBackoff {\n private currentBaseMs: number = 0;\n private timerPromise: DelayedOperation<void> | null = null;\n /** The last backoff attempt, as epoch milliseconds. */\n private lastAttemptTime = Date.now();\n\n constructor(\n /**\n * The AsyncQueue to run backoff operations on.\n */\n private readonly queue: AsyncQueue,\n /**\n * The ID to use when scheduling backoff operations on the AsyncQueue.\n */\n private readonly timerId: TimerId,\n /**\n * The initial delay (used as the base delay on the first retry attempt).\n * Note that jitter will still be applied, so the actual delay could be as\n * little as 0.5*initialDelayMs.\n */\n private readonly initialDelayMs: number = DEFAULT_BACKOFF_INITIAL_DELAY_MS,\n /**\n * The multiplier to use to determine the extended base delay after each\n * attempt.\n */\n private readonly backoffFactor: number = DEFAULT_BACKOFF_FACTOR,\n /**\n * The maximum base delay after which no further backoff is performed.\n * Note that jitter will still be applied, so the actual delay could be as\n * much as 1.5*maxDelayMs.\n */\n private readonly maxDelayMs: number = DEFAULT_BACKOFF_MAX_DELAY_MS\n ) {\n this.reset();\n }\n\n /**\n * Resets the backoff delay.\n *\n * The very next backoffAndWait() will have no delay. If it is called again\n * (i.e. due to an error), initialDelayMs (plus jitter) will be used, and\n * subsequent ones will increase according to the backoffFactor.\n */\n reset(): void {\n this.currentBaseMs = 0;\n }\n\n /**\n * Resets the backoff delay to the maximum delay (e.g. for use after a\n * RESOURCE_EXHAUSTED error).\n */\n resetToMax(): void {\n this.currentBaseMs = this.maxDelayMs;\n }\n\n /**\n * Returns a promise that resolves after currentDelayMs, and increases the\n * delay for any subsequent attempts. If there was a pending backoff operation\n * already, it will be canceled.\n */\n backoffAndRun(op: () => Promise<void>): void {\n // Cancel any pending backoff operation.\n this.cancel();\n\n // First schedule using the current base (which may be 0 and should be\n // honored as such).\n const desiredDelayWithJitterMs = Math.floor(\n this.currentBaseMs + this.jitterDelayMs()\n );\n\n // Guard against lastAttemptTime being in the future due to a clock change.\n const delaySoFarMs = Math.max(0, Date.now() - this.lastAttemptTime);\n\n // Guard against the backoff delay already being past.\n const remainingDelayMs = Math.max(\n 0,\n desiredDelayWithJitterMs - delaySoFarMs\n );\n\n if (remainingDelayMs > 0) {\n logDebug(\n LOG_TAG,\n `Backing off for ${remainingDelayMs} ms ` +\n `(base delay: ${this.currentBaseMs} ms, ` +\n `delay with jitter: ${desiredDelayWithJitterMs} ms, ` +\n `last attempt: ${delaySoFarMs} ms ago)`\n );\n }\n\n this.timerPromise = this.queue.enqueueAfterDelay(\n this.timerId,\n remainingDelayMs,\n () => {\n this.lastAttemptTime = Date.now();\n return op();\n }\n );\n\n // Apply backoff factor to determine next delay and ensure it is within\n // bounds.\n this.currentBaseMs *= this.backoffFactor;\n if (this.currentBaseMs < this.initialDelayMs) {\n this.currentBaseMs = this.initialDelayMs;\n }\n if (this.currentBaseMs > this.maxDelayMs) {\n this.currentBaseMs = this.maxDelayMs;\n }\n }\n\n skipBackoff(): void {\n if (this.timerPromise !== null) {\n this.timerPromise.skipDelay();\n this.timerPromise = null;\n }\n }\n\n cancel(): void {\n if (this.timerPromise !== null) {\n this.timerPromise.cancel();\n this.timerPromise = null;\n }\n }\n\n /** Returns a random value in the range [-currentBaseMs/2, currentBaseMs/2] */\n private jitterDelayMs(): number {\n return (Math.random() - 0.5) * this.currentBaseMs;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CredentialsProvider, Token } from '../api/credentials';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { TargetId } from '../core/types';\nimport { TargetData } from '../local/target_data';\nimport { Mutation, MutationResult } from '../model/mutation';\nimport {\n ListenRequest as ProtoListenRequest,\n ListenResponse as ProtoListenResponse,\n WriteRequest as ProtoWriteRequest,\n WriteResponse as ProtoWriteResponse\n} from '../protos/firestore_proto_api';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { AsyncQueue, DelayedOperation, TimerId } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug, logError } from '../util/log';\nimport { isNullOrUndefined } from '../util/types';\n\nimport { ExponentialBackoff } from './backoff';\nimport { Connection, Stream } from './connection';\nimport {\n fromVersion,\n fromWatchChange,\n fromWriteResults,\n getEncodedDatabaseId,\n JsonProtoSerializer,\n toListenRequestLabels,\n toMutation,\n toTarget,\n versionFromListenResponse\n} from './serializer';\nimport { WatchChange } from './watch_change';\n\nconst LOG_TAG = 'PersistentStream';\n\n// The generated proto interfaces for these class are missing the database\n// field. So we add it here.\n// TODO(b/36015800): Remove this once the api generator is fixed.\ninterface ListenRequest extends ProtoListenRequest {\n database?: string;\n}\nexport interface WriteRequest extends ProtoWriteRequest {\n database?: string;\n}\n/**\n * PersistentStream can be in one of 5 states (each described in detail below)\n * based on the following state transition diagram:\n *\n * start() called auth & connection succeeded\n * INITIAL ----------------> STARTING -----------------------------> OPEN\n * ^ | |\n * | | error occurred |\n * | \\-----------------------------v-----/\n * | |\n * backoff | |\n * elapsed | start() called |\n * \\--- BACKOFF <---------------- ERROR\n *\n * [any state] --------------------------> INITIAL\n * stop() called or\n * idle timer expired\n */\nconst enum PersistentStreamState {\n /**\n * The streaming RPC is not yet running and there's no error condition.\n * Calling start() will start the stream immediately without backoff.\n * While in this state isStarted() will return false.\n */\n Initial,\n\n /**\n * The stream is starting, either waiting for an auth token or for the stream\n * to successfully open. While in this state, isStarted() will return true but\n * isOpen() will return false.\n */\n Starting,\n\n /**\n * The streaming RPC is up and running. Requests and responses can flow\n * freely. Both isStarted() and isOpen() will return true.\n */\n Open,\n\n /**\n * The stream encountered an error. The next start attempt will back off.\n * While in this state isStarted() will return false.\n */\n Error,\n\n /**\n * An in-between state after an error where the stream is waiting before\n * re-starting. After waiting is complete, the stream will try to open.\n * While in this state isStarted() will return true but isOpen() will return\n * false.\n */\n Backoff\n}\n\n/**\n * Provides a common interface that is shared by the listeners for stream\n * events by the concrete implementation classes.\n */\nexport interface PersistentStreamListener {\n /**\n * Called after the stream was established and can accept outgoing\n * messages\n */\n onOpen: () => Promise<void>;\n /**\n * Called after the stream has closed. If there was an error, the\n * FirestoreError will be set.\n */\n onClose: (err?: FirestoreError) => Promise<void>;\n}\n\n/** The time a stream stays open after it is marked idle. */\nconst IDLE_TIMEOUT_MS = 60 * 1000;\n\n/**\n * A PersistentStream is an abstract base class that represents a streaming RPC\n * to the Firestore backend. It's built on top of the connections own support\n * for streaming RPCs, and adds several critical features for our clients:\n *\n * - Exponential backoff on failure\n * - Authentication via CredentialsProvider\n * - Dispatching all callbacks into the shared worker queue\n * - Closing idle streams after 60 seconds of inactivity\n *\n * Subclasses of PersistentStream implement serialization of models to and\n * from the JSON representation of the protocol buffers for a specific\n * streaming RPC.\n *\n * ## Starting and Stopping\n *\n * Streaming RPCs are stateful and need to be start()ed before messages can\n * be sent and received. The PersistentStream will call the onOpen() function\n * of the listener once the stream is ready to accept requests.\n *\n * Should a start() fail, PersistentStream will call the registered onClose()\n * listener with a FirestoreError indicating what went wrong.\n *\n * A PersistentStream can be started and stopped repeatedly.\n *\n * Generic types:\n * SendType: The type of the outgoing message of the underlying\n * connection stream\n * ReceiveType: The type of the incoming message of the underlying\n * connection stream\n * ListenerType: The type of the listener that will be used for callbacks\n */\nexport abstract class PersistentStream<\n SendType,\n ReceiveType,\n ListenerType extends PersistentStreamListener\n> {\n private state = PersistentStreamState.Initial;\n /**\n * A close count that's incremented every time the stream is closed; used by\n * getCloseGuardedDispatcher() to invalidate callbacks that happen after\n * close.\n */\n private closeCount = 0;\n\n private idleTimer: DelayedOperation<void> | null = null;\n private stream: Stream<SendType, ReceiveType> | null = null;\n\n protected backoff: ExponentialBackoff;\n\n constructor(\n private queue: AsyncQueue,\n connectionTimerId: TimerId,\n private idleTimerId: TimerId,\n protected connection: Connection,\n private credentialsProvider: CredentialsProvider,\n protected listener: ListenerType\n ) {\n this.backoff = new ExponentialBackoff(queue, connectionTimerId);\n }\n\n /**\n * Returns true if start() has been called and no error has occurred. True\n * indicates the stream is open or in the process of opening (which\n * encompasses respecting backoff, getting auth tokens, and starting the\n * actual RPC). Use isOpen() to determine if the stream is open and ready for\n * outbound requests.\n */\n isStarted(): boolean {\n return (\n this.state === PersistentStreamState.Starting ||\n this.state === PersistentStreamState.Open ||\n this.state === PersistentStreamState.Backoff\n );\n }\n\n /**\n * Returns true if the underlying RPC is open (the onOpen() listener has been\n * called) and the stream is ready for outbound requests.\n */\n isOpen(): boolean {\n return this.state === PersistentStreamState.Open;\n }\n\n /**\n * Starts the RPC. Only allowed if isStarted() returns false. The stream is\n * not immediately ready for use: onOpen() will be invoked when the RPC is\n * ready for outbound requests, at which point isOpen() will return true.\n *\n * When start returns, isStarted() will return true.\n */\n start(): void {\n if (this.state === PersistentStreamState.Error) {\n this.performBackoff();\n return;\n }\n\n debugAssert(\n this.state === PersistentStreamState.Initial,\n 'Already started'\n );\n this.auth();\n }\n\n /**\n * Stops the RPC. This call is idempotent and allowed regardless of the\n * current isStarted() state.\n *\n * When stop returns, isStarted() and isOpen() will both return false.\n */\n async stop(): Promise<void> {\n if (this.isStarted()) {\n await this.close(PersistentStreamState.Initial);\n }\n }\n\n /**\n * After an error the stream will usually back off on the next attempt to\n * start it. If the error warrants an immediate restart of the stream, the\n * sender can use this to indicate that the receiver should not back off.\n *\n * Each error will call the onClose() listener. That function can decide to\n * inhibit backoff if required.\n */\n inhibitBackoff(): void {\n debugAssert(\n !this.isStarted(),\n 'Can only inhibit backoff in a stopped state'\n );\n\n this.state = PersistentStreamState.Initial;\n this.backoff.reset();\n }\n\n /**\n * Marks this stream as idle. If no further actions are performed on the\n * stream for one minute, the stream will automatically close itself and\n * notify the stream's onClose() handler with Status.OK. The stream will then\n * be in a !isStarted() state, requiring the caller to start the stream again\n * before further use.\n *\n * Only streams that are in state 'Open' can be marked idle, as all other\n * states imply pending network operations.\n */\n markIdle(): void {\n // Starts the idle time if we are in state 'Open' and are not yet already\n // running a timer (in which case the previous idle timeout still applies).\n if (this.isOpen() && this.idleTimer === null) {\n this.idleTimer = this.queue.enqueueAfterDelay(\n this.idleTimerId,\n IDLE_TIMEOUT_MS,\n () => this.handleIdleCloseTimer()\n );\n }\n }\n\n /** Sends a message to the underlying stream. */\n protected sendRequest(msg: SendType): void {\n this.cancelIdleCheck();\n this.stream!.send(msg);\n }\n\n /** Called by the idle timer when the stream should close due to inactivity. */\n private async handleIdleCloseTimer(): Promise<void> {\n if (this.isOpen()) {\n // When timing out an idle stream there's no reason to force the stream into backoff when\n // it restarts so set the stream state to Initial instead of Error.\n return this.close(PersistentStreamState.Initial);\n }\n }\n\n /** Marks the stream as active again. */\n private cancelIdleCheck(): void {\n if (this.idleTimer) {\n this.idleTimer.cancel();\n this.idleTimer = null;\n }\n }\n\n /**\n * Closes the stream and cleans up as necessary:\n *\n * * closes the underlying GRPC stream;\n * * calls the onClose handler with the given 'error';\n * * sets internal stream state to 'finalState';\n * * adjusts the backoff timer based on the error\n *\n * A new stream can be opened by calling start().\n *\n * @param finalState - the intended state of the stream after closing.\n * @param error - the error the connection was closed with.\n */\n private async close(\n finalState: PersistentStreamState,\n error?: FirestoreError\n ): Promise<void> {\n debugAssert(this.isStarted(), 'Only started streams should be closed.');\n debugAssert(\n finalState === PersistentStreamState.Error || isNullOrUndefined(error),\n \"Can't provide an error when not in an error state.\"\n );\n\n // Cancel any outstanding timers (they're guaranteed not to execute).\n this.cancelIdleCheck();\n this.backoff.cancel();\n\n // Invalidates any stream-related callbacks (e.g. from auth or the\n // underlying stream), guaranteeing they won't execute.\n this.closeCount++;\n\n if (finalState !== PersistentStreamState.Error) {\n // If this is an intentional close ensure we don't delay our next connection attempt.\n this.backoff.reset();\n } else if (error && error.code === Code.RESOURCE_EXHAUSTED) {\n // Log the error. (Probably either 'quota exceeded' or 'max queue length reached'.)\n logError(error.toString());\n logError(\n 'Using maximum backoff delay to prevent overloading the backend.'\n );\n this.backoff.resetToMax();\n } else if (error && error.code === Code.UNAUTHENTICATED) {\n // \"unauthenticated\" error means the token was rejected. Try force refreshing it in case it\n // just expired.\n this.credentialsProvider.invalidateToken();\n }\n\n // Clean up the underlying stream because we are no longer interested in events.\n if (this.stream !== null) {\n this.tearDown();\n this.stream.close();\n this.stream = null;\n }\n\n // This state must be assigned before calling onClose() to allow the callback to\n // inhibit backoff or otherwise manipulate the state in its non-started state.\n this.state = finalState;\n\n // Notify the listener that the stream closed.\n await this.listener.onClose(error);\n }\n\n /**\n * Can be overridden to perform additional cleanup before the stream is closed.\n * Calling super.tearDown() is not required.\n */\n protected tearDown(): void {}\n\n /**\n * Used by subclasses to start the concrete RPC and return the underlying\n * connection stream.\n */\n protected abstract startRpc(\n token: Token | null\n ): Stream<SendType, ReceiveType>;\n\n /**\n * Called after the stream has received a message. The function will be\n * called on the right queue and must return a Promise.\n * @param message - The message received from the stream.\n */\n protected abstract onMessage(message: ReceiveType): Promise<void>;\n\n private auth(): void {\n debugAssert(\n this.state === PersistentStreamState.Initial,\n 'Must be in initial state to auth'\n );\n\n this.state = PersistentStreamState.Starting;\n\n const dispatchIfNotClosed = this.getCloseGuardedDispatcher(this.closeCount);\n\n // TODO(mikelehen): Just use dispatchIfNotClosed, but see TODO below.\n const closeCount = this.closeCount;\n\n this.credentialsProvider.getToken().then(\n token => {\n // Stream can be stopped while waiting for authentication.\n // TODO(mikelehen): We really should just use dispatchIfNotClosed\n // and let this dispatch onto the queue, but that opened a spec test can\n // of worms that I don't want to deal with in this PR.\n if (this.closeCount === closeCount) {\n // Normally we'd have to schedule the callback on the AsyncQueue.\n // However, the following calls are safe to be called outside the\n // AsyncQueue since they don't chain asynchronous calls\n this.startStream(token);\n }\n },\n (error: Error) => {\n dispatchIfNotClosed(() => {\n const rpcError = new FirestoreError(\n Code.UNKNOWN,\n 'Fetching auth token failed: ' + error.message\n );\n return this.handleStreamClose(rpcError);\n });\n }\n );\n }\n\n private startStream(token: Token | null): void {\n debugAssert(\n this.state === PersistentStreamState.Starting,\n 'Trying to start stream in a non-starting state'\n );\n\n const dispatchIfNotClosed = this.getCloseGuardedDispatcher(this.closeCount);\n\n this.stream = this.startRpc(token);\n this.stream.onOpen(() => {\n dispatchIfNotClosed(() => {\n debugAssert(\n this.state === PersistentStreamState.Starting,\n 'Expected stream to be in state Starting, but was ' + this.state\n );\n this.state = PersistentStreamState.Open;\n return this.listener!.onOpen();\n });\n });\n this.stream.onClose((error?: FirestoreError) => {\n dispatchIfNotClosed(() => {\n return this.handleStreamClose(error);\n });\n });\n this.stream.onMessage((msg: ReceiveType) => {\n dispatchIfNotClosed(() => {\n return this.onMessage(msg);\n });\n });\n }\n\n private performBackoff(): void {\n debugAssert(\n this.state === PersistentStreamState.Error,\n 'Should only perform backoff when in Error state'\n );\n this.state = PersistentStreamState.Backoff;\n\n this.backoff.backoffAndRun(async () => {\n debugAssert(\n this.state === PersistentStreamState.Backoff,\n 'Backoff elapsed but state is now: ' + this.state\n );\n\n this.state = PersistentStreamState.Initial;\n this.start();\n debugAssert(this.isStarted(), 'PersistentStream should have started');\n });\n }\n\n // Visible for tests\n handleStreamClose(error?: FirestoreError): Promise<void> {\n debugAssert(\n this.isStarted(),\n \"Can't handle server close on non-started stream\"\n );\n logDebug(LOG_TAG, `close with error: ${error}`);\n\n this.stream = null;\n\n // In theory the stream could close cleanly, however, in our current model\n // we never expect this to happen because if we stop a stream ourselves,\n // this callback will never be called. To prevent cases where we retry\n // without a backoff accidentally, we set the stream to error in all cases.\n return this.close(PersistentStreamState.Error, error);\n }\n\n /**\n * Returns a \"dispatcher\" function that dispatches operations onto the\n * AsyncQueue but only runs them if closeCount remains unchanged. This allows\n * us to turn auth / stream callbacks into no-ops if the stream is closed /\n * re-opened, etc.\n */\n private getCloseGuardedDispatcher(\n startCloseCount: number\n ): (fn: () => Promise<void>) => void {\n return (fn: () => Promise<void>): void => {\n this.queue.enqueueAndForget(() => {\n if (this.closeCount === startCloseCount) {\n return fn();\n } else {\n logDebug(\n LOG_TAG,\n 'stream callback skipped by getCloseGuardedDispatcher.'\n );\n return Promise.resolve();\n }\n });\n };\n }\n}\n\n/** Listener for the PersistentWatchStream */\nexport interface WatchStreamListener extends PersistentStreamListener {\n /**\n * Called on a watchChange. The snapshot parameter will be MIN if the watch\n * change did not have a snapshot associated with it.\n */\n onWatchChange: (\n watchChange: WatchChange,\n snapshot: SnapshotVersion\n ) => Promise<void>;\n}\n\n/**\n * A PersistentStream that implements the Listen RPC.\n *\n * Once the Listen stream has called the onOpen() listener, any number of\n * listen() and unlisten() calls can be made to control what changes will be\n * sent from the server for ListenResponses.\n */\nexport class PersistentListenStream extends PersistentStream<\n ProtoListenRequest,\n ProtoListenResponse,\n WatchStreamListener\n> {\n constructor(\n queue: AsyncQueue,\n connection: Connection,\n credentials: CredentialsProvider,\n private serializer: JsonProtoSerializer,\n listener: WatchStreamListener\n ) {\n super(\n queue,\n TimerId.ListenStreamConnectionBackoff,\n TimerId.ListenStreamIdle,\n connection,\n credentials,\n listener\n );\n }\n\n protected startRpc(\n token: Token | null\n ): Stream<ProtoListenRequest, ProtoListenResponse> {\n return this.connection.openStream<ProtoListenRequest, ProtoListenResponse>(\n 'Listen',\n token\n );\n }\n\n protected onMessage(watchChangeProto: ProtoListenResponse): Promise<void> {\n // A successful response means the stream is healthy\n this.backoff.reset();\n\n const watchChange = fromWatchChange(this.serializer, watchChangeProto);\n const snapshot = versionFromListenResponse(watchChangeProto);\n return this.listener!.onWatchChange(watchChange, snapshot);\n }\n\n /**\n * Registers interest in the results of the given target. If the target\n * includes a resumeToken it will be included in the request. Results that\n * affect the target will be streamed back as WatchChange messages that\n * reference the targetId.\n */\n watch(targetData: TargetData): void {\n const request: ListenRequest = {};\n request.database = getEncodedDatabaseId(this.serializer);\n request.addTarget = toTarget(this.serializer, targetData);\n\n const labels = toListenRequestLabels(this.serializer, targetData);\n if (labels) {\n request.labels = labels;\n }\n\n this.sendRequest(request);\n }\n\n /**\n * Unregisters interest in the results of the target associated with the\n * given targetId.\n */\n unwatch(targetId: TargetId): void {\n const request: ListenRequest = {};\n request.database = getEncodedDatabaseId(this.serializer);\n request.removeTarget = targetId;\n this.sendRequest(request);\n }\n}\n\n/** Listener for the PersistentWriteStream */\nexport interface WriteStreamListener extends PersistentStreamListener {\n /**\n * Called by the PersistentWriteStream upon a successful handshake response\n * from the server, which is the receiver's cue to send any pending writes.\n */\n onHandshakeComplete: () => Promise<void>;\n\n /**\n * Called by the PersistentWriteStream upon receiving a StreamingWriteResponse\n * from the server that contains a mutation result.\n */\n onMutationResult: (\n commitVersion: SnapshotVersion,\n results: MutationResult[]\n ) => Promise<void>;\n}\n\n/**\n * A Stream that implements the Write RPC.\n *\n * The Write RPC requires the caller to maintain special streamToken\n * state in between calls, to help the server understand which responses the\n * client has processed by the time the next request is made. Every response\n * will contain a streamToken; this value must be passed to the next\n * request.\n *\n * After calling start() on this stream, the next request must be a handshake,\n * containing whatever streamToken is on hand. Once a response to this\n * request is received, all pending mutations may be submitted. When\n * submitting multiple batches of mutations at the same time, it's\n * okay to use the same streamToken for the calls to writeMutations.\n *\n * TODO(b/33271235): Use proto types\n */\nexport class PersistentWriteStream extends PersistentStream<\n ProtoWriteRequest,\n ProtoWriteResponse,\n WriteStreamListener\n> {\n private handshakeComplete_ = false;\n\n constructor(\n queue: AsyncQueue,\n connection: Connection,\n credentials: CredentialsProvider,\n private serializer: JsonProtoSerializer,\n listener: WriteStreamListener\n ) {\n super(\n queue,\n TimerId.WriteStreamConnectionBackoff,\n TimerId.WriteStreamIdle,\n connection,\n credentials,\n listener\n );\n }\n\n /**\n * The last received stream token from the server, used to acknowledge which\n * responses the client has processed. Stream tokens are opaque checkpoint\n * markers whose only real value is their inclusion in the next request.\n *\n * PersistentWriteStream manages propagating this value from responses to the\n * next request.\n */\n private lastStreamToken: string | Uint8Array | undefined;\n\n /**\n * Tracks whether or not a handshake has been successfully exchanged and\n * the stream is ready to accept mutations.\n */\n get handshakeComplete(): boolean {\n return this.handshakeComplete_;\n }\n\n // Override of PersistentStream.start\n start(): void {\n this.handshakeComplete_ = false;\n this.lastStreamToken = undefined;\n super.start();\n }\n\n protected tearDown(): void {\n if (this.handshakeComplete_) {\n this.writeMutations([]);\n }\n }\n\n protected startRpc(\n token: Token | null\n ): Stream<ProtoWriteRequest, ProtoWriteResponse> {\n return this.connection.openStream<ProtoWriteRequest, ProtoWriteResponse>(\n 'Write',\n token\n );\n }\n\n protected onMessage(responseProto: ProtoWriteResponse): Promise<void> {\n // Always capture the last stream token.\n hardAssert(\n !!responseProto.streamToken,\n 'Got a write response without a stream token'\n );\n this.lastStreamToken = responseProto.streamToken;\n\n if (!this.handshakeComplete_) {\n // The first response is always the handshake response\n hardAssert(\n !responseProto.writeResults || responseProto.writeResults.length === 0,\n 'Got mutation results for handshake'\n );\n this.handshakeComplete_ = true;\n return this.listener!.onHandshakeComplete();\n } else {\n // A successful first write response means the stream is healthy,\n // Note, that we could consider a successful handshake healthy, however,\n // the write itself might be causing an error we want to back off from.\n this.backoff.reset();\n\n const results = fromWriteResults(\n responseProto.writeResults,\n responseProto.commitTime\n );\n const commitVersion = fromVersion(responseProto.commitTime!);\n return this.listener!.onMutationResult(commitVersion, results);\n }\n }\n\n /**\n * Sends an initial streamToken to the server, performing the handshake\n * required to make the StreamingWrite RPC work. Subsequent\n * calls should wait until onHandshakeComplete was called.\n */\n writeHandshake(): void {\n debugAssert(this.isOpen(), 'Writing handshake requires an opened stream');\n debugAssert(!this.handshakeComplete_, 'Handshake already completed');\n debugAssert(\n !this.lastStreamToken,\n 'Stream token should be empty during handshake'\n );\n // TODO(dimond): Support stream resumption. We intentionally do not set the\n // stream token on the handshake, ignoring any stream token we might have.\n const request: WriteRequest = {};\n request.database = getEncodedDatabaseId(this.serializer);\n this.sendRequest(request);\n }\n\n /** Sends a group of mutations to the Firestore backend to apply. */\n writeMutations(mutations: Mutation[]): void {\n debugAssert(this.isOpen(), 'Writing mutations requires an opened stream');\n debugAssert(\n this.handshakeComplete_,\n 'Handshake must be complete before writing mutations'\n );\n debugAssert(\n !!this.lastStreamToken,\n 'Trying to write mutation without a token'\n );\n\n const request: WriteRequest = {\n streamToken: this.lastStreamToken,\n writes: mutations.map(mutation => toMutation(this.serializer, mutation))\n };\n\n this.sendRequest(request);\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CredentialsProvider } from '../api/credentials';\nimport { Query, queryToTarget } from '../core/query';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { Mutation } from '../model/mutation';\nimport {\n BatchGetDocumentsRequest as ProtoBatchGetDocumentsRequest,\n BatchGetDocumentsResponse as ProtoBatchGetDocumentsResponse,\n RunQueryRequest as ProtoRunQueryRequest,\n RunQueryResponse as ProtoRunQueryResponse\n} from '../protos/firestore_proto_api';\nimport { debugAssert, debugCast, hardAssert } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\n\nimport { Connection } from './connection';\nimport {\n PersistentListenStream,\n PersistentWriteStream,\n WatchStreamListener,\n WriteStreamListener\n} from './persistent_stream';\nimport {\n fromDocument,\n fromBatchGetDocumentsResponse,\n getEncodedDatabaseId,\n JsonProtoSerializer,\n toMutation,\n toName,\n toQueryTarget\n} from './serializer';\n\n/**\n * Datastore and its related methods are a wrapper around the external Google\n * Cloud Datastore grpc API, which provides an interface that is more convenient\n * for the rest of the client SDK architecture to consume.\n */\nexport abstract class Datastore {\n abstract terminate(): void;\n}\n\n/**\n * An implementation of Datastore that exposes additional state for internal\n * consumption.\n */\nclass DatastoreImpl extends Datastore {\n terminated = false;\n\n constructor(\n readonly credentials: CredentialsProvider,\n readonly connection: Connection,\n readonly serializer: JsonProtoSerializer\n ) {\n super();\n }\n\n verifyInitialized(): void {\n debugAssert(!!this.connection, 'Datastore.start() not called');\n if (this.terminated) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'The client has already been terminated.'\n );\n }\n }\n\n /** Gets an auth token and invokes the provided RPC. */\n invokeRPC<Req, Resp>(\n rpcName: string,\n path: string,\n request: Req\n ): Promise<Resp> {\n this.verifyInitialized();\n return this.credentials\n .getToken()\n .then(token => {\n return this.connection.invokeRPC<Req, Resp>(\n rpcName,\n path,\n request,\n token\n );\n })\n .catch((error: FirestoreError) => {\n if (error.name === 'FirebaseError') {\n if (error.code === Code.UNAUTHENTICATED) {\n this.credentials.invalidateToken();\n }\n throw error;\n } else {\n throw new FirestoreError(Code.UNKNOWN, error.toString());\n }\n });\n }\n\n /** Gets an auth token and invokes the provided RPC with streamed results. */\n invokeStreamingRPC<Req, Resp>(\n rpcName: string,\n path: string,\n request: Req\n ): Promise<Resp[]> {\n this.verifyInitialized();\n return this.credentials\n .getToken()\n .then(token => {\n return this.connection.invokeStreamingRPC<Req, Resp>(\n rpcName,\n path,\n request,\n token\n );\n })\n .catch((error: FirestoreError) => {\n if (error.name === 'FirebaseError') {\n if (error.code === Code.UNAUTHENTICATED) {\n this.credentials.invalidateToken();\n }\n throw error;\n } else {\n throw new FirestoreError(Code.UNKNOWN, error.toString());\n }\n });\n }\n\n terminate(): void {\n this.terminated = true;\n }\n}\n\n// TODO(firestorexp): Make sure there is only one Datastore instance per\n// firestore-exp client.\nexport function newDatastore(\n credentials: CredentialsProvider,\n connection: Connection,\n serializer: JsonProtoSerializer\n): Datastore {\n return new DatastoreImpl(credentials, connection, serializer);\n}\n\nexport async function invokeCommitRpc(\n datastore: Datastore,\n mutations: Mutation[]\n): Promise<void> {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n const path = getEncodedDatabaseId(datastoreImpl.serializer) + '/documents';\n const request = {\n writes: mutations.map(m => toMutation(datastoreImpl.serializer, m))\n };\n await datastoreImpl.invokeRPC('Commit', path, request);\n}\n\nexport async function invokeBatchGetDocumentsRpc(\n datastore: Datastore,\n keys: DocumentKey[]\n): Promise<Document[]> {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n const path = getEncodedDatabaseId(datastoreImpl.serializer) + '/documents';\n const request = {\n documents: keys.map(k => toName(datastoreImpl.serializer, k))\n };\n const response = await datastoreImpl.invokeStreamingRPC<\n ProtoBatchGetDocumentsRequest,\n ProtoBatchGetDocumentsResponse\n >('BatchGetDocuments', path, request);\n\n const docs = new Map<string, Document>();\n response.forEach(proto => {\n const doc = fromBatchGetDocumentsResponse(datastoreImpl.serializer, proto);\n docs.set(doc.key.toString(), doc);\n });\n const result: Document[] = [];\n keys.forEach(key => {\n const doc = docs.get(key.toString());\n hardAssert(!!doc, 'Missing entity in write response for ' + key);\n result.push(doc);\n });\n return result;\n}\n\nexport async function invokeRunQueryRpc(\n datastore: Datastore,\n query: Query\n): Promise<Document[]> {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n const request = toQueryTarget(datastoreImpl.serializer, queryToTarget(query));\n const response = await datastoreImpl.invokeStreamingRPC<\n ProtoRunQueryRequest,\n ProtoRunQueryResponse\n >('RunQuery', request.parent!, { structuredQuery: request.structuredQuery });\n return (\n response\n // Omit RunQueryResponses that only contain readTimes.\n .filter(proto => !!proto.document)\n .map(proto =>\n fromDocument(datastoreImpl.serializer, proto.document!, undefined)\n )\n );\n}\n\nexport function newPersistentWriteStream(\n datastore: Datastore,\n queue: AsyncQueue,\n listener: WriteStreamListener\n): PersistentWriteStream {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n datastoreImpl.verifyInitialized();\n return new PersistentWriteStream(\n queue,\n datastoreImpl.connection,\n datastoreImpl.credentials,\n datastoreImpl.serializer,\n listener\n );\n}\n\nexport function newPersistentWatchStream(\n datastore: Datastore,\n queue: AsyncQueue,\n listener: WatchStreamListener\n): PersistentListenStream {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n datastoreImpl.verifyInitialized();\n return new PersistentListenStream(\n queue,\n datastoreImpl.connection,\n datastoreImpl.credentials,\n datastoreImpl.serializer,\n listener\n );\n}\n", "/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { OnlineState } from '../core/types';\nimport { debugAssert } from '../util/assert';\nimport { AsyncQueue, DelayedOperation, TimerId } from '../util/async_queue';\nimport { FirestoreError } from '../util/error';\nimport { logError, logDebug } from '../util/log';\n\nconst LOG_TAG = 'OnlineStateTracker';\n\n// To deal with transient failures, we allow multiple stream attempts before\n// giving up and transitioning from OnlineState.Unknown to Offline.\n// TODO(mikelehen): This used to be set to 2 as a mitigation for b/66228394.\n// @jdimond thinks that bug is sufficiently fixed so that we can set this back\n// to 1. If that works okay, we could potentially remove this logic entirely.\nconst MAX_WATCH_STREAM_FAILURES = 1;\n\n// To deal with stream attempts that don't succeed or fail in a timely manner,\n// we have a timeout for OnlineState to reach Online or Offline.\n// If the timeout is reached, we transition to Offline rather than waiting\n// indefinitely.\nconst ONLINE_STATE_TIMEOUT_MS = 10 * 1000;\n\n/**\n * A component used by the RemoteStore to track the OnlineState (that is,\n * whether or not the client as a whole should be considered to be online or\n * offline), implementing the appropriate heuristics.\n *\n * In particular, when the client is trying to connect to the backend, we\n * allow up to MAX_WATCH_STREAM_FAILURES within ONLINE_STATE_TIMEOUT_MS for\n * a connection to succeed. If we have too many failures or the timeout elapses,\n * then we set the OnlineState to Offline, and the client will behave as if\n * it is offline (get()s will return cached data, etc.).\n */\nexport class OnlineStateTracker {\n /** The current OnlineState. */\n private state = OnlineState.Unknown;\n\n /**\n * A count of consecutive failures to open the stream. If it reaches the\n * maximum defined by MAX_WATCH_STREAM_FAILURES, we'll set the OnlineState to\n * Offline.\n */\n private watchStreamFailures = 0;\n\n /**\n * A timer that elapses after ONLINE_STATE_TIMEOUT_MS, at which point we\n * transition from OnlineState.Unknown to OnlineState.Offline without waiting\n * for the stream to actually fail (MAX_WATCH_STREAM_FAILURES times).\n */\n private onlineStateTimer: DelayedOperation<void> | null = null;\n\n /**\n * Whether the client should log a warning message if it fails to connect to\n * the backend (initially true, cleared after a successful stream, or if we've\n * logged the message already).\n */\n private shouldWarnClientIsOffline = true;\n\n constructor(\n private asyncQueue: AsyncQueue,\n private onlineStateHandler: (onlineState: OnlineState) => void\n ) {}\n\n /**\n * Called by RemoteStore when a watch stream is started (including on each\n * backoff attempt).\n *\n * If this is the first attempt, it sets the OnlineState to Unknown and starts\n * the onlineStateTimer.\n */\n handleWatchStreamStart(): void {\n if (this.watchStreamFailures === 0) {\n this.setAndBroadcast(OnlineState.Unknown);\n\n debugAssert(\n this.onlineStateTimer === null,\n `onlineStateTimer shouldn't be started yet`\n );\n this.onlineStateTimer = this.asyncQueue.enqueueAfterDelay(\n TimerId.OnlineStateTimeout,\n ONLINE_STATE_TIMEOUT_MS,\n () => {\n this.onlineStateTimer = null;\n debugAssert(\n this.state === OnlineState.Unknown,\n 'Timer should be canceled if we transitioned to a different state.'\n );\n this.logClientOfflineWarningIfNecessary(\n `Backend didn't respond within ${ONLINE_STATE_TIMEOUT_MS / 1000} ` +\n `seconds.`\n );\n this.setAndBroadcast(OnlineState.Offline);\n\n // NOTE: handleWatchStreamFailure() will continue to increment\n // watchStreamFailures even though we are already marked Offline,\n // but this is non-harmful.\n\n return Promise.resolve();\n }\n );\n }\n }\n\n /**\n * Updates our OnlineState as appropriate after the watch stream reports a\n * failure. The first failure moves us to the 'Unknown' state. We then may\n * allow multiple failures (based on MAX_WATCH_STREAM_FAILURES) before we\n * actually transition to the 'Offline' state.\n */\n handleWatchStreamFailure(error: FirestoreError): void {\n if (this.state === OnlineState.Online) {\n this.setAndBroadcast(OnlineState.Unknown);\n\n // To get to OnlineState.Online, set() must have been called which would\n // have reset our heuristics.\n debugAssert(\n this.watchStreamFailures === 0,\n 'watchStreamFailures must be 0'\n );\n debugAssert(\n this.onlineStateTimer === null,\n 'onlineStateTimer must be null'\n );\n } else {\n this.watchStreamFailures++;\n if (this.watchStreamFailures >= MAX_WATCH_STREAM_FAILURES) {\n this.clearOnlineStateTimer();\n\n this.logClientOfflineWarningIfNecessary(\n `Connection failed ${MAX_WATCH_STREAM_FAILURES} ` +\n `times. Most recent error: ${error.toString()}`\n );\n\n this.setAndBroadcast(OnlineState.Offline);\n }\n }\n }\n\n /**\n * Explicitly sets the OnlineState to the specified state.\n *\n * Note that this resets our timers / failure counters, etc. used by our\n * Offline heuristics, so must not be used in place of\n * handleWatchStreamStart() and handleWatchStreamFailure().\n */\n set(newState: OnlineState): void {\n this.clearOnlineStateTimer();\n this.watchStreamFailures = 0;\n\n if (newState === OnlineState.Online) {\n // We've connected to watch at least once. Don't warn the developer\n // about being offline going forward.\n this.shouldWarnClientIsOffline = false;\n }\n\n this.setAndBroadcast(newState);\n }\n\n private setAndBroadcast(newState: OnlineState): void {\n if (newState !== this.state) {\n this.state = newState;\n this.onlineStateHandler(newState);\n }\n }\n\n private logClientOfflineWarningIfNecessary(details: string): void {\n const message =\n `Could not reach Cloud Firestore backend. ${details}\\n` +\n `This typically indicates that your device does not have a healthy ` +\n `Internet connection at the moment. The client will operate in offline ` +\n `mode until it is able to successfully connect to the backend.`;\n if (this.shouldWarnClientIsOffline) {\n logError(message);\n this.shouldWarnClientIsOffline = false;\n } else {\n logDebug(LOG_TAG, message);\n }\n }\n\n private clearOnlineStateTimer(): void {\n if (this.onlineStateTimer !== null) {\n this.onlineStateTimer.cancel();\n this.onlineStateTimer = null;\n }\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { OnlineState, TargetId } from '../core/types';\nimport { LocalStore } from '../local/local_store';\nimport {\n localStoreGetLastRemoteSnapshotVersion,\n localStoreGetNextMutationBatch\n} from '../local/local_store_impl';\nimport { isIndexedDbTransactionError } from '../local/simple_db';\nimport { TargetData, TargetPurpose } from '../local/target_data';\nimport { MutationResult } from '../model/mutation';\nimport { MutationBatch, MutationBatchResult } from '../model/mutation_batch';\nimport { debugAssert, debugCast } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { ByteString } from '../util/byte_string';\nimport { FirestoreError } from '../util/error';\nimport { logDebug } from '../util/log';\nimport { BATCHID_UNKNOWN } from '../util/types';\n\nimport { ConnectivityMonitor, NetworkStatus } from './connectivity_monitor';\nimport {\n Datastore,\n newPersistentWatchStream,\n newPersistentWriteStream\n} from './datastore';\nimport { OnlineStateTracker } from './online_state_tracker';\nimport {\n PersistentListenStream,\n PersistentWriteStream\n} from './persistent_stream';\nimport { RemoteSyncer } from './remote_syncer';\nimport { isPermanentWriteError } from './rpc_error';\nimport {\n DocumentWatchChange,\n ExistenceFilterChange,\n WatchChange,\n WatchChangeAggregator,\n WatchTargetChange,\n WatchTargetChangeState\n} from './watch_change';\n\nconst LOG_TAG = 'RemoteStore';\n\n// TODO(b/35853402): Negotiate this with the stream.\nconst MAX_PENDING_WRITES = 10;\n\n/** Reasons for why the RemoteStore may be offline. */\nconst enum OfflineCause {\n /** The user has explicitly disabled the network (via `disableNetwork()`). */\n UserDisabled,\n /** An IndexedDb failure occurred while persisting a stream update. */\n IndexedDbFailed,\n /** The tab is not the primary tab (only relevant with multi-tab). */\n IsSecondary,\n /** We are restarting the streams due to an Auth credential change. */\n CredentialChange,\n /** The connectivity state of the environment has changed. */\n ConnectivityChange,\n /** The RemoteStore has been shut down. */\n Shutdown\n}\n\n/**\n * RemoteStore - An interface to remotely stored data, basically providing a\n * wrapper around the Datastore that is more reliable for the rest of the\n * system.\n *\n * RemoteStore is responsible for maintaining the connection to the server.\n * - maintaining a list of active listens.\n * - reconnecting when the connection is dropped.\n * - resuming all the active listens on reconnect.\n *\n * RemoteStore handles all incoming events from the Datastore.\n * - listening to the watch stream and repackaging the events as RemoteEvents\n * - notifying SyncEngine of any changes to the active listens.\n *\n * RemoteStore takes writes from other components and handles them reliably.\n * - pulling pending mutations from LocalStore and sending them to Datastore.\n * - retrying mutations that failed because of network problems.\n * - acking mutations to the SyncEngine once they are accepted or rejected.\n */\nexport interface RemoteStore {\n /**\n * SyncEngine to notify of watch and write events. This must be set\n * immediately after construction.\n */\n remoteSyncer: RemoteSyncer;\n}\n\nclass RemoteStoreImpl implements RemoteStore {\n remoteSyncer: RemoteSyncer = {};\n\n /**\n * A list of up to MAX_PENDING_WRITES writes that we have fetched from the\n * LocalStore via fillWritePipeline() and have or will send to the write\n * stream.\n *\n * Whenever writePipeline.length > 0 the RemoteStore will attempt to start or\n * restart the write stream. When the stream is established the writes in the\n * pipeline will be sent in order.\n *\n * Writes remain in writePipeline until they are acknowledged by the backend\n * and thus will automatically be re-sent if the stream is interrupted /\n * restarted before they're acknowledged.\n *\n * Write responses from the backend are linked to their originating request\n * purely based on order, and so we can just shift() writes from the front of\n * the writePipeline as we receive responses.\n */\n writePipeline: MutationBatch[] = [];\n\n /**\n * A mapping of watched targets that the client cares about tracking and the\n * user has explicitly called a 'listen' for this target.\n *\n * These targets may or may not have been sent to or acknowledged by the\n * server. On re-establishing the listen stream, these targets should be sent\n * to the server. The targets removed with unlistens are removed eagerly\n * without waiting for confirmation from the listen stream.\n */\n listenTargets = new Map<TargetId, TargetData>();\n\n connectivityMonitor: ConnectivityMonitor;\n watchStream?: PersistentListenStream;\n writeStream?: PersistentWriteStream;\n watchChangeAggregator?: WatchChangeAggregator;\n\n /**\n * A set of reasons for why the RemoteStore may be offline. If empty, the\n * RemoteStore may start its network connections.\n */\n offlineCauses = new Set<OfflineCause>();\n\n /**\n * Event handlers that get called when the network is disabled or enabled.\n *\n * PORTING NOTE: These functions are used on the Web client to create the\n * underlying streams (to support tree-shakeable streams). On Android and iOS,\n * the streams are created during construction of RemoteStore.\n */\n onNetworkStatusChange: Array<(enabled: boolean) => Promise<void>> = [];\n\n onlineStateTracker: OnlineStateTracker;\n\n constructor(\n /**\n * The local store, used to fill the write pipeline with outbound mutations.\n */\n readonly localStore: LocalStore,\n /** The client-side proxy for interacting with the backend. */\n readonly datastore: Datastore,\n readonly asyncQueue: AsyncQueue,\n onlineStateHandler: (onlineState: OnlineState) => void,\n connectivityMonitor: ConnectivityMonitor\n ) {\n this.connectivityMonitor = connectivityMonitor;\n this.connectivityMonitor.addCallback((_: NetworkStatus) => {\n asyncQueue.enqueueAndForget(async () => {\n // Porting Note: Unlike iOS, `restartNetwork()` is called even when the\n // network becomes unreachable as we don't have any other way to tear\n // down our streams.\n if (canUseNetwork(this)) {\n logDebug(\n LOG_TAG,\n 'Restarting streams for network reachability change.'\n );\n await restartNetwork(this);\n }\n });\n });\n\n this.onlineStateTracker = new OnlineStateTracker(\n asyncQueue,\n onlineStateHandler\n );\n }\n}\n\nexport function newRemoteStore(\n localStore: LocalStore,\n datastore: Datastore,\n asyncQueue: AsyncQueue,\n onlineStateHandler: (onlineState: OnlineState) => void,\n connectivityMonitor: ConnectivityMonitor\n): RemoteStore {\n return new RemoteStoreImpl(\n localStore,\n datastore,\n asyncQueue,\n onlineStateHandler,\n connectivityMonitor\n );\n}\n\n/** Re-enables the network. Idempotent. */\nexport function remoteStoreEnableNetwork(\n remoteStore: RemoteStore\n): Promise<void> {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n remoteStoreImpl.offlineCauses.delete(OfflineCause.UserDisabled);\n return enableNetworkInternal(remoteStoreImpl);\n}\n\nasync function enableNetworkInternal(\n remoteStoreImpl: RemoteStoreImpl\n): Promise<void> {\n if (canUseNetwork(remoteStoreImpl)) {\n for (const networkStatusHandler of remoteStoreImpl.onNetworkStatusChange) {\n await networkStatusHandler(/* enabled= */ true);\n }\n }\n}\n\n/**\n * Temporarily disables the network. The network can be re-enabled using\n * enableNetwork().\n */\nexport async function remoteStoreDisableNetwork(\n remoteStore: RemoteStore\n): Promise<void> {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n remoteStoreImpl.offlineCauses.add(OfflineCause.UserDisabled);\n await disableNetworkInternal(remoteStoreImpl);\n\n // Set the OnlineState to Offline so get()s return from cache, etc.\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Offline);\n}\n\nasync function disableNetworkInternal(\n remoteStoreImpl: RemoteStoreImpl\n): Promise<void> {\n for (const networkStatusHandler of remoteStoreImpl.onNetworkStatusChange) {\n await networkStatusHandler(/* enabled= */ false);\n }\n}\n\nexport async function remoteStoreShutdown(\n remoteStore: RemoteStore\n): Promise<void> {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n logDebug(LOG_TAG, 'RemoteStore shutting down.');\n remoteStoreImpl.offlineCauses.add(OfflineCause.Shutdown);\n await disableNetworkInternal(remoteStoreImpl);\n remoteStoreImpl.connectivityMonitor.shutdown();\n\n // Set the OnlineState to Unknown (rather than Offline) to avoid potentially\n // triggering spurious listener events with cached data, etc.\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n}\n\n/**\n * Starts new listen for the given target. Uses resume token if provided. It\n * is a no-op if the target of given `TargetData` is already being listened to.\n */\nexport function remoteStoreListen(\n remoteStore: RemoteStore,\n targetData: TargetData\n): void {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n\n if (remoteStoreImpl.listenTargets.has(targetData.targetId)) {\n return;\n }\n\n // Mark this as something the client is currently listening for.\n remoteStoreImpl.listenTargets.set(targetData.targetId, targetData);\n\n if (shouldStartWatchStream(remoteStoreImpl)) {\n // The listen will be sent in onWatchStreamOpen\n startWatchStream(remoteStoreImpl);\n } else if (ensureWatchStream(remoteStoreImpl).isOpen()) {\n sendWatchRequest(remoteStoreImpl, targetData);\n }\n}\n\n/**\n * Removes the listen from server. It is a no-op if the given target id is\n * not being listened to.\n */\nexport function remoteStoreUnlisten(\n remoteStore: RemoteStore,\n targetId: TargetId\n): void {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n const watchStream = ensureWatchStream(remoteStoreImpl);\n\n debugAssert(\n remoteStoreImpl.listenTargets.has(targetId),\n `unlisten called on target no currently watched: ${targetId}`\n );\n\n remoteStoreImpl.listenTargets.delete(targetId);\n if (watchStream.isOpen()) {\n sendUnwatchRequest(remoteStoreImpl, targetId);\n }\n\n if (remoteStoreImpl.listenTargets.size === 0) {\n if (watchStream.isOpen()) {\n watchStream.markIdle();\n } else if (canUseNetwork(remoteStoreImpl)) {\n // Revert to OnlineState.Unknown if the watch stream is not open and we\n // have no listeners, since without any listens to send we cannot\n // confirm if the stream is healthy and upgrade to OnlineState.Online.\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n }\n }\n}\n\n/**\n * We need to increment the the expected number of pending responses we're due\n * from watch so we wait for the ack to process any messages from this target.\n */\nfunction sendWatchRequest(\n remoteStoreImpl: RemoteStoreImpl,\n targetData: TargetData\n): void {\n remoteStoreImpl.watchChangeAggregator!.recordPendingTargetRequest(\n targetData.targetId\n );\n ensureWatchStream(remoteStoreImpl).watch(targetData);\n}\n\n/**\n * We need to increment the expected number of pending responses we're due\n * from watch so we wait for the removal on the server before we process any\n * messages from this target.\n */\nfunction sendUnwatchRequest(\n remoteStoreImpl: RemoteStoreImpl,\n targetId: TargetId\n): void {\n remoteStoreImpl.watchChangeAggregator!.recordPendingTargetRequest(targetId);\n ensureWatchStream(remoteStoreImpl).unwatch(targetId);\n}\n\nfunction startWatchStream(remoteStoreImpl: RemoteStoreImpl): void {\n debugAssert(\n shouldStartWatchStream(remoteStoreImpl),\n 'startWatchStream() called when shouldStartWatchStream() is false.'\n );\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.getRemoteKeysForTarget,\n 'getRemoteKeysForTarget() not set'\n );\n\n remoteStoreImpl.watchChangeAggregator = new WatchChangeAggregator({\n getRemoteKeysForTarget: targetId =>\n remoteStoreImpl.remoteSyncer.getRemoteKeysForTarget!(targetId),\n getTargetDataForTarget: targetId =>\n remoteStoreImpl.listenTargets.get(targetId) || null\n });\n ensureWatchStream(remoteStoreImpl).start();\n remoteStoreImpl.onlineStateTracker.handleWatchStreamStart();\n}\n\n/**\n * Returns whether the watch stream should be started because it's necessary\n * and has not yet been started.\n */\nfunction shouldStartWatchStream(remoteStoreImpl: RemoteStoreImpl): boolean {\n return (\n canUseNetwork(remoteStoreImpl) &&\n !ensureWatchStream(remoteStoreImpl).isStarted() &&\n remoteStoreImpl.listenTargets.size > 0\n );\n}\n\nexport function canUseNetwork(remoteStore: RemoteStore): boolean {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n return remoteStoreImpl.offlineCauses.size === 0;\n}\n\nfunction cleanUpWatchStreamState(remoteStoreImpl: RemoteStoreImpl): void {\n remoteStoreImpl.watchChangeAggregator = undefined;\n}\n\nasync function onWatchStreamOpen(\n remoteStoreImpl: RemoteStoreImpl\n): Promise<void> {\n remoteStoreImpl.listenTargets.forEach((targetData, targetId) => {\n sendWatchRequest(remoteStoreImpl, targetData);\n });\n}\n\nasync function onWatchStreamClose(\n remoteStoreImpl: RemoteStoreImpl,\n error?: FirestoreError\n): Promise<void> {\n if (error === undefined) {\n // Graceful stop (due to stop() or idle timeout). Make sure that's\n // desirable.\n debugAssert(\n !shouldStartWatchStream(remoteStoreImpl),\n 'Watch stream was stopped gracefully while still needed.'\n );\n }\n\n cleanUpWatchStreamState(remoteStoreImpl);\n\n // If we still need the watch stream, retry the connection.\n if (shouldStartWatchStream(remoteStoreImpl)) {\n remoteStoreImpl.onlineStateTracker.handleWatchStreamFailure(error!);\n\n startWatchStream(remoteStoreImpl);\n } else {\n // No need to restart watch stream because there are no active targets.\n // The online state is set to unknown because there is no active attempt\n // at establishing a connection\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n }\n}\n\nasync function onWatchStreamChange(\n remoteStoreImpl: RemoteStoreImpl,\n watchChange: WatchChange,\n snapshotVersion: SnapshotVersion\n): Promise<void> {\n // Mark the client as online since we got a message from the server\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Online);\n\n if (\n watchChange instanceof WatchTargetChange &&\n watchChange.state === WatchTargetChangeState.Removed &&\n watchChange.cause\n ) {\n // There was an error on a target, don't wait for a consistent snapshot\n // to raise events\n try {\n await handleTargetError(remoteStoreImpl, watchChange);\n } catch (e) {\n logDebug(\n LOG_TAG,\n 'Failed to remove targets %s: %s ',\n watchChange.targetIds.join(','),\n e\n );\n await disableNetworkUntilRecovery(remoteStoreImpl, e);\n }\n return;\n }\n\n if (watchChange instanceof DocumentWatchChange) {\n remoteStoreImpl.watchChangeAggregator!.handleDocumentChange(watchChange);\n } else if (watchChange instanceof ExistenceFilterChange) {\n remoteStoreImpl.watchChangeAggregator!.handleExistenceFilter(watchChange);\n } else {\n debugAssert(\n watchChange instanceof WatchTargetChange,\n 'Expected watchChange to be an instance of WatchTargetChange'\n );\n remoteStoreImpl.watchChangeAggregator!.handleTargetChange(watchChange);\n }\n\n if (!snapshotVersion.isEqual(SnapshotVersion.min())) {\n try {\n const lastRemoteSnapshotVersion = await localStoreGetLastRemoteSnapshotVersion(\n remoteStoreImpl.localStore\n );\n if (snapshotVersion.compareTo(lastRemoteSnapshotVersion) >= 0) {\n // We have received a target change with a global snapshot if the snapshot\n // version is not equal to SnapshotVersion.min().\n await raiseWatchSnapshot(remoteStoreImpl, snapshotVersion);\n }\n } catch (e) {\n logDebug(LOG_TAG, 'Failed to raise snapshot:', e);\n await disableNetworkUntilRecovery(remoteStoreImpl, e);\n }\n }\n}\n\n/**\n * Recovery logic for IndexedDB errors that takes the network offline until\n * `op` succeeds. Retries are scheduled with backoff using\n * `enqueueRetryable()`. If `op()` is not provided, IndexedDB access is\n * validated via a generic operation.\n *\n * The returned Promise is resolved once the network is disabled and before\n * any retry attempt.\n */\nasync function disableNetworkUntilRecovery(\n remoteStoreImpl: RemoteStoreImpl,\n e: FirestoreError,\n op?: () => Promise<unknown>\n): Promise<void> {\n if (isIndexedDbTransactionError(e)) {\n debugAssert(\n !remoteStoreImpl.offlineCauses.has(OfflineCause.IndexedDbFailed),\n 'Unexpected network event when IndexedDB was marked failed.'\n );\n remoteStoreImpl.offlineCauses.add(OfflineCause.IndexedDbFailed);\n\n // Disable network and raise offline snapshots\n await disableNetworkInternal(remoteStoreImpl);\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Offline);\n\n if (!op) {\n // Use a simple read operation to determine if IndexedDB recovered.\n // Ideally, we would expose a health check directly on SimpleDb, but\n // RemoteStore only has access to persistence through LocalStore.\n op = () =>\n localStoreGetLastRemoteSnapshotVersion(remoteStoreImpl.localStore);\n }\n\n // Probe IndexedDB periodically and re-enable network\n remoteStoreImpl.asyncQueue.enqueueRetryable(async () => {\n logDebug(LOG_TAG, 'Retrying IndexedDB access');\n await op!();\n remoteStoreImpl.offlineCauses.delete(OfflineCause.IndexedDbFailed);\n await enableNetworkInternal(remoteStoreImpl);\n });\n } else {\n throw e;\n }\n}\n\n/**\n * Executes `op`. If `op` fails, takes the network offline until `op`\n * succeeds. Returns after the first attempt.\n */\nfunction executeWithRecovery(\n remoteStoreImpl: RemoteStoreImpl,\n op: () => Promise<void>\n): Promise<void> {\n return op().catch(e => disableNetworkUntilRecovery(remoteStoreImpl, e, op));\n}\n\n/**\n * Takes a batch of changes from the Datastore, repackages them as a\n * RemoteEvent, and passes that on to the listener, which is typically the\n * SyncEngine.\n */\nfunction raiseWatchSnapshot(\n remoteStoreImpl: RemoteStoreImpl,\n snapshotVersion: SnapshotVersion\n): Promise<void> {\n debugAssert(\n !snapshotVersion.isEqual(SnapshotVersion.min()),\n \"Can't raise event for unknown SnapshotVersion\"\n );\n const remoteEvent = remoteStoreImpl.watchChangeAggregator!.createRemoteEvent(\n snapshotVersion\n );\n\n // Update in-memory resume tokens. LocalStore will update the\n // persistent view of these when applying the completed RemoteEvent.\n remoteEvent.targetChanges.forEach((change, targetId) => {\n if (change.resumeToken.approximateByteSize() > 0) {\n const targetData = remoteStoreImpl.listenTargets.get(targetId);\n // A watched target might have been removed already.\n if (targetData) {\n remoteStoreImpl.listenTargets.set(\n targetId,\n targetData.withResumeToken(change.resumeToken, snapshotVersion)\n );\n }\n }\n });\n\n // Re-establish listens for the targets that have been invalidated by\n // existence filter mismatches.\n remoteEvent.targetMismatches.forEach(targetId => {\n const targetData = remoteStoreImpl.listenTargets.get(targetId);\n if (!targetData) {\n // A watched target might have been removed already.\n return;\n }\n\n // Clear the resume token for the target, since we're in a known mismatch\n // state.\n remoteStoreImpl.listenTargets.set(\n targetId,\n targetData.withResumeToken(\n ByteString.EMPTY_BYTE_STRING,\n targetData.snapshotVersion\n )\n );\n\n // Cause a hard reset by unwatching and rewatching immediately, but\n // deliberately don't send a resume token so that we get a full update.\n sendUnwatchRequest(remoteStoreImpl, targetId);\n\n // Mark the target we send as being on behalf of an existence filter\n // mismatch, but don't actually retain that in listenTargets. This ensures\n // that we flag the first re-listen this way without impacting future\n // listens of this target (that might happen e.g. on reconnect).\n const requestTargetData = new TargetData(\n targetData.target,\n targetId,\n TargetPurpose.ExistenceFilterMismatch,\n targetData.sequenceNumber\n );\n sendWatchRequest(remoteStoreImpl, requestTargetData);\n });\n\n // Finally raise remote event\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.applyRemoteEvent,\n 'applyRemoteEvent() not set'\n );\n return remoteStoreImpl.remoteSyncer.applyRemoteEvent(remoteEvent);\n}\n\n/** Handles an error on a target */\nasync function handleTargetError(\n remoteStoreImpl: RemoteStoreImpl,\n watchChange: WatchTargetChange\n): Promise<void> {\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.rejectListen,\n 'rejectListen() not set'\n );\n debugAssert(!!watchChange.cause, 'Handling target error without a cause');\n const error = watchChange.cause!;\n for (const targetId of watchChange.targetIds) {\n // A watched target might have been removed already.\n if (remoteStoreImpl.listenTargets.has(targetId)) {\n await remoteStoreImpl.remoteSyncer.rejectListen(targetId, error);\n remoteStoreImpl.listenTargets.delete(targetId);\n remoteStoreImpl.watchChangeAggregator!.removeTarget(targetId);\n }\n }\n}\n\n/**\n * Attempts to fill our write pipeline with writes from the LocalStore.\n *\n * Called internally to bootstrap or refill the write pipeline and by\n * SyncEngine whenever there are new mutations to process.\n *\n * Starts the write stream if necessary.\n */\nexport async function fillWritePipeline(\n remoteStore: RemoteStore\n): Promise<void> {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n const writeStream = ensureWriteStream(remoteStoreImpl);\n\n let lastBatchIdRetrieved =\n remoteStoreImpl.writePipeline.length > 0\n ? remoteStoreImpl.writePipeline[remoteStoreImpl.writePipeline.length - 1]\n .batchId\n : BATCHID_UNKNOWN;\n\n while (canAddToWritePipeline(remoteStoreImpl)) {\n try {\n const batch = await localStoreGetNextMutationBatch(\n remoteStoreImpl.localStore,\n lastBatchIdRetrieved\n );\n\n if (batch === null) {\n if (remoteStoreImpl.writePipeline.length === 0) {\n writeStream.markIdle();\n }\n break;\n } else {\n lastBatchIdRetrieved = batch.batchId;\n addToWritePipeline(remoteStoreImpl, batch);\n }\n } catch (e) {\n await disableNetworkUntilRecovery(remoteStoreImpl, e);\n }\n }\n\n if (shouldStartWriteStream(remoteStoreImpl)) {\n startWriteStream(remoteStoreImpl);\n }\n}\n\n/**\n * Returns true if we can add to the write pipeline (i.e. the network is\n * enabled and the write pipeline is not full).\n */\nfunction canAddToWritePipeline(remoteStoreImpl: RemoteStoreImpl): boolean {\n return (\n canUseNetwork(remoteStoreImpl) &&\n remoteStoreImpl.writePipeline.length < MAX_PENDING_WRITES\n );\n}\n\n// For testing\nexport function outstandingWrites(remoteStore: RemoteStore): number {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n return remoteStoreImpl.writePipeline.length;\n}\n\n/**\n * Queues additional writes to be sent to the write stream, sending them\n * immediately if the write stream is established.\n */\nfunction addToWritePipeline(\n remoteStoreImpl: RemoteStoreImpl,\n batch: MutationBatch\n): void {\n debugAssert(\n canAddToWritePipeline(remoteStoreImpl),\n 'addToWritePipeline called when pipeline is full'\n );\n remoteStoreImpl.writePipeline.push(batch);\n\n const writeStream = ensureWriteStream(remoteStoreImpl);\n if (writeStream.isOpen() && writeStream.handshakeComplete) {\n writeStream.writeMutations(batch.mutations);\n }\n}\n\nfunction shouldStartWriteStream(remoteStoreImpl: RemoteStoreImpl): boolean {\n return (\n canUseNetwork(remoteStoreImpl) &&\n !ensureWriteStream(remoteStoreImpl).isStarted() &&\n remoteStoreImpl.writePipeline.length > 0\n );\n}\n\nfunction startWriteStream(remoteStoreImpl: RemoteStoreImpl): void {\n debugAssert(\n shouldStartWriteStream(remoteStoreImpl),\n 'startWriteStream() called when shouldStartWriteStream() is false.'\n );\n ensureWriteStream(remoteStoreImpl).start();\n}\n\nasync function onWriteStreamOpen(\n remoteStoreImpl: RemoteStoreImpl\n): Promise<void> {\n ensureWriteStream(remoteStoreImpl).writeHandshake();\n}\n\nasync function onWriteHandshakeComplete(\n remoteStoreImpl: RemoteStoreImpl\n): Promise<void> {\n const writeStream = ensureWriteStream(remoteStoreImpl);\n // Send the write pipeline now that the stream is established.\n for (const batch of remoteStoreImpl.writePipeline) {\n writeStream.writeMutations(batch.mutations);\n }\n}\n\nasync function onMutationResult(\n remoteStoreImpl: RemoteStoreImpl,\n commitVersion: SnapshotVersion,\n results: MutationResult[]\n): Promise<void> {\n // This is a response to a write containing mutations and should be\n // correlated to the first write in our write pipeline.\n debugAssert(\n remoteStoreImpl.writePipeline.length > 0,\n 'Got result for empty write pipeline'\n );\n const batch = remoteStoreImpl.writePipeline.shift()!;\n const success = MutationBatchResult.from(batch, commitVersion, results);\n\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.applySuccessfulWrite,\n 'applySuccessfulWrite() not set'\n );\n await executeWithRecovery(remoteStoreImpl, () =>\n remoteStoreImpl.remoteSyncer.applySuccessfulWrite!(success)\n );\n\n // It's possible that with the completion of this mutation another\n // slot has freed up.\n await fillWritePipeline(remoteStoreImpl);\n}\n\nasync function onWriteStreamClose(\n remoteStoreImpl: RemoteStoreImpl,\n error?: FirestoreError\n): Promise<void> {\n if (error === undefined) {\n // Graceful stop (due to stop() or idle timeout). Make sure that's\n // desirable.\n debugAssert(\n !shouldStartWriteStream(remoteStoreImpl),\n 'Write stream was stopped gracefully while still needed.'\n );\n }\n\n // If the write stream closed after the write handshake completes, a write\n // operation failed and we fail the pending operation.\n if (error && ensureWriteStream(remoteStoreImpl).handshakeComplete) {\n // This error affects the actual write.\n await handleWriteError(remoteStoreImpl, error!);\n }\n\n // The write stream might have been started by refilling the write\n // pipeline for failed writes\n if (shouldStartWriteStream(remoteStoreImpl)) {\n startWriteStream(remoteStoreImpl);\n }\n}\n\nasync function handleWriteError(\n remoteStoreImpl: RemoteStoreImpl,\n error: FirestoreError\n): Promise<void> {\n // Only handle permanent errors here. If it's transient, just let the retry\n // logic kick in.\n if (isPermanentWriteError(error.code)) {\n // This was a permanent error, the request itself was the problem\n // so it's not going to succeed if we resend it.\n const batch = remoteStoreImpl.writePipeline.shift()!;\n\n // In this case it's also unlikely that the server itself is melting\n // down -- this was just a bad request so inhibit backoff on the next\n // restart.\n ensureWriteStream(remoteStoreImpl).inhibitBackoff();\n\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.rejectFailedWrite,\n 'rejectFailedWrite() not set'\n );\n await executeWithRecovery(remoteStoreImpl, () =>\n remoteStoreImpl.remoteSyncer.rejectFailedWrite!(batch.batchId, error)\n );\n\n // It's possible that with the completion of this mutation\n // another slot has freed up.\n await fillWritePipeline(remoteStoreImpl);\n } else {\n // Transient error, just let the retry logic kick in.\n }\n}\n\nasync function restartNetwork(remoteStore: RemoteStore): Promise<void> {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n remoteStoreImpl.offlineCauses.add(OfflineCause.ConnectivityChange);\n await disableNetworkInternal(remoteStoreImpl);\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n remoteStoreImpl.offlineCauses.delete(OfflineCause.ConnectivityChange);\n await enableNetworkInternal(remoteStoreImpl);\n}\n\nexport async function remoteStoreHandleCredentialChange(\n remoteStore: RemoteStore,\n user: User\n): Promise<void> {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n remoteStoreImpl.asyncQueue.verifyOperationInProgress();\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.handleCredentialChange,\n 'handleCredentialChange() not set'\n );\n\n logDebug(LOG_TAG, 'RemoteStore received new credentials');\n const usesNetwork = canUseNetwork(remoteStoreImpl);\n\n // Tear down and re-create our network streams. This will ensure we get a\n // fresh auth token for the new user and re-fill the write pipeline with\n // new mutations from the LocalStore (since mutations are per-user).\n remoteStoreImpl.offlineCauses.add(OfflineCause.CredentialChange);\n await disableNetworkInternal(remoteStoreImpl);\n if (usesNetwork) {\n // Don't set the network status to Unknown if we are offline.\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n }\n await remoteStoreImpl.remoteSyncer.handleCredentialChange(user);\n remoteStoreImpl.offlineCauses.delete(OfflineCause.CredentialChange);\n await enableNetworkInternal(remoteStoreImpl);\n}\n\n/**\n * Toggles the network state when the client gains or loses its primary lease.\n */\nexport async function remoteStoreApplyPrimaryState(\n remoteStore: RemoteStore,\n isPrimary: boolean\n): Promise<void> {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n if (isPrimary) {\n remoteStoreImpl.offlineCauses.delete(OfflineCause.IsSecondary);\n await enableNetworkInternal(remoteStoreImpl);\n } else if (!isPrimary) {\n remoteStoreImpl.offlineCauses.add(OfflineCause.IsSecondary);\n await disableNetworkInternal(remoteStoreImpl);\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n }\n}\n\n/**\n * If not yet initialized, registers the WatchStream and its network state\n * callback with `remoteStoreImpl`. Returns the existing stream if one is\n * already available.\n *\n * PORTING NOTE: On iOS and Android, the WatchStream gets registered on startup.\n * This is not done on Web to allow it to be tree-shaken.\n */\nfunction ensureWatchStream(\n remoteStoreImpl: RemoteStoreImpl\n): PersistentListenStream {\n if (!remoteStoreImpl.watchStream) {\n // Create stream (but note that it is not started yet).\n remoteStoreImpl.watchStream = newPersistentWatchStream(\n remoteStoreImpl.datastore,\n remoteStoreImpl.asyncQueue,\n {\n onOpen: onWatchStreamOpen.bind(null, remoteStoreImpl),\n onClose: onWatchStreamClose.bind(null, remoteStoreImpl),\n onWatchChange: onWatchStreamChange.bind(null, remoteStoreImpl)\n }\n );\n\n remoteStoreImpl.onNetworkStatusChange.push(async enabled => {\n if (enabled) {\n remoteStoreImpl.watchStream!.inhibitBackoff();\n if (shouldStartWatchStream(remoteStoreImpl)) {\n startWatchStream(remoteStoreImpl);\n } else {\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n }\n } else {\n await remoteStoreImpl.watchStream!.stop();\n cleanUpWatchStreamState(remoteStoreImpl);\n }\n });\n }\n\n return remoteStoreImpl.watchStream;\n}\n\n/**\n * If not yet initialized, registers the WriteStream and its network state\n * callback with `remoteStoreImpl`. Returns the existing stream if one is\n * already available.\n *\n * PORTING NOTE: On iOS and Android, the WriteStream gets registered on startup.\n * This is not done on Web to allow it to be tree-shaken.\n */\nfunction ensureWriteStream(\n remoteStoreImpl: RemoteStoreImpl\n): PersistentWriteStream {\n if (!remoteStoreImpl.writeStream) {\n debugAssert(\n remoteStoreImpl.writePipeline.length === 0,\n 'Should not issue writes before WriteStream is enabled'\n );\n\n // Create stream (but note that it is not started yet).\n remoteStoreImpl.writeStream = newPersistentWriteStream(\n remoteStoreImpl.datastore,\n remoteStoreImpl.asyncQueue,\n {\n onOpen: onWriteStreamOpen.bind(null, remoteStoreImpl),\n onClose: onWriteStreamClose.bind(null, remoteStoreImpl),\n onHandshakeComplete: onWriteHandshakeComplete.bind(\n null,\n remoteStoreImpl\n ),\n onMutationResult: onMutationResult.bind(null, remoteStoreImpl)\n }\n );\n\n remoteStoreImpl.onNetworkStatusChange.push(async enabled => {\n if (enabled) {\n remoteStoreImpl.writeStream!.inhibitBackoff();\n\n // This will start the write stream if necessary.\n await fillWritePipeline(remoteStoreImpl);\n } else {\n await remoteStoreImpl.writeStream!.stop();\n\n if (remoteStoreImpl.writePipeline.length > 0) {\n logDebug(\n LOG_TAG,\n `Stopping write stream with ${remoteStoreImpl.writePipeline.length} pending writes`\n );\n remoteStoreImpl.writePipeline = [];\n }\n }\n });\n }\n\n return remoteStoreImpl.writeStream;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isIndexedDbTransactionError } from '../local/simple_db';\n\nimport { Code, FirestoreError } from './error';\nimport { logError } from './log';\nimport { Deferred } from './promise';\n\nconst LOG_TAG = 'AsyncQueue';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TimerHandle = any;\n\n/**\n * Wellknown \"timer\" IDs used when scheduling delayed operations on the\n * AsyncQueue. These IDs can then be used from tests to check for the presence\n * of operations or to run them early.\n *\n * The string values are used when encoding these timer IDs in JSON spec tests.\n */\nexport const enum TimerId {\n /** All can be used with runDelayedOperationsEarly() to run all timers. */\n All = 'all',\n\n /**\n * The following 4 timers are used in persistent_stream.ts for the listen and\n * write streams. The \"Idle\" timer is used to close the stream due to\n * inactivity. The \"ConnectionBackoff\" timer is used to restart a stream once\n * the appropriate backoff delay has elapsed.\n */\n ListenStreamIdle = 'listen_stream_idle',\n ListenStreamConnectionBackoff = 'listen_stream_connection_backoff',\n WriteStreamIdle = 'write_stream_idle',\n WriteStreamConnectionBackoff = 'write_stream_connection_backoff',\n\n /**\n * A timer used in online_state_tracker.ts to transition from\n * OnlineState.Unknown to Offline after a set timeout, rather than waiting\n * indefinitely for success or failure.\n */\n OnlineStateTimeout = 'online_state_timeout',\n\n /**\n * A timer used to update the client metadata in IndexedDb, which is used\n * to determine the primary leaseholder.\n */\n ClientMetadataRefresh = 'client_metadata_refresh',\n\n /** A timer used to periodically attempt LRU Garbage collection */\n LruGarbageCollection = 'lru_garbage_collection',\n\n /**\n * A timer used to retry transactions. Since there can be multiple concurrent\n * transactions, multiple of these may be in the queue at a given time.\n */\n TransactionRetry = 'transaction_retry',\n\n /**\n * A timer used to retry operations scheduled via retryable AsyncQueue\n * operations.\n */\n AsyncQueueRetry = 'async_queue_retry'\n}\n\n/**\n * Represents an operation scheduled to be run in the future on an AsyncQueue.\n *\n * It is created via DelayedOperation.createAndSchedule().\n *\n * Supports cancellation (via cancel()) and early execution (via skipDelay()).\n *\n * Note: We implement `PromiseLike` instead of `Promise`, as the `Promise` type\n * in newer versions of TypeScript defines `finally`, which is not available in\n * IE.\n */\nexport class DelayedOperation<T extends unknown> implements PromiseLike<T> {\n // handle for use with clearTimeout(), or null if the operation has been\n // executed or canceled already.\n private timerHandle: TimerHandle | null;\n\n private readonly deferred = new Deferred<T>();\n\n private constructor(\n private readonly asyncQueue: AsyncQueue,\n readonly timerId: TimerId,\n readonly targetTimeMs: number,\n private readonly op: () => Promise<T>,\n private readonly removalCallback: (op: DelayedOperation<T>) => void\n ) {\n // It's normal for the deferred promise to be canceled (due to cancellation)\n // and so we attach a dummy catch callback to avoid\n // 'UnhandledPromiseRejectionWarning' log spam.\n this.deferred.promise.catch(err => {});\n }\n\n /**\n * Creates and returns a DelayedOperation that has been scheduled to be\n * executed on the provided asyncQueue after the provided delayMs.\n *\n * @param asyncQueue - The queue to schedule the operation on.\n * @param id - A Timer ID identifying the type of operation this is.\n * @param delayMs - The delay (ms) before the operation should be scheduled.\n * @param op - The operation to run.\n * @param removalCallback - A callback to be called synchronously once the\n * operation is executed or canceled, notifying the AsyncQueue to remove it\n * from its delayedOperations list.\n * PORTING NOTE: This exists to prevent making removeDelayedOperation() and\n * the DelayedOperation class public.\n */\n static createAndSchedule<R extends unknown>(\n asyncQueue: AsyncQueue,\n timerId: TimerId,\n delayMs: number,\n op: () => Promise<R>,\n removalCallback: (op: DelayedOperation<R>) => void\n ): DelayedOperation<R> {\n const targetTime = Date.now() + delayMs;\n const delayedOp = new DelayedOperation(\n asyncQueue,\n timerId,\n targetTime,\n op,\n removalCallback\n );\n delayedOp.start(delayMs);\n return delayedOp;\n }\n\n /**\n * Starts the timer. This is called immediately after construction by\n * createAndSchedule().\n */\n private start(delayMs: number): void {\n this.timerHandle = setTimeout(() => this.handleDelayElapsed(), delayMs);\n }\n\n /**\n * Queues the operation to run immediately (if it hasn't already been run or\n * canceled).\n */\n skipDelay(): void {\n return this.handleDelayElapsed();\n }\n\n /**\n * Cancels the operation if it hasn't already been executed or canceled. The\n * promise will be rejected.\n *\n * As long as the operation has not yet been run, calling cancel() provides a\n * guarantee that the operation will not be run.\n */\n cancel(reason?: string): void {\n if (this.timerHandle !== null) {\n this.clearTimeout();\n this.deferred.reject(\n new FirestoreError(\n Code.CANCELLED,\n 'Operation cancelled' + (reason ? ': ' + reason : '')\n )\n );\n }\n }\n\n then = this.deferred.promise.then.bind(this.deferred.promise);\n\n private handleDelayElapsed(): void {\n this.asyncQueue.enqueueAndForget(() => {\n if (this.timerHandle !== null) {\n this.clearTimeout();\n return this.op().then(result => {\n return this.deferred.resolve(result);\n });\n } else {\n return Promise.resolve();\n }\n });\n }\n\n private clearTimeout(): void {\n if (this.timerHandle !== null) {\n this.removalCallback(this);\n clearTimeout(this.timerHandle);\n this.timerHandle = null;\n }\n }\n}\n\nexport interface AsyncQueue {\n // Is this AsyncQueue being shut down? If true, this instance will not enqueue\n // any new operations, Promises from enqueue requests will not resolve.\n readonly isShuttingDown: boolean;\n\n /**\n * Adds a new operation to the queue without waiting for it to complete (i.e.\n * we ignore the Promise result).\n */\n enqueueAndForget<T extends unknown>(op: () => Promise<T>): void;\n\n /**\n * Regardless if the queue has initialized shutdown, adds a new operation to the\n * queue without waiting for it to complete (i.e. we ignore the Promise result).\n */\n enqueueAndForgetEvenWhileRestricted<T extends unknown>(\n op: () => Promise<T>\n ): void;\n\n /**\n * Initialize the shutdown of this queue. Once this method is called, the\n * only possible way to request running an operation is through\n * `enqueueEvenWhileRestricted()`.\n *\n * @param purgeExistingTasks Whether already enqueued tasked should be\n * rejected (unless enqueued wih `enqueueEvenWhileRestricted()`). Defaults\n * to false.\n */\n enterRestrictedMode(purgeExistingTasks?: boolean): void;\n\n /**\n * Adds a new operation to the queue. Returns a promise that will be resolved\n * when the promise returned by the new operation is (with its value).\n */\n enqueue<T extends unknown>(op: () => Promise<T>): Promise<T>;\n\n /**\n * Enqueue a retryable operation.\n *\n * A retryable operation is rescheduled with backoff if it fails with a\n * IndexedDbTransactionError (the error type used by SimpleDb). All\n * retryable operations are executed in order and only run if all prior\n * operations were retried successfully.\n */\n enqueueRetryable(op: () => Promise<void>): void;\n\n /**\n * Schedules an operation to be queued on the AsyncQueue once the specified\n * `delayMs` has elapsed. The returned DelayedOperation can be used to cancel\n * or fast-forward the operation prior to its running.\n */\n enqueueAfterDelay<T extends unknown>(\n timerId: TimerId,\n delayMs: number,\n op: () => Promise<T>\n ): DelayedOperation<T>;\n\n /**\n * Verifies there's an operation currently in-progress on the AsyncQueue.\n * Unfortunately we can't verify that the running code is in the promise chain\n * of that operation, so this isn't a foolproof check, but it should be enough\n * to catch some bugs.\n */\n verifyOperationInProgress(): void;\n}\n\n/**\n * Returns a FirestoreError that can be surfaced to the user if the provided\n * error is an IndexedDbTransactionError. Re-throws the error otherwise.\n */\nexport function wrapInUserErrorIfRecoverable(\n e: Error,\n msg: string\n): FirestoreError {\n logError(LOG_TAG, `${msg}: ${e}`);\n if (isIndexedDbTransactionError(e)) {\n return new FirestoreError(Code.UNAVAILABLE, `${msg}: ${e}`);\n } else {\n throw e;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SortedMap } from '../util/sorted_map';\n\nimport { documentMap } from './collections';\nimport { Document } from './document';\nimport { DocumentComparator } from './document_comparator';\nimport { DocumentKey } from './document_key';\n\n/**\n * DocumentSet is an immutable (copy-on-write) collection that holds documents\n * in order specified by the provided comparator. We always add a document key\n * comparator on top of what is provided to guarantee document equality based on\n * the key.\n */\n\nexport class DocumentSet {\n /**\n * Returns an empty copy of the existing DocumentSet, using the same\n * comparator.\n */\n static emptySet(oldSet: DocumentSet): DocumentSet {\n return new DocumentSet(oldSet.comparator);\n }\n\n private comparator: DocumentComparator;\n private keyedMap: SortedMap<DocumentKey, Document>;\n private sortedSet: SortedMap<Document, null>;\n\n /** The default ordering is by key if the comparator is omitted */\n constructor(comp?: DocumentComparator) {\n // We are adding document key comparator to the end as it's the only\n // guaranteed unique property of a document.\n if (comp) {\n this.comparator = (d1: Document, d2: Document) =>\n comp(d1, d2) || DocumentKey.comparator(d1.key, d2.key);\n } else {\n this.comparator = (d1: Document, d2: Document) =>\n DocumentKey.comparator(d1.key, d2.key);\n }\n\n this.keyedMap = documentMap();\n this.sortedSet = new SortedMap<Document, null>(this.comparator);\n }\n\n has(key: DocumentKey): boolean {\n return this.keyedMap.get(key) != null;\n }\n\n get(key: DocumentKey): Document | null {\n return this.keyedMap.get(key);\n }\n\n first(): Document | null {\n return this.sortedSet.minKey();\n }\n\n last(): Document | null {\n return this.sortedSet.maxKey();\n }\n\n isEmpty(): boolean {\n return this.sortedSet.isEmpty();\n }\n\n /**\n * Returns the index of the provided key in the document set, or -1 if the\n * document key is not present in the set;\n */\n indexOf(key: DocumentKey): number {\n const doc = this.keyedMap.get(key);\n return doc ? this.sortedSet.indexOf(doc) : -1;\n }\n\n get size(): number {\n return this.sortedSet.size;\n }\n\n /** Iterates documents in order defined by \"comparator\" */\n forEach(cb: (doc: Document) => void): void {\n this.sortedSet.inorderTraversal((k, v) => {\n cb(k);\n return false;\n });\n }\n\n /** Inserts or updates a document with the same key */\n add(doc: Document): DocumentSet {\n // First remove the element if we have it.\n const set = this.delete(doc.key);\n return set.copy(\n set.keyedMap.insert(doc.key, doc),\n set.sortedSet.insert(doc, null)\n );\n }\n\n /** Deletes a document with a given key */\n delete(key: DocumentKey): DocumentSet {\n const doc = this.get(key);\n if (!doc) {\n return this;\n }\n\n return this.copy(this.keyedMap.remove(key), this.sortedSet.remove(doc));\n }\n\n isEqual(other: DocumentSet | null | undefined): boolean {\n if (!(other instanceof DocumentSet)) {\n return false;\n }\n if (this.size !== other.size) {\n return false;\n }\n\n const thisIt = this.sortedSet.getIterator();\n const otherIt = other.sortedSet.getIterator();\n while (thisIt.hasNext()) {\n const thisDoc = thisIt.getNext().key;\n const otherDoc = otherIt.getNext().key;\n if (!thisDoc.isEqual(otherDoc)) {\n return false;\n }\n }\n return true;\n }\n\n toString(): string {\n const docStrings: string[] = [];\n this.forEach(doc => {\n docStrings.push(doc.toString());\n });\n if (docStrings.length === 0) {\n return 'DocumentSet ()';\n } else {\n return 'DocumentSet (\\n ' + docStrings.join(' \\n') + '\\n)';\n }\n }\n\n private copy(\n keyedMap: SortedMap<DocumentKey, Document>,\n sortedSet: SortedMap<Document, null>\n ): DocumentSet {\n const newSet = new DocumentSet();\n newSet.comparator = this.comparator;\n newSet.keyedMap = keyedMap;\n newSet.sortedSet = sortedSet;\n return newSet;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DocumentKeySet } from '../model/collections';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { DocumentSet } from '../model/document_set';\nimport { fail } from '../util/assert';\nimport { SortedMap } from '../util/sorted_map';\n\nimport { Query, queryEquals } from './query';\n\nexport const enum ChangeType {\n Added,\n Removed,\n Modified,\n Metadata\n}\n\nexport interface DocumentViewChange {\n type: ChangeType;\n doc: Document;\n}\n\nexport const enum SyncState {\n Local,\n Synced\n}\n\n/**\n * DocumentChangeSet keeps track of a set of changes to docs in a query, merging\n * duplicate events for the same doc.\n */\nexport class DocumentChangeSet {\n private changeMap = new SortedMap<DocumentKey, DocumentViewChange>(\n DocumentKey.comparator\n );\n\n track(change: DocumentViewChange): void {\n const key = change.doc.key;\n const oldChange = this.changeMap.get(key);\n if (!oldChange) {\n this.changeMap = this.changeMap.insert(key, change);\n return;\n }\n\n // Merge the new change with the existing change.\n if (\n change.type !== ChangeType.Added &&\n oldChange.type === ChangeType.Metadata\n ) {\n this.changeMap = this.changeMap.insert(key, change);\n } else if (\n change.type === ChangeType.Metadata &&\n oldChange.type !== ChangeType.Removed\n ) {\n this.changeMap = this.changeMap.insert(key, {\n type: oldChange.type,\n doc: change.doc\n });\n } else if (\n change.type === ChangeType.Modified &&\n oldChange.type === ChangeType.Modified\n ) {\n this.changeMap = this.changeMap.insert(key, {\n type: ChangeType.Modified,\n doc: change.doc\n });\n } else if (\n change.type === ChangeType.Modified &&\n oldChange.type === ChangeType.Added\n ) {\n this.changeMap = this.changeMap.insert(key, {\n type: ChangeType.Added,\n doc: change.doc\n });\n } else if (\n change.type === ChangeType.Removed &&\n oldChange.type === ChangeType.Added\n ) {\n this.changeMap = this.changeMap.remove(key);\n } else if (\n change.type === ChangeType.Removed &&\n oldChange.type === ChangeType.Modified\n ) {\n this.changeMap = this.changeMap.insert(key, {\n type: ChangeType.Removed,\n doc: oldChange.doc\n });\n } else if (\n change.type === ChangeType.Added &&\n oldChange.type === ChangeType.Removed\n ) {\n this.changeMap = this.changeMap.insert(key, {\n type: ChangeType.Modified,\n doc: change.doc\n });\n } else {\n // This includes these cases, which don't make sense:\n // Added->Added\n // Removed->Removed\n // Modified->Added\n // Removed->Modified\n // Metadata->Added\n // Removed->Metadata\n fail(\n 'unsupported combination of changes: ' +\n JSON.stringify(change) +\n ' after ' +\n JSON.stringify(oldChange)\n );\n }\n }\n\n getChanges(): DocumentViewChange[] {\n const changes: DocumentViewChange[] = [];\n this.changeMap.inorderTraversal(\n (key: DocumentKey, change: DocumentViewChange) => {\n changes.push(change);\n }\n );\n return changes;\n }\n}\n\nexport class ViewSnapshot {\n constructor(\n readonly query: Query,\n readonly docs: DocumentSet,\n readonly oldDocs: DocumentSet,\n readonly docChanges: DocumentViewChange[],\n readonly mutatedKeys: DocumentKeySet,\n readonly fromCache: boolean,\n readonly syncStateChanged: boolean,\n readonly excludesMetadataChanges: boolean\n ) {}\n\n /** Returns a view snapshot as if all documents in the snapshot were added. */\n static fromInitialDocuments(\n query: Query,\n documents: DocumentSet,\n mutatedKeys: DocumentKeySet,\n fromCache: boolean\n ): ViewSnapshot {\n const changes: DocumentViewChange[] = [];\n documents.forEach(doc => {\n changes.push({ type: ChangeType.Added, doc });\n });\n\n return new ViewSnapshot(\n query,\n documents,\n DocumentSet.emptySet(documents),\n changes,\n mutatedKeys,\n fromCache,\n /* syncStateChanged= */ true,\n /* excludesMetadataChanges= */ false\n );\n }\n\n get hasPendingWrites(): boolean {\n return !this.mutatedKeys.isEmpty();\n }\n\n isEqual(other: ViewSnapshot): boolean {\n if (\n this.fromCache !== other.fromCache ||\n this.syncStateChanged !== other.syncStateChanged ||\n !this.mutatedKeys.isEqual(other.mutatedKeys) ||\n !queryEquals(this.query, other.query) ||\n !this.docs.isEqual(other.docs) ||\n !this.oldDocs.isEqual(other.oldDocs)\n ) {\n return false;\n }\n const changes: DocumentViewChange[] = this.docChanges;\n const otherChanges: DocumentViewChange[] = other.docChanges;\n if (changes.length !== otherChanges.length) {\n return false;\n }\n for (let i = 0; i < changes.length; i++) {\n if (\n changes[i].type !== otherChanges[i].type ||\n !changes[i].doc.isEqual(otherChanges[i].doc)\n ) {\n return false;\n }\n }\n return true;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert, debugCast } from '../util/assert';\nimport { wrapInUserErrorIfRecoverable } from '../util/async_queue';\nimport { FirestoreError } from '../util/error';\nimport { EventHandler } from '../util/misc';\nimport { ObjectMap } from '../util/obj_map';\n\nimport { canonifyQuery, Query, queryEquals, stringifyQuery } from './query';\nimport { OnlineState } from './types';\nimport { ChangeType, DocumentViewChange, ViewSnapshot } from './view_snapshot';\n\n/**\n * Holds the listeners and the last received ViewSnapshot for a query being\n * tracked by EventManager.\n */\nclass QueryListenersInfo {\n viewSnap: ViewSnapshot | undefined = undefined;\n listeners: QueryListener[] = [];\n}\n\n/**\n * Interface for handling events from the EventManager.\n */\nexport interface Observer<T> {\n next: EventHandler<T>;\n error: EventHandler<FirestoreError>;\n}\n\n/**\n * EventManager is responsible for mapping queries to query event emitters.\n * It handles \"fan-out\". -- Identical queries will re-use the same watch on the\n * backend.\n *\n * PORTING NOTE: On Web, EventManager `onListen` and `onUnlisten` need to be\n * assigned to SyncEngine's `listen()` and `unlisten()` API before usage. This\n * allows users to tree-shake the Watch logic.\n */\nexport interface EventManager {\n onListen?: (query: Query) => Promise<ViewSnapshot>;\n onUnlisten?: (query: Query) => Promise<void>;\n}\n\nexport function newEventManager(): EventManager {\n return new EventManagerImpl();\n}\n\nexport class EventManagerImpl implements EventManager {\n queries = new ObjectMap<Query, QueryListenersInfo>(\n q => canonifyQuery(q),\n queryEquals\n );\n\n onlineState = OnlineState.Unknown;\n\n snapshotsInSyncListeners: Set<Observer<void>> = new Set();\n\n /** Callback invoked when a Query is first listen to. */\n onListen?: (query: Query) => Promise<ViewSnapshot>;\n /** Callback invoked once all listeners to a Query are removed. */\n onUnlisten?: (query: Query) => Promise<void>;\n}\n\nexport async function eventManagerListen(\n eventManager: EventManager,\n listener: QueryListener\n): Promise<void> {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n\n debugAssert(!!eventManagerImpl.onListen, 'onListen not set');\n const query = listener.query;\n let firstListen = false;\n\n let queryInfo = eventManagerImpl.queries.get(query);\n if (!queryInfo) {\n firstListen = true;\n queryInfo = new QueryListenersInfo();\n }\n\n if (firstListen) {\n try {\n queryInfo.viewSnap = await eventManagerImpl.onListen(query);\n } catch (e) {\n const firestoreError = wrapInUserErrorIfRecoverable(\n e,\n `Initialization of query '${stringifyQuery(listener.query)}' failed`\n );\n listener.onError(firestoreError);\n return;\n }\n }\n\n eventManagerImpl.queries.set(query, queryInfo);\n queryInfo.listeners.push(listener);\n\n // Run global snapshot listeners if a consistent snapshot has been emitted.\n const raisedEvent = listener.applyOnlineStateChange(\n eventManagerImpl.onlineState\n );\n debugAssert(\n !raisedEvent,\n \"applyOnlineStateChange() shouldn't raise an event for brand-new listeners.\"\n );\n\n if (queryInfo.viewSnap) {\n const raisedEvent = listener.onViewSnapshot(queryInfo.viewSnap);\n if (raisedEvent) {\n raiseSnapshotsInSyncEvent(eventManagerImpl);\n }\n }\n}\n\nexport async function eventManagerUnlisten(\n eventManager: EventManager,\n listener: QueryListener\n): Promise<void> {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n\n debugAssert(!!eventManagerImpl.onUnlisten, 'onUnlisten not set');\n const query = listener.query;\n let lastListen = false;\n\n const queryInfo = eventManagerImpl.queries.get(query);\n if (queryInfo) {\n const i = queryInfo.listeners.indexOf(listener);\n if (i >= 0) {\n queryInfo.listeners.splice(i, 1);\n lastListen = queryInfo.listeners.length === 0;\n }\n }\n\n if (lastListen) {\n eventManagerImpl.queries.delete(query);\n return eventManagerImpl.onUnlisten(query);\n }\n}\n\nexport function eventManagerOnWatchChange(\n eventManager: EventManager,\n viewSnaps: ViewSnapshot[]\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n\n let raisedEvent = false;\n for (const viewSnap of viewSnaps) {\n const query = viewSnap.query;\n const queryInfo = eventManagerImpl.queries.get(query);\n if (queryInfo) {\n for (const listener of queryInfo.listeners) {\n if (listener.onViewSnapshot(viewSnap)) {\n raisedEvent = true;\n }\n }\n queryInfo.viewSnap = viewSnap;\n }\n }\n if (raisedEvent) {\n raiseSnapshotsInSyncEvent(eventManagerImpl);\n }\n}\n\nexport function eventManagerOnWatchError(\n eventManager: EventManager,\n query: Query,\n error: FirestoreError\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n\n const queryInfo = eventManagerImpl.queries.get(query);\n if (queryInfo) {\n for (const listener of queryInfo.listeners) {\n listener.onError(error);\n }\n }\n\n // Remove all listeners. NOTE: We don't need to call syncEngine.unlisten()\n // after an error.\n eventManagerImpl.queries.delete(query);\n}\n\nexport function eventManagerOnOnlineStateChange(\n eventManager: EventManager,\n onlineState: OnlineState\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n\n eventManagerImpl.onlineState = onlineState;\n let raisedEvent = false;\n eventManagerImpl.queries.forEach((_, queryInfo) => {\n for (const listener of queryInfo.listeners) {\n // Run global snapshot listeners if a consistent snapshot has been emitted.\n if (listener.applyOnlineStateChange(onlineState)) {\n raisedEvent = true;\n }\n }\n });\n if (raisedEvent) {\n raiseSnapshotsInSyncEvent(eventManagerImpl);\n }\n}\n\nexport function addSnapshotsInSyncListener(\n eventManager: EventManager,\n observer: Observer<void>\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n\n eventManagerImpl.snapshotsInSyncListeners.add(observer);\n // Immediately fire an initial event, indicating all existing listeners\n // are in-sync.\n observer.next();\n}\n\nexport function removeSnapshotsInSyncListener(\n eventManager: EventManager,\n observer: Observer<void>\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n eventManagerImpl.snapshotsInSyncListeners.delete(observer);\n}\n\n// Call all global snapshot listeners that have been set.\nfunction raiseSnapshotsInSyncEvent(eventManagerImpl: EventManagerImpl): void {\n eventManagerImpl.snapshotsInSyncListeners.forEach(observer => {\n observer.next();\n });\n}\n\nexport interface ListenOptions {\n /** Raise events even when only the metadata changes */\n readonly includeMetadataChanges?: boolean;\n\n /**\n * Wait for a sync with the server when online, but still raise events while\n * offline.\n */\n readonly waitForSyncWhenOnline?: boolean;\n}\n\n/**\n * QueryListener takes a series of internal view snapshots and determines\n * when to raise the event.\n *\n * It uses an Observer to dispatch events.\n */\nexport class QueryListener {\n /**\n * Initial snapshots (e.g. from cache) may not be propagated to the wrapped\n * observer. This flag is set to true once we've actually raised an event.\n */\n private raisedInitialEvent = false;\n\n private options: ListenOptions;\n\n private snap: ViewSnapshot | null = null;\n\n private onlineState = OnlineState.Unknown;\n\n constructor(\n readonly query: Query,\n private queryObserver: Observer<ViewSnapshot>,\n options?: ListenOptions\n ) {\n this.options = options || {};\n }\n\n /**\n * Applies the new ViewSnapshot to this listener, raising a user-facing event\n * if applicable (depending on what changed, whether the user has opted into\n * metadata-only changes, etc.). Returns true if a user-facing event was\n * indeed raised.\n */\n onViewSnapshot(snap: ViewSnapshot): boolean {\n debugAssert(\n snap.docChanges.length > 0 || snap.syncStateChanged,\n 'We got a new snapshot with no changes?'\n );\n\n if (!this.options.includeMetadataChanges) {\n // Remove the metadata only changes.\n const docChanges: DocumentViewChange[] = [];\n for (const docChange of snap.docChanges) {\n if (docChange.type !== ChangeType.Metadata) {\n docChanges.push(docChange);\n }\n }\n snap = new ViewSnapshot(\n snap.query,\n snap.docs,\n snap.oldDocs,\n docChanges,\n snap.mutatedKeys,\n snap.fromCache,\n snap.syncStateChanged,\n /* excludesMetadataChanges= */ true\n );\n }\n let raisedEvent = false;\n if (!this.raisedInitialEvent) {\n if (this.shouldRaiseInitialEvent(snap, this.onlineState)) {\n this.raiseInitialEvent(snap);\n raisedEvent = true;\n }\n } else if (this.shouldRaiseEvent(snap)) {\n this.queryObserver.next(snap);\n raisedEvent = true;\n }\n\n this.snap = snap;\n return raisedEvent;\n }\n\n onError(error: FirestoreError): void {\n this.queryObserver.error(error);\n }\n\n /** Returns whether a snapshot was raised. */\n applyOnlineStateChange(onlineState: OnlineState): boolean {\n this.onlineState = onlineState;\n let raisedEvent = false;\n if (\n this.snap &&\n !this.raisedInitialEvent &&\n this.shouldRaiseInitialEvent(this.snap, onlineState)\n ) {\n this.raiseInitialEvent(this.snap);\n raisedEvent = true;\n }\n return raisedEvent;\n }\n\n private shouldRaiseInitialEvent(\n snap: ViewSnapshot,\n onlineState: OnlineState\n ): boolean {\n debugAssert(\n !this.raisedInitialEvent,\n 'Determining whether to raise first event but already had first event'\n );\n\n // Always raise the first event when we're synced\n if (!snap.fromCache) {\n return true;\n }\n\n // NOTE: We consider OnlineState.Unknown as online (it should become Offline\n // or Online if we wait long enough).\n const maybeOnline = onlineState !== OnlineState.Offline;\n // Don't raise the event if we're online, aren't synced yet (checked\n // above) and are waiting for a sync.\n if (this.options.waitForSyncWhenOnline && maybeOnline) {\n debugAssert(\n snap.fromCache,\n 'Waiting for sync, but snapshot is not from cache'\n );\n return false;\n }\n\n // Raise data from cache if we have any documents or we are offline\n return !snap.docs.isEmpty() || onlineState === OnlineState.Offline;\n }\n\n private shouldRaiseEvent(snap: ViewSnapshot): boolean {\n // We don't need to handle includeDocumentMetadataChanges here because\n // the Metadata only changes have already been stripped out if needed.\n // At this point the only changes we will see are the ones we should\n // propagate.\n if (snap.docChanges.length > 0) {\n return true;\n }\n\n const hasPendingWritesChanged =\n this.snap && this.snap.hasPendingWrites !== snap.hasPendingWrites;\n if (snap.syncStateChanged || hasPendingWritesChanged) {\n return this.options.includeMetadataChanges === true;\n }\n\n // Generally we should have hit one of the cases above, but it's possible\n // to get here if there were only metadata docChanges and they got\n // stripped out.\n return false;\n }\n\n private raiseInitialEvent(snap: ViewSnapshot): void {\n debugAssert(\n !this.raisedInitialEvent,\n 'Trying to raise initial events for second time'\n );\n snap = ViewSnapshot.fromInitialDocuments(\n snap.query,\n snap.docs,\n snap.mutatedKeys,\n snap.fromCache\n );\n this.raisedInitialEvent = true;\n this.queryObserver.next(snap);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BundleElement,\n BundleMetadata\n} from '../protos/firestore_bundle_proto';\nimport { JsonProtoSerializer } from '../remote/serializer';\n\n/**\n * A complete element in the bundle stream, together with the byte length it\n * occupies in the stream.\n */\nexport class SizedBundleElement {\n constructor(\n public readonly payload: BundleElement,\n // How many bytes this element takes to store in the bundle.\n public readonly byteLength: number\n ) {}\n\n isBundleMetadata(): boolean {\n return 'metadata' in this.payload;\n }\n}\n\nexport type BundleSource =\n | ReadableStream<Uint8Array>\n | ArrayBuffer\n | Uint8Array;\n\n/**\n * A class representing a bundle.\n *\n * Takes a bundle stream or buffer, and presents abstractions to read bundled\n * elements out of the underlying content.\n */\nexport interface BundleReader {\n serializer: JsonProtoSerializer;\n\n close(): Promise<void>;\n\n /**\n * Returns the metadata of the bundle.\n */\n getMetadata(): Promise<BundleMetadata>;\n\n /**\n * Returns the next BundleElement (together with its byte size in the bundle)\n * that has not been read from underlying ReadableStream. Returns null if we\n * have reached the end of the stream.\n */\n nextElement(): Promise<SizedBundleElement | null>;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoadBundleTaskProgress } from '@firebase/firestore-types';\n\nimport { LocalStore } from '../local/local_store';\nimport {\n localStoreApplyBundledDocuments,\n localStoreSaveNamedQuery\n} from '../local/local_store_impl';\nimport { documentKeySet, DocumentKeySet } from '../model/collections';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport {\n BundleMetadata as ProtoBundleMetadata,\n NamedQuery as ProtoNamedQuery\n} from '../protos/firestore_bundle_proto';\nimport { Timestamp as ApiTimestamp } from '../protos/firestore_proto_api';\nimport {\n fromDocument,\n fromName,\n fromVersion,\n JsonProtoSerializer\n} from '../remote/serializer';\nimport { debugAssert } from '../util/assert';\nimport { SizedBundleElement } from '../util/bundle_reader';\n\nimport {\n BundleConverter,\n BundledDocument,\n BundledDocuments,\n BundleLoadResult\n} from './bundle';\nimport { SnapshotVersion } from './snapshot_version';\n\n/**\n * Helper to convert objects from bundles to model objects in the SDK.\n */\nexport class BundleConverterImpl implements BundleConverter {\n constructor(private readonly serializer: JsonProtoSerializer) {}\n\n toDocumentKey(name: string): DocumentKey {\n return fromName(this.serializer, name);\n }\n\n /**\n * Converts a BundleDocument to a MutableDocument.\n */\n toMutableDocument(bundledDoc: BundledDocument): MutableDocument {\n if (bundledDoc.metadata.exists) {\n debugAssert(\n !!bundledDoc.document,\n 'Document is undefined when metadata.exist is true.'\n );\n return fromDocument(this.serializer, bundledDoc.document!, false);\n } else {\n return MutableDocument.newNoDocument(\n this.toDocumentKey(bundledDoc.metadata.name!),\n this.toSnapshotVersion(bundledDoc.metadata.readTime!)\n );\n }\n }\n\n toSnapshotVersion(time: ApiTimestamp): SnapshotVersion {\n return fromVersion(time);\n }\n}\n\n/**\n * A class to process the elements from a bundle, load them into local\n * storage and provide progress update while loading.\n */\nexport class BundleLoader {\n /** The current progress of loading */\n private progress: LoadBundleTaskProgress;\n /** Batched queries to be saved into storage */\n private queries: ProtoNamedQuery[] = [];\n /** Batched documents to be saved into storage */\n private documents: BundledDocuments = [];\n\n constructor(\n private bundleMetadata: ProtoBundleMetadata,\n private localStore: LocalStore,\n private serializer: JsonProtoSerializer\n ) {\n this.progress = bundleInitialProgress(bundleMetadata);\n }\n\n /**\n * Adds an element from the bundle to the loader.\n *\n * Returns a new progress if adding the element leads to a new progress,\n * otherwise returns null.\n */\n addSizedElement(element: SizedBundleElement): LoadBundleTaskProgress | null {\n debugAssert(!element.isBundleMetadata(), 'Unexpected bundle metadata.');\n\n this.progress.bytesLoaded += element.byteLength;\n\n let documentsLoaded = this.progress.documentsLoaded;\n\n if (element.payload.namedQuery) {\n this.queries.push(element.payload.namedQuery);\n } else if (element.payload.documentMetadata) {\n this.documents.push({ metadata: element.payload.documentMetadata });\n if (!element.payload.documentMetadata.exists) {\n ++documentsLoaded;\n }\n } else if (element.payload.document) {\n debugAssert(\n this.documents.length > 0 &&\n this.documents[this.documents.length - 1].metadata.name ===\n element.payload.document.name,\n 'The document being added does not match the stored metadata.'\n );\n this.documents[this.documents.length - 1].document =\n element.payload.document;\n ++documentsLoaded;\n }\n\n if (documentsLoaded !== this.progress.documentsLoaded) {\n this.progress.documentsLoaded = documentsLoaded;\n return { ...this.progress };\n }\n\n return null;\n }\n\n private getQueryDocumentMapping(\n documents: BundledDocuments\n ): Map<string, DocumentKeySet> {\n const queryDocumentMap = new Map<string, DocumentKeySet>();\n const bundleConverter = new BundleConverterImpl(this.serializer);\n for (const bundleDoc of documents) {\n if (bundleDoc.metadata.queries) {\n const documentKey = bundleConverter.toDocumentKey(\n bundleDoc.metadata.name!\n );\n for (const queryName of bundleDoc.metadata.queries) {\n const documentKeys = (\n queryDocumentMap.get(queryName) || documentKeySet()\n ).add(documentKey);\n queryDocumentMap.set(queryName, documentKeys);\n }\n }\n }\n\n return queryDocumentMap;\n }\n\n /**\n * Update the progress to 'Success' and return the updated progress.\n */\n async complete(): Promise<BundleLoadResult> {\n debugAssert(\n this.documents[this.documents.length - 1]?.metadata.exists !== true ||\n !!this.documents[this.documents.length - 1].document,\n 'Bundled documents end with a document metadata element instead of a document.'\n );\n debugAssert(!!this.bundleMetadata.id, 'Bundle ID must be set.');\n\n const changedDocuments = await localStoreApplyBundledDocuments(\n this.localStore,\n new BundleConverterImpl(this.serializer),\n this.documents,\n this.bundleMetadata.id!\n );\n\n const queryDocumentMap = this.getQueryDocumentMapping(this.documents);\n\n for (const q of this.queries) {\n await localStoreSaveNamedQuery(\n this.localStore,\n q,\n queryDocumentMap.get(q.name!)\n );\n }\n\n this.progress.taskState = 'Success';\n return new BundleLoadResult({ ...this.progress }, changedDocuments);\n }\n}\n\n/**\n * Returns a `LoadBundleTaskProgress` representing the initial progress of\n * loading a bundle.\n */\nexport function bundleInitialProgress(\n metadata: ProtoBundleMetadata\n): LoadBundleTaskProgress {\n return {\n taskState: 'Running',\n documentsLoaded: 0,\n bytesLoaded: 0,\n totalDocuments: metadata.totalDocuments!,\n totalBytes: metadata.totalBytes!\n };\n}\n\n/**\n * Returns a `LoadBundleTaskProgress` representing the progress that the loading\n * has succeeded.\n */\nexport function bundleSuccessProgress(\n metadata: ProtoBundleMetadata\n): LoadBundleTaskProgress {\n return {\n taskState: 'Success',\n documentsLoaded: metadata.totalDocuments!,\n bytesLoaded: metadata.totalBytes!,\n totalDocuments: metadata.totalDocuments!,\n totalBytes: metadata.totalBytes!\n };\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { QueryResult } from '../local/local_store_impl';\nimport {\n documentKeySet,\n DocumentKeySet,\n DocumentMap\n} from '../model/collections';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { DocumentSet } from '../model/document_set';\nimport { TargetChange } from '../remote/remote_event';\nimport { debugAssert, fail } from '../util/assert';\n\nimport {\n hasLimitToFirst,\n hasLimitToLast,\n newQueryComparator,\n Query,\n queryMatches\n} from './query';\nimport { OnlineState } from './types';\nimport {\n ChangeType,\n DocumentChangeSet,\n SyncState,\n ViewSnapshot\n} from './view_snapshot';\n\nexport type LimboDocumentChange = AddedLimboDocument | RemovedLimboDocument;\nexport class AddedLimboDocument {\n constructor(public key: DocumentKey) {}\n}\nexport class RemovedLimboDocument {\n constructor(public key: DocumentKey) {}\n}\n\n/** The result of applying a set of doc changes to a view. */\nexport interface ViewDocumentChanges {\n /** The new set of docs that should be in the view. */\n documentSet: DocumentSet;\n /** The diff of these docs with the previous set of docs. */\n changeSet: DocumentChangeSet;\n /**\n * Whether the set of documents passed in was not sufficient to calculate the\n * new state of the view and there needs to be another pass based on the\n * local cache.\n */\n needsRefill: boolean;\n\n mutatedKeys: DocumentKeySet;\n}\n\nexport interface ViewChange {\n snapshot?: ViewSnapshot;\n limboChanges: LimboDocumentChange[];\n}\n\n/**\n * View is responsible for computing the final merged truth of what docs are in\n * a query. It gets notified of local and remote changes to docs, and applies\n * the query filters and limits to determine the most correct possible results.\n */\nexport class View {\n private syncState: SyncState | null = null;\n /**\n * A flag whether the view is current with the backend. A view is considered\n * current after it has seen the current flag from the backend and did not\n * lose consistency within the watch stream (e.g. because of an existence\n * filter mismatch).\n */\n private current = false;\n private documentSet: DocumentSet;\n /** Documents in the view but not in the remote target */\n private limboDocuments = documentKeySet();\n /** Document Keys that have local changes */\n private mutatedKeys = documentKeySet();\n /** Query comparator that defines the document order in this view. */\n private docComparator: (d1: Document, d2: Document) => number;\n\n constructor(\n private query: Query,\n /** Documents included in the remote target */\n private _syncedDocuments: DocumentKeySet\n ) {\n this.docComparator = newQueryComparator(query);\n this.documentSet = new DocumentSet(this.docComparator);\n }\n\n /**\n * The set of remote documents that the server has told us belongs to the target associated with\n * this view.\n */\n get syncedDocuments(): DocumentKeySet {\n return this._syncedDocuments;\n }\n\n /**\n * Iterates over a set of doc changes, applies the query limit, and computes\n * what the new results should be, what the changes were, and whether we may\n * need to go back to the local cache for more results. Does not make any\n * changes to the view.\n * @param docChanges - The doc changes to apply to this view.\n * @param previousChanges - If this is being called with a refill, then start\n * with this set of docs and changes instead of the current view.\n * @returns a new set of docs, changes, and refill flag.\n */\n computeDocChanges(\n docChanges: DocumentMap,\n previousChanges?: ViewDocumentChanges\n ): ViewDocumentChanges {\n const changeSet = previousChanges\n ? previousChanges.changeSet\n : new DocumentChangeSet();\n const oldDocumentSet = previousChanges\n ? previousChanges.documentSet\n : this.documentSet;\n let newMutatedKeys = previousChanges\n ? previousChanges.mutatedKeys\n : this.mutatedKeys;\n let newDocumentSet = oldDocumentSet;\n let needsRefill = false;\n\n // Track the last doc in a (full) limit. This is necessary, because some\n // update (a delete, or an update moving a doc past the old limit) might\n // mean there is some other document in the local cache that either should\n // come (1) between the old last limit doc and the new last document, in the\n // case of updates, or (2) after the new last document, in the case of\n // deletes. So we keep this doc at the old limit to compare the updates to.\n //\n // Note that this should never get used in a refill (when previousChanges is\n // set), because there will only be adds -- no deletes or updates.\n const lastDocInLimit =\n hasLimitToFirst(this.query) && oldDocumentSet.size === this.query.limit\n ? oldDocumentSet.last()\n : null;\n const firstDocInLimit =\n hasLimitToLast(this.query) && oldDocumentSet.size === this.query.limit\n ? oldDocumentSet.first()\n : null;\n\n docChanges.inorderTraversal((key, entry) => {\n const oldDoc = oldDocumentSet.get(key);\n const newDoc = queryMatches(this.query, entry) ? entry : null;\n\n const oldDocHadPendingMutations = oldDoc\n ? this.mutatedKeys.has(oldDoc.key)\n : false;\n const newDocHasPendingMutations = newDoc\n ? newDoc.hasLocalMutations ||\n // We only consider committed mutations for documents that were\n // mutated during the lifetime of the view.\n (this.mutatedKeys.has(newDoc.key) && newDoc.hasCommittedMutations)\n : false;\n\n let changeApplied = false;\n\n // Calculate change\n if (oldDoc && newDoc) {\n const docsEqual = oldDoc.data.isEqual(newDoc.data);\n if (!docsEqual) {\n if (!this.shouldWaitForSyncedDocument(oldDoc, newDoc)) {\n changeSet.track({\n type: ChangeType.Modified,\n doc: newDoc\n });\n changeApplied = true;\n\n if (\n (lastDocInLimit &&\n this.docComparator(newDoc, lastDocInLimit) > 0) ||\n (firstDocInLimit &&\n this.docComparator(newDoc, firstDocInLimit) < 0)\n ) {\n // This doc moved from inside the limit to outside the limit.\n // That means there may be some other doc in the local cache\n // that should be included instead.\n needsRefill = true;\n }\n }\n } else if (oldDocHadPendingMutations !== newDocHasPendingMutations) {\n changeSet.track({ type: ChangeType.Metadata, doc: newDoc });\n changeApplied = true;\n }\n } else if (!oldDoc && newDoc) {\n changeSet.track({ type: ChangeType.Added, doc: newDoc });\n changeApplied = true;\n } else if (oldDoc && !newDoc) {\n changeSet.track({ type: ChangeType.Removed, doc: oldDoc });\n changeApplied = true;\n\n if (lastDocInLimit || firstDocInLimit) {\n // A doc was removed from a full limit query. We'll need to\n // requery from the local cache to see if we know about some other\n // doc that should be in the results.\n needsRefill = true;\n }\n }\n\n if (changeApplied) {\n if (newDoc) {\n newDocumentSet = newDocumentSet.add(newDoc);\n if (newDocHasPendingMutations) {\n newMutatedKeys = newMutatedKeys.add(key);\n } else {\n newMutatedKeys = newMutatedKeys.delete(key);\n }\n } else {\n newDocumentSet = newDocumentSet.delete(key);\n newMutatedKeys = newMutatedKeys.delete(key);\n }\n }\n });\n\n // Drop documents out to meet limit/limitToLast requirement.\n if (hasLimitToFirst(this.query) || hasLimitToLast(this.query)) {\n while (newDocumentSet.size > this.query.limit!) {\n const oldDoc = hasLimitToFirst(this.query)\n ? newDocumentSet.last()\n : newDocumentSet.first();\n newDocumentSet = newDocumentSet.delete(oldDoc!.key);\n newMutatedKeys = newMutatedKeys.delete(oldDoc!.key);\n changeSet.track({ type: ChangeType.Removed, doc: oldDoc! });\n }\n }\n\n debugAssert(\n !needsRefill || !previousChanges,\n 'View was refilled using docs that themselves needed refilling.'\n );\n return {\n documentSet: newDocumentSet,\n changeSet,\n needsRefill,\n mutatedKeys: newMutatedKeys\n };\n }\n\n private shouldWaitForSyncedDocument(\n oldDoc: Document,\n newDoc: Document\n ): boolean {\n // We suppress the initial change event for documents that were modified as\n // part of a write acknowledgment (e.g. when the value of a server transform\n // is applied) as Watch will send us the same document again.\n // By suppressing the event, we only raise two user visible events (one with\n // `hasPendingWrites` and the final state of the document) instead of three\n // (one with `hasPendingWrites`, the modified document with\n // `hasPendingWrites` and the final state of the document).\n return (\n oldDoc.hasLocalMutations &&\n newDoc.hasCommittedMutations &&\n !newDoc.hasLocalMutations\n );\n }\n\n /**\n * Updates the view with the given ViewDocumentChanges and optionally updates\n * limbo docs and sync state from the provided target change.\n * @param docChanges - The set of changes to make to the view's docs.\n * @param updateLimboDocuments - Whether to update limbo documents based on\n * this change.\n * @param targetChange - A target change to apply for computing limbo docs and\n * sync state.\n * @returns A new ViewChange with the given docs, changes, and sync state.\n */\n // PORTING NOTE: The iOS/Android clients always compute limbo document changes.\n applyChanges(\n docChanges: ViewDocumentChanges,\n updateLimboDocuments: boolean,\n targetChange?: TargetChange\n ): ViewChange {\n debugAssert(\n !docChanges.needsRefill,\n 'Cannot apply changes that need a refill'\n );\n const oldDocs = this.documentSet;\n this.documentSet = docChanges.documentSet;\n this.mutatedKeys = docChanges.mutatedKeys;\n // Sort changes based on type and query comparator\n const changes = docChanges.changeSet.getChanges();\n changes.sort((c1, c2) => {\n return (\n compareChangeType(c1.type, c2.type) ||\n this.docComparator(c1.doc, c2.doc)\n );\n });\n\n this.applyTargetChange(targetChange);\n const limboChanges = updateLimboDocuments\n ? this.updateLimboDocuments()\n : [];\n const synced = this.limboDocuments.size === 0 && this.current;\n const newSyncState = synced ? SyncState.Synced : SyncState.Local;\n const syncStateChanged = newSyncState !== this.syncState;\n this.syncState = newSyncState;\n\n if (changes.length === 0 && !syncStateChanged) {\n // no changes\n return { limboChanges };\n } else {\n const snap: ViewSnapshot = new ViewSnapshot(\n this.query,\n docChanges.documentSet,\n oldDocs,\n changes,\n docChanges.mutatedKeys,\n newSyncState === SyncState.Local,\n syncStateChanged,\n /* excludesMetadataChanges= */ false\n );\n return {\n snapshot: snap,\n limboChanges\n };\n }\n }\n\n /**\n * Applies an OnlineState change to the view, potentially generating a\n * ViewChange if the view's syncState changes as a result.\n */\n applyOnlineStateChange(onlineState: OnlineState): ViewChange {\n if (this.current && onlineState === OnlineState.Offline) {\n // If we're offline, set `current` to false and then call applyChanges()\n // to refresh our syncState and generate a ViewChange as appropriate. We\n // are guaranteed to get a new TargetChange that sets `current` back to\n // true once the client is back online.\n this.current = false;\n return this.applyChanges(\n {\n documentSet: this.documentSet,\n changeSet: new DocumentChangeSet(),\n mutatedKeys: this.mutatedKeys,\n needsRefill: false\n },\n /* updateLimboDocuments= */ false\n );\n } else {\n // No effect, just return a no-op ViewChange.\n return { limboChanges: [] };\n }\n }\n\n /**\n * Returns whether the doc for the given key should be in limbo.\n */\n private shouldBeInLimbo(key: DocumentKey): boolean {\n // If the remote end says it's part of this query, it's not in limbo.\n if (this._syncedDocuments.has(key)) {\n return false;\n }\n // The local store doesn't think it's a result, so it shouldn't be in limbo.\n if (!this.documentSet.has(key)) {\n return false;\n }\n // If there are local changes to the doc, they might explain why the server\n // doesn't know that it's part of the query. So don't put it in limbo.\n // TODO(klimt): Ideally, we would only consider changes that might actually\n // affect this specific query.\n if (this.documentSet.get(key)!.hasLocalMutations) {\n return false;\n }\n // Everything else is in limbo.\n return true;\n }\n\n /**\n * Updates syncedDocuments, current, and limbo docs based on the given change.\n * Returns the list of changes to which docs are in limbo.\n */\n private applyTargetChange(targetChange?: TargetChange): void {\n if (targetChange) {\n targetChange.addedDocuments.forEach(\n key => (this._syncedDocuments = this._syncedDocuments.add(key))\n );\n targetChange.modifiedDocuments.forEach(key => {\n debugAssert(\n this._syncedDocuments.has(key),\n `Modified document ${key} not found in view.`\n );\n });\n targetChange.removedDocuments.forEach(\n key => (this._syncedDocuments = this._syncedDocuments.delete(key))\n );\n this.current = targetChange.current;\n }\n }\n\n private updateLimboDocuments(): LimboDocumentChange[] {\n // We can only determine limbo documents when we're in-sync with the server.\n if (!this.current) {\n return [];\n }\n\n // TODO(klimt): Do this incrementally so that it's not quadratic when\n // updating many documents.\n const oldLimboDocuments = this.limboDocuments;\n this.limboDocuments = documentKeySet();\n this.documentSet.forEach(doc => {\n if (this.shouldBeInLimbo(doc.key)) {\n this.limboDocuments = this.limboDocuments.add(doc.key);\n }\n });\n\n // Diff the new limbo docs with the old limbo docs.\n const changes: LimboDocumentChange[] = [];\n oldLimboDocuments.forEach(key => {\n if (!this.limboDocuments.has(key)) {\n changes.push(new RemovedLimboDocument(key));\n }\n });\n this.limboDocuments.forEach(key => {\n if (!oldLimboDocuments.has(key)) {\n changes.push(new AddedLimboDocument(key));\n }\n });\n return changes;\n }\n\n /**\n * Update the in-memory state of the current view with the state read from\n * persistence.\n *\n * We update the query view whenever a client's primary status changes:\n * - When a client transitions from primary to secondary, it can miss\n * LocalStorage updates and its query views may temporarily not be\n * synchronized with the state on disk.\n * - For secondary to primary transitions, the client needs to update the list\n * of `syncedDocuments` since secondary clients update their query views\n * based purely on synthesized RemoteEvents.\n *\n * @param queryResult.documents - The documents that match the query according\n * to the LocalStore.\n * @param queryResult.remoteKeys - The keys of the documents that match the\n * query according to the backend.\n *\n * @returns The ViewChange that resulted from this synchronization.\n */\n // PORTING NOTE: Multi-tab only.\n synchronizeWithPersistedState(queryResult: QueryResult): ViewChange {\n this._syncedDocuments = queryResult.remoteKeys;\n this.limboDocuments = documentKeySet();\n const docChanges = this.computeDocChanges(queryResult.documents);\n return this.applyChanges(docChanges, /*updateLimboDocuments=*/ true);\n }\n\n /**\n * Returns a view snapshot as if this query was just listened to. Contains\n * a document add for every existing document and the `fromCache` and\n * `hasPendingWrites` status of the already established view.\n */\n // PORTING NOTE: Multi-tab only.\n computeInitialSnapshot(): ViewSnapshot {\n return ViewSnapshot.fromInitialDocuments(\n this.query,\n this.documentSet,\n this.mutatedKeys,\n this.syncState === SyncState.Local\n );\n }\n}\n\nfunction compareChangeType(c1: ChangeType, c2: ChangeType): number {\n const order = (change: ChangeType): 0 | 1 | 2 => {\n switch (change) {\n case ChangeType.Added:\n return 1;\n case ChangeType.Modified:\n return 2;\n case ChangeType.Metadata:\n // A metadata change is converted to a modified change at the public\n // api layer. Since we sort by document key and then change type,\n // metadata and modified changes must be sorted equivalently.\n return 2;\n case ChangeType.Removed:\n return 0;\n default:\n return fail('Unknown ChangeType: ' + change);\n }\n };\n\n return order(c1) - order(c2);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { LoadBundleTask } from '../exp/bundle';\nimport { ignoreIfPrimaryLeaseLoss, LocalStore } from '../local/local_store';\nimport {\n localStoreAcknowledgeBatch,\n localStoreAllocateTarget,\n localStoreApplyRemoteEventToLocalCache,\n localStoreExecuteQuery,\n localStoreGetActiveClients,\n localStoreGetCachedTarget,\n localStoreGetHighestUnacknowledgedBatchId,\n localStoreGetNewDocumentChanges,\n localStoreHandleUserChange,\n localStoreHasNewerBundle,\n localStoreLookupMutationDocuments,\n localStoreNotifyLocalViewChanges,\n localStoreRejectBatch,\n localStoreReleaseTarget,\n localStoreRemoveCachedMutationBatchMetadata,\n localStoreSaveBundle,\n localStoreWriteLocally\n} from '../local/local_store_impl';\nimport { LocalViewChanges } from '../local/local_view_changes';\nimport { ReferenceSet } from '../local/reference_set';\nimport { ClientId, SharedClientState } from '../local/shared_client_state';\nimport { QueryTargetState } from '../local/shared_client_state_syncer';\nimport { TargetData, TargetPurpose } from '../local/target_data';\nimport {\n DocumentKeySet,\n documentKeySet,\n DocumentMap\n} from '../model/collections';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { Mutation } from '../model/mutation';\nimport { MutationBatchResult } from '../model/mutation_batch';\nimport { ResourcePath } from '../model/path';\nimport { RemoteEvent, TargetChange } from '../remote/remote_event';\nimport {\n canUseNetwork,\n fillWritePipeline,\n RemoteStore,\n remoteStoreApplyPrimaryState,\n remoteStoreListen,\n remoteStoreUnlisten\n} from '../remote/remote_store';\nimport { debugAssert, debugCast, fail, hardAssert } from '../util/assert';\nimport { wrapInUserErrorIfRecoverable } from '../util/async_queue';\nimport { BundleReader } from '../util/bundle_reader';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug, logWarn } from '../util/log';\nimport { primitiveComparator } from '../util/misc';\nimport { ObjectMap } from '../util/obj_map';\nimport { Deferred } from '../util/promise';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\nimport { BATCHID_UNKNOWN } from '../util/types';\n\nimport {\n bundleInitialProgress,\n BundleLoader,\n bundleSuccessProgress\n} from './bundle_impl';\nimport {\n EventManager,\n eventManagerOnOnlineStateChange,\n eventManagerOnWatchChange,\n eventManagerOnWatchError\n} from './event_manager';\nimport { ListenSequence } from './listen_sequence';\nimport {\n canonifyQuery,\n LimitType,\n newQuery,\n newQueryForPath,\n Query,\n queryEquals,\n queryToTarget,\n stringifyQuery\n} from './query';\nimport { SnapshotVersion } from './snapshot_version';\nimport { SyncEngine } from './sync_engine';\nimport { Target } from './target';\nimport { TargetIdGenerator } from './target_id_generator';\nimport {\n BatchId,\n MutationBatchState,\n OnlineState,\n OnlineStateSource,\n TargetId\n} from './types';\nimport {\n AddedLimboDocument,\n LimboDocumentChange,\n RemovedLimboDocument,\n View,\n ViewChange\n} from './view';\nimport { ViewSnapshot } from './view_snapshot';\n\nconst LOG_TAG = 'SyncEngine';\n\n/**\n * QueryView contains all of the data that SyncEngine needs to keep track of for\n * a particular query.\n */\nclass QueryView {\n constructor(\n /**\n * The query itself.\n */\n public query: Query,\n /**\n * The target number created by the client that is used in the watch\n * stream to identify this query.\n */\n public targetId: TargetId,\n /**\n * The view is responsible for computing the final merged truth of what\n * docs are in the query. It gets notified of local and remote changes,\n * and applies the query filters and limits to determine the most correct\n * possible results.\n */\n public view: View\n ) {}\n}\n\n/** Tracks a limbo resolution. */\nclass LimboResolution {\n constructor(public key: DocumentKey) {}\n\n /**\n * Set to true once we've received a document. This is used in\n * getRemoteKeysForTarget() and ultimately used by WatchChangeAggregator to\n * decide whether it needs to manufacture a delete event for the target once\n * the target is CURRENT.\n */\n receivedDocument: boolean = false;\n}\n\n/**\n * A function that updates a QueryView with a set of document changes (and a\n * remote event if applicable).\n */\ntype ApplyDocChangesHandler = (\n queryView: QueryView,\n changes: DocumentMap,\n remoteEvent?: RemoteEvent\n) => Promise<ViewSnapshot | undefined>;\n\n/**\n * Callbacks implemented by EventManager to handle notifications from\n * SyncEngine.\n */\ninterface SyncEngineListener {\n /** Handles new view snapshots. */\n onWatchChange?(snapshots: ViewSnapshot[]): void;\n\n /** Handles the failure of a query. */\n onWatchError?(query: Query, error: FirestoreError): void;\n}\n\n/**\n * An implementation of `SyncEngine` coordinating with other parts of SDK.\n *\n * The parts of SyncEngine that act as a callback to RemoteStore need to be\n * registered individually. This is done in `syncEngineWrite()` and\n * `syncEngineListen()` (as well as `applyPrimaryState()`) as these methods\n * serve as entry points to RemoteStore's functionality.\n *\n * Note: some field defined in this class might have public access level, but\n * the class is not exported so they are only accessible from this module.\n * This is useful to implement optional features (like bundles) in free\n * functions, such that they are tree-shakeable.\n */\nclass SyncEngineImpl implements SyncEngine {\n syncEngineListener: SyncEngineListener = {};\n\n /**\n * A callback that updates the QueryView based on the provided change.\n *\n * PORTING NOTE: On other platforms, this logic lives in\n * `emitNewSnapshotsAndNotifyLocalStore()`, but on Web it is extracted to\n * ensure that all view logic only exists in bundles that include views.\n */\n applyDocChanges?: ApplyDocChangesHandler;\n\n queryViewsByQuery = new ObjectMap<Query, QueryView>(\n q => canonifyQuery(q),\n queryEquals\n );\n queriesByTarget = new Map<TargetId, Query[]>();\n /**\n * The keys of documents that are in limbo for which we haven't yet started a\n * limbo resolution query. The strings in this set are the result of calling\n * `key.path.canonicalString()` where `key` is a `DocumentKey` object.\n *\n * The `Set` type was chosen because it provides efficient lookup and removal\n * of arbitrary elements and it also maintains insertion order, providing the\n * desired queue-like FIFO semantics.\n */\n enqueuedLimboResolutions = new Set<string>();\n /**\n * Keeps track of the target ID for each document that is in limbo with an\n * active target.\n */\n activeLimboTargetsByKey = new SortedMap<DocumentKey, TargetId>(\n DocumentKey.comparator\n );\n /**\n * Keeps track of the information about an active limbo resolution for each\n * active target ID that was started for the purpose of limbo resolution.\n */\n activeLimboResolutionsByTarget = new Map<TargetId, LimboResolution>();\n limboDocumentRefs = new ReferenceSet();\n /** Stores user completion handlers, indexed by User and BatchId. */\n mutationUserCallbacks = {} as {\n [uidKey: string]: SortedMap<BatchId, Deferred<void>>;\n };\n /** Stores user callbacks waiting for all pending writes to be acknowledged. */\n pendingWritesCallbacks = new Map<BatchId, Array<Deferred<void>>>();\n limboTargetIdGenerator = TargetIdGenerator.forSyncEngine();\n\n onlineState = OnlineState.Unknown;\n\n // The primary state is set to `true` or `false` immediately after Firestore\n // startup. In the interim, a client should only be considered primary if\n // `isPrimary` is true.\n _isPrimaryClient: undefined | boolean = undefined;\n\n constructor(\n readonly localStore: LocalStore,\n readonly remoteStore: RemoteStore,\n readonly eventManager: EventManager,\n // PORTING NOTE: Manages state synchronization in multi-tab environments.\n readonly sharedClientState: SharedClientState,\n public currentUser: User,\n readonly maxConcurrentLimboResolutions: number\n ) {}\n\n get isPrimaryClient(): boolean {\n return this._isPrimaryClient === true;\n }\n}\n\nexport function newSyncEngine(\n localStore: LocalStore,\n remoteStore: RemoteStore,\n eventManager: EventManager,\n // PORTING NOTE: Manages state synchronization in multi-tab environments.\n sharedClientState: SharedClientState,\n currentUser: User,\n maxConcurrentLimboResolutions: number,\n isPrimary: boolean\n): SyncEngine {\n const syncEngine = new SyncEngineImpl(\n localStore,\n remoteStore,\n eventManager,\n sharedClientState,\n currentUser,\n maxConcurrentLimboResolutions\n );\n if (isPrimary) {\n syncEngine._isPrimaryClient = true;\n }\n return syncEngine;\n}\n\n/**\n * Initiates the new listen, resolves promise when listen enqueued to the\n * server. All the subsequent view snapshots or errors are sent to the\n * subscribed handlers. Returns the initial snapshot.\n */\nexport async function syncEngineListen(\n syncEngine: SyncEngine,\n query: Query\n): Promise<ViewSnapshot> {\n const syncEngineImpl = ensureWatchCallbacks(syncEngine);\n\n let targetId;\n let viewSnapshot;\n\n const queryView = syncEngineImpl.queryViewsByQuery.get(query);\n if (queryView) {\n // PORTING NOTE: With Multi-Tab Web, it is possible that a query view\n // already exists when EventManager calls us for the first time. This\n // happens when the primary tab is already listening to this query on\n // behalf of another tab and the user of the primary also starts listening\n // to the query. EventManager will not have an assigned target ID in this\n // case and calls `listen` to obtain this ID.\n targetId = queryView.targetId;\n syncEngineImpl.sharedClientState.addLocalQueryTarget(targetId);\n viewSnapshot = queryView.view.computeInitialSnapshot();\n } else {\n const targetData = await localStoreAllocateTarget(\n syncEngineImpl.localStore,\n queryToTarget(query)\n );\n\n const status = syncEngineImpl.sharedClientState.addLocalQueryTarget(\n targetData.targetId\n );\n targetId = targetData.targetId;\n viewSnapshot = await initializeViewAndComputeSnapshot(\n syncEngineImpl,\n query,\n targetId,\n status === 'current'\n );\n if (syncEngineImpl.isPrimaryClient) {\n remoteStoreListen(syncEngineImpl.remoteStore, targetData);\n }\n }\n\n return viewSnapshot;\n}\n\n/**\n * Registers a view for a previously unknown query and computes its initial\n * snapshot.\n */\nasync function initializeViewAndComputeSnapshot(\n syncEngineImpl: SyncEngineImpl,\n query: Query,\n targetId: TargetId,\n current: boolean\n): Promise<ViewSnapshot> {\n // PORTING NOTE: On Web only, we inject the code that registers new Limbo\n // targets based on view changes. This allows us to only depend on Limbo\n // changes when user code includes queries.\n syncEngineImpl.applyDocChanges = (queryView, changes, remoteEvent) =>\n applyDocChanges(syncEngineImpl, queryView, changes, remoteEvent);\n\n const queryResult = await localStoreExecuteQuery(\n syncEngineImpl.localStore,\n query,\n /* usePreviousResults= */ true\n );\n const view = new View(query, queryResult.remoteKeys);\n const viewDocChanges = view.computeDocChanges(queryResult.documents);\n const synthesizedTargetChange = TargetChange.createSynthesizedTargetChangeForCurrentChange(\n targetId,\n current && syncEngineImpl.onlineState !== OnlineState.Offline\n );\n const viewChange = view.applyChanges(\n viewDocChanges,\n /* updateLimboDocuments= */ syncEngineImpl.isPrimaryClient,\n synthesizedTargetChange\n );\n updateTrackedLimbos(syncEngineImpl, targetId, viewChange.limboChanges);\n\n debugAssert(\n !!viewChange.snapshot,\n 'applyChanges for new view should always return a snapshot'\n );\n\n const data = new QueryView(query, targetId, view);\n\n syncEngineImpl.queryViewsByQuery.set(query, data);\n if (syncEngineImpl.queriesByTarget.has(targetId)) {\n syncEngineImpl.queriesByTarget.get(targetId)!.push(query);\n } else {\n syncEngineImpl.queriesByTarget.set(targetId, [query]);\n }\n\n return viewChange.snapshot;\n}\n\n/** Stops listening to the query. */\nexport async function syncEngineUnlisten(\n syncEngine: SyncEngine,\n query: Query\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const queryView = syncEngineImpl.queryViewsByQuery.get(query)!;\n debugAssert(\n !!queryView,\n 'Trying to unlisten on query not found:' + stringifyQuery(query)\n );\n\n // Only clean up the query view and target if this is the only query mapped\n // to the target.\n const queries = syncEngineImpl.queriesByTarget.get(queryView.targetId)!;\n if (queries.length > 1) {\n syncEngineImpl.queriesByTarget.set(\n queryView.targetId,\n queries.filter(q => !queryEquals(q, query))\n );\n syncEngineImpl.queryViewsByQuery.delete(query);\n return;\n }\n\n // No other queries are mapped to the target, clean up the query and the target.\n if (syncEngineImpl.isPrimaryClient) {\n // We need to remove the local query target first to allow us to verify\n // whether any other client is still interested in this target.\n syncEngineImpl.sharedClientState.removeLocalQueryTarget(queryView.targetId);\n const targetRemainsActive = syncEngineImpl.sharedClientState.isActiveQueryTarget(\n queryView.targetId\n );\n\n if (!targetRemainsActive) {\n await localStoreReleaseTarget(\n syncEngineImpl.localStore,\n queryView.targetId,\n /*keepPersistedTargetData=*/ false\n )\n .then(() => {\n syncEngineImpl.sharedClientState.clearQueryState(queryView.targetId);\n remoteStoreUnlisten(syncEngineImpl.remoteStore, queryView.targetId);\n removeAndCleanupTarget(syncEngineImpl, queryView.targetId);\n })\n .catch(ignoreIfPrimaryLeaseLoss);\n }\n } else {\n removeAndCleanupTarget(syncEngineImpl, queryView.targetId);\n await localStoreReleaseTarget(\n syncEngineImpl.localStore,\n queryView.targetId,\n /*keepPersistedTargetData=*/ true\n );\n }\n}\n\n/**\n * Initiates the write of local mutation batch which involves adding the\n * writes to the mutation queue, notifying the remote store about new\n * mutations and raising events for any changes this write caused.\n *\n * The promise returned by this call is resolved when the above steps\n * have completed, *not* when the write was acked by the backend. The\n * userCallback is resolved once the write was acked/rejected by the\n * backend (or failed locally for any other reason).\n */\nexport async function syncEngineWrite(\n syncEngine: SyncEngine,\n batch: Mutation[],\n userCallback: Deferred<void>\n): Promise<void> {\n const syncEngineImpl = syncEngineEnsureWriteCallbacks(syncEngine);\n\n try {\n const result = await localStoreWriteLocally(\n syncEngineImpl.localStore,\n batch\n );\n syncEngineImpl.sharedClientState.addPendingMutation(result.batchId);\n addMutationCallback(syncEngineImpl, result.batchId, userCallback);\n await syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngineImpl,\n result.changes\n );\n await fillWritePipeline(syncEngineImpl.remoteStore);\n } catch (e) {\n // If we can't persist the mutation, we reject the user callback and\n // don't send the mutation. The user can then retry the write.\n const error = wrapInUserErrorIfRecoverable(e, `Failed to persist write`);\n userCallback.reject(error);\n }\n}\n\n/**\n * Applies one remote event to the sync engine, notifying any views of the\n * changes, and releasing any pending mutation batches that would become\n * visible because of the snapshot version the remote event contains.\n */\nexport async function syncEngineApplyRemoteEvent(\n syncEngine: SyncEngine,\n remoteEvent: RemoteEvent\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n\n try {\n const changes = await localStoreApplyRemoteEventToLocalCache(\n syncEngineImpl.localStore,\n remoteEvent\n );\n // Update `receivedDocument` as appropriate for any limbo targets.\n remoteEvent.targetChanges.forEach((targetChange, targetId) => {\n const limboResolution = syncEngineImpl.activeLimboResolutionsByTarget.get(\n targetId\n );\n if (limboResolution) {\n // Since this is a limbo resolution lookup, it's for a single document\n // and it could be added, modified, or removed, but not a combination.\n hardAssert(\n targetChange.addedDocuments.size +\n targetChange.modifiedDocuments.size +\n targetChange.removedDocuments.size <=\n 1,\n 'Limbo resolution for single document contains multiple changes.'\n );\n if (targetChange.addedDocuments.size > 0) {\n limboResolution.receivedDocument = true;\n } else if (targetChange.modifiedDocuments.size > 0) {\n hardAssert(\n limboResolution.receivedDocument,\n 'Received change for limbo target document without add.'\n );\n } else if (targetChange.removedDocuments.size > 0) {\n hardAssert(\n limboResolution.receivedDocument,\n 'Received remove for limbo target document without add.'\n );\n limboResolution.receivedDocument = false;\n } else {\n // This was probably just a CURRENT targetChange or similar.\n }\n }\n });\n await syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngineImpl,\n changes,\n remoteEvent\n );\n } catch (error) {\n await ignoreIfPrimaryLeaseLoss(error);\n }\n}\n\n/**\n * Applies an OnlineState change to the sync engine and notifies any views of\n * the change.\n */\nexport function syncEngineApplyOnlineStateChange(\n syncEngine: SyncEngine,\n onlineState: OnlineState,\n source: OnlineStateSource\n): void {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n // If we are the secondary client, we explicitly ignore the remote store's\n // online state (the local client may go offline, even though the primary\n // tab remains online) and only apply the primary tab's online state from\n // SharedClientState.\n if (\n (syncEngineImpl.isPrimaryClient &&\n source === OnlineStateSource.RemoteStore) ||\n (!syncEngineImpl.isPrimaryClient &&\n source === OnlineStateSource.SharedClientState)\n ) {\n const newViewSnapshots = [] as ViewSnapshot[];\n syncEngineImpl.queryViewsByQuery.forEach((query, queryView) => {\n const viewChange = queryView.view.applyOnlineStateChange(onlineState);\n debugAssert(\n viewChange.limboChanges.length === 0,\n 'OnlineState should not affect limbo documents.'\n );\n if (viewChange.snapshot) {\n newViewSnapshots.push(viewChange.snapshot);\n }\n });\n\n eventManagerOnOnlineStateChange(syncEngineImpl.eventManager, onlineState);\n\n if (newViewSnapshots.length) {\n debugAssert(\n !!syncEngineImpl.syncEngineListener.onWatchChange,\n 'Active views but EventManager callbacks are not assigned'\n );\n syncEngineImpl.syncEngineListener.onWatchChange(newViewSnapshots);\n }\n\n syncEngineImpl.onlineState = onlineState;\n if (syncEngineImpl.isPrimaryClient) {\n syncEngineImpl.sharedClientState.setOnlineState(onlineState);\n }\n }\n}\n\n/**\n * Rejects the listen for the given targetID. This can be triggered by the\n * backend for any active target.\n *\n * @param syncEngine - The sync engine implementation.\n * @param targetId - The targetID corresponds to one previously initiated by the\n * user as part of TargetData passed to listen() on RemoteStore.\n * @param err - A description of the condition that has forced the rejection.\n * Nearly always this will be an indication that the user is no longer\n * authorized to see the data matching the target.\n */\nexport async function syncEngineRejectListen(\n syncEngine: SyncEngine,\n targetId: TargetId,\n err: FirestoreError\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n\n // PORTING NOTE: Multi-tab only.\n syncEngineImpl.sharedClientState.updateQueryState(targetId, 'rejected', err);\n\n const limboResolution = syncEngineImpl.activeLimboResolutionsByTarget.get(\n targetId\n );\n const limboKey = limboResolution && limboResolution.key;\n if (limboKey) {\n // TODO(klimt): We really only should do the following on permission\n // denied errors, but we don't have the cause code here.\n\n // It's a limbo doc. Create a synthetic event saying it was deleted.\n // This is kind of a hack. Ideally, we would have a method in the local\n // store to purge a document. However, it would be tricky to keep all of\n // the local store's invariants with another method.\n let documentUpdates = new SortedMap<DocumentKey, MutableDocument>(\n DocumentKey.comparator\n );\n documentUpdates = documentUpdates.insert(\n limboKey,\n MutableDocument.newNoDocument(limboKey, SnapshotVersion.min())\n );\n const resolvedLimboDocuments = documentKeySet().add(limboKey);\n const event = new RemoteEvent(\n SnapshotVersion.min(),\n /* targetChanges= */ new Map<TargetId, TargetChange>(),\n /* targetMismatches= */ new SortedSet<TargetId>(primitiveComparator),\n documentUpdates,\n resolvedLimboDocuments\n );\n\n await syncEngineApplyRemoteEvent(syncEngineImpl, event);\n\n // Since this query failed, we won't want to manually unlisten to it.\n // We only remove it from bookkeeping after we successfully applied the\n // RemoteEvent. If `applyRemoteEvent()` throws, we want to re-listen to\n // this query when the RemoteStore restarts the Watch stream, which should\n // re-trigger the target failure.\n syncEngineImpl.activeLimboTargetsByKey = syncEngineImpl.activeLimboTargetsByKey.remove(\n limboKey\n );\n syncEngineImpl.activeLimboResolutionsByTarget.delete(targetId);\n pumpEnqueuedLimboResolutions(syncEngineImpl);\n } else {\n await localStoreReleaseTarget(\n syncEngineImpl.localStore,\n targetId,\n /* keepPersistedTargetData */ false\n )\n .then(() => removeAndCleanupTarget(syncEngineImpl, targetId, err))\n .catch(ignoreIfPrimaryLeaseLoss);\n }\n}\n\nexport async function syncEngineApplySuccessfulWrite(\n syncEngine: SyncEngine,\n mutationBatchResult: MutationBatchResult\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const batchId = mutationBatchResult.batch.batchId;\n\n try {\n const changes = await localStoreAcknowledgeBatch(\n syncEngineImpl.localStore,\n mutationBatchResult\n );\n\n // The local store may or may not be able to apply the write result and\n // raise events immediately (depending on whether the watcher is caught\n // up), so we raise user callbacks first so that they consistently happen\n // before listen events.\n processUserCallback(syncEngineImpl, batchId, /*error=*/ null);\n triggerPendingWritesCallbacks(syncEngineImpl, batchId);\n\n syncEngineImpl.sharedClientState.updateMutationState(\n batchId,\n 'acknowledged'\n );\n await syncEngineEmitNewSnapsAndNotifyLocalStore(syncEngineImpl, changes);\n } catch (error) {\n await ignoreIfPrimaryLeaseLoss(error);\n }\n}\n\nexport async function syncEngineRejectFailedWrite(\n syncEngine: SyncEngine,\n batchId: BatchId,\n error: FirestoreError\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n\n try {\n const changes = await localStoreRejectBatch(\n syncEngineImpl.localStore,\n batchId\n );\n\n // The local store may or may not be able to apply the write result and\n // raise events immediately (depending on whether the watcher is caught up),\n // so we raise user callbacks first so that they consistently happen before\n // listen events.\n processUserCallback(syncEngineImpl, batchId, error);\n triggerPendingWritesCallbacks(syncEngineImpl, batchId);\n\n syncEngineImpl.sharedClientState.updateMutationState(\n batchId,\n 'rejected',\n error\n );\n await syncEngineEmitNewSnapsAndNotifyLocalStore(syncEngineImpl, changes);\n } catch (error) {\n await ignoreIfPrimaryLeaseLoss(error);\n }\n}\n\n/**\n * Registers a user callback that resolves when all pending mutations at the moment of calling\n * are acknowledged .\n */\nexport async function syncEngineRegisterPendingWritesCallback(\n syncEngine: SyncEngine,\n callback: Deferred<void>\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n if (!canUseNetwork(syncEngineImpl.remoteStore)) {\n logDebug(\n LOG_TAG,\n 'The network is disabled. The task returned by ' +\n \"'awaitPendingWrites()' will not complete until the network is enabled.\"\n );\n }\n\n try {\n const highestBatchId = await localStoreGetHighestUnacknowledgedBatchId(\n syncEngineImpl.localStore\n );\n if (highestBatchId === BATCHID_UNKNOWN) {\n // Trigger the callback right away if there is no pending writes at the moment.\n callback.resolve();\n return;\n }\n\n const callbacks =\n syncEngineImpl.pendingWritesCallbacks.get(highestBatchId) || [];\n callbacks.push(callback);\n syncEngineImpl.pendingWritesCallbacks.set(highestBatchId, callbacks);\n } catch (e) {\n const firestoreError = wrapInUserErrorIfRecoverable(\n e,\n 'Initialization of waitForPendingWrites() operation failed'\n );\n callback.reject(firestoreError);\n }\n}\n\n/**\n * Triggers the callbacks that are waiting for this batch id to get acknowledged by server,\n * if there are any.\n */\nfunction triggerPendingWritesCallbacks(\n syncEngineImpl: SyncEngineImpl,\n batchId: BatchId\n): void {\n (syncEngineImpl.pendingWritesCallbacks.get(batchId) || []).forEach(\n callback => {\n callback.resolve();\n }\n );\n\n syncEngineImpl.pendingWritesCallbacks.delete(batchId);\n}\n\n/** Reject all outstanding callbacks waiting for pending writes to complete. */\nfunction rejectOutstandingPendingWritesCallbacks(\n syncEngineImpl: SyncEngineImpl,\n errorMessage: string\n): void {\n syncEngineImpl.pendingWritesCallbacks.forEach(callbacks => {\n callbacks.forEach(callback => {\n callback.reject(new FirestoreError(Code.CANCELLED, errorMessage));\n });\n });\n\n syncEngineImpl.pendingWritesCallbacks.clear();\n}\n\nfunction addMutationCallback(\n syncEngineImpl: SyncEngineImpl,\n batchId: BatchId,\n callback: Deferred<void>\n): void {\n let newCallbacks =\n syncEngineImpl.mutationUserCallbacks[syncEngineImpl.currentUser.toKey()];\n if (!newCallbacks) {\n newCallbacks = new SortedMap<BatchId, Deferred<void>>(primitiveComparator);\n }\n newCallbacks = newCallbacks.insert(batchId, callback);\n syncEngineImpl.mutationUserCallbacks[\n syncEngineImpl.currentUser.toKey()\n ] = newCallbacks;\n}\n\n/**\n * Resolves or rejects the user callback for the given batch and then discards\n * it.\n */\nfunction processUserCallback(\n syncEngine: SyncEngine,\n batchId: BatchId,\n error: FirestoreError | null\n): void {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n let newCallbacks =\n syncEngineImpl.mutationUserCallbacks[syncEngineImpl.currentUser.toKey()];\n\n // NOTE: Mutations restored from persistence won't have callbacks, so it's\n // okay for there to be no callback for this ID.\n if (newCallbacks) {\n const callback = newCallbacks.get(batchId);\n if (callback) {\n debugAssert(\n batchId === newCallbacks.minKey(),\n 'Mutation callbacks processed out-of-order?'\n );\n if (error) {\n callback.reject(error);\n } else {\n callback.resolve();\n }\n newCallbacks = newCallbacks.remove(batchId);\n }\n syncEngineImpl.mutationUserCallbacks[\n syncEngineImpl.currentUser.toKey()\n ] = newCallbacks;\n }\n}\n\nfunction removeAndCleanupTarget(\n syncEngineImpl: SyncEngineImpl,\n targetId: number,\n error: FirestoreError | null = null\n): void {\n syncEngineImpl.sharedClientState.removeLocalQueryTarget(targetId);\n\n debugAssert(\n syncEngineImpl.queriesByTarget.has(targetId) &&\n syncEngineImpl.queriesByTarget.get(targetId)!.length !== 0,\n `There are no queries mapped to target id ${targetId}`\n );\n\n for (const query of syncEngineImpl.queriesByTarget.get(targetId)!) {\n syncEngineImpl.queryViewsByQuery.delete(query);\n if (error) {\n syncEngineImpl.syncEngineListener.onWatchError!(query, error);\n }\n }\n\n syncEngineImpl.queriesByTarget.delete(targetId);\n\n if (syncEngineImpl.isPrimaryClient) {\n const limboKeys = syncEngineImpl.limboDocumentRefs.removeReferencesForId(\n targetId\n );\n limboKeys.forEach(limboKey => {\n const isReferenced = syncEngineImpl.limboDocumentRefs.containsKey(\n limboKey\n );\n if (!isReferenced) {\n // We removed the last reference for this key\n removeLimboTarget(syncEngineImpl, limboKey);\n }\n });\n }\n}\n\nfunction removeLimboTarget(\n syncEngineImpl: SyncEngineImpl,\n key: DocumentKey\n): void {\n syncEngineImpl.enqueuedLimboResolutions.delete(key.path.canonicalString());\n\n // It's possible that the target already got removed because the query failed. In that case,\n // the key won't exist in `limboTargetsByKey`. Only do the cleanup if we still have the target.\n const limboTargetId = syncEngineImpl.activeLimboTargetsByKey.get(key);\n if (limboTargetId === null) {\n // This target already got removed, because the query failed.\n return;\n }\n\n remoteStoreUnlisten(syncEngineImpl.remoteStore, limboTargetId);\n syncEngineImpl.activeLimboTargetsByKey = syncEngineImpl.activeLimboTargetsByKey.remove(\n key\n );\n syncEngineImpl.activeLimboResolutionsByTarget.delete(limboTargetId);\n pumpEnqueuedLimboResolutions(syncEngineImpl);\n}\n\nfunction updateTrackedLimbos(\n syncEngineImpl: SyncEngineImpl,\n targetId: TargetId,\n limboChanges: LimboDocumentChange[]\n): void {\n for (const limboChange of limboChanges) {\n if (limboChange instanceof AddedLimboDocument) {\n syncEngineImpl.limboDocumentRefs.addReference(limboChange.key, targetId);\n trackLimboChange(syncEngineImpl, limboChange);\n } else if (limboChange instanceof RemovedLimboDocument) {\n logDebug(LOG_TAG, 'Document no longer in limbo: ' + limboChange.key);\n syncEngineImpl.limboDocumentRefs.removeReference(\n limboChange.key,\n targetId\n );\n const isReferenced = syncEngineImpl.limboDocumentRefs.containsKey(\n limboChange.key\n );\n if (!isReferenced) {\n // We removed the last reference for this key\n removeLimboTarget(syncEngineImpl, limboChange.key);\n }\n } else {\n fail('Unknown limbo change: ' + JSON.stringify(limboChange));\n }\n }\n}\n\nfunction trackLimboChange(\n syncEngineImpl: SyncEngineImpl,\n limboChange: AddedLimboDocument\n): void {\n const key = limboChange.key;\n const keyString = key.path.canonicalString();\n if (\n !syncEngineImpl.activeLimboTargetsByKey.get(key) &&\n !syncEngineImpl.enqueuedLimboResolutions.has(keyString)\n ) {\n logDebug(LOG_TAG, 'New document in limbo: ' + key);\n syncEngineImpl.enqueuedLimboResolutions.add(keyString);\n pumpEnqueuedLimboResolutions(syncEngineImpl);\n }\n}\n\n/**\n * Starts listens for documents in limbo that are enqueued for resolution,\n * subject to a maximum number of concurrent resolutions.\n *\n * Without bounding the number of concurrent resolutions, the server can fail\n * with \"resource exhausted\" errors which can lead to pathological client\n * behavior as seen in https://github.com/firebase/firebase-js-sdk/issues/2683.\n */\nfunction pumpEnqueuedLimboResolutions(syncEngineImpl: SyncEngineImpl): void {\n while (\n syncEngineImpl.enqueuedLimboResolutions.size > 0 &&\n syncEngineImpl.activeLimboTargetsByKey.size <\n syncEngineImpl.maxConcurrentLimboResolutions\n ) {\n const keyString = syncEngineImpl.enqueuedLimboResolutions.values().next()\n .value;\n syncEngineImpl.enqueuedLimboResolutions.delete(keyString);\n const key = new DocumentKey(ResourcePath.fromString(keyString));\n const limboTargetId = syncEngineImpl.limboTargetIdGenerator.next();\n syncEngineImpl.activeLimboResolutionsByTarget.set(\n limboTargetId,\n new LimboResolution(key)\n );\n syncEngineImpl.activeLimboTargetsByKey = syncEngineImpl.activeLimboTargetsByKey.insert(\n key,\n limboTargetId\n );\n remoteStoreListen(\n syncEngineImpl.remoteStore,\n new TargetData(\n queryToTarget(newQueryForPath(key.path)),\n limboTargetId,\n TargetPurpose.LimboResolution,\n ListenSequence.INVALID\n )\n );\n }\n}\n\n// Visible for testing\nexport function syncEngineGetActiveLimboDocumentResolutions(\n syncEngine: SyncEngine\n): SortedMap<DocumentKey, TargetId> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n return syncEngineImpl.activeLimboTargetsByKey;\n}\n\n// Visible for testing\nexport function syncEngineGetEnqueuedLimboDocumentResolutions(\n syncEngine: SyncEngine\n): Set<string> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n return syncEngineImpl.enqueuedLimboResolutions;\n}\n\nexport async function syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngine: SyncEngine,\n changes: DocumentMap,\n remoteEvent?: RemoteEvent\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const newSnaps: ViewSnapshot[] = [];\n const docChangesInAllViews: LocalViewChanges[] = [];\n const queriesProcessed: Array<Promise<void>> = [];\n\n if (syncEngineImpl.queryViewsByQuery.isEmpty()) {\n // Return early since `onWatchChange()` might not have been assigned yet.\n return;\n }\n\n syncEngineImpl.queryViewsByQuery.forEach((_, queryView) => {\n debugAssert(\n !!syncEngineImpl.applyDocChanges,\n 'ApplyDocChangesHandler not set'\n );\n queriesProcessed.push(\n syncEngineImpl\n .applyDocChanges(queryView, changes, remoteEvent)\n .then(viewSnapshot => {\n if (viewSnapshot) {\n if (syncEngineImpl.isPrimaryClient) {\n syncEngineImpl.sharedClientState.updateQueryState(\n queryView.targetId,\n viewSnapshot.fromCache ? 'not-current' : 'current'\n );\n }\n newSnaps.push(viewSnapshot);\n const docChanges = LocalViewChanges.fromSnapshot(\n queryView.targetId,\n viewSnapshot\n );\n docChangesInAllViews.push(docChanges);\n }\n })\n );\n });\n\n await Promise.all(queriesProcessed);\n syncEngineImpl.syncEngineListener.onWatchChange!(newSnaps);\n await localStoreNotifyLocalViewChanges(\n syncEngineImpl.localStore,\n docChangesInAllViews\n );\n}\n\nasync function applyDocChanges(\n syncEngineImpl: SyncEngineImpl,\n queryView: QueryView,\n changes: DocumentMap,\n remoteEvent?: RemoteEvent\n): Promise<ViewSnapshot | undefined> {\n let viewDocChanges = queryView.view.computeDocChanges(changes);\n if (viewDocChanges.needsRefill) {\n // The query has a limit and some docs were removed, so we need\n // to re-run the query against the local store to make sure we\n // didn't lose any good docs that had been past the limit.\n viewDocChanges = await localStoreExecuteQuery(\n syncEngineImpl.localStore,\n queryView.query,\n /* usePreviousResults= */ false\n ).then(({ documents }) => {\n return queryView.view.computeDocChanges(documents, viewDocChanges);\n });\n }\n\n const targetChange =\n remoteEvent && remoteEvent.targetChanges.get(queryView.targetId);\n const viewChange = queryView.view.applyChanges(\n viewDocChanges,\n /* updateLimboDocuments= */ syncEngineImpl.isPrimaryClient,\n targetChange\n );\n updateTrackedLimbos(\n syncEngineImpl,\n queryView.targetId,\n viewChange.limboChanges\n );\n return viewChange.snapshot;\n}\n\nexport async function syncEngineHandleCredentialChange(\n syncEngine: SyncEngine,\n user: User\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const userChanged = !syncEngineImpl.currentUser.isEqual(user);\n\n if (userChanged) {\n logDebug(LOG_TAG, 'User change. New user:', user.toKey());\n\n const result = await localStoreHandleUserChange(\n syncEngineImpl.localStore,\n user\n );\n syncEngineImpl.currentUser = user;\n\n // Fails tasks waiting for pending writes requested by previous user.\n rejectOutstandingPendingWritesCallbacks(\n syncEngineImpl,\n \"'waitForPendingWrites' promise is rejected due to a user change.\"\n );\n // TODO(b/114226417): Consider calling this only in the primary tab.\n syncEngineImpl.sharedClientState.handleUserChange(\n user,\n result.removedBatchIds,\n result.addedBatchIds\n );\n await syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngineImpl,\n result.affectedDocuments\n );\n }\n}\n\nexport function syncEngineGetRemoteKeysForTarget(\n syncEngine: SyncEngine,\n targetId: TargetId\n): DocumentKeySet {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const limboResolution = syncEngineImpl.activeLimboResolutionsByTarget.get(\n targetId\n );\n if (limboResolution && limboResolution.receivedDocument) {\n return documentKeySet().add(limboResolution.key);\n } else {\n let keySet = documentKeySet();\n const queries = syncEngineImpl.queriesByTarget.get(targetId);\n if (!queries) {\n return keySet;\n }\n for (const query of queries) {\n const queryView = syncEngineImpl.queryViewsByQuery.get(query);\n debugAssert(\n !!queryView,\n `No query view found for ${stringifyQuery(query)}`\n );\n keySet = keySet.unionWith(queryView.view.syncedDocuments);\n }\n return keySet;\n }\n}\n\n/**\n * Reconcile the list of synced documents in an existing view with those\n * from persistence.\n */\nasync function synchronizeViewAndComputeSnapshot(\n syncEngine: SyncEngine,\n queryView: QueryView\n): Promise<ViewChange> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const queryResult = await localStoreExecuteQuery(\n syncEngineImpl.localStore,\n queryView.query,\n /* usePreviousResults= */ true\n );\n const viewSnapshot = queryView.view.synchronizeWithPersistedState(\n queryResult\n );\n if (syncEngineImpl.isPrimaryClient) {\n updateTrackedLimbos(\n syncEngineImpl,\n queryView.targetId,\n viewSnapshot.limboChanges\n );\n }\n return viewSnapshot;\n}\n\n/**\n * Retrieves newly changed documents from remote document cache and raises\n * snapshots if needed.\n */\n// PORTING NOTE: Multi-Tab only.\nexport async function syncEngineSynchronizeWithChangedDocuments(\n syncEngine: SyncEngine\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n\n return localStoreGetNewDocumentChanges(\n syncEngineImpl.localStore\n ).then(changes =>\n syncEngineEmitNewSnapsAndNotifyLocalStore(syncEngineImpl, changes)\n );\n}\n\n/** Applies a mutation state to an existing batch. */\n// PORTING NOTE: Multi-Tab only.\nexport async function syncEngineApplyBatchState(\n syncEngine: SyncEngine,\n batchId: BatchId,\n batchState: MutationBatchState,\n error?: FirestoreError\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const documents = await localStoreLookupMutationDocuments(\n syncEngineImpl.localStore,\n batchId\n );\n\n if (documents === null) {\n // A throttled tab may not have seen the mutation before it was completed\n // and removed from the mutation queue, in which case we won't have cached\n // the affected documents. In this case we can safely ignore the update\n // since that means we didn't apply the mutation locally at all (if we\n // had, we would have cached the affected documents), and so we will just\n // see any resulting document changes via normal remote document updates\n // as applicable.\n logDebug(LOG_TAG, 'Cannot apply mutation batch with id: ' + batchId);\n return;\n }\n\n if (batchState === 'pending') {\n // If we are the primary client, we need to send this write to the\n // backend. Secondary clients will ignore these writes since their remote\n // connection is disabled.\n await fillWritePipeline(syncEngineImpl.remoteStore);\n } else if (batchState === 'acknowledged' || batchState === 'rejected') {\n // NOTE: Both these methods are no-ops for batches that originated from\n // other clients.\n processUserCallback(syncEngineImpl, batchId, error ? error : null);\n triggerPendingWritesCallbacks(syncEngineImpl, batchId);\n localStoreRemoveCachedMutationBatchMetadata(\n syncEngineImpl.localStore,\n batchId\n );\n } else {\n fail(`Unknown batchState: ${batchState}`);\n }\n\n await syncEngineEmitNewSnapsAndNotifyLocalStore(syncEngineImpl, documents);\n}\n\n/** Applies a query target change from a different tab. */\n// PORTING NOTE: Multi-Tab only.\nexport async function syncEngineApplyPrimaryState(\n syncEngine: SyncEngine,\n isPrimary: boolean\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n ensureWatchCallbacks(syncEngineImpl);\n syncEngineEnsureWriteCallbacks(syncEngineImpl);\n if (isPrimary === true && syncEngineImpl._isPrimaryClient !== true) {\n // Secondary tabs only maintain Views for their local listeners and the\n // Views internal state may not be 100% populated (in particular\n // secondary tabs don't track syncedDocuments, the set of documents the\n // server considers to be in the target). So when a secondary becomes\n // primary, we need to need to make sure that all views for all targets\n // match the state on disk.\n const activeTargets = syncEngineImpl.sharedClientState.getAllActiveQueryTargets();\n const activeQueries = await synchronizeQueryViewsAndRaiseSnapshots(\n syncEngineImpl,\n activeTargets.toArray(),\n /*transitionToPrimary=*/ true\n );\n syncEngineImpl._isPrimaryClient = true;\n await remoteStoreApplyPrimaryState(syncEngineImpl.remoteStore, true);\n for (const targetData of activeQueries) {\n remoteStoreListen(syncEngineImpl.remoteStore, targetData);\n }\n } else if (isPrimary === false && syncEngineImpl._isPrimaryClient !== false) {\n const activeTargets: TargetId[] = [];\n\n let p = Promise.resolve();\n syncEngineImpl.queriesByTarget.forEach((_, targetId) => {\n if (syncEngineImpl.sharedClientState.isLocalQueryTarget(targetId)) {\n activeTargets.push(targetId);\n } else {\n p = p.then(() => {\n removeAndCleanupTarget(syncEngineImpl, targetId);\n return localStoreReleaseTarget(\n syncEngineImpl.localStore,\n targetId,\n /*keepPersistedTargetData=*/ true\n );\n });\n }\n remoteStoreUnlisten(syncEngineImpl.remoteStore, targetId);\n });\n await p;\n\n await synchronizeQueryViewsAndRaiseSnapshots(\n syncEngineImpl,\n activeTargets,\n /*transitionToPrimary=*/ false\n );\n resetLimboDocuments(syncEngineImpl);\n syncEngineImpl._isPrimaryClient = false;\n await remoteStoreApplyPrimaryState(syncEngineImpl.remoteStore, false);\n }\n}\n\n// PORTING NOTE: Multi-Tab only.\nfunction resetLimboDocuments(syncEngine: SyncEngine): void {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n syncEngineImpl.activeLimboResolutionsByTarget.forEach((_, targetId) => {\n remoteStoreUnlisten(syncEngineImpl.remoteStore, targetId);\n });\n syncEngineImpl.limboDocumentRefs.removeAllReferences();\n syncEngineImpl.activeLimboResolutionsByTarget = new Map<\n TargetId,\n LimboResolution\n >();\n syncEngineImpl.activeLimboTargetsByKey = new SortedMap<DocumentKey, TargetId>(\n DocumentKey.comparator\n );\n}\n\n/**\n * Reconcile the query views of the provided query targets with the state from\n * persistence. Raises snapshots for any changes that affect the local\n * client and returns the updated state of all target's query data.\n *\n * @param syncEngine - The sync engine implementation\n * @param targets - the list of targets with views that need to be recomputed\n * @param transitionToPrimary - `true` iff the tab transitions from a secondary\n * tab to a primary tab\n */\n// PORTING NOTE: Multi-Tab only.\nasync function synchronizeQueryViewsAndRaiseSnapshots(\n syncEngine: SyncEngine,\n targets: TargetId[],\n transitionToPrimary: boolean\n): Promise<TargetData[]> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const activeQueries: TargetData[] = [];\n const newViewSnapshots: ViewSnapshot[] = [];\n for (const targetId of targets) {\n let targetData: TargetData;\n const queries = syncEngineImpl.queriesByTarget.get(targetId);\n\n if (queries && queries.length !== 0) {\n // For queries that have a local View, we fetch their current state\n // from LocalStore (as the resume token and the snapshot version\n // might have changed) and reconcile their views with the persisted\n // state (the list of syncedDocuments may have gotten out of sync).\n targetData = await localStoreAllocateTarget(\n syncEngineImpl.localStore,\n queryToTarget(queries[0])\n );\n\n for (const query of queries) {\n const queryView = syncEngineImpl.queryViewsByQuery.get(query);\n debugAssert(\n !!queryView,\n `No query view found for ${stringifyQuery(query)}`\n );\n\n const viewChange = await synchronizeViewAndComputeSnapshot(\n syncEngineImpl,\n queryView\n );\n if (viewChange.snapshot) {\n newViewSnapshots.push(viewChange.snapshot);\n }\n }\n } else {\n debugAssert(\n transitionToPrimary,\n 'A secondary tab should never have an active view without an active target.'\n );\n // For queries that never executed on this client, we need to\n // allocate the target in LocalStore and initialize a new View.\n const target = await localStoreGetCachedTarget(\n syncEngineImpl.localStore,\n targetId\n );\n debugAssert(!!target, `Target for id ${targetId} not found`);\n targetData = await localStoreAllocateTarget(\n syncEngineImpl.localStore,\n target\n );\n await initializeViewAndComputeSnapshot(\n syncEngineImpl,\n synthesizeTargetToQuery(target!),\n targetId,\n /*current=*/ false\n );\n }\n\n activeQueries.push(targetData!);\n }\n\n syncEngineImpl.syncEngineListener.onWatchChange!(newViewSnapshots);\n return activeQueries;\n}\n\n/**\n * Creates a `Query` object from the specified `Target`. There is no way to\n * obtain the original `Query`, so we synthesize a `Query` from the `Target`\n * object.\n *\n * The synthesized result might be different from the original `Query`, but\n * since the synthesized `Query` should return the same results as the\n * original one (only the presentation of results might differ), the potential\n * difference will not cause issues.\n */\n// PORTING NOTE: Multi-Tab only.\nfunction synthesizeTargetToQuery(target: Target): Query {\n return newQuery(\n target.path,\n target.collectionGroup,\n target.orderBy,\n target.filters,\n target.limit,\n LimitType.First,\n target.startAt,\n target.endAt\n );\n}\n\n/** Returns the IDs of the clients that are currently active. */\n// PORTING NOTE: Multi-Tab only.\nexport function syncEngineGetActiveClients(\n syncEngine: SyncEngine\n): Promise<ClientId[]> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n return localStoreGetActiveClients(syncEngineImpl.localStore);\n}\n\n/** Applies a query target change from a different tab. */\n// PORTING NOTE: Multi-Tab only.\nexport async function syncEngineApplyTargetState(\n syncEngine: SyncEngine,\n targetId: TargetId,\n state: QueryTargetState,\n error?: FirestoreError\n): Promise<void> {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n if (syncEngineImpl._isPrimaryClient) {\n // If we receive a target state notification via WebStorage, we are\n // either already secondary or another tab has taken the primary lease.\n logDebug(LOG_TAG, 'Ignoring unexpected query state notification.');\n return;\n }\n\n if (syncEngineImpl.queriesByTarget.has(targetId)) {\n switch (state) {\n case 'current':\n case 'not-current': {\n const changes = await localStoreGetNewDocumentChanges(\n syncEngineImpl.localStore\n );\n const synthesizedRemoteEvent = RemoteEvent.createSynthesizedRemoteEventForCurrentChange(\n targetId,\n state === 'current'\n );\n await syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngineImpl,\n changes,\n synthesizedRemoteEvent\n );\n break;\n }\n case 'rejected': {\n await localStoreReleaseTarget(\n syncEngineImpl.localStore,\n targetId,\n /* keepPersistedTargetData */ true\n );\n removeAndCleanupTarget(syncEngineImpl, targetId, error);\n break;\n }\n default:\n fail('Unexpected target state: ' + state);\n }\n }\n}\n\n/** Adds or removes Watch targets for queries from different tabs. */\nexport async function syncEngineApplyActiveTargetsChange(\n syncEngine: SyncEngine,\n added: TargetId[],\n removed: TargetId[]\n): Promise<void> {\n const syncEngineImpl = ensureWatchCallbacks(syncEngine);\n if (!syncEngineImpl._isPrimaryClient) {\n return;\n }\n\n for (const targetId of added) {\n if (syncEngineImpl.queriesByTarget.has(targetId)) {\n // A target might have been added in a previous attempt\n logDebug(LOG_TAG, 'Adding an already active target ' + targetId);\n continue;\n }\n\n const target = await localStoreGetCachedTarget(\n syncEngineImpl.localStore,\n targetId\n );\n debugAssert(!!target, `Query data for active target ${targetId} not found`);\n const targetData = await localStoreAllocateTarget(\n syncEngineImpl.localStore,\n target\n );\n await initializeViewAndComputeSnapshot(\n syncEngineImpl,\n synthesizeTargetToQuery(target),\n targetData.targetId,\n /*current=*/ false\n );\n remoteStoreListen(syncEngineImpl.remoteStore, targetData);\n }\n\n for (const targetId of removed) {\n // Check that the target is still active since the target might have been\n // removed if it has been rejected by the backend.\n if (!syncEngineImpl.queriesByTarget.has(targetId)) {\n continue;\n }\n\n // Release queries that are still active.\n await localStoreReleaseTarget(\n syncEngineImpl.localStore,\n targetId,\n /* keepPersistedTargetData */ false\n )\n .then(() => {\n remoteStoreUnlisten(syncEngineImpl.remoteStore, targetId);\n removeAndCleanupTarget(syncEngineImpl, targetId);\n })\n .catch(ignoreIfPrimaryLeaseLoss);\n }\n}\n\nfunction ensureWatchCallbacks(syncEngine: SyncEngine): SyncEngineImpl {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n syncEngineImpl.remoteStore.remoteSyncer.applyRemoteEvent = syncEngineApplyRemoteEvent.bind(\n null,\n syncEngineImpl\n );\n syncEngineImpl.remoteStore.remoteSyncer.getRemoteKeysForTarget = syncEngineGetRemoteKeysForTarget.bind(\n null,\n syncEngineImpl\n );\n syncEngineImpl.remoteStore.remoteSyncer.rejectListen = syncEngineRejectListen.bind(\n null,\n syncEngineImpl\n );\n syncEngineImpl.syncEngineListener.onWatchChange = eventManagerOnWatchChange.bind(\n null,\n syncEngineImpl.eventManager\n );\n syncEngineImpl.syncEngineListener.onWatchError = eventManagerOnWatchError.bind(\n null,\n syncEngineImpl.eventManager\n );\n return syncEngineImpl;\n}\n\nexport function syncEngineEnsureWriteCallbacks(\n syncEngine: SyncEngine\n): SyncEngineImpl {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n syncEngineImpl.remoteStore.remoteSyncer.applySuccessfulWrite = syncEngineApplySuccessfulWrite.bind(\n null,\n syncEngineImpl\n );\n syncEngineImpl.remoteStore.remoteSyncer.rejectFailedWrite = syncEngineRejectFailedWrite.bind(\n null,\n syncEngineImpl\n );\n return syncEngineImpl;\n}\n\n/**\n * Loads a Firestore bundle into the SDK. The returned promise resolves when\n * the bundle finished loading.\n *\n * @param syncEngine - SyncEngine to use.\n * @param bundleReader - Bundle to load into the SDK.\n * @param task - LoadBundleTask used to update the loading progress to public API.\n */\nexport function syncEngineLoadBundle(\n syncEngine: SyncEngine,\n bundleReader: BundleReader,\n task: LoadBundleTask\n): void {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n loadBundleImpl(syncEngineImpl, bundleReader, task).then(() => {\n syncEngineImpl.sharedClientState.notifyBundleLoaded();\n });\n}\n\nasync function loadBundleImpl(\n syncEngine: SyncEngineImpl,\n reader: BundleReader,\n task: LoadBundleTask\n): Promise<void> {\n try {\n const metadata = await reader.getMetadata();\n const skip = await localStoreHasNewerBundle(\n syncEngine.localStore,\n metadata\n );\n if (skip) {\n await reader.close();\n task._completeWith(bundleSuccessProgress(metadata));\n return;\n }\n\n task._updateProgress(bundleInitialProgress(metadata));\n\n const loader = new BundleLoader(\n metadata,\n syncEngine.localStore,\n reader.serializer\n );\n let element = await reader.nextElement();\n while (element) {\n debugAssert(\n !element.payload.metadata,\n 'Unexpected BundleMetadata element.'\n );\n const progress = await loader.addSizedElement(element);\n if (progress) {\n task._updateProgress(progress);\n }\n\n element = await reader.nextElement();\n }\n\n const result = await loader.complete();\n // TODO(b/160876443): This currently raises snapshots with\n // `fromCache=false` if users already listen to some queries and bundles\n // has newer version.\n await syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngine,\n result.changedDocs,\n /* remoteEvent */ undefined\n );\n\n // Save metadata, so loading the same bundle will skip.\n await localStoreSaveBundle(syncEngine.localStore, metadata);\n task._completeWith(result.progress);\n } catch (e) {\n logWarn(LOG_TAG, `Loading bundle failed with ${e}`);\n task._failWith(e);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CredentialsProvider } from '../api/credentials';\nimport { User } from '../auth/user';\nimport {\n indexedDbStoragePrefix,\n IndexedDbPersistence\n} from '../local/indexeddb_persistence';\nimport { LocalStore } from '../local/local_store';\nimport {\n newLocalStore,\n localStoreSynchronizeLastDocumentChangeReadTime\n} from '../local/local_store_impl';\nimport { LruParams } from '../local/lru_garbage_collector';\nimport { LruScheduler } from '../local/lru_garbage_collector_impl';\nimport {\n MemoryEagerDelegate,\n MemoryPersistence\n} from '../local/memory_persistence';\nimport { GarbageCollectionScheduler, Persistence } from '../local/persistence';\nimport { QueryEngine } from '../local/query_engine';\nimport {\n ClientId,\n MemorySharedClientState,\n SharedClientState,\n WebStorageSharedClientState\n} from '../local/shared_client_state';\nimport { newConnection, newConnectivityMonitor } from '../platform/connection';\nimport { getDocument, getWindow } from '../platform/dom';\nimport { newSerializer } from '../platform/serializer';\nimport { Datastore, newDatastore } from '../remote/datastore';\nimport {\n fillWritePipeline,\n newRemoteStore,\n RemoteStore,\n remoteStoreApplyPrimaryState,\n remoteStoreShutdown\n} from '../remote/remote_store';\nimport { JsonProtoSerializer } from '../remote/serializer';\nimport { AsyncQueue } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\n\nimport { DatabaseInfo } from './database_info';\nimport { EventManager, newEventManager } from './event_manager';\nimport { SyncEngine } from './sync_engine';\nimport {\n newSyncEngine,\n syncEngineApplyActiveTargetsChange,\n syncEngineApplyBatchState,\n syncEngineApplyOnlineStateChange,\n syncEngineApplyPrimaryState,\n syncEngineApplyTargetState,\n syncEngineEnsureWriteCallbacks,\n syncEngineGetActiveClients,\n syncEngineHandleCredentialChange,\n syncEngineSynchronizeWithChangedDocuments\n} from './sync_engine_impl';\nimport { OnlineStateSource } from './types';\n\nexport interface ComponentConfiguration {\n asyncQueue: AsyncQueue;\n databaseInfo: DatabaseInfo;\n credentials: CredentialsProvider;\n clientId: ClientId;\n initialUser: User;\n maxConcurrentLimboResolutions: number;\n}\n\n/**\n * Initializes and wires components that are needed to interface with the local\n * cache. Implementations override `initialize()` to provide all components.\n */\nexport interface OfflineComponentProvider {\n persistence: Persistence;\n sharedClientState: SharedClientState;\n localStore: LocalStore;\n gcScheduler: GarbageCollectionScheduler | null;\n synchronizeTabs: boolean;\n\n initialize(cfg: ComponentConfiguration): Promise<void>;\n\n terminate(): Promise<void>;\n}\n\n/**\n * Provides all components needed for Firestore with in-memory persistence.\n * Uses EagerGC garbage collection.\n */\nexport class MemoryOfflineComponentProvider\n implements OfflineComponentProvider {\n persistence!: Persistence;\n sharedClientState!: SharedClientState;\n localStore!: LocalStore;\n gcScheduler!: GarbageCollectionScheduler | null;\n synchronizeTabs = false;\n\n serializer!: JsonProtoSerializer;\n\n async initialize(cfg: ComponentConfiguration): Promise<void> {\n this.serializer = newSerializer(cfg.databaseInfo.databaseId);\n this.sharedClientState = this.createSharedClientState(cfg);\n this.persistence = this.createPersistence(cfg);\n await this.persistence.start();\n this.gcScheduler = this.createGarbageCollectionScheduler(cfg);\n this.localStore = this.createLocalStore(cfg);\n }\n\n createGarbageCollectionScheduler(\n cfg: ComponentConfiguration\n ): GarbageCollectionScheduler | null {\n return null;\n }\n\n createLocalStore(cfg: ComponentConfiguration): LocalStore {\n return newLocalStore(\n this.persistence,\n new QueryEngine(),\n cfg.initialUser,\n this.serializer\n );\n }\n\n createPersistence(cfg: ComponentConfiguration): Persistence {\n return new MemoryPersistence(MemoryEagerDelegate.factory, this.serializer);\n }\n\n createSharedClientState(cfg: ComponentConfiguration): SharedClientState {\n return new MemorySharedClientState();\n }\n\n async terminate(): Promise<void> {\n if (this.gcScheduler) {\n this.gcScheduler.stop();\n }\n await this.sharedClientState.shutdown();\n await this.persistence.shutdown();\n }\n}\n\n/**\n * Provides all components needed for Firestore with IndexedDB persistence.\n */\nexport class IndexedDbOfflineComponentProvider extends MemoryOfflineComponentProvider {\n persistence!: IndexedDbPersistence;\n sharedClientState!: SharedClientState;\n localStore!: LocalStore;\n gcScheduler!: GarbageCollectionScheduler | null;\n synchronizeTabs = false;\n\n constructor(\n protected readonly onlineComponentProvider: OnlineComponentProvider,\n protected readonly cacheSizeBytes: number | undefined,\n protected readonly forceOwnership: boolean | undefined\n ) {\n super();\n }\n\n async initialize(cfg: ComponentConfiguration): Promise<void> {\n await super.initialize(cfg);\n await localStoreSynchronizeLastDocumentChangeReadTime(this.localStore);\n\n await this.onlineComponentProvider.initialize(this, cfg);\n\n // Enqueue writes from a previous session\n await syncEngineEnsureWriteCallbacks(\n this.onlineComponentProvider.syncEngine\n );\n await fillWritePipeline(this.onlineComponentProvider.remoteStore);\n }\n\n createLocalStore(cfg: ComponentConfiguration): LocalStore {\n return newLocalStore(\n this.persistence,\n new QueryEngine(),\n cfg.initialUser,\n this.serializer\n );\n }\n\n createGarbageCollectionScheduler(\n cfg: ComponentConfiguration\n ): GarbageCollectionScheduler | null {\n const garbageCollector = this.persistence.referenceDelegate\n .garbageCollector;\n return new LruScheduler(garbageCollector, cfg.asyncQueue);\n }\n\n createPersistence(cfg: ComponentConfiguration): IndexedDbPersistence {\n const persistenceKey = indexedDbStoragePrefix(\n cfg.databaseInfo.databaseId,\n cfg.databaseInfo.persistenceKey\n );\n const lruParams =\n this.cacheSizeBytes !== undefined\n ? LruParams.withCacheSize(this.cacheSizeBytes)\n : LruParams.DEFAULT;\n\n return new IndexedDbPersistence(\n this.synchronizeTabs,\n persistenceKey,\n cfg.clientId,\n lruParams,\n cfg.asyncQueue,\n getWindow(),\n getDocument(),\n this.serializer,\n this.sharedClientState,\n !!this.forceOwnership\n );\n }\n\n createSharedClientState(cfg: ComponentConfiguration): SharedClientState {\n return new MemorySharedClientState();\n }\n}\n\n/**\n * Provides all components needed for Firestore with multi-tab IndexedDB\n * persistence.\n *\n * In the legacy client, this provider is used to provide both multi-tab and\n * non-multi-tab persistence since we cannot tell at build time whether\n * `synchronizeTabs` will be enabled.\n */\nexport class MultiTabOfflineComponentProvider extends IndexedDbOfflineComponentProvider {\n synchronizeTabs = true;\n\n constructor(\n protected readonly onlineComponentProvider: OnlineComponentProvider,\n protected readonly cacheSizeBytes: number | undefined\n ) {\n super(onlineComponentProvider, cacheSizeBytes, /* forceOwnership= */ false);\n }\n\n async initialize(cfg: ComponentConfiguration): Promise<void> {\n await super.initialize(cfg);\n\n const syncEngine = this.onlineComponentProvider.syncEngine;\n\n if (this.sharedClientState instanceof WebStorageSharedClientState) {\n this.sharedClientState.syncEngine = {\n applyBatchState: syncEngineApplyBatchState.bind(null, syncEngine),\n applyTargetState: syncEngineApplyTargetState.bind(null, syncEngine),\n applyActiveTargetsChange: syncEngineApplyActiveTargetsChange.bind(\n null,\n syncEngine\n ),\n getActiveClients: syncEngineGetActiveClients.bind(null, syncEngine),\n synchronizeWithChangedDocuments: syncEngineSynchronizeWithChangedDocuments.bind(\n null,\n syncEngine\n )\n };\n await this.sharedClientState.start();\n }\n\n // NOTE: This will immediately call the listener, so we make sure to\n // set it after localStore / remoteStore are started.\n await this.persistence.setPrimaryStateListener(async isPrimary => {\n await syncEngineApplyPrimaryState(\n this.onlineComponentProvider.syncEngine,\n isPrimary\n );\n if (this.gcScheduler) {\n if (isPrimary && !this.gcScheduler.started) {\n this.gcScheduler.start(this.localStore);\n } else if (!isPrimary) {\n this.gcScheduler.stop();\n }\n }\n });\n }\n\n createSharedClientState(cfg: ComponentConfiguration): SharedClientState {\n const window = getWindow();\n if (!WebStorageSharedClientState.isAvailable(window)) {\n throw new FirestoreError(\n Code.UNIMPLEMENTED,\n 'IndexedDB persistence is only available on platforms that support LocalStorage.'\n );\n }\n const persistenceKey = indexedDbStoragePrefix(\n cfg.databaseInfo.databaseId,\n cfg.databaseInfo.persistenceKey\n );\n return new WebStorageSharedClientState(\n window,\n cfg.asyncQueue,\n persistenceKey,\n cfg.clientId,\n cfg.initialUser\n );\n }\n}\n\n/**\n * Initializes and wires the components that are needed to interface with the\n * network.\n */\nexport class OnlineComponentProvider {\n protected localStore!: LocalStore;\n protected sharedClientState!: SharedClientState;\n datastore!: Datastore;\n eventManager!: EventManager;\n remoteStore!: RemoteStore;\n syncEngine!: SyncEngine;\n\n async initialize(\n offlineComponentProvider: OfflineComponentProvider,\n cfg: ComponentConfiguration\n ): Promise<void> {\n if (this.localStore) {\n // OnlineComponentProvider may get initialized multiple times if\n // multi-tab persistence is used.\n return;\n }\n\n this.localStore = offlineComponentProvider.localStore;\n this.sharedClientState = offlineComponentProvider.sharedClientState;\n this.datastore = this.createDatastore(cfg);\n this.remoteStore = this.createRemoteStore(cfg);\n this.eventManager = this.createEventManager(cfg);\n this.syncEngine = this.createSyncEngine(\n cfg,\n /* startAsPrimary=*/ !offlineComponentProvider.synchronizeTabs\n );\n\n this.sharedClientState.onlineStateHandler = onlineState =>\n syncEngineApplyOnlineStateChange(\n this.syncEngine,\n onlineState,\n OnlineStateSource.SharedClientState\n );\n\n this.remoteStore.remoteSyncer.handleCredentialChange = syncEngineHandleCredentialChange.bind(\n null,\n this.syncEngine\n );\n\n await remoteStoreApplyPrimaryState(\n this.remoteStore,\n this.syncEngine.isPrimaryClient\n );\n }\n\n createEventManager(cfg: ComponentConfiguration): EventManager {\n return newEventManager();\n }\n\n createDatastore(cfg: ComponentConfiguration): Datastore {\n const serializer = newSerializer(cfg.databaseInfo.databaseId);\n const connection = newConnection(cfg.databaseInfo);\n return newDatastore(cfg.credentials, connection, serializer);\n }\n\n createRemoteStore(cfg: ComponentConfiguration): RemoteStore {\n return newRemoteStore(\n this.localStore,\n this.datastore,\n cfg.asyncQueue,\n onlineState =>\n syncEngineApplyOnlineStateChange(\n this.syncEngine,\n onlineState,\n OnlineStateSource.RemoteStore\n ),\n newConnectivityMonitor()\n );\n }\n\n createSyncEngine(\n cfg: ComponentConfiguration,\n startAsPrimary: boolean\n ): SyncEngine {\n return newSyncEngine(\n this.localStore,\n this.remoteStore,\n this.eventManager,\n this.sharedClientState,\n cfg.initialUser,\n cfg.maxConcurrentLimboResolutions,\n startAsPrimary\n );\n }\n\n terminate(): Promise<void> {\n return remoteStoreShutdown(this.remoteStore);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseInfo } from '../../core/database_info';\nimport { Connection } from '../../remote/connection';\nimport { ConnectivityMonitor } from '../../remote/connectivity_monitor';\nimport { NoopConnectivityMonitor } from '../../remote/connectivity_monitor_noop';\n\nimport { BrowserConnectivityMonitor } from './connectivity_monitor';\nimport { WebChannelConnection } from './webchannel_connection';\n\n/** Initializes the WebChannelConnection for the browser. */\nexport function newConnection(databaseInfo: DatabaseInfo): Connection {\n return new WebChannelConnection(databaseInfo);\n}\n\n/** Return the Platform-specific connectivity monitor. */\nexport function newConnectivityMonitor(): ConnectivityMonitor {\n if (BrowserConnectivityMonitor.isAvailable()) {\n return new BrowserConnectivityMonitor();\n } else {\n return new NoopConnectivityMonitor();\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from './assert';\n\n/**\n * How many bytes to read each time when `ReadableStreamReader.read()` is\n * called. Only applicable for byte streams that we control (e.g. those backed\n * by an UInt8Array).\n */\nexport const DEFAULT_BYTES_PER_READ = 10240;\n\n/**\n * Builds a `ByteStreamReader` from a UInt8Array.\n * @param source - The data source to use.\n * @param bytesPerRead - How many bytes each `read()` from the returned reader\n * will read.\n */\nexport function toByteStreamReaderHelper(\n source: Uint8Array,\n bytesPerRead: number = DEFAULT_BYTES_PER_READ\n): ReadableStreamReader<Uint8Array> {\n debugAssert(\n bytesPerRead > 0,\n `toByteStreamReader expects positive bytesPerRead, but got ${bytesPerRead}`\n );\n let readFrom = 0;\n const reader: ReadableStreamReader<Uint8Array> = {\n async read(): Promise<ReadableStreamDefaultReadResult<Uint8Array>> {\n if (readFrom < source.byteLength) {\n const result = {\n value: source.slice(readFrom, readFrom + bytesPerRead),\n done: false\n } as const;\n readFrom += bytesPerRead;\n return result;\n }\n\n return { done: true };\n },\n async cancel(): Promise<void> {},\n releaseLock() {},\n closed: Promise.reject('unimplemented')\n };\n return reader;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Observer } from '../core/event_manager';\n\nimport { FirestoreError } from './error';\nimport { EventHandler } from './misc';\n\n/*\n * A wrapper implementation of Observer<T> that will dispatch events\n * asynchronously. To allow immediate silencing, a mute call is added which\n * causes events scheduled to no longer be raised.\n */\nexport class AsyncObserver<T> implements Observer<T> {\n /**\n * When set to true, will not raise future events. Necessary to deal with\n * async detachment of listener.\n */\n private muted = false;\n\n constructor(private observer: Partial<Observer<T>>) {}\n\n next(value: T): void {\n if (this.observer.next) {\n this.scheduleEvent(this.observer.next, value);\n }\n }\n\n error(error: FirestoreError): void {\n if (this.observer.error) {\n this.scheduleEvent(this.observer.error, error);\n } else {\n console.error('Uncaught Error in snapshot listener:', error);\n }\n }\n\n mute(): void {\n this.muted = true;\n }\n\n private scheduleEvent<E>(eventHandler: EventHandler<E>, event: E): void {\n if (!this.muted) {\n setTimeout(() => {\n if (!this.muted) {\n eventHandler(event);\n }\n }, 0);\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { newTextDecoder } from '../platform/serializer';\nimport { BundleMetadata } from '../protos/firestore_bundle_proto';\nimport { JsonProtoSerializer } from '../remote/serializer';\n\nimport { debugAssert } from './assert';\nimport { BundleReader, SizedBundleElement } from './bundle_reader';\nimport { Deferred } from './promise';\n\n/**\n * A class representing a bundle.\n *\n * Takes a bundle stream or buffer, and presents abstractions to read bundled\n * elements out of the underlying content.\n */\nclass BundleReaderImpl implements BundleReader {\n /** Cached bundle metadata. */\n private metadata: Deferred<BundleMetadata> = new Deferred<BundleMetadata>();\n /**\n * Internal buffer to hold bundle content, accumulating incomplete element\n * content.\n */\n private buffer: Uint8Array = new Uint8Array();\n /** The decoder used to parse binary data into strings. */\n private textDecoder: TextDecoder;\n\n constructor(\n /** The reader to read from underlying binary bundle data source. */\n private reader: ReadableStreamReader<Uint8Array>,\n readonly serializer: JsonProtoSerializer\n ) {\n this.textDecoder = newTextDecoder();\n // Read the metadata (which is the first element).\n this.nextElementImpl().then(\n element => {\n if (element && element.isBundleMetadata()) {\n this.metadata.resolve(element.payload.metadata!);\n } else {\n this.metadata.reject(\n new Error(`The first element of the bundle is not a metadata, it is\n ${JSON.stringify(element?.payload)}`)\n );\n }\n },\n error => this.metadata.reject(error)\n );\n }\n\n close(): Promise<void> {\n return this.reader.cancel();\n }\n\n async getMetadata(): Promise<BundleMetadata> {\n return this.metadata.promise;\n }\n\n async nextElement(): Promise<SizedBundleElement | null> {\n // Makes sure metadata is read before proceeding.\n await this.getMetadata();\n return this.nextElementImpl();\n }\n\n /**\n * Reads from the head of internal buffer, and pulling more data from\n * underlying stream if a complete element cannot be found, until an\n * element(including the prefixed length and the JSON string) is found.\n *\n * Once a complete element is read, it is dropped from internal buffer.\n *\n * Returns either the bundled element, or null if we have reached the end of\n * the stream.\n */\n private async nextElementImpl(): Promise<SizedBundleElement | null> {\n const lengthBuffer = await this.readLength();\n if (lengthBuffer === null) {\n return null;\n }\n\n const lengthString = this.textDecoder.decode(lengthBuffer);\n const length = Number(lengthString);\n if (isNaN(length)) {\n this.raiseError(`length string (${lengthString}) is not valid number`);\n }\n\n const jsonString = await this.readJsonString(length);\n\n return new SizedBundleElement(\n JSON.parse(jsonString),\n lengthBuffer.length + length\n );\n }\n\n /** First index of '{' from the underlying buffer. */\n private indexOfOpenBracket(): number {\n return this.buffer.findIndex(v => v === '{'.charCodeAt(0));\n }\n\n /**\n * Reads from the beginning of the internal buffer, until the first '{', and\n * return the content.\n *\n * If reached end of the stream, returns a null.\n */\n private async readLength(): Promise<Uint8Array | null> {\n while (this.indexOfOpenBracket() < 0) {\n const done = await this.pullMoreDataToBuffer();\n if (done) {\n break;\n }\n }\n\n // Broke out of the loop because underlying stream is closed, and there\n // happens to be no more data to process.\n if (this.buffer.length === 0) {\n return null;\n }\n\n const position = this.indexOfOpenBracket();\n // Broke out of the loop because underlying stream is closed, but still\n // cannot find an open bracket.\n if (position < 0) {\n this.raiseError(\n 'Reached the end of bundle when a length string is expected.'\n );\n }\n\n const result = this.buffer.slice(0, position);\n // Update the internal buffer to drop the read length.\n this.buffer = this.buffer.slice(position);\n return result;\n }\n\n /**\n * Reads from a specified position from the internal buffer, for a specified\n * number of bytes, pulling more data from the underlying stream if needed.\n *\n * Returns a string decoded from the read bytes.\n */\n private async readJsonString(length: number): Promise<string> {\n while (this.buffer.length < length) {\n const done = await this.pullMoreDataToBuffer();\n if (done) {\n this.raiseError('Reached the end of bundle when more is expected.');\n }\n }\n\n const result = this.textDecoder.decode(this.buffer.slice(0, length));\n // Update the internal buffer to drop the read json string.\n this.buffer = this.buffer.slice(length);\n return result;\n }\n\n private raiseError(message: string): void {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.reader.cancel();\n throw new Error(`Invalid bundle format: ${message}`);\n }\n\n /**\n * Pulls more data from underlying stream to internal buffer.\n * Returns a boolean indicating whether the stream is finished.\n */\n private async pullMoreDataToBuffer(): Promise<boolean> {\n const result = await this.reader.read();\n if (!result.done) {\n debugAssert(!!result.value, 'Read undefined when \"done\" is false.');\n const newBuffer = new Uint8Array(\n this.buffer.length + result.value!.length\n );\n newBuffer.set(this.buffer);\n newBuffer.set(result.value!, this.buffer.length);\n this.buffer = newBuffer;\n }\n return result.done;\n }\n}\n\nexport function newBundleReader(\n reader: ReadableStreamReader<Uint8Array>,\n serializer: JsonProtoSerializer\n): BundleReader {\n return new BundleReaderImpl(reader, serializer);\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ParsedSetData, ParsedUpdateData } from '../lite/user_data_reader';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport {\n DeleteMutation,\n Mutation,\n Precondition,\n VerifyMutation\n} from '../model/mutation';\nimport {\n Datastore,\n invokeBatchGetDocumentsRpc,\n invokeCommitRpc\n} from '../remote/datastore';\nimport { fail, debugAssert } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\n\nimport { SnapshotVersion } from './snapshot_version';\n\n/**\n * Internal transaction object responsible for accumulating the mutations to\n * perform and the base versions for any documents read.\n */\nexport class Transaction {\n // The version of each document that was read during this transaction.\n private readVersions = new Map</* path */ string, SnapshotVersion>();\n private mutations: Mutation[] = [];\n private committed = false;\n\n /**\n * A deferred usage error that occurred previously in this transaction that\n * will cause the transaction to fail once it actually commits.\n */\n private lastWriteError: FirestoreError | null = null;\n\n /**\n * Set of documents that have been written in the transaction.\n *\n * When there's more than one write to the same key in a transaction, any\n * writes after the first are handled differently.\n */\n private writtenDocs: Set</* path= */ string> = new Set();\n\n constructor(private datastore: Datastore) {}\n\n async lookup(keys: DocumentKey[]): Promise<Document[]> {\n this.ensureCommitNotCalled();\n\n if (this.mutations.length > 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Firestore transactions require all reads to be executed before all writes.'\n );\n }\n const docs = await invokeBatchGetDocumentsRpc(this.datastore, keys);\n docs.forEach(doc => this.recordVersion(doc));\n return docs;\n }\n\n set(key: DocumentKey, data: ParsedSetData): void {\n this.write(data.toMutation(key, this.precondition(key)));\n this.writtenDocs.add(key.toString());\n }\n\n update(key: DocumentKey, data: ParsedUpdateData): void {\n try {\n this.write(data.toMutation(key, this.preconditionForUpdate(key)));\n } catch (e) {\n this.lastWriteError = e;\n }\n this.writtenDocs.add(key.toString());\n }\n\n delete(key: DocumentKey): void {\n this.write(new DeleteMutation(key, this.precondition(key)));\n this.writtenDocs.add(key.toString());\n }\n\n async commit(): Promise<void> {\n this.ensureCommitNotCalled();\n\n if (this.lastWriteError) {\n throw this.lastWriteError;\n }\n const unwritten = this.readVersions;\n // For each mutation, note that the doc was written.\n this.mutations.forEach(mutation => {\n unwritten.delete(mutation.key.toString());\n });\n // For each document that was read but not written to, we want to perform\n // a `verify` operation.\n unwritten.forEach((_, path) => {\n const key = DocumentKey.fromPath(path);\n this.mutations.push(new VerifyMutation(key, this.precondition(key)));\n });\n await invokeCommitRpc(this.datastore, this.mutations);\n this.committed = true;\n }\n\n private recordVersion(doc: Document): void {\n let docVersion: SnapshotVersion;\n\n if (doc.isFoundDocument()) {\n docVersion = doc.version;\n } else if (doc.isNoDocument()) {\n // For deleted docs, we must use baseVersion 0 when we overwrite them.\n docVersion = SnapshotVersion.min();\n } else {\n throw fail('Document in a transaction was a ' + doc.constructor.name);\n }\n\n const existingVersion = this.readVersions.get(doc.key.toString());\n if (existingVersion) {\n if (!docVersion.isEqual(existingVersion)) {\n // This transaction will fail no matter what.\n throw new FirestoreError(\n Code.ABORTED,\n 'Document version changed between two reads.'\n );\n }\n } else {\n this.readVersions.set(doc.key.toString(), docVersion);\n }\n }\n\n /**\n * Returns the version of this document when it was read in this transaction,\n * as a precondition, or no precondition if it was not read.\n */\n private precondition(key: DocumentKey): Precondition {\n const version = this.readVersions.get(key.toString());\n if (!this.writtenDocs.has(key.toString()) && version) {\n return Precondition.updateTime(version);\n } else {\n return Precondition.none();\n }\n }\n\n /**\n * Returns the precondition for a document if the operation is an update.\n */\n private preconditionForUpdate(key: DocumentKey): Precondition {\n const version = this.readVersions.get(key.toString());\n // The first time a document is written, we want to take into account the\n // read time and existence\n if (!this.writtenDocs.has(key.toString()) && version) {\n if (version.isEqual(SnapshotVersion.min())) {\n // The document doesn't exist, so fail the transaction.\n\n // This has to be validated locally because you can't send a\n // precondition that a document does not exist without changing the\n // semantics of the backend write to be an insert. This is the reverse\n // of what we want, since we want to assert that the document doesn't\n // exist but then send the update and have it fail. Since we can't\n // express that to the backend, we have to validate locally.\n\n // Note: this can change once we can send separate verify writes in the\n // transaction.\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n \"Can't update a document that doesn't exist.\"\n );\n }\n // Document exists, base precondition on document update time.\n return Precondition.updateTime(version);\n } else {\n // Document was not read, so we just use the preconditions for a blind\n // update.\n return Precondition.exists(true);\n }\n }\n\n private write(mutation: Mutation): void {\n this.ensureCommitNotCalled();\n this.mutations.push(mutation);\n }\n\n private ensureCommitNotCalled(): void {\n debugAssert(\n !this.committed,\n 'A transaction object cannot be used after its update callback has been invoked.'\n );\n }\n}\n", "/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ExponentialBackoff } from '../remote/backoff';\nimport { Datastore } from '../remote/datastore';\nimport { isPermanentError } from '../remote/rpc_error';\nimport { AsyncQueue, TimerId } from '../util/async_queue';\nimport { FirestoreError } from '../util/error';\nimport { Deferred } from '../util/promise';\nimport { isNullOrUndefined } from '../util/types';\n\nimport { Transaction } from './transaction';\n\nexport const DEFAULT_MAX_ATTEMPTS_COUNT = 5;\n\n/**\n * TransactionRunner encapsulates the logic needed to run and retry transactions\n * with backoff.\n */\nexport class TransactionRunner<T> {\n private attemptsRemaining = DEFAULT_MAX_ATTEMPTS_COUNT;\n private backoff: ExponentialBackoff;\n\n constructor(\n private readonly asyncQueue: AsyncQueue,\n private readonly datastore: Datastore,\n private readonly updateFunction: (transaction: Transaction) => Promise<T>,\n private readonly deferred: Deferred<T>\n ) {\n this.backoff = new ExponentialBackoff(\n this.asyncQueue,\n TimerId.TransactionRetry\n );\n }\n\n /** Runs the transaction and sets the result on deferred. */\n run(): void {\n this.attemptsRemaining -= 1;\n this.runWithBackOff();\n }\n\n private runWithBackOff(): void {\n this.backoff.backoffAndRun(async () => {\n const transaction = new Transaction(this.datastore);\n const userPromise = this.tryRunUpdateFunction(transaction);\n if (userPromise) {\n userPromise\n .then(result => {\n this.asyncQueue.enqueueAndForget(() => {\n return transaction\n .commit()\n .then(() => {\n this.deferred.resolve(result);\n })\n .catch(commitError => {\n this.handleTransactionError(commitError);\n });\n });\n })\n .catch(userPromiseError => {\n this.handleTransactionError(userPromiseError);\n });\n }\n });\n }\n\n private tryRunUpdateFunction(transaction: Transaction): Promise<T> | null {\n try {\n const userPromise = this.updateFunction(transaction);\n if (\n isNullOrUndefined(userPromise) ||\n !userPromise.catch ||\n !userPromise.then\n ) {\n this.deferred.reject(\n Error('Transaction callback must return a Promise')\n );\n return null;\n }\n return userPromise;\n } catch (error) {\n // Do not retry errors thrown by user provided updateFunction.\n this.deferred.reject(error);\n return null;\n }\n }\n\n private handleTransactionError(error: Error): void {\n if (this.attemptsRemaining > 0 && this.isRetryableTransactionError(error)) {\n this.attemptsRemaining -= 1;\n this.asyncQueue.enqueueAndForget(() => {\n this.runWithBackOff();\n return Promise.resolve();\n });\n } else {\n this.deferred.reject(error);\n }\n }\n\n private isRetryableTransactionError(error: Error): boolean {\n if (error.name === 'FirebaseError') {\n // In transactions, the backend will fail outdated reads with FAILED_PRECONDITION and\n // non-matching document versions with ABORTED. These errors should be retried.\n const code = (error as FirestoreError).code;\n return (\n code === 'aborted' ||\n code === 'failed-precondition' ||\n !isPermanentError(code)\n );\n }\n return false;\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GetOptions } from '@firebase/firestore-types';\n\nimport {\n CredentialChangeListener,\n CredentialsProvider\n} from '../api/credentials';\nimport { User } from '../auth/user';\nimport { LoadBundleTask } from '../exp/bundle';\nimport { LocalStore } from '../local/local_store';\nimport {\n localStoreExecuteQuery,\n localStoreGetNamedQuery,\n localStoreHandleUserChange,\n localStoreReadDocument\n} from '../local/local_store_impl';\nimport { Persistence } from '../local/persistence';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { Mutation } from '../model/mutation';\nimport { toByteStreamReader } from '../platform/byte_stream_reader';\nimport { newSerializer, newTextEncoder } from '../platform/serializer';\nimport { Datastore } from '../remote/datastore';\nimport {\n RemoteStore,\n remoteStoreDisableNetwork,\n remoteStoreEnableNetwork,\n remoteStoreHandleCredentialChange\n} from '../remote/remote_store';\nimport { JsonProtoSerializer } from '../remote/serializer';\nimport { debugAssert } from '../util/assert';\nimport { AsyncObserver } from '../util/async_observer';\nimport { AsyncQueue, wrapInUserErrorIfRecoverable } from '../util/async_queue';\nimport { BundleReader } from '../util/bundle_reader';\nimport { newBundleReader } from '../util/bundle_reader_impl';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug } from '../util/log';\nimport { AutoId } from '../util/misc';\nimport { Deferred } from '../util/promise';\n\nimport { NamedQuery } from './bundle';\nimport {\n ComponentConfiguration,\n MemoryOfflineComponentProvider,\n OfflineComponentProvider,\n OnlineComponentProvider\n} from './component_provider';\nimport { DatabaseId, DatabaseInfo } from './database_info';\nimport {\n addSnapshotsInSyncListener,\n EventManager,\n eventManagerListen,\n eventManagerUnlisten,\n ListenOptions,\n Observer,\n QueryListener,\n removeSnapshotsInSyncListener\n} from './event_manager';\nimport { newQueryForPath, Query } from './query';\nimport { SyncEngine } from './sync_engine';\nimport {\n syncEngineRegisterPendingWritesCallback,\n syncEngineListen,\n syncEngineLoadBundle,\n syncEngineUnlisten,\n syncEngineWrite\n} from './sync_engine_impl';\nimport { Transaction } from './transaction';\nimport { TransactionRunner } from './transaction_runner';\nimport { View } from './view';\nimport { ViewSnapshot } from './view_snapshot';\n\nconst LOG_TAG = 'FirestoreClient';\nexport const MAX_CONCURRENT_LIMBO_RESOLUTIONS = 100;\n\n/**\n * FirestoreClient is a top-level class that constructs and owns all of the\n * pieces of the client SDK architecture. It is responsible for creating the\n * async queue that is shared by all of the other components in the system.\n */\nexport class FirestoreClient {\n private user = User.UNAUTHENTICATED;\n private readonly clientId = AutoId.newId();\n private credentialListener: CredentialChangeListener = () =>\n Promise.resolve();\n\n offlineComponents?: OfflineComponentProvider;\n onlineComponents?: OnlineComponentProvider;\n\n constructor(\n private credentials: CredentialsProvider,\n /**\n * Asynchronous queue responsible for all of our internal processing. When\n * we get incoming work from the user (via public API) or the network\n * (incoming GRPC messages), we should always schedule onto this queue.\n * This ensures all of our work is properly serialized (e.g. we don't\n * start processing a new operation while the previous one is waiting for\n * an async I/O to complete).\n */\n public asyncQueue: AsyncQueue,\n private databaseInfo: DatabaseInfo\n ) {\n this.credentials.setChangeListener(asyncQueue, async user => {\n logDebug(LOG_TAG, 'Received user=', user.uid);\n await this.credentialListener(user);\n this.user = user;\n });\n }\n\n async getConfiguration(): Promise<ComponentConfiguration> {\n return {\n asyncQueue: this.asyncQueue,\n databaseInfo: this.databaseInfo,\n clientId: this.clientId,\n credentials: this.credentials,\n initialUser: this.user,\n maxConcurrentLimboResolutions: MAX_CONCURRENT_LIMBO_RESOLUTIONS\n };\n }\n\n setCredentialChangeListener(listener: (user: User) => Promise<void>): void {\n this.credentialListener = listener;\n }\n\n /**\n * Checks that the client has not been terminated. Ensures that other methods on\n * this class cannot be called after the client is terminated.\n */\n verifyNotTerminated(): void {\n if (this.asyncQueue.isShuttingDown) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'The client has already been terminated.'\n );\n }\n }\n\n terminate(): Promise<void> {\n this.asyncQueue.enterRestrictedMode();\n const deferred = new Deferred();\n this.asyncQueue.enqueueAndForgetEvenWhileRestricted(async () => {\n try {\n if (this.onlineComponents) {\n await this.onlineComponents.terminate();\n }\n if (this.offlineComponents) {\n await this.offlineComponents.terminate();\n }\n\n // `removeChangeListener` must be called after shutting down the\n // RemoteStore as it will prevent the RemoteStore from retrieving\n // auth tokens.\n this.credentials.removeChangeListener();\n deferred.resolve();\n } catch (e) {\n const firestoreError = wrapInUserErrorIfRecoverable(\n e,\n `Failed to shutdown persistence`\n );\n deferred.reject(firestoreError);\n }\n });\n return deferred.promise;\n }\n}\n\nexport async function setOfflineComponentProvider(\n client: FirestoreClient,\n offlineComponentProvider: OfflineComponentProvider\n): Promise<void> {\n client.asyncQueue.verifyOperationInProgress();\n\n logDebug(LOG_TAG, 'Initializing OfflineComponentProvider');\n const configuration = await client.getConfiguration();\n await offlineComponentProvider.initialize(configuration);\n\n let currentUser = configuration.initialUser;\n client.setCredentialChangeListener(async user => {\n if (!currentUser.isEqual(user)) {\n await localStoreHandleUserChange(\n offlineComponentProvider.localStore,\n user\n );\n currentUser = user;\n }\n });\n\n // When a user calls clearPersistence() in one client, all other clients\n // need to be terminated to allow the delete to succeed.\n offlineComponentProvider.persistence.setDatabaseDeletedListener(() =>\n client.terminate()\n );\n\n client.offlineComponents = offlineComponentProvider;\n}\n\nexport async function setOnlineComponentProvider(\n client: FirestoreClient,\n onlineComponentProvider: OnlineComponentProvider\n): Promise<void> {\n client.asyncQueue.verifyOperationInProgress();\n\n const offlineComponentProvider = await ensureOfflineComponents(client);\n\n logDebug(LOG_TAG, 'Initializing OnlineComponentProvider');\n const configuration = await client.getConfiguration();\n await onlineComponentProvider.initialize(\n offlineComponentProvider,\n configuration\n );\n // The CredentialChangeListener of the online component provider takes\n // precedence over the offline component provider.\n client.setCredentialChangeListener(user =>\n remoteStoreHandleCredentialChange(onlineComponentProvider.remoteStore, user)\n );\n client.onlineComponents = onlineComponentProvider;\n}\n\nasync function ensureOfflineComponents(\n client: FirestoreClient\n): Promise<OfflineComponentProvider> {\n if (!client.offlineComponents) {\n logDebug(LOG_TAG, 'Using default OfflineComponentProvider');\n await setOfflineComponentProvider(\n client,\n new MemoryOfflineComponentProvider()\n );\n }\n\n return client.offlineComponents!;\n}\n\nasync function ensureOnlineComponents(\n client: FirestoreClient\n): Promise<OnlineComponentProvider> {\n if (!client.onlineComponents) {\n logDebug(LOG_TAG, 'Using default OnlineComponentProvider');\n await setOnlineComponentProvider(client, new OnlineComponentProvider());\n }\n\n return client.onlineComponents!;\n}\n\nfunction getPersistence(client: FirestoreClient): Promise<Persistence> {\n return ensureOfflineComponents(client).then(c => c.persistence);\n}\n\nexport function getLocalStore(client: FirestoreClient): Promise<LocalStore> {\n return ensureOfflineComponents(client).then(c => c.localStore);\n}\n\nfunction getRemoteStore(client: FirestoreClient): Promise<RemoteStore> {\n return ensureOnlineComponents(client).then(c => c.remoteStore);\n}\n\nexport function getSyncEngine(client: FirestoreClient): Promise<SyncEngine> {\n return ensureOnlineComponents(client).then(c => c.syncEngine);\n}\n\nfunction getDatastore(client: FirestoreClient): Promise<Datastore> {\n return ensureOnlineComponents(client).then(c => c.datastore);\n}\n\nexport async function getEventManager(\n client: FirestoreClient\n): Promise<EventManager> {\n const onlineComponentProvider = await ensureOnlineComponents(client);\n const eventManager = onlineComponentProvider.eventManager;\n eventManager.onListen = syncEngineListen.bind(\n null,\n onlineComponentProvider.syncEngine\n );\n eventManager.onUnlisten = syncEngineUnlisten.bind(\n null,\n onlineComponentProvider.syncEngine\n );\n return eventManager;\n}\n\n/** Enables the network connection and re-enqueues all pending operations. */\nexport function firestoreClientEnableNetwork(\n client: FirestoreClient\n): Promise<void> {\n return client.asyncQueue.enqueue(async () => {\n const persistence = await getPersistence(client);\n const remoteStore = await getRemoteStore(client);\n persistence.setNetworkEnabled(true);\n return remoteStoreEnableNetwork(remoteStore);\n });\n}\n\n/** Disables the network connection. Pending operations will not complete. */\nexport function firestoreClientDisableNetwork(\n client: FirestoreClient\n): Promise<void> {\n return client.asyncQueue.enqueue(async () => {\n const persistence = await getPersistence(client);\n const remoteStore = await getRemoteStore(client);\n persistence.setNetworkEnabled(false);\n return remoteStoreDisableNetwork(remoteStore);\n });\n}\n\n/**\n * Returns a Promise that resolves when all writes that were pending at the time\n * this method was called received server acknowledgement. An acknowledgement\n * can be either acceptance or rejection.\n */\nexport function firestoreClientWaitForPendingWrites(\n client: FirestoreClient\n): Promise<void> {\n const deferred = new Deferred<void>();\n client.asyncQueue.enqueueAndForget(async () => {\n const syncEngine = await getSyncEngine(client);\n return syncEngineRegisterPendingWritesCallback(syncEngine, deferred);\n });\n return deferred.promise;\n}\n\nexport function firestoreClientListen(\n client: FirestoreClient,\n query: Query,\n options: ListenOptions,\n observer: Partial<Observer<ViewSnapshot>>\n): () => void {\n const wrappedObserver = new AsyncObserver(observer);\n const listener = new QueryListener(query, wrappedObserver, options);\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return eventManagerListen(eventManager, listener);\n });\n return () => {\n wrappedObserver.mute();\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return eventManagerUnlisten(eventManager, listener);\n });\n };\n}\n\nexport function firestoreClientGetDocumentFromLocalCache(\n client: FirestoreClient,\n docKey: DocumentKey\n): Promise<Document | null> {\n const deferred = new Deferred<Document | null>();\n client.asyncQueue.enqueueAndForget(async () => {\n const localStore = await getLocalStore(client);\n return readDocumentFromCache(localStore, docKey, deferred);\n });\n return deferred.promise;\n}\n\nexport function firestoreClientGetDocumentViaSnapshotListener(\n client: FirestoreClient,\n key: DocumentKey,\n options: GetOptions = {}\n): Promise<ViewSnapshot> {\n const deferred = new Deferred<ViewSnapshot>();\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return readDocumentViaSnapshotListener(\n eventManager,\n client.asyncQueue,\n key,\n options,\n deferred\n );\n });\n return deferred.promise;\n}\n\nexport function firestoreClientGetDocumentsFromLocalCache(\n client: FirestoreClient,\n query: Query\n): Promise<ViewSnapshot> {\n const deferred = new Deferred<ViewSnapshot>();\n client.asyncQueue.enqueueAndForget(async () => {\n const localStore = await getLocalStore(client);\n return executeQueryFromCache(localStore, query, deferred);\n });\n return deferred.promise;\n}\n\nexport function firestoreClientGetDocumentsViaSnapshotListener(\n client: FirestoreClient,\n query: Query,\n options: GetOptions = {}\n): Promise<ViewSnapshot> {\n const deferred = new Deferred<ViewSnapshot>();\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return executeQueryViaSnapshotListener(\n eventManager,\n client.asyncQueue,\n query,\n options,\n deferred\n );\n });\n return deferred.promise;\n}\n\nexport function firestoreClientWrite(\n client: FirestoreClient,\n mutations: Mutation[]\n): Promise<void> {\n const deferred = new Deferred<void>();\n client.asyncQueue.enqueueAndForget(async () => {\n const syncEngine = await getSyncEngine(client);\n return syncEngineWrite(syncEngine, mutations, deferred);\n });\n return deferred.promise;\n}\n\nexport function firestoreClientAddSnapshotsInSyncListener(\n client: FirestoreClient,\n observer: Partial<Observer<void>>\n): () => void {\n const wrappedObserver = new AsyncObserver(observer);\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return addSnapshotsInSyncListener(eventManager, wrappedObserver);\n });\n return () => {\n wrappedObserver.mute();\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return removeSnapshotsInSyncListener(eventManager, wrappedObserver);\n });\n };\n}\n\n/**\n * Takes an updateFunction in which a set of reads and writes can be performed\n * atomically. In the updateFunction, the client can read and write values\n * using the supplied transaction object. After the updateFunction, all\n * changes will be committed. If a retryable error occurs (ex: some other\n * client has changed any of the data referenced), then the updateFunction\n * will be called again after a backoff. If the updateFunction still fails\n * after all retries, then the transaction will be rejected.\n *\n * The transaction object passed to the updateFunction contains methods for\n * accessing documents and collections. Unlike other datastore access, data\n * accessed with the transaction will not reflect local changes that have not\n * been committed. For this reason, it is required that all reads are\n * performed before any writes. Transactions must be performed while online.\n */\nexport function firestoreClientTransaction<T>(\n client: FirestoreClient,\n updateFunction: (transaction: Transaction) => Promise<T>\n): Promise<T> {\n const deferred = new Deferred<T>();\n client.asyncQueue.enqueueAndForget(async () => {\n const datastore = await getDatastore(client);\n new TransactionRunner<T>(\n client.asyncQueue,\n datastore,\n updateFunction,\n deferred\n ).run();\n });\n return deferred.promise;\n}\n\nasync function readDocumentFromCache(\n localStore: LocalStore,\n docKey: DocumentKey,\n result: Deferred<Document | null>\n): Promise<void> {\n try {\n const document = await localStoreReadDocument(localStore, docKey);\n if (document.isFoundDocument()) {\n result.resolve(document);\n } else if (document.isNoDocument()) {\n result.resolve(null);\n } else {\n result.reject(\n new FirestoreError(\n Code.UNAVAILABLE,\n 'Failed to get document from cache. (However, this document may ' +\n \"exist on the server. Run again without setting 'source' in \" +\n 'the GetOptions to attempt to retrieve the document from the ' +\n 'server.)'\n )\n );\n }\n } catch (e) {\n const firestoreError = wrapInUserErrorIfRecoverable(\n e,\n `Failed to get document '${docKey} from cache`\n );\n result.reject(firestoreError);\n }\n}\n\n/**\n * Retrieves a latency-compensated document from the backend via a\n * SnapshotListener.\n */\nfunction readDocumentViaSnapshotListener(\n eventManager: EventManager,\n asyncQueue: AsyncQueue,\n key: DocumentKey,\n options: GetOptions,\n result: Deferred<ViewSnapshot>\n): Promise<void> {\n const wrappedObserver = new AsyncObserver({\n next: (snap: ViewSnapshot) => {\n // Remove query first before passing event to user to avoid\n // user actions affecting the now stale query.\n asyncQueue.enqueueAndForget(() =>\n eventManagerUnlisten(eventManager, listener)\n );\n\n const exists = snap.docs.has(key);\n if (!exists && snap.fromCache) {\n // TODO(dimond): If we're online and the document doesn't\n // exist then we resolve with a doc.exists set to false. If\n // we're offline however, we reject the Promise in this\n // case. Two options: 1) Cache the negative response from\n // the server so we can deliver that even when you're\n // offline 2) Actually reject the Promise in the online case\n // if the document doesn't exist.\n result.reject(\n new FirestoreError(\n Code.UNAVAILABLE,\n 'Failed to get document because the client is offline.'\n )\n );\n } else if (\n exists &&\n snap.fromCache &&\n options &&\n options.source === 'server'\n ) {\n result.reject(\n new FirestoreError(\n Code.UNAVAILABLE,\n 'Failed to get document from server. (However, this ' +\n 'document does exist in the local cache. Run again ' +\n 'without setting source to \"server\" to ' +\n 'retrieve the cached document.)'\n )\n );\n } else {\n debugAssert(\n snap.docs.size <= 1,\n 'Expected zero or a single result on a document-only query'\n );\n result.resolve(snap);\n }\n },\n error: e => result.reject(e)\n });\n\n const listener = new QueryListener(\n newQueryForPath(key.path),\n wrappedObserver,\n {\n includeMetadataChanges: true,\n waitForSyncWhenOnline: true\n }\n );\n return eventManagerListen(eventManager, listener);\n}\n\nasync function executeQueryFromCache(\n localStore: LocalStore,\n query: Query,\n result: Deferred<ViewSnapshot>\n): Promise<void> {\n try {\n const queryResult = await localStoreExecuteQuery(\n localStore,\n query,\n /* usePreviousResults= */ true\n );\n const view = new View(query, queryResult.remoteKeys);\n const viewDocChanges = view.computeDocChanges(queryResult.documents);\n const viewChange = view.applyChanges(\n viewDocChanges,\n /* updateLimboDocuments= */ false\n );\n result.resolve(viewChange.snapshot!);\n } catch (e) {\n const firestoreError = wrapInUserErrorIfRecoverable(\n e,\n `Failed to execute query '${query} against cache`\n );\n result.reject(firestoreError);\n }\n}\n\n/**\n * Retrieves a latency-compensated query snapshot from the backend via a\n * SnapshotListener.\n */\nfunction executeQueryViaSnapshotListener(\n eventManager: EventManager,\n asyncQueue: AsyncQueue,\n query: Query,\n options: GetOptions,\n result: Deferred<ViewSnapshot>\n): Promise<void> {\n const wrappedObserver = new AsyncObserver<ViewSnapshot>({\n next: snapshot => {\n // Remove query first before passing event to user to avoid\n // user actions affecting the now stale query.\n asyncQueue.enqueueAndForget(() =>\n eventManagerUnlisten(eventManager, listener)\n );\n\n if (snapshot.fromCache && options.source === 'server') {\n result.reject(\n new FirestoreError(\n Code.UNAVAILABLE,\n 'Failed to get documents from server. (However, these ' +\n 'documents may exist in the local cache. Run again ' +\n 'without setting source to \"server\" to ' +\n 'retrieve the cached documents.)'\n )\n );\n } else {\n result.resolve(snapshot);\n }\n },\n error: e => result.reject(e)\n });\n\n const listener = new QueryListener(query, wrappedObserver, {\n includeMetadataChanges: true,\n waitForSyncWhenOnline: true\n });\n return eventManagerListen(eventManager, listener);\n}\n\nexport function firestoreClientLoadBundle(\n client: FirestoreClient,\n databaseId: DatabaseId,\n data: ReadableStream<Uint8Array> | ArrayBuffer | string,\n resultTask: LoadBundleTask\n): void {\n const reader = createBundleReader(data, newSerializer(databaseId));\n client.asyncQueue.enqueueAndForget(async () => {\n syncEngineLoadBundle(await getSyncEngine(client), reader, resultTask);\n });\n}\n\nexport function firestoreClientGetNamedQuery(\n client: FirestoreClient,\n queryName: string\n): Promise<NamedQuery | undefined> {\n return client.asyncQueue.enqueue(async () =>\n localStoreGetNamedQuery(await getLocalStore(client), queryName)\n );\n}\n\nfunction createBundleReader(\n data: ReadableStream<Uint8Array> | ArrayBuffer | string,\n serializer: JsonProtoSerializer\n): BundleReader {\n let content: ReadableStream<Uint8Array> | ArrayBuffer;\n if (typeof data === 'string') {\n content = newTextEncoder().encode(data);\n } else {\n content = data;\n }\n return newBundleReader(toByteStreamReader(content), serializer);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BundleSource } from '../../util/bundle_reader';\nimport { toByteStreamReaderHelper } from '../../util/byte_stream';\n\n/**\n * On web, a `ReadableStream` is wrapped around by a `ByteStreamReader`.\n */\nexport function toByteStreamReader(\n source: BundleSource,\n bytesPerRead: number\n): ReadableStreamReader<Uint8Array> {\n if (source instanceof Uint8Array) {\n return toByteStreamReaderHelper(source, bytesPerRead);\n }\n if (source instanceof ArrayBuffer) {\n return toByteStreamReaderHelper(new Uint8Array(source), bytesPerRead);\n }\n if (source instanceof ReadableStream) {\n return source.getReader();\n }\n throw new Error(\n 'Source of `toByteStreamReader` has to be a ArrayBuffer or ReadableStream'\n );\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class DatabaseInfo {\n /**\n * Constructs a DatabaseInfo using the provided host, databaseId and\n * persistenceKey.\n *\n * @param databaseId - The database to use.\n * @param appId - The Firebase App Id.\n * @param persistenceKey - A unique identifier for this Firestore's local\n * storage (used in conjunction with the databaseId).\n * @param host - The Firestore backend host to connect to.\n * @param ssl - Whether to use SSL when connecting.\n * @param forceLongPolling - Whether to use the forceLongPolling option\n * when using WebChannel as the network transport.\n * @param autoDetectLongPolling - Whether to use the detectBufferingProxy\n * option when using WebChannel as the network transport.\n * @param useFetchStreams Whether to use the Fetch API instead of\n * XMLHTTPRequest\n */\n constructor(\n readonly databaseId: DatabaseId,\n readonly appId: string,\n readonly persistenceKey: string,\n readonly host: string,\n readonly ssl: boolean,\n readonly forceLongPolling: boolean,\n readonly autoDetectLongPolling: boolean,\n readonly useFetchStreams: boolean\n ) {}\n}\n\n/** The default database name for a project. */\nconst DEFAULT_DATABASE_NAME = '(default)';\n\n/** Represents the database ID a Firestore client is associated with. */\nexport class DatabaseId {\n readonly database: string;\n constructor(readonly projectId: string, database?: string) {\n this.database = database ? database : DEFAULT_DATABASE_NAME;\n }\n\n get isDefaultDatabase(): boolean {\n return this.database === DEFAULT_DATABASE_NAME;\n }\n\n isEqual(other: {}): boolean {\n return (\n other instanceof DatabaseId &&\n other.projectId === this.projectId &&\n other.database === this.database\n );\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { _FirebaseService } from '@firebase/app-exp';\n\nimport { CredentialsProvider } from '../api/credentials';\nimport { DatabaseId, DatabaseInfo } from '../core/database_info';\nimport { newConnection } from '../platform/connection';\nimport { newSerializer } from '../platform/serializer';\nimport { Datastore, newDatastore } from '../remote/datastore';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug } from '../util/log';\n\nimport { FirestoreSettings } from './settings';\n\nexport const LOG_TAG = 'ComponentProvider';\n\n// The components module manages the lifetime of dependencies of the Firestore\n// client. Dependencies can be lazily constructed and only one exists per\n// Firestore instance.\n\n/**\n * An interface implemented by FirebaseFirestore that provides compatibility\n * with the usage in this file.\n *\n * This interface mainly exists to remove a cyclic dependency.\n */\nexport interface FirestoreService extends _FirebaseService {\n _credentials: CredentialsProvider;\n _persistenceKey: string;\n _databaseId: DatabaseId;\n _terminated: boolean;\n\n _freezeSettings(): FirestoreSettings;\n}\n/**\n * An instance map that ensures only one Datastore exists per Firestore\n * instance.\n */\nconst datastoreInstances = new Map<FirestoreService, Datastore>();\n\n/**\n * Returns an initialized and started Datastore for the given Firestore\n * instance. Callers must invoke removeComponents() when the Firestore\n * instance is terminated.\n */\nexport function getDatastore(firestore: FirestoreService): Datastore {\n if (firestore._terminated) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'The client has already been terminated.'\n );\n }\n if (!datastoreInstances.has(firestore)) {\n logDebug(LOG_TAG, 'Initializing Datastore');\n const databaseInfo = makeDatabaseInfo(\n firestore._databaseId,\n firestore.app.options.appId || '',\n firestore._persistenceKey,\n firestore._freezeSettings()\n );\n const connection = newConnection(databaseInfo);\n const serializer = newSerializer(firestore._databaseId);\n const datastore = newDatastore(\n firestore._credentials,\n connection,\n serializer\n );\n\n datastoreInstances.set(firestore, datastore);\n }\n return datastoreInstances.get(firestore)!;\n}\n\n/**\n * Removes all components associated with the provided instance. Must be called\n * when the `Firestore` instance is terminated.\n */\nexport function removeComponents(firestore: FirestoreService): void {\n const datastore = datastoreInstances.get(firestore);\n if (datastore) {\n logDebug(LOG_TAG, 'Removing Datastore');\n datastoreInstances.delete(firestore);\n datastore.terminate();\n }\n}\n\nexport function makeDatabaseInfo(\n databaseId: DatabaseId,\n appId: string,\n persistenceKey: string,\n settings: FirestoreSettings\n): DatabaseInfo {\n return new DatabaseInfo(\n databaseId,\n appId,\n persistenceKey,\n settings.host,\n settings.ssl,\n settings.experimentalForceLongPolling,\n settings.experimentalAutoDetectLongPolling,\n settings.useFetchStreams\n );\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n FirebaseAuthInternal,\n FirebaseAuthInternalName\n} from '@firebase/auth-interop-types';\nimport { Provider } from '@firebase/component';\n\nimport { User } from '../auth/user';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug } from '../util/log';\nimport { Deferred } from '../util/promise';\n\n// TODO(mikelehen): This should be split into multiple files and probably\n// moved to an auth/ folder to match other platforms.\n\nexport interface FirstPartyCredentialsSettings {\n // These are external types. Prevent minification.\n ['type']: 'gapi';\n ['client']: unknown;\n ['sessionIndex']: string;\n ['iamToken']: string | null;\n}\n\nexport interface ProviderCredentialsSettings {\n // These are external types. Prevent minification.\n ['type']: 'provider';\n ['client']: CredentialsProvider;\n}\n\n/** Settings for private credentials */\nexport type CredentialsSettings =\n | FirstPartyCredentialsSettings\n | ProviderCredentialsSettings;\n\nexport type TokenType = 'OAuth' | 'FirstParty';\nexport interface Token {\n /** Type of token. */\n type: TokenType;\n\n /**\n * The user with which the token is associated (used for persisting user\n * state on disk, etc.).\n */\n user: User;\n\n /** Extra header values to be passed along with a request */\n authHeaders: { [header: string]: string };\n}\n\nexport class OAuthToken implements Token {\n type = 'OAuth' as TokenType;\n authHeaders: { [header: string]: string };\n constructor(value: string, public user: User) {\n this.authHeaders = {};\n // Set the headers using Object Literal notation to avoid minification\n this.authHeaders['Authorization'] = `Bearer ${value}`;\n }\n}\n\n/**\n * A Listener for credential change events. The listener should fetch a new\n * token and may need to invalidate other state if the current user has also\n * changed.\n */\nexport type CredentialChangeListener = (user: User) => Promise<void>;\n\n/**\n * Provides methods for getting the uid and token for the current user and\n * listening for changes.\n */\nexport interface CredentialsProvider {\n /** Requests a token for the current user. */\n getToken(): Promise<Token | null>;\n\n /**\n * Marks the last retrieved token as invalid, making the next GetToken request\n * force-refresh the token.\n */\n invalidateToken(): void;\n\n /**\n * Specifies a listener to be notified of credential changes\n * (sign-in / sign-out, token changes). It is immediately called once with the\n * initial user.\n *\n * The change listener is invoked on the provided AsyncQueue.\n */\n setChangeListener(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void;\n\n /** Removes the previously-set change listener. */\n removeChangeListener(): void;\n}\n\n/** A CredentialsProvider that always yields an empty token. */\nexport class EmptyCredentialsProvider implements CredentialsProvider {\n /**\n * Stores the listener registered with setChangeListener()\n * This isn't actually necessary since the UID never changes, but we use this\n * to verify the listen contract is adhered to in tests.\n */\n private changeListener: CredentialChangeListener | null = null;\n\n getToken(): Promise<Token | null> {\n return Promise.resolve<Token | null>(null);\n }\n\n invalidateToken(): void {}\n\n setChangeListener(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {\n debugAssert(\n !this.changeListener,\n 'Can only call setChangeListener() once.'\n );\n this.changeListener = changeListener;\n // Fire with initial user.\n asyncQueue.enqueueRetryable(() => changeListener(User.UNAUTHENTICATED));\n }\n\n removeChangeListener(): void {\n this.changeListener = null;\n }\n}\n\n/**\n * A CredentialsProvider that always returns a constant token. Used for\n * emulator token mocking.\n */\nexport class EmulatorCredentialsProvider implements CredentialsProvider {\n constructor(private token: Token) {}\n\n /**\n * Stores the listener registered with setChangeListener()\n * This isn't actually necessary since the UID never changes, but we use this\n * to verify the listen contract is adhered to in tests.\n */\n private changeListener: CredentialChangeListener | null = null;\n\n getToken(): Promise<Token | null> {\n return Promise.resolve(this.token);\n }\n\n invalidateToken(): void {}\n\n setChangeListener(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {\n debugAssert(\n !this.changeListener,\n 'Can only call setChangeListener() once.'\n );\n this.changeListener = changeListener;\n // Fire with initial user.\n asyncQueue.enqueueRetryable(() => changeListener(this.token.user));\n }\n\n removeChangeListener(): void {\n this.changeListener = null;\n }\n}\n\nexport class FirebaseCredentialsProvider implements CredentialsProvider {\n /**\n * The auth token listener registered with FirebaseApp, retained here so we\n * can unregister it.\n */\n private tokenListener: () => void;\n\n /** Tracks the current User. */\n private currentUser: User = User.UNAUTHENTICATED;\n\n /** Promise that allows blocking on the initialization of Firebase Auth. */\n private authDeferred = new Deferred();\n\n /**\n * Counter used to detect if the token changed while a getToken request was\n * outstanding.\n */\n private tokenCounter = 0;\n\n /** The listener registered with setChangeListener(). */\n private changeListener?: CredentialChangeListener;\n\n private forceRefresh = false;\n\n private auth: FirebaseAuthInternal | null = null;\n\n private asyncQueue: AsyncQueue | null = null;\n\n constructor(authProvider: Provider<FirebaseAuthInternalName>) {\n this.tokenListener = () => {\n this.tokenCounter++;\n this.currentUser = this.getUser();\n this.authDeferred.resolve();\n if (this.changeListener) {\n this.asyncQueue!.enqueueRetryable(() =>\n this.changeListener!(this.currentUser)\n );\n }\n };\n\n const registerAuth = (auth: FirebaseAuthInternal): void => {\n logDebug('FirebaseCredentialsProvider', 'Auth detected');\n this.auth = auth;\n this.auth.addAuthTokenListener(this.tokenListener);\n };\n\n authProvider.onInit(auth => registerAuth(auth));\n\n // Our users can initialize Auth right after Firestore, so we give it\n // a chance to register itself with the component framework before we\n // determine whether to start up in unauthenticated mode.\n setTimeout(() => {\n if (!this.auth) {\n const auth = authProvider.getImmediate({ optional: true });\n if (auth) {\n registerAuth(auth);\n } else {\n // If auth is still not available, proceed with `null` user\n logDebug('FirebaseCredentialsProvider', 'Auth not yet detected');\n this.authDeferred.resolve();\n }\n }\n }, 0);\n }\n\n getToken(): Promise<Token | null> {\n debugAssert(\n this.tokenListener != null,\n 'getToken cannot be called after listener removed.'\n );\n\n // Take note of the current value of the tokenCounter so that this method\n // can fail (with an ABORTED error) if there is a token change while the\n // request is outstanding.\n const initialTokenCounter = this.tokenCounter;\n const forceRefresh = this.forceRefresh;\n this.forceRefresh = false;\n\n if (!this.auth) {\n return Promise.resolve(null);\n }\n\n return this.auth.getToken(forceRefresh).then(tokenData => {\n // Cancel the request since the token changed while the request was\n // outstanding so the response is potentially for a previous user (which\n // user, we can't be sure).\n if (this.tokenCounter !== initialTokenCounter) {\n logDebug(\n 'FirebaseCredentialsProvider',\n 'getToken aborted due to token change.'\n );\n return this.getToken();\n } else {\n if (tokenData) {\n hardAssert(\n typeof tokenData.accessToken === 'string',\n 'Invalid tokenData returned from getToken():' + tokenData\n );\n return new OAuthToken(tokenData.accessToken, this.currentUser);\n } else {\n return null;\n }\n }\n });\n }\n\n invalidateToken(): void {\n this.forceRefresh = true;\n }\n\n setChangeListener(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {\n debugAssert(!this.asyncQueue, 'Can only call setChangeListener() once.');\n this.asyncQueue = asyncQueue;\n\n // Blocks the AsyncQueue until the next user is available.\n this.asyncQueue!.enqueueRetryable(async () => {\n await this.authDeferred.promise;\n await changeListener(this.currentUser);\n this.changeListener = changeListener;\n });\n }\n\n removeChangeListener(): void {\n if (this.auth) {\n this.auth.removeAuthTokenListener(this.tokenListener!);\n }\n this.changeListener = () => Promise.resolve();\n }\n\n // Auth.getUid() can return null even with a user logged in. It is because\n // getUid() is synchronous, but the auth code populating Uid is asynchronous.\n // This method should only be called in the AuthTokenListener callback\n // to guarantee to get the actual user.\n private getUser(): User {\n const currentUid = this.auth && this.auth.getUid();\n hardAssert(\n currentUid === null || typeof currentUid === 'string',\n 'Received invalid UID: ' + currentUid\n );\n return new User(currentUid);\n }\n}\n\n// Manual type definition for the subset of Gapi we use.\ninterface Gapi {\n auth: {\n getAuthHeaderValueForFirstParty: (\n userIdentifiers: Array<{ [key: string]: string }>\n ) => string | null;\n };\n}\n\n/*\n * FirstPartyToken provides a fresh token each time its value\n * is requested, because if the token is too old, requests will be rejected.\n * Technically this may no longer be necessary since the SDK should gracefully\n * recover from unauthenticated errors (see b/33147818 for context), but it's\n * safer to keep the implementation as-is.\n */\nexport class FirstPartyToken implements Token {\n type = 'FirstParty' as TokenType;\n user = User.FIRST_PARTY;\n\n constructor(\n private gapi: Gapi,\n private sessionIndex: string,\n private iamToken: string | null\n ) {}\n\n get authHeaders(): { [header: string]: string } {\n const headers: { [header: string]: string } = {\n 'X-Goog-AuthUser': this.sessionIndex\n };\n // Use array notation to prevent minification\n const authHeader = this.gapi['auth']['getAuthHeaderValueForFirstParty']([]);\n if (authHeader) {\n headers['Authorization'] = authHeader;\n }\n if (this.iamToken) {\n headers['X-Goog-Iam-Authorization-Token'] = this.iamToken;\n }\n return headers;\n }\n}\n\n/*\n * Provides user credentials required for the Firestore JavaScript SDK\n * to authenticate the user, using technique that is only available\n * to applications hosted by Google.\n */\nexport class FirstPartyCredentialsProvider implements CredentialsProvider {\n constructor(\n private gapi: Gapi,\n private sessionIndex: string,\n private iamToken: string | null\n ) {}\n\n getToken(): Promise<Token | null> {\n return Promise.resolve(\n new FirstPartyToken(this.gapi, this.sessionIndex, this.iamToken)\n );\n }\n\n setChangeListener(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {\n // Fire with initial uid.\n asyncQueue.enqueueRetryable(() => changeListener(User.FIRST_PARTY));\n }\n\n removeChangeListener(): void {}\n\n invalidateToken(): void {}\n}\n\n/**\n * Builds a CredentialsProvider depending on the type of\n * the credentials passed in.\n */\nexport function makeCredentialsProvider(\n credentials?: CredentialsSettings\n): CredentialsProvider {\n if (!credentials) {\n return new EmptyCredentialsProvider();\n }\n\n switch (credentials['type']) {\n case 'gapi':\n const client = credentials['client'] as Gapi;\n // Make sure this really is a Gapi client.\n hardAssert(\n !!(\n typeof client === 'object' &&\n client !== null &&\n client['auth'] &&\n client['auth']['getAuthHeaderValueForFirstParty']\n ),\n 'unexpected gapi interface'\n );\n return new FirstPartyCredentialsProvider(\n client,\n credentials['sessionIndex'] || '0',\n credentials['iamToken'] || null\n );\n\n case 'provider':\n return credentials['client'];\n\n default:\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'makeCredentialsProvider failed due to invalid credential type'\n );\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SetOptions } from '@firebase/firestore-types';\n\nimport { DocumentKey } from '../model/document_key';\nimport { ResourcePath } from '../model/path';\n\nimport { fail } from './assert';\nimport { Code, FirestoreError } from './error';\n\n/** Types accepted by validateType() and related methods for validation. */\nexport type ValidationType =\n | 'undefined'\n | 'object'\n | 'function'\n | 'boolean'\n | 'number'\n | 'string'\n | 'non-empty string';\n\nexport function validateNonEmptyArgument(\n functionName: string,\n argumentName: string,\n argument?: string\n): asserts argument is string {\n if (!argument) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Function ${functionName}() cannot be called with an empty ${argumentName}.`\n );\n }\n}\n\nexport function validateSetOptions(\n methodName: string,\n options: SetOptions | undefined\n): SetOptions {\n if (options === undefined) {\n return {\n merge: false\n };\n }\n\n if (options.mergeFields !== undefined && options.merge !== undefined) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid options passed to function ${methodName}(): You cannot ` +\n 'specify both \"merge\" and \"mergeFields\".'\n );\n }\n\n return options;\n}\n\n/**\n * Validates that two boolean options are not set at the same time.\n */\nexport function validateIsNotUsedTogether(\n optionName1: string,\n argument1: boolean | undefined,\n optionName2: string,\n argument2: boolean | undefined\n): void {\n if (argument1 === true && argument2 === true) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `${optionName1} and ${optionName2} cannot be used together.`\n );\n }\n}\n\n/**\n * Validates that `path` refers to a document (indicated by the fact it contains\n * an even numbers of segments).\n */\nexport function validateDocumentPath(path: ResourcePath): void {\n if (!DocumentKey.isDocumentKey(path)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid document reference. Document references must have an even number of segments, but ${path} has ${path.length}.`\n );\n }\n}\n\n/**\n * Validates that `path` refers to a collection (indicated by the fact it\n * contains an odd numbers of segments).\n */\nexport function validateCollectionPath(path: ResourcePath): void {\n if (DocumentKey.isDocumentKey(path)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid collection reference. Collection references must have an odd number of segments, but ${path} has ${path.length}.`\n );\n }\n}\n\n/**\n * Returns true if it's a non-null object without a custom prototype\n * (i.e. excludes Array, Date, etc.).\n */\nexport function isPlainObject(input: unknown): boolean {\n return (\n typeof input === 'object' &&\n input !== null &&\n (Object.getPrototypeOf(input) === Object.prototype ||\n Object.getPrototypeOf(input) === null)\n );\n}\n\n/** Returns a string describing the type / value of the provided input. */\nexport function valueDescription(input: unknown): string {\n if (input === undefined) {\n return 'undefined';\n } else if (input === null) {\n return 'null';\n } else if (typeof input === 'string') {\n if (input.length > 20) {\n input = `${input.substring(0, 20)}...`;\n }\n return JSON.stringify(input);\n } else if (typeof input === 'number' || typeof input === 'boolean') {\n return '' + input;\n } else if (typeof input === 'object') {\n if (input instanceof Array) {\n return 'an array';\n } else {\n const customObjectName = tryGetCustomObjectType(input!);\n if (customObjectName) {\n return `a custom ${customObjectName} object`;\n } else {\n return 'an object';\n }\n }\n } else if (typeof input === 'function') {\n return 'a function';\n } else {\n return fail('Unknown wrong type: ' + typeof input);\n }\n}\n\n/** Hacky method to try to get the constructor name for an object. */\nexport function tryGetCustomObjectType(input: object): string | null {\n if (input.constructor) {\n const funcNameRegex = /function\\s+([^\\s(]+)\\s*\\(/;\n const results = funcNameRegex.exec(input.constructor.toString());\n if (results && results.length > 1) {\n return results[1];\n }\n }\n return null;\n}\n\n/**\n * Casts `obj` to `T`, optionally unwrapping Compat types to expose the\n * underlying instance. Throws if `obj` is not an instance of `T`.\n *\n * This cast is used in the Lite and Full SDK to verify instance types for\n * arguments passed to the public API.\n */\nexport function cast<T>(\n obj: object,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor: { new (...args: any[]): T }\n): T | never {\n if ('_delegate' in obj) {\n // Unwrap Compat types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj = (obj as any)._delegate;\n }\n\n if (!(obj instanceof constructor)) {\n if (constructor.name === obj.constructor.name) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Type does not match the expected instance. Did you pass a ' +\n `reference from a different Firestore SDK?`\n );\n } else {\n const description = valueDescription(obj);\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Expected type '${constructor.name}', but it was: ${description}`\n );\n }\n }\n return obj as T;\n}\n\nexport function validatePositiveNumber(functionName: string, n: number): void {\n if (n <= 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Function ${functionName}() requires a positive number, but it was: ${n}.`\n );\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CredentialsSettings } from '../api/credentials';\nimport {\n LRU_COLLECTION_DISABLED,\n LRU_DEFAULT_CACHE_SIZE_BYTES\n} from '../local/lru_garbage_collector';\nimport { LRU_MINIMUM_CACHE_SIZE_BYTES } from '../local/lru_garbage_collector_impl';\nimport { Code, FirestoreError } from '../util/error';\nimport { validateIsNotUsedTogether } from '../util/input_validation';\n\n// settings() defaults:\nexport const DEFAULT_HOST = 'firestore.googleapis.com';\nexport const DEFAULT_SSL = true;\n\n/**\n * Specifies custom configurations for your Cloud Firestore instance.\n * You must set these before invoking any other methods.\n */\nexport interface Settings {\n /** The hostname to connect to. */\n host?: string;\n\n /** Whether to use SSL when connecting. */\n ssl?: boolean;\n\n /**\n * Whether to skip nested properties that are set to `undefined` during\n * object serialization. If set to `true`, these properties are skipped\n * and not written to Firestore. If set to `false` or omitted, the SDK\n * throws an exception when it encounters properties of type `undefined`.\n */\n ignoreUndefinedProperties?: boolean;\n}\n\n/** Undocumented, private additional settings not exposed in our public API. */\nexport interface PrivateSettings extends Settings {\n // Can be a google-auth-library or gapi client.\n credentials?: CredentialsSettings;\n // Used in firestore@exp\n cacheSizeBytes?: number;\n // Used in firestore@exp\n experimentalForceLongPolling?: boolean;\n // Used in firestore@exp\n experimentalAutoDetectLongPolling?: boolean;\n // Used in firestore@exp\n useFetchStreams?: boolean;\n}\n\n/**\n * A concrete type describing all the values that can be applied via a\n * user-supplied firestore.Settings object. This is a separate type so that\n * defaults can be supplied and the value can be checked for equality.\n */\nexport class FirestoreSettings {\n /** The hostname to connect to. */\n readonly host: string;\n\n /** Whether to use SSL when connecting. */\n readonly ssl: boolean;\n\n readonly cacheSizeBytes: number;\n\n readonly experimentalForceLongPolling: boolean;\n\n readonly experimentalAutoDetectLongPolling: boolean;\n\n readonly ignoreUndefinedProperties: boolean;\n\n readonly useFetchStreams: boolean;\n\n // Can be a google-auth-library or gapi client.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n credentials?: any;\n\n constructor(settings: PrivateSettings) {\n if (settings.host === undefined) {\n if (settings.ssl !== undefined) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n \"Can't provide ssl option if host option is not set\"\n );\n }\n this.host = DEFAULT_HOST;\n this.ssl = DEFAULT_SSL;\n } else {\n this.host = settings.host;\n this.ssl = settings.ssl ?? DEFAULT_SSL;\n }\n\n this.credentials = settings.credentials;\n this.ignoreUndefinedProperties = !!settings.ignoreUndefinedProperties;\n\n if (settings.cacheSizeBytes === undefined) {\n this.cacheSizeBytes = LRU_DEFAULT_CACHE_SIZE_BYTES;\n } else {\n if (\n settings.cacheSizeBytes !== LRU_COLLECTION_DISABLED &&\n settings.cacheSizeBytes < LRU_MINIMUM_CACHE_SIZE_BYTES\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `cacheSizeBytes must be at least ${LRU_MINIMUM_CACHE_SIZE_BYTES}`\n );\n } else {\n this.cacheSizeBytes = settings.cacheSizeBytes;\n }\n }\n\n this.experimentalForceLongPolling = !!settings.experimentalForceLongPolling;\n this.experimentalAutoDetectLongPolling = !!settings.experimentalAutoDetectLongPolling;\n this.useFetchStreams = !!settings.useFetchStreams;\n\n validateIsNotUsedTogether(\n 'experimentalForceLongPolling',\n settings.experimentalForceLongPolling,\n 'experimentalAutoDetectLongPolling',\n settings.experimentalAutoDetectLongPolling\n );\n }\n\n isEqual(other: FirestoreSettings): boolean {\n return (\n this.host === other.host &&\n this.ssl === other.ssl &&\n this.credentials === other.credentials &&\n this.cacheSizeBytes === other.cacheSizeBytes &&\n this.experimentalForceLongPolling ===\n other.experimentalForceLongPolling &&\n this.experimentalAutoDetectLongPolling ===\n other.experimentalAutoDetectLongPolling &&\n this.ignoreUndefinedProperties === other.ignoreUndefinedProperties &&\n this.useFetchStreams === other.useFetchStreams\n );\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n _getProvider,\n _removeServiceInstance,\n FirebaseApp,\n getApp\n} from '@firebase/app-exp';\nimport { FirebaseAuthInternalName } from '@firebase/auth-interop-types';\nimport { Provider } from '@firebase/component';\nimport { createMockUserToken, EmulatorMockTokenOptions } from '@firebase/util';\n\nimport {\n CredentialsProvider,\n EmptyCredentialsProvider,\n EmulatorCredentialsProvider,\n FirebaseCredentialsProvider,\n makeCredentialsProvider,\n OAuthToken\n} from '../api/credentials';\nimport { User } from '../auth/user';\nimport { DatabaseId } from '../core/database_info';\nimport { Code, FirestoreError } from '../util/error';\nimport { cast } from '../util/input_validation';\nimport { logWarn } from '../util/log';\n\nimport { FirestoreService, removeComponents } from './components';\nimport {\n DEFAULT_HOST,\n FirestoreSettings,\n PrivateSettings,\n Settings\n} from './settings';\n\ndeclare module '@firebase/component' {\n interface NameServiceMapping {\n 'firestore/lite': FirebaseFirestore;\n }\n}\n\n/**\n * The Cloud Firestore service interface.\n *\n * Do not call this constructor directly. Instead, use {@link getFirestore}.\n */\nexport class FirebaseFirestore implements FirestoreService {\n type: 'firestore-lite' | 'firestore' = 'firestore-lite';\n\n readonly _databaseId: DatabaseId;\n readonly _persistenceKey: string = '(lite)';\n _credentials: CredentialsProvider;\n\n private _settings = new FirestoreSettings({});\n private _settingsFrozen = false;\n\n // A task that is assigned when the terminate() is invoked and resolved when\n // all components have shut down.\n private _terminateTask?: Promise<void>;\n\n _app?: FirebaseApp;\n\n /** @hideconstructor */\n constructor(\n databaseIdOrApp: DatabaseId | FirebaseApp,\n authProvider: Provider<FirebaseAuthInternalName>\n ) {\n if (databaseIdOrApp instanceof DatabaseId) {\n this._databaseId = databaseIdOrApp;\n this._credentials = new EmptyCredentialsProvider();\n } else {\n this._app = databaseIdOrApp as FirebaseApp;\n this._databaseId = databaseIdFromApp(databaseIdOrApp as FirebaseApp);\n this._credentials = new FirebaseCredentialsProvider(authProvider);\n }\n }\n\n /**\n * The {@link @firebase/app#FirebaseApp} associated with this `Firestore` service\n * instance.\n */\n get app(): FirebaseApp {\n if (!this._app) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n \"Firestore was not initialized using the Firebase SDK. 'app' is \" +\n 'not available'\n );\n }\n return this._app;\n }\n\n get _initialized(): boolean {\n return this._settingsFrozen;\n }\n\n get _terminated(): boolean {\n return this._terminateTask !== undefined;\n }\n\n _setSettings(settings: PrivateSettings): void {\n if (this._settingsFrozen) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'Firestore has already been started and its settings can no longer ' +\n 'be changed. You can only modify settings before calling any other ' +\n 'methods on a Firestore object.'\n );\n }\n this._settings = new FirestoreSettings(settings);\n if (settings.credentials !== undefined) {\n this._credentials = makeCredentialsProvider(settings.credentials);\n }\n }\n\n _getSettings(): FirestoreSettings {\n return this._settings;\n }\n\n _freezeSettings(): FirestoreSettings {\n this._settingsFrozen = true;\n return this._settings;\n }\n\n _delete(): Promise<void> {\n if (!this._terminateTask) {\n this._terminateTask = this._terminate();\n }\n return this._terminateTask;\n }\n\n /** Returns a JSON-serializable representation of this Firestore instance. */\n toJSON(): object {\n return {\n app: this._app,\n databaseId: this._databaseId,\n settings: this._settings\n };\n }\n\n /**\n * Terminates all components used by this client. Subclasses can override\n * this method to clean up their own dependencies, but must also call this\n * method.\n *\n * Only ever called once.\n */\n protected _terminate(): Promise<void> {\n removeComponents(this);\n return Promise.resolve();\n }\n}\n\nfunction databaseIdFromApp(app: FirebaseApp): DatabaseId {\n if (!Object.prototype.hasOwnProperty.apply(app.options, ['projectId'])) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n '\"projectId\" not provided in firebase.initializeApp.'\n );\n }\n\n return new DatabaseId(app.options.projectId!);\n}\n\n/**\n * Initializes a new instance of Cloud Firestore with the provided settings.\n * Can only be called before any other functions, including\n * {@link getFirestore}. If the custom settings are empty, this function is\n * equivalent to calling {@link getFirestore}.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} with which the `Firestore` instance will\n * be associated.\n * @param settings - A settings object to configure the `Firestore` instance.\n * @returns A newly initialized Firestore instance.\n */\nexport function initializeFirestore(\n app: FirebaseApp,\n settings: Settings\n): FirebaseFirestore {\n const provider = _getProvider(app, 'firestore/lite');\n\n if (provider.isInitialized()) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'Firestore can only be initialized once per app.'\n );\n }\n\n return provider.initialize({ options: settings });\n}\n\n/**\n * Returns the existing instance of Firestore that is associated with the\n * provided {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new\n * instance with default settings.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned Firestore\n * instance is associated with.\n * @returns The `Firestore` instance of the provided app.\n */\nexport function getFirestore(app: FirebaseApp = getApp()): FirebaseFirestore {\n return _getProvider(\n app,\n 'firestore/lite'\n ).getImmediate() as FirebaseFirestore;\n}\n\n/**\n * Modify this instance to communicate with the Cloud Firestore emulator.\n *\n * Note: This must be called before this instance has been used to do any\n * operations.\n *\n * @param firestore - The Firestore instance to configure to connect to the\n * emulator.\n * @param host - the emulator host (ex: localhost).\n * @param port - the emulator port (ex: 9000).\n * @param options.mockUserToken - the mock auth token to use for unit testing\n * Security Rules.\n */\nexport function connectFirestoreEmulator(\n firestore: FirebaseFirestore,\n host: string,\n port: number,\n options: {\n mockUserToken?: EmulatorMockTokenOptions;\n } = {}\n): void {\n firestore = cast(firestore, FirebaseFirestore);\n const settings = firestore._getSettings();\n\n if (settings.host !== DEFAULT_HOST && settings.host !== host) {\n logWarn(\n 'Host has been set in both settings() and useEmulator(), emulator host ' +\n 'will be used'\n );\n }\n\n firestore._setSettings({\n ...settings,\n host: `${host}:${port}`,\n ssl: false\n });\n\n if (options.mockUserToken) {\n // Let createMockUserToken validate first (catches common mistakes like\n // invalid field \"uid\" and missing field \"sub\" / \"user_id\".)\n const token = createMockUserToken(options.mockUserToken);\n const uid = options.mockUserToken.sub || options.mockUserToken.user_id;\n if (!uid) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n \"mockUserToken must contain 'sub' or 'user_id' field!\"\n );\n }\n\n firestore._credentials = new EmulatorCredentialsProvider(\n new OAuthToken(token, new User(uid))\n );\n }\n}\n\n/**\n * Terminates the provided Firestore instance.\n *\n * After calling `terminate()` only the `clearIndexedDbPersistence()` functions\n * may be used. Any other function will throw a `FirestoreError`. Termination\n * does not cancel any pending writes, and any promises that are awaiting a\n * response from the server will not be resolved.\n *\n * To restart after termination, create a new instance of FirebaseFirestore with\n * {@link getFirestore}.\n *\n * Note: Under normal circumstances, calling `terminate()` is not required. This\n * function is useful only when you want to force this instance to release all of\n * its resources or in combination with {@link clearIndexedDbPersistence} to\n * ensure that all local state is destroyed between test runs.\n *\n * @param firestore - The Firestore instance to terminate.\n * @returns A promise that is resolved when the instance has been successfully\n * terminated.\n */\nexport function terminate(firestore: FirebaseFirestore): Promise<void> {\n firestore = cast(firestore, FirebaseFirestore);\n _removeServiceInstance(firestore.app, 'firestore/lite');\n return firestore._delete();\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance } from '@firebase/util';\n\nimport {\n newQueryForCollectionGroup,\n newQueryForPath,\n Query as InternalQuery,\n queryEquals\n} from '../core/query';\nimport { DocumentKey } from '../model/document_key';\nimport { ResourcePath } from '../model/path';\nimport { Code, FirestoreError } from '../util/error';\nimport {\n cast,\n validateCollectionPath,\n validateDocumentPath,\n validateNonEmptyArgument\n} from '../util/input_validation';\nimport { AutoId } from '../util/misc';\n\nimport { FirebaseFirestore } from './database';\nimport { FieldPath } from './field_path';\nimport { FirestoreDataConverter } from './snapshot';\n\n/**\n * Document data (for use with {@link @firebase/firestore/lite#(setDoc:1)}) consists of fields mapped to\n * values.\n */\nexport interface DocumentData {\n /** A mapping between a field and its value. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [field: string]: any;\n}\n\n/**\n * Update data (for use with {@link @firebase/firestore/lite#(updateDoc:1)}) consists of field paths (e.g.\n * 'foo' or 'foo.baz') mapped to values. Fields that contain dots reference\n * nested fields within the document.\n */\nexport interface UpdateData {\n /** A mapping between a dot-separated field path and its value. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [fieldPath: string]: any;\n}\n\n/**\n * An options object that configures the behavior of {@link @firebase/firestore/lite#(setDoc:1)}, {@link\n * @firebase/firestore/lite#(WriteBatch.set:1)} and {@link @firebase/firestore/lite#(Transaction.set:1)} calls. These calls can be\n * configured to perform granular merges instead of overwriting the target\n * documents in their entirety by providing a `SetOptions` with `merge: true`.\n *\n * @param merge - Changes the behavior of a `setDoc()` call to only replace the\n * values specified in its data argument. Fields omitted from the `setDoc()`\n * call remain untouched.\n * @param mergeFields - Changes the behavior of `setDoc()` calls to only replace\n * the specified field paths. Any field path that is not specified is ignored\n * and remains untouched.\n */\nexport type SetOptions =\n | {\n readonly merge?: boolean;\n }\n | {\n readonly mergeFields?: Array<string | FieldPath>;\n };\n\n/**\n * A `DocumentReference` refers to a document location in a Firestore database\n * and can be used to write, read, or listen to the location. The document at\n * the referenced location may or may not exist.\n */\nexport class DocumentReference<T = DocumentData> {\n /** The type of this Firestore reference. */\n readonly type = 'document';\n\n /**\n * The {@link FirebaseFirestore} the document is in.\n * This is useful for performing transactions, for example.\n */\n readonly firestore: FirebaseFirestore;\n\n /** @hideconstructor */\n constructor(\n firestore: FirebaseFirestore,\n /**\n * If provided, the `FirestoreDataConverter` associated with this instance.\n */\n readonly converter: FirestoreDataConverter<T> | null,\n readonly _key: DocumentKey\n ) {\n this.firestore = firestore;\n }\n\n get _path(): ResourcePath {\n return this._key.path;\n }\n\n /**\n * The document's identifier within its collection.\n */\n get id(): string {\n return this._key.path.lastSegment();\n }\n\n /**\n * A string representing the path of the referenced document (relative\n * to the root of the database).\n */\n get path(): string {\n return this._key.path.canonicalString();\n }\n\n /**\n * The collection this `DocumentReference` belongs to.\n */\n get parent(): CollectionReference<T> {\n return new CollectionReference<T>(\n this.firestore,\n this.converter,\n this._key.path.popLast()\n );\n }\n\n /**\n * Applies a custom data converter to this `DocumentReference`, allowing you\n * to use your own custom model objects with Firestore. When you call {@link\n * @firebase/firestore/lite#(setDoc:1)}, {@link @firebase/firestore/lite#getDoc}, etc. with the returned `DocumentReference`\n * instance, the provided converter will convert between Firestore data and\n * your custom type `U`.\n *\n * @param converter - Converts objects to and from Firestore.\n * @returns A `DocumentReference<U>` that uses the provided converter.\n */\n withConverter<U>(converter: FirestoreDataConverter<U>): DocumentReference<U>;\n /**\n * Removes the current converter.\n *\n * @param converter - `null` removes the current converter.\n * @returns A `DocumentReference<DocumentData>` that does not use a converter.\n */\n withConverter(converter: null): DocumentReference<DocumentData>;\n withConverter<U>(\n converter: FirestoreDataConverter<U> | null\n ): DocumentReference<U> {\n return new DocumentReference<U>(this.firestore, converter, this._key);\n }\n}\n\n/**\n * A `Query` refers to a Query which you can read or listen to. You can also\n * construct refined `Query` objects by adding filters and ordering.\n */\nexport class Query<T = DocumentData> {\n /** The type of this Firestore reference. */\n readonly type: 'query' | 'collection' = 'query';\n\n /**\n * The `FirebaseFirestore` for the Firestore database (useful for performing\n * transactions, etc.).\n */\n readonly firestore: FirebaseFirestore;\n\n // This is the lite version of the Query class in the main SDK.\n\n /** @hideconstructor protected */\n constructor(\n firestore: FirebaseFirestore,\n /**\n * If provided, the `FirestoreDataConverter` associated with this instance.\n */\n readonly converter: FirestoreDataConverter<T> | null,\n readonly _query: InternalQuery\n ) {\n this.firestore = firestore;\n }\n\n /**\n * Removes the current converter.\n *\n * @param converter - `null` removes the current converter.\n * @returns A `Query<DocumentData>` that does not use a converter.\n */\n withConverter(converter: null): Query<DocumentData>;\n /**\n * Applies a custom data converter to this query, allowing you to use your own\n * custom model objects with Firestore. When you call {@link getDocs} with\n * the returned query, the provided converter will convert between Firestore\n * data and your custom type `U`.\n *\n * @param converter - Converts objects to and from Firestore.\n * @returns A `Query<U>` that uses the provided converter.\n */\n withConverter<U>(converter: FirestoreDataConverter<U>): Query<U>;\n withConverter<U>(converter: FirestoreDataConverter<U> | null): Query<U> {\n return new Query<U>(this.firestore, converter, this._query);\n }\n}\n\n/**\n * A `CollectionReference` object can be used for adding documents, getting\n * document references, and querying for documents (using {@link query}).\n */\nexport class CollectionReference<T = DocumentData> extends Query<T> {\n /** The type of this Firestore reference. */\n readonly type = 'collection';\n\n /** @hideconstructor */\n constructor(\n firestore: FirebaseFirestore,\n converter: FirestoreDataConverter<T> | null,\n readonly _path: ResourcePath\n ) {\n super(firestore, converter, newQueryForPath(_path));\n }\n\n /** The collection's identifier. */\n get id(): string {\n return this._query.path.lastSegment();\n }\n\n /**\n * A string representing the path of the referenced collection (relative\n * to the root of the database).\n */\n get path(): string {\n return this._query.path.canonicalString();\n }\n\n /**\n * A reference to the containing `DocumentReference` if this is a\n * subcollection. If this isn't a subcollection, the reference is null.\n */\n get parent(): DocumentReference<DocumentData> | null {\n const parentPath = this._path.popLast();\n if (parentPath.isEmpty()) {\n return null;\n } else {\n return new DocumentReference(\n this.firestore,\n /* converter= */ null,\n new DocumentKey(parentPath)\n );\n }\n }\n\n /**\n * Applies a custom data converter to this CollectionReference, allowing you\n * to use your own custom model objects with Firestore. When you call {@link\n * addDoc} with the returned `CollectionReference` instance, the provided\n * converter will convert between Firestore data and your custom type `U`.\n *\n * @param converter - Converts objects to and from Firestore.\n * @returns A `CollectionReference<U>` that uses the provided converter.\n */\n withConverter<U>(\n converter: FirestoreDataConverter<U>\n ): CollectionReference<U>;\n /**\n * Removes the current converter.\n *\n * @param converter - `null` removes the current converter.\n * @returns A `CollectionReference<DocumentData>` that does not use a\n * converter.\n */\n withConverter(converter: null): CollectionReference<DocumentData>;\n withConverter<U>(\n converter: FirestoreDataConverter<U> | null\n ): CollectionReference<U> {\n return new CollectionReference<U>(this.firestore, converter, this._path);\n }\n}\n\n/**\n * Gets a `CollectionReference` instance that refers to the collection at\n * the specified absolute path.\n *\n * @param firestore - A reference to the root Firestore instance.\n * @param path - A slash-separated path to a collection.\n * @param pathSegments - Additional path segments to apply relative to the first\n * argument.\n * @throws If the final path has an even number of segments and does not point\n * to a collection.\n * @returns The `CollectionReference` instance.\n */\nexport function collection(\n firestore: FirebaseFirestore,\n path: string,\n ...pathSegments: string[]\n): CollectionReference<DocumentData>;\n/**\n * Gets a `CollectionReference` instance that refers to a subcollection of\n * `reference` at the the specified relative path.\n *\n * @param reference - A reference to a collection.\n * @param path - A slash-separated path to a collection.\n * @param pathSegments - Additional path segments to apply relative to the first\n * argument.\n * @throws If the final path has an even number of segments and does not point\n * to a collection.\n * @returns The `CollectionReference` instance.\n */\nexport function collection(\n reference: CollectionReference<unknown>,\n path: string,\n ...pathSegments: string[]\n): CollectionReference<DocumentData>;\n/**\n * Gets a `CollectionReference` instance that refers to a subcollection of\n * `reference` at the the specified relative path.\n *\n * @param reference - A reference to a Firestore document.\n * @param path - A slash-separated path to a collection.\n * @param pathSegments - Additional path segments that will be applied relative\n * to the first argument.\n * @throws If the final path has an even number of segments and does not point\n * to a collection.\n * @returns The `CollectionReference` instance.\n */\nexport function collection(\n reference: DocumentReference,\n path: string,\n ...pathSegments: string[]\n): CollectionReference<DocumentData>;\nexport function collection(\n parent:\n | FirebaseFirestore\n | DocumentReference<unknown>\n | CollectionReference<unknown>,\n path: string,\n ...pathSegments: string[]\n): CollectionReference<DocumentData> {\n parent = getModularInstance(parent);\n\n validateNonEmptyArgument('collection', 'path', path);\n if (parent instanceof FirebaseFirestore) {\n const absolutePath = ResourcePath.fromString(path, ...pathSegments);\n validateCollectionPath(absolutePath);\n return new CollectionReference(parent, /* converter= */ null, absolutePath);\n } else {\n if (\n !(parent instanceof DocumentReference) &&\n !(parent instanceof CollectionReference)\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Expected first argument to collection() to be a CollectionReference, ' +\n 'a DocumentReference or FirebaseFirestore'\n );\n }\n const absolutePath = ResourcePath.fromString(\n parent.path,\n ...pathSegments\n ).child(ResourcePath.fromString(path));\n validateCollectionPath(absolutePath);\n return new CollectionReference(\n parent.firestore,\n /* converter= */ null,\n absolutePath\n );\n }\n}\n\n// TODO(firestorelite): Consider using ErrorFactory -\n// https://github.com/firebase/firebase-js-sdk/blob/0131e1f/packages/util/src/errors.ts#L106\n\n/**\n * Creates and returns a new `Query` instance that includes all documents in the\n * database that are contained in a collection or subcollection with the\n * given `collectionId`.\n *\n * @param firestore - A reference to the root Firestore instance.\n * @param collectionId - Identifies the collections to query over. Every\n * collection or subcollection with this ID as the last segment of its path\n * will be included. Cannot contain a slash.\n * @returns The created `Query`.\n */\nexport function collectionGroup(\n firestore: FirebaseFirestore,\n collectionId: string\n): Query<DocumentData> {\n firestore = cast(firestore, FirebaseFirestore);\n\n validateNonEmptyArgument('collectionGroup', 'collection id', collectionId);\n if (collectionId.indexOf('/') >= 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid collection ID '${collectionId}' passed to function ` +\n `collectionGroup(). Collection IDs must not contain '/'.`\n );\n }\n\n return new Query(\n firestore,\n /* converter= */ null,\n newQueryForCollectionGroup(collectionId)\n );\n}\n\n/**\n * Gets a `DocumentReference` instance that refers to the document at the\n * specified abosulute path.\n *\n * @param firestore - A reference to the root Firestore instance.\n * @param path - A slash-separated path to a document.\n * @param pathSegments - Additional path segments that will be applied relative\n * to the first argument.\n * @throws If the final path has an odd number of segments and does not point to\n * a document.\n * @returns The `DocumentReference` instance.\n */\nexport function doc(\n firestore: FirebaseFirestore,\n path: string,\n ...pathSegments: string[]\n): DocumentReference<DocumentData>;\n/**\n * Gets a `DocumentReference` instance that refers to a document within\n * `reference` at the specified relative path. If no path is specified, an\n * automatically-generated unique ID will be used for the returned\n * `DocumentReference`.\n *\n * @param reference - A reference to a collection.\n * @param path - A slash-separated path to a document. Has to be omitted to use\n * auto-genrated IDs.\n * @param pathSegments - Additional path segments that will be applied relative\n * to the first argument.\n * @throws If the final path has an odd number of segments and does not point to\n * a document.\n * @returns The `DocumentReference` instance.\n */\nexport function doc<T>(\n reference: CollectionReference<T>,\n path?: string,\n ...pathSegments: string[]\n): DocumentReference<T>;\n/**\n * Gets a `DocumentReference` instance that refers to a document within\n * `reference` at the specified relative path.\n *\n * @param reference - A reference to a Firestore document.\n * @param path - A slash-separated path to a document.\n * @param pathSegments - Additional path segments that will be applied relative\n * to the first argument.\n * @throws If the final path has an odd number of segments and does not point to\n * a document.\n * @returns The `DocumentReference` instance.\n */\nexport function doc(\n reference: DocumentReference<unknown>,\n path: string,\n ...pathSegments: string[]\n): DocumentReference<DocumentData>;\nexport function doc<T>(\n parent:\n | FirebaseFirestore\n | CollectionReference<T>\n | DocumentReference<unknown>,\n path?: string,\n ...pathSegments: string[]\n): DocumentReference {\n parent = getModularInstance(parent);\n\n // We allow omission of 'pathString' but explicitly prohibit passing in both\n // 'undefined' and 'null'.\n if (arguments.length === 1) {\n path = AutoId.newId();\n }\n validateNonEmptyArgument('doc', 'path', path);\n\n if (parent instanceof FirebaseFirestore) {\n const absolutePath = ResourcePath.fromString(path, ...pathSegments);\n validateDocumentPath(absolutePath);\n return new DocumentReference(\n parent,\n /* converter= */ null,\n new DocumentKey(absolutePath)\n );\n } else {\n if (\n !(parent instanceof DocumentReference) &&\n !(parent instanceof CollectionReference)\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Expected first argument to collection() to be a CollectionReference, ' +\n 'a DocumentReference or FirebaseFirestore'\n );\n }\n const absolutePath = parent._path.child(\n ResourcePath.fromString(path, ...pathSegments)\n );\n validateDocumentPath(absolutePath);\n return new DocumentReference(\n parent.firestore,\n parent instanceof CollectionReference ? parent.converter : null,\n new DocumentKey(absolutePath)\n );\n }\n}\n\n/**\n * Returns true if the provided references are equal.\n *\n * @param left - A reference to compare.\n * @param right - A reference to compare.\n * @returns true if the references point to the same location in the same\n * Firestore database.\n */\nexport function refEqual<T>(\n left: DocumentReference<T> | CollectionReference<T>,\n right: DocumentReference<T> | CollectionReference<T>\n): boolean {\n left = getModularInstance(left);\n right = getModularInstance(right);\n\n if (\n (left instanceof DocumentReference ||\n left instanceof CollectionReference) &&\n (right instanceof DocumentReference || right instanceof CollectionReference)\n ) {\n return (\n left.firestore === right.firestore &&\n left.path === right.path &&\n left.converter === right.converter\n );\n }\n return false;\n}\n\n/**\n * Returns true if the provided queries point to the same collection and apply\n * the same constraints.\n *\n * @param left - A `Query` to compare.\n * @param right - A `Query` to compare.\n * @returns true if the references point to the same location in the same\n * Firestore database.\n */\nexport function queryEqual<T>(left: Query<T>, right: Query<T>): boolean {\n left = getModularInstance(left);\n right = getModularInstance(right);\n\n if (left instanceof Query && right instanceof Query) {\n return (\n left.firestore === right.firestore &&\n queryEquals(left._query, right._query) &&\n left.converter === right.converter\n );\n }\n return false;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isIndexedDbTransactionError } from '../local/simple_db';\nimport { getDocument } from '../platform/dom';\nimport { ExponentialBackoff } from '../remote/backoff';\n\nimport { debugAssert, fail } from './assert';\nimport { AsyncQueue, DelayedOperation, TimerId } from './async_queue';\nimport { FirestoreError } from './error';\nimport { logDebug, logError } from './log';\nimport { Deferred } from './promise';\n\nconst LOG_TAG = 'AsyncQueue';\n\nexport class AsyncQueueImpl implements AsyncQueue {\n // The last promise in the queue.\n private tail: Promise<unknown> = Promise.resolve();\n\n // A list of retryable operations. Retryable operations are run in order and\n // retried with backoff.\n private retryableOps: Array<() => Promise<void>> = [];\n\n // Is this AsyncQueue being shut down? Once it is set to true, it will not\n // be changed again.\n private _isShuttingDown: boolean = false;\n\n // Operations scheduled to be queued in the future. Operations are\n // automatically removed after they are run or canceled.\n private delayedOperations: Array<DelayedOperation<unknown>> = [];\n\n // visible for testing\n failure: FirestoreError | null = null;\n\n // Flag set while there's an outstanding AsyncQueue operation, used for\n // assertion sanity-checks.\n private operationInProgress = false;\n\n // Enabled during shutdown on Safari to prevent future access to IndexedDB.\n private skipNonRestrictedTasks = false;\n\n // List of TimerIds to fast-forward delays for.\n private timerIdsToSkip: TimerId[] = [];\n\n // Backoff timer used to schedule retries for retryable operations\n private backoff = new ExponentialBackoff(this, TimerId.AsyncQueueRetry);\n\n // Visibility handler that triggers an immediate retry of all retryable\n // operations. Meant to speed up recovery when we regain file system access\n // after page comes into foreground.\n private visibilityHandler: () => void = () => {\n const document = getDocument();\n if (document) {\n logDebug(\n LOG_TAG,\n 'Visibility state changed to ' + document.visibilityState\n );\n }\n this.backoff.skipBackoff();\n };\n\n constructor() {\n const document = getDocument();\n if (document && typeof document.addEventListener === 'function') {\n document.addEventListener('visibilitychange', this.visibilityHandler);\n }\n }\n\n get isShuttingDown(): boolean {\n return this._isShuttingDown;\n }\n\n /**\n * Adds a new operation to the queue without waiting for it to complete (i.e.\n * we ignore the Promise result).\n */\n enqueueAndForget<T extends unknown>(op: () => Promise<T>): void {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enqueue(op);\n }\n\n enqueueAndForgetEvenWhileRestricted<T extends unknown>(\n op: () => Promise<T>\n ): void {\n this.verifyNotFailed();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enqueueInternal(op);\n }\n\n enterRestrictedMode(purgeExistingTasks?: boolean): void {\n if (!this._isShuttingDown) {\n this._isShuttingDown = true;\n this.skipNonRestrictedTasks = purgeExistingTasks || false;\n const document = getDocument();\n if (document && typeof document.removeEventListener === 'function') {\n document.removeEventListener(\n 'visibilitychange',\n this.visibilityHandler\n );\n }\n }\n }\n\n enqueue<T extends unknown>(op: () => Promise<T>): Promise<T> {\n this.verifyNotFailed();\n if (this._isShuttingDown) {\n // Return a Promise which never resolves.\n return new Promise<T>(() => {});\n }\n\n // Create a deferred Promise that we can return to the callee. This\n // allows us to return a \"hanging Promise\" only to the callee and still\n // advance the queue even when the operation is not run.\n const task = new Deferred<T>();\n return this.enqueueInternal<unknown>(() => {\n if (this._isShuttingDown && this.skipNonRestrictedTasks) {\n // We do not resolve 'task'\n return Promise.resolve();\n }\n\n op().then(task.resolve, task.reject);\n return task.promise;\n }).then(() => task.promise);\n }\n\n enqueueRetryable(op: () => Promise<void>): void {\n this.enqueueAndForget(() => {\n this.retryableOps.push(op);\n return this.retryNextOp();\n });\n }\n\n /**\n * Runs the next operation from the retryable queue. If the operation fails,\n * reschedules with backoff.\n */\n private async retryNextOp(): Promise<void> {\n if (this.retryableOps.length === 0) {\n return;\n }\n\n try {\n await this.retryableOps[0]();\n this.retryableOps.shift();\n this.backoff.reset();\n } catch (e) {\n if (isIndexedDbTransactionError(e)) {\n logDebug(LOG_TAG, 'Operation failed with retryable error: ' + e);\n } else {\n throw e; // Failure will be handled by AsyncQueue\n }\n }\n\n if (this.retryableOps.length > 0) {\n // If there are additional operations, we re-schedule `retryNextOp()`.\n // This is necessary to run retryable operations that failed during\n // their initial attempt since we don't know whether they are already\n // enqueued. If, for example, `op1`, `op2`, `op3` are enqueued and `op1`\n // needs to be re-run, we will run `op1`, `op1`, `op2` using the\n // already enqueued calls to `retryNextOp()`. `op3()` will then run in the\n // call scheduled here.\n // Since `backoffAndRun()` cancels an existing backoff and schedules a\n // new backoff on every call, there is only ever a single additional\n // operation in the queue.\n this.backoff.backoffAndRun(() => this.retryNextOp());\n }\n }\n\n private enqueueInternal<T extends unknown>(op: () => Promise<T>): Promise<T> {\n const newTail = this.tail.then(() => {\n this.operationInProgress = true;\n return op()\n .catch((error: FirestoreError) => {\n this.failure = error;\n this.operationInProgress = false;\n const message = getMessageOrStack(error);\n logError('INTERNAL UNHANDLED ERROR: ', message);\n\n // Re-throw the error so that this.tail becomes a rejected Promise and\n // all further attempts to chain (via .then) will just short-circuit\n // and return the rejected Promise.\n throw error;\n })\n .then(result => {\n this.operationInProgress = false;\n return result;\n });\n });\n this.tail = newTail;\n return newTail;\n }\n\n enqueueAfterDelay<T extends unknown>(\n timerId: TimerId,\n delayMs: number,\n op: () => Promise<T>\n ): DelayedOperation<T> {\n this.verifyNotFailed();\n\n debugAssert(\n delayMs >= 0,\n `Attempted to schedule an operation with a negative delay of ${delayMs}`\n );\n\n // Fast-forward delays for timerIds that have been overriden.\n if (this.timerIdsToSkip.indexOf(timerId) > -1) {\n delayMs = 0;\n }\n\n const delayedOp = DelayedOperation.createAndSchedule<T>(\n this,\n timerId,\n delayMs,\n op,\n removedOp =>\n this.removeDelayedOperation(removedOp as DelayedOperation<unknown>)\n );\n this.delayedOperations.push(delayedOp as DelayedOperation<unknown>);\n return delayedOp;\n }\n\n private verifyNotFailed(): void {\n if (this.failure) {\n fail('AsyncQueue is already failed: ' + getMessageOrStack(this.failure));\n }\n }\n\n verifyOperationInProgress(): void {\n debugAssert(\n this.operationInProgress,\n 'verifyOpInProgress() called when no op in progress on this queue.'\n );\n }\n\n /**\n * Waits until all currently queued tasks are finished executing. Delayed\n * operations are not run.\n */\n async drain(): Promise<void> {\n // Operations in the queue prior to draining may have enqueued additional\n // operations. Keep draining the queue until the tail is no longer advanced,\n // which indicates that no more new operations were enqueued and that all\n // operations were executed.\n let currentTail: Promise<unknown>;\n do {\n currentTail = this.tail;\n await currentTail;\n } while (currentTail !== this.tail);\n }\n\n /**\n * For Tests: Determine if a delayed operation with a particular TimerId\n * exists.\n */\n containsDelayedOperation(timerId: TimerId): boolean {\n for (const op of this.delayedOperations) {\n if (op.timerId === timerId) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * For Tests: Runs some or all delayed operations early.\n *\n * @param lastTimerId - Delayed operations up to and including this TimerId\n * will be drained. Pass TimerId.All to run all delayed operations.\n * @returns a Promise that resolves once all operations have been run.\n */\n runAllDelayedOperationsUntil(lastTimerId: TimerId): Promise<void> {\n // Note that draining may generate more delayed ops, so we do that first.\n return this.drain().then(() => {\n // Run ops in the same order they'd run if they ran naturally.\n this.delayedOperations.sort((a, b) => a.targetTimeMs - b.targetTimeMs);\n\n for (const op of this.delayedOperations) {\n op.skipDelay();\n if (lastTimerId !== TimerId.All && op.timerId === lastTimerId) {\n break;\n }\n }\n\n return this.drain();\n });\n }\n\n /**\n * For Tests: Skip all subsequent delays for a timer id.\n */\n skipDelaysForTimerId(timerId: TimerId): void {\n this.timerIdsToSkip.push(timerId);\n }\n\n /** Called once a DelayedOperation is run or canceled. */\n private removeDelayedOperation(op: DelayedOperation<unknown>): void {\n // NOTE: indexOf / slice are O(n), but delayedOperations is expected to be small.\n const index = this.delayedOperations.indexOf(op);\n debugAssert(index >= 0, 'Delayed operation not found.');\n this.delayedOperations.splice(index, 1);\n }\n}\n\nexport function newAsyncQueue(): AsyncQueue {\n return new AsyncQueueImpl();\n}\n\n/**\n * Chrome includes Error.message in Error.stack. Other browsers do not.\n * This returns expected output of message + stack when available.\n * @param error - Error or FirestoreError\n */\nfunction getMessageOrStack(error: Error): string {\n let message = error.message || '';\n if (error.stack) {\n if (error.stack.includes(error.message)) {\n message = error.stack;\n } else {\n message = error.message + '\\n' + error.stack;\n }\n }\n return message;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { JsonObject } from '../model/object_value';\nimport { FirestoreError } from '../util/error';\n\n/**\n * Observer/Subscribe interfaces.\n */\nexport type NextFn<T> = (value: T) => void;\nexport type ErrorFn = (error: FirestoreError) => void;\nexport type CompleteFn = () => void;\n\n// Allow for any of the Observer methods to be undefined.\nexport interface PartialObserver<T> {\n next?: NextFn<T>;\n error?: ErrorFn;\n complete?: CompleteFn;\n}\n\nexport function isPartialObserver<T>(obj: unknown): obj is PartialObserver<T> {\n return implementsAnyMethods(obj, ['next', 'error', 'complete']);\n}\n\n/**\n * Returns true if obj is an object and contains at least one of the specified\n * methods.\n */\nfunction implementsAnyMethods(obj: unknown, methods: string[]): boolean {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n const object = obj as JsonObject<unknown>;\n for (const method of methods) {\n if (method in object && typeof object[method] === 'function') {\n return true;\n }\n }\n return false;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PartialObserver } from '../api/observer';\nimport { debugAssert } from '../util/assert';\nimport { FirestoreError } from '../util/error';\nimport { Deferred } from '../util/promise';\n\n/**\n * Represents the state of bundle loading tasks.\n *\n * Both 'Error' and 'Success' are sinking state: task will abort or complete and there will\n * be no more updates after they are reported.\n */\nexport type TaskState = 'Error' | 'Running' | 'Success';\n\n/**\n * Represents a progress update or a final state from loading bundles.\n */\nexport interface LoadBundleTaskProgress {\n /** How many documents have been loaded. */\n documentsLoaded: number;\n /** How many documents are in the bundle being loaded. */\n totalDocuments: number;\n /** How many bytes have been loaded. */\n bytesLoaded: number;\n /** How many bytes are in the bundle being loaded. */\n totalBytes: number;\n /** Current task state. */\n taskState: TaskState;\n}\n\n/**\n * Represents the task of loading a Firestore bundle. It provides progress of bundle\n * loading, as well as task completion and error events.\n *\n * The API is compatible with `Promise<LoadBundleTaskProgress>`.\n */\nexport class LoadBundleTask implements PromiseLike<LoadBundleTaskProgress> {\n private _progressObserver: PartialObserver<LoadBundleTaskProgress> = {};\n private _taskCompletionResolver = new Deferred<LoadBundleTaskProgress>();\n\n private _lastProgress: LoadBundleTaskProgress = {\n taskState: 'Running',\n totalBytes: 0,\n totalDocuments: 0,\n bytesLoaded: 0,\n documentsLoaded: 0\n };\n\n /**\n * Registers functions to listen to bundle loading progress events.\n * @param next - Called when there is a progress update from bundle loading. Typically `next` calls occur\n * each time a Firestore document is loaded from the bundle.\n * @param error - Called when an error occurs during bundle loading. The task aborts after reporting the\n * error, and there should be no more updates after this.\n * @param complete - Called when the loading task is complete.\n */\n onProgress(\n next?: (progress: LoadBundleTaskProgress) => unknown,\n error?: (err: Error) => unknown,\n complete?: () => void\n ): void {\n this._progressObserver = {\n next,\n error,\n complete\n };\n }\n\n /**\n * Implements the `Promise<LoadBundleTaskProgress>.catch` interface.\n *\n * @param onRejected - Called when an error occurs during bundle loading.\n */\n catch<R>(\n onRejected: (a: Error) => R | PromiseLike<R>\n ): Promise<R | LoadBundleTaskProgress> {\n return this._taskCompletionResolver.promise.catch(onRejected);\n }\n\n /**\n * Implements the `Promise<LoadBundleTaskProgress>.then` interface.\n *\n * @param onFulfilled - Called on the completion of the loading task with a final `LoadBundleTaskProgress` update.\n * The update will always have its `taskState` set to `\"Success\"`.\n * @param onRejected - Called when an error occurs during bundle loading.\n */\n then<T, R>(\n onFulfilled?: (a: LoadBundleTaskProgress) => T | PromiseLike<T>,\n onRejected?: (a: Error) => R | PromiseLike<R>\n ): Promise<T | R> {\n return this._taskCompletionResolver.promise.then(onFulfilled, onRejected);\n }\n\n /**\n * Notifies all observers that bundle loading has completed, with a provided\n * `LoadBundleTaskProgress` object.\n *\n * @private\n */\n _completeWith(progress: LoadBundleTaskProgress): void {\n debugAssert(\n progress.taskState === 'Success',\n 'Task is not completed with Success.'\n );\n this._updateProgress(progress);\n if (this._progressObserver.complete) {\n this._progressObserver.complete();\n }\n\n this._taskCompletionResolver.resolve(progress);\n }\n\n /**\n * Notifies all observers that bundle loading has failed, with a provided\n * `Error` as the reason.\n *\n * @private\n */\n _failWith(error: FirestoreError): void {\n this._lastProgress.taskState = 'Error';\n\n if (this._progressObserver.next) {\n this._progressObserver.next(this._lastProgress);\n }\n\n if (this._progressObserver.error) {\n this._progressObserver.error(error);\n }\n\n this._taskCompletionResolver.reject(error);\n }\n\n /**\n * Notifies a progress update of loading a bundle.\n * @param progress - The new progress.\n *\n * @private\n */\n _updateProgress(progress: LoadBundleTaskProgress): void {\n debugAssert(\n this._lastProgress.taskState === 'Running',\n 'Cannot update progress on a completed or failed task'\n );\n\n this._lastProgress = progress;\n if (this._progressObserver.next) {\n this._progressObserver.next(progress);\n }\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n _getProvider,\n _removeServiceInstance,\n FirebaseApp,\n getApp\n} from '@firebase/app-exp';\nimport { FirebaseAuthInternalName } from '@firebase/auth-interop-types';\nimport { Provider } from '@firebase/component';\n\nimport {\n IndexedDbOfflineComponentProvider,\n MultiTabOfflineComponentProvider,\n OfflineComponentProvider,\n OnlineComponentProvider\n} from '../core/component_provider';\nimport { DatabaseId } from '../core/database_info';\nimport {\n FirestoreClient,\n firestoreClientDisableNetwork,\n firestoreClientEnableNetwork,\n firestoreClientGetNamedQuery,\n firestoreClientLoadBundle,\n firestoreClientWaitForPendingWrites,\n setOfflineComponentProvider,\n setOnlineComponentProvider\n} from '../core/firestore_client';\nimport { makeDatabaseInfo } from '../lite/components';\nimport { FirebaseFirestore as LiteFirestore } from '../lite/database';\nimport { Query } from '../lite/reference';\nimport {\n indexedDbClearPersistence,\n indexedDbStoragePrefix\n} from '../local/indexeddb_persistence';\nimport { LRU_COLLECTION_DISABLED } from '../local/lru_garbage_collector';\nimport { LRU_MINIMUM_CACHE_SIZE_BYTES } from '../local/lru_garbage_collector_impl';\nimport { debugAssert } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { newAsyncQueue } from '../util/async_queue_impl';\nimport { Code, FirestoreError } from '../util/error';\nimport { cast } from '../util/input_validation';\nimport { Deferred } from '../util/promise';\n\nimport { LoadBundleTask } from './bundle';\nimport { PersistenceSettings, Settings } from './settings';\nexport { connectFirestoreEmulator } from '../lite/database';\n\n/** DOMException error code constants. */\nconst DOM_EXCEPTION_INVALID_STATE = 11;\nconst DOM_EXCEPTION_ABORTED = 20;\nconst DOM_EXCEPTION_QUOTA_EXCEEDED = 22;\n\n/**\n * Constant used to indicate the LRU garbage collection should be disabled.\n * Set this value as the `cacheSizeBytes` on the settings passed to the\n * `Firestore` instance.\n */\nexport const CACHE_SIZE_UNLIMITED = LRU_COLLECTION_DISABLED;\n\n/**\n * The Cloud Firestore service interface.\n *\n * Do not call this constructor directly. Instead, use {@link getFirestore}.\n */\nexport class FirebaseFirestore extends LiteFirestore {\n type: 'firestore-lite' | 'firestore' = 'firestore';\n\n readonly _queue: AsyncQueue = newAsyncQueue();\n readonly _persistenceKey: string;\n\n _firestoreClient: FirestoreClient | undefined;\n\n /** @hideconstructor */\n constructor(\n databaseIdOrApp: DatabaseId | FirebaseApp,\n authProvider: Provider<FirebaseAuthInternalName>\n ) {\n super(databaseIdOrApp, authProvider);\n this._persistenceKey =\n 'name' in databaseIdOrApp ? databaseIdOrApp.name : '[DEFAULT]';\n }\n\n _terminate(): Promise<void> {\n if (!this._firestoreClient) {\n // The client must be initialized to ensure that all subsequent API\n // usage throws an exception.\n configureFirestore(this);\n }\n return this._firestoreClient!.terminate();\n }\n}\n\n/**\n * Initializes a new instance of Cloud Firestore with the provided settings.\n * Can only be called before any other function, including\n * {@link getFirestore}. If the custom settings are empty, this function is\n * equivalent to calling {@link getFirestore}.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} with which the `Firestore` instance will\n * be associated.\n * @param settings - A settings object to configure the `Firestore` instance.\n * @returns A newly initialized `Firestore` instance.\n */\nexport function initializeFirestore(\n app: FirebaseApp,\n settings: Settings\n): FirebaseFirestore {\n const provider = _getProvider(app, 'firestore-exp');\n\n if (provider.isInitialized()) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'Firestore can only be initialized once per app.'\n );\n }\n\n if (\n settings.cacheSizeBytes !== undefined &&\n settings.cacheSizeBytes !== CACHE_SIZE_UNLIMITED &&\n settings.cacheSizeBytes < LRU_MINIMUM_CACHE_SIZE_BYTES\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `cacheSizeBytes must be at least ${LRU_MINIMUM_CACHE_SIZE_BYTES}`\n );\n }\n\n return provider.initialize({ options: settings });\n}\n\n/**\n * Returns the existing instance of Firestore that is associated with the\n * provided {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new\n * instance with default settings.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned Firestore\n * instance is associated with.\n * @returns The `Firestore` instance of the provided app.\n */\nexport function getFirestore(app: FirebaseApp = getApp()): FirebaseFirestore {\n return _getProvider(app, 'firestore-exp').getImmediate() as FirebaseFirestore;\n}\n\n/**\n * @internal\n */\nexport function ensureFirestoreConfigured(\n firestore: FirebaseFirestore\n): FirestoreClient {\n if (!firestore._firestoreClient) {\n configureFirestore(firestore);\n }\n firestore._firestoreClient!.verifyNotTerminated();\n return firestore._firestoreClient as FirestoreClient;\n}\n\nexport function configureFirestore(firestore: FirebaseFirestore): void {\n const settings = firestore._freezeSettings();\n debugAssert(!!settings.host, 'FirestoreSettings.host is not set');\n debugAssert(\n !firestore._firestoreClient,\n 'configureFirestore() called multiple times'\n );\n\n const databaseInfo = makeDatabaseInfo(\n firestore._databaseId,\n firestore._app?.options.appId || '',\n firestore._persistenceKey,\n settings\n );\n firestore._firestoreClient = new FirestoreClient(\n firestore._credentials,\n firestore._queue,\n databaseInfo\n );\n}\n\n/**\n * Attempts to enable persistent storage, if possible.\n *\n * Must be called before any other functions (other than\n * {@link initializeFirestore}, {@link getFirestore} or\n * {@link clearIndexedDbPersistence}.\n *\n * If this fails, `enableIndexedDbPersistence()` will reject the promise it\n * returns. Note that even after this failure, the `Firestore` instance will\n * remain usable, however offline persistence will be disabled.\n *\n * There are several reasons why this can fail, which can be identified by\n * the `code` on the error.\n *\n * * failed-precondition: The app is already open in another browser tab.\n * * unimplemented: The browser is incompatible with the offline\n * persistence implementation.\n *\n * @param firestore - The `Firestore` instance to enable persistence for.\n * @param persistenceSettings - Optional settings object to configure\n * persistence.\n * @returns A promise that represents successfully enabling persistent storage.\n */\nexport function enableIndexedDbPersistence(\n firestore: FirebaseFirestore,\n persistenceSettings?: PersistenceSettings\n): Promise<void> {\n firestore = cast(firestore, FirebaseFirestore);\n verifyNotInitialized(firestore);\n\n const client = ensureFirestoreConfigured(firestore);\n const settings = firestore._freezeSettings();\n\n const onlineComponentProvider = new OnlineComponentProvider();\n const offlineComponentProvider = new IndexedDbOfflineComponentProvider(\n onlineComponentProvider,\n settings.cacheSizeBytes,\n persistenceSettings?.forceOwnership\n );\n return setPersistenceProviders(\n client,\n onlineComponentProvider,\n offlineComponentProvider\n );\n}\n\n/**\n * Attempts to enable multi-tab persistent storage, if possible. If enabled\n * across all tabs, all operations share access to local persistence, including\n * shared execution of queries and latency-compensated local document updates\n * across all connected instances.\n *\n * If this fails, `enableMultiTabIndexedDbPersistence()` will reject the promise\n * it returns. Note that even after this failure, the `Firestore` instance will\n * remain usable, however offline persistence will be disabled.\n *\n * There are several reasons why this can fail, which can be identified by\n * the `code` on the error.\n *\n * * failed-precondition: The app is already open in another browser tab and\n * multi-tab is not enabled.\n * * unimplemented: The browser is incompatible with the offline\n * persistence implementation.\n *\n * @param firestore - The `Firestore` instance to enable persistence for.\n * @returns A promise that represents successfully enabling persistent\n * storage.\n */\nexport function enableMultiTabIndexedDbPersistence(\n firestore: FirebaseFirestore\n): Promise<void> {\n firestore = cast(firestore, FirebaseFirestore);\n verifyNotInitialized(firestore);\n\n const client = ensureFirestoreConfigured(firestore);\n const settings = firestore._freezeSettings();\n\n const onlineComponentProvider = new OnlineComponentProvider();\n const offlineComponentProvider = new MultiTabOfflineComponentProvider(\n onlineComponentProvider,\n settings.cacheSizeBytes\n );\n return setPersistenceProviders(\n client,\n onlineComponentProvider,\n offlineComponentProvider\n );\n}\n\n/**\n * Registers both the `OfflineComponentProvider` and `OnlineComponentProvider`.\n * If the operation fails with a recoverable error (see\n * `canRecoverFromIndexedDbError()` below), the returned Promise is rejected\n * but the client remains usable.\n */\nfunction setPersistenceProviders(\n client: FirestoreClient,\n onlineComponentProvider: OnlineComponentProvider,\n offlineComponentProvider: OfflineComponentProvider\n): Promise<void> {\n const persistenceResult = new Deferred();\n return client.asyncQueue\n .enqueue(async () => {\n try {\n await setOfflineComponentProvider(client, offlineComponentProvider);\n await setOnlineComponentProvider(client, onlineComponentProvider);\n persistenceResult.resolve();\n } catch (e) {\n if (!canFallbackFromIndexedDbError(e)) {\n throw e;\n }\n console.warn(\n 'Error enabling offline persistence. Falling back to ' +\n 'persistence disabled: ' +\n e\n );\n persistenceResult.reject(e);\n }\n })\n .then(() => persistenceResult.promise);\n}\n\n/**\n * Decides whether the provided error allows us to gracefully disable\n * persistence (as opposed to crashing the client).\n */\nfunction canFallbackFromIndexedDbError(\n error: FirestoreError | DOMException\n): boolean {\n if (error.name === 'FirebaseError') {\n return (\n error.code === Code.FAILED_PRECONDITION ||\n error.code === Code.UNIMPLEMENTED\n );\n } else if (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException\n ) {\n // There are a few known circumstances where we can open IndexedDb but\n // trying to read/write will fail (e.g. quota exceeded). For\n // well-understood cases, we attempt to detect these and then gracefully\n // fall back to memory persistence.\n // NOTE: Rather than continue to add to this list, we could decide to\n // always fall back, with the risk that we might accidentally hide errors\n // representing actual SDK bugs.\n return (\n // When the browser is out of quota we could get either quota exceeded\n // or an aborted error depending on whether the error happened during\n // schema migration.\n error.code === DOM_EXCEPTION_QUOTA_EXCEEDED ||\n error.code === DOM_EXCEPTION_ABORTED ||\n // Firefox Private Browsing mode disables IndexedDb and returns\n // INVALID_STATE for any usage.\n error.code === DOM_EXCEPTION_INVALID_STATE\n );\n }\n\n return true;\n}\n\n/**\n * Clears the persistent storage. This includes pending writes and cached\n * documents.\n *\n * Must be called while the `Firestore` instance is not started (after the app is\n * terminated or when the app is first initialized). On startup, this function\n * must be called before other functions (other than {@link\n * initializeFirestore} or {@link getFirestore})). If the `Firestore`\n * instance is still running, the promise will be rejected with the error code\n * of `failed-precondition`.\n *\n * Note: `clearIndexedDbPersistence()` is primarily intended to help write\n * reliable tests that use Cloud Firestore. It uses an efficient mechanism for\n * dropping existing data but does not attempt to securely overwrite or\n * otherwise make cached data unrecoverable. For applications that are sensitive\n * to the disclosure of cached data in between user sessions, we strongly\n * recommend not enabling persistence at all.\n *\n * @param firestore - The `Firestore` instance to clear persistence for.\n * @returns A promise that is resolved when the persistent storage is\n * cleared. Otherwise, the promise is rejected with an error.\n */\nexport function clearIndexedDbPersistence(\n firestore: FirebaseFirestore\n): Promise<void> {\n if (firestore._initialized && !firestore._terminated) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'Persistence can only be cleared before a Firestore instance is ' +\n 'initialized or after it is terminated.'\n );\n }\n\n const deferred = new Deferred<void>();\n firestore._queue.enqueueAndForgetEvenWhileRestricted(async () => {\n try {\n await indexedDbClearPersistence(\n indexedDbStoragePrefix(firestore._databaseId, firestore._persistenceKey)\n );\n deferred.resolve();\n } catch (e) {\n deferred.reject(e);\n }\n });\n return deferred.promise;\n}\n\n/**\n * Waits until all currently pending writes for the active user have been\n * acknowledged by the backend.\n *\n * The returned Promise resolves immediately if there are no outstanding writes.\n * Otherwise, the Promise waits for all previously issued writes (including\n * those written in a previous app session), but it does not wait for writes\n * that were added after the function is called. If you want to wait for\n * additional writes, call `waitForPendingWrites()` again.\n *\n * Any outstanding `waitForPendingWrites()` Promises are rejected during user\n * changes.\n *\n * @returns A Promise which resolves when all currently pending writes have been\n * acknowledged by the backend.\n */\nexport function waitForPendingWrites(\n firestore: FirebaseFirestore\n): Promise<void> {\n firestore = cast(firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientWaitForPendingWrites(client);\n}\n\n/**\n * Re-enables use of the network for this Firestore instance after a prior\n * call to {@link disableNetwork}.\n *\n * @returns A promise that is resolved once the network has been enabled.\n */\nexport function enableNetwork(firestore: FirebaseFirestore): Promise<void> {\n firestore = cast(firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientEnableNetwork(client);\n}\n\n/**\n * Disables network usage for this instance. It can be re-enabled via {@link\n * enableNetwork}. While the network is disabled, any snapshot listeners,\n * `getDoc()` or `getDocs()` calls will return results from cache, and any write\n * operations will be queued until the network is restored.\n *\n * @returns A promise that is resolved once the network has been disabled.\n */\nexport function disableNetwork(firestore: FirebaseFirestore): Promise<void> {\n firestore = cast(firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientDisableNetwork(client);\n}\n\n/**\n * Terminates the provided Firestore instance.\n *\n * After calling `terminate()` only the `clearIndexedDbPersistence()` function\n * may be used. Any other function will throw a `FirestoreError`.\n *\n * To restart after termination, create a new instance of FirebaseFirestore with\n * {@link getFirestore}.\n *\n * Termination does not cancel any pending writes, and any promises that are\n * awaiting a response from the server will not be resolved. If you have\n * persistence enabled, the next time you start this instance, it will resume\n * sending these writes to the server.\n *\n * Note: Under normal circumstances, calling `terminate()` is not required. This\n * function is useful only when you want to force this instance to release all\n * of its resources or in combination with `clearIndexedDbPersistence()` to\n * ensure that all local state is destroyed between test runs.\n *\n * @returns A promise that is resolved when the instance has been successfully\n * terminated.\n */\nexport function terminate(firestore: FirebaseFirestore): Promise<void> {\n _removeServiceInstance(firestore.app, 'firestore-exp');\n return firestore._delete();\n}\n\n/**\n * Loads a Firestore bundle into the local cache.\n *\n * @param firestore - The `Firestore` instance to load bundles for for.\n * @param bundleData - An object representing the bundle to be loaded. Valid objects are\n * `ArrayBuffer`, `ReadableStream<Uint8Array>` or `string`.\n *\n * @returns\n * A `LoadBundleTask` object, which notifies callers with progress updates, and completion\n * or error events. It can be used as a `Promise<LoadBundleTaskProgress>`.\n */\nexport function loadBundle(\n firestore: FirebaseFirestore,\n bundleData: ReadableStream<Uint8Array> | ArrayBuffer | string\n): LoadBundleTask {\n firestore = cast(firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n const resultTask = new LoadBundleTask();\n firestoreClientLoadBundle(\n client,\n firestore._databaseId,\n bundleData,\n resultTask\n );\n return resultTask;\n}\n\n/**\n * Reads a Firestore `Query` from local cache, identified by the given name.\n *\n * The named queries are packaged into bundles on the server side (along\n * with resulting documents), and loaded to local cache using `loadBundle`. Once in local\n * cache, use this method to extract a `Query` by name.\n */\nexport function namedQuery(\n firestore: FirebaseFirestore,\n name: string\n): Promise<Query | null> {\n firestore = cast(firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientGetNamedQuery(client, name).then(namedQuery => {\n if (!namedQuery) {\n return null;\n }\n\n return new Query(firestore, null, namedQuery.query);\n });\n}\n\nfunction verifyNotInitialized(firestore: FirebaseFirestore): void {\n if (firestore._initialized || firestore._terminated) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'Firestore has already been started and persistence can no longer be ' +\n 'enabled. You can only enable persistence before calling any other ' +\n 'methods on a Firestore object.'\n );\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DOCUMENT_KEY_NAME,\n FieldPath as InternalFieldPath\n} from '../model/path';\nimport { Code, FirestoreError } from '../util/error';\n\n/**\n * A `FieldPath` refers to a field in a document. The path may consist of a\n * single field name (referring to a top-level field in the document), or a\n * list of field names (referring to a nested field in the document).\n *\n * Create a `FieldPath` by providing field names. If more than one field\n * name is provided, the path will point to a nested field in a document.\n */\nexport class FieldPath {\n /** Internal representation of a Firestore field path. */\n readonly _internalPath: InternalFieldPath;\n\n /**\n * Creates a FieldPath from the provided field names. If more than one field\n * name is provided, the path will point to a nested field in a document.\n *\n * @param fieldNames - A list of field names.\n */\n constructor(...fieldNames: string[]) {\n for (let i = 0; i < fieldNames.length; ++i) {\n if (fieldNames[i].length === 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid field name at argument $(i + 1). ` +\n 'Field names must not be empty.'\n );\n }\n }\n\n this._internalPath = new InternalFieldPath(fieldNames);\n }\n\n /**\n * Returns true if this `FieldPath` is equal to the provided one.\n *\n * @param other - The `FieldPath` to compare against.\n * @returns true if this `FieldPath` is equal to the provided one.\n */\n isEqual(other: FieldPath): boolean {\n return this._internalPath.isEqual(other._internalPath);\n }\n}\n\n/**\n * Returns a special sentinel `FieldPath` to refer to the ID of a document.\n * It can be used in queries to sort or filter by the document ID.\n */\nexport function documentId(): FieldPath {\n return new FieldPath(DOCUMENT_KEY_NAME);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ByteString } from '../util/byte_string';\nimport { Code, FirestoreError } from '../util/error';\n\n/**\n * An immutable object representing an array of bytes.\n */\nexport class Bytes {\n _byteString: ByteString;\n\n /** @hideconstructor */\n constructor(byteString: ByteString) {\n this._byteString = byteString;\n }\n\n /**\n * Creates a new `Bytes` object from the given Base64 string, converting it to\n * bytes.\n *\n * @param base64 - The Base64 string used to create the `Bytes` object.\n */\n static fromBase64String(base64: string): Bytes {\n try {\n return new Bytes(ByteString.fromBase64String(base64));\n } catch (e) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Failed to construct data from Base64 string: ' + e\n );\n }\n }\n\n /**\n * Creates a new `Bytes` object from the given Uint8Array.\n *\n * @param array - The Uint8Array used to create the `Bytes` object.\n */\n static fromUint8Array(array: Uint8Array): Bytes {\n return new Bytes(ByteString.fromUint8Array(array));\n }\n\n /**\n * Returns the underlying bytes as a Base64-encoded string.\n *\n * @returns The Base64-encoded string created from the `Bytes` object.\n */\n toBase64(): string {\n return this._byteString.toBase64();\n }\n\n /**\n * Returns the underlying bytes in a new `Uint8Array`.\n *\n * @returns The Uint8Array created from the `Bytes` object.\n */\n toUint8Array(): Uint8Array {\n return this._byteString.toUint8Array();\n }\n\n /**\n * Returns a string representation of the `Bytes` object.\n *\n * @returns A string representation of the `Bytes` object.\n */\n toString(): string {\n return 'Bytes(base64: ' + this.toBase64() + ')';\n }\n\n /**\n * Returns true if this `Bytes` object is equal to the provided one.\n *\n * @param other - The `Bytes` object to compare against.\n * @returns true if this `Bytes` object is equal to the provided one.\n */\n isEqual(other: Bytes): boolean {\n return this._byteString.isEqual(other._byteString);\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ParseContext } from '../api/parse_context';\nimport { FieldTransform } from '../model/mutation';\n\n/**\n * Sentinel values that can be used when writing document fields with `set()`\n * or `update()`.\n */\nexport abstract class FieldValue {\n /**\n * @param _methodName - The public API endpoint that returns this class.\n * @hideconstructor\n */\n constructor(public _methodName: string) {}\n\n /** Compares `FieldValue`s for equality. */\n abstract isEqual(other: FieldValue): boolean;\n abstract _toFieldTransform(context: ParseContext): FieldTransform | null;\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Code, FirestoreError } from '../util/error';\nimport { primitiveComparator } from '../util/misc';\n\n/**\n * An immutable object representing a geographic location in Firestore. The\n * location is represented as latitude/longitude pair.\n *\n * Latitude values are in the range of [-90, 90].\n * Longitude values are in the range of [-180, 180].\n */\nexport class GeoPoint {\n // Prefix with underscore to signal this is a private variable in JS and\n // prevent it showing up for autocompletion when typing latitude or longitude.\n private _lat: number;\n private _long: number;\n\n /**\n * Creates a new immutable `GeoPoint` object with the provided latitude and\n * longitude values.\n * @param latitude - The latitude as number between -90 and 90.\n * @param longitude - The longitude as number between -180 and 180.\n */\n constructor(latitude: number, longitude: number) {\n if (!isFinite(latitude) || latitude < -90 || latitude > 90) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Latitude must be a number between -90 and 90, but was: ' + latitude\n );\n }\n if (!isFinite(longitude) || longitude < -180 || longitude > 180) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Longitude must be a number between -180 and 180, but was: ' + longitude\n );\n }\n\n this._lat = latitude;\n this._long = longitude;\n }\n\n /**\n * The latitude of this `GeoPoint` instance.\n */\n get latitude(): number {\n return this._lat;\n }\n\n /**\n * The longitude of this `GeoPoint` instance.\n */\n get longitude(): number {\n return this._long;\n }\n\n /**\n * Returns true if this `GeoPoint` is equal to the provided one.\n *\n * @param other - The `GeoPoint` to compare against.\n * @returns true if this `GeoPoint` is equal to the provided one.\n */\n isEqual(other: GeoPoint): boolean {\n return this._lat === other._lat && this._long === other._long;\n }\n\n /** Returns a JSON-serializable representation of this GeoPoint. */\n toJSON(): { latitude: number; longitude: number } {\n return { latitude: this._lat, longitude: this._long };\n }\n\n /**\n * Actually private to JS consumers of our API, so this function is prefixed\n * with an underscore.\n */\n _compareTo(other: GeoPoint): number {\n return (\n primitiveComparator(this._lat, other._lat) ||\n primitiveComparator(this._long, other._long)\n );\n }\n}\n", "/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DocumentData,\n FieldPath as PublicFieldPath,\n SetOptions\n} from '@firebase/firestore-types';\nimport { Compat, getModularInstance } from '@firebase/util';\n\nimport { ParseContext } from '../api/parse_context';\nimport { DatabaseId } from '../core/database_info';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldMask } from '../model/field_mask';\nimport {\n FieldTransform,\n Mutation,\n PatchMutation,\n Precondition,\n SetMutation\n} from '../model/mutation';\nimport { ObjectValue } from '../model/object_value';\nimport { FieldPath as InternalFieldPath } from '../model/path';\nimport {\n ArrayRemoveTransformOperation,\n ArrayUnionTransformOperation,\n NumericIncrementTransformOperation,\n ServerTimestampTransform\n} from '../model/transform_operation';\nimport { newSerializer } from '../platform/serializer';\nimport {\n MapValue as ProtoMapValue,\n Value as ProtoValue\n} from '../protos/firestore_proto_api';\nimport { toNumber } from '../remote/number_serializer';\nimport {\n JsonProtoSerializer,\n toBytes,\n toResourceName,\n toTimestamp\n} from '../remote/serializer';\nimport { debugAssert, fail } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\nimport { isPlainObject, valueDescription } from '../util/input_validation';\nimport { Dict, forEach, isEmpty } from '../util/obj';\n\nimport { Bytes } from './bytes';\nimport { FirebaseFirestore } from './database';\nimport { FieldPath } from './field_path';\nimport { FieldValue } from './field_value';\nimport { GeoPoint } from './geo_point';\nimport { DocumentReference } from './reference';\nimport { Timestamp } from './timestamp';\n\nconst RESERVED_FIELD_REGEX = /^__.*__$/;\n\n/**\n * An untyped Firestore Data Converter interface that is shared between the\n * lite, firestore-exp and classic SDK.\n */\nexport interface UntypedFirestoreDataConverter<T> {\n toFirestore(modelObject: T): DocumentData;\n toFirestore(modelObject: Partial<T>, options: SetOptions): DocumentData;\n fromFirestore(snapshot: unknown, options?: unknown): T;\n}\n\n/** The result of parsing document data (e.g. for a setData call). */\nexport class ParsedSetData {\n constructor(\n readonly data: ObjectValue,\n readonly fieldMask: FieldMask | null,\n readonly fieldTransforms: FieldTransform[]\n ) {}\n\n toMutation(key: DocumentKey, precondition: Precondition): Mutation {\n if (this.fieldMask !== null) {\n return new PatchMutation(\n key,\n this.data,\n this.fieldMask,\n precondition,\n this.fieldTransforms\n );\n } else {\n return new SetMutation(\n key,\n this.data,\n precondition,\n this.fieldTransforms\n );\n }\n }\n}\n\n/** The result of parsing \"update\" data (i.e. for an updateData call). */\nexport class ParsedUpdateData {\n constructor(\n readonly data: ObjectValue,\n // The fieldMask does not include document transforms.\n readonly fieldMask: FieldMask,\n readonly fieldTransforms: FieldTransform[]\n ) {}\n\n toMutation(key: DocumentKey, precondition: Precondition): Mutation {\n return new PatchMutation(\n key,\n this.data,\n this.fieldMask,\n precondition,\n this.fieldTransforms\n );\n }\n}\n\n/*\n * Represents what type of API method provided the data being parsed; useful\n * for determining which error conditions apply during parsing and providing\n * better error messages.\n */\nexport const enum UserDataSource {\n Set,\n Update,\n MergeSet,\n /**\n * Indicates the source is a where clause, cursor bound, arrayUnion()\n * element, etc. Of note, isWrite(source) will return false.\n */\n Argument,\n /**\n * Indicates that the source is an Argument that may directly contain nested\n * arrays (e.g. the operand of an `in` query).\n */\n ArrayArgument\n}\n\nfunction isWrite(dataSource: UserDataSource): boolean {\n switch (dataSource) {\n case UserDataSource.Set: // fall through\n case UserDataSource.MergeSet: // fall through\n case UserDataSource.Update:\n return true;\n case UserDataSource.Argument:\n case UserDataSource.ArrayArgument:\n return false;\n default:\n throw fail(`Unexpected case for UserDataSource: ${dataSource}`);\n }\n}\n\n/** Contains the settings that are mutated as we parse user data. */\ninterface ContextSettings {\n /** Indicates what kind of API method this data came from. */\n readonly dataSource: UserDataSource;\n /** The name of the method the user called to create the ParseContext. */\n readonly methodName: string;\n /** The document the user is attempting to modify, if that applies. */\n readonly targetDoc?: DocumentKey;\n /**\n * A path within the object being parsed. This could be an empty path (in\n * which case the context represents the root of the data being parsed), or a\n * nonempty path (indicating the context represents a nested location within\n * the data).\n */\n readonly path?: InternalFieldPath;\n /**\n * Whether or not this context corresponds to an element of an array.\n * If not set, elements are treated as if they were outside of arrays.\n */\n readonly arrayElement?: boolean;\n /**\n * Whether or not a converter was specified in this context. If true, error\n * messages will reference the converter when invalid data is provided.\n */\n readonly hasConverter?: boolean;\n}\n\n/** A \"context\" object passed around while parsing user data. */\nclass ParseContextImpl implements ParseContext {\n readonly fieldTransforms: FieldTransform[];\n readonly fieldMask: InternalFieldPath[];\n /**\n * Initializes a ParseContext with the given source and path.\n *\n * @param settings - The settings for the parser.\n * @param databaseId - The database ID of the Firestore instance.\n * @param serializer - The serializer to use to generate the Value proto.\n * @param ignoreUndefinedProperties - Whether to ignore undefined properties\n * rather than throw.\n * @param fieldTransforms - A mutable list of field transforms encountered\n * while parsing the data.\n * @param fieldMask - A mutable list of field paths encountered while parsing\n * the data.\n *\n * TODO(b/34871131): We don't support array paths right now, so path can be\n * null to indicate the context represents any location within an array (in\n * which case certain features will not work and errors will be somewhat\n * compromised).\n */\n constructor(\n readonly settings: ContextSettings,\n readonly databaseId: DatabaseId,\n readonly serializer: JsonProtoSerializer,\n readonly ignoreUndefinedProperties: boolean,\n fieldTransforms?: FieldTransform[],\n fieldMask?: InternalFieldPath[]\n ) {\n // Minor hack: If fieldTransforms is undefined, we assume this is an\n // external call and we need to validate the entire path.\n if (fieldTransforms === undefined) {\n this.validatePath();\n }\n this.fieldTransforms = fieldTransforms || [];\n this.fieldMask = fieldMask || [];\n }\n\n get path(): InternalFieldPath | undefined {\n return this.settings.path;\n }\n\n get dataSource(): UserDataSource {\n return this.settings.dataSource;\n }\n\n /** Returns a new context with the specified settings overwritten. */\n contextWith(configuration: Partial<ContextSettings>): ParseContextImpl {\n return new ParseContextImpl(\n { ...this.settings, ...configuration },\n this.databaseId,\n this.serializer,\n this.ignoreUndefinedProperties,\n this.fieldTransforms,\n this.fieldMask\n );\n }\n\n childContextForField(field: string): ParseContextImpl {\n const childPath = this.path?.child(field);\n const context = this.contextWith({ path: childPath, arrayElement: false });\n context.validatePathSegment(field);\n return context;\n }\n\n childContextForFieldPath(field: InternalFieldPath): ParseContextImpl {\n const childPath = this.path?.child(field);\n const context = this.contextWith({ path: childPath, arrayElement: false });\n context.validatePath();\n return context;\n }\n\n childContextForArray(index: number): ParseContextImpl {\n // TODO(b/34871131): We don't support array paths right now; so make path\n // undefined.\n return this.contextWith({ path: undefined, arrayElement: true });\n }\n\n createError(reason: string): FirestoreError {\n return createError(\n reason,\n this.settings.methodName,\n this.settings.hasConverter || false,\n this.path,\n this.settings.targetDoc\n );\n }\n\n /** Returns 'true' if 'fieldPath' was traversed when creating this context. */\n contains(fieldPath: InternalFieldPath): boolean {\n return (\n this.fieldMask.find(field => fieldPath.isPrefixOf(field)) !== undefined ||\n this.fieldTransforms.find(transform =>\n fieldPath.isPrefixOf(transform.field)\n ) !== undefined\n );\n }\n\n private validatePath(): void {\n // TODO(b/34871131): Remove null check once we have proper paths for fields\n // within arrays.\n if (!this.path) {\n return;\n }\n for (let i = 0; i < this.path.length; i++) {\n this.validatePathSegment(this.path.get(i));\n }\n }\n\n private validatePathSegment(segment: string): void {\n if (segment.length === 0) {\n throw this.createError('Document fields must not be empty');\n }\n if (isWrite(this.dataSource) && RESERVED_FIELD_REGEX.test(segment)) {\n throw this.createError('Document fields cannot begin and end with \"__\"');\n }\n }\n}\n\n/**\n * Helper for parsing raw user input (provided via the API) into internal model\n * classes.\n */\nexport class UserDataReader {\n private readonly serializer: JsonProtoSerializer;\n\n constructor(\n private readonly databaseId: DatabaseId,\n private readonly ignoreUndefinedProperties: boolean,\n serializer?: JsonProtoSerializer\n ) {\n this.serializer = serializer || newSerializer(databaseId);\n }\n\n /** Creates a new top-level parse context. */\n createContext(\n dataSource: UserDataSource,\n methodName: string,\n targetDoc?: DocumentKey,\n hasConverter = false\n ): ParseContextImpl {\n return new ParseContextImpl(\n {\n dataSource,\n methodName,\n targetDoc,\n path: InternalFieldPath.emptyPath(),\n arrayElement: false,\n hasConverter\n },\n this.databaseId,\n this.serializer,\n this.ignoreUndefinedProperties\n );\n }\n}\n\nexport function newUserDataReader(\n firestore: FirebaseFirestore\n): UserDataReader {\n const settings = firestore._freezeSettings();\n const serializer = newSerializer(firestore._databaseId);\n return new UserDataReader(\n firestore._databaseId,\n !!settings.ignoreUndefinedProperties,\n serializer\n );\n}\n\n/** Parse document data from a set() call. */\nexport function parseSetData(\n userDataReader: UserDataReader,\n methodName: string,\n targetDoc: DocumentKey,\n input: unknown,\n hasConverter: boolean,\n options: SetOptions = {}\n): ParsedSetData {\n const context = userDataReader.createContext(\n options.merge || options.mergeFields\n ? UserDataSource.MergeSet\n : UserDataSource.Set,\n methodName,\n targetDoc,\n hasConverter\n );\n validatePlainObject('Data must be an object, but it was:', context, input);\n const updateData = parseObject(input, context)!;\n\n let fieldMask: FieldMask | null;\n let fieldTransforms: FieldTransform[];\n\n if (options.merge) {\n fieldMask = new FieldMask(context.fieldMask);\n fieldTransforms = context.fieldTransforms;\n } else if (options.mergeFields) {\n const validatedFieldPaths: InternalFieldPath[] = [];\n\n for (const stringOrFieldPath of options.mergeFields) {\n const fieldPath = fieldPathFromArgument(\n methodName,\n stringOrFieldPath,\n targetDoc\n );\n if (!context.contains(fieldPath)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Field '${fieldPath}' is specified in your field mask but missing from your input data.`\n );\n }\n\n if (!fieldMaskContains(validatedFieldPaths, fieldPath)) {\n validatedFieldPaths.push(fieldPath);\n }\n }\n\n fieldMask = new FieldMask(validatedFieldPaths);\n fieldTransforms = context.fieldTransforms.filter(transform =>\n fieldMask!.covers(transform.field)\n );\n } else {\n fieldMask = null;\n fieldTransforms = context.fieldTransforms;\n }\n\n return new ParsedSetData(\n new ObjectValue(updateData),\n fieldMask,\n fieldTransforms\n );\n}\n\nexport class DeleteFieldValueImpl extends FieldValue {\n _toFieldTransform(context: ParseContextImpl): null {\n if (context.dataSource === UserDataSource.MergeSet) {\n // No transform to add for a delete, but we need to add it to our\n // fieldMask so it gets deleted.\n context.fieldMask.push(context.path!);\n } else if (context.dataSource === UserDataSource.Update) {\n debugAssert(\n context.path!.length > 0,\n `${this._methodName}() at the top level should have already ` +\n 'been handled.'\n );\n throw context.createError(\n `${this._methodName}() can only appear at the top level ` +\n 'of your update data'\n );\n } else {\n // We shouldn't encounter delete sentinels for queries or non-merge set() calls.\n throw context.createError(\n `${this._methodName}() cannot be used with set() unless you pass ` +\n '{merge:true}'\n );\n }\n return null;\n }\n\n isEqual(other: FieldValue): boolean {\n return other instanceof DeleteFieldValueImpl;\n }\n}\n\n/**\n * Creates a child context for parsing SerializableFieldValues.\n *\n * This is different than calling `ParseContext.contextWith` because it keeps\n * the fieldTransforms and fieldMask separate.\n *\n * The created context has its `dataSource` set to `UserDataSource.Argument`.\n * Although these values are used with writes, any elements in these FieldValues\n * are not considered writes since they cannot contain any FieldValue sentinels,\n * etc.\n *\n * @param fieldValue - The sentinel FieldValue for which to create a child\n * context.\n * @param context - The parent context.\n * @param arrayElement - Whether or not the FieldValue has an array.\n */\nfunction createSentinelChildContext(\n fieldValue: FieldValue,\n context: ParseContextImpl,\n arrayElement: boolean\n): ParseContextImpl {\n return new ParseContextImpl(\n {\n dataSource: UserDataSource.Argument,\n targetDoc: context.settings.targetDoc,\n methodName: fieldValue._methodName,\n arrayElement\n },\n context.databaseId,\n context.serializer,\n context.ignoreUndefinedProperties\n );\n}\n\nexport class ServerTimestampFieldValueImpl extends FieldValue {\n _toFieldTransform(context: ParseContextImpl): FieldTransform {\n return new FieldTransform(context.path!, new ServerTimestampTransform());\n }\n\n isEqual(other: FieldValue): boolean {\n return other instanceof ServerTimestampFieldValueImpl;\n }\n}\n\nexport class ArrayUnionFieldValueImpl extends FieldValue {\n constructor(methodName: string, private readonly _elements: unknown[]) {\n super(methodName);\n }\n\n _toFieldTransform(context: ParseContextImpl): FieldTransform {\n const parseContext = createSentinelChildContext(\n this,\n context,\n /*array=*/ true\n );\n const parsedElements = this._elements.map(\n element => parseData(element, parseContext)!\n );\n const arrayUnion = new ArrayUnionTransformOperation(parsedElements);\n return new FieldTransform(context.path!, arrayUnion);\n }\n\n isEqual(other: FieldValue): boolean {\n // TODO(mrschmidt): Implement isEquals\n return this === other;\n }\n}\n\nexport class ArrayRemoveFieldValueImpl extends FieldValue {\n constructor(methodName: string, readonly _elements: unknown[]) {\n super(methodName);\n }\n\n _toFieldTransform(context: ParseContextImpl): FieldTransform {\n const parseContext = createSentinelChildContext(\n this,\n context,\n /*array=*/ true\n );\n const parsedElements = this._elements.map(\n element => parseData(element, parseContext)!\n );\n const arrayUnion = new ArrayRemoveTransformOperation(parsedElements);\n return new FieldTransform(context.path!, arrayUnion);\n }\n\n isEqual(other: FieldValue): boolean {\n // TODO(mrschmidt): Implement isEquals\n return this === other;\n }\n}\n\nexport class NumericIncrementFieldValueImpl extends FieldValue {\n constructor(methodName: string, private readonly _operand: number) {\n super(methodName);\n }\n\n _toFieldTransform(context: ParseContextImpl): FieldTransform {\n const numericIncrement = new NumericIncrementTransformOperation(\n context.serializer,\n toNumber(context.serializer, this._operand)\n );\n return new FieldTransform(context.path!, numericIncrement);\n }\n\n isEqual(other: FieldValue): boolean {\n // TODO(mrschmidt): Implement isEquals\n return this === other;\n }\n}\n\n/** Parse update data from an update() call. */\nexport function parseUpdateData(\n userDataReader: UserDataReader,\n methodName: string,\n targetDoc: DocumentKey,\n input: unknown\n): ParsedUpdateData {\n const context = userDataReader.createContext(\n UserDataSource.Update,\n methodName,\n targetDoc\n );\n validatePlainObject('Data must be an object, but it was:', context, input);\n\n const fieldMaskPaths: InternalFieldPath[] = [];\n const updateData = ObjectValue.empty();\n forEach(input as Dict<unknown>, (key, value) => {\n const path = fieldPathFromDotSeparatedString(methodName, key, targetDoc);\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n value = getModularInstance(value);\n\n const childContext = context.childContextForFieldPath(path);\n if (value instanceof DeleteFieldValueImpl) {\n // Add it to the field mask, but don't add anything to updateData.\n fieldMaskPaths.push(path);\n } else {\n const parsedValue = parseData(value, childContext);\n if (parsedValue != null) {\n fieldMaskPaths.push(path);\n updateData.set(path, parsedValue);\n }\n }\n });\n\n const mask = new FieldMask(fieldMaskPaths);\n return new ParsedUpdateData(updateData, mask, context.fieldTransforms);\n}\n\n/** Parse update data from a list of field/value arguments. */\nexport function parseUpdateVarargs(\n userDataReader: UserDataReader,\n methodName: string,\n targetDoc: DocumentKey,\n field: string | PublicFieldPath | Compat<PublicFieldPath>,\n value: unknown,\n moreFieldsAndValues: unknown[]\n): ParsedUpdateData {\n const context = userDataReader.createContext(\n UserDataSource.Update,\n methodName,\n targetDoc\n );\n const keys = [fieldPathFromArgument(methodName, field, targetDoc)];\n const values = [value];\n\n if (moreFieldsAndValues.length % 2 !== 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Function ${methodName}() needs to be called with an even number ` +\n 'of arguments that alternate between field names and values.'\n );\n }\n\n for (let i = 0; i < moreFieldsAndValues.length; i += 2) {\n keys.push(\n fieldPathFromArgument(\n methodName,\n moreFieldsAndValues[i] as string | PublicFieldPath\n )\n );\n values.push(moreFieldsAndValues[i + 1]);\n }\n\n const fieldMaskPaths: InternalFieldPath[] = [];\n const updateData = ObjectValue.empty();\n\n // We iterate in reverse order to pick the last value for a field if the\n // user specified the field multiple times.\n for (let i = keys.length - 1; i >= 0; --i) {\n if (!fieldMaskContains(fieldMaskPaths, keys[i])) {\n const path = keys[i];\n let value = values[i];\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n value = getModularInstance(value);\n\n const childContext = context.childContextForFieldPath(path);\n if (value instanceof DeleteFieldValueImpl) {\n // Add it to the field mask, but don't add anything to updateData.\n fieldMaskPaths.push(path);\n } else {\n const parsedValue = parseData(value, childContext);\n if (parsedValue != null) {\n fieldMaskPaths.push(path);\n updateData.set(path, parsedValue);\n }\n }\n }\n }\n\n const mask = new FieldMask(fieldMaskPaths);\n return new ParsedUpdateData(updateData, mask, context.fieldTransforms);\n}\n\n/**\n * Parse a \"query value\" (e.g. value in a where filter or a value in a cursor\n * bound).\n *\n * @param allowArrays - Whether the query value is an array that may directly\n * contain additional arrays (e.g. the operand of an `in` query).\n */\nexport function parseQueryValue(\n userDataReader: UserDataReader,\n methodName: string,\n input: unknown,\n allowArrays = false\n): ProtoValue {\n const context = userDataReader.createContext(\n allowArrays ? UserDataSource.ArrayArgument : UserDataSource.Argument,\n methodName\n );\n const parsed = parseData(input, context);\n debugAssert(parsed != null, 'Parsed data should not be null.');\n debugAssert(\n context.fieldTransforms.length === 0,\n 'Field transforms should have been disallowed.'\n );\n return parsed;\n}\n\n/**\n * Parses user data to Protobuf Values.\n *\n * @param input - Data to be parsed.\n * @param context - A context object representing the current path being parsed,\n * the source of the data being parsed, etc.\n * @returns The parsed value, or null if the value was a FieldValue sentinel\n * that should not be included in the resulting parsed data.\n */\nexport function parseData(\n input: unknown,\n context: ParseContextImpl\n): ProtoValue | null {\n // Unwrap the API type from the Compat SDK. This will return the API type\n // from firestore-exp.\n input = getModularInstance(input);\n\n if (looksLikeJsonObject(input)) {\n validatePlainObject('Unsupported field value:', context, input);\n return parseObject(input, context);\n } else if (input instanceof FieldValue) {\n // FieldValues usually parse into transforms (except FieldValue.delete())\n // in which case we do not want to include this field in our parsed data\n // (as doing so will overwrite the field directly prior to the transform\n // trying to transform it). So we don't add this location to\n // context.fieldMask and we return null as our parsing result.\n parseSentinelFieldValue(input, context);\n return null;\n } else if (input === undefined && context.ignoreUndefinedProperties) {\n // If the input is undefined it can never participate in the fieldMask, so\n // don't handle this below. If `ignoreUndefinedProperties` is false,\n // `parseScalarValue` will reject an undefined value.\n return null;\n } else {\n // If context.path is null we are inside an array and we don't support\n // field mask paths more granular than the top-level array.\n if (context.path) {\n context.fieldMask.push(context.path);\n }\n\n if (input instanceof Array) {\n // TODO(b/34871131): Include the path containing the array in the error\n // message.\n // In the case of IN queries, the parsed data is an array (representing\n // the set of values to be included for the IN query) that may directly\n // contain additional arrays (each representing an individual field\n // value), so we disable this validation.\n if (\n context.settings.arrayElement &&\n context.dataSource !== UserDataSource.ArrayArgument\n ) {\n throw context.createError('Nested arrays are not supported');\n }\n return parseArray(input as unknown[], context);\n } else {\n return parseScalarValue(input, context);\n }\n }\n}\n\nfunction parseObject(\n obj: Dict<unknown>,\n context: ParseContextImpl\n): { mapValue: ProtoMapValue } {\n const fields: Dict<ProtoValue> = {};\n\n if (isEmpty(obj)) {\n // If we encounter an empty object, we explicitly add it to the update\n // mask to ensure that the server creates a map entry.\n if (context.path && context.path.length > 0) {\n context.fieldMask.push(context.path);\n }\n } else {\n forEach(obj, (key: string, val: unknown) => {\n const parsedValue = parseData(val, context.childContextForField(key));\n if (parsedValue != null) {\n fields[key] = parsedValue;\n }\n });\n }\n\n return { mapValue: { fields } };\n}\n\nfunction parseArray(array: unknown[], context: ParseContextImpl): ProtoValue {\n const values: ProtoValue[] = [];\n let entryIndex = 0;\n for (const entry of array) {\n let parsedEntry = parseData(\n entry,\n context.childContextForArray(entryIndex)\n );\n if (parsedEntry == null) {\n // Just include nulls in the array for fields being replaced with a\n // sentinel.\n parsedEntry = { nullValue: 'NULL_VALUE' };\n }\n values.push(parsedEntry);\n entryIndex++;\n }\n return { arrayValue: { values } };\n}\n\n/**\n * \"Parses\" the provided FieldValueImpl, adding any necessary transforms to\n * context.fieldTransforms.\n */\nfunction parseSentinelFieldValue(\n value: FieldValue,\n context: ParseContextImpl\n): void {\n // Sentinels are only supported with writes, and not within arrays.\n if (!isWrite(context.dataSource)) {\n throw context.createError(\n `${value._methodName}() can only be used with update() and set()`\n );\n }\n if (!context.path) {\n throw context.createError(\n `${value._methodName}() is not currently supported inside arrays`\n );\n }\n\n const fieldTransform = value._toFieldTransform(context);\n if (fieldTransform) {\n context.fieldTransforms.push(fieldTransform);\n }\n}\n\n/**\n * Helper to parse a scalar value (i.e. not an Object, Array, or FieldValue)\n *\n * @returns The parsed value\n */\nfunction parseScalarValue(\n value: unknown,\n context: ParseContextImpl\n): ProtoValue | null {\n value = getModularInstance(value);\n\n if (value === null) {\n return { nullValue: 'NULL_VALUE' };\n } else if (typeof value === 'number') {\n return toNumber(context.serializer, value);\n } else if (typeof value === 'boolean') {\n return { booleanValue: value };\n } else if (typeof value === 'string') {\n return { stringValue: value };\n } else if (value instanceof Date) {\n const timestamp = Timestamp.fromDate(value);\n return {\n timestampValue: toTimestamp(context.serializer, timestamp)\n };\n } else if (value instanceof Timestamp) {\n // Firestore backend truncates precision down to microseconds. To ensure\n // offline mode works the same with regards to truncation, perform the\n // truncation immediately without waiting for the backend to do that.\n const timestamp = new Timestamp(\n value.seconds,\n Math.floor(value.nanoseconds / 1000) * 1000\n );\n return {\n timestampValue: toTimestamp(context.serializer, timestamp)\n };\n } else if (value instanceof GeoPoint) {\n return {\n geoPointValue: {\n latitude: value.latitude,\n longitude: value.longitude\n }\n };\n } else if (value instanceof Bytes) {\n return { bytesValue: toBytes(context.serializer, value._byteString) };\n } else if (value instanceof DocumentReference) {\n const thisDb = context.databaseId;\n const otherDb = value.firestore._databaseId;\n if (!otherDb.isEqual(thisDb)) {\n throw context.createError(\n 'Document reference is for database ' +\n `${otherDb.projectId}/${otherDb.database} but should be ` +\n `for database ${thisDb.projectId}/${thisDb.database}`\n );\n }\n return {\n referenceValue: toResourceName(\n value.firestore._databaseId || context.databaseId,\n value._key.path\n )\n };\n } else {\n throw context.createError(\n `Unsupported field value: ${valueDescription(value)}`\n );\n }\n}\n\n/**\n * Checks whether an object looks like a JSON object that should be converted\n * into a struct. Normal class/prototype instances are considered to look like\n * JSON objects since they should be converted to a struct value. Arrays, Dates,\n * GeoPoints, etc. are not considered to look like JSON objects since they map\n * to specific FieldValue types other than ObjectValue.\n */\nfunction looksLikeJsonObject(input: unknown): boolean {\n return (\n typeof input === 'object' &&\n input !== null &&\n !(input instanceof Array) &&\n !(input instanceof Date) &&\n !(input instanceof Timestamp) &&\n !(input instanceof GeoPoint) &&\n !(input instanceof Bytes) &&\n !(input instanceof DocumentReference) &&\n !(input instanceof FieldValue)\n );\n}\n\nfunction validatePlainObject(\n message: string,\n context: ParseContextImpl,\n input: unknown\n): asserts input is Dict<unknown> {\n if (!looksLikeJsonObject(input) || !isPlainObject(input)) {\n const description = valueDescription(input);\n if (description === 'an object') {\n // Massage the error if it was an object.\n throw context.createError(message + ' a custom object');\n } else {\n throw context.createError(message + ' ' + description);\n }\n }\n}\n\n/**\n * Helper that calls fromDotSeparatedString() but wraps any error thrown.\n */\nexport function fieldPathFromArgument(\n methodName: string,\n path: string | PublicFieldPath | Compat<PublicFieldPath>,\n targetDoc?: DocumentKey\n): InternalFieldPath {\n // If required, replace the FieldPath Compat class with with the firestore-exp\n // FieldPath.\n path = getModularInstance(path);\n\n if (path instanceof FieldPath) {\n return path._internalPath;\n } else if (typeof path === 'string') {\n return fieldPathFromDotSeparatedString(methodName, path);\n } else {\n const message = 'Field path arguments must be of type string or FieldPath.';\n throw createError(\n message,\n methodName,\n /* hasConverter= */ false,\n /* path= */ undefined,\n targetDoc\n );\n }\n}\n\n/**\n * Matches any characters in a field path string that are reserved.\n */\nconst FIELD_PATH_RESERVED = new RegExp('[~\\\\*/\\\\[\\\\]]');\n\n/**\n * Wraps fromDotSeparatedString with an error message about the method that\n * was thrown.\n * @param methodName - The publicly visible method name\n * @param path - The dot-separated string form of a field path which will be\n * split on dots.\n * @param targetDoc - The document against which the field path will be\n * evaluated.\n */\nexport function fieldPathFromDotSeparatedString(\n methodName: string,\n path: string,\n targetDoc?: DocumentKey\n): InternalFieldPath {\n const found = path.search(FIELD_PATH_RESERVED);\n if (found >= 0) {\n throw createError(\n `Invalid field path (${path}). Paths must not contain ` +\n `'~', '*', '/', '[', or ']'`,\n methodName,\n /* hasConverter= */ false,\n /* path= */ undefined,\n targetDoc\n );\n }\n\n try {\n return new FieldPath(...path.split('.'))._internalPath;\n } catch (e) {\n throw createError(\n `Invalid field path (${path}). Paths must not be empty, ` +\n `begin with '.', end with '.', or contain '..'`,\n methodName,\n /* hasConverter= */ false,\n /* path= */ undefined,\n targetDoc\n );\n }\n}\n\nfunction createError(\n reason: string,\n methodName: string,\n hasConverter: boolean,\n path?: InternalFieldPath,\n targetDoc?: DocumentKey\n): FirestoreError {\n const hasPath = path && !path.isEmpty();\n const hasDocument = targetDoc !== undefined;\n let message = `Function ${methodName}() called with invalid data`;\n if (hasConverter) {\n message += ' (via `toFirestore()`)';\n }\n message += '. ';\n\n let description = '';\n if (hasPath || hasDocument) {\n description += ' (found';\n\n if (hasPath) {\n description += ` in field ${path}`;\n }\n if (hasDocument) {\n description += ` in document ${targetDoc}`;\n }\n description += ')';\n }\n\n return new FirestoreError(\n Code.INVALID_ARGUMENT,\n message + reason + description\n );\n}\n\n/** Checks `haystack` if FieldPath `needle` is present. Runs in O(n). */\nfunction fieldMaskContains(\n haystack: InternalFieldPath[],\n needle: InternalFieldPath\n): boolean {\n return haystack.some(v => v.isEqual(needle));\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Compat, getModularInstance } from '@firebase/util';\n\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldPath as InternalFieldPath } from '../model/path';\nimport { arrayEquals } from '../util/misc';\n\nimport { FirebaseFirestore } from './database';\nimport { FieldPath } from './field_path';\nimport {\n DocumentData,\n DocumentReference,\n Query,\n queryEqual,\n SetOptions\n} from './reference';\nimport {\n fieldPathFromDotSeparatedString,\n UntypedFirestoreDataConverter\n} from './user_data_reader';\nimport { AbstractUserDataWriter } from './user_data_writer';\n\n/**\n * Converter used by `withConverter()` to transform user objects of type `T`\n * into Firestore data.\n *\n * Using the converter allows you to specify generic type arguments when\n * storing and retrieving objects from Firestore.\n *\n * @example\n * ```typescript\n * class Post {\n * constructor(readonly title: string, readonly author: string) {}\n *\n * toString(): string {\n * return this.title + ', by ' + this.author;\n * }\n * }\n *\n * const postConverter = {\n * toFirestore(post: Post): firebase.firestore.DocumentData {\n * return {title: post.title, author: post.author};\n * },\n * fromFirestore(snapshot: firebase.firestore.QueryDocumentSnapshot): Post {\n * const data = snapshot.data(options)!;\n * return new Post(data.title, data.author);\n * }\n * };\n *\n * const postSnap = await firebase.firestore()\n * .collection('posts')\n * .withConverter(postConverter)\n * .doc().get();\n * const post = postSnap.data();\n * if (post !== undefined) {\n * post.title; // string\n * post.toString(); // Should be defined\n * post.someNonExistentProperty; // TS error\n * }\n * ```\n */\nexport interface FirestoreDataConverter<T> {\n /**\n * Called by the Firestore SDK to convert a custom model object of type `T`\n * into a plain Javascript object (suitable for writing directly to the\n * Firestore database). Used with {@link @firebase/firestore/lite#(setDoc:1)}, {@link @firebase/firestore/lite#(WriteBatch.set:1)}\n * and {@link @firebase/firestore/lite#(Transaction.set:1)}.\n */\n toFirestore(modelObject: T): DocumentData;\n\n /**\n * Called by the Firestore SDK to convert a custom model object of type `T`\n * into a plain Javascript object (suitable for writing directly to the\n * Firestore database). Used with {@link @firebase/firestore/lite#(setDoc:1)}, {@link @firebase/firestore/lite#(WriteBatch.set:1)}\n * and {@link @firebase/firestore/lite#(Transaction.set:1)} with `merge:true` or `mergeFields`.\n */\n toFirestore(modelObject: Partial<T>, options: SetOptions): DocumentData;\n\n /**\n * Called by the Firestore SDK to convert Firestore data into an object of\n * type T. You can access your data by calling: `snapshot.data()`.\n *\n * @param snapshot - A `QueryDocumentSnapshot` containing your data and\n * metadata.\n */\n fromFirestore(snapshot: QueryDocumentSnapshot<DocumentData>): T;\n}\n\n/**\n * A `DocumentSnapshot` contains data read from a document in your Firestore\n * database. The data can be extracted with `.data()` or `.get(<field>)` to\n * get a specific field.\n *\n * For a `DocumentSnapshot` that points to a non-existing document, any data\n * access will return 'undefined'. You can use the `exists()` method to\n * explicitly verify a document's existence.\n */\nexport class DocumentSnapshot<T = DocumentData> {\n // Note: This class is stripped down version of the DocumentSnapshot in\n // the legacy SDK. The changes are:\n // - No support for SnapshotMetadata.\n // - No support for SnapshotOptions.\n\n /** @hideconstructor protected */\n constructor(\n public _firestore: FirebaseFirestore,\n public _userDataWriter: AbstractUserDataWriter,\n public _key: DocumentKey,\n public _document: Document | null,\n public _converter: UntypedFirestoreDataConverter<T> | null\n ) {}\n\n /** Property of the `DocumentSnapshot` that provides the document's ID. */\n get id(): string {\n return this._key.path.lastSegment();\n }\n\n /**\n * The `DocumentReference` for the document included in the `DocumentSnapshot`.\n */\n get ref(): DocumentReference<T> {\n return new DocumentReference<T>(\n this._firestore,\n this._converter,\n this._key\n );\n }\n\n /**\n * Signals whether or not the document at the snapshot's location exists.\n *\n * @returns true if the document exists.\n */\n exists(): this is QueryDocumentSnapshot<T> {\n return this._document !== null;\n }\n\n /**\n * Retrieves all fields in the document as an `Object`. Returns `undefined` if\n * the document doesn't exist.\n *\n * @returns An `Object` containing all fields in the document or `undefined`\n * if the document doesn't exist.\n */\n data(): T | undefined {\n if (!this._document) {\n return undefined;\n } else if (this._converter) {\n // We only want to use the converter and create a new DocumentSnapshot\n // if a converter has been provided.\n const snapshot = new QueryDocumentSnapshot(\n this._firestore,\n this._userDataWriter,\n this._key,\n this._document,\n /* converter= */ null\n );\n return this._converter.fromFirestore(snapshot);\n } else {\n return this._userDataWriter.convertValue(this._document.data.value) as T;\n }\n }\n\n /**\n * Retrieves the field specified by `fieldPath`. Returns `undefined` if the\n * document or field doesn't exist.\n *\n * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific\n * field.\n * @returns The data at the specified field location or undefined if no such\n * field exists in the document.\n */\n // We are using `any` here to avoid an explicit cast by our users.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(fieldPath: string | FieldPath): any {\n if (this._document) {\n const value = this._document.data.field(\n fieldPathFromArgument('DocumentSnapshot.get', fieldPath)\n );\n if (value !== null) {\n return this._userDataWriter.convertValue(value);\n }\n }\n return undefined;\n }\n}\n\n/**\n * A `QueryDocumentSnapshot` contains data read from a document in your\n * Firestore database as part of a query. The document is guaranteed to exist\n * and its data can be extracted with `.data()` or `.get(<field>)` to get a\n * specific field.\n *\n * A `QueryDocumentSnapshot` offers the same API surface as a\n * `DocumentSnapshot`. Since query results contain only existing documents, the\n * `exists` property will always be true and `data()` will never return\n * 'undefined'.\n */\nexport class QueryDocumentSnapshot<\n T = DocumentData\n> extends DocumentSnapshot<T> {\n /**\n * Retrieves all fields in the document as an `Object`.\n *\n * @override\n * @returns An `Object` containing all fields in the document.\n */\n data(): T {\n return super.data() as T;\n }\n}\n\n/**\n * A `QuerySnapshot` contains zero or more `DocumentSnapshot` objects\n * representing the results of a query. The documents can be accessed as an\n * array via the `docs` property or enumerated using the `forEach` method. The\n * number of documents can be determined via the `empty` and `size`\n * properties.\n */\nexport class QuerySnapshot<T = DocumentData> {\n /**\n * The query on which you called {@link getDocs} in order to get this\n * `QuerySnapshot`.\n */\n readonly query: Query<T>;\n\n /** @hideconstructor */\n constructor(\n _query: Query<T>,\n readonly _docs: Array<QueryDocumentSnapshot<T>>\n ) {\n this.query = _query;\n }\n\n /** An array of all the documents in the `QuerySnapshot`. */\n get docs(): Array<QueryDocumentSnapshot<T>> {\n return [...this._docs];\n }\n\n /** The number of documents in the `QuerySnapshot`. */\n get size(): number {\n return this.docs.length;\n }\n\n /** True if there are no documents in the `QuerySnapshot`. */\n get empty(): boolean {\n return this.docs.length === 0;\n }\n\n /**\n * Enumerates all of the documents in the `QuerySnapshot`.\n *\n * @param callback - A callback to be called with a `QueryDocumentSnapshot` for\n * each document in the snapshot.\n * @param thisArg - The `this` binding for the callback.\n */\n forEach(\n callback: (result: QueryDocumentSnapshot<T>) => void,\n thisArg?: unknown\n ): void {\n this._docs.forEach(callback, thisArg);\n }\n}\n\n/**\n * Returns true if the provided snapshots are equal.\n *\n * @param left - A snapshot to compare.\n * @param right - A snapshot to compare.\n * @returns true if the snapshots are equal.\n */\nexport function snapshotEqual<T>(\n left: DocumentSnapshot<T> | QuerySnapshot<T>,\n right: DocumentSnapshot<T> | QuerySnapshot<T>\n): boolean {\n left = getModularInstance(left);\n right = getModularInstance(right);\n\n if (left instanceof DocumentSnapshot && right instanceof DocumentSnapshot) {\n return (\n left._firestore === right._firestore &&\n left._key.isEqual(right._key) &&\n (left._document === null\n ? right._document === null\n : left._document.isEqual(right._document)) &&\n left._converter === right._converter\n );\n } else if (left instanceof QuerySnapshot && right instanceof QuerySnapshot) {\n return (\n queryEqual(left.query, right.query) &&\n arrayEquals(left.docs, right.docs, snapshotEqual)\n );\n }\n\n return false;\n}\n\n/**\n * Helper that calls fromDotSeparatedString() but wraps any error thrown.\n */\nexport function fieldPathFromArgument(\n methodName: string,\n arg: string | FieldPath | Compat<FieldPath>\n): InternalFieldPath {\n if (typeof arg === 'string') {\n return fieldPathFromDotSeparatedString(methodName, arg);\n } else if (arg instanceof FieldPath) {\n return arg._internalPath;\n } else {\n return arg._delegate._internalPath;\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { newQueryComparator } from '../core/query';\nimport { ChangeType, ViewSnapshot } from '../core/view_snapshot';\nimport { FieldPath } from '../lite/field_path';\nimport { DocumentData, Query, queryEqual, SetOptions } from '../lite/reference';\nimport {\n DocumentSnapshot as LiteDocumentSnapshot,\n fieldPathFromArgument,\n FirestoreDataConverter as LiteFirestoreDataConverter\n} from '../lite/snapshot';\nimport { UntypedFirestoreDataConverter } from '../lite/user_data_reader';\nimport { AbstractUserDataWriter } from '../lite/user_data_writer';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { debugAssert, fail } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\n\nimport { FirebaseFirestore } from './database';\nimport { SnapshotListenOptions } from './reference_impl';\n\n/**\n * Converter used by `withConverter()` to transform user objects of type `T`\n * into Firestore data.\n *\n * Using the converter allows you to specify generic type arguments when\n * storing and retrieving objects from Firestore.\n *\n * @example\n * ```typescript\n * class Post {\n * constructor(readonly title: string, readonly author: string) {}\n *\n * toString(): string {\n * return this.title + ', by ' + this.author;\n * }\n * }\n *\n * const postConverter = {\n * toFirestore(post: Post): firebase.firestore.DocumentData {\n * return {title: post.title, author: post.author};\n * },\n * fromFirestore(\n * snapshot: firebase.firestore.QueryDocumentSnapshot,\n * options: firebase.firestore.SnapshotOptions\n * ): Post {\n * const data = snapshot.data(options)!;\n * return new Post(data.title, data.author);\n * }\n * };\n *\n * const postSnap = await firebase.firestore()\n * .collection('posts')\n * .withConverter(postConverter)\n * .doc().get();\n * const post = postSnap.data();\n * if (post !== undefined) {\n * post.title; // string\n * post.toString(); // Should be defined\n * post.someNonExistentProperty; // TS error\n * }\n * ```\n */\nexport interface FirestoreDataConverter<T>\n extends LiteFirestoreDataConverter<T> {\n /**\n * Called by the Firestore SDK to convert a custom model object of type `T`\n * into a plain JavaScript object (suitable for writing directly to the\n * Firestore database). To use `set()` with `merge` and `mergeFields`,\n * `toFirestore()` must be defined with `Partial<T>`.\n */\n toFirestore(modelObject: T): DocumentData;\n\n /**\n * Called by the Firestore SDK to convert a custom model object of type `T`\n * into a plain JavaScript object (suitable for writing directly to the\n * Firestore database). Used with {@link (setDoc:1)}, {@link (WriteBatch.set:1)}\n * and {@link (Transaction.set:1)} with `merge:true` or `mergeFields`.\n */\n toFirestore(modelObject: Partial<T>, options: SetOptions): DocumentData;\n\n /**\n * Called by the Firestore SDK to convert Firestore data into an object of\n * type T. You can access your data by calling: `snapshot.data(options)`.\n *\n * @param snapshot - A `QueryDocumentSnapshot` containing your data and metadata.\n * @param options - The `SnapshotOptions` from the initial call to `data()`.\n */\n fromFirestore(\n snapshot: QueryDocumentSnapshot<DocumentData>,\n options?: SnapshotOptions\n ): T;\n}\n\n/**\n * Options that configure how data is retrieved from a `DocumentSnapshot` (for\n * example the desired behavior for server timestamps that have not yet been set\n * to their final value).\n */\nexport interface SnapshotOptions {\n /**\n * If set, controls the return value for server timestamps that have not yet\n * been set to their final value.\n *\n * By specifying 'estimate', pending server timestamps return an estimate\n * based on the local clock. This estimate will differ from the final value\n * and cause these values to change once the server result becomes available.\n *\n * By specifying 'previous', pending timestamps will be ignored and return\n * their previous value instead.\n *\n * If omitted or set to 'none', `null` will be returned by default until the\n * server value becomes available.\n */\n readonly serverTimestamps?: 'estimate' | 'previous' | 'none';\n}\n\n/**\n * Metadata about a snapshot, describing the state of the snapshot.\n */\nexport class SnapshotMetadata {\n /**\n * True if the snapshot contains the result of local writes (for example\n * `set()` or `update()` calls) that have not yet been committed to the\n * backend. If your listener has opted into metadata updates (via\n * `SnapshotListenOptions`) you will receive another snapshot with\n * `hasPendingWrites` equal to false once the writes have been committed to\n * the backend.\n */\n readonly hasPendingWrites: boolean;\n\n /**\n * True if the snapshot was created from cached data rather than guaranteed\n * up-to-date server data. If your listener has opted into metadata updates\n * (via `SnapshotListenOptions`) you will receive another snapshot with\n * `fromCache` set to false once the client has received up-to-date data from\n * the backend.\n */\n readonly fromCache: boolean;\n\n /** @hideconstructor */\n constructor(hasPendingWrites: boolean, fromCache: boolean) {\n this.hasPendingWrites = hasPendingWrites;\n this.fromCache = fromCache;\n }\n\n /**\n * Returns true if this `SnapshotMetadata` is equal to the provided one.\n *\n * @param other - The `SnapshotMetadata` to compare against.\n * @returns true if this `SnapshotMetadata` is equal to the provided one.\n */\n isEqual(other: SnapshotMetadata): boolean {\n return (\n this.hasPendingWrites === other.hasPendingWrites &&\n this.fromCache === other.fromCache\n );\n }\n}\n\n/**\n * The type of a `DocumentChange` may be 'added', 'removed', or 'modified'.\n */\nexport type DocumentChangeType = 'added' | 'removed' | 'modified';\n\n/**\n * A `DocumentChange` represents a change to the documents matching a query.\n * It contains the document affected and the type of change that occurred.\n */\nexport interface DocumentChange<T = DocumentData> {\n /** The type of change ('added', 'modified', or 'removed'). */\n readonly type: DocumentChangeType;\n\n /** The document affected by this change. */\n readonly doc: QueryDocumentSnapshot<T>;\n\n /**\n * The index of the changed document in the result set immediately prior to\n * this `DocumentChange` (i.e. supposing that all prior `DocumentChange` objects\n * have been applied). Is `-1` for 'added' events.\n */\n readonly oldIndex: number;\n\n /**\n * The index of the changed document in the result set immediately after\n * this `DocumentChange` (i.e. supposing that all prior `DocumentChange`\n * objects and the current `DocumentChange` object have been applied).\n * Is -1 for 'removed' events.\n */\n readonly newIndex: number;\n}\n\n/**\n * A `DocumentSnapshot` contains data read from a document in your Firestore\n * database. The data can be extracted with `.data()` or `.get(<field>)` to\n * get a specific field.\n *\n * For a `DocumentSnapshot` that points to a non-existing document, any data\n * access will return 'undefined'. You can use the `exists()` method to\n * explicitly verify a document's existence.\n */\nexport class DocumentSnapshot<\n T = DocumentData\n> extends LiteDocumentSnapshot<T> {\n private readonly _firestoreImpl: FirebaseFirestore;\n\n /**\n * Metadata about the `DocumentSnapshot`, including information about its\n * source and local modifications.\n */\n readonly metadata: SnapshotMetadata;\n\n /** @hideconstructor protected */\n constructor(\n readonly _firestore: FirebaseFirestore,\n userDataWriter: AbstractUserDataWriter,\n key: DocumentKey,\n document: Document | null,\n metadata: SnapshotMetadata,\n converter: UntypedFirestoreDataConverter<T> | null\n ) {\n super(_firestore, userDataWriter, key, document, converter);\n this._firestoreImpl = _firestore;\n this.metadata = metadata;\n }\n\n /**\n * Property of the `DocumentSnapshot` that signals whether or not the data\n * exists. True if the document exists.\n */\n exists(): this is QueryDocumentSnapshot<T> {\n return super.exists();\n }\n\n /**\n * Retrieves all fields in the document as an `Object`. Returns `undefined` if\n * the document doesn't exist.\n *\n * By default, `FieldValue.serverTimestamp()` values that have not yet been\n * set to their final value will be returned as `null`. You can override\n * this by passing an options object.\n *\n * @param options - An options object to configure how data is retrieved from\n * the snapshot (for example the desired behavior for server timestamps that\n * have not yet been set to their final value).\n * @returns An `Object` containing all fields in the document or `undefined` if\n * the document doesn't exist.\n */\n data(options: SnapshotOptions = {}): T | undefined {\n if (!this._document) {\n return undefined;\n } else if (this._converter) {\n // We only want to use the converter and create a new DocumentSnapshot\n // if a converter has been provided.\n const snapshot = new QueryDocumentSnapshot(\n this._firestore,\n this._userDataWriter,\n this._key,\n this._document,\n this.metadata,\n /* converter= */ null\n );\n return this._converter.fromFirestore(snapshot, options);\n } else {\n return this._userDataWriter.convertValue(\n this._document.data.value,\n options.serverTimestamps\n ) as T;\n }\n }\n\n /**\n * Retrieves the field specified by `fieldPath`. Returns `undefined` if the\n * document or field doesn't exist.\n *\n * By default, a `FieldValue.serverTimestamp()` that has not yet been set to\n * its final value will be returned as `null`. You can override this by\n * passing an options object.\n *\n * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific\n * field.\n * @param options - An options object to configure how the field is retrieved\n * from the snapshot (for example the desired behavior for server timestamps\n * that have not yet been set to their final value).\n * @returns The data at the specified field location or undefined if no such\n * field exists in the document.\n */\n // We are using `any` here to avoid an explicit cast by our users.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(fieldPath: string | FieldPath, options: SnapshotOptions = {}): any {\n if (this._document) {\n const value = this._document.data.field(\n fieldPathFromArgument('DocumentSnapshot.get', fieldPath)\n );\n if (value !== null) {\n return this._userDataWriter.convertValue(\n value,\n options.serverTimestamps\n );\n }\n }\n return undefined;\n }\n}\n\n/**\n * A `QueryDocumentSnapshot` contains data read from a document in your\n * Firestore database as part of a query. The document is guaranteed to exist\n * and its data can be extracted with `.data()` or `.get(<field>)` to get a\n * specific field.\n *\n * A `QueryDocumentSnapshot` offers the same API surface as a\n * `DocumentSnapshot`. Since query results contain only existing documents, the\n * `exists` property will always be true and `data()` will never return\n * 'undefined'.\n */\nexport class QueryDocumentSnapshot<\n T = DocumentData\n> extends DocumentSnapshot<T> {\n /**\n * Retrieves all fields in the document as an `Object`.\n *\n * By default, `FieldValue.serverTimestamp()` values that have not yet been\n * set to their final value will be returned as `null`. You can override\n * this by passing an options object.\n *\n * @override\n * @param options - An options object to configure how data is retrieved from\n * the snapshot (for example the desired behavior for server timestamps that\n * have not yet been set to their final value).\n * @returns An `Object` containing all fields in the document.\n */\n data(options: SnapshotOptions = {}): T {\n return super.data(options) as T;\n }\n}\n\n/**\n * A `QuerySnapshot` contains zero or more `DocumentSnapshot` objects\n * representing the results of a query. The documents can be accessed as an\n * array via the `docs` property or enumerated using the `forEach` method. The\n * number of documents can be determined via the `empty` and `size`\n * properties.\n */\nexport class QuerySnapshot<T = DocumentData> {\n /**\n * Metadata about this snapshot, concerning its source and if it has local\n * modifications.\n */\n readonly metadata: SnapshotMetadata;\n\n /**\n * The query on which you called `get` or `onSnapshot` in order to get this\n * `QuerySnapshot`.\n */\n readonly query: Query<T>;\n\n private _cachedChanges?: Array<DocumentChange<T>>;\n private _cachedChangesIncludeMetadataChanges?: boolean;\n\n /** @hideconstructor */\n constructor(\n readonly _firestore: FirebaseFirestore,\n readonly _userDataWriter: AbstractUserDataWriter,\n query: Query<T>,\n readonly _snapshot: ViewSnapshot\n ) {\n this.metadata = new SnapshotMetadata(\n _snapshot.hasPendingWrites,\n _snapshot.fromCache\n );\n this.query = query;\n }\n\n /** An array of all the documents in the `QuerySnapshot`. */\n get docs(): Array<QueryDocumentSnapshot<T>> {\n const result: Array<QueryDocumentSnapshot<T>> = [];\n this.forEach(doc => result.push(doc));\n return result;\n }\n\n /** The number of documents in the `QuerySnapshot`. */\n get size(): number {\n return this._snapshot.docs.size;\n }\n\n /** True if there are no documents in the `QuerySnapshot`. */\n get empty(): boolean {\n return this.size === 0;\n }\n\n /**\n * Enumerates all of the documents in the `QuerySnapshot`.\n *\n * @param callback - A callback to be called with a `QueryDocumentSnapshot` for\n * each document in the snapshot.\n * @param thisArg - The `this` binding for the callback.\n */\n forEach(\n callback: (result: QueryDocumentSnapshot<T>) => void,\n thisArg?: unknown\n ): void {\n this._snapshot.docs.forEach(doc => {\n callback.call(\n thisArg,\n new QueryDocumentSnapshot<T>(\n this._firestore,\n this._userDataWriter,\n doc.key,\n doc,\n new SnapshotMetadata(\n this._snapshot.mutatedKeys.has(doc.key),\n this._snapshot.fromCache\n ),\n this.query.converter\n )\n );\n });\n }\n\n /**\n * Returns an array of the documents changes since the last snapshot. If this\n * is the first snapshot, all documents will be in the list as 'added'\n * changes.\n *\n * @param options - `SnapshotListenOptions` that control whether metadata-only\n * changes (i.e. only `DocumentSnapshot.metadata` changed) should trigger\n * snapshot events.\n */\n docChanges(options: SnapshotListenOptions = {}): Array<DocumentChange<T>> {\n const includeMetadataChanges = !!options.includeMetadataChanges;\n\n if (includeMetadataChanges && this._snapshot.excludesMetadataChanges) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'To include metadata changes with your document changes, you must ' +\n 'also pass { includeMetadataChanges:true } to onSnapshot().'\n );\n }\n\n if (\n !this._cachedChanges ||\n this._cachedChangesIncludeMetadataChanges !== includeMetadataChanges\n ) {\n this._cachedChanges = changesFromSnapshot(this, includeMetadataChanges);\n this._cachedChangesIncludeMetadataChanges = includeMetadataChanges;\n }\n\n return this._cachedChanges;\n }\n}\n\n/** Calculates the array of DocumentChanges for a given ViewSnapshot. */\nexport function changesFromSnapshot<T>(\n querySnapshot: QuerySnapshot<T>,\n includeMetadataChanges: boolean\n): Array<DocumentChange<T>> {\n if (querySnapshot._snapshot.oldDocs.isEmpty()) {\n // Special case the first snapshot because index calculation is easy and\n // fast\n let lastDoc: Document;\n let index = 0;\n return querySnapshot._snapshot.docChanges.map(change => {\n debugAssert(\n change.type === ChangeType.Added,\n 'Invalid event type for first snapshot'\n );\n debugAssert(\n !lastDoc ||\n newQueryComparator(querySnapshot._snapshot.query)(\n lastDoc,\n change.doc\n ) < 0,\n 'Got added events in wrong order'\n );\n const doc = new QueryDocumentSnapshot<T>(\n querySnapshot._firestore,\n querySnapshot._userDataWriter,\n change.doc.key,\n change.doc,\n new SnapshotMetadata(\n querySnapshot._snapshot.mutatedKeys.has(change.doc.key),\n querySnapshot._snapshot.fromCache\n ),\n querySnapshot.query.converter\n );\n lastDoc = change.doc;\n return {\n type: 'added' as DocumentChangeType,\n doc,\n oldIndex: -1,\n newIndex: index++\n };\n });\n } else {\n // A DocumentSet that is updated incrementally as changes are applied to use\n // to lookup the index of a document.\n let indexTracker = querySnapshot._snapshot.oldDocs;\n return querySnapshot._snapshot.docChanges\n .filter(\n change => includeMetadataChanges || change.type !== ChangeType.Metadata\n )\n .map(change => {\n const doc = new QueryDocumentSnapshot<T>(\n querySnapshot._firestore,\n querySnapshot._userDataWriter,\n change.doc.key,\n change.doc,\n new SnapshotMetadata(\n querySnapshot._snapshot.mutatedKeys.has(change.doc.key),\n querySnapshot._snapshot.fromCache\n ),\n querySnapshot.query.converter\n );\n let oldIndex = -1;\n let newIndex = -1;\n if (change.type !== ChangeType.Added) {\n oldIndex = indexTracker.indexOf(change.doc.key);\n debugAssert(oldIndex >= 0, 'Index for document not found');\n indexTracker = indexTracker.delete(change.doc.key);\n }\n if (change.type !== ChangeType.Removed) {\n indexTracker = indexTracker.add(change.doc);\n newIndex = indexTracker.indexOf(change.doc.key);\n }\n return {\n type: resultChangeType(change.type),\n doc,\n oldIndex,\n newIndex\n };\n });\n }\n}\n\nexport function resultChangeType(type: ChangeType): DocumentChangeType {\n switch (type) {\n case ChangeType.Added:\n return 'added';\n case ChangeType.Modified:\n case ChangeType.Metadata:\n return 'modified';\n case ChangeType.Removed:\n return 'removed';\n default:\n return fail('Unknown change type: ' + type);\n }\n}\n\n// TODO(firestoreexp): Add tests for snapshotEqual with different snapshot\n// metadata\n/**\n * Returns true if the provided snapshots are equal.\n *\n * @param left - A snapshot to compare.\n * @param right - A snapshot to compare.\n * @returns true if the snapshots are equal.\n */\nexport function snapshotEqual<T>(\n left: DocumentSnapshot<T> | QuerySnapshot<T>,\n right: DocumentSnapshot<T> | QuerySnapshot<T>\n): boolean {\n if (left instanceof DocumentSnapshot && right instanceof DocumentSnapshot) {\n return (\n left._firestore === right._firestore &&\n left._key.isEqual(right._key) &&\n (left._document === null\n ? right._document === null\n : left._document.isEqual(right._document)) &&\n left._converter === right._converter\n );\n } else if (left instanceof QuerySnapshot && right instanceof QuerySnapshot) {\n return (\n left._firestore === right._firestore &&\n queryEqual(left.query, right.query) &&\n left.metadata.isEqual(right.metadata) &&\n left._snapshot.isEqual(right._snapshot)\n );\n }\n\n return false;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance } from '@firebase/util';\n\nimport { DatabaseId } from '../core/database_info';\nimport {\n findFilterOperator,\n getFirstOrderByField,\n getInequalityFilterField,\n hasLimitToLast,\n isCollectionGroupQuery,\n LimitType,\n Query as InternalQuery,\n queryOrderBy,\n queryWithAddedFilter,\n queryWithAddedOrderBy,\n queryWithEndAt,\n queryWithLimit,\n queryWithStartAt\n} from '../core/query';\nimport {\n Bound,\n Direction,\n FieldFilter,\n Filter,\n Operator,\n OrderBy\n} from '../core/target';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldPath as InternalFieldPath, ResourcePath } from '../model/path';\nimport { isServerTimestamp } from '../model/server_timestamps';\nimport { refValue } from '../model/values';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { debugAssert } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\nimport {\n validatePositiveNumber,\n valueDescription\n} from '../util/input_validation';\n\nimport { FieldPath } from './field_path';\nimport { DocumentReference, Query } from './reference';\nimport { DocumentSnapshot, fieldPathFromArgument } from './snapshot';\nimport {\n newUserDataReader,\n parseQueryValue,\n UserDataReader\n} from './user_data_reader';\n\nexport function validateHasExplicitOrderByForLimitToLast(\n query: InternalQuery\n): void {\n if (hasLimitToLast(query) && query.explicitOrderBy.length === 0) {\n throw new FirestoreError(\n Code.UNIMPLEMENTED,\n 'limitToLast() queries require specifying at least one orderBy() clause'\n );\n }\n}\n\n/** Describes the different query constraints available in this SDK. */\nexport type QueryConstraintType =\n | 'where'\n | 'orderBy'\n | 'limit'\n | 'limitToLast'\n | 'startAt'\n | 'startAfter'\n | 'endAt'\n | 'endBefore';\n\n/**\n * A `QueryConstraint` is used to narrow the set of documents returned by a\n * Firestore query. `QueryConstraint`s are created by invoking {@link where},\n * {@link orderBy}, {@link (startAt:1)}, {@link (startAfter:1)}, {@link\n * endBefore:1}, {@link (endAt:1)}, {@link limit} or {@link limitToLast} and\n * can then be passed to {@link query} to create a new query instance that\n * also contains this `QueryConstraint`.\n */\nexport abstract class QueryConstraint {\n /** The type of this query constraints */\n abstract readonly type: QueryConstraintType;\n\n /**\n * Takes the provided `Query` and returns a copy of the `Query` with this\n * `QueryConstraint` applied.\n */\n abstract _apply<T>(query: Query<T>): Query<T>;\n}\n\n/**\n * Creates a new immutable instance of `Query` that is extended to also include\n * additional query constraints.\n *\n * @param query - The Query instance to use as a base for the new constraints.\n * @param queryConstraints - The list of `QueryConstraint`s to apply.\n * @throws if any of the provided query constraints cannot be combined with the\n * existing or new constraints.\n */\nexport function query<T>(\n query: Query<T>,\n ...queryConstraints: QueryConstraint[]\n): Query<T> {\n for (const constraint of queryConstraints) {\n query = constraint._apply(query);\n }\n return query;\n}\n\nclass QueryFilterConstraint extends QueryConstraint {\n readonly type = 'where';\n\n constructor(\n private readonly _field: InternalFieldPath,\n private _op: Operator,\n private _value: unknown\n ) {\n super();\n }\n\n _apply<T>(query: Query<T>): Query<T> {\n const reader = newUserDataReader(query.firestore);\n const filter = newQueryFilter(\n query._query,\n 'where',\n reader,\n query.firestore._databaseId,\n this._field,\n this._op,\n this._value\n );\n return new Query(\n query.firestore,\n query.converter,\n queryWithAddedFilter(query._query, filter)\n );\n }\n}\n\n/**\n * Filter conditions in a {@link where} clause are specified using the\n * strings '&lt;', '&lt;=', '==', '!=', '&gt;=', '&gt;', 'array-contains', 'in',\n * 'array-contains-any', and 'not-in'.\n */\nexport type WhereFilterOp =\n | '<'\n | '<='\n | '=='\n | '!='\n | '>='\n | '>'\n | 'array-contains'\n | 'in'\n | 'array-contains-any'\n | 'not-in';\n\n/**\n * Creates a `QueryConstraint` that enforces that documents must contain the\n * specified field and that the value should satisfy the relation constraint\n * provided.\n *\n * @param fieldPath - The path to compare\n * @param opStr - The operation string (e.g \"&lt;\", \"&lt;=\", \"==\", \"&lt;\",\n * \"&lt;=\", \"!=\").\n * @param value - The value for comparison\n * @returns The created `Query`.\n */\nexport function where(\n fieldPath: string | FieldPath,\n opStr: WhereFilterOp,\n value: unknown\n): QueryConstraint {\n const op = opStr as Operator;\n const field = fieldPathFromArgument('where', fieldPath);\n return new QueryFilterConstraint(field, op, value);\n}\n\nclass QueryOrderByConstraint extends QueryConstraint {\n readonly type = 'orderBy';\n\n constructor(\n private readonly _field: InternalFieldPath,\n private _direction: Direction\n ) {\n super();\n }\n\n _apply<T>(query: Query<T>): Query<T> {\n const orderBy = newQueryOrderBy(query._query, this._field, this._direction);\n return new Query(\n query.firestore,\n query.converter,\n queryWithAddedOrderBy(query._query, orderBy)\n );\n }\n}\n\n/**\n * The direction of a {@link orderBy} clause is specified as 'desc' or 'asc'\n * (descending or ascending).\n */\nexport type OrderByDirection = 'desc' | 'asc';\n\n/**\n * Creates a `QueryConstraint` that sorts the query result by the\n * specified field, optionally in descending order instead of ascending.\n *\n * @param fieldPath - The field to sort by.\n * @param directionStr - Optional direction to sort by ('asc' or 'desc'). If\n * not specified, order will be ascending.\n * @returns The created `Query`.\n */\nexport function orderBy(\n fieldPath: string | FieldPath,\n directionStr: OrderByDirection = 'asc'\n): QueryConstraint {\n const direction = directionStr as Direction;\n const path = fieldPathFromArgument('orderBy', fieldPath);\n return new QueryOrderByConstraint(path, direction);\n}\n\nclass QueryLimitConstraint extends QueryConstraint {\n constructor(\n readonly type: 'limit' | 'limitToLast',\n private readonly _limit: number,\n private readonly _limitType: LimitType\n ) {\n super();\n }\n\n _apply<T>(query: Query<T>): Query<T> {\n return new Query(\n query.firestore,\n query.converter,\n queryWithLimit(query._query, this._limit, this._limitType)\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` that only returns the first matching documents.\n *\n * @param limit - The maximum number of items to return.\n * @returns The created `Query`.\n */\nexport function limit(limit: number): QueryConstraint {\n validatePositiveNumber('limit', limit);\n return new QueryLimitConstraint('limit', limit, LimitType.First);\n}\n\n/**\n * Creates a `QueryConstraint` that only returns the last matching documents.\n *\n * You must specify at least one `orderBy` clause for `limitToLast` queries,\n * otherwise an exception will be thrown during execution.\n *\n * @param limit - The maximum number of items to return.\n * @returns The created `Query`.\n */\nexport function limitToLast(limit: number): QueryConstraint {\n validatePositiveNumber('limitToLast', limit);\n return new QueryLimitConstraint('limitToLast', limit, LimitType.Last);\n}\n\nclass QueryStartAtConstraint extends QueryConstraint {\n constructor(\n readonly type: 'startAt' | 'startAfter',\n private readonly _docOrFields: Array<unknown | DocumentSnapshot<unknown>>,\n private readonly _before: boolean\n ) {\n super();\n }\n\n _apply<T>(query: Query<T>): Query<T> {\n const bound = newQueryBoundFromDocOrFields(\n query,\n this.type,\n this._docOrFields,\n this._before\n );\n return new Query(\n query.firestore,\n query.converter,\n queryWithStartAt(query._query, bound)\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` that modifies the result set to start at the\n * provided document (inclusive). The starting position is relative to the order\n * of the query. The document must contain all of the fields provided in the\n * `orderBy` of this query.\n *\n * @param snapshot - The snapshot of the document to start at.\n * @returns A `QueryConstraint` to pass to `query()`.\n */\nexport function startAt(snapshot: DocumentSnapshot<unknown>): QueryConstraint;\n/**\n * Creates a `QueryConstraint` that modifies the result set to start at the\n * provided fields relative to the order of the query. The order of the field\n * values must match the order of the order by clauses of the query.\n *\n * @param fieldValues - The field values to start this query at, in order\n * of the query's order by.\n * @returns A `QueryConstraint` to pass to `query()`.\n */\nexport function startAt(...fieldValues: unknown[]): QueryConstraint;\nexport function startAt(\n ...docOrFields: Array<unknown | DocumentSnapshot<unknown>>\n): QueryConstraint {\n return new QueryStartAtConstraint('startAt', docOrFields, /*before=*/ true);\n}\n\n/**\n * Creates a `QueryConstraint` that modifies the result set to start after the\n * provided document (exclusive). The starting position is relative to the order\n * of the query. The document must contain all of the fields provided in the\n * orderBy of the query.\n *\n * @param snapshot - The snapshot of the document to start after.\n * @returns A `QueryConstraint` to pass to `query()`\n */\nexport function startAfter(\n snapshot: DocumentSnapshot<unknown>\n): QueryConstraint;\n/**\n * Creates a `QueryConstraint` that modifies the result set to start after the\n * provided fields relative to the order of the query. The order of the field\n * values must match the order of the order by clauses of the query.\n *\n * @param fieldValues - The field values to start this query after, in order\n * of the query's order by.\n * @returns A `QueryConstraint` to pass to `query()`\n */\nexport function startAfter(...fieldValues: unknown[]): QueryConstraint;\nexport function startAfter(\n ...docOrFields: Array<unknown | DocumentSnapshot<unknown>>\n): QueryConstraint {\n return new QueryStartAtConstraint(\n 'startAfter',\n docOrFields,\n /*before=*/ false\n );\n}\n\nclass QueryEndAtConstraint extends QueryConstraint {\n constructor(\n readonly type: 'endBefore' | 'endAt',\n private readonly _docOrFields: Array<unknown | DocumentSnapshot<unknown>>,\n private readonly _before: boolean\n ) {\n super();\n }\n\n _apply<T>(query: Query<T>): Query<T> {\n const bound = newQueryBoundFromDocOrFields(\n query,\n this.type,\n this._docOrFields,\n this._before\n );\n return new Query(\n query.firestore,\n query.converter,\n queryWithEndAt(query._query, bound)\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` that modifies the result set to end before the\n * provided document (exclusive). The end position is relative to the order of\n * the query. The document must contain all of the fields provided in the\n * orderBy of the query.\n *\n * @param snapshot - The snapshot of the document to end before.\n * @returns A `QueryConstraint` to pass to `query()`\n */\nexport function endBefore(snapshot: DocumentSnapshot<unknown>): QueryConstraint;\n/**\n * Creates a `QueryConstraint` that modifies the result set to end before the\n * provided fields relative to the order of the query. The order of the field\n * values must match the order of the order by clauses of the query.\n *\n * @param fieldValues - The field values to end this query before, in order\n * of the query's order by.\n * @returns A `QueryConstraint` to pass to `query()`\n */\nexport function endBefore(...fieldValues: unknown[]): QueryConstraint;\nexport function endBefore(\n ...docOrFields: Array<unknown | DocumentSnapshot<unknown>>\n): QueryConstraint {\n return new QueryEndAtConstraint('endBefore', docOrFields, /*before=*/ true);\n}\n\n/**\n * Creates a `QueryConstraint` that modifies the result set to end at the\n * provided document (inclusive). The end position is relative to the order of\n * the query. The document must contain all of the fields provided in the\n * orderBy of the query.\n *\n * @param snapshot - The snapshot of the document to end at.\n * @returns A `QueryConstraint` to pass to `query()`\n */\nexport function endAt(snapshot: DocumentSnapshot<unknown>): QueryConstraint;\n/**\n * Creates a `QueryConstraint` that modifies the result set to end at the\n * provided fields relative to the order of the query. The order of the field\n * values must match the order of the order by clauses of the query.\n *\n * @param fieldValues - The field values to end this query at, in order\n * of the query's order by.\n * @returns A `QueryConstraint` to pass to `query()`\n */\nexport function endAt(...fieldValues: unknown[]): QueryConstraint;\nexport function endAt(\n ...docOrFields: Array<unknown | DocumentSnapshot<unknown>>\n): QueryConstraint {\n return new QueryEndAtConstraint('endAt', docOrFields, /*before=*/ false);\n}\n\n/** Helper function to create a bound from a document or fields */\nfunction newQueryBoundFromDocOrFields<T>(\n query: Query,\n methodName: string,\n docOrFields: Array<unknown | DocumentSnapshot<T>>,\n before: boolean\n): Bound {\n docOrFields[0] = getModularInstance(docOrFields[0]);\n\n if (docOrFields[0] instanceof DocumentSnapshot) {\n return newQueryBoundFromDocument(\n query._query,\n query.firestore._databaseId,\n methodName,\n docOrFields[0]._document,\n before\n );\n } else {\n const reader = newUserDataReader(query.firestore);\n return newQueryBoundFromFields(\n query._query,\n query.firestore._databaseId,\n reader,\n methodName,\n docOrFields,\n before\n );\n }\n}\n\nexport function newQueryFilter(\n query: InternalQuery,\n methodName: string,\n dataReader: UserDataReader,\n databaseId: DatabaseId,\n fieldPath: InternalFieldPath,\n op: Operator,\n value: unknown\n): FieldFilter {\n let fieldValue: ProtoValue;\n if (fieldPath.isKeyField()) {\n if (op === Operator.ARRAY_CONTAINS || op === Operator.ARRAY_CONTAINS_ANY) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid Query. You can't perform '${op}' ` +\n 'queries on FieldPath.documentId().'\n );\n } else if (op === Operator.IN || op === Operator.NOT_IN) {\n validateDisjunctiveFilterElements(value, op);\n const referenceList: ProtoValue[] = [];\n for (const arrayValue of value as ProtoValue[]) {\n referenceList.push(parseDocumentIdValue(databaseId, query, arrayValue));\n }\n fieldValue = { arrayValue: { values: referenceList } };\n } else {\n fieldValue = parseDocumentIdValue(databaseId, query, value);\n }\n } else {\n if (\n op === Operator.IN ||\n op === Operator.NOT_IN ||\n op === Operator.ARRAY_CONTAINS_ANY\n ) {\n validateDisjunctiveFilterElements(value, op);\n }\n fieldValue = parseQueryValue(\n dataReader,\n methodName,\n value,\n /* allowArrays= */ op === Operator.IN || op === Operator.NOT_IN\n );\n }\n const filter = FieldFilter.create(fieldPath, op, fieldValue);\n validateNewFilter(query, filter);\n return filter;\n}\n\nexport function newQueryOrderBy(\n query: InternalQuery,\n fieldPath: InternalFieldPath,\n direction: Direction\n): OrderBy {\n if (query.startAt !== null) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. You must not call startAt() or startAfter() before ' +\n 'calling orderBy().'\n );\n }\n if (query.endAt !== null) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. You must not call endAt() or endBefore() before ' +\n 'calling orderBy().'\n );\n }\n const orderBy = new OrderBy(fieldPath, direction);\n validateNewOrderBy(query, orderBy);\n return orderBy;\n}\n\n/**\n * Create a Bound from a query and a document.\n *\n * Note that the Bound will always include the key of the document\n * and so only the provided document will compare equal to the returned\n * position.\n *\n * Will throw if the document does not contain all fields of the order by\n * of the query or if any of the fields in the order by are an uncommitted\n * server timestamp.\n */\nexport function newQueryBoundFromDocument(\n query: InternalQuery,\n databaseId: DatabaseId,\n methodName: string,\n doc: Document | null,\n before: boolean\n): Bound {\n if (!doc) {\n throw new FirestoreError(\n Code.NOT_FOUND,\n `Can't use a DocumentSnapshot that doesn't exist for ` +\n `${methodName}().`\n );\n }\n\n const components: ProtoValue[] = [];\n\n // Because people expect to continue/end a query at the exact document\n // provided, we need to use the implicit sort order rather than the explicit\n // sort order, because it's guaranteed to contain the document key. That way\n // the position becomes unambiguous and the query continues/ends exactly at\n // the provided document. Without the key (by using the explicit sort\n // orders), multiple documents could match the position, yielding duplicate\n // results.\n for (const orderBy of queryOrderBy(query)) {\n if (orderBy.field.isKeyField()) {\n components.push(refValue(databaseId, doc.key));\n } else {\n const value = doc.data.field(orderBy.field);\n if (isServerTimestamp(value)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. You are trying to start or end a query using a ' +\n 'document for which the field \"' +\n orderBy.field +\n '\" is an uncommitted server timestamp. (Since the value of ' +\n 'this field is unknown, you cannot start/end a query with it.)'\n );\n } else if (value !== null) {\n components.push(value);\n } else {\n const field = orderBy.field.canonicalString();\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. You are trying to start or end a query using a ` +\n `document for which the field '${field}' (used as the ` +\n `orderBy) does not exist.`\n );\n }\n }\n }\n return new Bound(components, before);\n}\n\n/**\n * Converts a list of field values to a Bound for the given query.\n */\nexport function newQueryBoundFromFields(\n query: InternalQuery,\n databaseId: DatabaseId,\n dataReader: UserDataReader,\n methodName: string,\n values: unknown[],\n before: boolean\n): Bound {\n // Use explicit order by's because it has to match the query the user made\n const orderBy = query.explicitOrderBy;\n if (values.length > orderBy.length) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Too many arguments provided to ${methodName}(). ` +\n `The number of arguments must be less than or equal to the ` +\n `number of orderBy() clauses`\n );\n }\n\n const components: ProtoValue[] = [];\n for (let i = 0; i < values.length; i++) {\n const rawValue = values[i];\n const orderByComponent = orderBy[i];\n if (orderByComponent.field.isKeyField()) {\n if (typeof rawValue !== 'string') {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. Expected a string for document ID in ` +\n `${methodName}(), but got a ${typeof rawValue}`\n );\n }\n if (!isCollectionGroupQuery(query) && rawValue.indexOf('/') !== -1) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. When querying a collection and ordering by FieldPath.documentId(), ` +\n `the value passed to ${methodName}() must be a plain document ID, but ` +\n `'${rawValue}' contains a slash.`\n );\n }\n const path = query.path.child(ResourcePath.fromString(rawValue));\n if (!DocumentKey.isDocumentKey(path)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. When querying a collection group and ordering by ` +\n `FieldPath.documentId(), the value passed to ${methodName}() must result in a ` +\n `valid document path, but '${path}' is not because it contains an odd number ` +\n `of segments.`\n );\n }\n const key = new DocumentKey(path);\n components.push(refValue(databaseId, key));\n } else {\n const wrapped = parseQueryValue(dataReader, methodName, rawValue);\n components.push(wrapped);\n }\n }\n\n return new Bound(components, before);\n}\n\n/**\n * Parses the given documentIdValue into a ReferenceValue, throwing\n * appropriate errors if the value is anything other than a DocumentReference\n * or String, or if the string is malformed.\n */\nfunction parseDocumentIdValue(\n databaseId: DatabaseId,\n query: InternalQuery,\n documentIdValue: unknown\n): ProtoValue {\n documentIdValue = getModularInstance(documentIdValue);\n\n if (typeof documentIdValue === 'string') {\n if (documentIdValue === '') {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. When querying with FieldPath.documentId(), you ' +\n 'must provide a valid document ID, but it was an empty string.'\n );\n }\n if (!isCollectionGroupQuery(query) && documentIdValue.indexOf('/') !== -1) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. When querying a collection by ` +\n `FieldPath.documentId(), you must provide a plain document ID, but ` +\n `'${documentIdValue}' contains a '/' character.`\n );\n }\n const path = query.path.child(ResourcePath.fromString(documentIdValue));\n if (!DocumentKey.isDocumentKey(path)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. When querying a collection group by ` +\n `FieldPath.documentId(), the value provided must result in a valid document path, ` +\n `but '${path}' is not because it has an odd number of segments (${path.length}).`\n );\n }\n return refValue(databaseId, new DocumentKey(path));\n } else if (documentIdValue instanceof DocumentReference) {\n return refValue(databaseId, documentIdValue._key);\n } else {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. When querying with FieldPath.documentId(), you must provide a valid ` +\n `string or a DocumentReference, but it was: ` +\n `${valueDescription(documentIdValue)}.`\n );\n }\n}\n\n/**\n * Validates that the value passed into a disjunctive filter satisfies all\n * array requirements.\n */\nfunction validateDisjunctiveFilterElements(\n value: unknown,\n operator: Operator\n): void {\n if (!Array.isArray(value) || value.length === 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid Query. A non-empty array is required for ' +\n `'${operator.toString()}' filters.`\n );\n }\n if (value.length > 10) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid Query. '${operator.toString()}' filters support a ` +\n 'maximum of 10 elements in the value array.'\n );\n }\n}\n\n/**\n * Given an operator, returns the set of operators that cannot be used with it.\n *\n * Operators in a query must adhere to the following set of rules:\n * 1. Only one array operator is allowed.\n * 2. Only one disjunctive operator is allowed.\n * 3. NOT_EQUAL cannot be used with another NOT_EQUAL operator.\n * 4. NOT_IN cannot be used with array, disjunctive, or NOT_EQUAL operators.\n *\n * Array operators: ARRAY_CONTAINS, ARRAY_CONTAINS_ANY\n * Disjunctive operators: IN, ARRAY_CONTAINS_ANY, NOT_IN\n */\nfunction conflictingOps(op: Operator): Operator[] {\n switch (op) {\n case Operator.NOT_EQUAL:\n return [Operator.NOT_EQUAL, Operator.NOT_IN];\n case Operator.ARRAY_CONTAINS:\n return [\n Operator.ARRAY_CONTAINS,\n Operator.ARRAY_CONTAINS_ANY,\n Operator.NOT_IN\n ];\n case Operator.IN:\n return [Operator.ARRAY_CONTAINS_ANY, Operator.IN, Operator.NOT_IN];\n case Operator.ARRAY_CONTAINS_ANY:\n return [\n Operator.ARRAY_CONTAINS,\n Operator.ARRAY_CONTAINS_ANY,\n Operator.IN,\n Operator.NOT_IN\n ];\n case Operator.NOT_IN:\n return [\n Operator.ARRAY_CONTAINS,\n Operator.ARRAY_CONTAINS_ANY,\n Operator.IN,\n Operator.NOT_IN,\n Operator.NOT_EQUAL\n ];\n default:\n return [];\n }\n}\n\nfunction validateNewFilter(query: InternalQuery, filter: Filter): void {\n debugAssert(filter instanceof FieldFilter, 'Only FieldFilters are supported');\n\n if (filter.isInequality()) {\n const existingField = getInequalityFilterField(query);\n if (existingField !== null && !existingField.isEqual(filter.field)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. All where filters with an inequality' +\n ' (<, <=, !=, not-in, >, or >=) must be on the same field. But you have' +\n ` inequality filters on '${existingField.toString()}'` +\n ` and '${filter.field.toString()}'`\n );\n }\n\n const firstOrderByField = getFirstOrderByField(query);\n if (firstOrderByField !== null) {\n validateOrderByAndInequalityMatch(query, filter.field, firstOrderByField);\n }\n }\n\n const conflictingOp = findFilterOperator(query, conflictingOps(filter.op));\n if (conflictingOp !== null) {\n // Special case when it's a duplicate op to give a slightly clearer error message.\n if (conflictingOp === filter.op) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. You cannot use more than one ' +\n `'${filter.op.toString()}' filter.`\n );\n } else {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. You cannot use '${filter.op.toString()}' filters ` +\n `with '${conflictingOp.toString()}' filters.`\n );\n }\n }\n}\n\nfunction validateNewOrderBy(query: InternalQuery, orderBy: OrderBy): void {\n if (getFirstOrderByField(query) === null) {\n // This is the first order by. It must match any inequality.\n const inequalityField = getInequalityFilterField(query);\n if (inequalityField !== null) {\n validateOrderByAndInequalityMatch(query, inequalityField, orderBy.field);\n }\n }\n}\n\nfunction validateOrderByAndInequalityMatch(\n baseQuery: InternalQuery,\n inequality: InternalFieldPath,\n orderBy: InternalFieldPath\n): void {\n if (!orderBy.isEqual(inequality)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. You have a where filter with an inequality ` +\n `(<, <=, !=, not-in, >, or >=) on field '${inequality.toString()}' ` +\n `and so you must also use '${inequality.toString()}' ` +\n `as your first argument to orderBy(), but your first orderBy() ` +\n `is on field '${orderBy.toString()}' instead.`\n );\n }\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DocumentData } from '@firebase/firestore-types';\n\nimport { DatabaseId } from '../core/database_info';\nimport { GeoPoint } from '../lite/geo_point';\nimport { Timestamp } from '../lite/timestamp';\nimport { DocumentKey } from '../model/document_key';\nimport {\n normalizeByteString,\n normalizeNumber,\n normalizeTimestamp\n} from '../model/normalize';\nimport { ResourcePath } from '../model/path';\nimport {\n getLocalWriteTime,\n getPreviousValue\n} from '../model/server_timestamps';\nimport { TypeOrder } from '../model/type_order';\nimport { typeOrder } from '../model/values';\nimport {\n ArrayValue as ProtoArrayValue,\n LatLng as ProtoLatLng,\n MapValue as ProtoMapValue,\n Timestamp as ProtoTimestamp,\n Value as ProtoValue\n} from '../protos/firestore_proto_api';\nimport { isValidResourceName } from '../remote/serializer';\nimport { fail, hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { logError } from '../util/log';\nimport { forEach } from '../util/obj';\n\nexport type ServerTimestampBehavior = 'estimate' | 'previous' | 'none';\n\n/**\n * Converts Firestore's internal types to the JavaScript types that we expose\n * to the user.\n *\n * @internal\n */\nexport abstract class AbstractUserDataWriter {\n convertValue(\n value: ProtoValue,\n serverTimestampBehavior: ServerTimestampBehavior = 'none'\n ): unknown {\n switch (typeOrder(value)) {\n case TypeOrder.NullValue:\n return null;\n case TypeOrder.BooleanValue:\n return value.booleanValue!;\n case TypeOrder.NumberValue:\n return normalizeNumber(value.integerValue || value.doubleValue);\n case TypeOrder.TimestampValue:\n return this.convertTimestamp(value.timestampValue!);\n case TypeOrder.ServerTimestampValue:\n return this.convertServerTimestamp(value, serverTimestampBehavior);\n case TypeOrder.StringValue:\n return value.stringValue!;\n case TypeOrder.BlobValue:\n return this.convertBytes(normalizeByteString(value.bytesValue!));\n case TypeOrder.RefValue:\n return this.convertReference(value.referenceValue!);\n case TypeOrder.GeoPointValue:\n return this.convertGeoPoint(value.geoPointValue!);\n case TypeOrder.ArrayValue:\n return this.convertArray(value.arrayValue!, serverTimestampBehavior);\n case TypeOrder.ObjectValue:\n return this.convertObject(value.mapValue!, serverTimestampBehavior);\n default:\n throw fail('Invalid value type: ' + JSON.stringify(value));\n }\n }\n\n private convertObject(\n mapValue: ProtoMapValue,\n serverTimestampBehavior: ServerTimestampBehavior\n ): DocumentData {\n const result: DocumentData = {};\n forEach(mapValue.fields, (key, value) => {\n result[key] = this.convertValue(value, serverTimestampBehavior);\n });\n return result;\n }\n\n private convertGeoPoint(value: ProtoLatLng): GeoPoint {\n return new GeoPoint(\n normalizeNumber(value.latitude),\n normalizeNumber(value.longitude)\n );\n }\n\n private convertArray(\n arrayValue: ProtoArrayValue,\n serverTimestampBehavior: ServerTimestampBehavior\n ): unknown[] {\n return (arrayValue.values || []).map(value =>\n this.convertValue(value, serverTimestampBehavior)\n );\n }\n\n private convertServerTimestamp(\n value: ProtoValue,\n serverTimestampBehavior: ServerTimestampBehavior\n ): unknown {\n switch (serverTimestampBehavior) {\n case 'previous':\n const previousValue = getPreviousValue(value);\n if (previousValue == null) {\n return null;\n }\n return this.convertValue(previousValue, serverTimestampBehavior);\n case 'estimate':\n return this.convertTimestamp(getLocalWriteTime(value));\n default:\n return null;\n }\n }\n\n private convertTimestamp(value: ProtoTimestamp): Timestamp {\n const normalizedValue = normalizeTimestamp(value);\n return new Timestamp(normalizedValue.seconds, normalizedValue.nanos);\n }\n\n protected convertDocumentKey(\n name: string,\n expectedDatabaseId: DatabaseId\n ): DocumentKey {\n const resourcePath = ResourcePath.fromString(name);\n hardAssert(\n isValidResourceName(resourcePath),\n 'ReferenceValue is not valid ' + name\n );\n const databaseId = new DatabaseId(resourcePath.get(1), resourcePath.get(3));\n const key = new DocumentKey(resourcePath.popFirst(5));\n\n if (!databaseId.isEqual(expectedDatabaseId)) {\n // TODO(b/64130202): Somehow support foreign references.\n logError(\n `Document ${key} contains a document ` +\n `reference within a different database (` +\n `${databaseId.projectId}/${databaseId.database}) which is not ` +\n `supported. It will be treated as a reference in the current ` +\n `database (${expectedDatabaseId.projectId}/${expectedDatabaseId.database}) ` +\n `instead.`\n );\n }\n return key;\n }\n\n protected abstract convertReference(name: string): unknown;\n\n protected abstract convertBytes(bytes: ByteString): unknown;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DocumentData as PublicDocumentData,\n SetOptions as PublicSetOptions\n} from '@firebase/firestore-types';\nimport { getModularInstance } from '@firebase/util';\n\nimport { hasLimitToLast } from '../core/query';\nimport { DeleteMutation, Precondition } from '../model/mutation';\nimport {\n invokeBatchGetDocumentsRpc,\n invokeCommitRpc,\n invokeRunQueryRpc\n} from '../remote/datastore';\nimport { hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { cast } from '../util/input_validation';\n\nimport { Bytes } from './bytes';\nimport { getDatastore } from './components';\nimport { FirebaseFirestore } from './database';\nimport { FieldPath } from './field_path';\nimport { validateHasExplicitOrderByForLimitToLast } from './query';\nimport {\n CollectionReference,\n doc,\n DocumentReference,\n Query,\n SetOptions,\n UpdateData\n} from './reference';\nimport {\n DocumentSnapshot,\n QueryDocumentSnapshot,\n QuerySnapshot\n} from './snapshot';\nimport {\n newUserDataReader,\n ParsedUpdateData,\n parseSetData,\n parseUpdateData,\n parseUpdateVarargs,\n UntypedFirestoreDataConverter\n} from './user_data_reader';\nimport { AbstractUserDataWriter } from './user_data_writer';\n\n/**\n * Converts custom model object of type T into DocumentData by applying the\n * converter if it exists.\n *\n * This function is used when converting user objects to DocumentData\n * because we want to provide the user with a more specific error message if\n * their set() or fails due to invalid data originating from a toFirestore()\n * call.\n */\nexport function applyFirestoreDataConverter<T>(\n converter: UntypedFirestoreDataConverter<T> | null,\n value: T,\n options?: PublicSetOptions\n): PublicDocumentData {\n let convertedValue;\n if (converter) {\n if (options && (options.merge || options.mergeFields)) {\n // Cast to `any` in order to satisfy the union type constraint on\n // toFirestore().\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n convertedValue = (converter as any).toFirestore(value, options);\n } else {\n convertedValue = converter.toFirestore(value);\n }\n } else {\n convertedValue = value as PublicDocumentData;\n }\n return convertedValue;\n}\n\nexport class LiteUserDataWriter extends AbstractUserDataWriter {\n constructor(protected firestore: FirebaseFirestore) {\n super();\n }\n\n protected convertBytes(bytes: ByteString): Bytes {\n return new Bytes(bytes);\n }\n\n protected convertReference(name: string): DocumentReference {\n const key = this.convertDocumentKey(name, this.firestore._databaseId);\n return new DocumentReference(this.firestore, /* converter= */ null, key);\n }\n}\n\n/**\n * Reads the document referred to by the specified document reference.\n *\n * All documents are directly fetched from the server, even if the document was\n * previously read or modified. Recent modifications are only reflected in the\n * retrieved `DocumentSnapshot` if they have already been applied by the\n * backend. If the client is offline, the read fails. If you like to use\n * caching or see local modifications, please use the full Firestore SDK.\n *\n * @param reference - The reference of the document to fetch.\n * @returns A Promise resolved with a `DocumentSnapshot` containing the current\n * document contents.\n */\nexport function getDoc<T>(\n reference: DocumentReference<T>\n): Promise<DocumentSnapshot<T>> {\n reference = cast<DocumentReference<T>>(reference, DocumentReference);\n const datastore = getDatastore(reference.firestore);\n const userDataWriter = new LiteUserDataWriter(reference.firestore);\n\n return invokeBatchGetDocumentsRpc(datastore, [reference._key]).then(\n result => {\n hardAssert(result.length === 1, 'Expected a single document result');\n const document = result[0];\n return new DocumentSnapshot<T>(\n reference.firestore,\n userDataWriter,\n reference._key,\n document.isFoundDocument() ? document : null,\n reference.converter\n );\n }\n );\n}\n\n/**\n * Executes the query and returns the results as a {@link QuerySnapshot}.\n *\n * All queries are executed directly by the server, even if the the query was\n * previously executed. Recent modifications are only reflected in the retrieved\n * results if they have already been applied by the backend. If the client is\n * offline, the operation fails. To see previously cached result and local\n * modifications, use the full Firestore SDK.\n *\n * @param query - The `Query` to execute.\n * @returns A Promise that will be resolved with the results of the query.\n */\nexport function getDocs<T>(query: Query<T>): Promise<QuerySnapshot<T>> {\n query = cast<Query<T>>(query, Query);\n validateHasExplicitOrderByForLimitToLast(query._query);\n\n const datastore = getDatastore(query.firestore);\n const userDataWriter = new LiteUserDataWriter(query.firestore);\n return invokeRunQueryRpc(datastore, query._query).then(result => {\n const docs = result.map(\n doc =>\n new QueryDocumentSnapshot<T>(\n query.firestore,\n userDataWriter,\n doc.key,\n doc,\n query.converter\n )\n );\n\n if (hasLimitToLast(query._query)) {\n // Limit to last queries reverse the orderBy constraint that was\n // specified by the user. As such, we need to reverse the order of the\n // results to return the documents in the expected order.\n docs.reverse();\n }\n\n return new QuerySnapshot<T>(query, docs);\n });\n}\n\n/**\n * Writes to the document referred to by the specified `DocumentReference`. If\n * the document does not yet exist, it will be created.\n *\n * The result of this write will only be reflected in document reads that occur\n * after the returned Promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the document to write.\n * @param data - A map of the fields and values for the document.\n * @returns A Promise resolved once the data has been successfully written\n * to the backend.\n */\nexport function setDoc<T>(\n reference: DocumentReference<T>,\n data: T\n): Promise<void>;\n/**\n * Writes to the document referred to by the specified `DocumentReference`. If\n * the document does not yet exist, it will be created. If you provide `merge`\n * or `mergeFields`, the provided data can be merged into an existing document.\n *\n * The result of this write will only be reflected in document reads that occur\n * after the returned Promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the document to write.\n * @param data - A map of the fields and values for the document.\n * @param options - An object to configure the set behavior.\n * @returns A Promise resolved once the data has been successfully written\n * to the backend.\n */\nexport function setDoc<T>(\n reference: DocumentReference<T>,\n data: Partial<T>,\n options: SetOptions\n): Promise<void>;\nexport function setDoc<T>(\n reference: DocumentReference<T>,\n data: T,\n options?: SetOptions\n): Promise<void> {\n reference = cast<DocumentReference<T>>(reference, DocumentReference);\n const convertedValue = applyFirestoreDataConverter(\n reference.converter,\n data,\n options\n );\n const dataReader = newUserDataReader(reference.firestore);\n const parsed = parseSetData(\n dataReader,\n 'setDoc',\n reference._key,\n convertedValue,\n reference.converter !== null,\n options\n );\n\n const datastore = getDatastore(reference.firestore);\n return invokeCommitRpc(datastore, [\n parsed.toMutation(reference._key, Precondition.none())\n ]);\n}\n\n/**\n * Updates fields in the document referred to by the specified\n * `DocumentReference`. The update will fail if applied to a document that does\n * not exist.\n *\n * The result of this update will only be reflected in document reads that occur\n * after the returned Promise resolves. If the client is offline, the\n * update fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the document to update.\n * @param data - An object containing the fields and values with which to\n * update the document. Fields can contain dots to reference nested fields\n * within the document.\n * @returns A Promise resolved once the data has been successfully written\n * to the backend.\n */\nexport function updateDoc(\n reference: DocumentReference<unknown>,\n data: UpdateData\n): Promise<void>;\n/**\n * Updates fields in the document referred to by the specified\n * `DocumentReference` The update will fail if applied to a document that does\n * not exist.\n *\n * Nested fields can be updated by providing dot-separated field path\n * strings or by providing `FieldPath` objects.\n *\n * The result of this update will only be reflected in document reads that occur\n * after the returned Promise resolves. If the client is offline, the\n * update fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the document to update.\n * @param field - The first field to update.\n * @param value - The first value.\n * @param moreFieldsAndValues - Additional key value pairs.\n * @returns A Promise resolved once the data has been successfully written\n * to the backend.\n */\nexport function updateDoc(\n reference: DocumentReference<unknown>,\n field: string | FieldPath,\n value: unknown,\n ...moreFieldsAndValues: unknown[]\n): Promise<void>;\nexport function updateDoc(\n reference: DocumentReference<unknown>,\n fieldOrUpdateData: string | FieldPath | UpdateData,\n value?: unknown,\n ...moreFieldsAndValues: unknown[]\n): Promise<void> {\n reference = cast<DocumentReference<unknown>>(reference, DocumentReference);\n const dataReader = newUserDataReader(reference.firestore);\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n fieldOrUpdateData = getModularInstance(fieldOrUpdateData);\n\n let parsed: ParsedUpdateData;\n if (\n typeof fieldOrUpdateData === 'string' ||\n fieldOrUpdateData instanceof FieldPath\n ) {\n parsed = parseUpdateVarargs(\n dataReader,\n 'updateDoc',\n reference._key,\n fieldOrUpdateData,\n value,\n moreFieldsAndValues\n );\n } else {\n parsed = parseUpdateData(\n dataReader,\n 'updateDoc',\n reference._key,\n fieldOrUpdateData\n );\n }\n\n const datastore = getDatastore(reference.firestore);\n return invokeCommitRpc(datastore, [\n parsed.toMutation(reference._key, Precondition.exists(true))\n ]);\n}\n\n/**\n * Deletes the document referred to by the specified `DocumentReference`.\n *\n * The deletion will only be reflected in document reads that occur after the\n * returned Promise resolves. If the client is offline, the\n * delete fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the document to delete.\n * @returns A Promise resolved once the document has been successfully\n * deleted from the backend.\n */\nexport function deleteDoc(\n reference: DocumentReference<unknown>\n): Promise<void> {\n reference = cast<DocumentReference<unknown>>(reference, DocumentReference);\n const datastore = getDatastore(reference.firestore);\n return invokeCommitRpc(datastore, [\n new DeleteMutation(reference._key, Precondition.none())\n ]);\n}\n\n/**\n * Add a new document to specified `CollectionReference` with the given data,\n * assigning it a document ID automatically.\n *\n * The result of this write will only be reflected in document reads that occur\n * after the returned Promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the collection to add this document to.\n * @param data - An Object containing the data for the new document.\n * @returns A Promise resolved with a `DocumentReference` pointing to the\n * newly created document after it has been written to the backend.\n */\nexport function addDoc<T>(\n reference: CollectionReference<T>,\n data: T\n): Promise<DocumentReference<T>> {\n reference = cast<CollectionReference<T>>(reference, CollectionReference);\n const docRef = doc(reference);\n\n const convertedValue = applyFirestoreDataConverter(reference.converter, data);\n\n const dataReader = newUserDataReader(reference.firestore);\n const parsed = parseSetData(\n dataReader,\n 'addDoc',\n docRef._key,\n convertedValue,\n docRef.converter !== null,\n {}\n );\n\n const datastore = getDatastore(reference.firestore);\n return invokeCommitRpc(datastore, [\n parsed.toMutation(docRef._key, Precondition.exists(false))\n ]).then(() => docRef);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Compat, getModularInstance } from '@firebase/util';\n\nimport { DeleteMutation, Mutation, Precondition } from '../model/mutation';\nimport { invokeCommitRpc } from '../remote/datastore';\nimport { Code, FirestoreError } from '../util/error';\nimport { cast } from '../util/input_validation';\n\nimport { getDatastore } from './components';\nimport { FirebaseFirestore } from './database';\nimport { FieldPath } from './field_path';\nimport { DocumentReference, SetOptions, UpdateData } from './reference';\nimport { applyFirestoreDataConverter } from './reference_impl';\nimport {\n newUserDataReader,\n parseSetData,\n parseUpdateData,\n parseUpdateVarargs,\n UserDataReader\n} from './user_data_reader';\n\n/**\n * A write batch, used to perform multiple writes as a single atomic unit.\n *\n * A `WriteBatch` object can be acquired by calling {@link writeBatch}. It\n * provides methods for adding writes to the write batch. None of the writes\n * will be committed (or visible locally) until {@link WriteBatch.commit} is\n * called.\n */\nexport class WriteBatch {\n // This is the lite version of the WriteBatch API used in the legacy SDK. The\n // class is a close copy but takes different input types.\n\n private readonly _dataReader: UserDataReader;\n private _mutations = [] as Mutation[];\n private _committed = false;\n\n /** @hideconstructor */\n constructor(\n private readonly _firestore: FirebaseFirestore,\n private readonly _commitHandler: (m: Mutation[]) => Promise<void>\n ) {\n this._dataReader = newUserDataReader(_firestore);\n }\n\n /**\n * Writes to the document referred to by the provided {@link\n * DocumentReference}. If the document does not exist yet, it will be created.\n *\n * @param documentRef - A reference to the document to be set.\n * @param data - An object of the fields and values for the document.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */\n set<T>(documentRef: DocumentReference<T>, data: T): WriteBatch;\n /**\n * Writes to the document referred to by the provided {@link\n * DocumentReference}. If the document does not exist yet, it will be created.\n * If you provide `merge` or `mergeFields`, the provided data can be merged\n * into an existing document.\n *\n * @param documentRef - A reference to the document to be set.\n * @param data - An object of the fields and values for the document.\n * @param options - An object to configure the set behavior.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */\n set<T>(\n documentRef: DocumentReference<T>,\n data: Partial<T>,\n options: SetOptions\n ): WriteBatch;\n set<T>(\n documentRef: DocumentReference<T>,\n data: T,\n options?: SetOptions\n ): WriteBatch {\n this._verifyNotCommitted();\n const ref = validateReference(documentRef, this._firestore);\n\n const convertedValue = applyFirestoreDataConverter(\n ref.converter,\n data,\n options\n );\n const parsed = parseSetData(\n this._dataReader,\n 'WriteBatch.set',\n ref._key,\n convertedValue,\n ref.converter !== null,\n options\n );\n this._mutations.push(parsed.toMutation(ref._key, Precondition.none()));\n return this;\n }\n\n /**\n * Updates fields in the document referred to by the provided {@link\n * DocumentReference}. The update will fail if applied to a document that does\n * not exist.\n *\n * @param documentRef - A reference to the document to be updated.\n * @param data - An object containing the fields and values with which to\n * update the document. Fields can contain dots to reference nested fields\n * within the document.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */\n update(documentRef: DocumentReference<unknown>, data: UpdateData): WriteBatch;\n /**\n * Updates fields in the document referred to by this {@link\n * DocumentReference}. The update will fail if applied to a document that does\n * not exist.\n *\n * Nested fields can be update by providing dot-separated field path strings\n * or by providing `FieldPath` objects.\n *\n * @param documentRef - A reference to the document to be updated.\n * @param field - The first field to update.\n * @param value - The first value.\n * @param moreFieldsAndValues - Additional key value pairs.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */\n update(\n documentRef: DocumentReference<unknown>,\n field: string | FieldPath,\n value: unknown,\n ...moreFieldsAndValues: unknown[]\n ): WriteBatch;\n update(\n documentRef: DocumentReference<unknown>,\n fieldOrUpdateData: string | FieldPath | UpdateData,\n value?: unknown,\n ...moreFieldsAndValues: unknown[]\n ): WriteBatch {\n this._verifyNotCommitted();\n const ref = validateReference(documentRef, this._firestore);\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n fieldOrUpdateData = getModularInstance(fieldOrUpdateData);\n\n let parsed;\n if (\n typeof fieldOrUpdateData === 'string' ||\n fieldOrUpdateData instanceof FieldPath\n ) {\n parsed = parseUpdateVarargs(\n this._dataReader,\n 'WriteBatch.update',\n ref._key,\n fieldOrUpdateData,\n value,\n moreFieldsAndValues\n );\n } else {\n parsed = parseUpdateData(\n this._dataReader,\n 'WriteBatch.update',\n ref._key,\n fieldOrUpdateData\n );\n }\n\n this._mutations.push(\n parsed.toMutation(ref._key, Precondition.exists(true))\n );\n return this;\n }\n\n /**\n * Deletes the document referred to by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be deleted.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */\n delete(documentRef: DocumentReference<unknown>): WriteBatch {\n this._verifyNotCommitted();\n const ref = validateReference(documentRef, this._firestore);\n this._mutations = this._mutations.concat(\n new DeleteMutation(ref._key, Precondition.none())\n );\n return this;\n }\n\n /**\n * Commits all of the writes in this write batch as a single atomic unit.\n *\n * The result of these writes will only be reflected in document reads that\n * occur after the returned Promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @returns A Promise resolved once all of the writes in the batch have been\n * successfully written to the backend as an atomic unit (note that it won't\n * resolve while you're offline).\n */\n commit(): Promise<void> {\n this._verifyNotCommitted();\n this._committed = true;\n if (this._mutations.length > 0) {\n return this._commitHandler(this._mutations);\n }\n\n return Promise.resolve();\n }\n\n private _verifyNotCommitted(): void {\n if (this._committed) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'A write batch can no longer be used after commit() ' +\n 'has been called.'\n );\n }\n }\n}\n\nexport function validateReference<T>(\n documentRef: DocumentReference<T> | Compat<DocumentReference<T>>,\n firestore: FirebaseFirestore\n): DocumentReference<T> {\n documentRef = getModularInstance(documentRef);\n\n if (documentRef.firestore !== firestore) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Provided document reference is from a different Firestore instance.'\n );\n } else {\n return documentRef as DocumentReference<T>;\n }\n}\n\n/**\n * Creates a write batch, used for performing multiple writes as a single\n * atomic operation. The maximum number of writes allowed in a single WriteBatch\n * is 500.\n *\n * The result of these writes will only be reflected in document reads that\n * occur after the returned Promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @returns A `WriteBatch` that can be used to atomically execute multiple\n * writes.\n */\nexport function writeBatch(firestore: FirebaseFirestore): WriteBatch {\n firestore = cast(firestore, FirebaseFirestore);\n const datastore = getDatastore(firestore);\n return new WriteBatch(firestore, writes =>\n invokeCommitRpc(datastore, writes)\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance } from '@firebase/util';\n\nimport {\n CompleteFn,\n ErrorFn,\n isPartialObserver,\n NextFn,\n PartialObserver\n} from '../api/observer';\nimport {\n firestoreClientAddSnapshotsInSyncListener,\n firestoreClientGetDocumentFromLocalCache,\n firestoreClientGetDocumentsFromLocalCache,\n firestoreClientGetDocumentsViaSnapshotListener,\n firestoreClientGetDocumentViaSnapshotListener,\n firestoreClientListen,\n firestoreClientWrite\n} from '../core/firestore_client';\nimport { newQueryForPath, Query as InternalQuery } from '../core/query';\nimport { ViewSnapshot } from '../core/view_snapshot';\nimport { Bytes } from '../lite/bytes';\nimport { FieldPath } from '../lite/field_path';\nimport { validateHasExplicitOrderByForLimitToLast } from '../lite/query';\nimport {\n CollectionReference,\n doc,\n DocumentReference,\n Query,\n SetOptions,\n UpdateData\n} from '../lite/reference';\nimport { applyFirestoreDataConverter } from '../lite/reference_impl';\nimport {\n newUserDataReader,\n ParsedUpdateData,\n parseSetData,\n parseUpdateData,\n parseUpdateVarargs\n} from '../lite/user_data_reader';\nimport { AbstractUserDataWriter } from '../lite/user_data_writer';\nimport { DeleteMutation, Mutation, Precondition } from '../model/mutation';\nimport { debugAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { FirestoreError } from '../util/error';\nimport { cast } from '../util/input_validation';\n\nimport { ensureFirestoreConfigured, FirebaseFirestore } from './database';\nimport { DocumentSnapshot, QuerySnapshot, SnapshotMetadata } from './snapshot';\n\n/**\n * An options object that can be passed to {@link (onSnapshot:1)} and {@link\n * QuerySnapshot.docChanges} to control which types of changes to include in the\n * result set.\n */\nexport interface SnapshotListenOptions {\n /**\n * Include a change even if only the metadata of the query or of a document\n * changed. Default is false.\n */\n readonly includeMetadataChanges?: boolean;\n}\n\n/**\n * Reads the document referred to by this `DocumentReference`.\n *\n * Note: `getDoc()` attempts to provide up-to-date data when possible by waiting\n * for data from the server, but it may return cached data or fail if you are\n * offline and the server cannot be reached. To specify this behavior, invoke\n * {@link getDocFromCache} or {@link getDocFromServer}.\n *\n * @param reference - The reference of the document to fetch.\n * @returns A Promise resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */\nexport function getDoc<T>(\n reference: DocumentReference<T>\n): Promise<DocumentSnapshot<T>> {\n reference = cast<DocumentReference<T>>(reference, DocumentReference);\n const firestore = cast(reference.firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n\n return firestoreClientGetDocumentViaSnapshotListener(\n client,\n reference._key\n ).then(snapshot => convertToDocSnapshot(firestore, reference, snapshot));\n}\n\nexport class ExpUserDataWriter extends AbstractUserDataWriter {\n constructor(protected firestore: FirebaseFirestore) {\n super();\n }\n\n protected convertBytes(bytes: ByteString): Bytes {\n return new Bytes(bytes);\n }\n\n protected convertReference(name: string): DocumentReference {\n const key = this.convertDocumentKey(name, this.firestore._databaseId);\n return new DocumentReference(this.firestore, /* converter= */ null, key);\n }\n}\n\n/**\n * Reads the document referred to by this `DocumentReference` from cache.\n * Returns an error if the document is not currently cached.\n *\n * @returns A Promise resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */\nexport function getDocFromCache<T>(\n reference: DocumentReference<T>\n): Promise<DocumentSnapshot<T>> {\n reference = cast<DocumentReference<T>>(reference, DocumentReference);\n const firestore = cast(reference.firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n return firestoreClientGetDocumentFromLocalCache(client, reference._key).then(\n doc =>\n new DocumentSnapshot(\n firestore,\n userDataWriter,\n reference._key,\n doc,\n new SnapshotMetadata(\n doc !== null && doc.hasLocalMutations,\n /* fromCache= */ true\n ),\n reference.converter\n )\n );\n}\n\n/**\n * Reads the document referred to by this `DocumentReference` from the server.\n * Returns an error if the network is not available.\n *\n * @returns A Promise resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */\nexport function getDocFromServer<T>(\n reference: DocumentReference<T>\n): Promise<DocumentSnapshot<T>> {\n reference = cast<DocumentReference<T>>(reference, DocumentReference);\n const firestore = cast(reference.firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n\n return firestoreClientGetDocumentViaSnapshotListener(client, reference._key, {\n source: 'server'\n }).then(snapshot => convertToDocSnapshot(firestore, reference, snapshot));\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot`.\n *\n * Note: `getDocs()` attempts to provide up-to-date data when possible by\n * waiting for data from the server, but it may return cached data or fail if\n * you are offline and the server cannot be reached. To specify this behavior,\n * invoke {@link getDocsFromCache} or {@link getDocsFromServer}.\n *\n * @returns A Promise that will be resolved with the results of the query.\n */\nexport function getDocs<T>(query: Query<T>): Promise<QuerySnapshot<T>> {\n query = cast<Query<T>>(query, Query);\n const firestore = cast(query.firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n validateHasExplicitOrderByForLimitToLast(query._query);\n return firestoreClientGetDocumentsViaSnapshotListener(\n client,\n query._query\n ).then(\n snapshot => new QuerySnapshot(firestore, userDataWriter, query, snapshot)\n );\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot` from cache.\n * Returns an error if the document is not currently cached.\n *\n * @returns A Promise that will be resolved with the results of the query.\n */\nexport function getDocsFromCache<T>(\n query: Query<T>\n): Promise<QuerySnapshot<T>> {\n query = cast<Query<T>>(query, Query);\n const firestore = cast(query.firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n return firestoreClientGetDocumentsFromLocalCache(client, query._query).then(\n snapshot => new QuerySnapshot(firestore, userDataWriter, query, snapshot)\n );\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot` from the\n * server. Returns an error if the network is not available.\n *\n * @returns A Promise that will be resolved with the results of the query.\n */\nexport function getDocsFromServer<T>(\n query: Query<T>\n): Promise<QuerySnapshot<T>> {\n query = cast<Query<T>>(query, Query);\n const firestore = cast(query.firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n return firestoreClientGetDocumentsViaSnapshotListener(client, query._query, {\n source: 'server'\n }).then(\n snapshot => new QuerySnapshot(firestore, userDataWriter, query, snapshot)\n );\n}\n\n/**\n * Writes to the document referred to by this `DocumentReference`. If the\n * document does not yet exist, it will be created.\n *\n * @param reference - A reference to the document to write.\n * @param data - A map of the fields and values for the document.\n * @returns A Promise resolved once the data has been successfully written\n * to the backend (note that it won't resolve while you're offline).\n */\nexport function setDoc<T>(\n reference: DocumentReference<T>,\n data: T\n): Promise<void>;\n/**\n * Writes to the document referred to by the specified `DocumentReference`. If\n * the document does not yet exist, it will be created. If you provide `merge`\n * or `mergeFields`, the provided data can be merged into an existing document.\n *\n * @param reference - A reference to the document to write.\n * @param data - A map of the fields and values for the document.\n * @param options - An object to configure the set behavior.\n * @returns A Promise resolved once the data has been successfully written\n * to the backend (note that it won't resolve while you're offline).\n */\nexport function setDoc<T>(\n reference: DocumentReference<T>,\n data: Partial<T>,\n options: SetOptions\n): Promise<void>;\nexport function setDoc<T>(\n reference: DocumentReference<T>,\n data: T,\n options?: SetOptions\n): Promise<void> {\n reference = cast<DocumentReference<T>>(reference, DocumentReference);\n const firestore = cast(reference.firestore, FirebaseFirestore);\n\n const convertedValue = applyFirestoreDataConverter(\n reference.converter,\n data,\n options\n );\n const dataReader = newUserDataReader(firestore);\n const parsed = parseSetData(\n dataReader,\n 'setDoc',\n reference._key,\n convertedValue,\n reference.converter !== null,\n options\n );\n\n const mutation = parsed.toMutation(reference._key, Precondition.none());\n return executeWrite(firestore, [mutation]);\n}\n\n/**\n * Updates fields in the document referred to by the specified\n * `DocumentReference`. The update will fail if applied to a document that does\n * not exist.\n *\n * @param reference - A reference to the document to update.\n * @param data - An object containing the fields and values with which to\n * update the document. Fields can contain dots to reference nested fields\n * within the document.\n * @returns A Promise resolved once the data has been successfully written\n * to the backend (note that it won't resolve while you're offline).\n */\nexport function updateDoc(\n reference: DocumentReference<unknown>,\n data: UpdateData\n): Promise<void>;\n/**\n * Updates fields in the document referred to by the specified\n * `DocumentReference` The update will fail if applied to a document that does\n * not exist.\n *\n * Nested fields can be updated by providing dot-separated field path\n * strings or by providing `FieldPath` objects.\n *\n * @param reference - A reference to the document to update.\n * @param field - The first field to update.\n * @param value - The first value.\n * @param moreFieldsAndValues - Additional key value pairs.\n * @returns A Promise resolved once the data has been successfully written\n * to the backend (note that it won't resolve while you're offline).\n */\nexport function updateDoc(\n reference: DocumentReference<unknown>,\n field: string | FieldPath,\n value: unknown,\n ...moreFieldsAndValues: unknown[]\n): Promise<void>;\nexport function updateDoc(\n reference: DocumentReference<unknown>,\n fieldOrUpdateData: string | FieldPath | UpdateData,\n value?: unknown,\n ...moreFieldsAndValues: unknown[]\n): Promise<void> {\n reference = cast<DocumentReference<unknown>>(reference, DocumentReference);\n const firestore = cast(reference.firestore, FirebaseFirestore);\n\n const dataReader = newUserDataReader(firestore);\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n fieldOrUpdateData = getModularInstance(fieldOrUpdateData);\n\n let parsed: ParsedUpdateData;\n if (\n typeof fieldOrUpdateData === 'string' ||\n fieldOrUpdateData instanceof FieldPath\n ) {\n parsed = parseUpdateVarargs(\n dataReader,\n 'updateDoc',\n reference._key,\n fieldOrUpdateData,\n value,\n moreFieldsAndValues\n );\n } else {\n parsed = parseUpdateData(\n dataReader,\n 'updateDoc',\n reference._key,\n fieldOrUpdateData\n );\n }\n\n const mutation = parsed.toMutation(reference._key, Precondition.exists(true));\n return executeWrite(firestore, [mutation]);\n}\n\n/**\n * Deletes the document referred to by the specified `DocumentReference`.\n *\n * @param reference - A reference to the document to delete.\n * @returns A Promise resolved once the document has been successfully\n * deleted from the backend (note that it won't resolve while you're offline).\n */\nexport function deleteDoc(\n reference: DocumentReference<unknown>\n): Promise<void> {\n const firestore = cast(reference.firestore, FirebaseFirestore);\n const mutations = [new DeleteMutation(reference._key, Precondition.none())];\n return executeWrite(firestore, mutations);\n}\n\n/**\n * Add a new document to specified `CollectionReference` with the given data,\n * assigning it a document ID automatically.\n *\n * @param reference - A reference to the collection to add this document to.\n * @param data - An Object containing the data for the new document.\n * @returns A Promise resolved with a `DocumentReference` pointing to the\n * newly created document after it has been written to the backend (Note that it\n * won't resolve while you're offline).\n */\nexport function addDoc<T>(\n reference: CollectionReference<T>,\n data: T\n): Promise<DocumentReference<T>> {\n const firestore = cast(reference.firestore, FirebaseFirestore);\n\n const docRef = doc(reference);\n const convertedValue = applyFirestoreDataConverter(reference.converter, data);\n\n const dataReader = newUserDataReader(reference.firestore);\n const parsed = parseSetData(\n dataReader,\n 'addDoc',\n docRef._key,\n convertedValue,\n reference.converter !== null,\n {}\n );\n\n const mutation = parsed.toMutation(docRef._key, Precondition.exists(false));\n return executeWrite(firestore, [mutation]).then(() => docRef);\n}\n\n/**\n * A function returned by `onSnapshot()` that removes the listener when invoked.\n */\nexport interface Unsubscribe {\n /** Removes the listener when invoked. */\n (): void;\n}\n\n// TODO(firestorexp): Make sure these overloads are tested via the Firestore\n// integration tests\n\n/**\n * Attaches a listener for `DocumentSnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param reference - A reference to the document to listen to.\n * @param observer - A single object containing `next` and `error` callbacks.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot<T>(\n reference: DocumentReference<T>,\n observer: {\n next?: (snapshot: DocumentSnapshot<T>) => void;\n error?: (error: FirestoreError) => void;\n complete?: () => void;\n }\n): Unsubscribe;\n/**\n * Attaches a listener for `DocumentSnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param reference - A reference to the document to listen to.\n * @param options - Options controlling the listen behavior.\n * @param observer - A single object containing `next` and `error` callbacks.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot<T>(\n reference: DocumentReference<T>,\n options: SnapshotListenOptions,\n observer: {\n next?: (snapshot: DocumentSnapshot<T>) => void;\n error?: (error: FirestoreError) => void;\n complete?: () => void;\n }\n): Unsubscribe;\n/**\n * Attaches a listener for `DocumentSnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param reference - A reference to the document to listen to.\n * @param onNext - A callback to be called every time a new `DocumentSnapshot`\n * is available.\n * @param onError - A callback to be called if the listen fails or is\n * cancelled. No further callbacks will occur.\n * @param onCompletion - Can be provided, but will not be called since streams are\n * never ending.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot<T>(\n reference: DocumentReference<T>,\n onNext: (snapshot: DocumentSnapshot<T>) => void,\n onError?: (error: FirestoreError) => void,\n onCompletion?: () => void\n): Unsubscribe;\n/**\n * Attaches a listener for `DocumentSnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param reference - A reference to the document to listen to.\n * @param options - Options controlling the listen behavior.\n * @param onNext - A callback to be called every time a new `DocumentSnapshot`\n * is available.\n * @param onError - A callback to be called if the listen fails or is\n * cancelled. No further callbacks will occur.\n * @param onCompletion - Can be provided, but will not be called since streams are\n * never ending.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot<T>(\n reference: DocumentReference<T>,\n options: SnapshotListenOptions,\n onNext: (snapshot: DocumentSnapshot<T>) => void,\n onError?: (error: FirestoreError) => void,\n onCompletion?: () => void\n): Unsubscribe;\n/**\n * Attaches a listener for `QuerySnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks. The listener can be cancelled by\n * calling the function that is returned when `onSnapshot` is called.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param query - The query to listen to.\n * @param observer - A single object containing `next` and `error` callbacks.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot<T>(\n query: Query<T>,\n observer: {\n next?: (snapshot: QuerySnapshot<T>) => void;\n error?: (error: FirestoreError) => void;\n complete?: () => void;\n }\n): Unsubscribe;\n/**\n * Attaches a listener for `QuerySnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks. The listener can be cancelled by\n * calling the function that is returned when `onSnapshot` is called.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param query - The query to listen to.\n * @param options - Options controlling the listen behavior.\n * @param observer - A single object containing `next` and `error` callbacks.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot<T>(\n query: Query<T>,\n options: SnapshotListenOptions,\n observer: {\n next?: (snapshot: QuerySnapshot<T>) => void;\n error?: (error: FirestoreError) => void;\n complete?: () => void;\n }\n): Unsubscribe;\n/**\n * Attaches a listener for `QuerySnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks. The listener can be cancelled by\n * calling the function that is returned when `onSnapshot` is called.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param query - The query to listen to.\n * @param onNext - A callback to be called every time a new `QuerySnapshot`\n * is available.\n * @param onCompletion - Can be provided, but will not be called since streams are\n * never ending.\n * @param onError - A callback to be called if the listen fails or is\n * cancelled. No further callbacks will occur.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot<T>(\n query: Query<T>,\n onNext: (snapshot: QuerySnapshot<T>) => void,\n onError?: (error: FirestoreError) => void,\n onCompletion?: () => void\n): Unsubscribe;\n/**\n * Attaches a listener for `QuerySnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks. The listener can be cancelled by\n * calling the function that is returned when `onSnapshot` is called.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param query - The query to listen to.\n * @param options - Options controlling the listen behavior.\n * @param onNext - A callback to be called every time a new `QuerySnapshot`\n * is available.\n * @param onCompletion - Can be provided, but will not be called since streams are\n * never ending.\n * @param onError - A callback to be called if the listen fails or is\n * cancelled. No further callbacks will occur.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot<T>(\n query: Query<T>,\n options: SnapshotListenOptions,\n onNext: (snapshot: QuerySnapshot<T>) => void,\n onError?: (error: FirestoreError) => void,\n onCompletion?: () => void\n): Unsubscribe;\nexport function onSnapshot<T>(\n reference: Query<T> | DocumentReference<T>,\n ...args: unknown[]\n): Unsubscribe {\n reference = getModularInstance(reference);\n\n let options: SnapshotListenOptions = {\n includeMetadataChanges: false\n };\n let currArg = 0;\n if (typeof args[currArg] === 'object' && !isPartialObserver(args[currArg])) {\n options = args[currArg] as SnapshotListenOptions;\n currArg++;\n }\n\n const internalOptions = {\n includeMetadataChanges: options.includeMetadataChanges\n };\n\n if (isPartialObserver(args[currArg])) {\n const userObserver = args[currArg] as PartialObserver<QuerySnapshot<T>>;\n args[currArg] = userObserver.next?.bind(userObserver);\n args[currArg + 1] = userObserver.error?.bind(userObserver);\n args[currArg + 2] = userObserver.complete?.bind(userObserver);\n }\n\n let observer: PartialObserver<ViewSnapshot>;\n let firestore: FirebaseFirestore;\n let internalQuery: InternalQuery;\n\n if (reference instanceof DocumentReference) {\n firestore = cast(reference.firestore, FirebaseFirestore);\n internalQuery = newQueryForPath(reference._key.path);\n\n observer = {\n next: snapshot => {\n if (args[currArg]) {\n (args[currArg] as NextFn<DocumentSnapshot<T>>)(\n convertToDocSnapshot(\n firestore,\n reference as DocumentReference<T>,\n snapshot\n )\n );\n }\n },\n error: args[currArg + 1] as ErrorFn,\n complete: args[currArg + 2] as CompleteFn\n };\n } else {\n const query = cast<Query<T>>(reference, Query);\n firestore = cast(query.firestore, FirebaseFirestore);\n internalQuery = query._query;\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n observer = {\n next: snapshot => {\n if (args[currArg]) {\n (args[currArg] as NextFn<QuerySnapshot<T>>)(\n new QuerySnapshot(firestore, userDataWriter, query, snapshot)\n );\n }\n },\n error: args[currArg + 1] as ErrorFn,\n complete: args[currArg + 2] as CompleteFn\n };\n\n validateHasExplicitOrderByForLimitToLast(reference._query);\n }\n\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientListen(\n client,\n internalQuery,\n internalOptions,\n observer\n );\n}\n\n// TODO(firestorexp): Make sure these overloads are tested via the Firestore\n// integration tests\n\n/**\n * Attaches a listener for a snapshots-in-sync event. The snapshots-in-sync\n * event indicates that all listeners affected by a given change have fired,\n * even if a single server-generated change affects multiple listeners.\n *\n * NOTE: The snapshots-in-sync event only indicates that listeners are in sync\n * with each other, but does not relate to whether those snapshots are in sync\n * with the server. Use SnapshotMetadata in the individual listeners to\n * determine if a snapshot is from the cache or the server.\n *\n * @param firestore - The instance of Firestore for synchronizing snapshots.\n * @param observer - A single object containing `next` and `error` callbacks.\n * @returns An unsubscribe function that can be called to cancel the snapshot\n * listener.\n */\nexport function onSnapshotsInSync(\n firestore: FirebaseFirestore,\n observer: {\n next?: (value: void) => void;\n error?: (error: FirestoreError) => void;\n complete?: () => void;\n }\n): Unsubscribe;\n/**\n * Attaches a listener for a snapshots-in-sync event. The snapshots-in-sync\n * event indicates that all listeners affected by a given change have fired,\n * even if a single server-generated change affects multiple listeners.\n *\n * NOTE: The snapshots-in-sync event only indicates that listeners are in sync\n * with each other, but does not relate to whether those snapshots are in sync\n * with the server. Use SnapshotMetadata in the individual listeners to\n * determine if a snapshot is from the cache or the server.\n *\n * @param firestore - The instance of Firestore for synchronizing snapshots.\n * @param onSync - A callback to be called every time all snapshot listeners are\n * in sync with each other.\n * @returns An unsubscribe function that can be called to cancel the snapshot\n * listener.\n */\nexport function onSnapshotsInSync(\n firestore: FirebaseFirestore,\n onSync: () => void\n): Unsubscribe;\nexport function onSnapshotsInSync(\n firestore: FirebaseFirestore,\n arg: unknown\n): Unsubscribe {\n firestore = cast(firestore, FirebaseFirestore);\n const client = ensureFirestoreConfigured(firestore);\n const observer = isPartialObserver(arg)\n ? (arg as PartialObserver<void>)\n : {\n next: arg as () => void\n };\n\n return firestoreClientAddSnapshotsInSyncListener(client, observer);\n}\n\n/**\n * Locally writes `mutations` on the async queue.\n * @internal\n */\nexport function executeWrite(\n firestore: FirebaseFirestore,\n mutations: Mutation[]\n): Promise<void> {\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientWrite(client, mutations);\n}\n\n/**\n * Converts a ViewSnapshot that contains the single document specified by `ref`\n * to a DocumentSnapshot.\n */\nfunction convertToDocSnapshot<T>(\n firestore: FirebaseFirestore,\n ref: DocumentReference<T>,\n snapshot: ViewSnapshot\n): DocumentSnapshot<T> {\n debugAssert(\n snapshot.docs.size <= 1,\n 'Expected zero or a single result on a document-only query'\n );\n const doc = snapshot.docs.get(ref._key);\n\n const userDataWriter = new ExpUserDataWriter(firestore);\n return new DocumentSnapshot(\n firestore,\n userDataWriter,\n ref._key,\n doc,\n new SnapshotMetadata(snapshot.hasPendingWrites, snapshot.fromCache),\n ref.converter\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { firestoreClientTransaction } from '../core/firestore_client';\nimport { Transaction as InternalTransaction } from '../core/transaction';\nimport { DocumentReference } from '../lite/reference';\nimport { Transaction as LiteTransaction } from '../lite/transaction';\nimport { validateReference } from '../lite/write_batch';\n\nimport { ensureFirestoreConfigured, FirebaseFirestore } from './database';\nimport { ExpUserDataWriter } from './reference_impl';\nimport { DocumentSnapshot, SnapshotMetadata } from './snapshot';\n\n/**\n * A reference to a transaction.\n *\n * The `Transaction` object passed to a transaction's `updateFunction` provides\n * the methods to read and write data within the transaction context. See\n * {@link runTransaction}.\n */\nexport class Transaction extends LiteTransaction {\n // This class implements the same logic as the Transaction API in the Lite SDK\n // but is subclassed in order to return its own DocumentSnapshot types.\n\n /** @hideconstructor */\n constructor(\n protected readonly _firestore: FirebaseFirestore,\n _transaction: InternalTransaction\n ) {\n super(_firestore, _transaction);\n }\n\n /**\n * Reads the document referenced by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be read.\n * @returns A `DocumentSnapshot` with the read data.\n */\n get<T>(documentRef: DocumentReference<T>): Promise<DocumentSnapshot<T>> {\n const ref = validateReference<T>(documentRef, this._firestore);\n const userDataWriter = new ExpUserDataWriter(this._firestore);\n return super\n .get(documentRef)\n .then(\n liteDocumentSnapshot =>\n new DocumentSnapshot(\n this._firestore,\n userDataWriter,\n ref._key,\n liteDocumentSnapshot._document,\n new SnapshotMetadata(\n /* hasPendingWrites= */ false,\n /* fromCache= */ false\n ),\n ref.converter\n )\n );\n }\n}\n\n/**\n * Executes the given `updateFunction` and then attempts to commit the changes\n * applied within the transaction. If any document read within the transaction\n * has changed, Cloud Firestore retries the `updateFunction`. If it fails to\n * commit after 5 attempts, the transaction fails.\n *\n * The maximum number of writes allowed in a single transaction is 500.\n *\n * @param firestore - A reference to the Firestore database to run this\n * transaction against.\n * @param updateFunction - The function to execute within the transaction\n * context.\n * @returns If the transaction completed successfully or was explicitly aborted\n * (the `updateFunction` returned a failed promise), the promise returned by the\n * `updateFunction `is returned here. Otherwise, if the transaction failed, a\n * rejected promise with the corresponding failure error is returned.\n */\nexport function runTransaction<T>(\n firestore: FirebaseFirestore,\n updateFunction: (transaction: Transaction) => Promise<T>\n): Promise<T> {\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientTransaction(client, internalTransaction =>\n updateFunction(new Transaction(firestore, internalTransaction))\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance } from '@firebase/util';\n\nimport { Transaction as InternalTransaction } from '../core/transaction';\nimport { TransactionRunner } from '../core/transaction_runner';\nimport { fail } from '../util/assert';\nimport { newAsyncQueue } from '../util/async_queue_impl';\nimport { cast } from '../util/input_validation';\nimport { Deferred } from '../util/promise';\n\nimport { getDatastore } from './components';\nimport { FirebaseFirestore } from './database';\nimport { FieldPath } from './field_path';\nimport { DocumentReference, SetOptions, UpdateData } from './reference';\nimport {\n applyFirestoreDataConverter,\n LiteUserDataWriter\n} from './reference_impl';\nimport { DocumentSnapshot } from './snapshot';\nimport {\n newUserDataReader,\n parseSetData,\n parseUpdateData,\n parseUpdateVarargs,\n UserDataReader\n} from './user_data_reader';\nimport { validateReference } from './write_batch';\n\n// TODO(mrschmidt) Consider using `BaseTransaction` as the base class in the\n// legacy SDK.\n\n/**\n * A reference to a transaction.\n *\n * The `Transaction` object passed to a transaction's `updateFunction` provides\n * the methods to read and write data within the transaction context. See\n * {@link runTransaction}.\n */\nexport class Transaction {\n // This is the tree-shakeable version of the Transaction class used in the\n // legacy SDK. The class is a close copy but takes different input and output\n // types. The firestore-exp SDK further extends this class to return its API\n // type.\n\n private readonly _dataReader: UserDataReader;\n\n /** @hideconstructor */\n constructor(\n protected readonly _firestore: FirebaseFirestore,\n private readonly _transaction: InternalTransaction\n ) {\n this._dataReader = newUserDataReader(_firestore);\n }\n\n /**\n * Reads the document referenced by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be read.\n * @returns A `DocumentSnapshot` with the read data.\n */\n get<T>(documentRef: DocumentReference<T>): Promise<DocumentSnapshot<T>> {\n const ref = validateReference(documentRef, this._firestore);\n const userDataWriter = new LiteUserDataWriter(this._firestore);\n return this._transaction.lookup([ref._key]).then(docs => {\n if (!docs || docs.length !== 1) {\n return fail('Mismatch in docs returned from document lookup.');\n }\n const doc = docs[0];\n if (doc.isFoundDocument()) {\n return new DocumentSnapshot(\n this._firestore,\n userDataWriter,\n doc.key,\n doc,\n ref.converter\n );\n } else if (doc.isNoDocument()) {\n return new DocumentSnapshot(\n this._firestore,\n userDataWriter,\n ref._key,\n null,\n ref.converter\n );\n } else {\n throw fail(\n `BatchGetDocumentsRequest returned unexpected document: ${doc}`\n );\n }\n });\n }\n\n /**\n * Writes to the document referred to by the provided {@link\n * DocumentReference}. If the document does not exist yet, it will be created.\n *\n * @param documentRef - A reference to the document to be set.\n * @param data - An object of the fields and values for the document.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */\n set<T>(documentRef: DocumentReference<T>, data: T): this;\n /**\n * Writes to the document referred to by the provided {@link\n * DocumentReference}. If the document does not exist yet, it will be created.\n * If you provide `merge` or `mergeFields`, the provided data can be merged\n * into an existing document.\n *\n * @param documentRef - A reference to the document to be set.\n * @param data - An object of the fields and values for the document.\n * @param options - An object to configure the set behavior.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */\n set<T>(\n documentRef: DocumentReference<T>,\n data: Partial<T>,\n options: SetOptions\n ): this;\n set<T>(\n documentRef: DocumentReference<T>,\n value: T,\n options?: SetOptions\n ): this {\n const ref = validateReference(documentRef, this._firestore);\n const convertedValue = applyFirestoreDataConverter(\n ref.converter,\n value,\n options\n );\n const parsed = parseSetData(\n this._dataReader,\n 'Transaction.set',\n ref._key,\n convertedValue,\n ref.converter !== null,\n options\n );\n this._transaction.set(ref._key, parsed);\n return this;\n }\n\n /**\n * Updates fields in the document referred to by the provided {@link\n * DocumentReference}. The update will fail if applied to a document that does\n * not exist.\n *\n * @param documentRef - A reference to the document to be updated.\n * @param data - An object containing the fields and values with which to\n * update the document. Fields can contain dots to reference nested fields\n * within the document.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */\n update(documentRef: DocumentReference<unknown>, data: UpdateData): this;\n /**\n * Updates fields in the document referred to by the provided {@link\n * DocumentReference}. The update will fail if applied to a document that does\n * not exist.\n *\n * Nested fields can be updated by providing dot-separated field path\n * strings or by providing `FieldPath` objects.\n *\n * @param documentRef - A reference to the document to be updated.\n * @param field - The first field to update.\n * @param value - The first value.\n * @param moreFieldsAndValues - Additional key/value pairs.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */\n update(\n documentRef: DocumentReference<unknown>,\n field: string | FieldPath,\n value: unknown,\n ...moreFieldsAndValues: unknown[]\n ): this;\n update(\n documentRef: DocumentReference<unknown>,\n fieldOrUpdateData: string | FieldPath | UpdateData,\n value?: unknown,\n ...moreFieldsAndValues: unknown[]\n ): this {\n const ref = validateReference(documentRef, this._firestore);\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n fieldOrUpdateData = getModularInstance(fieldOrUpdateData);\n\n let parsed;\n if (\n typeof fieldOrUpdateData === 'string' ||\n fieldOrUpdateData instanceof FieldPath\n ) {\n parsed = parseUpdateVarargs(\n this._dataReader,\n 'Transaction.update',\n ref._key,\n fieldOrUpdateData,\n value,\n moreFieldsAndValues\n );\n } else {\n parsed = parseUpdateData(\n this._dataReader,\n 'Transaction.update',\n ref._key,\n fieldOrUpdateData\n );\n }\n\n this._transaction.update(ref._key, parsed);\n return this;\n }\n\n /**\n * Deletes the document referred to by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be deleted.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */\n delete(documentRef: DocumentReference<unknown>): this {\n const ref = validateReference(documentRef, this._firestore);\n this._transaction.delete(ref._key);\n return this;\n }\n}\n\n/**\n * Executes the given `updateFunction` and then attempts to commit the changes\n * applied within the transaction. If any document read within the transaction\n * has changed, Cloud Firestore retries the `updateFunction`. If it fails to\n * commit after 5 attempts, the transaction fails.\n *\n * The maximum number of writes allowed in a single transaction is 500.\n *\n * @param firestore - A reference to the Firestore database to run this\n * transaction against.\n * @param updateFunction - The function to execute within the transaction\n * context.\n * @returns If the transaction completed successfully or was explicitly aborted\n * (the `updateFunction` returned a failed promise), the promise returned by the\n * `updateFunction `is returned here. Otherwise, if the transaction failed, a\n * rejected promise with the corresponding failure error is returned.\n */\nexport function runTransaction<T>(\n firestore: FirebaseFirestore,\n updateFunction: (transaction: Transaction) => Promise<T>\n): Promise<T> {\n firestore = cast(firestore, FirebaseFirestore);\n const datastore = getDatastore(firestore);\n const deferred = new Deferred<T>();\n new TransactionRunner<T>(\n newAsyncQueue(),\n datastore,\n internalTransaction =>\n updateFunction(new Transaction(firestore, internalTransaction)),\n deferred\n ).run();\n return deferred.promise;\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FieldValue } from './field_value';\nimport {\n ArrayRemoveFieldValueImpl,\n ArrayUnionFieldValueImpl,\n DeleteFieldValueImpl,\n NumericIncrementFieldValueImpl,\n ServerTimestampFieldValueImpl\n} from './user_data_reader';\n\n/**\n * Returns a sentinel for use with {@link @firebase/firestore/lite#(updateDoc:1)} or\n * {@link @firebase/firestore/lite#(setDoc:1)} with `{merge: true}` to mark a field for deletion.\n */\nexport function deleteField(): FieldValue {\n return new DeleteFieldValueImpl('deleteField');\n}\n\n/**\n * Returns a sentinel used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link @firebase/firestore/lite#(updateDoc:1)} to\n * include a server-generated timestamp in the written data.\n */\nexport function serverTimestamp(): FieldValue {\n return new ServerTimestampFieldValueImpl('serverTimestamp');\n}\n\n/**\n * Returns a special value that can be used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link\n * @firebase/firestore/lite#(updateDoc:1)} that tells the server to union the given elements with any array\n * value that already exists on the server. Each specified element that doesn't\n * already exist in the array will be added to the end. If the field being\n * modified is not already an array it will be overwritten with an array\n * containing exactly the specified elements.\n *\n * @param elements - The elements to union into the array.\n * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or\n * `updateDoc()`.\n */\nexport function arrayUnion(...elements: unknown[]): FieldValue {\n // NOTE: We don't actually parse the data until it's used in set() or\n // update() since we'd need the Firestore instance to do this.\n return new ArrayUnionFieldValueImpl('arrayUnion', elements);\n}\n\n/**\n * Returns a special value that can be used with {@link (setDoc:1)} or {@link\n * updateDoc:1} that tells the server to remove the given elements from any\n * array value that already exists on the server. All instances of each element\n * specified will be removed from the array. If the field being modified is not\n * already an array it will be overwritten with an empty array.\n *\n * @param elements - The elements to remove from the array.\n * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or\n * `updateDoc()`\n */\nexport function arrayRemove(...elements: unknown[]): FieldValue {\n // NOTE: We don't actually parse the data until it's used in set() or\n // update() since we'd need the Firestore instance to do this.\n return new ArrayRemoveFieldValueImpl('arrayRemove', elements);\n}\n\n/**\n * Returns a special value that can be used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link\n * @firebase/firestore/lite#(updateDoc:1)} that tells the server to increment the field's current value by\n * the given value.\n *\n * If either the operand or the current field value uses floating point\n * precision, all arithmetic follows IEEE 754 semantics. If both values are\n * integers, values outside of JavaScript's safe number range\n * (`Number.MIN_SAFE_INTEGER` to `Number.MAX_SAFE_INTEGER`) are also subject to\n * precision loss. Furthermore, once processed by the Firestore backend, all\n * integer operations are capped between -2^63 and 2^63-1.\n *\n * If the current field value is not of type `number`, or if the field does not\n * yet exist, the transformation sets the field to the given value.\n *\n * @param n - The value to increment by.\n * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or\n * `updateDoc()`\n */\nexport function increment(n: number): FieldValue {\n return new NumericIncrementFieldValueImpl('increment', n);\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WriteBatch } from '../lite/write_batch';\nimport { cast } from '../util/input_validation';\n\nimport { ensureFirestoreConfigured, FirebaseFirestore } from './database';\nimport { executeWrite } from './reference_impl';\n\nexport { WriteBatch };\n\n/**\n * Creates a write batch, used for performing multiple writes as a single\n * atomic operation. The maximum number of writes allowed in a single WriteBatch\n * is 500.\n *\n * Unlike transactions, write batches are persisted offline and therefore are\n * preferable when you don't need to condition your writes on read data.\n *\n * @returns A `WriteBatch` that can be used to atomically execute multiple\n * writes.\n */\nexport function writeBatch(firestore: FirebaseFirestore): WriteBatch {\n firestore = cast(firestore, FirebaseFirestore);\n ensureFirestoreConfigured(firestore);\n return new WriteBatch(firestore, mutations =>\n executeWrite(firestore, mutations)\n );\n}\n", "/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n _registerComponent,\n registerVersion,\n SDK_VERSION\n} from '@firebase/app-exp';\nimport { Component, ComponentType } from '@firebase/component';\n\nimport { name, version } from '../package.json';\nimport { setSDKVersion } from '../src/core/version';\nimport { FirebaseFirestore } from '../src/exp/database';\nimport { PrivateSettings } from '../src/lite/settings';\n\ndeclare module '@firebase/component' {\n interface NameServiceMapping {\n 'firestore-exp': FirebaseFirestore;\n }\n}\n\nexport function registerFirestore(variant?: string): void {\n setSDKVersion(SDK_VERSION);\n _registerComponent(\n new Component(\n 'firestore-exp',\n (container, { options: settings }: { options?: PrivateSettings }) => {\n const app = container.getProvider('app-exp').getImmediate()!;\n const firestoreInstance = new FirebaseFirestore(\n app,\n container.getProvider('auth-internal')\n );\n settings = { useFetchStreams: false, ...settings };\n firestoreInstance._setSettings(settings);\n return firestoreInstance;\n },\n ComponentType.PUBLIC\n )\n );\n registerVersion(name, version, variant);\n}\n", "import React from \"react\";\n\n/**\n * Generic interface for authentication.\n */\nexport interface AuthContext {\n /**\n * The currently logged-in user. This will be\n * null if the user isn't logged in.\n */\n loggedInUser: { name: string; id: string } | null;\n\n /**\n * The name of the authentication provider, e.g. \"GitHub\",\n * or null if auth is disabled.\n */\n providerName: string | null;\n\n /**\n * If authentication failed for some reason, this will\n * be a string describing the error.\n */\n error?: string;\n\n /** Begin the login UI flow. */\n login(): void;\n\n /** Log out the user. */\n logout(): void;\n}\n\nexport const AuthContext = React.createContext<AuthContext>({\n loggedInUser: null,\n providerName: null,\n login() {},\n logout() {},\n});\n", "import React from \"react\";\n\nexport type GalleryCompositionKind = \"creature\" | \"mandala\";\n\nexport type GallerySubmitStatus = \"idle\" | \"submitting\" | \"error\";\n\nexport type GalleryComposition = {\n /** A unique identifier/primary key for the composition. */\n id: string;\n\n /** The type of composition. */\n kind: GalleryCompositionKind;\n\n /**\n * The serialized value of the composition. This\n * is interpreted differently based on the composition\n * type.\n */\n serializedValue: string;\n\n /** The user ID of the user who submitted the composition. */\n owner: string;\n\n /**\n * The name of the user who submitted the composition.\n */\n ownerName: string;\n\n /** The title of the composition. */\n title: string;\n\n /** When the composition was submitted to the gallery. */\n createdAt: Date;\n};\n\n/**\n * A generic interface for interacting with the gallery.\n */\nexport interface GalleryContext {\n /**\n * All the compositions in the gallery that have been loaded\n * from the network.\n */\n compositions: GalleryComposition[];\n\n /** The status of the most recent submission to the gallery. */\n submitStatus: GallerySubmitStatus;\n\n /**\n * Submit a composition to the gallery. On success, calls the\n * given callback, passing it the newly-assigned id of the\n * composition.\n *\n * If already in the process of submitting a composition, this\n * will do nothing.\n */\n submit(composition: Omit<GalleryComposition, \"id\" | \"createdAt\">): void;\n\n /** The most recent submission made via `submit()`, if any. */\n lastSubmission?: GalleryComposition;\n\n /** Whether we're currently loading the gallery from the network. */\n isLoading: boolean;\n\n /** If a network error occurred, this is it. */\n error?: string;\n\n /**\n * Attempt to refresh the gallery from the network. Return whether\n * the request was accepted (if we're already loading the gallery, or\n * if a prequisite service hasn't been initialized yet, this can\n * return `false`).\n */\n refresh(): boolean;\n\n /**\n * The timestamp (milliseconds since 1970) of the last time\n * the gallery data was refreshed. If it has never been loaded,\n * this will be 0.\n */\n lastRefresh: number;\n}\n\nexport const GalleryContext = React.createContext<GalleryContext>({\n compositions: [],\n isLoading: false,\n refresh: () => true,\n submitStatus: \"idle\",\n submit: () => {},\n lastRefresh: 0,\n});\n", "import React, { MouseEvent, useContext } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport type { PageName } from \"./pages\";\nimport { getFriendlyPageName } from \"./pages/friendly-page-names\";\n\nimport \"./page.css\";\n\nexport type PageContext = {\n currPage: PageName;\n allPages: PageName[];\n pushState: (href: string) => void;\n search: URLSearchParams;\n};\n\nexport const PageContext = React.createContext<PageContext>({\n currPage: \"vocabulary\",\n allPages: [],\n search: new URLSearchParams(),\n pushState: () => {\n throw new Error(\"No page context is defined!\");\n },\n});\n\nexport const PAGE_QUERY_ARG = \"p\";\n\nfunction isNormalLinkClick(e: MouseEvent): boolean {\n return !e.shiftKey && !e.altKey && !e.metaKey && !e.ctrlKey && e.button === 0;\n}\n\nconst PageLink: React.FC<{ page: PageName }> = ({ page }) => {\n const href = `?${PAGE_QUERY_ARG}=${encodeURIComponent(page)}`;\n const { pushState } = useContext(PageContext);\n const handleClick = (e: MouseEvent) => {\n if (isNormalLinkClick(e)) {\n pushState(href);\n e.preventDefault();\n }\n };\n\n return (\n <a href={href} onClick={handleClick}>\n {getFriendlyPageName(page)}\n </a>\n );\n};\n\nconst Navbar: React.FC<{}> = (props) => {\n const pc = useContext(PageContext);\n\n return (\n <nav>\n <ul className=\"navbar\">\n {pc.allPages.map((pageName) => (\n <li key={pageName}>\n {pc.currPage === pageName ? (\n getFriendlyPageName(pageName)\n ) : (\n <PageLink page={pageName} />\n )}\n </li>\n ))}\n </ul>\n </nav>\n );\n};\n\nexport type PageProps = {\n title: string;\n children?: any;\n};\n\nexport const Page: React.FC<PageProps> = ({ title, children }) => {\n const fullTitle = ` Mystic Symbolic ${title}`;\n\n return (\n <div className=\"page\">\n <Helmet>\n <title>{fullTitle}</title>\n </Helmet>\n <header>\n <h1>\n <img\n src=\"img/mysticsymbolic-logo-sun.svg\"\n alt=\"Mystic Symbolic\"\n title=\"Mystic Symbolic\"\n className=\"MSlogo\"\n />{\" \"}\n {title}\n </h1>\n <Navbar />\n </header>\n {children}\n <footer>\n <p>\n For more details about this project, see its{\" \"}\n <a\n href=\"https://github.com/toolness/mystic-symbolic\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n GitHub repository\n </a>{\" \"}\n and{\" \"}\n <a\n href=\"https://blog.ninapaley.com/category/mysticsymbolic/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Nina Paley's blog\n </a>\n . You can also{\" \"}\n <a\n href=\"https://www.gofundme.com/f/mysticsymbolic-development\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n donate to the project\n </a>\n .\n </p>\n </footer>\n </div>\n );\n};\n", "import PropTypes from 'prop-types';\nimport withSideEffect from 'react-side-effect';\nimport isEqual from 'react-fast-compare';\nimport React from 'react';\nimport objectAssign from 'object-assign';\n\nvar ATTRIBUTE_NAMES = {\n BODY: \"bodyAttributes\",\n HTML: \"htmlAttributes\",\n TITLE: \"titleAttributes\"\n};\n\nvar TAG_NAMES = {\n BASE: \"base\",\n BODY: \"body\",\n HEAD: \"head\",\n HTML: \"html\",\n LINK: \"link\",\n META: \"meta\",\n NOSCRIPT: \"noscript\",\n SCRIPT: \"script\",\n STYLE: \"style\",\n TITLE: \"title\"\n};\n\nvar VALID_TAG_NAMES = Object.keys(TAG_NAMES).map(function (name) {\n return TAG_NAMES[name];\n});\n\nvar TAG_PROPERTIES = {\n CHARSET: \"charset\",\n CSS_TEXT: \"cssText\",\n HREF: \"href\",\n HTTPEQUIV: \"http-equiv\",\n INNER_HTML: \"innerHTML\",\n ITEM_PROP: \"itemprop\",\n NAME: \"name\",\n PROPERTY: \"property\",\n REL: \"rel\",\n SRC: \"src\",\n TARGET: \"target\"\n};\n\nvar REACT_TAG_MAP = {\n accesskey: \"accessKey\",\n charset: \"charSet\",\n class: \"className\",\n contenteditable: \"contentEditable\",\n contextmenu: \"contextMenu\",\n \"http-equiv\": \"httpEquiv\",\n itemprop: \"itemProp\",\n tabindex: \"tabIndex\"\n};\n\nvar HELMET_PROPS = {\n DEFAULT_TITLE: \"defaultTitle\",\n DEFER: \"defer\",\n ENCODE_SPECIAL_CHARACTERS: \"encodeSpecialCharacters\",\n ON_CHANGE_CLIENT_STATE: \"onChangeClientState\",\n TITLE_TEMPLATE: \"titleTemplate\"\n};\n\nvar HTML_TAG_MAP = Object.keys(REACT_TAG_MAP).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key]] = key;\n return obj;\n}, {});\n\nvar SELF_CLOSING_TAGS = [TAG_NAMES.NOSCRIPT, TAG_NAMES.SCRIPT, TAG_NAMES.STYLE];\n\nvar HELMET_ATTRIBUTE = \"data-react-helmet\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar objectWithoutProperties = function (obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n};\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar encodeSpecialCharacters = function encodeSpecialCharacters(str) {\n var encode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (encode === false) {\n return String(str);\n }\n\n return String(str).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&#x27;\");\n};\n\nvar getTitleFromPropsList = function getTitleFromPropsList(propsList) {\n var innermostTitle = getInnermostProperty(propsList, TAG_NAMES.TITLE);\n var innermostTemplate = getInnermostProperty(propsList, HELMET_PROPS.TITLE_TEMPLATE);\n\n if (innermostTemplate && innermostTitle) {\n // use function arg to avoid need to escape $ characters\n return innermostTemplate.replace(/%s/g, function () {\n return Array.isArray(innermostTitle) ? innermostTitle.join(\"\") : innermostTitle;\n });\n }\n\n var innermostDefaultTitle = getInnermostProperty(propsList, HELMET_PROPS.DEFAULT_TITLE);\n\n return innermostTitle || innermostDefaultTitle || undefined;\n};\n\nvar getOnChangeClientState = function getOnChangeClientState(propsList) {\n return getInnermostProperty(propsList, HELMET_PROPS.ON_CHANGE_CLIENT_STATE) || function () {};\n};\n\nvar getAttributesFromPropsList = function getAttributesFromPropsList(tagType, propsList) {\n return propsList.filter(function (props) {\n return typeof props[tagType] !== \"undefined\";\n }).map(function (props) {\n return props[tagType];\n }).reduce(function (tagAttrs, current) {\n return _extends({}, tagAttrs, current);\n }, {});\n};\n\nvar getBaseTagFromPropsList = function getBaseTagFromPropsList(primaryAttributes, propsList) {\n return propsList.filter(function (props) {\n return typeof props[TAG_NAMES.BASE] !== \"undefined\";\n }).map(function (props) {\n return props[TAG_NAMES.BASE];\n }).reverse().reduce(function (innermostBaseTag, tag) {\n if (!innermostBaseTag.length) {\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && tag[lowerCaseAttributeKey]) {\n return innermostBaseTag.concat(tag);\n }\n }\n }\n\n return innermostBaseTag;\n }, []);\n};\n\nvar getTagsFromPropsList = function getTagsFromPropsList(tagName, primaryAttributes, propsList) {\n // Calculate list of tags, giving priority innermost component (end of the propslist)\n var approvedSeenTags = {};\n\n return propsList.filter(function (props) {\n if (Array.isArray(props[tagName])) {\n return true;\n }\n if (typeof props[tagName] !== \"undefined\") {\n warn(\"Helmet: \" + tagName + \" should be of type \\\"Array\\\". Instead found type \\\"\" + _typeof(props[tagName]) + \"\\\"\");\n }\n return false;\n }).map(function (props) {\n return props[tagName];\n }).reverse().reduce(function (approvedTags, instanceTags) {\n var instanceSeenTags = {};\n\n instanceTags.filter(function (tag) {\n var primaryAttributeKey = void 0;\n var keys = Object.keys(tag);\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n // Special rule with link tags, since rel and href are both primary tags, rel takes priority\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && !(primaryAttributeKey === TAG_PROPERTIES.REL && tag[primaryAttributeKey].toLowerCase() === \"canonical\") && !(lowerCaseAttributeKey === TAG_PROPERTIES.REL && tag[lowerCaseAttributeKey].toLowerCase() === \"stylesheet\")) {\n primaryAttributeKey = lowerCaseAttributeKey;\n }\n // Special case for innerHTML which doesn't work lowercased\n if (primaryAttributes.indexOf(attributeKey) !== -1 && (attributeKey === TAG_PROPERTIES.INNER_HTML || attributeKey === TAG_PROPERTIES.CSS_TEXT || attributeKey === TAG_PROPERTIES.ITEM_PROP)) {\n primaryAttributeKey = attributeKey;\n }\n }\n\n if (!primaryAttributeKey || !tag[primaryAttributeKey]) {\n return false;\n }\n\n var value = tag[primaryAttributeKey].toLowerCase();\n\n if (!approvedSeenTags[primaryAttributeKey]) {\n approvedSeenTags[primaryAttributeKey] = {};\n }\n\n if (!instanceSeenTags[primaryAttributeKey]) {\n instanceSeenTags[primaryAttributeKey] = {};\n }\n\n if (!approvedSeenTags[primaryAttributeKey][value]) {\n instanceSeenTags[primaryAttributeKey][value] = true;\n return true;\n }\n\n return false;\n }).reverse().forEach(function (tag) {\n return approvedTags.push(tag);\n });\n\n // Update seen tags with tags from this instance\n var keys = Object.keys(instanceSeenTags);\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var tagUnion = objectAssign({}, approvedSeenTags[attributeKey], instanceSeenTags[attributeKey]);\n\n approvedSeenTags[attributeKey] = tagUnion;\n }\n\n return approvedTags;\n }, []).reverse();\n};\n\nvar getInnermostProperty = function getInnermostProperty(propsList, property) {\n for (var i = propsList.length - 1; i >= 0; i--) {\n var props = propsList[i];\n\n if (props.hasOwnProperty(property)) {\n return props[property];\n }\n }\n\n return null;\n};\n\nvar reducePropsToState = function reducePropsToState(propsList) {\n return {\n baseTag: getBaseTagFromPropsList([TAG_PROPERTIES.HREF, TAG_PROPERTIES.TARGET], propsList),\n bodyAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.BODY, propsList),\n defer: getInnermostProperty(propsList, HELMET_PROPS.DEFER),\n encode: getInnermostProperty(propsList, HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),\n htmlAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.HTML, propsList),\n linkTags: getTagsFromPropsList(TAG_NAMES.LINK, [TAG_PROPERTIES.REL, TAG_PROPERTIES.HREF], propsList),\n metaTags: getTagsFromPropsList(TAG_NAMES.META, [TAG_PROPERTIES.NAME, TAG_PROPERTIES.CHARSET, TAG_PROPERTIES.HTTPEQUIV, TAG_PROPERTIES.PROPERTY, TAG_PROPERTIES.ITEM_PROP], propsList),\n noscriptTags: getTagsFromPropsList(TAG_NAMES.NOSCRIPT, [TAG_PROPERTIES.INNER_HTML], propsList),\n onChangeClientState: getOnChangeClientState(propsList),\n scriptTags: getTagsFromPropsList(TAG_NAMES.SCRIPT, [TAG_PROPERTIES.SRC, TAG_PROPERTIES.INNER_HTML], propsList),\n styleTags: getTagsFromPropsList(TAG_NAMES.STYLE, [TAG_PROPERTIES.CSS_TEXT], propsList),\n title: getTitleFromPropsList(propsList),\n titleAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.TITLE, propsList)\n };\n};\n\nvar rafPolyfill = function () {\n var clock = Date.now();\n\n return function (callback) {\n var currentTime = Date.now();\n\n if (currentTime - clock > 16) {\n clock = currentTime;\n callback(currentTime);\n } else {\n setTimeout(function () {\n rafPolyfill(callback);\n }, 0);\n }\n };\n}();\n\nvar cafPolyfill = function cafPolyfill(id) {\n return clearTimeout(id);\n};\n\nvar requestAnimationFrame = typeof window !== \"undefined\" ? window.requestAnimationFrame && window.requestAnimationFrame.bind(window) || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || rafPolyfill : global.requestAnimationFrame || rafPolyfill;\n\nvar cancelAnimationFrame = typeof window !== \"undefined\" ? window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || cafPolyfill : global.cancelAnimationFrame || cafPolyfill;\n\nvar warn = function warn(msg) {\n return console && typeof console.warn === \"function\" && console.warn(msg);\n};\n\nvar _helmetCallback = null;\n\nvar handleClientStateChange = function handleClientStateChange(newState) {\n if (_helmetCallback) {\n cancelAnimationFrame(_helmetCallback);\n }\n\n if (newState.defer) {\n _helmetCallback = requestAnimationFrame(function () {\n commitTagChanges(newState, function () {\n _helmetCallback = null;\n });\n });\n } else {\n commitTagChanges(newState);\n _helmetCallback = null;\n }\n};\n\nvar commitTagChanges = function commitTagChanges(newState, cb) {\n var baseTag = newState.baseTag,\n bodyAttributes = newState.bodyAttributes,\n htmlAttributes = newState.htmlAttributes,\n linkTags = newState.linkTags,\n metaTags = newState.metaTags,\n noscriptTags = newState.noscriptTags,\n onChangeClientState = newState.onChangeClientState,\n scriptTags = newState.scriptTags,\n styleTags = newState.styleTags,\n title = newState.title,\n titleAttributes = newState.titleAttributes;\n\n updateAttributes(TAG_NAMES.BODY, bodyAttributes);\n updateAttributes(TAG_NAMES.HTML, htmlAttributes);\n\n updateTitle(title, titleAttributes);\n\n var tagUpdates = {\n baseTag: updateTags(TAG_NAMES.BASE, baseTag),\n linkTags: updateTags(TAG_NAMES.LINK, linkTags),\n metaTags: updateTags(TAG_NAMES.META, metaTags),\n noscriptTags: updateTags(TAG_NAMES.NOSCRIPT, noscriptTags),\n scriptTags: updateTags(TAG_NAMES.SCRIPT, scriptTags),\n styleTags: updateTags(TAG_NAMES.STYLE, styleTags)\n };\n\n var addedTags = {};\n var removedTags = {};\n\n Object.keys(tagUpdates).forEach(function (tagType) {\n var _tagUpdates$tagType = tagUpdates[tagType],\n newTags = _tagUpdates$tagType.newTags,\n oldTags = _tagUpdates$tagType.oldTags;\n\n\n if (newTags.length) {\n addedTags[tagType] = newTags;\n }\n if (oldTags.length) {\n removedTags[tagType] = tagUpdates[tagType].oldTags;\n }\n });\n\n cb && cb();\n\n onChangeClientState(newState, addedTags, removedTags);\n};\n\nvar flattenArray = function flattenArray(possibleArray) {\n return Array.isArray(possibleArray) ? possibleArray.join(\"\") : possibleArray;\n};\n\nvar updateTitle = function updateTitle(title, attributes) {\n if (typeof title !== \"undefined\" && document.title !== title) {\n document.title = flattenArray(title);\n }\n\n updateAttributes(TAG_NAMES.TITLE, attributes);\n};\n\nvar updateAttributes = function updateAttributes(tagName, attributes) {\n var elementTag = document.getElementsByTagName(tagName)[0];\n\n if (!elementTag) {\n return;\n }\n\n var helmetAttributeString = elementTag.getAttribute(HELMET_ATTRIBUTE);\n var helmetAttributes = helmetAttributeString ? helmetAttributeString.split(\",\") : [];\n var attributesToRemove = [].concat(helmetAttributes);\n var attributeKeys = Object.keys(attributes);\n\n for (var i = 0; i < attributeKeys.length; i++) {\n var attribute = attributeKeys[i];\n var value = attributes[attribute] || \"\";\n\n if (elementTag.getAttribute(attribute) !== value) {\n elementTag.setAttribute(attribute, value);\n }\n\n if (helmetAttributes.indexOf(attribute) === -1) {\n helmetAttributes.push(attribute);\n }\n\n var indexToSave = attributesToRemove.indexOf(attribute);\n if (indexToSave !== -1) {\n attributesToRemove.splice(indexToSave, 1);\n }\n }\n\n for (var _i = attributesToRemove.length - 1; _i >= 0; _i--) {\n elementTag.removeAttribute(attributesToRemove[_i]);\n }\n\n if (helmetAttributes.length === attributesToRemove.length) {\n elementTag.removeAttribute(HELMET_ATTRIBUTE);\n } else if (elementTag.getAttribute(HELMET_ATTRIBUTE) !== attributeKeys.join(\",\")) {\n elementTag.setAttribute(HELMET_ATTRIBUTE, attributeKeys.join(\",\"));\n }\n};\n\nvar updateTags = function updateTags(type, tags) {\n var headElement = document.head || document.querySelector(TAG_NAMES.HEAD);\n var tagNodes = headElement.querySelectorAll(type + \"[\" + HELMET_ATTRIBUTE + \"]\");\n var oldTags = Array.prototype.slice.call(tagNodes);\n var newTags = [];\n var indexToDelete = void 0;\n\n if (tags && tags.length) {\n tags.forEach(function (tag) {\n var newElement = document.createElement(type);\n\n for (var attribute in tag) {\n if (tag.hasOwnProperty(attribute)) {\n if (attribute === TAG_PROPERTIES.INNER_HTML) {\n newElement.innerHTML = tag.innerHTML;\n } else if (attribute === TAG_PROPERTIES.CSS_TEXT) {\n if (newElement.styleSheet) {\n newElement.styleSheet.cssText = tag.cssText;\n } else {\n newElement.appendChild(document.createTextNode(tag.cssText));\n }\n } else {\n var value = typeof tag[attribute] === \"undefined\" ? \"\" : tag[attribute];\n newElement.setAttribute(attribute, value);\n }\n }\n }\n\n newElement.setAttribute(HELMET_ATTRIBUTE, \"true\");\n\n // Remove a duplicate tag from domTagstoRemove, so it isn't cleared.\n if (oldTags.some(function (existingTag, index) {\n indexToDelete = index;\n return newElement.isEqualNode(existingTag);\n })) {\n oldTags.splice(indexToDelete, 1);\n } else {\n newTags.push(newElement);\n }\n });\n }\n\n oldTags.forEach(function (tag) {\n return tag.parentNode.removeChild(tag);\n });\n newTags.forEach(function (tag) {\n return headElement.appendChild(tag);\n });\n\n return {\n oldTags: oldTags,\n newTags: newTags\n };\n};\n\nvar generateElementAttributesAsString = function generateElementAttributesAsString(attributes) {\n return Object.keys(attributes).reduce(function (str, key) {\n var attr = typeof attributes[key] !== \"undefined\" ? key + \"=\\\"\" + attributes[key] + \"\\\"\" : \"\" + key;\n return str ? str + \" \" + attr : attr;\n }, \"\");\n};\n\nvar generateTitleAsString = function generateTitleAsString(type, title, attributes, encode) {\n var attributeString = generateElementAttributesAsString(attributes);\n var flattenedTitle = flattenArray(title);\n return attributeString ? \"<\" + type + \" \" + HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeString + \">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"</\" + type + \">\" : \"<\" + type + \" \" + HELMET_ATTRIBUTE + \"=\\\"true\\\">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"</\" + type + \">\";\n};\n\nvar generateTagsAsString = function generateTagsAsString(type, tags, encode) {\n return tags.reduce(function (str, tag) {\n var attributeHtml = Object.keys(tag).filter(function (attribute) {\n return !(attribute === TAG_PROPERTIES.INNER_HTML || attribute === TAG_PROPERTIES.CSS_TEXT);\n }).reduce(function (string, attribute) {\n var attr = typeof tag[attribute] === \"undefined\" ? attribute : attribute + \"=\\\"\" + encodeSpecialCharacters(tag[attribute], encode) + \"\\\"\";\n return string ? string + \" \" + attr : attr;\n }, \"\");\n\n var tagContent = tag.innerHTML || tag.cssText || \"\";\n\n var isSelfClosing = SELF_CLOSING_TAGS.indexOf(type) === -1;\n\n return str + \"<\" + type + \" \" + HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeHtml + (isSelfClosing ? \"/>\" : \">\" + tagContent + \"</\" + type + \">\");\n }, \"\");\n};\n\nvar convertElementAttributestoReactProps = function convertElementAttributestoReactProps(attributes) {\n var initProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return Object.keys(attributes).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key] || key] = attributes[key];\n return obj;\n }, initProps);\n};\n\nvar convertReactPropstoHtmlAttributes = function convertReactPropstoHtmlAttributes(props) {\n var initAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return Object.keys(props).reduce(function (obj, key) {\n obj[HTML_TAG_MAP[key] || key] = props[key];\n return obj;\n }, initAttributes);\n};\n\nvar generateTitleAsReactComponent = function generateTitleAsReactComponent(type, title, attributes) {\n var _initProps;\n\n // assigning into an array to define toString function on it\n var initProps = (_initProps = {\n key: title\n }, _initProps[HELMET_ATTRIBUTE] = true, _initProps);\n var props = convertElementAttributestoReactProps(attributes, initProps);\n\n return [React.createElement(TAG_NAMES.TITLE, props, title)];\n};\n\nvar generateTagsAsReactComponent = function generateTagsAsReactComponent(type, tags) {\n return tags.map(function (tag, i) {\n var _mappedTag;\n\n var mappedTag = (_mappedTag = {\n key: i\n }, _mappedTag[HELMET_ATTRIBUTE] = true, _mappedTag);\n\n Object.keys(tag).forEach(function (attribute) {\n var mappedAttribute = REACT_TAG_MAP[attribute] || attribute;\n\n if (mappedAttribute === TAG_PROPERTIES.INNER_HTML || mappedAttribute === TAG_PROPERTIES.CSS_TEXT) {\n var content = tag.innerHTML || tag.cssText;\n mappedTag.dangerouslySetInnerHTML = { __html: content };\n } else {\n mappedTag[mappedAttribute] = tag[attribute];\n }\n });\n\n return React.createElement(type, mappedTag);\n });\n};\n\nvar getMethodsForTag = function getMethodsForTag(type, tags, encode) {\n switch (type) {\n case TAG_NAMES.TITLE:\n return {\n toComponent: function toComponent() {\n return generateTitleAsReactComponent(type, tags.title, tags.titleAttributes, encode);\n },\n toString: function toString() {\n return generateTitleAsString(type, tags.title, tags.titleAttributes, encode);\n }\n };\n case ATTRIBUTE_NAMES.BODY:\n case ATTRIBUTE_NAMES.HTML:\n return {\n toComponent: function toComponent() {\n return convertElementAttributestoReactProps(tags);\n },\n toString: function toString() {\n return generateElementAttributesAsString(tags);\n }\n };\n default:\n return {\n toComponent: function toComponent() {\n return generateTagsAsReactComponent(type, tags);\n },\n toString: function toString() {\n return generateTagsAsString(type, tags, encode);\n }\n };\n }\n};\n\nvar mapStateOnServer = function mapStateOnServer(_ref) {\n var baseTag = _ref.baseTag,\n bodyAttributes = _ref.bodyAttributes,\n encode = _ref.encode,\n htmlAttributes = _ref.htmlAttributes,\n linkTags = _ref.linkTags,\n metaTags = _ref.metaTags,\n noscriptTags = _ref.noscriptTags,\n scriptTags = _ref.scriptTags,\n styleTags = _ref.styleTags,\n _ref$title = _ref.title,\n title = _ref$title === undefined ? \"\" : _ref$title,\n titleAttributes = _ref.titleAttributes;\n return {\n base: getMethodsForTag(TAG_NAMES.BASE, baseTag, encode),\n bodyAttributes: getMethodsForTag(ATTRIBUTE_NAMES.BODY, bodyAttributes, encode),\n htmlAttributes: getMethodsForTag(ATTRIBUTE_NAMES.HTML, htmlAttributes, encode),\n link: getMethodsForTag(TAG_NAMES.LINK, linkTags, encode),\n meta: getMethodsForTag(TAG_NAMES.META, metaTags, encode),\n noscript: getMethodsForTag(TAG_NAMES.NOSCRIPT, noscriptTags, encode),\n script: getMethodsForTag(TAG_NAMES.SCRIPT, scriptTags, encode),\n style: getMethodsForTag(TAG_NAMES.STYLE, styleTags, encode),\n title: getMethodsForTag(TAG_NAMES.TITLE, { title: title, titleAttributes: titleAttributes }, encode)\n };\n};\n\nvar Helmet = function Helmet(Component) {\n var _class, _temp;\n\n return _temp = _class = function (_React$Component) {\n inherits(HelmetWrapper, _React$Component);\n\n function HelmetWrapper() {\n classCallCheck(this, HelmetWrapper);\n return possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n HelmetWrapper.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return !isEqual(this.props, nextProps);\n };\n\n HelmetWrapper.prototype.mapNestedChildrenToProps = function mapNestedChildrenToProps(child, nestedChildren) {\n if (!nestedChildren) {\n return null;\n }\n\n switch (child.type) {\n case TAG_NAMES.SCRIPT:\n case TAG_NAMES.NOSCRIPT:\n return {\n innerHTML: nestedChildren\n };\n\n case TAG_NAMES.STYLE:\n return {\n cssText: nestedChildren\n };\n }\n\n throw new Error(\"<\" + child.type + \" /> elements are self-closing and can not contain children. Refer to our API for more information.\");\n };\n\n HelmetWrapper.prototype.flattenArrayTypeChildren = function flattenArrayTypeChildren(_ref) {\n var _babelHelpers$extends;\n\n var child = _ref.child,\n arrayTypeChildren = _ref.arrayTypeChildren,\n newChildProps = _ref.newChildProps,\n nestedChildren = _ref.nestedChildren;\n\n return _extends({}, arrayTypeChildren, (_babelHelpers$extends = {}, _babelHelpers$extends[child.type] = [].concat(arrayTypeChildren[child.type] || [], [_extends({}, newChildProps, this.mapNestedChildrenToProps(child, nestedChildren))]), _babelHelpers$extends));\n };\n\n HelmetWrapper.prototype.mapObjectTypeChildren = function mapObjectTypeChildren(_ref2) {\n var _babelHelpers$extends2, _babelHelpers$extends3;\n\n var child = _ref2.child,\n newProps = _ref2.newProps,\n newChildProps = _ref2.newChildProps,\n nestedChildren = _ref2.nestedChildren;\n\n switch (child.type) {\n case TAG_NAMES.TITLE:\n return _extends({}, newProps, (_babelHelpers$extends2 = {}, _babelHelpers$extends2[child.type] = nestedChildren, _babelHelpers$extends2.titleAttributes = _extends({}, newChildProps), _babelHelpers$extends2));\n\n case TAG_NAMES.BODY:\n return _extends({}, newProps, {\n bodyAttributes: _extends({}, newChildProps)\n });\n\n case TAG_NAMES.HTML:\n return _extends({}, newProps, {\n htmlAttributes: _extends({}, newChildProps)\n });\n }\n\n return _extends({}, newProps, (_babelHelpers$extends3 = {}, _babelHelpers$extends3[child.type] = _extends({}, newChildProps), _babelHelpers$extends3));\n };\n\n HelmetWrapper.prototype.mapArrayTypeChildrenToProps = function mapArrayTypeChildrenToProps(arrayTypeChildren, newProps) {\n var newFlattenedProps = _extends({}, newProps);\n\n Object.keys(arrayTypeChildren).forEach(function (arrayChildName) {\n var _babelHelpers$extends4;\n\n newFlattenedProps = _extends({}, newFlattenedProps, (_babelHelpers$extends4 = {}, _babelHelpers$extends4[arrayChildName] = arrayTypeChildren[arrayChildName], _babelHelpers$extends4));\n });\n\n return newFlattenedProps;\n };\n\n HelmetWrapper.prototype.warnOnInvalidChildren = function warnOnInvalidChildren(child, nestedChildren) {\n if (process.env.NODE_ENV !== \"production\") {\n if (!VALID_TAG_NAMES.some(function (name) {\n return child.type === name;\n })) {\n if (typeof child.type === \"function\") {\n return warn(\"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.\");\n }\n\n return warn(\"Only elements types \" + VALID_TAG_NAMES.join(\", \") + \" are allowed. Helmet does not support rendering <\" + child.type + \"> elements. Refer to our API for more information.\");\n }\n\n if (nestedChildren && typeof nestedChildren !== \"string\" && (!Array.isArray(nestedChildren) || nestedChildren.some(function (nestedChild) {\n return typeof nestedChild !== \"string\";\n }))) {\n throw new Error(\"Helmet expects a string as a child of <\" + child.type + \">. Did you forget to wrap your children in braces? ( <\" + child.type + \">{``}</\" + child.type + \"> ) Refer to our API for more information.\");\n }\n }\n\n return true;\n };\n\n HelmetWrapper.prototype.mapChildrenToProps = function mapChildrenToProps(children, newProps) {\n var _this2 = this;\n\n var arrayTypeChildren = {};\n\n React.Children.forEach(children, function (child) {\n if (!child || !child.props) {\n return;\n }\n\n var _child$props = child.props,\n nestedChildren = _child$props.children,\n childProps = objectWithoutProperties(_child$props, [\"children\"]);\n\n var newChildProps = convertReactPropstoHtmlAttributes(childProps);\n\n _this2.warnOnInvalidChildren(child, nestedChildren);\n\n switch (child.type) {\n case TAG_NAMES.LINK:\n case TAG_NAMES.META:\n case TAG_NAMES.NOSCRIPT:\n case TAG_NAMES.SCRIPT:\n case TAG_NAMES.STYLE:\n arrayTypeChildren = _this2.flattenArrayTypeChildren({\n child: child,\n arrayTypeChildren: arrayTypeChildren,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n\n default:\n newProps = _this2.mapObjectTypeChildren({\n child: child,\n newProps: newProps,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n }\n });\n\n newProps = this.mapArrayTypeChildrenToProps(arrayTypeChildren, newProps);\n return newProps;\n };\n\n HelmetWrapper.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n props = objectWithoutProperties(_props, [\"children\"]);\n\n var newProps = _extends({}, props);\n\n if (children) {\n newProps = this.mapChildrenToProps(children, newProps);\n }\n\n return React.createElement(Component, newProps);\n };\n\n createClass(HelmetWrapper, null, [{\n key: \"canUseDOM\",\n\n\n // Component.peek comes from react-side-effect:\n // For testing, you may use a static peek() method available on the returned component.\n // It lets you get the current state without resetting the mounted instance stack.\n // Don\u2019t use it for anything other than testing.\n\n /**\n * @param {Object} base: {\"target\": \"_blank\", \"href\": \"http://mysite.com/\"}\n * @param {Object} bodyAttributes: {\"className\": \"root\"}\n * @param {String} defaultTitle: \"Default Title\"\n * @param {Boolean} defer: true\n * @param {Boolean} encodeSpecialCharacters: true\n * @param {Object} htmlAttributes: {\"lang\": \"en\", \"amp\": undefined}\n * @param {Array} link: [{\"rel\": \"canonical\", \"href\": \"http://mysite.com/example\"}]\n * @param {Array} meta: [{\"name\": \"description\", \"content\": \"Test description\"}]\n * @param {Array} noscript: [{\"innerHTML\": \"<img src='http://mysite.com/js/test.js'\"}]\n * @param {Function} onChangeClientState: \"(newState) => console.log(newState)\"\n * @param {Array} script: [{\"type\": \"text/javascript\", \"src\": \"http://mysite.com/js/test.js\"}]\n * @param {Array} style: [{\"type\": \"text/css\", \"cssText\": \"div { display: block; color: blue; }\"}]\n * @param {String} title: \"Title\"\n * @param {Object} titleAttributes: {\"itemprop\": \"name\"}\n * @param {String} titleTemplate: \"MySite.com - %s\"\n */\n set: function set$$1(canUseDOM) {\n Component.canUseDOM = canUseDOM;\n }\n }]);\n return HelmetWrapper;\n }(React.Component), _class.propTypes = {\n base: PropTypes.object,\n bodyAttributes: PropTypes.object,\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),\n defaultTitle: PropTypes.string,\n defer: PropTypes.bool,\n encodeSpecialCharacters: PropTypes.bool,\n htmlAttributes: PropTypes.object,\n link: PropTypes.arrayOf(PropTypes.object),\n meta: PropTypes.arrayOf(PropTypes.object),\n noscript: PropTypes.arrayOf(PropTypes.object),\n onChangeClientState: PropTypes.func,\n script: PropTypes.arrayOf(PropTypes.object),\n style: PropTypes.arrayOf(PropTypes.object),\n title: PropTypes.string,\n titleAttributes: PropTypes.object,\n titleTemplate: PropTypes.string\n }, _class.defaultProps = {\n defer: true,\n encodeSpecialCharacters: true\n }, _class.peek = Component.peek, _class.rewind = function () {\n var mappedState = Component.rewind();\n if (!mappedState) {\n // provide fallback if mappedState is undefined\n mappedState = mapStateOnServer({\n baseTag: [],\n bodyAttributes: {},\n encodeSpecialCharacters: true,\n htmlAttributes: {},\n linkTags: [],\n metaTags: [],\n noscriptTags: [],\n scriptTags: [],\n styleTags: [],\n title: \"\",\n titleAttributes: {}\n });\n }\n\n return mappedState;\n }, _temp;\n};\n\nvar NullComponent = function NullComponent() {\n return null;\n};\n\nvar HelmetSideEffects = withSideEffect(reducePropsToState, handleClientStateChange, mapStateOnServer)(NullComponent);\n\nvar HelmetExport = Helmet(HelmetSideEffects);\nHelmetExport.renderStatic = HelmetExport.rewind;\n\nexport default HelmetExport;\nexport { HelmetExport as Helmet };\n", "import type { PageName } from \".\";\n\n/**\n * Return the human-friendly page name of the given page, which we'd\n * like to show to end-users.\n */\nexport function getFriendlyPageName(pageName: PageName): string {\n if (pageName === \"creature\") return \"cluster\";\n return pageName;\n}\n", "import { WavesPage } from \"./waves-page\";\nimport { VocabularyPage } from \"./vocabulary-page\";\nimport { CreaturePage } from \"./creature-page\";\nimport { MandalaPage } from \"./mandala-page\";\nimport { DebugPage } from \"./debug-page\";\nimport { GalleryPage } from \"./gallery-page\";\n\nexport const Pages = {\n vocabulary: VocabularyPage,\n creature: CreaturePage,\n waves: WavesPage,\n mandala: MandalaPage,\n gallery: GalleryPage,\n debug: DebugPage,\n};\n\nexport type PageName = keyof typeof Pages;\n\nexport const pageNames = Object.keys(Pages) as PageName[];\n\nexport const DEFAULT_PAGE: PageName = \"creature\";\n\nexport function isPageName(page: string): page is PageName {\n return pageNames.includes(page as any);\n}\n\nexport function toPageName(page: string, defaultValue: PageName): PageName {\n if (isPageName(page)) return page;\n return defaultValue;\n}\n", "import React, { useState } from \"react\";\nimport { Checkbox } from \"../checkbox\";\nimport { mixColor } from \"../color-util\";\nimport { ColorWidget } from \"../color-widget\";\nimport { NumericSlider } from \"../numeric-slider\";\nimport { Page } from \"../page\";\nimport { Random } from \"../random\";\nimport { lerp, range } from \"../util\";\n\nconst WAVE_STROKE = \"#79beda\";\nconst WAVE_FILL = \"#2b7c9e\";\n\nconst Wave: React.FC<{\n stroke: string;\n fill: string;\n}> = ({ stroke, fill }) => (\n <>\n {/* Generator: Moho 13.0.3 build 635 */}\n <path\n fill={fill}\n fillRule=\"evenodd\"\n stroke={stroke}\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M 1272.978 220.566 C 1272.852 220.566 12.696 217.473 12.570 217.473 C 12.570 217.454 12.307 27.724 12.307 27.705 C 12.311 27.706 35.916 41.496 51.663 41.496 C 67.409 41.496 75.272 27.705 91.018 27.705 C 106.764 27.705 114.627 41.496 130.373 41.496 C 146.120 41.496 153.982 27.705 169.729 27.705 C 185.475 27.705 193.338 41.496 209.085 41.496 C 224.831 41.496 232.694 27.705 248.440 27.705 C 264.186 27.705 272.049 41.496 287.795 41.496 C 303.542 41.496 311.405 27.705 327.151 27.705 C 342.898 27.705 350.760 41.496 366.507 41.496 C 382.253 41.496 390.116 27.705 405.862 27.705 C 421.609 27.705 429.471 41.496 445.218 41.496 C 460.964 41.496 468.827 27.705 484.573 27.705 C 500.320 27.705 508.182 41.496 523.929 41.496 C 539.675 41.496 547.538 27.705 563.284 27.705 C 579.031 27.705 586.893 41.496 602.640 41.496 C 618.386 41.496 626.249 27.705 641.995 27.705 C 657.742 27.705 665.604 41.496 681.351 41.496 C 697.097 41.496 704.960 27.705 720.707 27.705 C 736.453 27.705 744.316 41.496 760.062 41.496 C 775.808 41.496 783.671 27.705 799.417 27.705 C 815.164 27.705 823.026 41.496 838.773 41.496 C 854.519 41.496 862.382 27.705 878.129 27.705 C 893.875 27.705 901.738 41.496 917.484 41.496 C 933.230 41.496 941.093 27.705 956.839 27.705 C 972.586 27.705 980.449 41.496 996.195 41.496 C 1011.942 41.496 1019.804 27.705 1035.551 27.705 C 1051.297 27.705 1059.160 41.496 1074.906 41.496 C 1090.652 41.496 1098.515 27.705 1114.261 27.705 C 1130.008 27.705 1137.871 41.496 1153.617 41.496 C 1169.364 41.496 1177.226 27.705 1192.973 27.705 C 1208.719 27.705 1216.582 41.496 1232.328 41.496 C 1248.075 41.496 1271.680 27.706 1271.684 27.705 C 1271.684 27.724 1272.978 220.547 1272.978 220.566 Z\"\n />\n <path\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M 12.307 37.713 C 12.311 37.714 35.916 51.504 51.663 51.504 C 67.409 51.504 75.272 37.713 91.018 37.713 C 106.764 37.713 114.627 51.504 130.373 51.504 C 146.120 51.504 153.982 37.713 169.729 37.713 C 185.475 37.713 193.338 51.504 209.085 51.504 C 224.831 51.504 232.694 37.713 248.440 37.713 C 264.186 37.713 272.049 51.504 287.795 51.504 C 303.542 51.504 311.405 37.713 327.151 37.713 C 342.898 37.713 350.760 51.504 366.507 51.504 C 382.253 51.504 390.116 37.713 405.862 37.713 C 421.609 37.713 429.471 51.504 445.218 51.504 C 460.964 51.504 468.827 37.713 484.573 37.713 C 500.320 37.713 508.182 51.504 523.929 51.504 C 539.675 51.504 547.538 37.713 563.284 37.713 C 579.031 37.713 586.893 51.504 602.640 51.504 C 618.386 51.504 626.249 37.713 641.995 37.713 C 657.742 37.713 665.604 51.504 681.351 51.504 C 697.097 51.504 704.960 37.713 720.707 37.713 C 736.453 37.713 744.316 51.504 760.062 51.504 C 775.808 51.504 783.671 37.713 799.417 37.713 C 815.164 37.713 823.026 51.504 838.773 51.504 C 854.519 51.504 862.382 37.713 878.129 37.713 C 893.875 37.713 901.738 51.504 917.484 51.504 C 933.230 51.504 941.093 37.713 956.839 37.713 C 972.586 37.713 980.449 51.504 996.195 51.504 C 1011.942 51.504 1019.804 37.713 1035.551 37.713 C 1051.297 37.713 1059.160 51.504 1074.906 51.504 C 1090.652 51.504 1098.515 37.713 1114.261 37.713 C 1130.008 37.713 1137.871 51.504 1153.617 51.504 C 1169.364 51.504 1177.226 37.713 1192.973 37.713 C 1208.719 37.713 1216.582 51.504 1232.328 51.504 C 1248.075 51.504 1271.680 37.714 1271.684 37.713 \"\n />\n <path\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M 12.307 47.544 C 12.311 47.546 35.916 61.335 51.663 61.335 C 67.409 61.335 75.272 47.544 91.018 47.544 C 106.764 47.544 114.627 61.335 130.373 61.335 C 146.120 61.335 153.982 47.544 169.729 47.544 C 185.475 47.544 193.338 61.335 209.085 61.335 C 224.831 61.335 232.694 47.544 248.440 47.544 C 264.186 47.544 272.049 61.335 287.795 61.335 C 303.542 61.335 311.405 47.544 327.151 47.544 C 342.898 47.544 350.760 61.335 366.507 61.335 C 382.253 61.335 390.116 47.544 405.862 47.544 C 421.609 47.544 429.471 61.335 445.218 61.335 C 460.964 61.335 468.827 47.544 484.573 47.544 C 500.320 47.544 508.182 61.335 523.929 61.335 C 539.675 61.335 547.538 47.544 563.284 47.544 C 579.031 47.544 586.893 61.335 602.640 61.335 C 618.386 61.335 626.249 47.544 641.995 47.544 C 657.742 47.544 665.604 61.335 681.351 61.335 C 697.097 61.335 704.960 47.544 720.707 47.544 C 736.453 47.544 744.316 61.335 760.062 61.335 C 775.808 61.335 783.671 47.544 799.417 47.544 C 815.164 47.544 823.026 61.335 838.773 61.335 C 854.519 61.335 862.382 47.544 878.129 47.544 C 893.875 47.544 901.738 61.335 917.484 61.335 C 933.230 61.335 941.093 47.544 956.839 47.544 C 972.586 47.544 980.449 61.335 996.195 61.335 C 1011.942 61.335 1019.804 47.544 1035.551 47.544 C 1051.297 47.544 1059.160 61.335 1074.906 61.335 C 1090.652 61.335 1098.515 47.544 1114.261 47.544 C 1130.008 47.544 1137.871 61.335 1153.617 61.335 C 1169.364 61.335 1177.226 47.544 1192.973 47.544 C 1208.719 47.544 1216.582 61.335 1232.328 61.335 C 1248.075 61.335 1271.680 47.546 1271.684 47.544 \"\n />\n <path\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M 12.307 57.012 C 12.311 57.014 35.916 70.804 51.663 70.804 C 67.409 70.804 75.272 57.012 91.018 57.012 C 106.764 57.012 114.627 70.804 130.373 70.804 C 146.120 70.804 153.982 57.013 169.729 57.012 C 185.475 57.012 193.338 70.804 209.085 70.804 C 224.831 70.804 232.694 57.012 248.440 57.012 C 264.186 57.012 272.049 70.804 287.795 70.804 C 303.542 70.804 311.405 57.012 327.151 57.012 C 342.898 57.013 350.760 70.804 366.507 70.804 C 382.253 70.804 390.116 57.013 405.862 57.012 C 421.609 57.012 429.471 70.804 445.218 70.804 C 460.964 70.804 468.827 57.012 484.573 57.012 C 500.320 57.012 508.182 70.804 523.929 70.804 C 539.675 70.804 547.538 57.013 563.284 57.012 C 579.031 57.012 586.893 70.804 602.640 70.804 C 618.386 70.804 626.249 57.012 641.995 57.012 C 657.742 57.012 665.604 70.804 681.351 70.804 C 697.097 70.804 704.960 57.012 720.707 57.012 C 736.453 57.013 744.316 70.804 760.062 70.804 C 775.808 70.804 783.671 57.012 799.417 57.012 C 815.164 57.012 823.026 70.804 838.773 70.804 C 854.519 70.804 862.382 57.012 878.129 57.012 C 893.875 57.013 901.738 70.804 917.484 70.804 C 933.230 70.804 941.093 57.013 956.839 57.012 C 972.586 57.012 980.449 70.804 996.195 70.804 C 1011.942 70.804 1019.804 57.012 1035.551 57.012 C 1051.297 57.012 1059.160 70.804 1074.906 70.804 C 1090.652 70.804 1098.515 57.013 1114.261 57.012 C 1130.008 57.012 1137.871 70.804 1153.617 70.804 C 1169.364 70.804 1177.226 57.012 1192.973 57.012 C 1208.719 57.012 1216.582 70.804 1232.328 70.804 C 1248.075 70.804 1271.680 57.014 1271.684 57.012 \"\n />\n <path\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M 12.307 66.844 C 12.311 66.845 35.916 80.635 51.663 80.635 C 67.409 80.635 75.272 66.844 91.018 66.844 C 106.764 66.844 114.627 80.635 130.373 80.635 C 146.120 80.635 153.982 66.844 169.729 66.844 C 185.475 66.844 193.338 80.635 209.085 80.635 C 224.831 80.635 232.694 66.844 248.440 66.844 C 264.186 66.844 272.049 80.635 287.795 80.635 C 303.542 80.635 311.405 66.844 327.151 66.844 C 342.898 66.844 350.760 80.635 366.507 80.635 C 382.253 80.635 390.116 66.844 405.862 66.844 C 421.609 66.844 429.471 80.635 445.218 80.635 C 460.964 80.635 468.827 66.844 484.573 66.844 C 500.320 66.844 508.182 80.635 523.929 80.635 C 539.675 80.635 547.538 66.844 563.284 66.844 C 579.031 66.844 586.893 80.635 602.640 80.635 C 618.386 80.635 626.249 66.844 641.995 66.844 C 657.742 66.844 665.604 80.635 681.351 80.635 C 697.097 80.635 704.960 66.844 720.707 66.844 C 736.453 66.844 744.316 80.635 760.062 80.635 C 775.808 80.635 783.671 66.844 799.417 66.844 C 815.164 66.844 823.026 80.635 838.773 80.635 C 854.519 80.635 862.382 66.844 878.129 66.844 C 893.875 66.844 901.738 80.635 917.484 80.635 C 933.230 80.635 941.093 66.844 956.839 66.844 C 972.586 66.844 980.449 80.635 996.195 80.635 C 1011.942 80.635 1019.804 66.844 1035.551 66.844 C 1051.297 66.844 1059.160 80.635 1074.906 80.635 C 1090.652 80.635 1098.515 66.844 1114.261 66.844 C 1130.008 66.844 1137.871 80.635 1153.617 80.635 C 1169.364 80.635 1177.226 66.844 1192.973 66.844 C 1208.719 66.844 1216.582 80.635 1232.328 80.635 C 1248.075 80.635 1271.680 66.845 1271.684 66.844 \"\n />\n </>\n);\n\nconst BG_COLOR = \"#FFFFFF\";\nconst BG_MAX_BLEND = 0.33;\nconst NUM_WAVES = 10;\nconst WAVE_DURATION = 1;\nconst WAVE_PARALLAX_SCALE_START = 1.2;\nconst WAVE_PARALLAX_TRANSLATE_START = 10;\nconst WAVE_PARALLAX_SCALE_VELOCITY = 1.25;\nconst WAVE_PARALLAX_TRANSLATE_VELOCITY = 30;\nconst WAVE_PARALLAX_TRANSLATE_ACCEL = 10;\n\ntype HillProps = {\n idPrefix: string;\n xScale: number;\n yScale: number;\n cx: number;\n cy: number;\n r: number;\n highlight: string;\n shadow: string;\n};\n\nconst DEFAULT_HILL_PROPS: HillProps = {\n idPrefix: \"\",\n xScale: 1,\n yScale: 1,\n cx: 50,\n cy: 50,\n r: 50,\n highlight: \"#aeb762\",\n shadow: \"#616934\",\n};\n\nconst Hill: React.FC<Partial<HillProps>> = (props) => {\n const { idPrefix, xScale, yScale, cx, cy, r, highlight, shadow } = {\n ...DEFAULT_HILL_PROPS,\n ...props,\n };\n const gradientId = `${idPrefix}HillGradient`;\n const gradientUrl = `url(#${gradientId})`;\n\n return (\n <g transform={`translate(${cx} ${cy}) scale(${xScale} ${yScale})`}>\n <radialGradient id={gradientId}>\n <stop offset=\"75%\" stopColor={highlight} />\n <stop offset=\"100%\" stopColor={shadow} />\n </radialGradient>\n <circle cx={0} cy={0} r={r} fill={gradientUrl} />\n </g>\n );\n};\n\nconst Waves: React.FC<{}> = () => {\n const [randomSeed, setRandomSeed] = useState<number>(Date.now());\n const newRandomSeed = () => setRandomSeed(Date.now());\n const rng = new Random(randomSeed);\n const [stroke, setStroke] = useState(WAVE_STROKE);\n const [fill, setFill] = useState(WAVE_FILL);\n const [numWaves, setNumWaves] = useState(NUM_WAVES);\n const [duration, setDuration] = useState(WAVE_DURATION);\n const [initialYVel, setInitialYVel] = useState(\n WAVE_PARALLAX_TRANSLATE_VELOCITY\n );\n const [showHills, setShowHills] = useState(false);\n const [yAccel, setYAccel] = useState(WAVE_PARALLAX_TRANSLATE_ACCEL);\n const [scaleVel, setScaleVel] = useState(WAVE_PARALLAX_SCALE_VELOCITY);\n const [useMask, setUseMask] = useState(false);\n\n let scale = WAVE_PARALLAX_SCALE_START;\n let y = WAVE_PARALLAX_TRANSLATE_START;\n let yVel = initialYVel;\n let waves: JSX.Element[] = [];\n\n for (let i = 0; i < numWaves; i++) {\n const numHills = Math.floor(rng.inInterval({ min: 0, max: numWaves - i }));\n const hazeAmt = lerp(\n 0,\n BG_MAX_BLEND,\n // The furthest-away waves (the first ones we draw) should be the\n // most hazy. Scale the amount quadratically so that the waves in\n // front tend to be less hazy.\n Math.pow(1 - i / Math.max(numWaves - 1, 1), 2)\n );\n const blendedFill = mixColor(fill, BG_COLOR, hazeAmt);\n const blendedStroke = mixColor(stroke, BG_COLOR, hazeAmt);\n\n waves.push(\n <g key={i} transform={`translate(0 ${y}) scale(${scale} ${scale})`}>\n {showHills &&\n range(numHills).map((j) => {\n return (\n <Hill\n key={j}\n idPrefix={`wave${i}_${j}_`}\n cx={rng.inInterval({ min: 0, max: 1280 / scale })}\n r={rng.inInterval({ min: 50, max: 100 })}\n xScale={rng.inInterval({ min: 1, max: 1.25 })}\n highlight={mixColor(\n DEFAULT_HILL_PROPS.highlight,\n BG_COLOR,\n hazeAmt\n )}\n shadow={mixColor(DEFAULT_HILL_PROPS.shadow, BG_COLOR, hazeAmt)}\n />\n );\n })}\n <g>\n <Wave fill={blendedFill} stroke={blendedStroke} />\n <animateTransform\n attributeName=\"transform\"\n type=\"translate\"\n from=\"-179 0\"\n to=\"-100 0\"\n dur={`${duration}s`}\n begin=\"0s\"\n fill=\"freeze\"\n repeatCount=\"indefinite\"\n />\n </g>\n </g>\n );\n y += yVel;\n scale *= scaleVel;\n yVel += yAccel;\n }\n\n return (\n <>\n <div className=\"canvas\">\n <svg width=\"1280px\" height=\"720px\" viewBox=\"0 0 1280 720\">\n {useMask ? (\n <>\n <mask id=\"circle-mask\">\n <circle cx=\"640\" cy=\"360\" r=\"300\" fill=\"white\" />\n </mask>\n <g mask=\"url(#circle-mask)\">{waves}</g>\n </>\n ) : (\n waves\n )}\n </svg>\n </div>\n <div className=\"sidebar\">\n <div className=\"thingy\">\n <ColorWidget value={stroke} onChange={setStroke} label=\"Stroke\" />{\" \"}\n <ColorWidget value={fill} onChange={setFill} label=\"Fill\" />\n </div>\n <NumericSlider\n label=\"Number of waves\"\n min={1}\n max={NUM_WAVES * 2}\n value={numWaves}\n step={1}\n onChange={setNumWaves}\n />\n <NumericSlider\n label=\"Cycle duration\"\n min={0.1}\n max={3}\n value={duration}\n step={0.1}\n onChange={setDuration}\n valueSuffix=\"s\"\n />\n <NumericSlider\n label=\"Initial y-velocity\"\n min={1}\n max={WAVE_PARALLAX_TRANSLATE_VELOCITY * 4}\n value={initialYVel}\n step={1}\n onChange={setInitialYVel}\n />\n <NumericSlider\n label=\"Y-acceleration\"\n min={1}\n max={WAVE_PARALLAX_TRANSLATE_ACCEL * 2}\n value={yAccel}\n step={1}\n onChange={setYAccel}\n />\n <NumericSlider\n label=\"Scale velocity\"\n min={1.0}\n max={2}\n value={scaleVel}\n step={0.025}\n onChange={setScaleVel}\n />\n <Checkbox\n label=\"Mask with circle\"\n value={useMask}\n onChange={setUseMask}\n />\n <Checkbox label=\"Hills\" value={showHills} onChange={setShowHills} />\n {showHills && (\n <button accessKey=\"r\" onClick={newRandomSeed}>\n <u>R</u>andomize hills!\n </button>\n )}\n </div>\n </>\n );\n};\n\nexport const WavesPage: React.FC<{}> = () => (\n <Page title=\"Waves!\">\n <Waves />\n </Page>\n);\n", "import classNames from \"classnames\";\nimport React from \"react\";\n\ntype CheckboxProps = {\n label: string;\n onChange: (value: boolean) => void;\n value: boolean;\n disabled?: boolean;\n};\n\nexport const Checkbox: React.FC<CheckboxProps> = (props) => {\n return (\n <label className={classNames(\"checkbox\", { disabled: props.disabled })}>\n <input\n type=\"checkbox\"\n checked={props.value}\n disabled={props.disabled}\n onChange={(e) => props.onChange(e.target.checked)}\n />{\" \"}\n {props.label}\n </label>\n );\n};\n", "import { lerp } from \"./util\";\n\n/**\n * Clamp the given number to be between 0 and 255, then\n * convert it to hexadecimal.\n */\nexport function clampedByteToHex(value: number): string {\n if (value < 0) {\n value = 0;\n } else if (value > 255) {\n value = 255;\n }\n let hex = value.toString(16);\n if (hex.length === 1) {\n hex = \"0\" + hex;\n }\n return hex;\n}\n\n/**\n * Convert the given array of numbers to an RGB hex value.\n */\nexport function clampedBytesToRGBColor(values: number[]): string {\n return \"#\" + values.map(clampedByteToHex).join(\"\");\n}\n\n/**\n * Convert the given hex color string, e.g. `#abcdef`, to an\n * Array of RGB numbers.\n */\nexport function parseHexColor(value: string): [number, number, number] {\n const red = parseInt(value.substring(1, 3), 16);\n const green = parseInt(value.substring(3, 5), 16);\n const blue = parseInt(value.substring(5, 7), 16);\n return [red, green, blue];\n}\n\n/**\n * Mix two colors together. The first color will be tinted by\n * the second color by the given percentage (from 0 to 1).\n */\nexport function mixColor(a: string, b: string, amount: number) {\n const aRGB = parseHexColor(a);\n const bRGB = parseHexColor(b);\n return clampedBytesToRGBColor(\n aRGB.map((aValue, i) => Math.floor(lerp(aValue, bRGB[i], amount)))\n );\n}\n", "export function float(value: string | number | undefined): number {\n if (typeof value === \"number\") return value;\n if (value === undefined) value = \"\";\n\n const float = parseFloat(value);\n\n if (isNaN(float)) {\n throw new Error(`Expected '${value}' to be a float!`);\n }\n\n return float;\n}\n\nexport function flatten<T>(arr: T[][]): T[] {\n const result: T[] = [];\n\n for (let subarr of arr) {\n result.push(...subarr);\n }\n\n return result;\n}\n\n/**\n * Convert radians to degrees.\n */\nexport function rad2deg(radians: number): number {\n return (radians * 180) / Math.PI;\n}\n\nexport type NumericInterval = {\n min: number;\n max: number;\n};\n\nexport type NumericRange = NumericInterval & {\n step: number;\n};\n\nexport type GaussianDist = {\n mean: number;\n stddev: number;\n};\n\n/**\n * Return numbers within the given range, inclusive.\n */\nexport function inclusiveRange({ min, max, step }: NumericRange): number[] {\n const result: number[] = [];\n\n for (let i = min; i <= max; i += step) {\n result.push(i);\n }\n\n return result;\n}\n\n/**\n * Clamp a number between min and max\n */\nexport function clamp(x: number, min: number, max: number) {\n return Math.max(min, Math.min(x, max));\n}\n\n/**\n * Return an array containing the numbers from 0 to one\n * less than the given value, increasing.\n */\nexport function range(count: number): number[] {\n return inclusiveRange({ min: 0, max: count - 1, step: 1 });\n}\n\n/**\n * Slugify the given string.\n *\n * Taken from: https://gist.github.com/mathewbyrne/1280286\n */\nexport function slugify(text: string) {\n return text\n .toString()\n .toLowerCase()\n .replace(/\\s+/g, \"-\") // Replace spaces with -\n .replace(/[^\\w\\-]+/g, \"\") // Remove all non-word chars\n .replace(/\\-\\-+/g, \"-\") // Replace multiple - with single -\n .replace(/^-+/, \"\") // Trim - from start of text\n .replace(/-+$/, \"\"); // Trim - from end of text\n}\n\n/** Returns whether the given number is even (as opposed to odd). */\nexport function isEvenNumber(value: number) {\n return value % 2 === 0;\n}\n\n/**\n * Convert the given number of seconds (float) to milliseconds (integer).\n */\nexport function secsToMsecs(secs: number): number {\n return Math.floor(secs * 1000);\n}\n\n/**\n * Returns the given number to a \"friendly-looking\" human\n * representation that is not ridiculously long. For example,\n * it will return \"1.85\" instead of \"1.850000000143\".\n */\nexport function toFriendlyDecimal(value: number, maxDecimalDigits = 2): string {\n const str = value.toString();\n const fixedStr = value.toFixed(maxDecimalDigits);\n\n return str.length < fixedStr.length ? str : fixedStr;\n}\n\n/**\n * Given an array consisting of a nullable type, filter out all the nulls.\n */\nexport function withoutNulls<T>(arr: (T | null)[]): T[] {\n const result: T[] = [];\n\n for (let item of arr) {\n if (item !== null) {\n result.push(item);\n }\n }\n\n return result;\n}\n\n/**\n * Linearly interpolate between the given numbers by the\n * given percentage (from 0 to 1).\n */\nexport function lerp(a: number, b: number, amount: number) {\n return a + amount * (b - a);\n}\n\n/**\n * Capitalize the given word, forcing the first letter to\n * uppercase and the rest to lowercase.\n */\nexport function capitalize(value: string) {\n return value.slice(0, 1).toUpperCase() + value.slice(1).toLowerCase();\n}\n", "import React from \"react\";\nimport { slugify } from \"./util\";\n\nimport \"./color-widget.css\";\n\ntype ColorWidgetProps = {\n label: string;\n value: string;\n onChange: (value: string) => void;\n id?: string;\n};\n\nexport const ColorWidget: React.FC<ColorWidgetProps> = (props) => {\n const id = props.id || slugify(props.label);\n\n return (\n <span className=\"color-widget\">\n <label htmlFor={id}>{props.label}: </label>\n <input\n id={id}\n type=\"color\"\n value={props.value}\n onChange={(e) => props.onChange(e.target.value)}\n />\n </span>\n );\n};\n", "import classNames from \"classnames\";\nimport React from \"react\";\nimport { float, NumericRange, slugify, toFriendlyDecimal } from \"./util\";\n\nexport type NumericSliderProps = NumericRange & {\n id?: string;\n label: string;\n onChange: (value: number) => void;\n value: number;\n valueSuffix?: string;\n disabled?: boolean;\n};\n\nexport const NumericSlider: React.FC<NumericSliderProps> = (props) => {\n const id = props.id || slugify(props.label);\n\n return (\n <div\n className={classNames(\"thingy\", \"numeric-slider\", {\n disabled: props.disabled,\n })}\n >\n <label htmlFor={id}>{props.label}: </label>\n <span className=\"slider\">\n <input\n type=\"range\"\n id={id}\n min={props.min}\n max={props.max}\n value={props.value}\n step={props.step}\n disabled={props.disabled}\n onChange={(e) => props.onChange(float(e.target.value))}\n />\n <span className=\"slider-value\">\n {\" \"}\n {toFriendlyDecimal(props.value)}\n {props.valueSuffix}\n </span>\n </span>\n </div>\n );\n};\n", "import {\n inclusiveRange,\n NumericInterval,\n NumericRange,\n GaussianDist,\n} from \"./util\";\n\nexport type RandomParameters = {\n modulus: number;\n multiplier: number;\n increment: number;\n};\n\nconst NUMERICAL_RECIPES_PARAMETERS: RandomParameters = {\n modulus: Math.pow(2, 32),\n multiplier: 1664525,\n increment: 1013904223,\n};\n\n/**\n * A simple linear congruential random number generator, as described in\n * https://en.wikipedia.org/wiki/Linear_congruential_generator.\n */\nexport class Random {\n private latestSeed: number;\n\n constructor(\n readonly seed: number = Date.now(),\n readonly params: RandomParameters = NUMERICAL_RECIPES_PARAMETERS\n ) {\n this.latestSeed = seed;\n }\n\n /**\n * Create an exact replica of this instance.\n */\n clone(): Random {\n return new Random(this.latestSeed, this.params);\n }\n\n /**\n * Return a random number that is greater than or equal to zero, and less\n * than one.\n */\n next(): number {\n this.latestSeed =\n (this.params.multiplier * this.latestSeed + this.params.increment) %\n this.params.modulus;\n return this.latestSeed / this.params.modulus;\n }\n\n /**\n * Return a random boolean with the given probability of being true.\n */\n bool(trueProbability: number = 0.5): boolean {\n return this.next() < trueProbability;\n }\n\n /**\n * Return a number in the given range, inclusive.\n */\n inRange(range: NumericRange): number {\n return this.choice(inclusiveRange(range));\n }\n\n /**\n * Return a number in the interval, second argument is really supremum which return value is always less than\n */\n inInterval({ min, max }: NumericInterval): number {\n return this.next() * (max - min) + min;\n }\n\n /**\n * Return a number from the specified gaussian distribution\n * from: https://stackoverflow.com/questions/25582882/javascript-math-random-normal-distribution-gaussian-bell-curve\n */\n fromGaussian({ mean, stddev }: GaussianDist, nsamples = 6) {\n let runtotal = 0;\n for (var i = 0; i < nsamples; i++) {\n runtotal += this.next();\n }\n\n return (stddev * (runtotal - nsamples / 2)) / (nsamples / 2) + mean;\n }\n\n /**\n * Return a random item from the given array. If the array is\n * empty, an exception is thrown.\n */\n choice<T>(array: T[]): T {\n if (array.length === 0) {\n throw new Error(\"Cannot choose randomly from an empty array!\");\n }\n const idx = Math.floor(this.next() * array.length);\n return array[idx];\n }\n\n /**\n * Attempt to randomly choose *at most* the given number of unique items from\n * the array. If the array is too small, fewer items are returned.\n */\n uniqueChoices<T>(array: T[], howMany: number): T[] {\n let choicesLeft = [...array];\n const result: T[] = [];\n\n for (let i = 0; i < howMany; i++) {\n if (choicesLeft.length === 0) {\n break;\n }\n const choice = this.choice(choicesLeft);\n choicesLeft = choicesLeft.filter((item) => item !== choice);\n result.push(choice);\n }\n\n return result;\n }\n}\n", "import React, { useMemo, useState } from \"react\";\nimport { dilateBoundingBox, getBoundingBoxSize } from \"../bounding-box\";\nimport {\n createSvgSymbolContext,\n SvgSymbolContent,\n SvgSymbolData,\n} from \"../svg-symbol\";\nimport { SvgVocabulary } from \"../svg-vocabulary\";\nimport { SvgSymbolContext } from \"../svg-symbol\";\nimport { SymbolContextWidget } from \"../symbol-context-widget\";\nimport { HoverDebugHelper } from \"../hover-debug-helper\";\nimport { Page } from \"../page\";\n\nimport \"./vocabulary-page.css\";\n\ntype SvgSymbolProps = {\n data: SvgSymbolData;\n scale?: number;\n} & SvgSymbolContext;\n\nconst px = (value: number) => `${value}px`;\n\nconst BBOX_DILATION = 100;\n\nconst SvgSymbol: React.FC<SvgSymbolProps> = (props) => {\n const d = props.data;\n const bbox = dilateBoundingBox(d.bbox, BBOX_DILATION);\n const scale = props.scale || 1;\n const [width, height] = getBoundingBoxSize(bbox);\n\n return (\n <svg\n viewBox={`${bbox.x.min} ${bbox.y.min} ${width} ${height}`}\n width={px(width * scale)}\n height={px(height * scale)}\n >\n <SvgSymbolContent {...props} />\n </svg>\n );\n};\n\nexport const VocabularyPage: React.FC<{}> = () => {\n const [ctx, setCtx] = useState(createSvgSymbolContext());\n const [filter, setFilter] = useState(\"\");\n const finalFilter = filter.toLowerCase().replace(/ /g, \"_\");\n const items = useMemo(\n () =>\n SvgVocabulary.items.filter((item) =>\n item.name.toLowerCase().includes(finalFilter)\n ),\n [finalFilter]\n );\n\n return (\n <Page title=\"Vocabulary!\">\n <div className=\"sidebar\">\n <div className=\"flex-widget\">\n <label htmlFor=\"filter\">Search for symbols: </label>\n <input\n type=\"text\"\n id=\"filter\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n placeholder=\"\uD83D\uDD0E\"\n />\n </div>\n <SymbolContextWidget ctx={ctx} onChange={setCtx} />\n </div>\n <div className=\"canvas scrollable\">\n <HoverDebugHelper>\n {items.map((symbolData) => (\n <div\n key={symbolData.name}\n style={{\n display: \"inline-block\",\n border: \"1px solid black\",\n margin: \"4px\",\n }}\n >\n <div\n style={{\n backgroundColor: \"black\",\n color: \"white\",\n padding: \"4px\",\n }}\n >\n {symbolData.name}\n </div>\n <div className=\"checkerboard-bg\" style={{ lineHeight: 0 }}>\n <SvgSymbol data={symbolData} scale={0.25} {...ctx} />\n </div>\n </div>\n ))}\n </HoverDebugHelper>\n </div>\n </Page>\n );\n};\n", "import { Bezier, Point, BBox, MinMax } from \"../vendor/bezier-js\";\nimport { SVGProps } from \"react\";\n\nimport type { SvgSymbolElement } from \"./svg-symbol\";\nimport { flatten, float } from \"./util\";\nimport { pathToShapes } from \"./path\";\n\nexport function getBoundingBoxSize(bbox: BBox): [number, number] {\n const width = bbox.x.max - bbox.x.min;\n const height = bbox.y.max - bbox.y.min;\n\n return [width, height];\n}\n\nexport function getBoundingBoxCenter(bbox: BBox): Point {\n const [width, height] = getBoundingBoxSize(bbox);\n\n return {\n x: bbox.x.min + width / 2,\n y: bbox.y.min + height / 2,\n };\n}\n\nfunction dilateMinMax(minmax: MinMax, amount: number): MinMax {\n return {\n min: minmax.min - amount,\n max: minmax.max + amount,\n };\n}\n\nexport function dilateBoundingBox(bbox: BBox, amount: number): BBox {\n return {\n x: dilateMinMax(bbox.x, amount),\n y: dilateMinMax(bbox.y, amount),\n };\n}\n\nexport function coalesceBoundingBoxes(bboxes: BBox[]): BBox {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n if (bboxes.length === 0) {\n throw new Error(`Must have at least one bounding box!`);\n }\n\n for (let bbox of bboxes) {\n if (bbox.x.min < minX) {\n minX = bbox.x.min;\n }\n if (bbox.x.max > maxX) {\n maxX = bbox.x.max;\n }\n if (bbox.y.min < minY) {\n minY = bbox.y.min;\n }\n if (bbox.y.max > maxY) {\n maxY = bbox.y.max;\n }\n }\n\n return { x: { min: minX, max: maxX }, y: { min: minY, max: maxY } };\n}\n\nexport function getBoundingBoxForBeziers(beziers: Bezier[]): BBox {\n return coalesceBoundingBoxes(beziers.map((b) => b.bbox()));\n}\n\nfunction getPathBoundingBox(props: SVGProps<SVGPathElement>): BBox {\n if (!props.d) {\n throw new Error(`SVG path has no 'd' attribute value!`);\n }\n const beziers = flatten(pathToShapes(props.d));\n const bbox = getBoundingBoxForBeziers(beziers);\n return props.strokeWidth\n ? dilateBoundingBox(bbox, float(props.strokeWidth) / 2)\n : bbox;\n}\n\nexport function getSvgBoundingBox(\n element: SvgSymbolElement | SvgSymbolElement[]\n): BBox {\n if (Array.isArray(element)) {\n return coalesceBoundingBoxes(element.map(getSvgBoundingBox));\n }\n switch (element.tagName) {\n case \"g\":\n return getSvgBoundingBox(element.children);\n case \"path\":\n return getPathBoundingBox(element.props);\n }\n}\n\n/**\n * Assuming the origins of the giving boxes are aligned and\n * the transform origin is set to their center, return the maximum\n * amount the child needs to be scaled to fit within the parent.\n */\nexport function uniformlyScaleToFit(parent: BBox, child: BBox): number {\n const [pWidth, pHeight] = getBoundingBoxSize(parent);\n const [cWidth, cHeight] = getBoundingBoxSize(child);\n\n const widthScale = pWidth / cWidth;\n const heightScale = pHeight / cHeight;\n\n return Math.min(widthScale, heightScale);\n}\n", "import { Bezier } from \"../vendor/bezier-js\";\nimport { float } from \"./util\";\n\nexport function pathToShapes(path: string): Bezier[][] {\n const parts = path.trim().split(\" \");\n let x = 0;\n let y = 0;\n let i = 0;\n const shapes: Bezier[][] = [];\n let currShape: Bezier[] = [];\n\n const chomp = () => {\n if (i >= parts.length) {\n throw new Error(`Ran out of path parts!`);\n }\n const val = parts[i];\n i++;\n return val;\n };\n\n const finishCurrShape = () => {\n if (currShape.length) {\n shapes.push(currShape);\n currShape = [];\n }\n };\n\n while (i < parts.length) {\n const command = chomp();\n switch (command) {\n case \"M\":\n finishCurrShape();\n x = float(chomp());\n y = float(chomp());\n break;\n case \"C\":\n const x1 = float(chomp());\n const y1 = float(chomp());\n const x2 = float(chomp());\n const y2 = float(chomp());\n const endX = float(chomp());\n const endY = float(chomp());\n currShape.push(new Bezier(x, y, x1, y1, x2, y2, endX, endY));\n x = endX;\n y = endY;\n break;\n case \"Z\":\n finishCurrShape();\n break;\n default:\n throw new Error(`Unknown SVG path command: '${command}'`);\n }\n }\n\n finishCurrShape();\n\n return shapes;\n}\n", "import React, { useMemo } from \"react\";\nimport { SVGProps } from \"react\";\nimport { BBox } from \"../vendor/bezier-js\";\nimport { FILL_REPLACEMENT_COLOR, STROKE_REPLACEMENT_COLOR } from \"./colors\";\nimport { AttachmentPointType, PointWithNormal, Specs } from \"./specs\";\nimport { SvgSymbolMetadata } from \"./svg-symbol-metadata\";\nimport {\n UniqueIdMap,\n URL_FUNC_TO_ANCHOR_RE,\n useUniqueIdMap,\n} from \"./unique-id\";\nimport { VisibleSpecs } from \"./visible-specs\";\n\nconst DEFAULT_UNIFORM_STROKE_WIDTH = 1;\n\nexport type SvgSymbolData = {\n name: string;\n bbox: BBox;\n layers: SvgSymbolElement[];\n defs?: SvgSymbolDef[];\n meta?: SvgSymbolMetadata;\n specs?: Specs;\n};\n\nexport type SvgSymbolGradientStop = {\n offset: string;\n color: string;\n};\n\n/**\n * This represents a definition that will be referenced\n * from elsewhere in an SVG, such as a radial gradient.\n */\nexport type SvgSymbolDef =\n | {\n type: \"radialGradient\";\n id: string;\n cx: string;\n cy: string;\n r: string;\n stops: SvgSymbolGradientStop[];\n }\n | {\n type: \"linearGradient\";\n id: string;\n x1: string;\n y1: string;\n x2: string;\n y2: string;\n stops: SvgSymbolGradientStop[];\n };\n\nexport const EMPTY_SVG_SYMBOL_DATA: SvgSymbolData = {\n name: \"\",\n bbox: {\n x: { min: 0, max: 0 },\n y: { min: 0, max: 0 },\n },\n layers: [],\n};\n\nexport type SvgSymbolElement = (\n | {\n tagName: \"g\";\n props: SVGProps<SVGGElement>;\n }\n | {\n tagName: \"path\";\n props: SVGProps<SVGPathElement>;\n }\n) & {\n children: SvgSymbolElement[];\n};\n\nexport type SvgSymbolContext = {\n /** The stroke color of the symbol, as a hex hash (e.g. '#ff0000'). */\n stroke: string;\n\n /** The fill color of the symbol, as a hex hash (e.g. '#ff0000'). */\n fill: string;\n\n /**\n * Whether or not to visibly show the specifications for the symbol,\n * e.g. its attachment points, nesting boxes, and so on.\n */\n showSpecs: boolean;\n\n /**\n * Whether or not to forcibly apply a uniform stroke width to all\n * the shapes in the symbol. If defined, the stroke width will\n * *not* vary as the symbol is scaled.\n */\n uniformStrokeWidth?: number;\n\n /**\n * Whether or not to disable any gradients in the symbol. Defaults\n * to `false`.\n */\n disableGradients: boolean;\n};\n\nconst DEFAULT_CONTEXT: SvgSymbolContext = {\n stroke: \"#000000\",\n fill: \"#ffffff\",\n showSpecs: false,\n uniformStrokeWidth: DEFAULT_UNIFORM_STROKE_WIDTH,\n disableGradients: false,\n};\n\n/**\n * If the given symbol context is visibly showing its specifications,\n * return one with its fill color set to \"none\" so that the specs can\n * be seen more easily.\n */\nexport function noFillIfShowingSpecs<T extends SvgSymbolContext>(ctx: T): T {\n return {\n ...ctx,\n fill: ctx.showSpecs ? \"none\" : ctx.fill,\n };\n}\n\n/**\n * Return a symbol context with the stroke and fill colors swapped.\n */\nexport function swapColors<T extends SvgSymbolContext>(ctx: T): T {\n return {\n ...ctx,\n fill: ctx.stroke,\n stroke: ctx.fill,\n };\n}\n\nexport function createSvgSymbolContext(\n ctx: Partial<SvgSymbolContext> = {}\n): SvgSymbolContext {\n return {\n ...DEFAULT_CONTEXT,\n ...ctx,\n };\n}\n\nfunction getColor(\n ctx: SvgSymbolContext,\n color: string | undefined\n): string | undefined {\n switch (color) {\n case STROKE_REPLACEMENT_COLOR:\n return ctx.stroke;\n case FILL_REPLACEMENT_COLOR:\n return ctx.fill;\n }\n return color;\n}\n\nfunction getFill(\n ctx: SvgSymbolContext,\n fill: string | undefined,\n uidMap: UniqueIdMap\n): string | undefined {\n fill = getColor(ctx, fill);\n if (fill) {\n if (URL_FUNC_TO_ANCHOR_RE.test(fill)) {\n if (ctx.disableGradients) {\n // Note that we could actually interpret the gradient here\n // and use whichever color (fill or stroke) is most dominant\n // in it, but at the time of this writing, it's always the\n // fill color, so we're just using that. For more details,\n // see:\n //\n // https://github.com/mysticsymbolic/mysticsymbolic.github.io/issues/140\n fill = ctx.fill;\n } else {\n fill = uidMap.rewriteUrl(fill);\n }\n }\n }\n return fill;\n}\n\nfunction reactifySvgSymbolElement(\n ctx: SvgSymbolContext,\n uidMap: UniqueIdMap,\n el: SvgSymbolElement,\n key: number\n): JSX.Element {\n let { fill, stroke, strokeWidth } = el.props;\n let vectorEffect;\n fill = getFill(ctx, fill, uidMap);\n stroke = getColor(ctx, stroke);\n if (strokeWidth !== undefined && typeof ctx.uniformStrokeWidth === \"number\") {\n strokeWidth = ctx.uniformStrokeWidth;\n vectorEffect = \"non-scaling-stroke\";\n }\n const props: typeof el.props = {\n ...el.props,\n id: undefined,\n vectorEffect,\n strokeWidth,\n fill,\n stroke,\n key,\n };\n return React.createElement(\n el.tagName,\n props,\n el.children.map(reactifySvgSymbolElement.bind(null, ctx, uidMap))\n );\n}\n\nconst SvgSymbolDef: React.FC<\n { def: SvgSymbolDef; uidMap: UniqueIdMap } & SvgSymbolContext\n> = ({ def, uidMap, ...ctx }) => {\n const id = uidMap.getStrict(def.id);\n const stops = def.stops.map((stop, i) => (\n <stop key={i} offset={stop.offset} stopColor={getColor(ctx, stop.color)} />\n ));\n switch (def.type) {\n case \"radialGradient\":\n return ctx.disableGradients ? null : (\n <radialGradient id={id} cx={def.cx} cy={def.cy} r={def.r}>\n {stops}\n </radialGradient>\n );\n case \"linearGradient\":\n return ctx.disableGradients ? null : (\n <linearGradient id={id} x1={def.x1} y1={def.y1} x2={def.x2} y2={def.y2}>\n {stops}\n </linearGradient>\n );\n }\n};\n\nexport const SvgSymbolContent: React.FC<\n { data: SvgSymbolData } & SvgSymbolContext\n> = (props) => {\n const d = props.data;\n const origIds = useMemo(() => d.defs?.map((def) => def.id) ?? [], [d.defs]);\n const uidMap = useUniqueIdMap(origIds);\n\n return (\n <g data-symbol-name={d.name}>\n {d.defs &&\n d.defs.map((def, i) => (\n <SvgSymbolDef key={i} {...props} def={def} uidMap={uidMap} />\n ))}\n {props.data.layers.map(\n reactifySvgSymbolElement.bind(null, props, uidMap)\n )}\n {props.showSpecs && d.specs && <VisibleSpecs specs={d.specs} />}\n </g>\n );\n};\n\nexport class AttachmentPointError extends Error {}\n\nexport function getAttachmentPoint(\n s: SvgSymbolData,\n type: AttachmentPointType,\n idx: number = 0\n): PointWithNormal {\n const { specs } = s;\n if (!specs) {\n throw new AttachmentPointError(`Symbol ${s.name} has no specs.`);\n }\n const points = specs[type];\n if (!(points && points.length > idx)) {\n throw new AttachmentPointError(\n `Expected symbol ${s.name} to have at least ${\n idx + 1\n } ${type} attachment point(s).`\n );\n }\n\n return points[idx];\n}\n\nexport function safeGetAttachmentPoint(\n s: SvgSymbolData,\n type: AttachmentPointType,\n idx: number = 0\n): PointWithNormal | null {\n try {\n return getAttachmentPoint(s, type, idx);\n } catch (e) {\n if (e instanceof AttachmentPointError) {\n console.log(e.message);\n } else {\n throw e;\n }\n }\n\n return null;\n}\n", "import type { AttachmentPointType } from \"./specs\";\n\nexport const DEFAULT_BG_COLOR = \"#858585\";\nexport const STROKE_REPLACEMENT_COLOR = \"#000000\";\nexport const FILL_REPLACEMENT_COLOR = \"#ffffff\";\n\nexport const ATTACHMENT_POINT_COLORS: {\n [key in AttachmentPointType]: string;\n} = {\n anchor: \"#ff0000\",\n tail: \"#be0027\",\n leg: \"#ffff00\",\n arm: \"#00ff00\",\n horn: \"#00ffff\",\n crown: \"#0000ff\",\n wildcard: \"#000000\",\n};\n\nexport const NESTING_BOUNDING_BOX_COLOR = \"#ff00ff\";\n", "import React, { useContext, useMemo } from \"react\";\n\ntype UniqueIdContextType = {\n prefix: string;\n counter: number;\n};\n\nconst UniqueIdContext = React.createContext<UniqueIdContextType>({\n prefix: \"uid_\",\n counter: 0,\n});\n\nfunction useUniqueIds(count: number): string[] {\n const ctx = useContext(UniqueIdContext);\n const result = useMemo<string[]>(() => {\n const result: string[] = [];\n\n for (let i = 0; i < count; i++) {\n result.push(`${ctx.prefix}${ctx.counter}`);\n ctx.counter += 1;\n }\n\n return result;\n }, [count, ctx]);\n\n return result;\n}\n\n/**\n * A regular expression to match a `url()` function expression\n * that points to an anchor on the current document. For example,\n * when passed the string `url(#boop)`, it will match to `boop`.\n */\nexport const URL_FUNC_TO_ANCHOR_RE = /^url\\(\\#(.+)\\)$/;\n\nexport class UniqueIdMap extends Map<string, string> {\n /**\n * Returns the globally-unique identifier for the given\n * locally-unique one, raising an exception if one\n * doesn't exist.\n */\n getStrict(key: string): string {\n const uid = this.get(key);\n\n if (!uid) {\n throw new Error(`Unable to find a unique ID for \"${key}\"`);\n }\n\n return uid;\n }\n\n /**\n * If the given string is of the form `url(#id)`, where `id` is a\n * locally-unique identifier, then this will replace `id` with\n * its globally-unique analogue. If it does not have a\n * globally-unique identifier for it, however, an error will be\n * raised.\n *\n * If the string is *not* of the aforementioned form, however,\n * it will be returned unmodified.\n *\n * This can be used to e.g. rewrite references in SVG attributes\n * that may refer to locally-unique identifiers.\n */\n rewriteUrl(value: string): string {\n const match = value.match(URL_FUNC_TO_ANCHOR_RE);\n\n if (!match) {\n return value;\n }\n\n const uid = this.getStrict(match[1]);\n\n return `url(#${uid})`;\n }\n}\n\n/**\n * We sometimes need to take locally-unique identifiers and make them\n * globally-unique within some larger context; for example, an individual\n * SVG may have defined a `<radialGradient id=\"boop\">` where `#boop` is\n * unique to the SVG, but if we want to inline the SVG into an HTML page,\n * it may no longer be unique.\n *\n * This React Hook takes an array of locally-unique identifiers and returns\n * a mapping between them and globally-unique ones.\n */\nexport function useUniqueIdMap(originalIds: string[]): UniqueIdMap {\n const uniqueIds = useUniqueIds(originalIds.length);\n\n return useMemo(\n () => new UniqueIdMap(originalIds.map((id, i) => [id, uniqueIds[i]])),\n [originalIds, uniqueIds]\n );\n}\n", "import React from \"react\";\nimport { BBox } from \"../vendor/bezier-js\";\nimport { getBoundingBoxSize } from \"./bounding-box\";\nimport * as colors from \"./colors\";\nimport { AttachmentPoint, iterAttachmentPoints, Specs } from \"./specs\";\n\nconst ATTACHMENT_POINT_RADIUS = 20;\n\nconst ATTACHMENT_POINT_NORMAL_LENGTH = 50;\n\nconst ATTACHMENT_POINT_NORMAL_STROKE = 4;\n\nconst SPEC_OPACITY = 0.66;\n\nconst VisibleAttachmentPoint: React.FC<{\n point: AttachmentPoint;\n}> = ({ point: ap }) => {\n const { x, y } = ap.point;\n const x2 = x + ap.normal.x * ATTACHMENT_POINT_NORMAL_LENGTH;\n const y2 = y + ap.normal.y * ATTACHMENT_POINT_NORMAL_LENGTH;\n const color = colors.ATTACHMENT_POINT_COLORS[ap.type];\n\n return (\n <g data-spec-type={ap.type} data-spec-index={ap.index}>\n <circle\n fill={color}\n r={ATTACHMENT_POINT_RADIUS}\n cx={x}\n cy={y}\n opacity={SPEC_OPACITY}\n />\n <line\n opacity={SPEC_OPACITY}\n x1={x}\n y1={y}\n x2={x2}\n y2={y2}\n stroke={color}\n strokeWidth={ATTACHMENT_POINT_NORMAL_STROKE}\n />\n </g>\n );\n};\n\nconst BoundingBoxes: React.FC<{ fill: string; bboxes: BBox[] }> = (props) => (\n <>\n {props.bboxes.map((b, i) => {\n const [width, height] = getBoundingBoxSize(b);\n return (\n <rect\n data-spec-type=\"nesting\"\n data-spec-index={i}\n opacity={SPEC_OPACITY}\n key={i}\n x={b.x.min}\n y={b.y.min}\n width={width}\n height={height}\n fill={props.fill}\n />\n );\n })}\n </>\n);\n\nexport const VisibleSpecs: React.FC<{ specs: Specs }> = ({ specs }) => {\n return (\n <>\n {Array.from(iterAttachmentPoints(specs)).map((point, i) => (\n <VisibleAttachmentPoint key={i} point={point} />\n ))}\n {specs.nesting && (\n <BoundingBoxes\n fill={colors.NESTING_BOUNDING_BOX_COLOR}\n bboxes={specs.nesting}\n />\n )}\n </>\n );\n};\n", "import { Point, BBox } from \"../vendor/bezier-js\";\nimport { getBoundingBoxForBeziers } from \"./bounding-box\";\nimport * as colors from \"./colors\";\nimport { pathToShapes } from \"./path\";\nimport { normalizePoint, subtractPoints } from \"./point\";\nimport type { SvgSymbolElement } from \"./svg-symbol\";\n\nconst SPEC_LAYER_ID_RE = /^specs.*/i;\n\nexport type PointWithNormal = {\n point: Point;\n normal: Point;\n};\n\ntype AttachmentPointSpecs = {\n anchor: PointWithNormal[];\n tail: PointWithNormal[];\n leg: PointWithNormal[];\n arm: PointWithNormal[];\n horn: PointWithNormal[];\n crown: PointWithNormal[];\n wildcard: PointWithNormal[];\n};\n\ntype FullSpecs = AttachmentPointSpecs & {\n nesting: BBox[];\n};\n\nexport type Specs = Partial<FullSpecs>;\n\nexport type AttachmentPointType = keyof AttachmentPointSpecs;\n\nexport type AttachmentPoint = PointWithNormal & {\n type: AttachmentPointType;\n index: number;\n};\n\nexport const ATTACHMENT_POINT_TYPES: AttachmentPointType[] = [\n \"anchor\",\n \"tail\",\n \"leg\",\n \"arm\",\n \"horn\",\n \"crown\",\n \"wildcard\",\n];\n\nconst ATTACHMENT_POINT_SET = new Set(ATTACHMENT_POINT_TYPES);\n\nexport function isAttachmentPointType(\n value: any\n): value is AttachmentPointType {\n return ATTACHMENT_POINT_SET.has(value);\n}\n\nexport function* iterAttachmentPoints(specs: Specs): Iterable<AttachmentPoint> {\n for (let type of ATTACHMENT_POINT_TYPES) {\n const points = specs[type];\n if (points) {\n let index = 0;\n for (let point of points) {\n yield { ...point, type, index };\n index += 1;\n }\n }\n }\n}\n\nconst NUM_ARROW_POINTS = 4;\nconst ARROW_TOP_POINT_IDX = 0;\nconst ARROW_BOTTOM_POINT_IDX = 2;\n\nfunction getArrowPoints(path: string): PointWithNormal[] {\n const shapes = pathToShapes(path);\n const points: PointWithNormal[] = [];\n\n for (let shape of shapes) {\n if (shape.length !== NUM_ARROW_POINTS) {\n throw new Error(\n `Expected arrow to have ${NUM_ARROW_POINTS} points, not ${shape.length}!`\n );\n }\n const point = shape[ARROW_BOTTOM_POINT_IDX].get(0.0);\n const normal = normalizePoint(\n subtractPoints(shape[ARROW_TOP_POINT_IDX].get(0.0), point)\n );\n points.push({\n point,\n normal,\n });\n }\n\n return points;\n}\n\nfunction getBoundingBoxes(path: string): BBox[] {\n const shapes = pathToShapes(path);\n const bboxes: BBox[] = [];\n\n for (let shape of shapes) {\n bboxes.push(getBoundingBoxForBeziers(shape));\n }\n\n return bboxes;\n}\n\n/**\n * Sort points from top to bottom, left to right.\n */\nfunction sortPoints(a: PointWithNormal, b: PointWithNormal): number {\n if (a.point.y < b.point.y) return -1;\n if (a.point.y > b.point.y) return 1;\n if (a.point.x < b.point.x) return -1;\n if (a.point.x > b.point.x) return 1;\n return 0;\n}\n\nfunction sortedPoints(points: PointWithNormal[]): PointWithNormal[] {\n const copy = [...points];\n copy.sort(sortPoints);\n return copy;\n}\n\nfunction concat<T>(first: T[] | undefined, second: T[]): T[] {\n return first ? [...first, ...second] : second;\n}\n\nconst ATTACHMENT_COLOR_MAP = new Map(\n ATTACHMENT_POINT_TYPES.map((type) => [\n colors.ATTACHMENT_POINT_COLORS[type],\n type,\n ])\n);\n\nfunction updateSpecs(fill: string, path: string, specs: Specs): Specs {\n const attachmentType = ATTACHMENT_COLOR_MAP.get(fill);\n\n if (attachmentType) {\n return {\n ...specs,\n [attachmentType]: sortedPoints(\n concat(specs[attachmentType], getArrowPoints(path))\n ),\n };\n }\n\n if (fill === colors.NESTING_BOUNDING_BOX_COLOR) {\n return {\n ...specs,\n nesting: concat(specs.nesting, getBoundingBoxes(path)),\n };\n }\n\n console.log(\n `Not sure what to do with specs path with fill \"${fill}\", ignoring it.`\n );\n\n return specs;\n}\n\nfunction getSpecs(layers: SvgSymbolElement[]): Specs {\n let specs: Specs = {};\n\n for (let layer of layers) {\n if (layer.tagName !== \"path\") {\n throw new Error(\n `Found an unexpected <${layer.tagName}> in the specs layer!`\n );\n }\n const { fill, d } = layer.props;\n if (!(fill && d)) {\n throw new Error(\n `Specs layer does not contain 'fill' and/or 'd' attributes!`\n );\n }\n specs = updateSpecs(fill, d, specs);\n }\n\n return specs;\n}\n\nexport function extractSpecs(\n layers: SvgSymbolElement[]\n): [Specs | undefined, SvgSymbolElement[]] {\n const layersWithoutSpecs: SvgSymbolElement[] = [];\n let specs: Specs | undefined = undefined;\n\n const setSpecs = (s: Specs | undefined) => {\n if (s) {\n if (specs) {\n throw new Error(\"Duplicate specs layers found!\");\n }\n specs = s;\n }\n };\n\n for (let layer of layers) {\n switch (layer.tagName) {\n case \"g\":\n const { id } = layer.props;\n if (id && SPEC_LAYER_ID_RE.test(id)) {\n setSpecs(getSpecs(layer.children));\n } else {\n let [s, children] = extractSpecs(layer.children);\n setSpecs(s);\n layersWithoutSpecs.push({\n ...layer,\n children,\n });\n }\n break;\n case \"path\":\n layersWithoutSpecs.push(layer);\n break;\n }\n }\n\n return [specs, layersWithoutSpecs];\n}\n", "import { Point } from \"../vendor/bezier-js\";\n\n/** Return the \"reverse\" of the given point/vector, i.e. scale it by -1. */\nexport function reversePoint(p: Point): Point {\n return { x: -p.x, y: -p.y };\n}\n\nexport function scalePointXY(p: Point, xScale: number, yScale: number): Point {\n return {\n x: p.x * xScale,\n y: p.y * yScale,\n };\n}\n\nexport function subtractPoints(p1: Point, p2: Point): Point {\n return {\n x: p1.x - p2.x,\n y: p1.y - p2.y,\n };\n}\n\nexport function normalizePoint(p: Point): Point {\n const len = Math.sqrt(Math.pow(p.x, 2) + Math.pow(p.y, 2));\n if (len === 0) {\n throw new Error(`Unable to normalize point with length 0`);\n }\n return {\n x: p.x / len,\n y: p.y / len,\n };\n}\n\nexport function normalizedPoint2rad(p: Point): number {\n let result = Math.acos(p.x);\n if (p.y < 0) {\n result += (Math.PI - result) * 2;\n }\n return result;\n}\n", "import { EMPTY_SVG_SYMBOL_DATA, SvgSymbolData } from \"./svg-symbol\";\nimport { Vocabulary } from \"./vocabulary\";\nimport _SvgVocabulary from \"./_svg-vocabulary\";\n\nexport const SvgVocabulary = new Vocabulary<SvgSymbolData>(_SvgVocabulary);\n\nexport const SvgVocabularyWithBlank = new Vocabulary<SvgSymbolData>([\n EMPTY_SVG_SYMBOL_DATA,\n ..._SvgVocabulary,\n]);\n", "export type VocabularyType = {\n name: string;\n};\n\nexport class Vocabulary<T extends VocabularyType> {\n readonly itemMap: Map<string, T>;\n\n constructor(readonly items: T[]) {\n this.itemMap = new Map(items.map((item) => [item.name, item]));\n }\n\n get(name: string): T {\n const item = this.itemMap.get(name);\n if (!item) {\n throw new Error(`Unable to find the item \"${name}\"!`);\n }\n return item;\n }\n}\n", "// This file is auto-generated, please do not modify it.\nimport type { SvgSymbolData } from \"./svg-symbol\";\nconst _SvgVocabulary: SvgSymbolData[] = JSON.parse(\"[{\\\"name\\\":\\\"angel\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":16.130986320794495,\\\"max\\\":703.782068657504},\\\"y\\\":{\\\"min\\\":23.71,\\\"max\\\":319.41981790809695}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"angel_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wings_sun\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 506.987 137.950 C 568.739 136.960 619.798 136.142 676.684 135.230 C 681.210 154.644 656.742 180.776 640.863 180.285 C 595.141 174.638 554.231 169.585 504.754 163.474 C 506.166 155.642 506.972 146.891 506.987 137.950 C 506.856 137.949 506.856 137.949 506.987 137.950 C 506.856 137.949 506.856 137.949 506.856 137.949 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 504.754 163.474 C 554.231 169.585 595.141 174.638 640.863 180.285 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 504.754 163.474 C 554.231 169.585 595.141 174.638 640.863 180.285 C 638.457 200.361 615.583 217.740 592.587 216.623 C 560.789 207.063 532.425 198.536 498.122 188.223 C 501.068 179.877 503.252 171.801 504.754 163.474 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 498.122 188.223 C 532.425 198.536 560.789 207.063 592.587 216.623 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 498.122 188.223 C 532.425 198.536 560.789 207.063 592.587 216.623 C 591.536 231.519 576.814 245.100 559.238 245.799 C 534.971 234.210 513.392 223.906 487.294 211.443 C 491.742 203.687 495.261 196.113 498.122 188.223 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 487.294 211.443 C 513.392 223.906 534.971 234.210 559.238 245.799 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 487.294 211.443 C 513.392 223.906 534.971 234.210 559.238 245.799 C 555.932 258.697 544.078 271.138 533.146 273.387 C 513.067 259.805 494.747 247.413 472.598 232.431 C 478.164 225.871 483.057 218.858 487.294 211.443 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 472.598 232.431 C 494.747 247.413 513.067 259.805 533.146 273.387 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 472.598 232.431 C 494.747 247.413 513.067 259.805 533.146 273.387 C 529.804 283.581 513.119 298.908 501.534 297.238 C 485.930 281.754 471.693 267.627 454.481 250.548 C 460.802 245.319 467.007 239.126 472.598 232.431 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 454.481 250.548 C 471.693 267.627 485.930 281.754 501.534 297.238 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 454.481 250.548 C 471.693 267.627 485.930 281.754 501.534 297.238 C 493.486 308.659 474.674 311.138 463.490 307.563 C 453.563 293.558 444.477 280.741 433.493 265.244 C 441.164 260.740 448.044 255.915 454.481 250.548 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 433.493 265.244 C 444.477 280.741 453.563 293.558 463.490 307.563 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 433.493 265.244 C 444.477 280.741 453.563 293.558 463.490 307.563 C 456.350 315.696 440.165 320.344 427.837 311.790 C 421.912 299.742 416.644 289.029 410.272 276.072 C 418.519 273.056 426.228 269.449 433.493 265.244 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 427.837 311.790 C 421.912 299.742 416.644 289.029 410.272 276.072 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 410.272 276.072 C 402.376 278.928 394.080 281.142 385.523 282.703 C 387.943 293.282 389.945 302.032 392.132 311.593 C 402.874 320.703 416.362 320.621 427.837 311.790 C 421.912 299.742 416.644 289.029 410.272 276.072 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 504.757 112.425 C 474.634 116.155 415.035 123.794 415.026 123.795 M 504.757 112.425 C 506.113 120.819 506.857 129.295 506.987 137.950 C 506.856 137.949 506.856 137.949 506.856 137.949 C 506.856 137.949 506.856 137.949 506.987 137.950 C 506.972 146.891 506.166 155.642 504.754 163.474 C 503.252 171.801 501.068 179.877 498.122 188.223 C 495.261 196.113 491.742 203.687 487.294 211.443 C 483.057 218.858 478.164 225.871 472.598 232.431 C 467.007 239.126 460.802 245.319 454.481 250.548 C 448.044 255.915 441.164 260.740 433.493 265.244 C 426.228 269.449 418.519 273.056 410.272 276.072 C 402.376 278.928 394.080 281.142 385.523 282.703 C 377.234 284.053 360.002 284.936 359.999 284.936 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 215.159 163.474 C 213.747 155.642 212.941 146.891 212.926 137.950 C 151.175 136.960 100.115 136.142 43.230 135.230 C 38.703 154.644 63.171 180.776 79.051 180.285 C 124.772 174.638 165.682 169.585 215.159 163.474 M 212.926 137.950 C 213.057 137.949 213.057 137.949 213.057 137.949 C 213.057 137.949 213.057 137.949 212.926 137.950 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 215.159 163.474 C 165.682 169.585 124.772 174.638 79.051 180.285 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 215.159 163.474 C 165.682 169.585 124.772 174.638 79.051 180.285 C 81.457 200.361 104.330 217.740 127.327 216.623 C 159.125 207.063 187.488 198.536 221.791 188.223 C 218.845 179.877 216.661 171.801 215.159 163.474 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 221.791 188.223 C 187.488 198.536 159.125 207.063 127.327 216.623 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 221.791 188.223 C 187.488 198.536 159.125 207.063 127.327 216.623 C 128.378 231.519 143.099 245.100 160.675 245.799 C 184.942 234.210 206.521 223.906 232.619 211.443 C 228.171 203.687 224.652 196.113 221.791 188.223 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.619 211.443 C 206.521 223.906 184.942 234.210 160.675 245.799 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.619 211.443 C 206.521 223.906 184.942 234.210 160.675 245.799 C 163.982 258.697 175.835 271.138 186.767 273.387 C 206.847 259.805 225.167 247.413 247.315 232.431 C 241.749 225.871 236.856 218.858 232.619 211.443 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 247.315 232.431 C 225.167 247.413 206.847 259.805 186.767 273.387 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 247.315 232.431 C 225.167 247.413 206.847 259.805 186.767 273.387 C 190.109 283.581 206.794 298.908 218.379 297.238 C 233.983 281.754 248.220 267.627 265.433 250.548 C 259.111 245.319 252.907 239.126 247.315 232.431 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 265.433 250.548 C 248.220 267.627 233.983 281.754 218.379 297.238 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 265.433 250.548 C 248.220 267.627 233.983 281.754 218.379 297.238 C 226.428 308.659 245.239 311.138 256.424 307.563 C 266.351 293.558 275.436 280.741 286.420 265.244 C 278.749 260.740 271.869 255.915 265.433 250.548 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 286.420 265.244 C 275.436 280.741 266.351 293.558 256.424 307.563 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 286.420 265.244 C 275.436 280.741 266.351 293.558 256.424 307.563 C 263.564 315.696 279.749 320.344 292.076 311.790 C 298.001 299.742 303.270 289.029 309.641 276.072 C 301.394 273.056 293.686 269.449 286.420 265.244 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 309.641 276.072 C 303.270 289.029 298.001 299.742 292.076 311.790 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 334.390 282.703 C 325.833 281.143 317.538 278.928 309.641 276.072 C 303.270 289.029 298.001 299.742 292.076 311.790 C 303.551 320.621 317.040 320.704 327.781 311.593 C 329.968 302.032 331.970 293.282 334.390 282.703 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.999 284.936 C 359.997 284.936 342.707 284.057 334.390 282.703 C 325.833 281.143 317.538 278.928 309.641 276.072 C 301.394 273.056 293.686 269.449 286.420 265.244 C 278.749 260.740 271.869 255.915 265.433 250.548 C 259.111 245.319 252.907 239.126 247.315 232.431 C 241.749 225.871 236.856 218.858 232.619 211.443 C 228.171 203.687 224.652 196.113 221.791 188.223 C 218.845 179.877 216.661 171.801 215.159 163.474 C 213.747 155.642 212.941 146.891 212.926 137.950 C 213.057 137.949 213.057 137.949 213.057 137.949 C 213.057 137.949 213.057 137.949 212.926 137.950 C 213.056 129.295 213.800 120.819 215.156 112.425 C 245.279 116.155 304.878 123.794 304.887 123.795 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 506.856 137.949 C 506.856 137.949 506.856 137.949 506.987 137.950 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 506.987 137.950 C 506.856 137.949 506.856 137.949 506.856 137.949 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 506.987 137.950 C 568.739 136.960 619.798 136.142 676.684 135.230 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 702.124 86.521 C 672.601 90.396 568.247 103.999 504.757 112.425 C 506.113 120.819 506.857 129.295 506.987 137.950 C 506.856 137.949 506.856 137.949 506.987 137.950 C 506.856 137.949 506.856 137.949 506.856 137.949 C 568.739 136.960 619.798 136.142 676.684 135.230 C 697.699 128.841 705.187 103.417 702.124 86.521 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 392.132 311.593 C 389.945 302.032 387.943 293.282 385.523 282.703 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 385.523 282.703 C 377.234 284.053 360.002 284.936 359.999 284.936 C 360.000 294.102 360.000 303.267 360.000 312.432 C 366.669 318.181 385.858 322.140 392.132 311.593 C 389.945 302.032 387.943 293.282 385.523 282.703 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 312.432 C 360.000 303.267 360.000 294.102 359.999 284.936 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 334.390 282.703 C 331.970 293.282 329.968 302.032 327.781 311.593 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 312.432 C 360.000 303.267 360.000 294.102 359.999 284.936 C 359.997 284.936 342.707 284.057 334.390 282.703 C 331.970 293.282 329.968 302.032 327.781 311.593 C 334.073 322.168 353.147 318.235 360.000 312.432 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 212.926 137.950 C 213.057 137.949 213.057 137.949 213.057 137.949 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 43.230 135.230 C 100.115 136.142 151.175 136.960 212.926 137.950 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 213.057 137.949 C 213.057 137.949 213.057 137.949 212.926 137.950 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 212.926 137.950 C 213.057 137.949 213.057 137.949 213.057 137.949 C 213.056 129.295 213.800 120.819 215.156 112.425 C 151.666 103.999 47.312 90.396 17.789 86.521 C 14.726 103.417 22.215 128.841 43.230 135.230 C 100.115 136.142 151.175 136.960 212.926 137.950 C 213.057 137.949 213.057 137.949 212.926 137.950 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 215.156 112.425 C 213.800 120.819 213.056 129.295 212.926 137.950 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 213.057 137.949 C 213.057 137.949 213.057 137.949 212.926 137.950 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 212.926 137.950 C 213.057 137.949 213.057 137.949 213.057 137.949 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 212.926 137.950 C 212.941 146.891 213.747 155.642 215.159 163.474 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 215.159 163.474 C 216.661 171.801 218.845 179.877 221.791 188.223 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 221.791 188.223 C 224.652 196.113 228.171 203.687 232.619 211.443 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.619 211.443 C 236.856 218.858 241.749 225.871 247.315 232.431 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 247.315 232.431 C 252.907 239.126 259.111 245.319 265.433 250.548 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 265.433 250.548 C 271.869 255.915 278.749 260.740 286.420 265.244 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 286.420 265.244 C 293.686 269.449 301.394 273.056 309.641 276.072 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 309.641 276.072 C 317.538 278.928 325.833 281.143 334.390 282.703 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 334.390 282.703 C 342.707 284.057 359.997 284.936 359.999 284.936 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.999 284.936 C 360.002 284.936 377.234 284.053 385.523 282.703 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 385.523 282.703 C 394.080 281.142 402.376 278.928 410.272 276.072 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 410.272 276.072 C 418.519 273.056 426.228 269.449 433.493 265.244 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 433.493 265.244 C 441.164 260.740 448.044 255.915 454.481 250.548 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 454.481 250.548 C 460.802 245.319 467.007 239.126 472.598 232.431 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 472.598 232.431 C 478.164 225.871 483.057 218.858 487.294 211.443 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 487.294 211.443 C 491.742 203.687 495.261 196.113 498.122 188.223 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 498.122 188.223 C 501.068 179.877 503.252 171.801 504.754 163.474 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 504.754 163.474 C 506.166 155.642 506.972 146.891 506.987 137.950 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 506.856 137.949 C 506.856 137.949 506.856 137.949 506.987 137.950 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 506.987 137.950 C 506.856 137.949 506.856 137.949 506.856 137.949 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 506.987 137.950 C 506.857 129.295 506.113 120.819 504.757 112.425 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S23\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 304.887 123.795 C 304.878 123.794 245.279 116.155 215.156 112.425 C 213.800 120.819 213.056 129.295 212.926 137.950 C 213.057 137.949 213.057 137.949 212.926 137.950 C 213.057 137.949 213.057 137.949 213.057 137.949 C 212.941 146.891 213.747 155.642 215.159 163.474 C 216.661 171.801 218.845 179.877 221.791 188.223 C 224.652 196.113 228.171 203.687 232.619 211.443 C 236.856 218.858 241.749 225.871 247.315 232.431 C 252.907 239.126 259.111 245.319 265.433 250.548 C 271.869 255.915 278.749 260.740 286.420 265.244 C 293.686 269.449 301.394 273.056 309.641 276.072 C 317.538 278.928 325.833 281.143 334.390 282.703 C 342.707 284.057 359.997 284.936 359.999 284.936 C 360.002 284.936 377.234 284.053 385.523 282.703 C 394.080 281.142 402.376 278.928 410.272 276.072 C 418.519 273.056 426.228 269.449 433.493 265.244 C 441.164 260.740 448.044 255.915 454.481 250.548 C 460.802 245.319 467.007 239.126 472.598 232.431 C 478.164 225.871 483.057 218.858 487.294 211.443 C 491.742 203.687 495.261 196.113 498.122 188.223 C 501.068 179.877 503.252 171.801 504.754 163.474 C 506.166 155.642 506.972 146.891 506.987 137.950 C 506.856 137.949 506.856 137.949 506.987 137.950 C 506.856 137.949 506.856 137.949 506.856 137.949 C 506.857 129.295 506.113 120.819 504.757 112.425 C 474.634 116.155 415.035 123.794 415.026 123.795 C 415.015 123.795 304.898 123.795 304.887 123.795 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"angel_lovers_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 522.427 265.102 C 519.070 258.348 516.635 245.931 517.928 240.348 C 520.134 230.824 526.469 218.981 528.505 216.225 C 530.255 213.856 540.712 201.625 544.006 197.279 C 547.650 192.472 551.544 181.325 554.515 180.600 C 556.727 180.059 560.269 184.725 560.293 187.389 C 560.328 191.377 558.122 196.580 557.765 197.821 C 556.362 202.703 545.256 216.791 546.912 219.146 C 548.823 221.863 554.711 221.218 557.982 220.955 C 560.670 220.739 576.236 213.491 578.637 212.265 C 581.351 210.879 598.270 200.268 600.254 199.067 C 601.975 198.025 616.467 187.988 619.101 187.752 C 619.962 187.675 624.423 186.844 626.014 189.698 C 627.364 192.122 625.545 194.633 625.225 195.223 C 623.901 197.656 608.044 207.155 606.366 208.430 C 604.669 209.718 588.397 220.413 588.389 223.213 C 588.388 223.632 589.988 225.900 590.369 226.073 C 592.867 227.203 609.917 219.262 611.864 218.515 C 614.100 217.657 632.877 208.090 636.005 208.438 C 636.705 208.516 640.078 208.514 641.154 211.222 C 642.096 213.593 640.129 216.106 639.733 216.653 C 637.930 219.144 618.870 226.838 616.800 227.927 C 614.880 228.937 596.924 236.778 596.129 239.516 C 595.992 239.989 596.843 243.156 597.234 243.456 C 599.226 244.989 615.640 238.839 617.492 238.361 C 619.308 237.893 634.901 232.577 637.303 233.130 C 637.993 233.289 641.682 233.885 642.135 236.497 C 642.559 238.944 639.129 241.960 638.481 242.503 C 636.612 244.070 620.838 247.801 619.093 248.435 C 616.859 249.247 596.990 256.048 595.195 258.606 C 594.935 258.977 594.169 261.902 594.411 262.285 C 595.792 264.473 613.655 258.907 615.579 258.491 C 617.186 258.144 630.590 253.923 632.995 254.093 C 633.651 254.139 636.865 255.284 637.280 257.481 C 637.672 259.562 634.919 262.328 634.375 262.815 C 632.295 264.678 614.185 268.888 612.152 269.508 C 608.251 270.696 574.894 281.929 569.582 282.653 C 565.888 283.156 548.547 287.074 538.594 282.121 C 529.341 277.517 524.876 270.030 522.427 265.102 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 197.573 265.102 C 200.930 258.348 203.365 245.931 202.072 240.348 C 199.866 230.824 193.532 218.981 191.496 216.225 C 189.745 213.856 179.288 201.625 175.993 197.278 C 172.349 192.471 168.456 181.325 165.485 180.599 C 163.273 180.059 159.731 184.725 159.707 187.389 C 159.672 191.377 161.878 196.580 162.235 197.821 C 163.638 202.703 174.744 216.791 173.088 219.145 C 171.177 221.863 165.289 221.218 162.018 220.955 C 159.330 220.738 143.764 213.491 141.363 212.265 C 138.649 210.879 121.730 200.268 119.746 199.067 C 118.025 198.025 103.533 187.988 100.899 187.752 C 100.038 187.675 95.577 186.844 93.986 189.698 C 92.636 192.122 94.455 194.633 94.775 195.223 C 96.099 197.656 111.956 207.154 113.634 208.429 C 115.331 209.718 131.603 220.413 131.611 223.213 C 131.613 223.632 130.012 225.900 129.631 226.073 C 127.133 227.203 110.083 219.262 108.135 218.515 C 105.900 217.657 87.123 208.091 83.995 208.438 C 83.295 208.516 79.922 208.514 78.846 211.221 C 77.903 213.593 79.871 216.106 80.267 216.653 C 82.070 219.144 101.130 226.838 103.200 227.927 C 105.121 228.937 123.076 236.779 123.871 239.517 C 124.008 239.989 123.157 243.156 122.766 243.456 C 120.774 244.989 104.360 238.839 102.508 238.361 C 100.692 237.893 85.099 232.577 82.697 233.130 C 82.007 233.289 78.318 233.886 77.865 236.497 C 77.441 238.944 80.870 241.960 81.518 242.503 C 83.388 244.070 99.162 247.801 100.907 248.435 C 103.141 249.247 123.010 256.048 124.805 258.606 C 125.065 258.977 125.831 261.902 125.589 262.285 C 124.208 264.473 106.345 258.908 104.421 258.492 C 102.814 258.144 89.410 253.922 87.005 254.092 C 86.349 254.139 83.135 255.283 82.720 257.481 C 82.328 259.562 85.081 262.328 85.625 262.816 C 87.705 264.679 105.815 268.888 107.847 269.508 C 111.749 270.696 145.106 281.929 150.418 282.653 C 154.112 283.156 171.453 287.074 181.406 282.121 C 190.659 277.517 195.124 270.030 197.573 265.102 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S27\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 414.882 223.898 C 414.883 223.899 419.954 230.330 426.339 233.106 C 436.017 237.314 441.149 233.008 448.459 235.770 C 453.596 237.712 455.418 242.375 461.503 244.431 C 470.460 247.458 484.524 245.456 484.526 245.456 C 484.524 245.455 472.700 241.935 467.304 235.930 C 461.859 229.869 464.882 222.173 459.610 217.620 C 454.559 213.258 448.601 217.950 441.203 212.802 C 434.723 208.292 431.514 199.242 431.513 199.241 C 431.515 199.241 438.660 203.233 445.621 203.364 C 456.193 203.564 459.309 197.677 467.135 197.407 C 472.619 197.218 476.112 200.748 482.513 200.281 C 491.975 199.591 504.222 192.317 504.225 192.316 C 504.223 192.316 491.937 193.407 484.694 189.835 C 477.324 186.201 477.258 177.864 470.610 175.592 C 464.310 173.440 460.548 179.998 451.782 178.000 C 444.032 176.234 437.624 168.994 437.622 168.993 C 437.624 168.992 445.776 169.726 452.209 167.041 C 462.019 162.948 462.544 156.308 469.645 152.913 C 474.604 150.542 479.220 152.368 484.912 149.381 C 493.338 144.959 501.718 133.397 501.719 133.395 C 501.718 133.396 490.901 139.301 482.844 138.911 C 474.668 138.515 471.305 130.897 464.331 131.472 C 457.685 132.019 456.885 139.576 448.041 141.273 C 440.283 142.763 431.559 138.734 431.558 138.734 C 431.559 138.733 439.413 136.413 444.371 131.521 C 451.893 124.099 449.819 117.728 455.118 111.970 C 458.837 107.929 463.840 107.977 468.021 103.100 C 474.176 95.919 477.580 82.122 477.581 82.120 C 477.580 82.121 469.898 91.776 462.311 94.538 C 454.660 97.322 448.654 91.642 442.467 94.832 C 436.533 97.891 438.670 105.176 431.133 110.123 C 424.543 114.448 414.964 114.052 414.962 114.053 C 414.963 114.052 421.394 108.980 424.171 102.595 C 428.379 92.917 424.074 87.786 426.836 80.475 C 428.777 75.338 433.439 73.516 435.496 67.431 C 438.522 58.475 436.521 44.411 436.521 44.409 C 436.520 44.410 433.001 56.235 426.995 61.631 C 420.934 67.077 413.238 64.053 408.685 69.326 C 404.323 74.376 409.015 80.334 403.867 87.731 C 399.358 94.212 390.307 97.420 390.306 97.421 C 390.306 97.420 394.299 90.275 394.430 83.314 C 394.629 72.742 388.742 69.626 388.472 61.801 C 388.282 56.316 391.814 52.823 391.347 46.422 C 390.657 36.960 383.382 24.712 383.381 24.710 C 383.381 24.712 384.471 36.997 380.900 44.240 C 377.266 51.611 368.929 51.677 366.658 58.325 C 364.505 64.625 371.064 68.387 369.065 77.153 C 367.298 84.903 360.058 91.311 360.057 91.312 C 360.057 91.311 360.791 83.159 358.106 76.726 C 354.013 66.915 347.373 66.391 343.977 59.289 C 341.607 54.331 343.433 49.715 340.446 44.023 C 336.024 35.597 324.462 27.217 324.461 27.216 C 324.461 27.218 330.366 38.034 329.976 46.091 C 329.580 54.266 321.962 57.630 322.537 64.605 C 323.084 71.250 330.641 72.050 332.339 80.894 C 333.828 88.652 329.800 97.376 329.800 97.377 C 329.799 97.376 327.478 89.522 322.586 84.564 C 315.164 77.042 308.794 79.116 303.035 73.817 C 298.994 70.099 299.042 65.095 294.166 60.915 C 286.984 54.759 273.187 51.355 273.185 51.354 C 273.186 51.356 282.841 59.036 285.602 66.623 C 288.387 74.274 282.707 80.281 285.897 86.468 C 288.956 92.402 296.241 90.265 301.188 97.802 C 305.513 104.391 305.118 113.971 305.118 113.972 C 305.117 113.971 300.046 107.541 293.661 104.765 C 283.983 100.556 278.851 104.862 271.541 102.099 C 266.404 100.158 264.582 95.495 258.497 93.439 C 249.540 90.412 235.476 92.414 235.474 92.414 C 235.476 92.415 247.300 95.935 252.696 101.940 C 258.141 108.001 255.118 115.697 260.390 120.250 C 265.441 124.612 271.399 119.920 278.797 125.068 C 285.277 129.577 288.486 138.627 288.487 138.629 C 288.485 138.628 281.340 134.637 274.379 134.505 C 263.807 134.306 260.691 140.192 252.865 140.463 C 247.381 140.652 243.888 137.122 237.487 137.589 C 228.025 138.279 215.778 145.553 215.775 145.554 C 215.777 145.554 228.063 144.463 235.306 148.035 C 242.676 151.669 242.742 160.006 249.390 162.277 C 255.690 164.430 259.452 157.871 268.218 159.870 C 275.968 161.636 282.376 168.877 282.378 168.878 C 282.376 168.878 274.224 168.145 267.791 170.829 C 257.981 174.923 257.457 181.563 250.355 184.958 C 245.396 187.329 240.780 185.502 235.088 188.489 C 226.662 192.910 218.282 204.473 218.281 204.475 C 218.283 204.474 229.099 198.569 237.156 198.959 C 245.332 199.355 248.695 206.973 255.669 206.398 C 262.315 205.851 263.115 198.294 271.959 196.596 C 279.717 195.106 288.441 199.136 288.442 199.136 C 288.441 199.137 280.587 201.457 275.629 206.349 C 268.107 213.771 270.181 220.141 264.882 225.899 C 261.163 229.940 256.160 229.893 251.979 234.769 C 245.824 241.951 242.420 255.748 242.419 255.750 C 242.420 255.749 250.102 246.094 257.689 243.332 C 265.340 240.547 271.346 246.227 277.533 243.037 C 283.467 239.979 281.330 232.694 288.867 227.747 C 295.457 223.422 305.036 223.817 305.038 223.817 C 337.584 219.380 379.826 215.526 414.882 223.898 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S32\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 122.857 C 332.928 122.857 297.799 117.054 294.790 145.929 C 293.448 158.813 295.607 173.072 296.981 183.577 C 306.045 252.883 359.994 259.668 360.000 259.676 C 360.006 259.668 414.312 251.559 423.627 183.663 C 424.888 174.471 426.298 159.432 425.210 145.929 C 422.615 113.730 387.072 122.857 360.000 122.857 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 294.790 145.929 C 293.448 158.813 295.607 173.072 296.981 183.577 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S27_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 353.138 164.988 C 335.104 140.908 294.796 145.931 294.790 145.929 C 293.448 158.813 295.607 173.072 296.981 183.577 C 298.371 183.666 301.151 183.842 301.152 183.842 C 301.157 183.842 350.503 183.842 350.508 183.842 C 350.508 183.842 353.229 183.983 353.229 183.983 C 353.229 183.981 353.139 164.990 353.138 164.988 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 423.627 183.663 C 424.888 174.471 426.298 159.432 425.210 145.929 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S28\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 420.872 183.842 C 420.872 183.842 422.709 183.723 423.627 183.663 C 424.888 174.471 426.298 159.432 425.210 145.929 C 425.204 145.931 384.809 141.268 368.888 164.988 C 368.887 164.990 368.780 183.739 368.780 183.741 C 368.780 183.741 371.431 183.840 371.516 183.842 C 386.319 184.163 420.867 183.842 420.872 183.842 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.152 183.842 C 301.157 183.842 350.503 183.842 350.508 183.842 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S29\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.152 183.842 C 301.157 183.842 350.503 183.842 350.508 183.842 C 350.505 183.841 336.718 170.996 325.829 170.996 C 314.941 170.996 301.154 183.841 301.152 183.842 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.516 183.842 C 386.319 184.163 420.867 183.842 420.872 183.842 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S30\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.516 183.842 C 386.319 184.163 420.867 183.842 420.872 183.842 C 420.870 183.841 407.083 170.995 396.194 170.995 C 385.305 170.995 371.518 183.841 371.516 183.842 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.516 183.842 C 386.319 184.163 420.867 183.842 420.872 183.842 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.152 183.842 C 301.157 183.842 350.503 183.842 350.508 183.842 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S31\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 420.872 183.842 C 420.870 183.843 407.083 196.688 396.194 196.689 C 385.305 196.689 371.518 183.843 371.516 183.842 C 386.319 184.163 420.867 183.842 420.872 183.842 M 301.152 183.842 C 301.157 183.842 350.503 183.842 350.508 183.842 C 350.505 183.843 336.718 196.689 325.829 196.689 C 314.941 196.688 301.154 183.843 301.152 183.842 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S33\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 368.780 183.741 C 368.780 183.746 368.888 229.667 368.888 229.672 C 368.886 229.672 353.140 229.672 353.138 229.672 C 353.138 229.667 353.229 183.988 353.229 183.983 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S35\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 351.796 243.315 C 356.754 244.719 363.583 245.186 368.073 243.315 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S39\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 326.773 184.472 C 330.016 184.472 332.632 187.088 332.632 190.331 C 332.632 193.574 330.016 196.190 326.773 196.190 C 323.530 196.190 320.914 193.574 320.914 190.331 C 320.914 187.088 323.530 184.472 326.773 184.472 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S39_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 396.144 184.472 C 399.387 184.472 402.003 187.088 402.003 190.331 C 402.003 193.574 399.387 196.190 396.144 196.190 C 392.901 196.190 390.285 193.574 390.285 190.331 C 390.285 187.088 392.901 184.472 396.144 184.472 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":537.95,\\\"y\\\":704.804,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005032287106926829,\\\"y\\\":-0.9999873379630732}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":182.05,\\\"y\\\":704.804,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.0050322871069350015,\\\"y\\\":-0.999987337963073}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":361.982,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"angel_o_pain\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":19.240040343356252,\\\"max\\\":698.1649151372894},\\\"y\\\":{\\\"min\\\":115.0990915486174,\\\"max\\\":607.3255625024204}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"angel_o_pain\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"angel_o_pain\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 339.229 466.249 C 334.177 467.652 330.808 470.740 329.125 475.512 C 323.511 490.107 340.352 504.142 348.492 513.965 C 350.457 516.491 360.840 526.876 360.841 526.878 C 360.843 526.876 369.262 516.491 371.227 513.965 C 377.682 506.668 388.910 495.159 390.875 485.336 C 392.559 476.074 390.033 467.652 379.647 465.969 C 373.472 464.845 367.578 467.371 364.209 472.144 C 363.367 473.266 360.000 479.159 360.000 479.160 C 359.999 479.159 355.789 472.986 355.229 472.144 C 351.018 467.371 345.405 464.285 339.229 466.249 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#F6EA8D6D-4919-4427-801E-F8E5F651729A_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 428.205 189.215 C 410.242 171.250 392.278 165.917 367.859 163.111 C 361.964 163.111 358.315 162.269 352.421 163.111 C 333.053 165.074 317.336 167.321 300.494 178.547 C 267.935 200.161 253.058 249.279 274.109 283.243 C 286.741 304.013 310.874 314.949 318.459 335.450 C 322.088 345.847 321.836 358.529 309.898 363.509 C 299.154 368.398 288.005 358.736 279.866 353.123 C 259.657 339.931 240.591 326.604 215.870 325.617 C 182.998 324.299 155.248 349.879 137.172 374.174 C 120.652 396.589 105.600 421.634 73.176 419.645 C 39.137 417.403 25.885 365.377 60.932 359.859 C 72.731 357.954 83.387 368.280 77.493 379.227 C 75.808 382.595 73.002 385.402 69.353 386.244 C 68.230 386.524 63.459 385.963 63.178 386.244 C 61.775 388.489 71.037 391.576 72.721 391.857 C 86.475 394.103 95.457 380.069 94.334 367.438 C 92.089 347.789 67.950 338.527 50.828 343.579 C 16.865 353.405 12.532 396.158 31.180 421.329 C 46.833 441.990 71.367 445.136 95.069 439.293 C 107.652 436.017 120.891 428.627 130.154 419.364 C 141.663 407.857 149.789 393.762 159.907 381.192 C 171.491 366.986 188.600 353.360 207.449 352.563 C 242.496 350.716 252.078 371.648 279.866 385.682 C 289.128 390.454 308.492 392.699 308.495 392.699 C 308.494 392.700 301.206 396.085 300.074 396.628 C 277.719 404.623 269.066 389.099 250.534 380.895 C 215.477 365.034 178.399 376.404 160.715 411.209 C 155.663 421.314 152.014 431.979 151.453 443.207 C 149.206 474.644 171.941 506.642 205.063 507.202 C 233.692 507.764 261.029 491.874 262.041 463.416 C 262.688 445.239 258.831 429.747 242.113 421.874 C 221.217 412.034 191.590 419.911 191.590 446.575 C 191.590 461.171 205.345 474.923 219.939 467.065 C 227.798 463.134 226.956 454.714 226.114 454.154 C 225.272 453.593 222.186 457.522 221.343 458.082 C 217.975 461.171 214.326 462.293 210.676 459.206 C 205.624 455.277 205.624 446.576 208.992 441.804 C 219.939 426.366 246.042 439.838 244.079 460.048 C 242.674 476.047 228.641 486.152 213.484 486.994 C 189.345 488.397 171.381 468.468 173.065 444.891 C 174.188 427.208 185.693 408.677 201.695 400.262 C 234.496 382.617 258.859 424.136 290.813 424.706 C 305.127 424.992 309.337 423.582 322.810 418.530 C 324.959 417.597 331.792 415.724 331.792 415.724 C 331.791 415.725 328.144 420.495 327.581 421.338 C 321.687 427.232 314.108 431.723 307.653 436.776 C 289.128 450.809 274.813 469.616 279.584 493.754 C 285.479 525.192 324.494 529.120 335.160 559.434 C 341.335 576.275 332.634 595.361 312.706 593.116 C 303.443 591.993 292.496 583.012 294.741 572.906 C 296.425 565.046 305.408 559.715 311.863 567.012 C 313.266 568.696 314.389 575.432 315.513 575.714 C 317.477 576.556 318.881 570.941 318.881 569.538 C 320.003 559.153 310.179 553.540 300.917 555.223 C 290.531 557.469 284.357 564.486 282.953 574.591 C 278.742 608.834 336.283 619.220 350.317 584.696 C 359.019 563.083 344.422 534.453 329.265 519.015 C 317.758 507.227 300.075 494.596 306.811 475.229 C 311.303 463.159 331.185 451.560 341.054 443.231 C 347.832 437.530 354.262 432.839 357.612 424.706 C 358.219 423.411 360.421 417.689 360.422 417.689 C 360.422 417.689 362.290 423.662 362.669 424.706 C 365.632 432.847 373.300 437.513 380.069 443.231 C 389.934 451.859 405.050 460.914 411.786 471.861 C 421.891 489.262 409.260 501.051 397.753 512.840 C 381.472 529.401 368.561 543.434 368.281 567.854 C 368.000 583.011 371.930 595.641 386.806 602.659 C 408.418 612.483 439.294 602.379 437.048 574.591 C 436.206 564.205 429.190 556.347 418.804 554.942 C 411.225 554.100 401.963 558.031 400.840 566.170 C 400.840 567.855 402.523 577.117 405.050 575.714 C 405.892 575.432 406.173 572.064 406.454 571.222 C 407.858 567.854 409.823 565.047 413.751 563.926 C 422.732 561.400 427.785 572.625 425.259 579.643 C 417.681 601.255 383.719 594.518 382.596 572.906 C 382.315 570.380 383.438 565.609 383.998 562.802 C 392.982 528.838 439.855 524.909 440.416 488.701 C 440.978 458.388 430.311 449.686 407.015 432.565 C 401.402 428.635 396.629 424.706 391.858 419.934 C 391.577 419.372 389.333 415.725 389.333 415.724 C 389.333 415.724 396.439 417.785 398.595 418.812 C 411.506 424.145 416.559 424.984 430.593 424.706 C 458.432 424.431 473.628 397.169 499.780 396.333 C 526.445 395.219 548.058 422.437 548.058 448.259 C 548.058 467.066 532.060 485.870 513.253 486.994 C 499.781 487.836 487.992 483.344 480.414 471.837 C 471.432 458.645 477.046 440.681 493.044 435.910 C 505.675 431.980 520.832 443.768 511.851 456.680 C 508.482 461.451 504.552 462.014 499.780 459.206 C 498.657 458.645 495.009 455.277 494.447 455.838 C 492.483 456.398 494.167 460.890 494.447 461.732 C 497.254 466.503 501.464 468.187 506.516 468.468 C 526.445 470.153 533.182 449.101 525.884 433.102 C 520.832 422.997 510.445 418.226 499.780 418.227 C 462.449 417.385 445.889 455.838 464.696 485.309 C 476.764 504.396 493.886 507.764 514.938 507.202 C 531.779 506.921 546.654 498.782 556.759 485.309 C 563.776 476.328 568.547 465.100 568.547 453.311 C 569.389 411.490 544.977 374.743 499.780 374.440 C 479.740 374.244 463.357 380.722 446.592 390.454 C 433.271 397.803 426.383 402.243 411.225 397.191 C 409.823 396.909 400.561 392.419 400.560 392.418 C 400.561 392.418 405.613 392.418 406.173 392.418 C 411.507 392.700 419.646 390.173 424.698 387.928 C 447.994 376.419 467.656 353.448 495.430 352.563 C 513.019 351.863 528.110 355.290 543.040 365.754 C 567.440 383.073 577.966 414.122 603.668 430.592 C 643.175 456.486 694.109 437.695 697.081 387.648 C 698.528 365.475 681.082 343.861 658.628 342.458 C 645.716 341.615 633.085 346.386 626.069 357.333 C 619.052 368.841 623.262 386.805 636.735 391.297 C 641.226 392.699 645.716 391.857 649.926 389.892 C 650.489 389.612 653.295 387.366 652.733 386.244 C 652.733 386.244 647.681 386.244 646.840 386.244 C 642.629 384.560 639.822 381.753 638.700 377.542 C 634.489 362.946 650.207 356.210 661.996 361.544 C 692.028 375.858 677.992 419.181 643.471 419.645 C 612.633 420.060 595.345 390.344 578.687 369.122 C 560.382 346.192 524.473 323.352 493.746 325.617 C 467.949 327.431 446.591 340.492 426.383 355.089 C 417.401 361.263 405.797 370.997 396.068 361.825 C 388.719 354.805 393.877 343.575 397.890 335.450 C 406.919 317.295 427.083 305.417 439.432 286.612 C 459.642 256.859 453.748 214.477 428.205 189.215 M 357.513 291.911 C 311.817 292.068 287.790 252.120 287.583 246.193 C 287.345 239.423 313.987 202.593 358.607 202.915 C 408.027 203.274 429.235 242.829 429.609 247.877 C 429.921 252.081 414.019 291.717 357.513 291.911 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#F6EA8D6D-4919-4427-801E-F8E5F651729A_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 248.848 215.878 C 238.744 184.722 201.693 167.601 174.187 154.970 C 162.680 149.638 135.453 135.602 123.664 141.778 C 111.875 147.673 112.717 164.514 123.664 170.969 C 130.119 174.618 141.347 174.618 148.926 176.302 C 165.486 179.951 183.731 185.004 199.448 192.301 C 207.308 195.951 214.605 201.003 221.060 206.897 C 221.903 207.740 227.237 212.511 224.991 213.634 C 223.586 214.195 219.097 211.950 217.974 211.388 C 212.360 208.861 206.746 206.897 201.133 204.651 C 182.047 197.073 159.312 190.336 138.821 190.899 C 130.119 190.899 123.383 192.862 121.980 202.406 C 121.138 209.985 124.225 216.721 132.084 218.686 C 138.260 220.370 155.101 220.931 162.398 221.212 C 173.345 221.492 190.467 223.457 201.133 226.264 C 210.114 228.790 219.376 231.036 227.797 234.964 C 229.762 235.807 236.499 238.895 234.534 241.982 C 233.131 243.666 228.078 242.264 226.394 241.982 C 217.410 240.021 208.429 238.056 199.448 236.088 C 189.905 234.404 180.363 233.001 170.819 232.719 C 162.680 232.719 147.242 231.317 140.505 235.807 C 130.682 242.544 132.085 258.262 143.874 261.910 C 149.487 264.436 161.275 262.472 167.451 261.910 C 182.889 259.665 198.607 257.981 214.605 256.579 C 217.131 256.579 233.972 257.982 235.938 258.823 C 238.183 259.947 240.709 262.753 238.464 264.999 C 236.499 266.963 232.007 265.560 229.762 264.999 C 222.465 264.437 214.886 264.718 207.869 264.999 C 197.764 264.999 171.942 266.962 164.082 272.857 C 155.662 279.032 158.749 292.505 169.135 294.471 C 173.064 295.313 183.169 291.944 187.660 290.540 C 199.448 287.172 210.677 283.804 223.026 281.841 C 226.955 280.717 240.427 278.190 243.235 281.841 C 245.479 285.489 235.656 284.927 234.814 285.208 C 224.991 285.208 202.256 288.856 200.009 300.365 C 198.325 308.223 203.659 312.434 211.238 311.591 C 219.377 311.031 229.201 303.171 238.183 300.365 C 239.586 300.083 251.936 297.276 251.936 300.365 C 251.936 301.487 248.848 302.328 248.006 302.891 C 244.638 304.576 240.148 306.539 238.744 310.470 C 237.341 314.960 240.427 319.732 244.919 320.575 C 252.216 321.977 258.673 311.873 264.286 312.714 C 265.689 312.996 281.688 327.872 285.338 330.116 C 288.987 332.642 292.916 334.889 296.845 336.853 C 297.687 337.134 301.055 338.258 301.336 336.853 C 302.179 335.169 292.074 325.626 290.390 323.661 C 279.443 312.996 266.251 297.276 259.794 283.243 C 247.164 256.857 255.305 235.245 248.848 215.878 M 598.020 168.163 C 603.914 162.548 603.072 147.954 596.615 142.902 C 591.563 139.252 583.705 139.813 578.371 141.217 C 568.267 143.744 557.601 149.076 548.057 153.006 C 510.165 169.005 466.098 190.899 464.976 237.772 C 465.255 246.193 466.098 255.174 464.976 263.034 C 461.045 282.961 450.661 296.997 438.030 311.873 C 432.697 318.328 427.645 324.785 421.750 330.398 C 420.627 331.240 414.732 335.731 415.574 337.133 C 415.855 338.536 419.223 337.133 420.065 337.133 C 423.434 335.731 427.083 333.766 430.170 332.082 C 436.346 328.153 448.134 315.522 453.747 314.117 C 459.642 312.434 476.202 328.153 479.570 315.241 C 481.254 309.347 474.799 305.698 470.589 303.453 C 469.465 302.891 464.976 300.926 464.976 299.802 C 464.976 298.681 468.344 298.681 468.904 298.681 C 472.273 299.242 477.325 300.084 480.693 301.207 C 489.114 303.733 503.429 313.276 510.726 311.591 C 518.585 309.907 520.551 301.768 516.059 295.873 C 512.691 291.382 504.271 288.856 499.218 287.453 C 494.166 286.050 473.957 284.365 473.396 284.084 C 470.870 282.119 476.202 280.435 477.325 280.435 C 480.412 279.593 487.429 280.156 490.798 280.435 C 505.113 282.401 518.867 287.172 532.900 291.382 C 539.356 293.347 546.092 296.716 552.828 292.787 C 560.407 288.576 559.285 277.349 552.828 272.577 C 546.373 267.525 521.393 264.999 512.692 264.999 C 504.832 264.718 496.692 264.437 489.114 264.999 C 486.588 265.560 481.817 266.963 479.851 264.999 C 477.325 262.752 480.412 259.947 482.377 258.823 C 484.343 258.263 498.377 256.579 500.903 256.579 C 521.673 256.579 542.444 262.752 563.215 263.034 C 567.985 263.315 573.879 263.876 578.090 260.789 C 588.194 253.490 585.108 240.017 574.722 234.685 C 571.635 233.001 568.267 233.001 564.898 233.001 C 542.163 232.439 524.480 234.684 502.586 239.737 C 497.534 240.859 492.482 241.983 487.429 242.825 C 486.306 243.106 483.500 243.666 483.219 241.982 C 481.537 235.806 501.744 230.755 505.955 229.633 C 521.393 224.581 538.234 222.334 554.794 221.212 C 562.090 220.650 582.300 220.650 588.194 218.405 C 600.264 213.634 601.387 191.178 580.055 190.899 C 562.933 190.336 535.146 197.073 519.428 203.248 C 512.410 206.055 505.674 208.861 499.218 211.950 C 497.534 212.511 493.605 215.037 491.921 214.476 C 489.675 213.634 495.289 208.300 495.850 207.458 C 500.621 202.687 506.516 199.038 512.692 195.670 C 527.848 186.968 550.865 180.231 568.267 176.302 C 576.406 174.337 592.126 174.058 598.020 168.163 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#F6EA8D6D-4919-4427-801E-F8E5F651729A_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.343 282.747 C 381.282 282.814 392.607 263.556 392.691 247.286 C 392.778 230.302 380.829 213.314 358.454 213.352 C 337.345 213.388 323.465 227.978 322.749 247.067 C 322.133 263.540 334.192 282.671 359.343 282.747 M 355.690 235.164 C 372.935 231.261 379.767 256.966 361.220 260.870 C 343.976 264.774 337.143 239.068 355.690 235.164 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 355.690 235.164 C 372.935 231.261 379.767 256.966 361.220 260.870 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.220 260.870 C 343.976 264.774 337.143 239.068 355.690 235.164 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#F6EA8D6D-4919-4427-801E-F8E5F651729A_6)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 425.539 126.047 C 422.732 123.239 416.838 122.116 412.909 120.994 C 394.665 116.784 353.684 114.538 335.440 117.345 C 325.896 118.748 297.548 119.871 294.461 130.257 C 292.495 135.870 296.987 140.362 301.758 142.607 C 310.740 146.816 323.651 148.501 333.756 148.501 C 360.141 149.062 392.699 151.587 417.961 143.729 C 425.821 141.203 434.241 133.625 425.539 126.047 M 317.476 133.062 C 316.634 131.940 321.125 130.818 321.967 130.818 C 327.862 129.134 334.317 128.010 340.492 127.168 C 355.930 125.204 373.893 125.765 389.331 128.291 C 393.542 129.133 398.312 129.695 402.523 131.099 C 403.365 131.378 406.733 132.220 404.769 133.625 C 401.962 136.151 388.489 138.115 384.279 138.677 C 364.070 140.641 358.736 140.641 338.808 138.677 C 335.440 138.396 318.599 135.870 317.476 133.062 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":679.852,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":109.945,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":17.351,\\\"y\\\":382.947,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873241054131,\\\"y\\\":0.0050350400688925516}},{\\\"point\\\":{\\\"x\\\":702.649,\\\"y\\\":382.947,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873241054131,\\\"y\\\":0.0050350400688925516}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":552.358,\\\"y\\\":505.885,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129057347330262,\\\"y\\\":0.7012598757841232}},{\\\"point\\\":{\\\"x\\\":167.483,\\\"y\\\":505.925,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698680880290712,\\\"y\\\":0.7154334542892132}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":608.344,\\\"y\\\":135.301,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631428728946517,\\\"y\\\":-0.7754339174043046}},{\\\"point\\\":{\\\"x\\\":112.49,\\\"y\\\":135.385,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.68173911421614,\\\"y\\\":-0.7315953664067268}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":603.086,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"F6EA8D6D-4919-4427-801E-F8E5F651729A_1\\\",\\\"x1\\\":\\\"49.53%\\\",\\\"y1\\\":\\\"51.40%\\\",\\\"x2\\\":\\\"49.53%\\\",\\\"y2\\\":\\\"-39.06%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"F6EA8D6D-4919-4427-801E-F8E5F651729A_2\\\",\\\"x1\\\":\\\"49.30%\\\",\\\"y1\\\":\\\"125.68%\\\",\\\"x2\\\":\\\"49.30%\\\",\\\"y2\\\":\\\"-76.18%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"F6EA8D6D-4919-4427-801E-F8E5F651729A_3\\\",\\\"x1\\\":\\\"47.01%\\\",\\\"y1\\\":\\\"253.70%\\\",\\\"x2\\\":\\\"47.01%\\\",\\\"y2\\\":\\\"-322.13%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"F6EA8D6D-4919-4427-801E-F8E5F651729A_6\\\",\\\"x1\\\":\\\"48.59%\\\",\\\"y1\\\":\\\"818.79%\\\",\\\"x2\\\":\\\"48.59%\\\",\\\"y2\\\":\\\"-348.54%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"ankh_emperor\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":275.231,\\\"max\\\":444.769},\\\"y\\\":{\\\"min\\\":40.663,\\\"max\\\":665.8757499999999}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"ankh_emperor\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"ankh_emperor\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 326.235 664.875 C 326.237 664.832 338.307 381.579 344.675 232.146 C 313.313 233.408 284.872 239.675 276.231 251.013 C 276.231 237.546 276.231 206.341 276.231 206.337 C 276.238 206.337 443.762 206.337 443.769 206.337 C 443.769 206.341 443.769 251.008 443.769 251.013 C 434.035 240.373 406.428 234.073 375.327 232.137 C 381.395 381.576 392.896 664.832 392.898 664.875 C 392.892 664.876 326.241 664.876 326.235 664.875 M 311.141 123.602 C 311.140 96.558 332.956 74.741 359.999 74.741 C 387.044 74.740 408.861 96.558 408.861 123.602 C 408.860 150.645 387.043 172.460 359.999 172.460 C 332.957 172.459 311.141 150.645 311.141 123.602 M 278.061 123.602 C 278.061 78.249 314.647 41.663 359.999 41.663 C 405.352 41.663 441.939 78.249 441.939 123.602 C 441.939 168.955 405.352 205.541 359.999 205.541 C 314.647 205.541 278.061 168.955 278.061 123.602 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":260.795,\\\"max\\\":459.205},\\\"y\\\":{\\\"min\\\":254.064,\\\"max\\\":452.474}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":697.491,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":24.544,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":239.593,\\\"y\\\":228.228,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088752084}},{\\\"point\\\":{\\\"x\\\":480.407,\\\"y\\\":228.228,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.005035854088752063}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":478.076,\\\"y\\\":472.654,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128988405388739,\\\"y\\\":0.7012668844016018}},{\\\"point\\\":{\\\"x\\\":241.691,\\\"y\\\":472.712,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987141551520983,\\\"y\\\":0.7154009570793777}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":667.679,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"antler\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":99.548,\\\"max\\\":611.604},\\\"y\\\":{\\\"min\\\":62.852999999999994,\\\"max\\\":661.1165076882879}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"antler\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"antler\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 101.548 613.672 C 101.555 613.662 126.259 554.400 166.826 512.025 C 195.044 482.548 219.865 465.586 238.695 448.219 C 263.166 425.649 298.626 355.713 285.075 300.093 C 267.194 226.705 203.274 206.090 203.266 206.081 C 203.278 206.090 286.407 193.851 321.111 299.116 C 338.351 351.406 315.503 412.346 315.503 412.357 C 315.512 412.353 376.858 382.006 407.121 366.189 C 446.096 345.819 478.175 323.433 511.967 269.697 C 566.517 182.951 473.148 64.862 473.144 64.853 C 473.151 64.860 606.472 158.517 555.534 286.796 C 520.715 374.480 430.610 411.051 430.598 411.063 C 430.605 411.067 462.508 448.721 501.526 448.810 C 564.956 448.955 609.593 402.332 609.604 402.328 C 609.594 402.336 598.065 472.537 506.850 487.464 C 443.041 497.906 383.873 436.466 383.861 436.460 C 383.847 436.469 301.005 450.027 239.473 525.429 C 191.040 584.778 188.303 658.921 188.305 658.930 C 188.300 658.929 154.651 661.149 131.834 650.297 C 115.742 642.644 101.551 613.675 101.548 613.672 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":154.077,\\\"y\\\":611.427,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.34446700518242285,\\\"y\\\":-0.9387984247646843}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":139.923,\\\"y\\\":647.015,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.33755718459447215,\\\"y\\\":0.9413050234268663}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"arm\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":199.18035435697465,\\\"max\\\":521.0621356033824},\\\"y\\\":{\\\"min\\\":15.929735848490623,\\\"max\\\":702.5889356206271}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"arm\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"arm\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.356 370.742 C 391.846 368.547 424.020 355.907 434.978 344.724 C 453.671 325.647 471.638 293.652 474.992 284.913 C 477.875 277.401 490.676 235.342 495.844 221.366 C 501.560 205.909 521.509 180.561 518.813 172.653 C 516.806 166.764 500.856 165.463 494.685 169.324 C 485.448 175.104 476.708 187.831 474.374 190.477 C 465.192 200.884 449.069 247.165 441.212 246.811 C 432.145 246.404 424.977 231.894 420.776 223.974 C 417.325 217.468 411.138 170.966 410.435 163.634 C 409.639 155.347 409.210 100.787 409.060 94.455 C 408.930 88.958 410.749 40.831 407.421 34.417 C 406.333 32.322 401.691 20.825 392.779 21.358 C 385.214 21.810 382.103 29.688 381.216 31.294 C 377.556 37.918 378.985 88.397 378.516 94.136 C 378.042 99.938 377.325 153.131 370.888 157.266 C 369.926 157.884 362.349 157.531 361.392 156.907 C 355.118 152.817 348.349 101.879 347.208 96.296 C 345.897 89.886 340.336 32.582 334.938 25.888 C 333.730 24.390 328.775 16.621 320.959 18.121 C 314.111 19.436 311.216 27.659 310.538 29.375 C 307.450 37.187 317.745 92.393 318.280 98.762 C 318.776 104.668 327.103 157.544 321.966 163.400 C 321.079 164.411 312.543 167.073 311.268 166.646 C 304.464 164.367 291.005 116.398 289.161 111.259 C 287.430 106.436 276.898 62.664 272.093 57.945 C 270.712 56.588 263.918 48.970 257.239 51.765 C 250.978 54.385 249.073 66.714 248.775 69.005 C 247.914 75.614 262.377 117.456 263.607 122.375 C 265.228 128.854 282.552 185.425 279.373 193.606 C 278.925 194.759 273.287 200.761 272.052 200.819 C 265.002 201.150 244.870 154.967 242.407 150.195 C 240.347 146.202 226.636 110.333 222.181 105.480 C 220.967 104.158 213.052 99.233 207.649 102.085 C 202.532 104.785 201.303 115.376 201.187 117.369 C 200.743 124.985 222.688 170.811 224.686 176.261 C 228.392 186.371 255.393 275.232 261.634 287.934 C 266.126 297.077 282.366 342.878 308.401 358.522 C 332.604 373.065 356.408 372.343 371.356 370.742 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#B911D2BC-8E8A-48E2-9815-65D839A0D108_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 300.479 351.455 C 338.734 352.224 376.990 352.993 415.245 353.763 C 415.134 377.296 421.851 616.903 420.822 672.900 C 420.152 709.388 301.056 710.019 299.178 673.573 C 297.642 643.770 301.784 374.241 300.479 351.455 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 300.479 351.455 C 301.784 374.241 297.642 643.770 299.178 673.573 C 301.056 710.019 420.152 709.388 420.822 672.900 C 421.851 616.903 415.134 377.296 415.245 353.763 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":269.371,\\\"max\\\":439.342},\\\"y\\\":{\\\"min\\\":171.09,\\\"max\\\":341.062}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.429,\\\"y\\\":634.122,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":394.056,\\\"y\\\":20.848,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":293.645,\\\"y\\\":413.287,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9646496187554472,\\\"y\\\":-0.26353579080453293}},{\\\"point\\\":{\\\"x\\\":425.865,\\\"y\\\":414.507,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9845151298089959,\\\"y\\\":-0.17529962685977366}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":303.468,\\\"y\\\":679.511,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5860192164472157,\\\"y\\\":0.8102971541074245}},{\\\"point\\\":{\\\"x\\\":416.531,\\\"y\\\":680.013,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5860463845991641,\\\"y\\\":0.8102775049933502}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":697.873,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"B911D2BC-8E8A-48E2-9815-65D839A0D108_1\\\",\\\"x1\\\":\\\"50.67%\\\",\\\"y1\\\":\\\"11.12%\\\",\\\"x2\\\":\\\"50.67%\\\",\\\"y2\\\":\\\"161.41%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"3.92%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":false,\\\"always_be_nested\\\":false,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"arm_claw\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":198.07260349713425,\\\"max\\\":588.416},\\\"y\\\":{\\\"min\\\":112.361,\\\"max\\\":706.2196786512706}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"arm_claw\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"arm_claw\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#3A469B28-8343-41B4-97D4-1167FB6CBCE9_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 307.704 690.871 C 307.706 690.840 328.606 380.508 328.608 380.477 C 328.601 380.473 279.624 355.869 262.187 340.472 C 223.395 306.219 203.275 271.339 199.883 234.657 C 195.975 192.393 230.260 135.596 230.263 135.587 C 230.263 135.594 221.435 177.449 227.299 213.750 C 238.646 283.985 292.756 300.695 343.415 306.786 C 364.949 309.376 431.187 288.628 464.135 222.617 C 487.320 176.166 468.349 132.352 465.064 113.861 C 479.993 123.540 513.639 181.702 491.971 232.157 C 467.329 289.538 445.988 298.039 434.273 307.515 C 451.063 302.816 473.821 295.325 491.100 281.450 C 552.970 231.769 550.442 197.350 557.425 173.225 C 561.235 192.192 578.234 254.178 507.050 305.525 C 474.009 329.358 440.990 342.199 440.983 342.203 C 440.988 342.202 476.981 339.140 491.759 334.834 C 549.853 317.908 569.128 298.560 586.916 267.187 C 581.303 308.606 563.398 345.223 481.928 372.307 C 446.607 384.049 390.109 381.470 390.100 381.471 C 390.102 381.502 412.293 688.247 412.296 688.278 C 412.290 688.280 387.391 704.084 360.000 704.701 C 332.969 705.309 307.710 690.872 307.704 690.871 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":663.748,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":252.711,\\\"y\\\":481.528,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872777856662,\\\"y\\\":0.005044231042771671}},{\\\"point\\\":{\\\"x\\\":456.828,\\\"y\\\":481.528,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872777856662,\\\"y\\\":0.005044231042771667}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":407.946,\\\"y\\\":681.421,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129270126595157,\\\"y\\\":0.7012382438375553}},{\\\"point\\\":{\\\"x\\\":315.602,\\\"y\\\":681.461,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987081433846051,\\\"y\\\":0.7154068285724131}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":700.823,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":229.737,\\\"max\\\":464.923},\\\"y\\\":{\\\"min\\\":6.469,\\\"max\\\":241.655}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"3A469B28-8343-41B4-97D4-1167FB6CBCE9_0\\\",\\\"cx\\\":\\\"41.70%\\\",\\\"cy\\\":\\\"44.91%\\\",\\\"r\\\":\\\"82.87%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"36.08%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"arm_hold_up\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":75.45661142703472,\\\"max\\\":529.6},\\\"y\\\":{\\\"min\\\":319.661,\\\"max\\\":686.6036376719986}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"arm_hold_up\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"arm_hold_up\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#07515F9F-04AB-4D12-9C8E-1A2FAC7A53CB_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.305 323.204 C 369.578 322.409 484.024 321.661 484.036 321.661 C 484.988 321.661 498.947 321.661 498.948 321.661 C 503.612 321.661 512.939 321.661 512.941 321.661 C 517.827 321.728 527.598 321.863 527.600 321.863 C 527.599 321.864 523.210 330.543 520.393 334.397 C 488.379 378.202 382.925 352.722 396.259 384.638 C 471.846 565.566 449.084 585.612 463.763 620.377 C 477.330 652.509 454.010 667.685 440.934 668.121 C 402.057 669.418 350.818 685.111 280.332 684.591 C 210.202 684.074 187.016 673.295 157.440 681.855 C 118.509 693.123 75.672 654.516 77.514 607.449 C 79.329 561.041 108.291 532.237 150.437 531.803 C 202.416 531.266 211.968 562.067 221.926 561.066 C 227.570 560.498 258.245 552.200 296.164 552.648 C 338.587 553.148 379.094 576.196 375.428 566.172 C 343.278 478.254 346.580 383.766 341.781 342.528 C 340.570 332.121 350.810 324.018 360.305 323.204 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 498.948 321.661 C 498.947 321.663 495.800 329.203 484.897 334.252 C 461.111 345.268 431.234 344.190 431.228 344.191 M 469.528 330.204 C 453.036 333.653 439.595 334.074 415.838 333.333 M 484.036 321.661 C 484.035 321.662 479.421 328.136 469.528 330.204 M 505.548 333.287 C 491.560 347.493 449.102 351.673 449.097 351.675 M 512.941 321.661 C 512.940 321.662 509.328 329.448 505.548 333.287 M 360.305 323.204 C 369.578 322.409 484.024 321.661 484.036 321.661 C 484.988 321.661 498.947 321.661 498.948 321.661 C 503.612 321.661 512.939 321.661 512.941 321.661 C 517.827 321.728 527.598 321.863 527.600 321.863 C 527.599 321.864 523.210 330.543 520.393 334.397 C 488.379 378.202 382.925 352.722 396.259 384.638 C 471.846 565.566 449.084 585.612 463.763 620.377 C 477.330 652.509 454.010 667.685 440.934 668.121 C 402.057 669.418 350.818 685.111 280.332 684.591 C 210.202 684.074 187.016 673.295 157.440 681.855 C 118.509 693.123 75.672 654.516 77.514 607.449 C 79.329 561.041 108.291 532.237 150.437 531.803 C 202.416 531.266 211.968 562.067 221.926 561.066 C 227.570 560.498 258.245 552.200 296.164 552.648 C 338.587 553.148 379.094 576.196 375.428 566.172 C 343.278 478.254 346.580 383.766 341.781 342.528 C 340.570 332.121 350.810 324.018 360.305 323.204 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":285.507,\\\"max\\\":606.079},\\\"y\\\":{\\\"min\\\":3.492,\\\"max\\\":321.822}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":151.756,\\\"y\\\":608.303,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":151.812,\\\"y\\\":531.934,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":384.942,\\\"y\\\":673.536,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129226801161813,\\\"y\\\":0.7012426485717772}},{\\\"point\\\":{\\\"x\\\":178.799,\\\"y\\\":673.616,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986828690273882,\\\"y\\\":0.7154315121153509}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":79.095,\\\"y\\\":610.26,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"07515F9F-04AB-4D12-9C8E-1A2FAC7A53CB_0\\\",\\\"cx\\\":\\\"49.80%\\\",\\\"cy\\\":\\\"51.17%\\\",\\\"r\\\":\\\"90.04%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"45.10%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\"]}},{\\\"name\\\":\\\"arm_power_fist\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":223.09392258170985,\\\"max\\\":492.0193668905441},\\\"y\\\":{\\\"min\\\":17.046747734353858,\\\"max\\\":695.8250079458504}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"arm_power_fist\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"arm_power_fist\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 428.365 208.755 C 419.497 208.307 396.719 199.044 395.150 181.316 C 408.425 174.065 460.651 120.005 460.618 115.847 C 486.613 126.919 491.895 145.664 489.501 151.951 C 487.710 156.655 468.175 181.079 468.173 181.082 C 468.169 181.084 438.344 209.258 428.365 208.755 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 460.618 115.847 C 460.651 120.005 408.425 174.065 395.150 181.316 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 355.314 157.963 C 392.390 155.707 404.290 125.228 386.777 120.234 C 392.437 113.950 409.790 100.733 418.737 77.336 C 436.073 76.131 460.416 90.122 460.618 115.847 C 460.651 120.005 408.425 174.065 395.150 181.316 C 379.946 183.838 356.485 180.834 351.343 159.653 C 351.362 159.607 352.868 159.243 355.314 157.963 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 418.737 77.336 C 409.790 100.733 392.437 113.950 386.777 120.234 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 386.777 120.234 C 361.656 113.073 346.641 101.237 340.389 96.107 C 355.718 79.446 370.474 48.556 373.132 43.868 C 393.097 41.289 416.196 52.605 418.737 77.336 C 409.790 100.733 392.437 113.950 386.777 120.234 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.132 43.868 C 370.474 48.556 355.718 79.446 340.389 96.107 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 340.389 96.107 C 336.076 92.569 317.431 77.455 297.306 71.857 C 297.817 64.239 315.959 25.375 330.312 20.027 C 342.680 15.419 372.858 27.674 373.132 43.868 C 370.474 48.556 355.718 79.446 340.389 96.107 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 468.173 181.082 C 468.169 181.084 438.344 209.258 428.365 208.755 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 428.365 208.755 C 419.497 208.307 396.719 199.044 395.150 181.316 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 395.150 181.316 C 379.946 183.838 356.485 180.834 351.343 159.653 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 351.343 159.653 C 351.362 159.607 352.868 159.243 355.314 157.963 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 355.314 157.963 C 392.390 155.707 404.290 125.228 386.777 120.234 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 386.777 120.234 C 361.656 113.073 346.641 101.237 340.389 96.107 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 340.389 96.107 C 336.076 92.569 317.431 77.455 297.306 71.857 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#0BFB2201-BCBF-421F-9DD7-230CEAE4F346_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 424.191 291.550 C 451.736 270.565 473.422 228.776 468.173 181.082 C 468.169 181.084 438.344 209.258 428.365 208.755 C 419.497 208.307 396.719 199.044 395.150 181.316 C 379.946 183.838 356.485 180.834 351.343 159.653 C 351.362 159.607 352.868 159.243 355.314 157.963 C 392.390 155.707 404.290 125.228 386.777 120.234 C 361.656 113.073 346.641 101.237 340.389 96.107 C 336.076 92.569 317.431 77.455 297.306 71.857 C 276.685 66.120 264.938 114.974 230.499 149.400 C 202.017 177.871 295.352 260.545 295.809 276.337 C 296.329 294.285 281.867 663.231 281.865 663.269 C 281.873 663.273 295.816 693.843 360.000 693.825 C 424.199 693.807 438.127 663.220 438.135 663.217 C 438.133 663.180 424.041 300.794 424.191 291.550 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 424.191 291.550 C 451.736 270.565 473.422 228.776 468.173 181.082 C 468.169 181.084 438.344 209.258 428.365 208.755 C 419.497 208.307 396.719 199.044 395.150 181.316 C 379.946 183.838 356.485 180.834 351.343 159.653 C 351.362 159.607 352.868 159.243 355.314 157.963 C 392.390 155.707 404.290 125.228 386.777 120.234 C 361.656 113.073 346.641 101.237 340.389 96.107 C 336.076 92.569 317.431 77.455 297.306 71.857 C 276.685 66.120 264.938 114.974 230.499 149.400 C 202.017 177.871 295.352 260.545 295.809 276.337 C 296.329 294.285 281.867 663.231 281.865 663.269 C 281.873 663.273 295.816 693.843 360.000 693.825 C 424.199 693.807 438.127 663.220 438.135 663.217 C 438.133 663.180 424.041 300.794 424.191 291.550 M 309.967 136.007 C 331.943 164.471 345.973 158.532 355.314 157.963 M 300.000 151.419 C 298.105 151.040 305.888 150.877 309.967 136.007 M 378.061 241.236 C 374.435 202.472 333.923 158.209 300.000 151.419 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":299.929,\\\"max\\\":420.071},\\\"y\\\":{\\\"min\\\":334.576,\\\"max\\\":454.718}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":644.966,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":336.554,\\\"y\\\":20.061,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":286.309,\\\"y\\\":397.626,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987087525138,\\\"y\\\":0.005081809027516257}},{\\\"point\\\":{\\\"x\\\":433.691,\\\"y\\\":397.626,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999987087525138,\\\"y\\\":0.005081809027516257}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":693.214,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"0BFB2201-BCBF-421F-9DD7-230CEAE4F346_4\\\",\\\"x1\\\":\\\"55.52%\\\",\\\"y1\\\":\\\"49.73%\\\",\\\"x2\\\":\\\"55.52%\\\",\\\"y2\\\":\\\"150.96%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"20.39%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":false,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"arms_strong\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":12.970921300814208,\\\"max\\\":707.029013464231},\\\"y\\\":{\\\"min\\\":205.53500000000003,\\\"max\\\":681.9018141019094}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"arms_strong\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"arms_baby\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#135527EE-8F56-4229-8D56-A03B965BC0E5_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 240.298 409.357 C 223.226 412.982 184.156 442.206 133.119 448.437 C 130.772 448.724 162.772 518.800 173.709 606.162 C 174.134 609.557 191.861 611.823 199.839 614.453 C 224.060 622.437 244.251 646.921 222.048 648.776 C 204.296 650.260 204.442 638.774 196.298 637.072 C 186.895 635.108 181.020 632.857 170.548 637.072 C 162.951 640.130 177.826 679.068 154.162 680.379 C 132.891 681.557 147.160 636.707 145.383 640.583 C 134.432 664.471 140.231 681.199 108.893 679.649 C 93.024 678.863 123.203 641.317 124.900 638.242 C 126.467 635.402 95.902 675.671 71.524 670.900 C 52.162 667.111 83.779 644.473 104.417 635.901 C 109.810 633.661 67.875 655.058 51.421 643.569 C 42.616 637.422 73.280 627.223 84.758 623.039 C 97.345 618.451 122.786 613.798 121.954 612.449 C 94.966 568.661 10.559 458.699 14.612 371.439 C 16.932 321.492 147.172 243.227 212.395 227.240 C 237.249 200.300 482.752 200.300 507.606 227.240 C 572.828 243.226 703.068 321.492 705.388 371.438 C 709.440 458.699 625.035 568.661 598.046 612.449 C 597.214 613.798 622.655 618.451 635.242 623.039 C 646.720 627.223 677.384 637.421 668.579 643.569 C 652.125 655.058 610.190 633.661 615.583 635.901 C 636.222 644.473 667.839 667.112 648.476 670.900 C 624.098 675.671 593.533 635.402 595.101 638.242 C 596.797 641.317 626.976 678.863 611.107 679.649 C 579.769 681.199 585.568 664.471 574.618 640.583 C 572.841 636.707 587.109 681.557 565.839 680.378 C 542.174 679.068 557.049 640.130 549.452 637.072 C 538.980 632.857 533.105 635.107 523.702 637.072 C 515.558 638.773 515.704 650.259 497.952 648.776 C 475.749 646.921 495.940 622.437 520.161 614.453 C 528.139 611.823 545.866 609.556 546.291 606.162 C 557.227 518.800 589.228 448.724 586.882 448.437 C 535.844 442.206 496.986 411.777 479.702 409.357 C 424.191 423.542 295.807 423.544 240.298 409.357 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":130.546,\\\"max\\\":589.454},\\\"y\\\":{\\\"min\\\":66.4,\\\"max\\\":525.307}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":696.448,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":67.599,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":18.715,\\\"y\\\":372.262,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872228235881,\\\"y\\\":0.005055115188358927}},{\\\"point\\\":{\\\"x\\\":701.285,\\\"y\\\":372.262,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872228235881,\\\"y\\\":0.0050551151883589}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":139.965,\\\"y\\\":659.751,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}},{\\\"point\\\":{\\\"x\\\":580.035,\\\"y\\\":659.751,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"135527EE-8F56-4229-8D56-A03B965BC0E5_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"49.41%\\\",\\\"r\\\":\\\"112.40%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"34.90%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"atlas\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":65.422,\\\"max\\\":665.0480641240902},\\\"y\\\":{\\\"min\\\":36.254,\\\"max\\\":707.0986927702287}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"atlas\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"atlas\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#047E7A57-68CF-4124-AE23-0BA138A4E1BC_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 193.023 151.219 C 192.579 155.728 192.407 163.307 194.434 169.120 C 177.216 170.739 162.317 180.697 163.627 176.844 C 182.244 122.120 170.491 72.637 172.447 49.238 C 172.945 43.280 167.293 38.677 161.875 38.213 C 156.584 37.761 91.285 37.345 91.278 37.345 C 90.735 37.345 82.771 37.346 82.770 37.346 C 80.109 37.347 74.787 37.347 74.786 37.347 C 71.998 37.387 66.423 37.465 66.422 37.465 C 66.423 37.465 68.927 42.416 70.534 44.615 C 88.804 69.607 151.017 56.054 141.367 73.270 C 87.238 169.837 92.882 187.639 82.671 207.785 C 73.214 226.444 87.890 235.983 95.701 236.727 C 117.214 238.774 144.100 254.633 183.223 256.341 C 226.437 258.229 255.164 244.758 257.286 248.642 C 268.601 269.351 277.147 287.467 303.159 299.799 C 340.204 317.363 371.227 359.573 362.657 399.853 C 346.875 400.564 335.382 399.621 323.112 403.064 C 219.823 432.046 215.925 467.413 173.839 489.797 C 157.553 498.459 162.515 532.406 174.098 538.502 C 193.307 548.612 209.507 572.666 237.755 594.160 C 263.781 613.965 298.342 631.253 302.771 637.089 C 308.997 645.292 282.230 648.388 271.853 651.265 C 268.732 652.130 258.347 654.050 256.050 654.491 C 247.248 656.182 248.241 659.084 245.094 658.444 C 238.945 657.194 227.937 665.960 230.121 665.061 C 225.721 667.430 233.375 668.696 234.582 668.193 C 238.041 666.754 243.273 668.019 243.274 668.019 C 243.272 668.019 223.991 667.299 225.172 671.415 C 225.738 673.389 229.035 672.924 229.982 672.871 C 235.643 672.555 244.015 672.741 244.017 672.741 C 244.015 672.741 225.939 672.148 222.077 675.097 C 211.155 683.437 235.807 676.451 242.054 679.294 C 242.677 679.388 205.271 678.380 212.256 687.935 C 217.602 695.247 234.097 692.926 237.889 690.602 C 245.432 685.979 253.550 693.493 277.128 686.605 C 293.328 681.872 306.545 686.414 313.171 687.020 C 324.849 688.088 339.361 687.871 354.331 684.909 C 368.713 682.064 364.963 670.386 361.671 659.676 C 360.308 655.242 351.825 645.671 347.975 637.632 C 333.443 607.290 329.422 587.301 298.925 550.173 C 286.770 535.376 250.970 528.336 250.965 528.334 C 250.975 528.331 300.035 520.730 343.919 496.692 C 369.903 502.864 383.605 506.363 397.659 500.222 C 381.665 556.484 391.272 578.180 379.234 615.733 C 374.103 631.741 398.946 651.224 410.268 647.469 C 431.309 640.490 459.076 639.552 495.796 635.558 C 540.671 630.678 591.510 624.886 601.479 624.146 C 611.684 623.389 605.749 652.290 604.468 657.811 C 603.825 660.584 602.389 679.366 600.147 682.167 C 587.991 697.349 581.617 689.355 578.830 695.742 C 575.854 702.562 594.644 706.864 597.150 702.157 C 599.466 705.739 606.139 702.361 607.426 700.207 C 610.431 695.182 612.206 693.449 612.206 693.448 C 612.206 693.449 604.338 704.453 606.721 705.568 C 611.548 707.827 616.602 702.276 617.103 700.123 C 618.086 695.899 621.224 692.441 621.224 692.440 C 621.224 692.441 615.614 703.371 618.477 703.895 C 623.228 704.765 625.394 702.003 626.076 699.347 C 627.620 693.330 629.848 691.784 629.848 691.783 C 629.848 691.784 623.907 703.050 628.045 702.893 C 630.240 702.810 633.034 700.670 633.388 699.651 C 634.503 696.439 639.322 692.903 643.481 688.340 C 661.043 669.068 653.968 656.690 655.110 634.786 C 655.775 622.050 665.330 608.323 663.903 592.334 C 662.529 576.935 652.260 574.792 645.615 574.333 C 632.814 573.448 623.042 581.188 613.539 579.216 C 583.842 573.056 573.048 562.026 531.205 554.901 C 512.262 551.675 480.572 570.139 480.567 570.141 C 480.571 570.133 514.385 540.181 522.616 498.788 C 579.947 469.577 543.996 395.868 531.966 382.866 C 531.035 352.611 533.273 318.431 510.950 280.572 C 507.349 274.465 503.687 259.491 495.514 245.147 C 505.843 242.589 518.817 250.251 535.155 251.026 C 575.180 252.926 604.052 239.777 626.155 239.113 C 634.670 238.856 651.818 228.553 641.562 208.289 C 631.074 187.569 631.663 152.490 574.314 73.198 C 562.748 57.207 626.874 69.517 645.137 44.520 C 646.744 42.321 649.248 37.369 649.248 37.368 C 649.247 37.368 643.672 37.292 640.885 37.254 C 640.884 37.254 635.562 37.254 632.900 37.255 C 632.900 37.255 624.935 37.256 624.392 37.256 C 624.385 37.256 559.085 37.694 553.794 38.148 C 548.376 38.614 543.276 43.198 543.227 49.176 C 543.065 68.966 538.869 97.765 556.150 161.226 C 557.049 164.529 545.432 154.557 532.067 152.010 C 512.035 148.192 495.627 150.007 491.903 150.940 C 485.674 152.500 486.136 146.883 456.103 138.575 C 412.279 126.451 375.142 143.702 365.585 142.102 C 355.972 140.493 352.910 138.430 346.844 133.929 C 327.011 119.213 307.071 96.979 289.363 90.496 C 268.738 82.945 233.669 84.782 215.261 100.462 C 199.615 113.788 193.993 141.387 193.023 151.219 M 607.071 689.070 C 607.070 689.071 594.715 698.391 597.150 702.157 C 601.426 694.124 607.070 689.071 607.071 689.070 M 242.054 679.294 C 242.845 679.654 242.680 679.387 242.680 679.387 M 242.837 663.022 C 242.836 663.022 234.225 662.852 230.121 665.061 C 236.908 662.270 242.836 663.022 242.837 663.022 M 194.434 169.120 C 194.434 169.120 194.434 169.120 194.434 169.120 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 354.360 215.918 C 354.362 215.914 351.951 194.271 373.632 173.741 C 391.197 157.108 404.375 158.435 419.747 150.782 M 357.966 301.173 C 336.902 306.552 323.124 307.216 305.153 301.023 M 385.703 300.259 C 385.707 300.259 411.061 303.306 426.592 300.708 C 447.349 297.235 463.324 276.763 463.328 276.761 M 585.480 43.923 C 599.035 44.343 606.704 44.101 616.114 42.132 C 621.759 40.951 624.391 37.257 624.392 37.256 C 624.385 37.256 559.085 37.694 553.794 38.148 C 548.376 38.614 543.276 43.198 543.227 49.176 C 543.065 68.966 538.869 97.765 556.150 161.226 C 557.049 164.529 545.432 154.557 532.067 152.010 C 512.035 148.192 495.627 150.007 491.903 150.940 C 485.674 152.500 486.136 146.883 456.103 138.575 C 412.279 126.451 375.142 143.702 365.585 142.102 C 355.972 140.493 352.910 138.430 346.844 133.929 C 327.011 119.213 307.071 96.979 289.363 90.496 C 268.738 82.945 233.669 84.782 215.261 100.462 C 199.615 113.788 193.993 141.387 193.023 151.219 C 192.579 155.728 192.407 163.307 194.434 169.120 C 200.359 186.114 228.868 221.231 228.871 221.236 C 228.872 221.235 237.574 208.820 237.575 208.819 C 237.579 208.821 265.814 229.629 276.786 226.988 C 289.943 223.820 295.080 209.446 299.336 201.097 C 303.463 204.851 315.133 215.801 323.032 223.153 M 362.657 399.853 C 371.227 359.573 340.204 317.363 303.159 299.799 C 277.147 287.467 268.601 269.351 257.286 248.642 C 255.164 244.758 226.437 258.229 183.223 256.341 C 144.100 254.633 117.214 238.774 95.701 236.727 C 87.890 235.983 73.214 226.444 82.671 207.785 C 92.882 187.639 87.238 169.837 141.367 73.270 C 151.017 56.054 88.804 69.607 70.534 44.615 C 68.927 42.416 66.423 37.465 66.422 37.465 C 66.423 37.465 71.998 37.387 74.786 37.347 C 74.787 37.347 80.109 37.347 82.770 37.346 C 82.771 37.346 90.735 37.345 91.278 37.345 C 91.285 37.345 156.584 37.761 161.875 38.213 C 167.293 38.677 172.945 43.280 172.447 49.238 C 170.491 72.637 182.244 122.120 163.627 176.844 C 162.317 180.697 177.216 170.739 194.434 169.120 C 194.434 169.120 194.434 169.120 194.434 169.120 M 431.935 422.067 C 427.619 429.303 423.649 436.104 420.295 442.687 C 411.645 460.066 406.977 476.176 401.629 490.020 C 400.218 493.717 398.571 497.015 397.659 500.222 C 381.665 556.484 391.272 578.180 379.234 615.733 C 374.103 631.741 398.946 651.224 410.268 647.469 C 431.309 640.490 459.076 639.552 495.796 635.558 C 540.671 630.678 591.510 624.886 601.479 624.146 C 611.684 623.389 605.749 652.290 604.468 657.811 C 603.825 660.584 602.389 679.366 600.147 682.167 C 587.991 697.349 581.617 689.355 578.830 695.742 C 575.854 702.562 594.644 706.864 597.150 702.157 C 601.426 694.124 607.070 689.071 607.071 689.070 C 607.070 689.071 594.715 698.391 597.150 702.157 C 599.466 705.739 606.139 702.361 607.426 700.207 C 610.431 695.182 612.206 693.449 612.206 693.448 C 612.206 693.449 604.338 704.453 606.721 705.568 C 611.548 707.827 616.602 702.276 617.103 700.123 C 618.086 695.899 621.224 692.441 621.224 692.440 C 621.224 692.441 615.614 703.371 618.477 703.895 C 623.228 704.765 625.394 702.003 626.076 699.347 C 627.620 693.330 629.848 691.784 629.848 691.783 C 629.848 691.784 623.907 703.050 628.045 702.893 C 630.240 702.810 633.034 700.670 633.388 699.651 C 634.503 696.439 639.322 692.903 643.481 688.340 C 661.043 669.068 653.968 656.690 655.110 634.786 C 655.775 622.050 665.330 608.323 663.903 592.334 C 662.529 576.935 652.260 574.792 645.615 574.333 C 632.814 573.448 623.042 581.188 613.539 579.216 C 583.842 573.056 573.048 562.026 531.205 554.901 C 512.262 551.675 480.572 570.139 480.567 570.141 C 480.571 570.133 514.385 540.181 522.616 498.788 C 579.947 469.577 543.996 395.868 531.966 382.866 C 531.035 352.611 533.273 318.431 510.950 280.572 C 507.349 274.465 503.687 259.491 495.514 245.147 C 505.843 242.589 518.817 250.251 535.155 251.026 C 575.180 252.926 604.052 239.777 626.155 239.113 C 634.670 238.856 651.818 228.553 641.562 208.289 C 631.074 187.569 631.663 152.490 574.314 73.198 C 562.748 57.207 626.874 69.517 645.137 44.520 C 646.744 42.321 649.248 37.369 649.248 37.368 C 649.247 37.368 643.672 37.292 640.885 37.254 C 640.884 37.254 635.562 37.254 632.900 37.255 C 632.900 37.255 624.935 37.256 624.392 37.256 M 362.657 399.853 C 346.875 400.564 335.382 399.621 323.112 403.064 C 219.823 432.046 215.925 467.413 173.839 489.797 C 157.553 498.459 162.515 532.406 174.098 538.502 C 193.307 548.612 209.507 572.666 237.755 594.160 C 263.781 613.965 298.342 631.253 302.771 637.089 C 308.997 645.292 282.230 648.388 271.853 651.265 C 268.732 652.130 258.347 654.050 256.050 654.491 C 247.248 656.182 248.241 659.084 245.094 658.444 C 238.945 657.194 227.937 665.960 230.121 665.061 C 236.908 662.270 242.836 663.022 242.837 663.022 C 242.836 663.022 234.225 662.852 230.121 665.061 C 225.721 667.430 233.375 668.696 234.582 668.193 C 238.041 666.754 243.273 668.019 243.274 668.019 C 243.272 668.019 223.991 667.299 225.172 671.415 C 225.738 673.389 229.035 672.924 229.982 672.871 C 235.643 672.555 244.015 672.741 244.017 672.741 C 244.015 672.741 225.939 672.148 222.077 675.097 C 211.155 683.437 235.807 676.451 242.054 679.294 C 242.845 679.654 242.680 679.387 242.680 679.387 C 242.677 679.388 205.271 678.380 212.256 687.935 C 217.602 695.247 234.097 692.926 237.889 690.602 C 245.432 685.979 253.550 693.493 277.128 686.605 C 293.328 681.872 306.545 686.414 313.171 687.020 C 324.849 688.088 339.361 687.871 354.331 684.909 C 368.713 682.064 364.963 670.386 361.671 659.676 C 360.308 655.242 351.825 645.671 347.975 637.632 C 333.443 607.290 329.422 587.301 298.925 550.173 C 286.770 535.376 250.970 528.336 250.965 528.334 C 250.975 528.331 300.035 520.730 343.919 496.692 C 369.903 502.864 383.605 506.363 397.659 500.222 M 401.629 490.020 C 365.987 468.845 360.022 435.873 364.342 410.069 M 91.278 37.345 C 91.279 37.345 93.912 41.039 99.556 42.218 C 108.967 44.184 116.636 44.423 130.191 43.998 M 74.786 37.347 C 74.787 37.348 76.914 41.728 79.006 43.980 C 84.338 49.722 100.487 53.092 100.489 53.093 M 82.770 37.346 C 82.770 37.347 84.592 41.595 90.788 44.529 C 100.489 49.123 112.606 49.371 112.608 49.371 M 495.514 245.147 C 491.699 246.092 474.721 256.266 456.331 252.226 M 640.885 37.254 C 640.884 37.254 638.746 41.624 636.667 43.888 C 631.874 49.105 617.389 52.457 617.387 52.458 M 632.900 37.255 C 632.900 37.256 631.046 41.435 624.884 44.440 C 615.182 49.172 603.067 49.840 603.065 49.841 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":44.897,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":125.477,\\\"y\\\":38.324,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}},{\\\"point\\\":{\\\"x\\\":594.523,\\\"y\\\":38.325,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":270.135,\\\"y\\\":346.405,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873898637868,\\\"y\\\":0.005021963103282136}},{\\\"point\\\":{\\\"x\\\":586.195,\\\"y\\\":346.405,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873909747177,\\\"y\\\":0.00502174188675173}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":645.664,\\\"y\\\":675.867,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.712907644402357,\\\"y\\\":0.701257934395528}},{\\\"point\\\":{\\\"x\\\":263.578,\\\"y\\\":676.023,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986953819094688,\\\"y\\\":0.715419291952895}}],\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":213.117,\\\"max\\\":309.928},\\\"y\\\":{\\\"min\\\":103.247,\\\"max\\\":196.96}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"047E7A57-68CF-4124-AE23-0BA138A4E1BC_0\\\",\\\"cx\\\":\\\"33.87%\\\",\\\"cy\\\":\\\"49.25%\\\",\\\"r\\\":\\\"111.17%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"22.35%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\"]}},{\\\"name\\\":\\\"atom\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":142.52980793121316,\\\"max\\\":577.1379043744664},\\\"y\\\":{\\\"min\\\":76.604,\\\"max\\\":575.1}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"atom_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"atom\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 463.630 325.914 C 460.287 328.229 456.901 330.543 453.605 332.762 C 536.066 388.184 567.714 427.131 559.599 441.186 C 551.433 455.331 501.303 447.207 412.526 403.496 C 408.908 401.714 405.236 399.880 401.579 398.026 C 392.153 393.249 382.395 388.134 372.144 382.561 C 368.064 384.841 363.959 387.104 359.866 389.330 C 374.456 397.302 388.192 404.370 400.811 410.506 C 404.573 412.336 408.105 414.021 411.545 415.633 C 510.610 462.040 566.806 465.861 575.689 450.476 C 584.606 435.030 552.917 387.966 463.630 325.914 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.545 415.633 C 408.105 414.021 404.573 412.336 400.811 410.506 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 411.545 415.633 C 408.105 414.021 404.573 412.336 400.811 410.506 C 394.422 508.447 376.269 556.521 359.834 556.521 C 343.502 556.521 325.473 509.045 318.854 410.504 C 318.601 406.448 318.365 402.324 318.104 398.016 C 317.575 387.500 317.150 376.511 316.859 364.851 C 312.999 362.548 309.114 360.203 305.002 357.694 C 305.238 374.240 305.938 389.667 306.810 403.659 C 307.177 408.041 307.460 411.977 307.757 415.804 C 317.279 524.522 342.068 575.100 359.834 575.100 C 377.502 575.100 402.117 525.074 411.545 415.633 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 306.810 403.659 C 307.177 408.041 307.460 411.977 307.757 415.804 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 307.757 415.804 C 209.058 462.040 152.861 465.861 143.979 450.476 C 135.003 434.929 167.167 387.348 256.037 325.790 C 259.380 323.475 262.766 321.161 266.062 318.942 C 278.388 310.641 291.210 302.419 304.998 294.011 C 304.761 298.681 304.660 303.365 304.585 308.125 C 294.485 314.338 284.949 320.388 276.594 325.847 C 272.804 328.323 269.351 330.612 266.125 332.785 C 183.341 388.504 151.987 427.189 160.069 441.186 C 168.235 455.331 218.365 447.207 306.810 403.659 C 307.177 408.041 307.460 411.977 307.757 415.804 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 266.062 318.942 C 262.766 321.161 259.380 323.475 256.037 325.790 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 256.037 325.790 C 166.750 263.738 135.061 216.674 143.979 201.228 C 152.861 185.843 209.058 189.663 308.122 236.071 C 311.562 237.682 315.094 239.368 318.856 241.198 C 331.475 247.334 345.211 254.402 359.801 262.374 C 355.709 264.600 351.604 266.863 347.524 269.143 C 337.273 263.570 327.514 258.455 318.089 253.677 C 314.432 251.824 310.760 249.989 307.141 248.208 C 218.365 204.496 168.235 196.373 160.069 210.518 C 151.954 224.573 183.601 263.520 266.062 318.942 C 262.766 321.161 259.380 323.475 256.037 325.790 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 318.856 241.198 C 315.094 239.368 311.562 237.682 308.122 236.071 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 308.122 236.071 C 317.550 126.629 342.166 76.604 359.834 76.604 C 377.599 76.604 402.388 127.182 411.910 235.899 C 412.208 239.726 412.491 243.663 412.858 248.045 C 413.729 262.037 414.429 277.464 414.666 294.009 C 410.553 291.501 406.668 289.156 402.809 286.852 C 402.517 275.193 402.092 264.203 401.563 253.688 C 401.302 249.380 401.066 245.256 400.814 241.200 C 394.196 142.658 376.166 95.183 359.834 95.183 C 343.399 95.183 325.246 143.256 318.856 241.198 C 315.094 239.368 311.562 237.682 308.122 236.071 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.910 235.899 C 412.208 239.726 412.491 243.663 412.858 248.045 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 453.605 332.762 C 456.901 330.543 460.287 328.229 463.630 325.914 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 411.910 235.899 C 412.208 239.726 412.491 243.663 412.858 248.045 C 501.303 204.497 551.433 196.373 559.599 210.518 C 567.680 224.515 536.326 263.199 453.542 318.919 C 450.316 321.091 446.863 323.381 443.074 325.856 C 434.718 331.316 425.183 337.366 415.082 343.578 C 415.007 348.339 414.906 353.022 414.669 357.692 C 428.458 349.284 441.280 341.062 453.605 332.762 C 456.901 330.543 460.287 328.229 463.630 325.914 C 552.500 264.356 584.664 216.775 575.689 201.228 C 566.806 185.843 510.609 189.663 411.910 235.899 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 304.585 308.125 C 304.660 303.365 304.761 298.681 304.998 294.011 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 307.141 248.208 C 310.760 249.989 314.432 251.824 318.089 253.677 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 316.534 350.831 C 312.274 348.276 308.305 345.866 304.588 343.580 C 304.487 337.833 304.445 331.900 304.445 325.852 C 304.445 319.043 304.498 312.380 304.585 308.125 C 304.660 303.365 304.761 298.681 304.998 294.011 C 305.434 277.635 306.187 262.230 307.141 248.208 C 310.760 249.989 314.432 251.824 318.089 253.677 C 317.538 264.236 317.112 275.287 316.831 286.869 C 316.740 292.577 316.661 296.673 316.599 300.834 C 316.409 310.409 316.351 318.027 316.351 325.852 C 316.351 334.464 316.421 342.828 316.534 350.831 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 316.859 364.851 C 312.999 362.548 309.114 360.203 305.002 357.694 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 266.125 332.785 C 269.351 330.612 272.804 328.323 276.594 325.847 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 304.588 343.580 C 308.305 345.866 312.274 348.276 316.534 350.831 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.849 375.818 C 355.636 378.157 351.568 380.389 347.583 382.548 C 342.536 379.774 337.377 376.844 332.139 373.820 C 327.009 370.858 321.995 367.917 316.859 364.851 C 312.999 362.548 309.114 360.203 305.002 357.694 C 291.112 349.225 278.203 340.944 266.125 332.785 C 269.351 330.612 272.804 328.323 276.594 325.847 C 285.161 331.450 294.598 337.436 304.588 343.580 C 308.305 345.866 312.274 348.276 316.534 350.831 C 323.226 354.843 330.530 359.143 338.092 363.509 C 345.551 367.815 352.829 371.936 359.849 375.818 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 372.144 382.561 C 368.064 384.841 363.959 387.104 359.866 389.330 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 318.854 410.504 C 318.601 406.448 318.365 402.324 318.104 398.016 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 347.583 382.548 C 351.568 380.389 355.636 378.157 359.849 375.818 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 403.068 350.869 C 403.007 355.030 402.927 359.127 402.837 364.835 C 397.672 367.917 392.658 370.858 387.528 373.820 C 382.352 376.808 377.253 379.705 372.144 382.561 C 368.064 384.841 363.959 387.104 359.866 389.330 C 345.582 397.100 331.814 404.189 318.854 410.504 C 318.601 406.448 318.365 402.324 318.104 398.016 C 327.522 393.243 337.277 388.131 347.583 382.548 C 351.568 380.389 355.636 378.157 359.849 375.818 C 366.839 371.936 374.116 367.815 381.575 363.509 C 389.137 359.143 396.442 354.843 403.068 350.869 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 415.082 343.578 C 415.007 348.339 414.906 353.022 414.669 357.692 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 412.526 403.496 C 408.908 401.714 405.236 399.880 401.579 398.026 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 402.837 364.835 C 402.927 359.127 403.007 355.030 403.068 350.869 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 403.133 300.873 C 407.394 303.428 411.362 305.838 415.079 308.124 C 415.180 313.871 415.222 319.804 415.222 325.852 C 415.222 332.661 415.169 339.324 415.082 343.578 C 415.007 348.339 414.906 353.022 414.669 357.692 C 414.234 374.069 413.481 389.473 412.526 403.496 C 408.908 401.714 405.236 399.880 401.579 398.026 C 402.129 387.467 402.555 376.417 402.837 364.835 C 402.927 359.127 403.007 355.030 403.068 350.869 C 403.259 341.295 403.316 333.676 403.316 325.852 C 403.316 317.239 403.246 308.876 403.133 300.873 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 443.074 325.856 C 446.863 323.381 450.316 321.091 453.542 318.919 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 414.666 294.009 C 410.553 291.501 406.668 289.156 402.809 286.852 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 403.133 300.873 C 407.394 303.428 411.362 305.838 415.079 308.124 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 415.079 308.124 C 425.069 314.268 434.506 320.254 443.074 325.856 C 446.863 323.381 450.316 321.091 453.542 318.919 C 441.465 310.760 428.556 302.479 414.666 294.009 C 410.553 291.501 406.668 289.156 402.809 286.852 C 397.672 283.787 392.658 280.846 387.528 277.884 C 382.290 274.860 377.131 271.930 372.084 269.156 C 368.100 271.315 364.031 273.547 359.819 275.886 C 366.839 279.767 374.116 283.889 381.575 288.195 C 389.137 292.561 396.442 296.861 403.133 300.873 C 407.394 303.428 411.362 305.838 415.079 308.124 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 316.599 300.834 C 316.661 296.673 316.740 292.577 316.831 286.869 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 347.524 269.143 C 351.604 266.863 355.709 264.600 359.801 262.374 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 400.814 241.200 C 401.066 245.256 401.302 249.380 401.563 253.688 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 372.084 269.156 C 368.100 271.315 364.031 273.547 359.819 275.886 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 316.599 300.834 C 316.661 296.673 316.740 292.577 316.831 286.869 C 321.995 283.787 327.009 280.846 332.139 277.884 C 337.315 274.896 342.415 271.999 347.524 269.143 C 351.604 266.863 355.709 264.600 359.801 262.374 C 374.085 254.604 387.853 247.515 400.814 241.200 C 401.066 245.256 401.302 249.380 401.563 253.688 C 392.145 258.460 382.390 263.573 372.084 269.156 C 368.100 271.315 364.031 273.547 359.819 275.886 C 352.829 279.767 345.551 283.889 338.092 288.195 C 330.530 292.561 323.226 296.861 316.599 300.834 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"starburst_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 372.203 C 360.000 372.201 363.044 355.453 363.045 355.451 C 363.045 355.453 369.350 371.262 369.351 371.264 C 369.351 371.262 368.852 354.273 368.851 354.271 C 368.852 354.273 378.053 368.569 378.054 368.571 C 378.053 368.569 374.183 352.026 374.183 352.024 C 374.184 352.025 385.921 364.306 385.922 364.307 C 385.922 364.305 378.921 348.830 378.920 348.829 C 378.922 348.830 392.773 358.656 392.774 358.657 C 392.773 358.656 382.947 344.805 382.946 344.803 C 382.948 344.804 398.423 351.805 398.424 351.806 C 398.423 351.804 386.143 340.067 386.141 340.066 C 386.143 340.066 402.686 343.936 402.688 343.936 C 402.686 343.935 388.390 334.735 388.388 334.734 C 388.390 334.734 405.379 335.234 405.381 335.234 C 405.380 335.233 389.570 328.928 389.568 328.928 C 389.570 328.927 406.318 325.883 406.320 325.883 C 406.318 325.883 389.570 322.838 389.568 322.838 C 389.570 322.837 405.380 316.533 405.381 316.532 C 405.379 316.532 388.390 317.031 388.388 317.031 C 388.390 317.030 402.686 307.830 402.688 307.829 C 402.686 307.830 386.143 311.699 386.141 311.700 C 386.143 311.699 398.423 299.962 398.424 299.960 C 398.423 299.961 382.948 306.962 382.946 306.962 C 382.947 306.961 392.773 293.110 392.774 293.109 C 392.773 293.110 378.922 302.936 378.920 302.937 C 378.921 302.935 385.922 287.460 385.923 287.459 C 385.922 287.460 374.184 299.740 374.183 299.741 C 374.183 299.740 378.053 283.197 378.054 283.195 C 378.053 283.196 368.852 297.493 368.851 297.494 C 368.852 297.493 369.351 280.503 369.351 280.502 C 369.350 280.503 363.045 296.313 363.045 296.314 C 363.044 296.313 360.000 279.564 360.000 279.563 C 360.000 279.564 356.956 296.313 356.955 296.314 C 356.955 296.313 350.650 280.503 350.649 280.502 C 350.649 280.503 351.149 297.493 351.149 297.494 C 351.148 297.493 341.947 283.196 341.946 283.195 C 341.947 283.197 345.817 299.740 345.817 299.741 C 345.816 299.740 334.079 287.460 334.078 287.459 C 334.078 287.460 341.079 302.935 341.080 302.937 C 341.078 302.936 327.227 293.110 327.226 293.109 C 327.227 293.110 337.053 306.961 337.054 306.962 C 337.052 306.962 321.577 299.961 321.576 299.960 C 321.577 299.961 333.857 311.699 333.859 311.700 C 333.857 311.699 317.314 307.830 317.312 307.829 C 317.314 307.830 331.610 317.030 331.612 317.031 C 331.610 317.031 314.621 316.532 314.619 316.532 C 314.620 316.533 330.430 322.837 330.432 322.838 C 330.430 322.838 313.682 325.883 313.680 325.883 C 313.682 325.883 330.430 328.927 330.432 328.928 C 330.430 328.928 314.620 335.233 314.619 335.234 C 314.621 335.234 331.610 334.734 331.612 334.734 C 331.610 334.735 317.314 343.935 317.312 343.936 C 317.314 343.936 333.857 340.066 333.859 340.066 C 333.857 340.067 321.577 351.804 321.576 351.805 C 321.577 351.804 337.052 344.804 337.054 344.803 C 337.053 344.805 327.227 358.656 327.226 358.657 C 327.227 358.656 341.078 348.830 341.080 348.829 C 341.079 348.830 334.078 364.305 334.077 364.307 C 334.078 364.306 345.816 352.025 345.817 352.024 C 345.817 352.026 341.947 368.569 341.946 368.571 C 341.947 368.569 351.148 354.273 351.149 354.271 C 351.149 354.273 350.649 371.262 350.649 371.264 C 350.650 371.262 356.955 355.453 356.955 355.451 C 356.956 355.453 360.000 372.201 360.000 372.203 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 493.611 234.427 C 493.611 234.426 495.183 225.778 495.183 225.777 C 495.184 225.778 498.439 233.941 498.439 233.942 C 498.439 233.941 498.181 225.169 498.181 225.168 C 498.182 225.169 502.932 232.551 502.933 232.551 C 502.932 232.550 500.934 224.009 500.934 224.008 C 500.935 224.009 506.995 230.349 506.996 230.350 C 506.995 230.349 503.381 222.359 503.380 222.358 C 503.381 222.358 510.533 227.432 510.533 227.433 C 510.533 227.432 505.459 220.280 505.459 220.279 C 505.460 220.280 513.450 223.895 513.451 223.895 C 513.450 223.894 507.109 217.834 507.108 217.833 C 507.109 217.834 515.651 219.832 515.652 219.832 C 515.651 219.832 508.270 215.081 508.269 215.081 C 508.270 215.081 517.042 215.338 517.043 215.338 C 517.042 215.338 508.879 212.083 508.878 212.082 C 508.879 212.082 517.527 210.510 517.527 210.510 C 517.527 210.510 508.879 208.938 508.878 208.938 C 508.879 208.938 517.042 205.682 517.043 205.682 C 517.042 205.682 508.270 205.940 508.269 205.940 C 508.270 205.939 515.651 201.189 515.652 201.189 C 515.651 201.189 507.109 203.187 507.108 203.187 C 507.109 203.187 513.450 197.126 513.451 197.126 C 513.450 197.126 505.460 200.741 505.459 200.741 C 505.459 200.740 510.533 193.588 510.533 193.588 C 510.533 193.588 503.381 198.662 503.380 198.662 C 503.381 198.661 506.995 190.671 506.996 190.671 C 506.995 190.671 500.935 197.012 500.934 197.013 C 500.934 197.012 502.932 188.470 502.933 188.469 C 502.932 188.470 498.182 195.852 498.181 195.852 C 498.181 195.851 498.439 187.079 498.439 187.078 C 498.439 187.079 495.184 195.242 495.183 195.243 C 495.183 195.242 493.611 186.595 493.611 186.594 C 493.611 186.595 492.039 195.242 492.039 195.243 C 492.038 195.242 488.783 187.079 488.783 187.078 C 488.783 187.079 489.041 195.851 489.041 195.852 C 489.040 195.852 484.290 188.470 484.289 188.469 C 484.289 188.470 486.288 197.012 486.288 197.013 C 486.287 197.012 480.227 190.671 480.226 190.671 C 480.227 190.671 483.841 198.661 483.842 198.662 C 483.841 198.662 476.689 193.588 476.689 193.588 C 476.689 193.588 481.763 200.740 481.763 200.741 C 481.762 200.741 473.772 197.126 473.771 197.125 C 473.772 197.126 480.113 203.187 480.113 203.187 C 480.112 203.187 471.571 201.189 471.570 201.189 C 471.571 201.189 478.952 205.939 478.953 205.940 C 478.952 205.940 470.180 205.682 470.179 205.682 C 470.180 205.682 478.343 208.938 478.344 208.938 C 478.343 208.938 469.695 210.510 469.694 210.510 C 469.695 210.510 478.343 212.082 478.344 212.082 C 478.343 212.083 470.180 215.338 470.179 215.338 C 470.180 215.338 478.952 215.081 478.953 215.081 C 478.952 215.081 471.571 219.832 471.570 219.832 C 471.571 219.832 480.112 217.834 480.113 217.833 C 480.113 217.834 473.772 223.894 473.771 223.895 C 473.772 223.894 481.762 220.280 481.763 220.279 C 481.763 220.280 476.689 227.432 476.689 227.433 C 476.689 227.432 483.841 222.358 483.842 222.358 C 483.841 222.359 480.227 230.349 480.226 230.350 C 480.227 230.349 486.287 224.009 486.288 224.008 C 486.288 224.009 484.289 232.550 484.289 232.551 C 484.290 232.551 489.040 225.169 489.041 225.168 C 489.041 225.169 488.783 233.941 488.783 233.942 C 488.783 233.941 492.038 225.778 492.039 225.777 C 492.039 225.778 493.611 234.426 493.611 234.427 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 225.324 322.485 C 225.324 322.484 226.896 313.836 226.896 313.835 C 226.897 313.836 230.152 321.999 230.152 322.000 C 230.152 321.999 229.894 313.227 229.894 313.226 C 229.895 313.227 234.645 320.608 234.646 320.609 C 234.646 320.608 232.647 312.067 232.647 312.066 C 232.648 312.066 238.708 318.407 238.709 318.408 C 238.708 318.407 235.094 310.417 235.093 310.416 C 235.094 310.416 242.246 315.490 242.247 315.490 C 242.246 315.490 237.173 308.338 237.172 308.337 C 237.173 308.337 245.163 311.952 245.164 311.953 C 245.163 311.952 238.822 305.892 238.822 305.891 C 238.823 305.891 247.365 307.890 247.365 307.890 C 247.365 307.889 239.983 303.139 239.982 303.138 C 239.983 303.138 248.755 303.396 248.756 303.396 C 248.755 303.396 240.592 300.140 240.591 300.140 C 240.592 300.140 249.240 298.568 249.241 298.568 C 249.240 298.568 240.592 296.996 240.591 296.996 C 240.592 296.995 248.755 293.740 248.756 293.740 C 248.755 293.740 239.983 293.997 239.982 293.998 C 239.983 293.997 247.365 289.247 247.365 289.246 C 247.365 289.247 238.823 291.245 238.822 291.245 C 238.822 291.244 245.163 285.184 245.164 285.183 C 245.163 285.184 237.173 288.798 237.172 288.799 C 237.173 288.798 242.246 281.646 242.247 281.646 C 242.246 281.646 235.094 286.720 235.093 286.720 C 235.094 286.719 238.709 278.729 238.709 278.728 C 238.708 278.729 232.648 285.070 232.647 285.070 C 232.647 285.070 234.646 276.528 234.646 276.527 C 234.645 276.528 229.895 283.909 229.894 283.910 C 229.894 283.909 230.152 275.137 230.152 275.136 C 230.152 275.137 226.897 283.300 226.896 283.301 C 226.896 283.300 225.324 274.652 225.324 274.651 C 225.324 274.652 223.752 283.300 223.752 283.301 C 223.752 283.300 220.496 275.137 220.496 275.136 C 220.496 275.137 220.754 283.909 220.754 283.910 C 220.753 283.909 216.003 276.528 216.002 276.527 C 216.003 276.528 218.001 285.070 218.001 285.070 C 218.000 285.070 211.940 278.729 211.939 278.728 C 211.940 278.729 215.555 286.719 215.555 286.720 C 215.554 286.720 208.403 281.646 208.402 281.646 C 208.402 281.646 213.476 288.798 213.476 288.799 C 213.476 288.798 205.485 285.183 205.484 285.183 C 205.485 285.184 211.826 291.244 211.826 291.245 C 211.826 291.245 203.284 289.247 203.283 289.246 C 203.284 289.247 210.666 293.997 210.666 293.998 C 210.665 293.997 201.893 293.740 201.892 293.740 C 201.893 293.740 210.056 296.995 210.057 296.996 C 210.056 296.996 201.408 298.568 201.407 298.568 C 201.408 298.568 210.056 300.140 210.057 300.140 C 210.056 300.140 201.893 303.396 201.892 303.396 C 201.893 303.396 210.665 303.138 210.666 303.138 C 210.666 303.139 203.284 307.889 203.283 307.890 C 203.284 307.890 211.826 305.891 211.826 305.891 C 211.826 305.892 205.485 311.952 205.484 311.952 C 205.485 311.952 213.476 308.337 213.476 308.337 C 213.476 308.338 208.402 315.490 208.402 315.490 C 208.403 315.490 215.554 310.416 215.555 310.416 C 215.555 310.417 211.940 318.407 211.939 318.408 C 211.940 318.407 218.000 312.066 218.001 312.066 C 218.001 312.067 216.003 320.608 216.002 320.609 C 216.003 320.608 220.753 313.227 220.754 313.226 C 220.754 313.227 220.496 321.999 220.496 322.000 C 220.496 321.999 223.752 313.836 223.752 313.835 C 223.752 313.836 225.324 322.484 225.324 322.485 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 335.743 560.202 C 335.743 560.201 337.315 551.554 337.315 551.553 C 337.315 551.553 340.570 559.717 340.571 559.717 C 340.571 559.716 340.313 550.944 340.313 550.943 C 340.313 550.944 345.064 558.326 345.064 558.327 C 345.064 558.326 343.066 549.784 343.066 549.783 C 343.066 549.784 349.127 556.124 349.127 556.125 C 349.127 556.124 345.512 548.134 345.512 548.133 C 345.513 548.134 352.664 553.207 352.665 553.208 C 352.665 553.207 347.591 546.055 347.591 546.055 C 347.591 546.055 355.582 549.670 355.582 549.670 C 355.582 549.670 349.241 543.609 349.240 543.609 C 349.241 543.609 357.783 545.607 357.784 545.607 C 357.783 545.607 350.401 540.856 350.401 540.856 C 350.401 540.856 359.173 541.114 359.174 541.114 C 359.174 541.113 351.011 537.858 351.010 537.858 C 351.011 537.857 359.658 536.286 359.659 536.285 C 359.658 536.285 351.011 534.713 351.010 534.713 C 351.011 534.713 359.174 531.457 359.174 531.457 C 359.173 531.457 350.401 531.715 350.401 531.715 C 350.401 531.715 357.783 526.964 357.784 526.964 C 357.783 526.964 349.241 528.962 349.240 528.962 C 349.241 528.962 355.582 522.901 355.582 522.901 C 355.582 522.901 347.591 526.516 347.591 526.516 C 347.591 526.516 352.665 519.364 352.665 519.363 C 352.664 519.364 345.513 524.437 345.512 524.438 C 345.512 524.437 349.127 516.447 349.128 516.446 C 349.127 516.446 343.066 522.787 343.066 522.788 C 343.066 522.787 345.064 514.245 345.064 514.244 C 345.064 514.245 340.313 521.627 340.313 521.628 C 340.313 521.627 340.571 512.854 340.571 512.853 C 340.570 512.854 337.315 521.017 337.315 521.018 C 337.315 521.017 335.743 512.370 335.743 512.369 C 335.743 512.370 334.171 521.017 334.171 521.018 C 334.170 521.017 330.915 512.854 330.914 512.853 C 330.914 512.854 331.172 521.627 331.172 521.628 C 331.172 521.627 326.421 514.245 326.421 514.244 C 326.421 514.245 328.419 522.787 328.419 522.788 C 328.419 522.787 322.358 516.446 322.358 516.446 C 322.358 516.447 325.973 524.437 325.974 524.438 C 325.973 524.437 318.821 519.364 318.820 519.363 C 318.821 519.364 323.894 526.516 323.895 526.516 C 323.894 526.516 315.904 522.901 315.903 522.901 C 315.903 522.901 322.244 528.962 322.245 528.962 C 322.244 528.962 313.702 526.964 313.702 526.964 C 313.702 526.964 321.084 531.715 321.085 531.715 C 321.084 531.715 312.312 531.457 312.311 531.457 C 312.312 531.457 320.475 534.713 320.475 534.713 C 320.475 534.713 311.827 536.285 311.826 536.285 C 311.827 536.286 320.475 537.857 320.475 537.858 C 320.475 537.858 312.312 541.113 312.311 541.114 C 312.312 541.114 321.084 540.856 321.085 540.856 C 321.084 540.856 313.702 545.607 313.702 545.607 C 313.702 545.607 322.244 543.609 322.245 543.609 C 322.244 543.609 315.903 549.669 315.903 549.670 C 315.904 549.670 323.894 546.055 323.895 546.055 C 323.894 546.055 318.821 553.207 318.820 553.208 C 318.821 553.207 325.973 548.134 325.974 548.133 C 325.973 548.134 322.358 556.124 322.358 556.125 C 322.358 556.124 328.419 549.784 328.419 549.783 C 328.419 549.784 326.421 558.326 326.421 558.327 C 326.421 558.326 331.172 550.944 331.172 550.943 C 331.172 550.944 330.914 559.716 330.914 559.717 C 330.915 559.717 334.170 551.553 334.171 551.553 C 334.171 551.554 335.743 560.201 335.743 560.202 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Layer_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 353.411 C 375.237 353.411 387.528 341.120 387.528 325.883 C 387.528 310.646 375.237 298.354 360.000 298.354 C 344.763 298.354 332.472 310.646 332.472 325.883 C 332.472 341.120 344.763 353.411 360.000 353.411 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 493.632 225.205 C 501.809 225.205 508.404 218.609 508.404 210.433 C 508.404 202.257 501.809 195.661 493.632 195.661 C 485.456 195.661 478.860 202.257 478.860 210.433 C 478.860 218.609 485.456 225.205 493.632 225.205 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 225.184 312.880 C 233.361 312.880 239.957 306.284 239.957 298.108 C 239.957 289.932 233.361 283.336 225.184 283.336 C 217.008 283.336 210.412 289.932 210.412 298.108 C 210.412 306.284 217.008 312.880 225.184 312.880 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 335.456 550.597 C 343.632 550.597 350.228 544.001 350.228 535.825 C 350.228 527.648 343.632 521.053 335.456 521.053 C 327.280 521.053 320.684 527.648 320.684 535.825 C 320.684 544.001 327.280 550.597 335.456 550.597 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":271.166,\\\"max\\\":448.834},\\\"y\\\":{\\\"min\\\":237.049,\\\"max\\\":414.717}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":687.3,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":31.522,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":66.199,\\\"y\\\":326.72,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.99998727385282,\\\"y\\\":0.005045010644694454}},{\\\"point\\\":{\\\"x\\\":653.801,\\\"y\\\":326.72,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.99998727385282,\\\"y\\\":0.005045010644694451}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":568.349,\\\"y\\\":535.234,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128727398644766,\\\"y\\\":0.7012934170218014}},{\\\"point\\\":{\\\"x\\\":151.479,\\\"y\\\":535.277,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986617533348272,\\\"y\\\":0.7154521328692124}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":568.495,\\\"y\\\":118.302,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314391307129583,\\\"y\\\":-0.77542544722524}},{\\\"point\\\":{\\\"x\\\":152.213,\\\"y\\\":118.373,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817316356842618,\\\"y\\\":-0.7316023352254016}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":628.17,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"baby\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":136.29395694453225,\\\"max\\\":583.1590242633404},\\\"y\\\":{\\\"min\\\":7.768899256439873,\\\"max\\\":591.6958889135697}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"baby\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"baby\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#FE871690-C5E8-45FE-997D-9DF946B26D0F_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 438.903 476.114 C 446.970 479.497 459.124 483.308 463.176 484.579 C 454.501 501.418 458.345 529.951 452.610 536.784 C 432.483 560.764 506.208 580.313 506.214 580.317 C 506.216 580.318 523.012 592.228 527.300 588.063 C 537.562 578.098 515.375 577.944 518.402 573.191 C 521.165 568.854 530.233 577.804 532.848 573.253 C 535.312 568.964 519.393 568.353 521.200 564.143 C 523.440 558.925 533.198 570.776 535.203 565.790 C 537.151 560.946 522.993 557.839 524.072 555.227 C 525.537 551.682 533.770 560.690 536.440 554.644 C 537.350 552.583 523.045 548.175 516.260 542.064 C 515.144 541.059 503.254 533.637 503.254 533.637 C 503.254 533.637 522.381 484.361 518.836 464.123 C 526.591 433.822 459.670 396.942 458.027 395.614 C 463.639 378.084 453.635 302.412 451.647 295.318 C 468.100 291.591 513.454 278.606 522.547 260.596 C 539.519 246.648 550.395 213.413 549.627 204.224 C 556.979 200.472 561.833 192.176 565.713 183.238 C 571.185 174.017 587.526 159.786 578.486 155.203 C 575.960 153.922 568.026 169.158 563.160 166.308 C 559.114 163.938 576.185 147.365 569.176 143.538 C 562.662 139.982 557.103 161.617 553.473 159.945 C 547.956 157.403 560.969 135.499 551.929 134.123 C 544.713 133.024 546.140 156.673 542.633 156.181 C 534.316 155.015 539.956 134.180 532.076 134.484 C 520.899 134.914 535.529 162.132 525.572 166.826 C 519.874 169.512 512.516 155.661 507.926 160.122 C 503.096 164.815 513.449 172.409 515.577 179.260 C 516.857 183.381 519.144 189.155 519.907 191.080 C 519.907 191.080 497.047 221.924 496.077 224.268 C 477.282 224.324 468.358 227.340 453.966 232.074 C 442.217 232.184 430.907 235.925 421.684 241.917 C 403.723 227.910 382.518 220.169 360.429 220.169 C 337.781 219.951 316.535 227.779 298.316 241.917 C 289.108 235.903 277.783 232.184 266.034 232.074 C 251.642 227.340 242.718 224.324 223.923 224.268 C 222.953 221.924 200.093 191.080 200.093 191.080 C 200.856 189.155 203.144 183.381 204.423 179.260 C 206.551 172.409 216.904 164.815 212.074 160.122 C 207.484 155.661 200.126 169.512 194.428 166.826 C 184.471 162.132 199.104 134.137 187.924 134.484 C 181.948 134.669 184.526 157.847 180.066 158.214 C 175.292 158.608 176.724 133.604 168.720 134.629 C 160.636 135.664 172.919 159.773 169.008 161.574 C 163.538 164.092 158.097 140.835 152.530 143.363 C 144.467 147.025 160.861 164.873 156.301 167.616 C 152.629 169.825 143.741 153.608 140.499 154.822 C 132.460 157.834 148.562 173.854 154.288 183.238 C 158.276 192.128 163.021 200.472 170.373 204.224 C 169.605 213.413 180.481 246.648 197.453 260.596 C 206.546 278.606 251.900 291.591 268.353 295.318 C 266.365 302.412 256.361 378.084 261.973 395.614 C 260.330 396.942 193.409 433.822 201.164 464.123 C 197.619 484.361 211.981 525.025 216.746 533.637 C 208.996 537.785 204.217 542.335 203.331 543.698 C 198.921 550.487 180.023 550.845 181.275 555.513 C 183.246 562.866 194.848 550.721 196.321 555.144 C 198.154 560.650 180.441 559.755 181.968 565.217 C 183.773 571.669 196.393 560.909 198.495 565.969 C 199.512 568.416 181.820 569.690 186.097 575.694 C 188.828 579.526 199.027 568.147 202.436 572.959 C 205.939 577.905 179.933 577.961 192.023 588.420 C 198.269 593.823 213.784 580.318 213.786 580.317 C 213.792 580.313 287.517 560.764 267.390 536.784 C 261.655 529.951 265.499 501.418 256.825 484.579 C 260.876 483.308 273.030 479.497 281.097 476.114 C 295.680 470.000 309.661 462.535 319.335 453.819 C 331.071 457.726 346.077 458.464 360.445 458.609 C 374.271 458.624 389.189 457.672 400.665 453.819 C 410.339 462.535 424.320 470.000 438.903 476.114 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#FE871690-C5E8-45FE-997D-9DF946B26D0F_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 269.608 175.423 C 263.623 109.845 286.990 57.479 360.429 57.681 C 433.610 57.882 457.547 110.999 450.392 175.423 C 468.674 174.444 457.676 214.797 442.002 215.740 C 437.158 227.862 430.425 238.539 422.286 247.388 C 406.008 265.085 384.105 275.468 360.429 275.468 C 336.223 275.537 314.217 265.254 297.714 247.388 C 289.557 238.557 282.842 227.862 277.998 215.740 C 262.324 214.797 251.328 174.407 269.608 175.423 M 338.728 188.489 C 338.729 177.800 330.106 169.177 319.417 169.177 C 308.728 169.177 300.105 177.800 300.106 188.489 C 300.106 199.177 308.728 207.799 319.417 207.799 C 330.106 207.800 338.728 199.177 338.728 188.489 M 381.472 188.489 C 381.471 177.800 390.094 169.177 400.783 169.177 C 411.472 169.177 420.095 177.800 420.095 188.489 C 420.094 199.177 411.472 207.799 400.783 207.799 C 390.095 207.800 381.472 199.177 381.472 188.489 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 343.145 241.235 C 343.946 236.967 354.026 240.207 361.042 240.207 C 368.059 240.207 378.139 236.967 378.940 241.235 C 379.796 245.799 368.545 248.100 361.042 248.100 C 353.540 248.100 342.288 245.799 343.145 241.235 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 364.021 76.070 C 366.496 52.934 336.788 48.757 340.947 28.479 C 345.579 5.890 369.009 5.503 375.680 18.034 C 382.586 31.006 367.715 44.706 360.814 32.755 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":282.345,\\\"max\\\":437.655},\\\"y\\\":{\\\"min\\\":284.245,\\\"max\\\":439.555}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.755,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":58.499,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":261.063,\\\"y\\\":342.622,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872546185516,\\\"y\\\":0.005048821689449995}},{\\\"point\\\":{\\\"x\\\":458.937,\\\"y\\\":342.622,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872546185516,\\\"y\\\":0.0050488216894499826}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":539.086,\\\"y\\\":574.582,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129515251405757,\\\"y\\\":0.7012133218926513}},{\\\"point\\\":{\\\"x\\\":180.766,\\\"y\\\":574.619,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987349433206016,\\\"y\\\":0.7153806532069173}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":572.652,\\\"y\\\":129.724,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314256466697843,\\\"y\\\":-0.7754364272637988}},{\\\"point\\\":{\\\"x\\\":148.075,\\\"y\\\":129.796,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817315179272352,\\\"y\\\":-0.7316024449553375}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":462.148,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"FE871690-C5E8-45FE-997D-9DF946B26D0F_0\\\",\\\"cx\\\":\\\"49.80%\\\",\\\"cy\\\":\\\"49.58%\\\",\\\"r\\\":\\\"151.83%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"16.86%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"FE871690-C5E8-45FE-997D-9DF946B26D0F_1\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"49.97%\\\",\\\"r\\\":\\\"147.77%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"16.86%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"band\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":27.696,\\\"max\\\":692.305},\\\"y\\\":{\\\"min\\\":50.717,\\\"max\\\":432.005}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hole\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hole\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 337.463 C 194.301 337.463 94.503 287.104 52.692 241.435 C 37.228 258.382 29.696 274.707 29.696 287.632 C 29.696 335.506 133.015 430.005 360.000 430.005 C 586.985 430.005 690.305 335.506 690.305 287.632 C 690.305 274.706 682.772 258.382 667.307 241.434 C 625.497 287.104 525.699 337.462 360.000 337.463 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 29.696 287.632 C 29.696 274.707 37.228 258.382 52.692 241.435 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 667.307 241.434 C 682.772 258.382 690.305 274.706 690.305 287.632 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 29.696 195.090 C 29.696 225.937 29.696 256.785 29.696 287.632 C 29.696 274.707 37.228 258.382 52.692 241.435 C 94.503 195.618 194.301 145.260 360.000 145.260 C 525.699 145.260 625.496 195.618 667.307 241.434 C 682.772 258.382 690.305 274.706 690.305 287.632 C 690.305 256.785 690.305 225.937 690.305 195.090 C 690.304 140.066 586.985 52.717 360.000 52.717 C 133.015 52.717 29.696 146.135 29.696 195.090 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":234.786,\\\"max\\\":485.214},\\\"y\\\":{\\\"min\\\":157.884,\\\"max\\\":594.549}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":616.667,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":55.311,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":32.423,\\\"y\\\":242.298,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088754184}},{\\\"point\\\":{\\\"x\\\":688.623,\\\"y\\\":242.298,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.00503585408875421}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":593.334,\\\"y\\\":386.379,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129699922269517,\\\"y\\\":0.7011945451755173}},{\\\"point\\\":{\\\"x\\\":127.799,\\\"y\\\":386.427,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987254201015096,\\\"y\\\":0.7153899547127908}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":592.835,\\\"y\\\":98.323,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314454286031296,\\\"y\\\":-0.7754203187279851}},{\\\"point\\\":{\\\"x\\\":127.956,\\\"y\\\":98.402,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817481203990747,\\\"y\\\":-0.7315869738673105}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":430.423,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":false,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":false,\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"banner\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":13.068,\\\"max\\\":706.932},\\\"y\\\":{\\\"min\\\":244.09142636476506,\\\"max\\\":496.77192438053817}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"banner\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"banner_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#4077CAD8-5260-4682-8C93-030F4898BB73_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 449.383 488.619 C 454.881 474.810 563.688 484.749 566.022 474.569 C 566.022 474.569 566.022 474.569 566.022 474.569 C 566.022 474.569 566.022 474.569 566.022 474.569 C 566.021 474.554 560.635 373.051 560.326 323.105 C 623.666 328.109 704.917 322.039 704.932 322.039 C 704.920 322.048 588.074 412.860 588.062 412.869 C 588.074 412.876 702.681 488.077 702.692 488.085 C 702.667 488.085 449.086 499.661 449.383 488.619 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#4077CAD8-5260-4682-8C93-030F4898BB73_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 153.979 474.569 C 153.979 474.554 159.366 373.051 159.674 323.105 C 96.334 328.109 15.083 322.039 15.068 322.039 C 15.080 322.048 131.926 412.859 131.938 412.868 C 131.927 412.876 17.320 488.077 17.308 488.085 C 17.334 488.085 267.529 502.768 270.617 488.619 C 264.204 474.890 154.482 484.909 153.979 474.569 C 153.979 474.569 153.979 474.569 153.979 474.569 C 153.979 474.569 153.979 474.569 153.979 474.569 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 560.326 323.105 C 560.635 373.051 566.021 474.554 566.022 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 153.979 474.569 C 153.979 474.554 159.366 373.051 159.674 323.105 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 153.979 474.569 C 153.979 474.569 153.979 474.569 153.979 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 153.979 474.569 C 153.979 474.569 153.979 474.569 153.979 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 566.022 474.569 C 566.022 474.569 566.022 474.569 566.022 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 566.022 474.569 C 566.022 474.569 566.022 474.569 566.022 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#4077CAD8-5260-4682-8C93-030F4898BB73_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 560.326 323.105 C 560.635 373.051 566.021 474.554 566.022 474.569 C 564.036 463.222 492.639 465.247 451.911 467.303 C 416.488 469.092 400.430 466.588 360.518 467.226 C 320.949 467.858 303.913 469.079 268.089 467.303 C 227.360 465.284 158.685 463.467 153.979 474.569 C 153.979 474.554 159.366 373.051 159.674 323.105 C 160.244 299.833 158.824 279.546 158.992 258.450 C 165.435 242.321 218.002 247.102 361.304 248.726 C 502.890 247.282 555.836 239.979 561.009 258.451 C 559.104 288.930 559.756 299.833 560.326 323.105 M 153.979 474.569 C 153.979 474.569 153.979 474.569 153.979 474.569 C 153.979 474.569 153.979 474.569 153.979 474.569 M 566.022 474.569 C 566.022 474.569 566.022 474.569 566.022 474.569 C 566.022 474.569 566.022 474.569 566.022 474.569 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 268.089 467.303 C 227.360 465.284 158.685 463.467 153.979 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 153.979 474.569 C 153.979 474.569 153.979 474.569 153.979 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 153.979 474.569 C 153.979 474.569 153.979 474.569 153.979 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 153.979 474.569 C 154.482 484.909 264.204 474.890 270.617 488.619 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 268.089 467.303 C 227.360 465.284 158.685 463.467 153.979 474.569 C 153.979 474.569 153.979 474.569 153.979 474.569 C 153.979 474.569 153.979 474.569 153.979 474.569 C 154.482 484.909 264.204 474.890 270.617 488.619 C 270.006 480.647 268.944 474.510 268.089 467.303 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 566.022 474.569 C 564.036 463.222 492.639 465.247 451.911 467.303 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 449.383 488.619 C 454.881 474.810 563.688 484.749 566.022 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 566.022 474.569 C 566.022 474.569 566.022 474.569 566.022 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 566.022 474.569 C 566.022 474.569 566.022 474.569 566.022 474.569 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 566.022 474.569 C 564.036 463.222 492.639 465.247 451.911 467.303 C 451.056 474.510 449.994 480.647 449.383 488.619 C 454.881 474.810 563.688 484.749 566.022 474.569 C 566.022 474.569 566.022 474.569 566.022 474.569 C 566.022 474.569 566.022 474.569 566.022 474.569 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":184.293,\\\"max\\\":535.707},\\\"y\\\":{\\\"min\\\":265.333,\\\"max\\\":451.135}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":561.033,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":250.802,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":127.587,\\\"y\\\":489.023,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7129128799164904,\\\"y\\\":0.7012526118662059}},{\\\"point\\\":{\\\"x\\\":592.414,\\\"y\\\":489.023,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128625761887064,\\\"y\\\":0.7013037483641458}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":158.673,\\\"y\\\":298.917,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987471677831,\\\"y\\\":0.005005645550685231}},{\\\"point\\\":{\\\"x\\\":561.327,\\\"y\\\":298.917,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999987471677831,\\\"y\\\":0.005005645550685207}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":463.629,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"4077CAD8-5260-4682-8C93-030F4898BB73_0\\\",\\\"x1\\\":\\\"77.20%\\\",\\\"y1\\\":\\\"66.78%\\\",\\\"x2\\\":\\\"-74.13%\\\",\\\"y2\\\":\\\"66.78%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"4077CAD8-5260-4682-8C93-030F4898BB73_1\\\",\\\"x1\\\":\\\"25.95%\\\",\\\"y1\\\":\\\"54.69%\\\",\\\"x2\\\":\\\"180.77%\\\",\\\"y2\\\":\\\"54.69%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"4077CAD8-5260-4682-8C93-030F4898BB73_2\\\",\\\"x1\\\":\\\"-27.08%\\\",\\\"y1\\\":\\\"62.11%\\\",\\\"x2\\\":\\\"126.90%\\\",\\\"y2\\\":\\\"62.11%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"30.59%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"70.59%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"beaker\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":157.751,\\\"max\\\":562.249},\\\"y\\\":{\\\"min\\\":32.657250000000005,\\\"max\\\":612.373}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"beaker\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"beaker\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 400.050 69.701 C 400.050 69.723 400.050 289.953 400.050 289.975 C 400.066 290.003 560.249 473.456 560.249 570.323 C 560.249 590.348 540.226 610.369 540.224 610.373 C 540.206 610.373 179.794 610.373 179.776 610.373 C 179.774 610.369 159.751 590.348 159.751 570.323 C 159.751 473.456 319.934 290.003 319.950 289.975 C 319.950 289.953 319.950 69.723 319.950 69.701 C 319.948 69.699 299.925 69.701 299.926 49.676 C 299.926 29.651 420.075 29.651 420.075 49.676 C 420.075 69.701 400.052 69.699 400.050 69.701 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 237.419 441.248 C 271.608 441.239 400.082 441.215 482.371 441.015 C 510.354 483.603 531.815 526.212 534.918 561.721 C 536.158 575.906 523.853 591.573 523.852 591.576 C 523.835 591.577 196.165 591.577 196.148 591.576 C 196.147 591.573 183.838 575.906 185.082 561.721 C 188.198 526.178 209.727 483.543 237.419 441.248 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":247.105,\\\"max\\\":472.895},\\\"y\\\":{\\\"min\\\":445.17,\\\"max\\\":586.06}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":692.828,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":33.839,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":297.883,\\\"y\\\":278.888,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987314871472,\\\"y\\\":0.005036873647774573}},{\\\"point\\\":{\\\"x\\\":422.117,\\\"y\\\":278.888,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999987314871472,\\\"y\\\":0.005036873647774573}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":538.245,\\\"y\\\":610.441,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129318389237843,\\\"y\\\":0.7012333370916924}},{\\\"point\\\":{\\\"x\\\":181.608,\\\"y\\\":610.477,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986946485335824,\\\"y\\\":0.7154200081843768}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":613.976,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"bed\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":85.535,\\\"max\\\":697.116},\\\"y\\\":{\\\"min\\\":71.744,\\\"max\\\":648.579}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bed\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bed_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#903D2A13-A066-4E5E-9B57-EC5438A5114B_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 152.879 441.544 C 152.879 441.540 152.565 407.464 152.565 407.461 C 142.283 401.580 121.722 389.819 121.719 389.818 C 121.409 413.235 120.790 460.063 120.790 460.070 C 131.486 453.895 152.875 441.546 152.879 441.544 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 439.133 201.437 C 354.460 251.078 185.139 350.346 185.114 350.361 C 185.108 350.357 121.243 313.404 121.237 313.401 C 121.262 313.386 376.507 165.628 376.533 165.613 C 376.539 165.617 439.127 201.433 439.133 201.437 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 439.133 201.437 C 354.460 251.078 185.139 350.346 185.114 350.361 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 248.630 387.112 C 248.655 387.098 419.100 289.357 504.336 240.480 C 504.329 240.476 439.140 201.441 439.133 201.437 C 354.460 251.078 185.139 350.346 185.114 350.361 C 185.120 350.364 248.623 387.109 248.630 387.112 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 248.630 387.112 C 248.655 387.098 419.100 289.357 504.336 240.480 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 504.336 240.480 C 504.355 240.491 695.097 352.310 695.116 352.322 C 610.164 400.536 440.283 496.951 440.258 496.965 C 440.239 496.954 248.649 387.123 248.630 387.112 C 248.655 387.098 419.100 289.357 504.336 240.480 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 440.258 496.965 C 440.239 496.954 248.649 387.123 248.630 387.112 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 405.025 583.042 C 405.029 583.045 440.456 604.449 440.459 604.451 C 440.459 604.441 440.325 532.794 440.258 496.965 C 440.239 496.954 248.649 387.123 248.630 387.112 C 248.629 387.123 247.511 457.458 246.952 492.631 C 246.968 492.640 405.009 583.033 405.025 583.042 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 152.565 407.461 C 142.283 401.580 121.722 389.819 121.719 389.818 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 121.237 313.401 C 121.243 313.404 185.108 350.357 185.114 350.361 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 185.114 350.361 C 185.114 350.368 183.107 426.080 183.107 426.088 C 172.926 419.879 152.568 407.463 152.565 407.461 C 142.283 401.580 121.722 389.819 121.719 389.818 C 121.719 389.817 121.237 313.408 121.237 313.401 C 121.243 313.404 185.108 350.357 185.114 350.361 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 121.237 313.401 C 121.237 313.408 121.719 389.817 121.719 389.818 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 121.719 389.818 C 121.409 413.235 120.790 460.063 120.790 460.070 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 121.237 313.401 C 121.237 313.408 121.719 389.817 121.719 389.818 C 121.409 413.235 120.790 460.063 120.790 460.070 C 120.786 460.068 87.538 441.137 87.535 441.135 C 87.535 441.113 89.047 219.849 89.047 219.827 C 89.051 219.828 110.567 231.927 121.327 237.977 C 121.327 237.984 121.237 313.393 121.237 313.401 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 405.025 583.042 C 405.029 583.045 440.456 604.449 440.459 604.451 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 405.033 624.028 C 405.033 624.024 405.028 596.704 405.025 583.042 C 405.029 583.045 440.456 604.449 440.459 604.451 C 440.459 604.456 440.426 646.575 440.426 646.579 C 440.422 646.577 405.036 624.030 405.033 624.028 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 631.304 500.747 C 631.304 500.746 631.273 496.225 631.258 493.964 C 631.261 493.962 664.941 474.274 664.944 474.272 C 664.944 488.773 664.945 517.769 664.945 517.773 C 653.731 512.098 631.307 500.748 631.304 500.747 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 440.459 604.451 C 440.459 604.441 440.325 532.794 440.258 496.965 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 440.258 496.965 C 440.283 496.951 610.164 400.536 695.116 352.322 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 664.944 474.272 C 664.941 474.274 631.261 493.962 631.258 493.964 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#903D2A13-A066-4E5E-9B57-EC5438A5114B_9)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 440.459 604.451 C 440.459 604.441 440.325 532.794 440.258 496.965 C 440.283 496.951 610.164 400.536 695.116 352.322 C 695.116 352.332 694.507 455.195 694.507 455.205 C 694.504 455.207 664.947 474.270 664.944 474.272 C 664.941 474.274 631.261 493.962 631.258 493.964 C 631.242 493.973 477.091 584.121 477.076 584.130 C 477.072 584.132 440.463 604.449 440.459 604.451 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 440.426 646.579 C 440.426 646.575 440.459 604.456 440.459 604.451 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 440.459 604.451 C 440.463 604.449 477.072 584.132 477.076 584.130 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#903D2A13-A066-4E5E-9B57-EC5438A5114B_10)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 477.076 584.130 C 477.057 597.924 477.018 625.508 477.018 625.512 C 477.015 625.514 452.623 639.557 440.426 646.579 C 440.426 646.575 440.459 604.456 440.459 604.451 C 440.463 604.449 477.072 584.132 477.076 584.130 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 664.945 517.773 C 664.945 517.769 664.944 488.773 664.944 474.272 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 664.944 474.272 C 664.947 474.270 694.504 455.207 694.507 455.205 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#903D2A13-A066-4E5E-9B57-EC5438A5114B_11)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 664.945 517.773 C 664.945 517.769 664.944 488.773 664.944 474.272 C 664.947 474.270 694.504 455.207 694.507 455.205 C 694.556 469.604 694.655 498.397 694.655 498.401 C 694.652 498.403 664.948 517.771 664.945 517.773 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 121.327 237.977 C 110.567 231.927 89.051 219.828 89.047 219.827 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 376.927 90.121 C 376.902 90.135 121.353 237.962 121.327 237.977 C 110.567 231.927 89.051 219.828 89.047 219.827 C 173.324 171.132 341.851 73.758 341.876 73.744 C 341.880 73.745 365.244 84.662 376.927 90.121 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 121.327 237.977 C 121.327 237.984 121.237 313.393 121.237 313.401 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 121.237 313.401 C 121.262 313.386 376.507 165.628 376.533 165.613 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 376.927 90.121 C 376.902 90.135 121.353 237.962 121.327 237.977 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#903D2A13-A066-4E5E-9B57-EC5438A5114B_13)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 121.327 237.977 C 121.327 237.984 121.237 313.393 121.237 313.401 C 121.262 313.386 376.507 165.628 376.533 165.613 C 376.664 140.449 376.927 90.128 376.927 90.121 C 376.902 90.135 121.353 237.962 121.327 237.977 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 246.952 492.631 C 247.511 457.458 248.629 387.123 248.630 387.112 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 248.630 387.112 C 248.623 387.109 185.120 350.364 185.114 350.361 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 185.114 350.361 C 185.114 350.368 183.107 426.080 183.107 426.088 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 246.952 492.631 C 247.511 457.458 248.629 387.123 248.630 387.112 C 248.623 387.109 185.120 350.364 185.114 350.361 C 185.114 350.368 183.107 426.080 183.107 426.088 C 183.107 426.091 182.463 446.270 182.142 456.361 C 203.745 468.451 246.945 492.627 246.952 492.631 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#903D2A13-A066-4E5E-9B57-EC5438A5114B_15)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 258.057 215.918 C 259.478 201.060 364.249 147.665 375.921 150.117 C 405.684 156.368 434.511 172.860 450.201 206.678 C 455.517 218.136 340.702 281.146 327.050 279.279 C 318.105 278.055 256.983 227.153 258.057 215.918 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 258.057 215.918 C 292.051 221.297 323.666 263.716 327.050 279.279 C 318.105 278.055 257.185 227.170 258.057 215.918 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#903D2A13-A066-4E5E-9B57-EC5438A5114B_17)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 127.354 293.306 C 124.995 277.676 237.876 220.555 250.505 220.705 C 281.368 221.072 319.258 259.935 319.498 284.066 C 319.616 295.838 220.486 353.074 205.412 352.889 C 187.172 352.666 130.551 314.484 127.354 293.306 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 127.354 293.306 C 161.610 295.063 201.452 333.609 205.151 352.782 C 180.358 350.888 132.832 313.898 127.354 293.306 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":88.355,\\\"y\\\":354.102,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872906762893,\\\"y\\\":0.005041674909603199}},{\\\"point\\\":{\\\"x\\\":693.173,\\\"y\\\":354.102,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872906762896,\\\"y\\\":0.005041674909603181}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":247.593,\\\"y\\\":491.292,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5071357034537672,\\\"y\\\":0.8618662183207164}},{\\\"point\\\":{\\\"x\\\":576.808,\\\"y\\\":526.098,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5071104320054739,\\\"y\\\":0.8618810879414988}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":440.726,\\\"y\\\":642.928,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":39.372,\\\"y\\\":322.356,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":299.127,\\\"max\\\":584.327},\\\"y\\\":{\\\"min\\\":128.118,\\\"max\\\":413.318}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":342.266,\\\"y\\\":75.252,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"903D2A13-A066-4E5E-9B57-EC5438A5114B_0\\\",\\\"x1\\\":\\\"54.58%\\\",\\\"y1\\\":\\\"68.84%\\\",\\\"x2\\\":\\\"6.74%\\\",\\\"y2\\\":\\\"-22.16%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"7.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"903D2A13-A066-4E5E-9B57-EC5438A5114B_9\\\",\\\"x1\\\":\\\"55.19%\\\",\\\"y1\\\":\\\"63.41%\\\",\\\"x2\\\":\\\"-1.22%\\\",\\\"y2\\\":\\\"-31.64%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"7.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"903D2A13-A066-4E5E-9B57-EC5438A5114B_10\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"5.43%\\\",\\\"y2\\\":\\\"-49.46%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"7.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"903D2A13-A066-4E5E-9B57-EC5438A5114B_11\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"22.69%\\\",\\\"y2\\\":\\\"-48.61%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"7.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"903D2A13-A066-4E5E-9B57-EC5438A5114B_13\\\",\\\"x1\\\":\\\"52.88%\\\",\\\"y1\\\":\\\"56.59%\\\",\\\"x2\\\":\\\"26.77%\\\",\\\"y2\\\":\\\"5.80%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"7.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"903D2A13-A066-4E5E-9B57-EC5438A5114B_15\\\",\\\"x1\\\":\\\"51.06%\\\",\\\"y1\\\":\\\"47.52%\\\",\\\"x2\\\":\\\"91.55%\\\",\\\"y2\\\":\\\"133.56%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"7.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"903D2A13-A066-4E5E-9B57-EC5438A5114B_17\\\",\\\"x1\\\":\\\"54.02%\\\",\\\"y1\\\":\\\"43.34%\\\",\\\"x2\\\":\\\"95.35%\\\",\\\"y2\\\":\\\"125.82%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"7.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"bicycle\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":27.213,\\\"max\\\":692.787},\\\"y\\\":{\\\"min\\\":204.025,\\\"max\\\":668.614}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bicycle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bicycle_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 50.891 534.300 C 50.891 473.253 100.138 424.005 161.186 424.005 C 222.234 424.005 271.482 473.252 271.482 534.300 C 271.482 595.348 222.234 644.595 161.186 644.595 C 100.139 644.595 50.891 595.348 50.891 534.300 M 448.596 534.300 C 448.596 473.484 497.656 424.424 558.472 424.424 C 619.288 424.423 668.349 473.484 668.349 534.300 C 668.349 595.116 619.288 644.176 558.472 644.176 C 497.656 644.176 448.596 595.116 448.596 534.300 M 29.213 534.300 C 29.213 461.065 88.293 401.985 161.528 401.985 C 234.763 401.985 293.842 461.065 293.842 534.300 C 293.842 607.535 234.763 666.614 161.528 666.614 C 88.293 666.614 29.213 607.535 29.213 534.300 M 426.158 534.300 C 426.158 461.065 485.237 401.985 558.472 401.985 C 631.707 401.985 690.787 461.065 690.787 534.300 C 690.787 607.535 631.707 666.614 558.472 666.614 C 485.237 666.614 426.158 607.535 426.158 534.300 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 476.249 370.496 C 476.240 370.511 411.407 468.086 379.005 516.850 C 382.628 518.817 361.157 534.129 361.156 534.128 C 294.613 533.909 216.691 534.973 161.528 533.470 C 161.535 533.455 234.465 359.902 234.473 359.885 C 221.608 339.929 208.743 319.973 195.879 300.018 C 195.876 300.018 166.648 301.107 166.645 301.108 C 145.182 305.453 146.512 280.641 157.592 279.295 C 190.355 275.315 277.931 282.349 270.278 294.826 C 266.642 300.753 216.528 300.383 216.523 300.383 C 216.526 300.388 244.001 342.068 244.003 342.072 C 244.025 342.072 462.919 342.072 462.941 342.072 C 462.937 342.063 423.902 249.483 423.898 249.474 C 423.903 249.474 475.324 249.071 475.329 249.071 C 475.330 249.070 488.755 249.988 488.643 236.504 C 488.548 224.989 472.983 223.842 472.981 223.841 C 472.972 223.841 375.433 224.773 375.424 224.773 C 375.423 224.772 371.288 220.069 371.317 215.500 C 371.347 210.799 375.687 206.026 375.687 206.025 C 375.697 206.025 473.431 206.452 473.441 206.452 C 473.444 206.455 505.323 207.246 505.126 239.940 C 504.982 264.012 476.576 265.174 476.573 265.177 C 476.570 265.177 458.484 265.215 449.440 265.234 C 460.071 290.847 481.332 342.064 481.332 342.072 C 481.345 342.086 565.099 532.623 565.109 532.641 C 559.539 534.016 548.456 535.809 548.454 535.809 C 548.447 535.792 476.257 370.513 476.249 370.496 M 353.687 510.014 C 356.651 509.053 363.317 509.822 363.318 509.822 C 396.547 459.583 462.996 359.120 463.006 359.105 C 462.985 359.105 324.317 359.299 254.972 359.396 C 254.982 359.411 320.874 459.949 353.687 510.014 M 338.566 518.388 C 338.566 518.388 185.936 518.388 185.920 518.387 C 185.927 518.373 246.475 375.711 246.481 375.697 C 246.490 375.711 338.557 518.373 338.566 518.388 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 324.440 534.300 C 324.440 513.998 340.817 497.620 361.119 497.620 C 381.421 497.620 397.799 513.998 397.799 534.300 C 397.799 554.602 381.421 570.980 361.119 570.980 C 340.817 570.980 324.440 554.602 324.440 534.300 M 137.247 534.300 C 137.247 521.049 147.936 510.360 161.186 510.360 C 174.437 510.360 185.126 521.049 185.126 534.300 C 185.126 547.550 174.437 558.239 161.186 558.239 C 147.936 558.239 137.247 547.550 137.247 534.300 M 536.533 534.300 C 536.533 522.156 546.329 512.360 558.472 512.360 C 570.616 512.360 580.412 522.156 580.412 534.300 C 580.412 546.443 570.616 556.240 558.472 556.240 C 546.329 556.240 536.533 546.443 536.533 534.300 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":48.712,\\\"max\\\":338.344},\\\"y\\\":{\\\"min\\\":20.989,\\\"max\\\":290.865}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":698.143,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":434.97,\\\"y\\\":189.728,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":29.231,\\\"y\\\":528.262,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875314247056,\\\"y\\\":0.004993695537708548}},{\\\"point\\\":{\\\"x\\\":690.998,\\\"y\\\":528.262,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875314247056,\\\"y\\\":0.004993695537708562}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":618.005,\\\"y\\\":650.783,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7472350463110116,\\\"y\\\":0.6645598434788099}},{\\\"point\\\":{\\\"x\\\":103.108,\\\"y\\\":650.831,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7338320847731824,\\\"y\\\":0.679330899751693}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":363.318,\\\"y\\\":568.763,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"bike_recumbent\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":53.031,\\\"max\\\":666.969},\\\"y\\\":{\\\"min\\\":217.96871302478166,\\\"max\\\":501.999}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bike_recumbent\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bike_recumbent\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 598.787 419.844 C 606.311 419.844 612.379 425.913 612.380 433.436 C 612.380 440.960 606.311 447.029 598.787 447.029 C 591.264 447.029 585.195 440.960 585.195 433.436 C 585.195 425.913 591.264 419.844 598.787 419.844 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 436.864 384.682 C 436.867 384.682 463.734 384.682 463.737 384.682 C 463.737 384.682 463.737 393.894 463.737 393.895 C 463.734 393.895 436.867 393.895 436.864 393.895 C 436.864 393.894 436.864 384.682 436.864 384.682 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 544.025 433.436 C 544.025 403.126 568.477 378.674 598.787 378.674 C 629.098 378.674 653.550 403.126 653.550 433.436 C 653.550 463.747 629.098 488.199 598.787 488.199 C 568.477 488.199 544.025 463.747 544.025 433.436 M 66.658 405.982 C 66.658 360.380 103.446 323.592 149.048 323.592 C 194.650 323.592 231.438 360.380 231.438 405.982 C 231.438 451.584 194.650 488.372 149.048 488.372 C 103.446 488.372 66.658 451.584 66.658 405.982 M 54.031 405.982 C 54.031 353.391 96.457 310.966 149.048 310.966 C 201.639 310.966 244.065 353.391 244.065 405.982 C 244.065 458.573 201.639 500.999 149.048 500.999 C 96.457 500.999 54.031 458.573 54.031 405.982 M 531.606 433.436 C 531.606 396.252 561.603 366.255 598.787 366.255 C 635.972 366.255 665.969 396.252 665.969 433.436 C 665.969 470.621 635.972 500.618 598.787 500.618 C 561.603 500.618 531.606 470.621 531.606 433.436 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 192.278 224.826 C 188.130 220.807 175.312 222.977 175.310 222.977 C 175.317 222.992 248.600 371.577 248.608 371.592 C 248.616 371.591 330.196 356.110 330.205 356.108 C 330.205 356.106 337.379 345.464 333.464 340.084 C 328.530 333.305 265.466 356.221 260.558 354.153 C 250.891 350.079 201.526 233.786 192.278 224.826 M 510.985 342.488 C 510.979 342.489 457.050 353.015 457.045 353.016 C 457.047 353.022 477.437 406.846 477.440 406.851 C 477.444 406.847 520.079 360.613 520.083 360.609 C 520.082 360.607 510.986 342.490 510.985 342.488 M 279.021 420.065 C 279.039 420.064 464.096 411.412 464.114 411.411 C 464.112 411.405 443.359 355.674 443.357 355.668 C 443.340 355.671 276.999 385.290 276.982 385.293 C 276.982 385.296 279.021 420.061 279.021 420.065 M 263.536 419.865 C 263.525 419.864 159.484 412.586 159.899 408.812 C 160.468 403.641 261.544 388.228 261.554 388.226 C 261.555 388.229 263.536 419.862 263.536 419.865 M 144.640 419.533 C 144.640 419.531 145.868 397.303 145.868 397.301 C 145.904 397.295 507.708 331.549 507.745 331.543 C 506.243 324.917 496.219 305.369 493.165 300.957 C 492.316 299.730 473.257 305.259 472.361 304.951 C 468.647 303.675 431.488 231.812 426.454 230.162 C 423.289 229.125 375.308 248.240 373.989 247.256 C 373.756 247.083 371.280 238.287 371.431 237.887 C 372.437 235.226 430.757 218.128 433.223 219.001 C 436.595 220.196 475.820 293.492 479.028 294.585 C 479.806 294.849 498.512 289.847 500.024 290.362 C 509.715 293.657 541.025 386.180 566.236 410.593 C 573.915 418.029 597.947 430.274 602.309 431.724 C 606.419 433.091 603.492 440.025 599.294 438.565 C 595.832 437.360 565.825 425.061 556.656 416.984 C 545.942 407.547 525.737 370.494 525.734 370.489 C 525.729 370.494 478.943 421.453 478.938 421.458 C 478.916 421.459 272.598 435.146 261.995 433.705 C 224.361 428.589 144.651 419.534 144.640 419.533 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 127.920 405.982 C 127.919 394.288 137.353 384.853 149.048 384.853 C 160.742 384.853 170.176 394.288 170.176 405.982 C 170.176 417.677 160.742 427.111 149.048 427.111 C 137.354 427.111 127.920 417.677 127.920 405.982 M 451.755 419.232 C 451.755 405.208 463.069 393.895 477.092 393.895 C 491.116 393.895 502.429 405.208 502.429 419.232 C 502.429 433.256 491.116 444.569 477.092 444.569 C 463.069 444.569 451.755 433.256 451.755 419.232 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 472.754 419.524 C 472.983 414.995 479.885 411.107 482.853 415.677 C 485.225 419.327 500.164 459.915 500.165 459.919 C 500.165 459.919 493.433 460.881 493.433 460.881 C 493.431 460.877 472.469 425.165 472.754 419.524 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 484.221 456.778 C 484.224 456.778 511.091 456.778 511.094 456.778 C 511.094 456.779 511.094 465.990 511.094 465.991 C 511.091 465.991 484.224 465.991 484.221 465.991 C 484.221 465.990 484.221 456.779 484.221 456.778 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":53.653,\\\"y\\\":429.069,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871145956198,\\\"y\\\":0.005076479363376235}},{\\\"point\\\":{\\\"x\\\":666.347,\\\"y\\\":429.069,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871145956198,\\\"y\\\":0.005076479363376247}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":377.034,\\\"y\\\":562.784,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"wildcard\\\":[{\\\"point\\\":{\\\"x\\\":311.519,\\\"y\\\":293.335,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":377.034,\\\"y\\\":501.221,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"bird\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":21.977563146717912,\\\"max\\\":699.2969936609318},\\\"y\\\":{\\\"min\\\":152.13617573340332,\\\"max\\\":569.349258887938}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bird\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bird\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 430.786 427.519 C 398.773 416.491 402.622 398.877 398.210 372.631 C 393.451 408.420 379.892 422.784 382.060 430.053 C 400.332 491.314 428.570 561.865 399.987 549.978 C 385.754 544.060 372.795 474.138 372.792 474.131 C 372.791 474.140 385.120 567.487 360.000 567.848 C 332.253 568.246 347.209 474.140 347.208 474.131 C 347.205 474.138 335.423 541.538 320.013 549.978 C 286.468 568.353 318.877 492.412 338.147 430.180 C 340.150 423.713 325.737 408.767 322.289 373.711 C 322.302 391.683 323.087 418.593 292.734 427.519 C 271.683 433.709 303.073 341.938 303.074 341.930 C 303.068 341.937 283.677 409.765 239.446 414.390 C 220.935 416.325 274.851 322.086 274.855 322.077 C 274.847 322.084 234.835 393.718 193.108 391.993 C 173.991 391.203 242.530 303.187 242.535 303.178 C 242.526 303.184 192.128 370.455 152.176 361.101 C 133.472 356.722 217.043 282.334 217.049 282.327 C 217.039 282.331 151.134 344.994 118.195 326.347 C 102.706 317.579 187.695 262.253 187.702 262.247 C 187.690 262.250 119.202 312.615 75.718 290.822 C 57.730 281.807 164.524 231.361 164.533 231.355 C 164.521 231.355 90.767 261.168 51.005 229.038 C 35.182 216.253 153.831 195.832 153.841 195.829 C 153.828 195.826 75.187 204.864 26.291 164.165 C 2.072 144.005 140.701 157.245 193.661 167.162 C 219.342 171.971 236.245 226.545 254.499 255.802 C 278.525 294.311 315.652 315.984 321.890 307.778 C 326.921 301.160 324.285 288.622 325.626 278.177 C 327.377 264.542 331.832 250.771 342.698 244.192 C 347.169 241.486 359.998 195.519 360.000 195.514 C 360.002 195.519 373.067 242.579 377.302 244.192 C 389.172 248.715 392.840 264.516 394.374 278.177 C 395.564 288.785 392.669 301.502 398.306 307.778 C 404.500 314.673 435.636 295.478 461.210 257.434 C 479.200 230.670 502.183 170.642 527.607 167.162 C 580.990 159.855 719.196 144.005 694.976 164.165 C 646.081 204.864 567.439 195.826 567.427 195.829 C 567.437 195.832 686.086 216.253 670.263 229.038 C 630.501 261.168 556.746 231.355 556.735 231.355 C 556.744 231.361 663.537 281.807 645.549 290.822 C 602.066 312.615 533.577 262.250 533.566 262.247 C 533.573 262.253 618.562 317.579 603.073 326.347 C 570.134 344.994 504.229 282.331 504.219 282.327 C 504.225 282.334 587.796 356.722 569.092 361.101 C 529.140 370.455 478.742 303.184 478.733 303.178 C 478.738 303.187 547.277 391.203 528.160 391.993 C 486.432 393.718 446.421 322.084 446.413 322.077 C 446.417 322.086 500.333 416.325 481.822 414.390 C 437.591 409.765 418.200 341.937 418.194 341.930 C 418.195 341.938 448.357 433.572 430.786 427.519 M 345.845 271.049 C 345.845 263.217 352.163 256.899 359.995 256.899 C 367.827 256.899 374.145 263.217 374.145 271.049 C 374.146 278.882 367.827 285.200 359.995 285.200 C 352.163 285.200 345.845 278.882 345.845 271.049 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":274.104,\\\"max\\\":445.896},\\\"y\\\":{\\\"min\\\":291.18,\\\"max\\\":452.671}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":625.921,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":195.825,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":272.389,\\\"y\\\":450.745,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8634889941550922,\\\"y\\\":0.5043676803414621}},{\\\"point\\\":{\\\"x\\\":447.752,\\\"y\\\":450.745,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8634889941550922,\\\"y\\\":0.5043676803414621}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":597.593,\\\"y\\\":143.999,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.10180240040638461,\\\"y\\\":-0.9948046397516943}},{\\\"point\\\":{\\\"x\\\":123.126,\\\"y\\\":144.416,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.03526448233130761,\\\"y\\\":-0.9993780147101021}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":571.672,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"bitey_half\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":107.953,\\\"max\\\":678.954},\\\"y\\\":{\\\"min\\\":56.39476310497844,\\\"max\\\":656.1838181235288}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bitey_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bitey_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 491.573 447.262 C 491.566 447.264 423.953 464.765 423.946 464.767 C 423.946 464.758 420.634 368.165 420.633 368.155 C 420.640 368.163 491.566 447.254 491.573 447.262 M 376.286 498.308 C 376.280 498.310 308.666 515.812 308.659 515.814 C 308.658 515.804 295.840 415.138 295.839 415.128 C 295.847 415.136 376.278 498.300 376.286 498.308 M 235.045 550.447 C 235.038 550.449 167.232 573.414 167.225 573.416 C 167.225 573.405 159.840 463.232 159.839 463.221 C 159.847 463.229 235.037 550.438 235.045 550.447 M 472.366 265.797 C 472.360 265.795 406.365 242.930 406.359 242.928 C 406.359 242.939 405.061 353.364 405.061 353.375 C 405.068 353.366 472.359 265.806 472.366 265.797 M 353.773 216.561 C 353.767 216.559 287.772 193.696 287.766 193.694 C 287.766 193.705 286.468 304.128 286.467 304.139 C 286.474 304.130 353.766 216.570 353.773 216.561 M 225.528 166.336 C 225.521 166.334 159.527 143.470 159.520 143.468 C 159.520 143.479 158.222 253.903 158.221 253.914 C 158.228 253.906 225.521 166.345 225.528 166.336 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 676.727 60.303 C 676.655 236.297 676.633 467.196 676.954 654.183 C 328.353 654.487 144.620 569.969 144.567 569.960 C 144.612 569.939 594.754 360.021 594.799 360.000 C 594.750 359.979 110.001 150.061 109.953 150.040 C 110.009 150.031 302.892 42.919 676.727 60.303 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 324.997 167.456 C 325.012 167.449 386.368 93.646 477.717 96.046 C 569.066 98.446 626.461 175.370 626.476 175.378 C 626.461 175.385 565.105 249.186 473.756 246.786 C 382.407 244.386 325.012 167.464 324.997 167.456 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 477.301 111.897 C 510.244 112.763 536.122 140.036 535.257 172.979 C 534.391 205.923 507.117 231.801 474.173 230.935 C 441.229 230.069 415.352 202.795 416.218 169.852 C 417.084 136.908 444.358 111.032 477.301 111.897 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":35.846,\\\"max\\\":284.941},\\\"y\\\":{\\\"min\\\":248.808,\\\"max\\\":471.192}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":677.038,\\\"y\\\":360,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":486.997,\\\"y\\\":58.596,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005032371897174836,\\\"y\\\":-0.9999873375363753}},{\\\"point\\\":{\\\"x\\\":486.997,\\\"y\\\":647.649,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.0050325697521896254,\\\"y\\\":0.9999873365406631}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":677.053,\\\"y\\\":360,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"bob\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":147.7893156988312,\\\"max\\\":572.3587333062902},\\\"y\\\":{\\\"min\\\":20.726902607406853,\\\"max\\\":650.7703650366988}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bob\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Bob\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 271.651 539.207 C 271.647 539.211 238.635 573.116 238.631 573.119 C 238.628 573.115 214.605 536.942 206.058 536.530 C 190.161 535.764 157.057 551.757 149.836 584.720 C 148.954 588.745 160.467 628.864 193.118 647.636 C 199.130 651.092 220.325 645.792 225.245 643.174 C 240.420 635.099 285.477 563.311 285.483 563.303 C 285.486 563.306 305.666 590.568 313.148 594.091 C 333.314 603.584 379.969 608.619 405.067 605.692 C 438.767 601.762 467.583 565.074 473.783 557.948 C 483.025 547.325 518.806 477.414 527.774 445.504 C 532.589 428.372 535.805 379.025 535.806 379.019 C 535.807 379.019 544.221 384.677 550.084 381.695 C 561.635 375.823 558.131 343.878 561.240 330.382 C 567.744 302.142 561.869 276.755 570.164 264.343 C 571.470 262.389 566.085 251.733 557.670 242.033 C 556.366 240.530 564.215 232.224 564.363 231.770 C 565.595 227.998 564.143 141.748 559.455 130.034 C 548.811 103.443 505.469 79.172 505.464 79.167 C 505.463 79.164 507.390 65.482 493.416 51.502 C 486.124 44.206 464.027 29.591 452.365 29.638 C 416.516 29.782 407.131 17.685 338.582 25.176 C 332.135 25.880 285.355 25.539 265.404 34.546 C 230.119 50.474 203.329 85.610 191.333 112.186 C 175.685 146.854 181.964 251.835 181.963 251.849 C 181.961 251.851 169.401 263.588 168.576 268.359 C 167.480 274.701 176.940 279.651 178.839 294.685 C 180.607 308.674 180.286 369.262 191.333 383.481 C 193.426 386.175 206.057 391.958 206.058 391.959 C 206.060 391.964 213.155 423.482 220.337 447.288 C 228.820 475.409 271.645 539.198 271.651 539.207 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 192.213 572.790 C 185.637 576.043 170.087 581.010 167.655 577.124 C 165.389 573.503 172.056 562.612 180.657 557.863 C 183.252 556.430 197.500 549.895 200.400 553.047 C 205.291 558.365 198.882 569.492 192.213 572.790 M 175.360 554.010 C 167.412 560.623 151.866 575.622 157.543 585.792 C 163.738 596.888 185.766 587.859 187.398 588.681 C 206.916 598.504 200.784 632.671 212.438 633.464 C 216.436 633.736 221.268 623.057 221.588 619.499 C 222.581 608.451 203.290 580.017 203.289 580.013 C 203.290 580.011 223.246 561.579 209.549 545.343 C 203.142 537.748 189.308 542.404 175.360 554.010 M 390.342 394.636 C 387.218 386.603 388.386 381.821 384.541 379.019 C 383.952 378.589 391.657 369.648 391.681 369.648 C 391.727 369.649 400.616 391.046 400.605 391.066 C 400.600 391.075 393.913 393.743 390.342 394.636 M 501.002 264.789 C 501.001 264.785 491.620 230.469 492.970 221.061 C 494.055 213.502 508.682 187.259 508.587 188.934 C 505.401 245.193 515.455 268.117 515.726 273.267 C 515.913 276.826 517.313 331.324 517.065 331.721 C 517.024 331.786 509.136 337.101 509.034 337.075 C 508.539 336.949 508.587 290.674 508.587 290.669 C 508.586 290.670 500.627 295.481 492.970 296.916 C 491.242 297.240 490.721 292.613 490.739 292.454 C 490.782 292.063 499.609 284.983 499.663 283.976 C 499.818 281.107 483.219 265.413 471.552 263.005 C 456.034 259.801 433.850 268.932 426.485 275.052 C 422.681 278.213 452.812 274.918 472.890 280.407 C 484.726 283.642 494.394 305.163 489.401 315.211 C 488.717 316.586 465.753 315.211 465.751 315.211 C 465.752 315.210 474.114 309.122 473.337 304.948 C 472.423 300.042 460.398 297.363 460.396 297.363 C 460.397 297.364 467.468 299.833 464.859 309.856 C 463.998 313.162 456.828 316.103 456.827 316.104 C 456.826 316.104 446.565 316.104 446.564 316.104 C 446.564 316.105 444.642 324.193 447.010 328.151 C 450.852 334.572 464.476 336.296 464.413 337.075 C 464.372 337.576 453.796 342.842 453.257 342.876 C 451.905 342.961 429.236 335.142 424.700 329.490 C 422.365 326.579 419.599 314.811 420.238 313.872 C 421.028 312.710 440.315 312.980 440.317 312.980 C 440.317 312.979 437.517 308.980 437.194 307.179 C 436.773 304.833 438.532 298.702 438.532 298.701 C 438.529 298.702 410.424 310.748 410.422 310.749 C 410.422 310.748 413.732 300.414 412.652 299.147 C 411.003 297.213 395.805 300.970 394.804 301.824 C 393.346 303.070 388.112 327.256 388.111 327.258 C 388.111 327.256 383.478 301.762 384.988 299.594 C 398.820 279.714 419.581 252.933 432.732 249.618 C 460.308 242.667 481.104 247.881 486.723 250.511 C 488.824 251.494 501.000 264.788 501.002 264.789 M 281.467 312.533 C 280.950 313.366 261.523 314.247 261.388 309.410 C 261.162 301.284 280.127 299.149 280.129 299.147 C 280.128 299.148 277.532 305.054 277.898 307.179 C 278.180 308.820 279.499 314.172 281.467 312.533 M 306.901 291.562 C 299.415 290.279 278.165 290.699 270.759 293.793 C 270.536 293.886 272.376 286.370 272.543 286.207 C 273.147 285.619 298.655 284.417 300.654 285.315 C 301.282 285.597 307.969 290.064 306.901 291.562 M 268.527 265.235 C 261.153 265.105 248.638 272.446 248.002 275.052 C 247.542 276.937 255.748 288.652 256.926 288.885 C 258.228 289.142 267.048 279.286 271.651 278.176 C 277.437 276.781 303.328 280.406 303.331 280.407 C 303.328 280.405 302.964 265.844 268.527 265.235 M 552.316 363.848 C 550.084 348.673 542.500 325.031 542.499 325.028 C 542.499 325.032 539.680 369.553 541.160 370.094 C 541.580 370.248 549.637 374.557 552.316 363.848 M 245.324 298.255 C 239.968 296.469 229.765 293.316 229.707 293.346 C 229.435 293.490 228.575 343.798 236.846 370.094 C 242.804 389.035 259.918 417.758 263.619 418.731 C 268.240 419.946 300.713 400.930 320.734 379.465 C 321.508 378.635 328.307 382.990 329.658 382.142 C 329.711 382.108 321.053 387.859 320.287 390.620 C 319.167 394.660 320.668 404.737 326.534 408.022 C 331.422 410.759 339.179 404.964 341.706 405.345 C 351.455 406.816 357.842 420.383 373.386 419.623 C 382.880 419.159 388.325 408.850 393.912 407.576 C 404.931 405.063 413.708 397.176 416.668 381.695 C 417.262 378.589 431.615 382.861 434.516 383.927 C 448.113 388.919 459.892 411.779 465.751 410.700 C 470.859 409.758 480.029 390.622 480.030 390.620 C 480.032 390.621 489.487 406.198 496.093 405.345 C 500.343 404.796 512.241 381.465 513.942 381.695 C 517.221 382.140 513.008 441.176 514.388 438.811 C 526.990 417.211 532.359 291.856 532.236 290.669 C 532.187 290.199 515.818 239.648 515.280 234.001 C 514.587 226.714 526.356 172.011 523.758 158.146 C 521.979 148.648 502.704 127.325 500.556 111.293 C 499.512 103.506 424.585 155.505 371.601 160.376 C 338.474 163.423 310.001 145.104 286.376 146.990 C 273.115 148.049 239.841 158.408 239.970 160.823 C 241.653 192.357 237.574 261.158 239.524 261.666 C 240.055 261.804 258.459 246.587 261.834 245.602 C 268.221 243.738 300.581 244.095 313.594 250.957 C 328.253 258.686 345.926 281.945 351.076 296.024 C 355.546 308.243 352.411 343.259 351.968 346.892 C 351.530 350.485 341.358 395.134 339.028 395.528 C 335.431 396.137 344.081 321.128 336.351 317.888 C 331.781 315.972 305.724 341.395 297.531 342.430 C 290.706 343.291 260.797 332.719 260.942 331.274 C 261.095 329.740 292.805 334.672 301.546 330.382 C 306.922 327.744 319.108 318.775 318.056 311.641 C 317.034 304.711 297.533 298.702 297.531 298.701 C 297.531 298.702 302.945 302.983 302.885 310.302 C 302.872 311.884 298.497 315.448 297.084 316.104 C 289.089 319.814 255.436 318.392 250.679 314.318 C 248.944 312.833 250.746 300.063 245.324 298.255 M 312.702 398.651 C 310.295 398.650 281.686 422.803 281.467 424.532 C 281.360 425.383 289.064 441.537 291.284 441.934 C 295.512 442.690 307.047 417.059 315.379 412.484 C 315.860 412.220 315.379 398.653 312.702 398.651 M 184.194 263.451 C 179.022 264.076 177.972 268.233 177.501 271.482 C 176.930 275.414 193.351 297.115 196.687 296.916 C 198.011 296.837 205.987 291.078 205.166 287.546 C 204.145 283.156 191.378 265.796 184.194 263.451 M 231.938 428.102 C 228.812 428.988 210.395 369.611 210.074 366.971 C 209.794 364.675 215.389 310.186 215.428 310.749 C 219.106 362.769 227.920 407.118 231.938 428.102 M 379.187 450.858 C 375.169 450.411 363.571 439.704 363.570 439.703 C 363.572 439.702 383.201 428.103 383.203 428.102 C 383.203 428.101 389.231 420.375 389.896 420.070 C 409.253 411.179 429.158 395.085 429.162 395.082 C 429.164 395.086 455.040 433.898 455.042 433.902 C 455.036 433.903 399.849 440.605 394.804 442.380 C 393.330 442.899 384.989 447.287 379.187 450.858 M 406.852 532.068 C 387.965 535.426 355.838 530.551 350.630 535.192 C 346.089 539.237 324.366 583.482 341.259 583.382 C 365.694 583.237 389.861 596.760 402.836 593.198 C 416.805 589.364 450.190 555.329 454.150 549.916 C 460.914 540.669 503.898 448.126 495.201 442.826 C 494.559 442.435 483.780 455.228 481.368 454.874 C 478.763 454.491 473.871 438.528 471.106 437.918 C 464.058 436.363 441.299 471.864 436.748 474.953 C 434.694 476.348 417.350 486.357 415.776 483.877 C 414.976 482.618 421.748 474.674 421.130 473.615 C 420.144 471.923 404.106 477.971 402.836 476.292 C 400.370 473.030 434.455 463.908 433.178 457.105 C 432.610 454.080 420.315 450.204 418.899 449.966 C 415.152 449.334 382.249 457.695 377.402 457.997 C 370.629 458.420 324.638 447.404 318.502 453.535 C 317.466 454.571 315.197 462.727 316.718 463.352 C 324.434 466.522 344.072 473.092 348.398 473.615 C 349.907 473.797 357.989 472.819 360.000 473.169 C 361.493 473.428 366.414 476.236 368.032 476.292 C 370.150 476.364 377.200 472.843 378.741 472.722 C 380.783 472.562 390.280 475.700 393.466 475.399 C 394.667 475.286 396.839 471.554 398.820 473.615 C 401.272 476.165 396.624 479.253 395.697 479.861 C 393.143 481.538 379.696 478.005 376.510 478.523 C 374.848 478.793 369.436 481.810 367.139 482.093 C 363.526 482.538 355.057 477.950 351.522 479.861 C 348.928 481.264 346.078 489.861 346.167 490.124 C 346.639 491.512 399.630 488.185 407.298 489.232 C 409.485 489.530 396.119 501.593 391.234 501.279 C 367.686 499.769 348.625 495.210 345.275 501.279 C 341.452 508.205 351.761 512.411 353.753 513.773 C 358.956 517.330 388.768 510.188 414.883 518.682 C 419.132 520.063 409.059 530.252 406.852 532.068 M 316.272 553.932 C 316.270 553.931 301.994 544.116 301.993 544.115 C 301.995 544.112 325.640 512.438 325.642 512.435 C 325.643 512.436 337.688 526.712 337.689 526.714 C 337.687 526.716 316.274 553.929 316.272 553.932 M 312.702 503.064 C 312.699 503.066 289.947 523.588 289.945 523.590 C 289.943 523.581 254.250 442.738 267.635 438.364 C 271.339 437.154 285.511 446.782 287.714 452.197 C 296.358 473.451 312.699 503.059 312.702 503.064 M 284.591 529.391 C 255.138 482.085 247.549 441.624 248.002 452.197 C 250.022 499.330 277.448 536.075 277.451 536.084 C 277.452 536.083 280.574 533.853 284.591 529.391 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 204.727 376.941 C 200.787 352.571 195.425 334.564 195.424 334.560 C 195.424 334.564 192.600 362.456 195.940 376.941 C 197.993 385.843 205.148 379.544 204.727 376.941 M 540.678 128.338 C 540.676 128.337 530.341 120.586 530.340 120.585 C 530.339 120.586 518.454 130.405 518.453 130.406 C 518.454 130.407 530.791 134.202 532.408 138.158 C 533.933 141.888 528.273 152.629 528.273 152.630 C 528.274 152.631 537.575 157.798 537.576 157.799 C 537.576 157.801 532.409 179.504 532.408 179.506 C 532.409 179.507 539.643 191.392 539.644 191.393 C 539.643 191.395 531.892 205.864 531.891 205.865 C 531.892 205.867 540.430 221.353 541.194 229.123 C 541.899 236.293 537.060 251.862 537.060 251.864 C 537.061 251.866 550.496 265.301 550.497 265.302 C 550.496 265.305 535.881 286.230 539.127 289.077 C 542.955 292.436 562.091 269.360 561.868 267.887 C 561.784 267.328 552.566 260.652 552.565 260.651 C 552.565 260.650 553.082 249.281 553.082 249.280 C 553.081 249.279 544.813 238.944 544.812 238.943 C 544.813 238.940 550.413 204.159 549.981 202.764 C 549.850 202.342 543.263 193.979 543.262 193.978 C 543.263 193.976 551.983 180.850 552.048 176.922 C 552.120 172.567 542.746 157.800 542.745 157.799 C 542.746 157.798 550.015 152.605 549.981 151.596 C 549.930 150.076 537.577 144.361 537.576 144.360 C 537.576 144.359 540.677 128.340 540.678 128.338 M 338.615 71.077 C 347.935 67.122 335.319 46.570 336.930 47.286 C 359.616 57.362 363.091 72.366 363.108 66.319 C 363.139 54.940 359.268 45.900 359.652 46.171 C 380.042 60.547 385.270 81.965 387.111 78.090 C 394.252 63.055 377.262 44.793 378.841 45.604 C 407.215 60.176 408.179 82.419 410.071 80.571 C 421.685 69.238 393.430 46.428 393.759 46.510 C 411.587 50.958 419.682 71.585 422.949 68.132 C 426.011 64.894 402.677 40.061 403.357 40.280 C 427.600 48.105 426.403 59.010 429.358 56.705 C 430.952 55.461 428.042 40.173 428.042 40.171 C 428.045 40.175 452.667 52.045 458.816 73.085 C 461.421 82.003 456.345 116.272 455.679 101.550 C 454.379 72.791 439.323 64.393 441.550 69.570 C 453.146 96.530 441.885 121.658 441.872 120.738 C 441.605 101.724 431.820 67.171 424.058 80.504 C 422.863 82.556 425.827 90.309 420.597 107.914 C 420.489 108.278 418.091 95.006 412.019 91.930 C 408.144 89.968 410.252 100.710 404.306 117.292 C 404.176 117.657 397.018 83.364 388.943 81.700 C 387.357 81.373 381.807 102.404 381.807 102.406 C 381.804 102.403 363.812 67.674 355.580 72.549 C 347.887 77.106 362.280 85.306 366.099 108.164 C 367.151 114.463 348.953 81.301 326.553 78.885 C 323.191 78.522 330.216 103.693 330.216 103.696 C 330.214 103.694 307.570 80.924 304.174 83.122 C 302.952 83.914 303.038 95.014 303.038 95.016 C 303.036 95.014 287.912 78.092 284.172 80.113 C 282.381 81.081 282.427 91.491 282.427 91.492 C 282.425 91.491 260.568 81.773 260.566 81.772 C 260.567 81.771 269.657 68.549 271.381 68.284 C 272.830 68.061 283.094 76.332 283.703 75.992 C 284.533 75.529 280.995 56.354 280.994 56.352 C 280.996 56.354 294.032 62.923 298.102 70.729 C 308.533 90.740 301.911 59.841 302.211 59.873 C 318.833 61.667 323.678 77.294 324.092 72.694 C 325.712 54.693 310.534 49.328 311.835 49.492 C 334.715 52.371 326.198 58.641 338.615 71.077 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 456.708 298.419 C 458.270 298.419 459.531 299.679 459.531 301.241 C 459.531 302.803 458.270 304.063 456.708 304.063 C 455.146 304.063 453.886 302.803 453.886 301.241 C 453.886 299.679 455.146 298.419 456.708 298.419 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 293.006 298.419 C 294.568 298.419 295.828 299.679 295.828 301.241 C 295.828 302.803 294.568 304.063 293.006 304.063 C 291.444 304.063 290.184 302.803 290.184 301.241 C 290.184 299.679 291.444 298.419 293.006 298.419 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":135.766,\\\"max\\\":219.517},\\\"y\\\":{\\\"min\\\":486.121,\\\"max\\\":569.872}},{\\\"x\\\":{\\\"min\\\":80.371,\\\"max\\\":164.122},\\\"y\\\":{\\\"min\\\":423.544,\\\"max\\\":507.296}},{\\\"x\\\":{\\\"min\\\":109.095,\\\"max\\\":192.846},\\\"y\\\":{\\\"min\\\":356.865,\\\"max\\\":440.616}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":386.672,\\\"y\\\":684.905,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":367.181,\\\"y\\\":22.451,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":180.029,\\\"y\\\":337.34,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872880189178,\\\"y\\\":0.005042201956497622}},{\\\"point\\\":{\\\"x\\\":562.54,\\\"y\\\":337.34,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872861335325,\\\"y\\\":0.005042575858889182}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":447.043,\\\"y\\\":586.369,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128848469533575,\\\"y\\\":0.701281109815663}},{\\\"point\\\":{\\\"x\\\":303.418,\\\"y\\\":586.448,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987045947950982,\\\"y\\\":0.7154102943152396}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":541.254,\\\"y\\\":105.906,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314269801987523,\\\"y\\\":-0.7754353413902958}},{\\\"point\\\":{\\\"x\\\":196.976,\\\"y\\\":105.985,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817526600083252,\\\"y\\\":-0.7315827434894654}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":386.672,\\\"y\\\":608.989,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"bone\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":10.228,\\\"max\\\":709.772},\\\"y\\\":{\\\"min\\\":277.113,\\\"max\\\":442.887}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bone\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bone\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 707.772 327.640 C 707.772 339.995 703.188 351.252 695.473 360.028 C 703.188 368.749 707.772 380.006 707.772 392.361 C 707.772 419.220 686.105 440.887 659.246 440.887 C 638.027 440.887 620.049 427.364 613.484 408.586 C 453.466 408.509 236.278 408.497 106.541 408.514 C 99.951 427.364 81.973 440.887 60.755 440.887 C 33.896 440.887 12.228 419.220 12.228 392.361 C 12.228 380.005 21.452 365.022 24.527 360.028 C 24.527 360.028 12.228 339.995 12.228 327.640 C 12.228 300.781 33.895 279.113 60.755 279.113 C 81.973 279.113 101.185 298.008 106.516 311.414 C 106.293 311.352 506.282 311.445 613.459 311.486 C 620.049 292.636 638.027 279.113 659.246 279.113 C 686.105 279.113 707.772 300.781 707.772 327.640 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 106.516 311.414 C 107.798 314.910 109.383 319.653 109.689 324.640 M 613.484 408.586 C 611.675 403.413 610.719 398.001 610.719 392.361 M 707.772 327.640 C 707.772 339.995 703.188 351.252 695.473 360.028 C 703.188 368.749 707.772 380.006 707.772 392.361 C 707.772 419.220 686.105 440.887 659.246 440.887 C 638.027 440.887 620.049 427.364 613.484 408.586 C 453.466 408.509 236.278 408.497 106.541 408.514 C 108.325 403.413 109.281 398.001 109.281 392.361 M 659.246 279.113 C 686.105 279.113 707.772 300.781 707.772 327.640 M 613.459 311.486 C 620.049 292.636 638.027 279.113 659.246 279.113 M 610.719 327.640 C 610.719 321.999 611.675 316.588 613.459 311.486 C 506.282 311.445 106.293 311.352 106.516 311.414 C 101.185 298.008 81.973 279.113 60.755 279.113 C 33.895 279.113 12.228 300.781 12.228 327.640 C 12.228 339.995 24.527 360.028 24.527 360.028 C 21.452 365.022 12.228 380.005 12.228 392.361 C 12.228 419.220 33.896 440.887 60.755 440.887 C 81.973 440.887 99.951 427.364 106.541 408.514 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":463.363,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.028,\\\"y\\\":310.444,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":22.878,\\\"y\\\":360.022,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871108245132,\\\"y\\\":0.005077222158086315}},{\\\"point\\\":{\\\"x\\\":697.122,\\\"y\\\":360.022,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871108245132,\\\"y\\\":0.005077222158086283}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":207.62,\\\"y\\\":408.811,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.41188905377791835,\\\"y\\\":0.9112340025360833}},{\\\"point\\\":{\\\"x\\\":513.085,\\\"y\\\":408.995,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.4300255588472731,\\\"y\\\":0.9028167138118848}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":207.701,\\\"y\\\":311.272,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.3903614561876011,\\\"y\\\":-0.9206616824453463}},{\\\"point\\\":{\\\"x\\\":512.858,\\\"y\\\":311.376,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.32811797393886555,\\\"y\\\":-0.9446367530316898}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":407.318,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"bone_vertical\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":279.785,\\\"max\\\":440.215},\\\"y\\\":{\\\"min\\\":8.422,\\\"max\\\":684.992}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bone_vertical\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bone\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 328.709 10.422 C 340.656 10.422 351.541 14.855 360.027 22.315 C 368.460 14.855 379.345 10.422 391.292 10.422 C 417.264 10.422 438.215 31.374 438.215 57.345 C 438.215 77.863 425.139 95.248 406.982 101.596 C 406.907 256.328 406.895 466.342 406.912 591.794 C 425.139 598.166 438.215 615.551 438.215 636.068 C 438.215 662.040 417.264 682.992 391.292 682.992 C 379.345 682.992 364.856 674.072 360.027 671.099 C 360.027 671.099 340.656 682.992 328.709 682.992 C 302.737 682.992 281.785 662.040 281.785 636.068 C 281.785 615.550 300.055 596.974 313.019 591.818 C 312.959 592.034 313.048 205.256 313.088 101.620 C 294.861 95.248 281.785 77.863 281.785 57.345 C 281.785 31.373 302.737 10.422 328.709 10.422 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 313.019 591.818 C 316.399 590.579 320.985 589.046 325.808 588.750 M 406.982 101.596 C 401.979 103.345 396.746 104.269 391.292 104.269 M 328.709 10.422 C 340.656 10.422 351.541 14.855 360.027 22.315 C 368.460 14.855 379.345 10.422 391.292 10.422 C 417.264 10.422 438.215 31.374 438.215 57.345 C 438.215 77.863 425.139 95.248 406.982 101.596 C 406.907 256.328 406.895 466.342 406.912 591.794 C 401.979 590.069 396.746 589.145 391.292 589.145 M 281.785 57.345 C 281.785 31.373 302.737 10.422 328.709 10.422 M 313.088 101.620 C 294.861 95.248 281.785 77.863 281.785 57.345 M 328.709 104.269 C 323.255 104.269 318.022 103.345 313.088 101.620 C 313.048 205.256 312.959 592.034 313.019 591.818 C 300.055 596.974 281.785 615.550 281.785 636.068 C 281.785 662.040 302.737 682.992 328.709 682.992 C 340.656 682.992 360.027 671.099 360.027 671.099 C 364.856 674.072 379.345 682.992 391.292 682.992 C 417.264 682.992 438.215 662.040 438.215 636.068 C 438.215 615.551 425.139 598.166 406.912 591.794 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":703.811,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":10.703,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":312.186,\\\"y\\\":347.301,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874096318919,\\\"y\\\":0.005018025278816422}},{\\\"point\\\":{\\\"x\\\":407.814,\\\"y\\\":347.301,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874096318919,\\\"y\\\":0.005018025278816422}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":296.421,\\\"y\\\":671.926,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.688666645561968,\\\"y\\\":0.7250781001315838}},{\\\"point\\\":{\\\"x\\\":423.579,\\\"y\\\":671.926,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.688666645561968,\\\"y\\\":0.7250781001315838}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":292.463,\\\"y\\\":24.854,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6826591107310991,\\\"y\\\":-0.7307369831449788}},{\\\"point\\\":{\\\"x\\\":427.537,\\\"y\\\":24.854,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6826591107310991,\\\"y\\\":-0.7307369831449788}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.973,\\\"y\\\":670.187,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\"]}},{\\\"name\\\":\\\"book_open\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":18.606,\\\"max\\\":701.394},\\\"y\\\":{\\\"min\\\":125.96184181236494,\\\"max\\\":550.511}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"book_open\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"book\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#7C5CE3FA-9701-4637-B003-15005D1A2706_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 643.669 176.090 C 643.675 176.127 700.388 546.638 700.394 546.675 C 700.362 546.675 379.946 549.511 379.914 549.511 C 379.912 549.510 370.858 540.264 360.885 540.058 C 350.161 539.836 340.088 549.510 340.086 549.511 C 340.054 549.511 19.638 546.675 19.606 546.675 C 19.611 546.638 76.325 176.127 76.331 176.090 C 76.387 176.090 453.244 177.691 643.669 176.090 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#7C5CE3FA-9701-4637-B003-15005D1A2706_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.885 155.948 C 361.553 157.065 324.081 125.704 283.356 127.001 C 230.014 128.700 239.241 145.771 185.580 151.937 C 146.728 156.401 112.533 151.026 112.526 151.026 C 112.521 151.062 68.675 505.596 68.671 505.632 C 68.679 505.632 108.676 513.914 154.904 511.787 C 193.989 509.989 213.016 487.244 267.859 490.047 C 314.062 492.409 355.581 511.895 360.885 517.202 C 360.983 516.015 360.885 155.984 360.885 155.948 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 112.526 151.026 C 112.521 151.062 68.675 505.596 68.671 505.632 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"url(#7C5CE3FA-9701-4637-B003-15005D1A2706_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 112.526 151.026 C 112.521 151.062 68.675 505.596 68.671 505.632 C 58.589 515.346 48.507 525.060 38.425 534.775 C 38.430 534.738 88.707 172.214 88.707 172.213 C 88.710 172.210 102.859 155.437 112.526 151.026 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 38.425 534.775 C 48.507 525.060 58.589 515.346 68.671 505.632 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 68.671 505.632 C 68.679 505.632 108.676 513.914 154.904 511.787 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 154.904 511.787 C 193.989 509.989 213.016 487.244 267.859 490.047 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 267.859 490.047 C 314.062 492.409 355.581 511.895 360.885 517.202 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"url(#7C5CE3FA-9701-4637-B003-15005D1A2706_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 151.762 539.432 C 106.340 540.116 38.437 534.775 38.425 534.775 C 48.507 525.060 58.589 515.346 68.671 505.632 C 68.679 505.632 108.676 513.914 154.904 511.787 C 193.989 509.989 213.016 487.244 267.859 490.047 C 314.062 492.409 355.581 511.895 360.885 517.202 C 342.717 517.202 334.067 536.091 334.064 536.093 C 334.057 536.093 291.298 531.528 262.634 531.551 C 218.120 531.588 196.270 538.762 151.762 539.432 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2_2\\\",\\\"fill\\\":\\\"url(#7C5CE3FA-9701-4637-B003-15005D1A2706_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.872 155.948 C 360.204 157.065 397.675 125.704 438.401 127.001 C 491.743 128.700 482.516 145.771 536.176 151.937 C 575.029 156.401 609.224 151.026 609.231 151.026 C 609.235 151.062 653.081 505.596 653.086 505.632 C 653.077 505.632 613.081 513.914 566.853 511.787 C 527.767 509.989 508.740 487.244 453.898 490.047 C 407.694 492.409 366.175 511.895 360.872 517.202 C 360.774 516.015 360.872 155.984 360.872 155.948 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 609.231 151.026 C 609.235 151.062 653.081 505.596 653.086 505.632 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_2\\\",\\\"fill\\\":\\\"url(#7C5CE3FA-9701-4637-B003-15005D1A2706_5)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 609.231 151.026 C 609.235 151.062 653.081 505.596 653.086 505.632 C 663.167 515.346 673.249 525.060 683.331 534.775 C 683.326 534.738 633.049 172.214 633.049 172.213 C 633.047 172.210 618.898 155.437 609.231 151.026 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 683.331 534.775 C 673.249 525.060 663.167 515.346 653.086 505.632 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 653.086 505.632 C 653.077 505.632 613.081 513.914 566.853 511.787 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 566.853 511.787 C 527.767 509.989 508.740 487.244 453.898 490.047 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 453.898 490.047 C 407.694 492.409 366.175 511.895 360.872 517.202 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5_2\\\",\\\"fill\\\":\\\"url(#7C5CE3FA-9701-4637-B003-15005D1A2706_6)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 569.995 539.432 C 615.416 540.116 683.320 534.775 683.331 534.775 C 673.249 525.060 663.167 515.346 653.086 505.632 C 653.077 505.632 613.081 513.914 566.853 511.787 C 527.767 509.989 508.740 487.244 453.898 490.047 C 407.694 492.409 366.175 511.895 360.872 517.202 C 379.039 517.202 387.690 536.091 387.692 536.093 C 387.700 536.093 430.459 531.528 459.122 531.551 C 503.636 531.588 525.486 538.762 569.995 539.432 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":121.499,\\\"max\\\":598.246},\\\"y\\\":{\\\"min\\\":172.021,\\\"max\\\":471.71}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":568.18,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":106.397,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":51.203,\\\"y\\\":342.156,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987318128134,\\\"y\\\":0.005036227050266385}},{\\\"point\\\":{\\\"x\\\":669.843,\\\"y\\\":342.156,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873181281341,\\\"y\\\":0.005036227050266362}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":593.334,\\\"y\\\":546.348,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129329685826609,\\\"y\\\":0.7012321885851466}},{\\\"point\\\":{\\\"x\\\":127.799,\\\"y\\\":546.396,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987254201015096,\\\"y\\\":0.7153899547127908}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":489.047,\\\"y\\\":138.07,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314899567256504,\\\"y\\\":-0.7753840561648375}},{\\\"point\\\":{\\\"x\\\":232.731,\\\"y\\\":138.149,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817057769918454,\\\"y\\\":-0.7316264303699971}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":535.551,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"7C5CE3FA-9701-4637-B003-15005D1A2706_0\\\",\\\"x1\\\":\\\"49.83%\\\",\\\"y1\\\":\\\"-29.96%\\\",\\\"x2\\\":\\\"49.83%\\\",\\\"y2\\\":\\\"139.94%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"7C5CE3FA-9701-4637-B003-15005D1A2706_1\\\",\\\"x1\\\":\\\"-12.57%\\\",\\\"y1\\\":\\\"45.57%\\\",\\\"x2\\\":\\\"109.64%\\\",\\\"y2\\\":\\\"51.50%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"28.24%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"74.51%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"7C5CE3FA-9701-4637-B003-15005D1A2706_2\\\",\\\"x1\\\":\\\"110.27%\\\",\\\"y1\\\":\\\"47.04%\\\",\\\"x2\\\":\\\"-34.92%\\\",\\\"y2\\\":\\\"43.02%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"61.18%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"7C5CE3FA-9701-4637-B003-15005D1A2706_3\\\",\\\"x1\\\":\\\"58.45%\\\",\\\"y1\\\":\\\"-31.17%\\\",\\\"x2\\\":\\\"62.49%\\\",\\\"y2\\\":\\\"211.42%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"63.92%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"7C5CE3FA-9701-4637-B003-15005D1A2706_4\\\",\\\"x1\\\":\\\"113.86%\\\",\\\"y1\\\":\\\"44.41%\\\",\\\"x2\\\":\\\"-12.19%\\\",\\\"y2\\\":\\\"51.55%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"28.24%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"74.51%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"7C5CE3FA-9701-4637-B003-15005D1A2706_5\\\",\\\"x1\\\":\\\"-26.61%\\\",\\\"y1\\\":\\\"46.45%\\\",\\\"x2\\\":\\\"136.78%\\\",\\\"y2\\\":\\\"42.22%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"61.18%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"7C5CE3FA-9701-4637-B003-15005D1A2706_6\\\",\\\"x1\\\":\\\"58.45%\\\",\\\"y1\\\":\\\"-31.17%\\\",\\\"x2\\\":\\\"52.51%\\\",\\\"y2\\\":\\\"234.38%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"63.92%\\\",\\\"color\\\":\\\"#ffffff\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"bottle\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":268.468,\\\"max\\\":451.532},\\\"y\\\":{\\\"min\\\":32.073,\\\"max\\\":627.004}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bottle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bottle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 336.103 34.073 C 336.108 34.073 383.892 34.073 383.897 34.073 C 383.897 34.077 380.786 79.561 380.786 79.565 C 380.782 79.565 339.218 79.565 339.214 79.565 C 339.214 79.561 336.103 34.077 336.103 34.073 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 379.066 60.598 C 379.067 60.599 391.189 59.004 393.541 71.676 C 396.403 87.094 383.381 91.385 383.380 91.387 C 383.380 91.399 384.555 186.566 384.963 209.372 C 385.361 231.609 449.532 270.218 449.532 328.957 C 449.532 436.396 449.532 485.095 449.532 597.554 C 449.532 616.070 384.588 625.004 360.000 625.004 C 335.412 625.004 270.468 616.070 270.468 597.554 C 270.468 485.095 270.468 436.396 270.468 328.957 C 270.468 270.218 334.942 231.847 335.037 209.372 C 335.129 187.481 336.620 91.399 336.620 91.387 C 336.619 91.385 323.597 87.094 326.459 71.676 C 328.811 59.004 340.934 60.598 340.934 60.598 C 337.169 60.408 359.998 60.598 360.000 60.598 C 360.000 60.598 379.064 60.598 379.066 60.598 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 288.374 346.864 C 288.382 346.864 332.889 351.755 360.000 351.755 C 387.111 351.755 431.618 346.864 431.626 346.864 C 431.626 346.885 431.626 561.719 431.626 561.740 C 431.618 561.741 404.646 570.103 360.000 570.103 C 315.354 570.103 288.382 561.741 288.374 561.740 C 288.374 561.719 288.374 346.885 288.374 346.864 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":296.855,\\\"max\\\":423.145},\\\"y\\\":{\\\"min\\\":359.3,\\\"max\\\":555.5}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.17,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":35.038,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":270.072,\\\"y\\\":454.052,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872379918523,\\\"y\\\":0.005052113758280732}},{\\\"point\\\":{\\\"x\\\":449.928,\\\"y\\\":454.052,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872379918523,\\\"y\\\":0.005052113758280732}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":444.025,\\\"y\\\":605.064,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129029137746393,\\\"y\\\":0.7012627435787739}},{\\\"point\\\":{\\\"x\\\":275.667,\\\"y\\\":605.141,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987302151607616,\\\"y\\\":0.7153852713198643}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":386.798,\\\"y\\\":218.127,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314679360681299,\\\"y\\\":-0.7754019897561886}},{\\\"point\\\":{\\\"x\\\":333.732,\\\"y\\\":218.189,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6816955694711679,\\\"y\\\":-0.7316359412736502}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":621.343,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"box\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":77.651,\\\"max\\\":642.348},\\\"y\\\":{\\\"min\\\":336.542,\\\"max\\\":600.848}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"box\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"box\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 159.751 398.599 C 159.757 398.593 219.856 338.548 219.862 338.542 C 219.862 338.548 219.862 378.555 219.862 398.562 C 219.856 398.562 159.757 398.599 159.751 398.599 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 500.174 338.542 C 500.174 338.548 500.174 378.554 500.174 398.560 C 500.180 398.560 560.243 398.599 560.249 398.599 C 560.243 398.593 500.180 338.548 500.174 338.542 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 500.174 338.542 C 500.174 338.548 500.174 378.554 500.174 398.560 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 219.862 398.562 C 219.862 378.555 219.862 338.548 219.862 338.542 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 500.174 338.542 C 500.174 338.548 500.174 378.554 500.174 398.560 C 500.146 398.560 219.890 398.562 219.862 398.562 C 219.862 378.555 219.862 338.548 219.862 338.542 C 219.890 338.542 500.146 338.542 500.174 338.542 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 159.751 398.599 C 159.757 398.599 219.856 398.562 219.862 398.562 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 219.862 398.562 C 219.890 398.562 500.146 398.560 500.174 398.560 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 500.174 398.560 C 500.180 398.560 560.243 398.599 560.249 398.599 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 159.751 398.599 C 159.757 398.599 219.856 398.562 219.862 398.562 C 219.890 398.562 500.146 398.560 500.174 398.560 C 500.180 398.560 560.243 398.599 560.249 398.599 C 560.249 398.619 560.249 598.828 560.249 598.848 C 560.209 598.848 159.791 598.848 159.751 598.848 C 159.751 598.828 159.751 398.619 159.751 398.599 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 560.249 398.599 C 560.243 398.599 500.180 398.560 500.174 398.560 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 500.174 398.560 C 500.146 398.560 219.890 398.562 219.862 398.562 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 219.862 398.562 C 219.856 398.562 159.757 398.599 159.751 398.599 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 601.801 460.241 C 601.797 460.235 574.100 419.146 560.249 398.599 C 560.243 398.599 500.180 398.560 500.174 398.560 C 500.146 398.560 219.890 398.562 219.862 398.562 C 219.856 398.562 159.757 398.599 159.751 398.599 C 145.900 419.146 118.202 460.235 118.198 460.241 C 118.247 460.241 601.753 460.241 601.801 460.241 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 159.751 398.599 C 159.757 398.593 219.856 338.548 219.862 338.542 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 79.651 418.624 C 79.659 418.622 159.743 398.601 159.751 398.599 C 159.757 398.593 219.856 338.548 219.862 338.542 C 219.856 338.544 159.757 358.547 159.751 358.549 C 159.743 358.555 79.659 418.618 79.651 418.624 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 560.249 398.599 C 560.243 398.593 500.180 338.548 500.174 338.542 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 560.249 398.599 C 560.243 398.593 500.180 338.548 500.174 338.542 C 500.180 338.544 560.243 358.547 560.249 358.549 C 560.257 358.555 640.340 418.618 640.348 418.624 C 640.340 418.622 560.257 398.601 560.249 398.599 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":179.776,\\\"max\\\":540.224},\\\"y\\\":{\\\"min\\\":38.151,\\\"max\\\":398.599}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":687.455,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":156.244,\\\"y\\\":500.387,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872629045474,\\\"y\\\":0.005047180269370496}},{\\\"point\\\":{\\\"x\\\":563.756,\\\"y\\\":500.387,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872629045474,\\\"y\\\":0.005047180269370496}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":557.892,\\\"y\\\":597.882,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129170146645447,\\\"y\\\":0.7012484083417183}},{\\\"point\\\":{\\\"x\\\":161.945,\\\"y\\\":597.923,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987415966663524,\\\"y\\\":0.7153741546129245}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.044,\\\"y\\\":37.693,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.004988786374803474,\\\"y\\\":-0.9999875559278258}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"brain\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":45.23228568973465,\\\"max\\\":676.4061866210964},\\\"y\\\":{\\\"min\\\":63.10568496775052,\\\"max\\\":650.9201711107596}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"brain\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"brain\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"url(#4FC72096-91A5-4539-9F0C-B6C88B26F712_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 344.637 411.742 C 380.551 410.288 457.443 410.176 457.456 410.175 C 478.097 459.223 486.841 536.229 502.114 649.917 C 483.433 650.002 438.660 648.350 438.653 648.350 C 422.875 569.044 416.436 507.294 344.637 411.742 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#4FC72096-91A5-4539-9F0C-B6C88B26F712_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 496.854 370.218 C 562.394 370.218 598.929 409.956 598.929 448.704 C 598.929 487.453 562.394 527.191 496.854 527.191 C 431.314 527.191 394.779 487.453 394.779 448.704 C 394.779 409.956 431.314 370.218 496.854 370.218 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#4FC72096-91A5-4539-9F0C-B6C88B26F712_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 421.950 436.396 C 450.555 455.005 467.607 438.716 474.284 435.219 C 487.423 441.430 497.524 437.868 503.133 438.771 C 534.190 443.771 542.157 429.700 545.436 434.631 C 551.022 438.713 557.433 437.888 575.426 438.748 C 585.625 452.186 646.625 462.751 658.338 422.871 C 671.657 401.054 675.782 378.223 674.215 354.660 C 680.474 313.215 660.827 282.336 644.225 252.931 C 642.237 223.974 632.464 220.006 622.468 208.240 C 611.296 162.104 598.866 161.934 584.834 151.789 C 584.832 151.786 575.304 132.406 568.957 121.800 C 552.250 111.212 543.708 102.813 528.971 102.395 C 519.104 91.632 497.817 83.025 482.517 78.286 C 463.442 69.533 441.939 66.599 423.714 68.877 C 395.619 59.291 365.505 67.113 365.499 67.113 C 365.491 67.113 313.914 58.624 287.879 71.229 C 252.834 72.672 234.913 81.464 209.671 98.279 C 197.846 96.794 163.110 111.023 157.924 123.564 C 125.990 139.134 93.523 151.865 70.308 196.479 C 50.612 205.027 35.400 259.199 56.195 291.740 C 57.206 330.516 84.884 337.310 112.058 360.540 C 129.626 375.558 162.036 362.892 162.041 362.892 C 162.043 362.897 148.074 394.381 184.386 413.462 C 200.098 442.802 234.951 438.157 234.956 438.160 C 253.693 455.502 264.446 451.000 276.707 447.568 C 313.068 463.639 346.762 443.817 369.027 431.103 C 392.622 447.941 421.944 436.395 421.950 436.396 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.573 122.388 C 314.145 108.667 306.892 111.411 299.052 105.923 M 490.749 102.983 C 494.473 102.395 498.198 101.807 501.922 101.219 M 436.063 95.926 C 435.279 92.986 434.495 90.046 433.711 87.106 M 380.200 81.814 C 389.164 77.603 403.719 83.578 403.721 83.578 C 403.724 83.577 413.818 75.412 430.770 77.697 M 404.748 113.454 C 395.585 101.143 385.834 99.417 375.495 97.690 M 350.677 113.550 C 353.059 96.632 347.270 91.224 347.270 91.222 C 347.271 91.221 356.625 85.765 361.383 82.990 M 224.960 148.261 C 230.989 166.458 239.947 175.212 253.185 179.426 C 270.650 154.525 291.988 130.626 322.573 122.388 C 331.044 119.724 350.674 113.551 350.677 113.550 C 354.849 113.735 359.774 113.954 364.323 114.155 M 89.713 284.684 C 80.501 276.255 71.259 258.732 70.896 239.994 M 97.946 244.110 C 85.437 255.331 89.713 284.680 89.713 284.684 C 94.132 303.676 109.249 308.169 115.586 309.381 M 176.153 294.093 C 176.149 294.087 140.393 276.594 133.227 238.230 C 130.625 224.297 108.530 228.429 96.181 223.529 M 180.085 195.026 C 164.265 199.131 160.753 210.323 152.632 212.356 C 134.242 216.960 137.505 188.818 79.717 202.948 M 185.562 179.426 C 185.561 179.428 180.677 183.030 180.085 195.026 C 180.942 210.466 181.445 225.401 204.379 242.934 M 219.668 111.215 C 213.395 107.687 209.475 104.159 192.030 112.979 M 157.924 123.564 C 151.260 134.736 157.969 137.128 137.931 157.082 M 260.830 110.627 C 260.826 110.627 241.552 102.049 219.668 111.215 C 175.820 129.580 172.878 173.875 156.160 178.251 C 148.308 180.306 135.103 166.254 113.822 168.842 M 282.587 92.398 C 282.585 92.400 260.640 110.364 260.830 110.627 C 267.823 120.294 266.318 125.132 269.062 132.384 M 315.517 82.402 C 301.989 95.339 300.708 84.000 282.587 92.398 C 277.744 88.803 277.297 82.990 263.182 88.870 M 287.879 71.229 C 296.926 74.886 311.931 76.733 315.517 82.402 C 318.431 79.098 320.735 73.748 326.101 71.817 M 113.052 321.520 C 113.052 321.521 103.549 323.393 110.882 334.079 C 124.105 353.349 133.619 349.367 144.988 357.012 M 162.041 362.892 C 162.036 362.892 129.626 375.558 112.058 360.540 C 84.884 337.310 57.206 330.516 56.195 291.740 C 35.400 259.199 50.612 205.027 70.308 196.479 C 93.523 151.865 125.990 139.134 157.924 123.564 C 163.110 111.023 197.846 96.794 209.671 98.279 C 234.913 81.464 252.834 72.672 287.879 71.229 C 313.914 58.624 365.491 67.113 365.499 67.113 C 365.505 67.113 395.619 59.291 423.714 68.877 C 441.939 66.599 463.442 69.533 482.517 78.286 C 488.595 85.550 490.748 102.980 490.749 102.983 C 490.744 102.982 459.676 90.570 436.063 95.926 C 436.059 95.928 413.985 108.334 404.748 113.454 C 404.747 113.456 401.655 127.237 400.201 133.717 C 346.597 143.611 322.475 182.958 305.520 237.641 M 146.025 325.051 C 150.384 331.588 140.629 332.833 159.100 344.663 M 172.377 333.959 C 163.810 331.063 146.028 325.052 146.025 325.051 C 146.022 325.051 113.055 321.520 113.052 321.520 C 113.047 321.515 74.055 332.188 66.780 272.924 M 195.731 314.463 C 179.491 313.847 137.359 314.004 114.410 258.223 M 215.945 287.015 C 200.721 273.301 182.406 271.838 170.273 245.874 M 239.661 271.747 C 226.096 255.282 230.840 228.238 230.840 228.233 C 230.874 201.400 198.153 210.351 218.492 169.430 M 644.225 324.082 C 643.833 328.002 643.441 331.922 643.049 335.843 M 647.165 279.392 C 649.517 301.741 644.225 324.077 644.225 324.082 C 659.304 331.587 654.026 355.836 658.926 371.713 M 476.637 231.761 C 473.333 199.852 458.212 205.104 448.999 191.775 M 507.802 184.131 C 514.074 183.151 516.969 178.008 526.619 181.190 M 493.101 175.898 C 503.011 176.739 507.800 184.130 507.802 184.131 C 507.801 184.132 502.235 190.949 501.334 198.244 M 622.102 310.835 C 633.593 301.334 637.439 288.893 635.405 273.511 M 614.824 351.131 C 614.824 351.128 632.687 345.530 622.102 310.835 C 615.878 306.271 610.121 301.150 602.475 296.445 C 602.475 284.906 611.295 272.340 602.475 257.046 C 614.172 245.328 619.332 248.226 624.232 253.518 M 639.542 363.129 C 640.907 357.170 642.272 351.211 643.637 345.251 M 592.478 359.364 C 592.481 359.363 601.885 355.248 614.824 351.131 C 621.992 354.611 639.539 363.128 639.542 363.129 C 650.859 385.088 647.368 398.645 651.282 416.403 M 545.436 393.469 C 547.788 402.290 550.140 411.110 552.492 419.931 M 555.238 378.769 C 573.862 380.764 603.057 378.180 610.120 384.649 C 633.811 402.383 618.352 417.579 622.468 434.044 M 457.820 347.603 C 455.672 364.290 461.935 376.413 468.992 381.709 C 502.249 375.879 504.267 399.349 545.436 393.469 C 548.279 389.206 555.237 378.771 555.238 378.769 C 573.729 351.115 573.071 325.851 573.073 325.846 C 582.828 332.420 587.488 330.924 593.067 329.962 M 503.133 438.771 C 512.448 435.191 516.747 429.167 523.679 419.931 M 474.284 435.219 C 487.423 441.430 497.524 437.868 503.133 438.771 C 534.190 443.771 542.157 429.700 545.436 434.631 C 551.022 438.713 557.433 437.888 575.426 438.748 C 587.754 427.511 589.589 420.218 589.538 408.758 M 250.825 337.989 C 246.319 328.845 244.006 320.587 237.308 310.557 M 319.633 340.547 C 313.790 344.771 309.048 362.500 303.756 373.476 M 212.023 403.466 C 227.319 391.116 236.124 409.348 276.118 392.882 C 275.967 369.749 281.998 364.071 281.999 364.068 C 281.998 364.067 283.040 353.363 273.766 354.072 M 421.950 436.396 C 450.555 455.005 467.607 438.716 474.284 435.219 C 467.892 425.508 469.427 414.013 455.468 400.526 C 436.084 403.281 392.600 404.176 353.738 377.004 C 341.783 382.409 325.027 382.794 310.812 415.815 C 299.693 408.503 277.658 409.435 276.118 392.882 M 369.027 431.103 C 392.622 447.941 421.944 436.395 421.950 436.396 C 415.947 431.193 410.581 426.595 404.897 421.695 M 276.707 447.568 C 313.068 463.639 346.762 443.817 369.027 431.103 C 360.951 427.225 350.137 427.229 341.978 424.047 M 236.618 350.059 C 236.615 350.060 217.495 346.656 206.731 354.660 C 184.339 371.309 183.856 394.448 184.386 413.462 C 200.098 442.802 234.951 438.157 234.956 438.160 C 253.693 455.502 264.446 451.000 276.707 447.568 C 261.542 439.187 260.724 422.088 232.604 424.635 M 286.115 322.318 C 274.351 327.542 250.828 337.987 250.825 337.989 C 250.823 337.990 236.620 350.058 236.618 350.059 C 236.617 350.060 228.042 356.154 226.136 360.540 M 282.986 313.080 C 276.444 309.069 271.923 305.304 267.298 285.860 M 359.619 334.079 C 345.454 336.488 344.469 340.712 319.633 340.547 C 304.199 340.444 286.118 322.320 286.115 322.318 C 286.115 322.317 283.774 318.986 282.986 313.080 C 285.846 303.777 284.964 291.373 296.699 283.508 M 396.664 343.487 C 381.943 338.902 376.812 338.768 359.619 334.079 C 357.388 312.535 362.720 302.054 354.326 299.973 M 416.358 361.014 C 417.046 369.284 417.734 377.555 418.422 385.825 M 405.485 312.910 C 405.484 312.913 400.159 319.369 396.664 343.487 C 406.271 350.428 416.356 361.012 416.358 361.014 C 416.360 361.015 430.279 371.283 437.239 376.417 M 506.626 330.551 C 471.392 324.405 405.495 312.911 405.485 312.910 C 405.485 312.907 411.303 298.307 409.013 284.684 M 611.296 217.061 C 611.292 217.061 587.779 206.475 571.898 222.941 C 572.294 237.611 577.777 254.691 573.073 266.455 C 536.050 278.807 526.038 322.311 506.626 330.551 C 520.655 339.396 518.294 354.275 524.267 366.420 M 417.246 224.117 C 417.247 224.112 411.364 198.249 434.299 169.430 C 446.395 159.517 454.875 147.677 476.637 134.737 C 470.105 118.771 457.682 113.899 439.003 114.743 M 519.156 125.902 C 518.507 119.438 517.859 112.975 517.211 106.511 M 481.929 125.328 C 494.338 125.519 519.151 125.902 519.156 125.902 C 537.317 127.047 545.692 138.064 558.961 144.145 M 434.299 169.430 C 422.342 163.550 409.797 165.314 394.900 171.194 M 584.834 151.789 C 598.866 161.934 611.296 162.104 622.468 208.240 C 603.359 196.374 583.662 195.893 583.658 195.891 C 583.655 195.890 566.409 184.131 557.785 178.250 C 557.782 178.255 562.177 207.440 535.440 221.765 C 536.714 233.780 531.564 242.120 531.323 252.342 C 525.283 264.696 514.954 246.751 485.457 275.275 M 528.971 102.395 C 543.708 102.813 552.250 111.212 568.957 121.800 C 575.304 132.406 584.832 151.786 584.834 151.789 C 585.825 163.734 592.178 174.998 584.246 193.539 M 482.517 78.286 C 497.817 83.025 519.104 91.632 528.971 102.395 C 536.968 118.596 540.246 122.361 553.080 127.680 M 400.201 133.717 C 413.430 133.763 432.341 132.829 448.411 132.384 M 263.469 262.408 C 252.608 222.815 278.479 211.445 285.984 185.964 M 352.780 258.173 C 348.003 277.006 318.529 275.847 313.752 311.145 M 367.263 251.754 C 368.439 233.917 355.502 227.841 370.791 198.244 M 622.468 208.240 C 632.464 220.006 642.237 223.974 644.225 252.931 C 660.827 282.336 680.474 313.215 674.215 354.660 C 675.782 378.223 671.657 401.054 658.338 422.871 C 646.625 462.751 585.625 452.186 575.426 438.748 M 557.785 178.250 C 557.779 178.248 507.219 153.556 507.214 153.553 C 507.214 153.553 504.078 147.673 502.510 144.733 M 414.836 259.645 C 451.376 255.851 473.166 232.150 476.637 231.761 C 487.552 227.672 498.679 233.726 504.862 245.874 M 184.386 413.462 C 148.074 394.381 162.043 362.897 162.041 362.892 C 162.042 362.889 164.465 351.331 172.377 333.959 C 184.068 328.839 195.729 314.465 195.731 314.463 C 201.275 306.934 203.834 292.972 215.945 287.015 C 222.098 281.999 239.658 271.749 239.661 271.747 C 246.880 268.559 263.466 262.409 263.469 262.408 C 294.344 260.944 352.771 258.173 352.780 258.173 C 357.187 256.220 367.262 251.755 367.263 251.754 C 367.268 251.755 396.609 248.870 414.836 259.645 C 419.143 270.454 424.061 285.930 461.936 301.737 C 483.836 291.152 495.198 294.423 507.214 281.156 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":185.991,\\\"max\\\":549.09},\\\"y\\\":{\\\"min\\\":113.458,\\\"max\\\":402.304}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":468.902,\\\"y\\\":700.055,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":370.968,\\\"y\\\":50.078,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":42.677,\\\"y\\\":246.421,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874248983487,\\\"y\\\":0.00501498207070368}},{\\\"point\\\":{\\\"x\\\":665.061,\\\"y\\\":246.421,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874248983487,\\\"y\\\":0.005014982070703675}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":198.783,\\\"y\\\":469.734,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987254201015092,\\\"y\\\":0.7153899547127913}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":565.602,\\\"y\\\":524.744,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064727,\\\"y\\\":0.701269212309647}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":468.119,\\\"y\\\":648.839,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"4FC72096-91A5-4539-9F0C-B6C88B26F712_0\\\",\\\"x1\\\":\\\"-7.71%\\\",\\\"y1\\\":\\\"53.61%\\\",\\\"x2\\\":\\\"119.40%\\\",\\\"y2\\\":\\\"31.49%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"4FC72096-91A5-4539-9F0C-B6C88B26F712_1\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"65.03%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"4FC72096-91A5-4539-9F0C-B6C88B26F712_2\\\",\\\"cx\\\":\\\"49.54%\\\",\\\"cy\\\":\\\"50.59%\\\",\\\"r\\\":\\\"73.81%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"branch\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":39.754,\\\"max\\\":679.831},\\\"y\\\":{\\\"min\\\":28.466,\\\"max\\\":696.7303443967297}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"branch\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"branch\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 187.080 144.552 C 187.075 144.544 181.262 90.846 138.707 65.872 C 94.006 39.638 41.764 62.322 41.754 62.322 C 41.760 62.329 52.085 110.969 93.097 135.060 C 136.610 160.619 187.071 144.551 187.080 144.552 M 266.621 189.854 C 266.624 189.845 307.709 150.891 300.095 100.475 C 293.083 54.054 246.983 30.473 246.978 30.466 C 246.975 30.476 212.652 75.897 223.566 128.766 C 231.638 167.868 266.617 189.848 266.621 189.854 M 353.985 260.465 C 353.991 260.456 408.976 228.769 414.595 171.562 C 419.739 119.188 376.870 80.575 376.867 80.566 C 376.861 80.575 329.352 119.182 325.423 177.835 C 322.301 224.437 353.982 260.456 353.985 260.465 M 431.030 356.886 C 431.038 356.878 492.045 331.223 510.521 271.839 C 527.409 217.560 495.698 166.482 495.696 166.471 C 495.689 166.480 438.996 192.557 420.308 249.467 C 402.316 304.261 431.029 356.876 431.030 356.886 M 492.937 475.057 C 492.946 475.051 557.133 462.115 586.030 408.096 C 613.008 357.662 590.508 301.139 590.508 301.129 C 590.499 301.135 532.363 314.388 503.817 363.951 C 474.051 415.633 492.938 475.046 492.937 475.057 M 526.061 594.397 C 526.072 594.393 590.316 599.784 635.516 557.867 C 677.721 518.727 677.827 458.791 677.831 458.781 C 677.821 458.784 617.715 449.754 573.858 487.034 C 526.021 527.697 526.066 594.386 526.061 594.397 M 281.716 224.163 C 281.705 224.159 236.064 180.427 176.201 185.340 C 124.946 189.547 91.834 231.676 91.826 231.681 C 91.835 231.684 129.077 269.298 180.504 269.134 C 239.672 268.945 281.706 224.167 281.716 224.163 M 366.991 314.138 C 366.980 314.134 320.884 269.998 259.896 273.926 C 205.066 277.458 168.605 321.264 168.596 321.269 C 168.605 321.273 207.412 363.717 262.355 363.533 C 324.170 363.326 366.980 314.143 366.991 314.138 M 446.947 454.994 C 446.937 454.987 411.672 397.863 349.278 388.699 C 289.607 379.935 241.452 422.100 241.441 422.103 C 241.450 422.109 275.057 475.913 334.521 485.984 C 395.948 496.387 446.936 454.997 446.947 454.994 M 486.574 601.762 C 486.565 601.755 452.950 545.275 391.272 532.057 C 331.981 519.350 280.174 555.244 280.163 555.247 C 280.171 555.254 308.407 613.420 367.259 628.029 C 430.605 643.754 486.562 601.765 486.574 601.762 M 492.298 677.310 C 492.348 695.136 531.934 702.957 531.283 682.829 C 529.633 631.863 530.631 499.466 411.216 329.319 C 321.646 201.696 184.452 143.894 184.429 143.875 C 184.452 143.899 334.947 244.579 410.357 375.933 C 497.039 526.921 492.193 639.409 492.298 677.310 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":510.746,\\\"y\\\":656.161,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.17586359561967413,\\\"y\\\":-0.9844145446587631}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":45.308,\\\"y\\\":63.349,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8827318966586274,\\\"y\\\":-0.4698770037163581}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":587.918,\\\"y\\\":304.546,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.3511153254832721,\\\"y\\\":-0.9363322210683428}},{\\\"point\\\":{\\\"x\\\":244.571,\\\"y\\\":422.989,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9758916622988211,\\\"y\\\":-0.21825550040180844}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":647.067,\\\"y\\\":537.269,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129335762692849,\\\"y\\\":0.7012315707581112}},{\\\"point\\\":{\\\"x\\\":354.676,\\\"y\\\":614.33,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987263029800354,\\\"y\\\":0.7153890923992705}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":249.127,\\\"y\\\":34.671,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.16263332021561844,\\\"y\\\":-0.9866865779748116}},{\\\"point\\\":{\\\"x\\\":95.703,\\\"y\\\":232.221,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9993784194337887,\\\"y\\\":-0.03525301079372184}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":513.536,\\\"y\\\":692.018,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"branch_curly\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":40.081,\\\"max\\\":682.252},\\\"y\\\":{\\\"min\\\":34.547,\\\"max\\\":701.2745628300994}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"branch_curly\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"branch_curly\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 563.410 239.584 C 563.410 225.009 575.168 213.251 589.743 213.251 C 604.318 213.251 616.075 225.009 616.075 239.584 C 616.075 254.158 604.317 265.916 589.743 265.916 C 575.168 265.916 563.410 254.158 563.410 239.584 M 144.484 197.092 C 144.484 179.536 158.647 165.374 176.203 165.374 C 193.759 165.374 207.921 179.536 207.921 197.092 C 207.921 214.648 193.759 228.811 176.203 228.811 C 158.647 228.811 144.484 214.648 144.484 197.092 M 465.262 592.678 C 465.262 575.454 479.157 561.558 496.382 561.558 C 513.607 561.558 527.502 575.454 527.502 592.678 C 527.502 609.903 513.607 623.799 496.382 623.799 C 479.157 623.798 465.262 609.903 465.262 592.678 M 170.816 534.627 C 170.816 518.396 183.910 505.302 200.141 505.302 C 216.372 505.302 229.466 518.396 229.466 534.627 C 229.466 550.858 216.372 563.952 200.141 563.952 C 183.910 563.952 170.817 550.858 170.816 534.627 M 450.898 283.271 C 450.898 267.703 463.458 255.143 479.026 255.143 C 494.595 255.143 507.154 267.703 507.154 283.271 C 507.154 298.840 494.595 311.399 479.026 311.399 C 463.458 311.399 450.898 298.840 450.898 283.271 M 423.352 596.105 C 423.348 596.102 405.128 568.857 374.068 563.892 C 344.209 559.119 319.352 578.353 319.346 578.354 C 319.351 578.358 334.937 606.581 364.626 612.312 C 396.583 618.482 423.347 596.107 423.352 596.105 M 447.324 562.186 C 447.324 562.180 458.877 531.509 444.839 503.360 C 431.344 476.301 401.237 467.280 401.233 467.276 C 401.233 467.282 387.351 496.382 399.968 523.861 C 413.548 553.439 447.319 562.183 447.324 562.186 M 502.266 538.192 C 502.268 538.186 522.998 512.800 518.669 481.645 C 514.508 451.694 488.850 433.543 488.847 433.538 C 488.845 433.544 466.409 456.698 469.604 486.766 C 473.043 519.130 502.263 538.186 502.266 538.192 M 549.663 555.999 C 549.666 555.995 575.888 541.648 582.910 513.834 C 589.661 487.097 574.200 462.961 574.199 462.956 C 574.195 462.960 547.297 474.836 539.689 501.342 C 531.500 529.872 549.662 555.993 549.663 555.999 M 604.152 491.581 C 604.156 491.585 632.968 499.542 646.176 525.007 C 658.873 549.487 649.353 576.523 649.353 576.528 C 649.349 576.525 620.445 571.127 606.967 547.070 C 592.459 521.175 604.152 491.587 604.152 491.581 M 584.869 451.848 C 584.873 451.845 602.391 427.626 630.865 424.142 C 658.237 420.793 680.247 439.155 680.252 439.156 C 680.247 439.159 665.096 464.359 637.846 468.588 C 608.515 473.139 584.874 451.849 584.869 451.848 M 525.473 416.260 C 525.476 416.255 531.234 384.497 557.336 367.818 C 582.428 351.785 612.428 359.396 612.433 359.396 C 612.430 359.400 609.435 391.009 584.872 407.841 C 558.434 425.959 525.479 416.259 525.473 416.260 M 446.149 412.421 C 446.151 412.416 443.090 380.286 463.697 357.159 C 483.506 334.928 514.446 334.126 514.451 334.124 C 514.450 334.129 520.130 365.367 501.047 388.225 C 480.506 412.828 446.155 412.419 446.149 412.421 M 356.335 391.576 C 356.337 391.570 356.788 356.882 381.488 334.558 C 405.232 313.097 438.386 315.826 438.391 315.824 C 438.389 315.830 440.840 349.868 417.799 372.082 C 393.000 395.991 356.341 391.574 356.335 391.576 M 318.366 275.052 C 318.371 275.049 337.288 248.898 368.034 245.137 C 397.591 241.523 421.355 261.351 421.361 261.352 C 421.356 261.356 404.995 288.566 375.570 293.130 C 343.898 298.043 318.371 275.053 318.366 275.052 M 365.015 172.555 C 365.021 172.556 396.490 165.383 422.077 182.842 C 446.674 199.624 451.452 230.203 451.455 230.208 C 451.450 230.207 421.203 239.862 396.078 223.881 C 369.035 206.678 365.018 172.560 365.015 172.555 M 489.542 217.873 C 489.539 217.869 465.464 208.376 456.428 185.241 C 447.743 163.002 458.418 140.600 458.418 140.595 C 458.422 140.598 482.811 147.895 492.208 169.843 C 502.323 193.467 489.542 217.868 489.542 217.873 M 524.927 151.624 C 524.930 151.627 544.662 161.774 550.403 182.279 C 555.921 201.991 544.908 220.196 544.907 220.199 C 544.905 220.197 524.718 211.896 518.567 192.372 C 511.948 171.358 524.927 151.628 524.927 151.624 M 553.330 159.210 C 553.332 159.213 559.152 180.624 578.015 190.505 C 596.148 200.003 616.245 193.018 616.249 193.018 C 616.246 193.015 612.327 171.543 594.510 161.466 C 575.332 150.619 553.334 159.210 553.330 159.210 M 531.185 145.808 C 531.189 145.808 552.231 152.846 570.917 142.636 C 588.880 132.821 594.220 112.225 594.223 112.222 C 594.219 112.222 574.181 103.569 555.911 112.801 C 536.246 122.737 531.188 145.805 531.185 145.808 M 487.022 128.121 C 487.026 128.118 511.670 120.217 522.197 97.722 C 532.316 76.097 523.127 53.046 523.127 53.041 C 523.123 53.044 498.309 58.733 487.499 80.020 C 475.862 102.933 487.022 128.116 487.022 128.121 M 424.703 125.813 C 424.705 125.808 443.081 104.887 440.357 78.302 C 437.739 52.746 416.508 36.551 416.506 36.547 C 416.504 36.551 396.747 55.525 398.541 81.152 C 400.473 108.736 424.701 125.808 424.703 125.813 M 359.099 149.819 C 359.098 149.813 370.223 120.285 356.709 93.184 C 343.719 67.132 314.735 58.444 314.731 58.441 C 314.730 58.446 301.363 86.461 313.508 112.918 C 326.581 141.396 359.094 149.815 359.099 149.819 M 315.709 199.598 C 315.706 199.593 308.787 168.806 282.611 153.578 C 257.448 138.940 228.454 147.596 228.449 147.596 C 228.452 147.600 232.665 178.354 257.344 193.795 C 283.907 210.416 315.703 199.597 315.709 199.598 M 294.523 265.817 C 294.518 265.814 273.907 241.922 243.643 240.827 C 214.551 239.774 193.058 261.073 193.053 261.075 C 193.058 261.078 211.268 286.217 240.311 288.205 C 271.572 290.346 294.517 265.819 294.523 265.817 M 188.664 325.601 C 188.663 325.596 193.650 294.438 174.985 270.591 C 157.042 247.667 126.905 244.958 126.900 244.956 C 126.901 244.961 119.413 275.085 136.609 298.575 C 155.118 323.859 188.659 325.599 188.664 325.601 M 134.111 357.679 C 134.107 357.676 122.799 331.234 96.816 321.930 C 71.838 312.986 47.291 325.553 47.286 325.553 C 47.290 325.557 56.167 352.417 80.844 362.161 C 107.406 372.649 134.105 357.680 134.111 357.679 M 113.621 403.802 C 113.617 403.802 92.575 393.126 71.328 400.962 C 50.904 408.495 42.083 429.331 42.081 429.334 C 42.085 429.335 61.820 441.555 82.476 434.684 C 104.710 427.288 113.618 403.806 113.621 403.802 M 118.467 461.097 C 118.465 461.101 101.008 476.975 100.781 499.619 C 100.563 521.387 116.904 537.038 116.906 537.041 C 116.908 537.038 135.344 522.934 136.262 501.185 C 137.251 477.774 118.469 461.101 118.467 461.097 M 126.008 416.149 C 126.009 416.153 121.853 439.379 135.482 457.465 C 148.583 474.850 171.078 477.288 171.081 477.290 C 171.081 477.286 177.092 454.866 164.557 437.068 C 151.065 417.911 126.012 416.151 126.008 416.149 M 178.541 358.762 C 178.539 358.767 160.568 382.253 165.360 410.226 C 169.967 437.117 193.622 452.756 193.625 452.760 C 193.627 452.755 213.202 431.235 209.463 404.209 C 205.440 375.119 178.544 358.767 178.541 358.762 M 309.427 366.174 C 309.421 366.175 279.453 358.000 254.139 373.748 C 229.805 388.886 223.967 418.095 223.964 418.100 C 223.969 418.099 252.662 428.613 277.471 414.267 C 304.174 398.824 309.424 366.179 309.427 366.174 M 231.005 697.365 C 201.448 687.003 205.086 675.149 205.083 675.147 C 205.093 675.133 266.235 584.285 298.407 535.404 C 324.717 495.430 349.667 415.597 316.773 372.508 C 294.180 342.911 243.624 341.578 206.916 347.820 C 179.311 352.515 150.455 368.302 134.090 391.023 C 120.375 410.064 118.045 460.139 118.043 460.146 C 118.043 460.139 108.743 408.199 119.277 386.085 C 133.396 356.446 165.590 333.785 197.041 324.368 C 230.426 314.373 301.950 334.242 301.961 334.243 C 301.964 334.227 270.645 268.734 329.116 181.184 C 353.233 145.075 406.145 124.002 459.868 124.582 C 492.028 124.929 551.290 157.728 551.299 157.731 C 551.290 157.729 490.006 136.858 458.723 137.982 C 431.199 138.971 380.419 145.555 347.632 189.824 C 292.610 264.113 329.118 336.697 329.116 336.711 C 329.119 336.718 352.781 379.027 357.506 402.132 C 361.595 422.127 357.506 463.843 357.506 463.850 C 357.515 463.845 412.449 420.598 445.145 414.476 C 484.129 407.175 529.494 412.819 563.642 432.991 C 585.725 446.035 605.646 492.224 605.650 492.230 C 605.642 492.224 577.069 451.001 521.674 435.459 C 479.725 423.690 425.601 439.471 394.537 470.021 C 313.954 549.269 264.345 696.108 264.332 696.130 C 264.328 696.131 245.055 702.291 231.005 697.365 M 321.826 488.088 C 321.821 488.085 304.479 458.946 272.658 452.126 C 242.069 445.571 215.341 464.089 215.335 464.090 C 215.340 464.094 229.907 494.103 260.270 501.640 C 292.951 509.752 321.820 488.090 321.826 488.088 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":246.86,\\\"y\\\":663.449,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.4197646590016845,\\\"y\\\":-0.9076329825723609}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":469.443,\\\"y\\\":36.57,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.0459922046980239,\\\"y\\\":-0.9989417986584679}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":128.848,\\\"y\\\":246.679,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5987075974448471,\\\"y\\\":-0.800967672732064}},{\\\"point\\\":{\\\"x\\\":611.299,\\\"y\\\":360.461,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.808704055458634,\\\"y\\\":-0.5882157348156871}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":118.311,\\\"y\\\":531.984,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.002740324476095995,\\\"y\\\":0.9999962453038339}},{\\\"point\\\":{\\\"x\\\":646.37,\\\"y\\\":572.478,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.41761585664930123,\\\"y\\\":0.90862368243133}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":227.955,\\\"y\\\":693.174,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5019985728985481,\\\"y\\\":0.8648684482670306}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"bubbles\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":252.051,\\\"max\\\":470.567},\\\"y\\\":{\\\"min\\\":36.1045597499316,\\\"max\\\":656.624}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bubbles\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bubbles\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 341.140 430.665 C 358.526 430.665 372.552 416.640 372.552 399.254 C 372.552 381.867 358.526 367.842 341.140 367.842 C 323.754 367.842 309.729 381.868 309.729 399.254 C 309.729 416.639 323.754 430.664 341.140 430.665 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 420.693 352.954 C 447.191 352.954 468.567 331.578 468.567 305.079 C 468.567 278.581 447.191 257.205 420.693 257.205 C 394.194 257.205 372.818 278.581 372.818 305.079 C 372.818 331.578 394.194 352.954 420.693 352.954 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 446.041 330.427 C 460.071 316.397 460.071 293.761 446.041 279.731 C 432.011 265.701 409.374 265.701 395.344 279.731 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.878 497.246 C 323.690 497.246 343.705 477.230 343.705 452.418 C 343.705 427.607 323.689 407.592 298.878 407.592 C 274.067 407.592 254.051 427.607 254.051 452.418 C 254.051 477.230 274.066 497.246 298.878 497.246 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.613 476.153 C 335.750 463.016 335.750 441.821 322.613 428.684 C 309.476 415.547 288.280 415.547 275.143 428.684 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 394.958 577.422 C 416.059 577.422 433.082 560.399 433.082 539.298 C 433.082 518.196 416.060 501.174 394.958 501.174 C 373.857 501.174 356.834 518.196 356.834 539.298 C 356.834 560.399 373.857 577.422 394.958 577.422 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 415.144 559.483 C 426.316 548.311 426.316 530.285 415.144 519.112 C 403.971 507.940 385.945 507.940 374.773 519.112 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 654.624 C 374.446 654.624 386.100 642.970 386.100 628.524 C 386.100 614.078 374.446 602.424 360.000 602.424 C 345.554 602.424 333.900 614.078 333.900 628.524 C 333.900 642.970 345.554 654.624 360.000 654.624 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.819 642.343 C 381.468 634.694 381.468 622.353 373.819 614.705 C 366.170 607.056 353.829 607.056 346.181 614.705 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.566 172.391 C 396.729 172.631 426.903 142.846 427.143 105.683 C 427.383 68.519 397.597 38.346 360.434 38.106 C 323.271 37.866 293.097 67.651 292.857 104.814 C 292.617 141.977 322.403 172.150 359.566 172.391 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 395.320 141.028 C 415.124 121.479 415.329 89.732 395.780 69.928 C 376.230 50.124 344.483 49.919 324.679 69.469 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 357.772 415.885 C 366.977 406.679 366.977 391.827 357.772 382.622 C 348.566 373.416 333.714 373.416 324.509 382.622 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 293.560 264.178 C 314.022 264.178 330.529 247.671 330.529 227.209 C 330.529 206.746 314.022 190.239 293.560 190.239 C 273.097 190.239 256.590 206.746 256.591 227.209 C 256.591 247.671 273.097 264.178 293.560 264.178 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 313.134 246.783 C 323.968 235.948 323.968 218.468 313.134 207.634 C 302.300 196.800 284.819 196.800 273.985 207.634 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":691.93,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":34.939,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":190.957,\\\"y\\\":346.779,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874548000852,\\\"y\\\":0.005009016115709153}},{\\\"point\\\":{\\\"x\\\":529.043,\\\"y\\\":346.779,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874548000852,\\\"y\\\":0.005009016115709153}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":529.607,\\\"y\\\":558.881,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129369546157063,\\\"y\\\":0.7012281360180027}},{\\\"point\\\":{\\\"x\\\":190.219,\\\"y\\\":558.924,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986824280384625,\\\"y\\\":0.7154319427802192}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":529.755,\\\"y\\\":134.765,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314829116413291,\\\"y\\\":-0.7753897937843839}},{\\\"point\\\":{\\\"x\\\":190.965,\\\"y\\\":134.837,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817473583452387,\\\"y\\\":-0.7315876840060176}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":658.45,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"capricorn_tail\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":327.115,\\\"max\\\":707.8273502093732},\\\"y\\\":{\\\"min\\\":301.967436278268,\\\"max\\\":628.2617320911907}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"capricorn_tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"capricorn_tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 399.240 541.506 C 444.760 574.727 513.150 576.485 543.485 556.934 C 543.498 556.947 608.499 628.578 631.912 626.204 C 656.026 623.758 622.294 562.658 629.546 540.630 C 643.421 498.483 714.773 480.233 704.892 462.685 C 688.522 433.612 633.561 471.275 602.291 463.902 C 599.428 463.304 596.875 462.325 594.542 460.934 C 562.736 441.965 569.345 399.389 510.466 369.851 C 469.175 349.137 413.390 354.961 379.097 406.634 C 367.296 424.416 361.747 446.900 361.440 458.113 C 360.388 496.560 370.289 520.377 399.240 541.506 M 468.505 462.374 C 489.254 449.025 505.060 482.383 505.063 482.386 C 505.060 482.386 486.268 494.162 469.031 483.627 C 461.423 478.976 459.260 468.322 468.505 462.374 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 379.097 406.634 C 367.296 424.416 361.747 446.900 361.440 458.113 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 602.291 463.902 C 599.428 463.304 596.875 462.325 594.542 460.934 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 594.542 460.934 C 562.736 441.965 569.345 399.389 510.466 369.851 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 510.466 369.851 C 469.175 349.137 413.390 354.961 379.097 406.634 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 379.097 406.634 C 367.296 424.416 361.747 446.900 361.440 458.113 C 352.006 459.102 329.118 459.751 329.115 459.751 C 329.115 459.737 329.190 320.662 329.190 320.648 C 329.190 320.648 334.224 320.186 335.184 320.100 C 369.118 317.063 423.306 302.079 453.539 304.166 C 490.766 306.737 552.685 318.855 579.654 356.714 C 600.467 385.931 608.069 426.669 602.291 463.902 C 599.428 463.304 596.875 462.325 594.542 460.934 C 562.736 441.965 569.345 399.389 510.466 369.851 C 469.175 349.137 413.390 354.961 379.097 406.634 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 505.063 482.386 C 505.066 482.392 522.263 528.281 534.073 543.141 C 522.263 528.281 505.066 482.392 505.063 482.386 M 534.073 543.141 C 539.390 549.830 543.472 556.940 543.485 556.934 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 545.025 535.609 C 545.029 535.613 569.482 566.406 585.984 581.563 C 601.713 596.010 632.899 616.788 632.904 616.792 M 560.090 533.934 C 560.093 533.938 578.169 555.229 590.253 565.584 C 603.745 577.145 630.389 593.355 630.393 593.358 M 571.807 524.728 C 571.810 524.731 586.663 541.413 596.709 549.194 C 604.951 555.577 621.184 564.063 621.187 564.065 M 579.340 515.522 C 579.343 515.524 595.615 528.194 605.691 534.287 C 611.125 537.573 621.185 542.303 621.187 542.304 M 593.568 472.838 C 593.572 472.838 616.805 478.472 632.775 476.002 C 653.414 472.810 688.974 464.470 688.979 464.468 M 592.731 484.555 C 592.734 484.556 613.071 489.633 627.069 489.577 C 642.016 489.516 668.052 487.066 668.056 487.066 M 590.220 497.110 C 590.222 497.110 603.646 501.454 611.520 503.185 C 623.372 505.791 642.107 508.826 642.110 508.827 M 586.035 507.153 C 586.037 507.154 600.194 514.779 608.716 518.200 C 614.930 520.694 626.206 523.891 626.208 523.891 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":330.369,\\\"y\\\":390.449,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":328.475,\\\"y\\\":389.633,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\"]}},{\\\"name\\\":\\\"castle_tower\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":218.414,\\\"max\\\":501.585},\\\"y\\\":{\\\"min\\\":16.054,\\\"max\\\":678.1}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"castle_tower\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"castle_tower\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 240.355 137.699 C 240.353 137.695 220.416 97.822 220.414 97.818 C 220.414 97.810 220.414 18.062 220.414 18.054 C 220.418 18.054 260.292 18.054 260.296 18.054 C 260.296 18.058 260.296 57.932 260.296 57.936 C 260.300 57.936 300.174 57.936 300.178 57.936 C 300.178 57.932 300.178 18.058 300.178 18.054 C 300.182 18.054 340.055 18.054 340.059 18.054 C 340.059 18.058 340.059 57.932 340.059 57.936 C 340.063 57.936 379.937 57.936 379.941 57.936 C 379.941 57.932 379.941 18.058 379.941 18.054 C 379.945 18.054 419.818 18.054 419.822 18.054 C 419.822 18.058 419.822 57.932 419.822 57.936 C 419.826 57.936 459.700 57.936 459.704 57.936 C 459.704 57.932 459.704 18.058 459.704 18.054 C 459.708 18.054 499.581 18.054 499.585 18.054 C 499.585 18.062 499.585 97.810 499.585 97.818 C 499.583 97.822 479.647 137.695 479.645 137.699 C 479.645 137.753 479.645 676.046 479.645 676.100 C 479.621 676.100 240.379 676.100 240.355 676.100 C 240.355 676.046 240.355 137.753 240.355 137.699 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 260.296 137.699 C 326.765 137.699 393.234 137.699 459.704 137.699 M 240.355 97.817 C 320.118 97.817 399.882 97.817 479.645 97.817 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"windows\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 300.178 496.633 C 300.178 496.651 300.178 676.082 300.178 676.100 C 300.190 676.100 419.811 676.100 419.822 676.100 C 419.822 676.082 419.822 496.651 419.822 496.633 C 419.817 496.625 360.006 416.878 360.000 416.870 C 359.994 416.878 300.184 496.625 300.178 496.633 M 343.862 334.165 C 343.862 334.152 343.862 205.075 343.862 205.062 C 343.864 205.061 359.998 188.926 360.000 188.925 C 360.002 188.926 376.136 205.061 376.138 205.062 C 376.138 205.075 376.138 334.152 376.138 334.165 C 376.135 334.165 343.865 334.165 343.862 334.165 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":301.605,\\\"max\\\":418.395},\\\"y\\\":{\\\"min\\\":496.812,\\\"max\\\":670.012}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":705.349,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":16.853,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":239.785,\\\"y\\\":357.98,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872122750827,\\\"y\\\":0.005057201430513853}},{\\\"point\\\":{\\\"x\\\":480.293,\\\"y\\\":357.98,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872122750827,\\\"y\\\":0.005057201430513863}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":478.623,\\\"y\\\":673.87,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129208067247643,\\\"y\\\":0.7012445531616707}},{\\\"point\\\":{\\\"x\\\":241.542,\\\"y\\\":673.918,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987280169674286,\\\"y\\\":0.7153874183299317}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.958,\\\"y\\\":673.638,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"arm\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"castle_tower_pointy\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":247.521,\\\"max\\\":472.478},\\\"y\\\":{\\\"min\\\":13.838,\\\"max\\\":683.307}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"castle_tower_pointy\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"castle_tower\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 358.998 15.838 C 359.007 15.856 445.799 200.429 445.808 200.447 C 445.790 200.447 272.205 200.447 272.188 200.447 C 272.197 200.429 358.989 15.856 358.998 15.838 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 265.304 255.174 C 265.302 255.171 249.523 223.612 249.521 223.609 C 249.521 223.603 249.521 160.484 249.521 160.478 C 249.524 160.478 281.083 160.478 281.086 160.478 C 281.086 160.481 281.086 192.040 281.086 192.044 C 281.089 192.044 312.649 192.044 312.652 192.044 C 312.652 192.040 312.652 160.481 312.652 160.478 C 312.655 160.478 344.214 160.478 344.217 160.478 C 344.217 160.481 344.217 192.040 344.217 192.044 C 344.220 192.044 375.780 192.044 375.783 192.044 C 375.783 192.040 375.783 160.481 375.783 160.478 C 375.786 160.478 407.345 160.478 407.348 160.478 C 407.348 160.481 407.348 192.040 407.348 192.044 C 407.351 192.044 438.910 192.044 438.913 192.044 C 438.913 192.040 438.913 160.481 438.913 160.478 C 438.917 160.478 470.475 160.478 470.478 160.478 C 470.478 160.484 470.478 223.603 470.478 223.609 C 470.477 223.612 454.698 255.171 454.696 255.174 C 454.696 255.217 454.696 681.264 454.696 681.307 C 454.677 681.307 265.323 681.307 265.304 681.307 C 265.304 681.264 265.304 255.217 265.304 255.174 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 281.086 255.174 C 333.695 255.174 386.304 255.174 438.913 255.174 M 265.304 223.609 C 328.434 223.609 391.565 223.609 454.696 223.609 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"windows\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 347.227 585.036 C 347.227 585.026 347.227 482.865 347.227 482.854 C 347.228 482.853 359.999 470.083 360.000 470.082 C 360.001 470.083 372.771 482.853 372.773 482.854 C 372.773 482.865 372.773 585.026 372.773 585.036 C 372.770 585.036 347.229 585.036 347.227 585.036 M 347.227 410.673 C 347.227 410.663 347.227 308.501 347.227 308.491 C 347.228 308.490 359.999 295.719 360.000 295.718 C 360.001 295.719 372.771 308.490 372.773 308.491 C 372.773 308.501 372.773 410.663 372.773 410.673 C 372.770 410.673 347.229 410.673 347.227 410.673 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.51,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":19.369,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":264.04,\\\"y\\\":343.502,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873325269011,\\\"y\\\":0.0050333672360686355}},{\\\"point\\\":{\\\"x\\\":456.038,\\\"y\\\":343.502,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873306234136,\\\"y\\\":0.005033745390817128}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":450.701,\\\"y\\\":676.275,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129053571532624,\\\"y\\\":0.701260259634167}},{\\\"point\\\":{\\\"x\\\":269.11,\\\"y\\\":676.322,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986805095282973,\\\"y\\\":0.7154338163696757}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.958,\\\"y\\\":677.513,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"arm\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"castle_wall\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":17.577,\\\"max\\\":702.423},\\\"y\\\":{\\\"min\\\":197.801,\\\"max\\\":522.199}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"castle_wall\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"castle_wall\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#D9EBD376-5018-4ED2-9B0C-0EFD5A1F2E1D_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 19.577 520.199 C 19.577 520.167 19.577 199.833 19.577 199.801 C 19.581 199.801 59.622 199.801 59.626 199.801 C 59.626 199.805 59.626 239.847 59.626 239.851 C 59.630 239.851 99.672 239.851 99.676 239.851 C 99.676 239.847 99.676 199.805 99.676 199.801 C 99.680 199.801 139.722 199.801 139.726 199.801 C 139.726 199.805 139.726 239.847 139.726 239.851 C 139.730 239.851 179.772 239.851 179.776 239.851 C 179.776 239.847 179.776 199.805 179.776 199.801 C 179.780 199.801 219.822 199.801 219.826 199.801 C 219.826 199.805 219.826 239.847 219.826 239.851 C 219.830 239.851 259.871 239.851 259.875 239.851 C 259.875 239.847 259.875 199.805 259.875 199.801 C 259.879 199.801 299.921 199.801 299.925 199.801 C 299.925 199.805 299.925 239.847 299.925 239.851 C 299.929 239.851 339.971 239.851 339.975 239.851 C 339.975 239.847 339.975 199.805 339.975 199.801 C 339.979 199.801 380.021 199.801 380.025 199.801 C 380.025 199.805 380.025 239.847 380.025 239.851 C 380.029 239.851 420.071 239.851 420.075 239.851 C 420.075 239.847 420.075 199.805 420.075 199.801 C 420.079 199.801 460.121 199.801 460.125 199.801 C 460.125 199.805 460.125 239.847 460.125 239.851 C 460.129 239.851 500.170 239.851 500.174 239.851 C 500.174 239.847 500.174 199.805 500.174 199.801 C 500.178 199.801 540.220 199.801 540.224 199.801 C 540.224 199.805 540.224 239.847 540.224 239.851 C 540.228 239.851 580.270 239.851 580.274 239.851 C 580.274 239.847 580.274 199.805 580.274 199.801 C 580.278 199.801 620.320 199.801 620.324 199.801 C 620.324 199.805 620.324 239.847 620.324 239.851 C 620.328 239.851 660.370 239.851 660.374 239.851 C 660.374 239.847 660.374 199.805 660.374 199.801 C 660.378 199.801 700.419 199.801 700.423 199.801 C 700.423 199.833 700.423 520.167 700.423 520.199 C 700.393 520.199 400.080 520.199 400.050 520.199 C 400.050 520.189 400.050 420.085 400.050 420.075 C 400.046 420.071 360.004 380.029 360.000 380.025 C 359.996 380.029 319.954 420.071 319.950 420.075 C 319.950 420.085 319.950 520.189 319.950 520.199 C 319.920 520.199 19.607 520.199 19.577 520.199 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"window\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 630.337 400.050 C 630.337 400.040 630.336 294.142 630.336 294.132 C 630.337 294.130 640.348 279.902 640.349 279.900 C 640.350 279.902 650.360 294.130 650.361 294.132 C 650.361 294.142 650.361 400.040 650.361 400.050 C 650.360 400.050 640.350 400.050 640.349 400.050 C 640.348 400.050 630.338 400.050 630.337 400.050 M 550.237 400.050 C 550.237 400.040 550.237 294.142 550.237 294.132 C 550.238 294.130 560.248 279.902 560.249 279.900 C 560.250 279.902 570.260 294.130 570.261 294.132 C 570.261 294.142 570.262 400.040 570.262 400.050 C 570.261 400.050 560.251 400.050 560.250 400.050 C 560.249 400.050 550.238 400.050 550.237 400.050 M 470.137 400.050 C 470.137 400.040 470.137 294.142 470.137 294.132 C 470.138 294.130 480.148 279.902 480.149 279.900 C 480.150 279.902 490.161 294.130 490.162 294.132 C 490.162 294.142 490.162 400.040 490.162 400.050 C 490.161 400.050 480.151 400.050 480.150 400.050 C 480.149 400.050 470.138 400.050 470.137 400.050 M 229.838 400.050 C 229.838 400.040 229.838 294.142 229.838 294.132 C 229.839 294.130 239.849 279.902 239.850 279.900 C 239.851 279.902 249.861 294.130 249.862 294.132 C 249.862 294.142 249.863 400.040 249.863 400.050 C 249.862 400.050 239.852 400.050 239.851 400.050 C 239.850 400.050 229.839 400.050 229.838 400.050 M 149.739 400.050 C 149.739 400.040 149.738 294.142 149.738 294.132 C 149.739 294.130 159.750 279.902 159.751 279.900 C 159.752 279.902 169.762 294.130 169.763 294.132 C 169.763 294.142 169.763 400.040 169.763 400.050 C 169.762 400.050 159.752 400.050 159.751 400.050 C 159.750 400.050 149.740 400.050 149.739 400.050 M 69.639 400.050 C 69.639 400.040 69.639 294.142 69.639 294.132 C 69.640 294.130 79.650 279.902 79.651 279.900 C 79.652 279.902 89.662 294.130 89.663 294.132 C 89.663 294.142 89.664 400.040 89.664 400.050 C 89.663 400.050 79.653 400.050 79.652 400.050 C 79.651 400.050 69.640 400.050 69.639 400.050 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":262.716,\\\"max\\\":457.284},\\\"y\\\":{\\\"min\\\":250.074,\\\"max\\\":372.451}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":536.797,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":199.929,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":21.241,\\\"y\\\":360.936,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869443305633,\\\"y\\\":0.00510990884683594}},{\\\"point\\\":{\\\"x\\\":700.822,\\\"y\\\":360.936,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869423966429,\\\"y\\\":0.005110287292651861}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":592.672,\\\"y\\\":516.547,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064727,\\\"y\\\":0.701269212309647}},{\\\"point\\\":{\\\"x\\\":127.136,\\\"y\\\":516.595,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698688399112506,\\\"y\\\":0.7154261114507937}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":697.537,\\\"y\\\":202.704,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314454286031296,\\\"y\\\":-0.7754203187279851}},{\\\"point\\\":{\\\"x\\\":23.254,\\\"y\\\":202.783,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.681745419967421,\\\"y\\\":-0.7315894903246251}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":524.792,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"D9EBD376-5018-4ED2-9B0C-0EFD5A1F2E1D_0\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"-56.25%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"cat\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":48.603,\\\"max\\\":671.0249864890304},\\\"y\\\":{\\\"min\\\":85.41706171917915,\\\"max\\\":630.1100129504204}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cat_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cat\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 57.514 281.281 C 69.956 280.645 82.398 280.009 94.840 279.373 M 49.603 265.015 C 65.378 267.622 81.152 270.228 96.926 272.835 M 59.707 249.899 C 71.929 255.568 84.151 261.238 96.372 266.908 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#477C050C-3C4E-432D-B81A-EA9B434DE6EE_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 141.111 232.278 C 153.975 228.757 164.683 239.784 164.685 239.785 C 164.683 239.786 161.083 254.729 148.219 258.249 C 135.355 261.770 124.648 250.743 124.645 250.743 C 124.647 250.741 128.247 235.798 141.111 232.278 M 600.209 353.541 C 601.374 333.923 660.788 278.905 669.490 187.596 C 672.094 160.271 665.657 82.565 639.871 86.566 C 614.797 90.458 649.219 125.740 638.396 188.927 C 625.579 263.762 583.724 297.529 567.548 308.071 C 536.244 328.472 390.174 299.429 299.662 322.211 C 282.103 326.630 254.985 309.422 245.517 284.842 C 221.217 221.753 203.481 221.068 200.635 213.966 C 194.048 197.530 181.336 183.202 176.330 175.346 C 175.589 174.183 167.503 191.886 168.130 203.438 C 162.516 192.799 156.758 187.001 151.549 182.800 C 148.737 180.532 149.007 200.643 150.483 214.362 C 110.157 225.494 109.903 248.516 84.111 267.084 C 76.329 272.686 85.256 289.193 97.215 295.308 C 110.810 302.261 128.933 290.110 139.808 300.605 C 178.345 337.792 154.975 365.601 170.015 413.911 C 181.146 449.667 200.837 464.940 206.292 489.184 C 212.679 517.568 196.952 569.953 168.295 598.685 C 160.132 606.869 136.522 598.134 138.656 619.497 C 139.143 624.374 170.981 624.935 180.040 619.796 C 241.350 585.021 249.135 496.760 254.708 496.747 C 260.165 496.734 312.981 536.153 315.933 602.273 C 316.226 608.824 300.523 606.623 297.009 612.464 C 291.594 621.466 292.263 629.455 336.887 626.319 C 346.724 625.628 341.811 603.693 341.252 587.052 C 339.157 524.659 298.549 480.976 303.969 479.990 C 350.370 471.556 435.765 466.158 436.159 471.467 C 439.768 520.111 466.501 540.415 462.897 553.634 C 460.158 563.680 424.056 593.291 415.226 598.794 C 409.490 602.368 383.324 593.993 378.591 617.512 C 377.511 622.878 426.537 620.662 438.489 616.362 C 447.181 613.234 500.416 565.180 506.008 555.267 C 510.956 546.496 489.505 505.373 522.007 476.311 C 531.312 467.991 558.622 540.313 615.112 558.932 C 622.365 561.322 604.592 599.564 600.216 605.332 C 597.217 609.286 565.147 613.640 572.814 624.435 C 577.815 631.475 617.215 628.997 620.532 627.028 C 627.318 623.000 665.207 543.915 653.388 534.949 C 580.755 479.850 622.802 419.553 600.209 353.541 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cat_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#A37F207F-BF0F-4F6C-A413-7AB4A384CC03_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 221.279 236.409 C 221.277 236.407 201.906 216.440 200.635 213.966 C 191.238 234.182 172.445 274.607 172.442 274.613 C 172.447 274.609 205.000 249.144 221.279 236.409 M 253.484 448.107 C 253.489 448.094 290.715 362.829 309.331 320.190 C 296.532 323.980 286.664 323.720 273.213 316.479 C 266.637 360.355 253.486 448.093 253.484 448.107 M 436.681 438.166 C 436.682 438.153 447.715 355.787 453.232 314.598 C 453.228 314.598 411.185 313.094 411.181 313.094 C 419.681 354.785 436.678 438.153 436.681 438.166 M 584.865 295.117 C 592.895 307.372 600.926 319.627 608.956 331.882 C 608.955 331.883 605.766 338.917 602.072 345.154 C 588.939 333.932 575.806 322.710 562.673 311.488 C 575.484 304.444 584.863 295.118 584.865 295.117 M 608.967 265.095 C 608.966 265.097 600.281 277.991 595.157 284.342 C 605.047 292.642 614.937 300.942 624.827 309.242 C 624.828 309.240 637.304 288.249 637.306 288.246 C 627.859 280.529 618.413 272.812 608.967 265.095 M 627.434 229.859 C 627.433 229.861 624.023 241.924 618.943 249.740 C 628.323 256.195 637.704 262.650 647.084 269.105 C 647.085 269.103 655.346 247.478 655.347 247.476 C 646.043 241.604 636.738 235.731 627.434 229.859 M 638.719 192.753 C 638.718 192.757 634.661 210.398 634.661 210.400 C 644.221 214.013 653.780 217.625 663.340 221.238 C 663.341 221.235 666.020 208.867 668.187 195.877 C 658.365 194.836 648.542 193.794 638.719 192.753 M 640.920 155.007 C 640.920 155.009 641.496 172.503 641.496 172.505 C 651.015 172.786 660.535 173.067 670.054 173.347 C 670.054 173.345 668.663 152.116 668.663 152.114 C 659.415 153.078 650.167 154.043 640.920 155.007 M 635.753 120.423 C 635.753 120.425 638.891 135.466 638.892 135.467 C 647.761 133.648 656.631 131.830 665.500 130.011 C 665.500 130.009 662.197 113.140 662.197 113.138 C 653.382 115.567 644.567 117.995 635.753 120.423 M 637.424 87.509 C 627.242 90.638 632.095 103.141 632.095 103.143 C 639.348 100.606 646.601 98.070 653.854 95.534 C 653.852 95.533 648.530 84.096 637.424 87.509 M 517.432 316.523 C 529.950 355.570 554.980 433.654 554.984 433.665 C 554.984 433.654 555.065 353.523 555.106 313.452 C 555.102 313.453 517.436 316.523 517.432 316.523 M 502.756 316.364 C 502.752 316.364 465.044 315.578 465.040 315.578 C 475.441 356.204 496.238 437.445 496.241 437.457 C 496.242 437.445 500.585 356.728 502.756 316.364 M 362.588 314.514 C 369.319 356.586 382.779 440.716 382.781 440.729 C 382.783 440.716 395.118 355.707 401.286 313.197 C 401.282 313.197 362.592 314.514 362.588 314.514 M 353.519 314.361 C 353.515 314.362 314.003 319.719 314.000 319.719 C 318.320 364.111 326.958 452.879 326.960 452.893 C 326.962 452.879 344.666 360.539 353.519 314.361 M 248.943 293.606 C 229.882 328.109 191.765 397.103 191.759 397.113 C 191.767 397.105 243.173 342.096 268.880 314.587 C 268.878 314.585 248.945 293.609 248.943 293.606 M 242.552 279.098 C 236.197 263.493 231.199 251.951 231.198 251.949 C 213.818 275.305 179.064 322.010 179.058 322.017 C 179.065 322.013 221.388 293.404 242.552 279.098 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#A37F207F-BF0F-4F6C-A413-7AB4A384CC03_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 280.355 518.867 C 284.829 523.170 291.569 532.497 291.570 532.499 C 297.501 524.251 309.362 507.758 309.364 507.755 C 309.361 507.756 290.025 515.163 280.355 518.867 M 295.805 537.958 C 295.806 537.960 304.102 552.341 304.103 552.343 C 310.250 545.001 322.542 530.319 322.544 530.316 C 322.541 530.317 304.718 535.411 295.805 537.958 M 306.593 557.925 C 306.594 557.926 311.428 570.690 311.428 570.691 C 318.196 565.752 331.729 555.874 331.731 555.873 C 331.728 555.873 314.972 557.241 306.593 557.925 M 313.416 577.873 C 313.416 577.874 315.459 589.414 315.459 589.415 C 322.504 585.706 336.592 578.290 336.594 578.289 C 336.592 578.289 321.142 578.012 313.416 577.873 M 336.174 602.364 C 336.172 602.363 322.612 597.526 315.831 595.107 C 316.378 600.965 314.997 605.760 314.997 605.760 C 322.056 604.628 336.174 602.366 336.174 602.364 M 206.213 517.491 C 206.213 517.493 202.050 537.109 202.050 537.111 C 213.885 535.665 237.552 532.774 237.556 532.774 C 237.553 532.772 216.661 522.585 206.213 517.491 M 200.974 543.901 C 200.973 543.903 194.690 559.637 194.689 559.639 C 205.308 560.253 226.543 561.480 226.546 561.480 C 226.544 561.479 209.498 549.761 200.974 543.901 M 192.533 565.174 C 192.532 565.175 184.577 577.902 184.576 577.904 C 194.512 578.926 214.381 580.971 214.384 580.972 C 214.382 580.970 199.816 570.440 192.533 565.174 M 176.573 614.903 C 176.573 614.901 171.328 601.921 169.286 597.728 C 169.286 597.728 163.006 602.609 157.258 603.117 C 163.860 606.764 176.572 614.904 176.573 614.903 M 182.716 581.342 C 182.715 581.344 173.152 593.623 173.151 593.625 C 173.154 593.625 196.299 599.922 196.302 599.922 C 196.300 599.920 182.717 581.344 182.716 581.342 M 450.435 569.977 C 450.434 569.978 438.214 580.845 438.213 580.846 C 438.216 580.846 468.347 580.588 468.350 580.588 C 468.043 580.567 450.437 569.978 450.435 569.977 M 205.893 486.989 C 205.893 486.992 207.587 510.680 207.587 510.683 C 219.227 507.129 242.503 500.022 242.506 500.021 C 242.503 500.019 218.097 491.333 205.893 486.989 M 601.982 604.488 C 601.981 604.488 588.464 609.724 588.463 609.725 C 599.179 610.532 620.610 612.145 620.613 612.145 C 620.611 612.144 608.192 607.040 601.982 604.488 M 611.951 580.854 C 611.950 580.855 605.304 596.235 605.303 596.237 C 614.614 594.607 633.233 591.348 633.236 591.348 C 633.234 591.347 619.046 584.352 611.951 580.854 M 615.112 558.932 C 615.118 558.936 614.509 574.855 614.508 574.857 C 624.751 568.601 645.233 556.092 645.236 556.091 C 645.233 556.091 625.154 557.985 615.112 558.932 M 583.337 541.737 C 583.339 541.738 605.295 555.012 605.297 555.013 C 611.393 542.402 623.582 517.185 623.584 517.181 C 623.580 517.183 596.753 533.552 583.337 541.737 M 554.718 512.001 C 554.720 512.003 572.429 532.306 572.430 532.308 C 583.524 517.383 605.708 487.536 605.712 487.532 C 605.706 487.534 571.716 503.845 554.718 512.001 M 526.559 476.379 C 526.561 476.381 544.571 499.395 544.573 499.397 C 558.844 485.849 587.382 458.756 587.386 458.751 C 587.380 458.753 546.835 470.503 526.559 476.379 M 434.239 584.326 C 434.238 584.327 420.737 594.709 420.736 594.710 C 429.630 596.741 447.415 600.802 447.418 600.802 C 447.416 600.801 438.632 589.818 434.239 584.326 M 463.780 553.212 C 463.779 553.213 454.165 566.370 454.165 566.371 C 466.475 563.215 491.091 556.904 491.095 556.903 C 491.092 556.903 472.885 554.442 463.780 553.212 M 454.717 528.057 C 454.718 528.058 462.495 545.020 462.495 545.021 C 471.626 538.612 489.883 525.796 489.886 525.794 C 489.882 525.794 466.440 527.302 454.717 528.057 M 442.965 507.254 C 442.966 507.256 450.738 521.970 450.739 521.971 C 461.153 515.318 481.979 502.013 481.982 502.011 C 481.978 502.012 455.970 505.507 442.965 507.254 M 254.708 496.747 C 259.845 500.413 271.507 510.488 271.508 510.490 C 278.861 501.897 293.563 484.713 293.566 484.711 C 293.562 484.712 267.661 492.735 254.708 496.747 M 436.159 471.467 C 436.156 471.471 439.212 495.115 439.213 495.117 C 453.315 489.531 481.515 478.360 481.519 478.359 C 481.514 478.358 451.279 473.764 436.159 471.467 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cat_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 141.111 232.278 C 153.975 228.757 164.683 239.784 164.685 239.785 C 164.683 239.786 161.083 254.729 148.219 258.249 C 135.355 261.770 124.648 250.743 124.645 250.743 C 124.647 250.741 128.247 235.798 141.111 232.278 M 600.209 353.541 C 601.374 333.923 660.787 278.905 669.490 187.596 C 672.094 160.271 665.657 82.565 639.871 86.566 C 614.797 90.458 649.219 125.740 638.397 188.927 C 625.579 263.762 583.724 297.529 567.548 308.071 C 536.244 328.472 390.174 299.429 299.662 322.211 C 282.103 326.630 254.985 309.422 245.517 284.842 C 221.217 221.753 203.481 221.068 200.635 213.966 C 194.048 197.530 181.336 183.202 176.330 175.346 C 175.589 174.183 167.503 191.886 168.130 203.438 C 162.516 192.799 156.758 187.001 151.549 182.800 C 148.737 180.532 149.007 200.643 150.483 214.362 C 110.157 225.494 109.903 248.516 84.111 267.084 C 76.329 272.686 85.256 289.193 97.215 295.308 C 110.810 302.261 128.933 290.110 139.808 300.605 C 178.345 337.792 154.975 365.601 170.015 413.911 C 181.146 449.667 200.837 464.940 206.292 489.184 C 212.679 517.568 196.952 569.953 168.295 598.685 C 160.132 606.869 136.522 598.134 138.656 619.497 C 139.143 624.374 170.981 624.935 180.040 619.796 C 241.350 585.021 249.135 496.760 254.708 496.747 C 260.165 496.734 312.981 536.153 315.933 602.273 C 316.226 608.824 300.523 606.623 297.009 612.464 C 291.594 621.466 292.263 629.455 336.887 626.319 C 346.724 625.628 341.811 603.693 341.252 587.052 C 339.157 524.659 298.549 480.976 303.969 479.990 C 350.370 471.556 435.765 466.158 436.159 471.467 C 439.768 520.111 466.501 540.415 462.897 553.634 C 460.158 563.680 424.056 593.291 415.226 598.794 C 409.490 602.368 383.324 593.993 378.591 617.512 C 377.511 622.878 426.537 620.662 438.489 616.362 C 447.181 613.234 500.416 565.180 506.008 555.267 C 510.956 546.496 489.505 505.373 522.007 476.311 C 531.312 467.991 558.622 540.313 615.112 558.932 C 622.365 561.322 604.592 599.564 600.216 605.332 C 597.217 609.286 565.147 613.640 572.814 624.435 C 577.815 631.475 617.215 628.997 620.532 627.028 C 627.318 623.000 665.207 543.915 653.388 534.949 C 580.755 479.850 622.802 419.553 600.209 353.541 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":239.206,\\\"max\\\":558.118},\\\"y\\\":{\\\"min\\\":322.648,\\\"max\\\":466.977}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":393.839,\\\"y\\\":682.753,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":160.547,\\\"y\\\":168.143,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":145.26,\\\"y\\\":482.752,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999306697319643,\\\"y\\\":0.011775216744732215}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":397.175,\\\"y\\\":308.82,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005036227050266383,\\\"y\\\":-0.9999873181281341}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":631.432,\\\"y\\\":350.792,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"477C050C-3C4E-432D-B81A-EA9B434DE6EE_1\\\",\\\"cx\\\":\\\"51.86%\\\",\\\"cy\\\":\\\"52.02%\\\",\\\"r\\\":\\\"54.41%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"A37F207F-BF0F-4F6C-A413-7AB4A384CC03_0\\\",\\\"x1\\\":\\\"47.87%\\\",\\\"y1\\\":\\\"109.47%\\\",\\\"x2\\\":\\\"48.73%\\\",\\\"y2\\\":\\\"44.25%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"A37F207F-BF0F-4F6C-A413-7AB4A384CC03_1\\\",\\\"x1\\\":\\\"46.32%\\\",\\\"y1\\\":\\\"-65.70%\\\",\\\"x2\\\":\\\"44.50%\\\",\\\"y2\\\":\\\"134.18%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"cathedral\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":100.348,\\\"max\\\":619.158},\\\"y\\\":{\\\"min\\\":27.45,\\\"max\\\":667.384}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cathedral\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cathedral\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#812EF8AF-E5B6-45E7-80F2-BB55437CEC0C_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 115.896 665.384 C 115.896 665.357 115.896 394.800 115.896 394.774 C 115.894 394.774 102.349 394.774 102.348 394.774 C 102.348 394.772 102.348 381.244 102.348 381.243 C 102.349 381.243 115.894 381.243 115.896 381.243 C 115.896 381.241 115.896 367.713 115.896 367.712 C 115.897 367.712 129.442 367.712 129.444 367.712 C 129.444 367.713 129.444 381.241 129.444 381.243 C 129.445 381.243 142.990 381.243 142.991 381.243 C 142.991 381.244 142.991 394.772 142.991 394.774 C 142.990 394.774 129.445 394.774 129.444 394.774 C 129.444 394.776 129.444 421.832 129.444 421.835 C 129.446 421.840 156.536 475.951 156.539 475.956 C 156.546 475.951 224.269 421.840 224.276 421.835 C 224.276 421.809 224.276 164.781 224.276 164.755 C 224.279 164.758 251.369 191.813 251.372 191.816 C 251.382 191.809 346.196 124.170 346.205 124.163 C 346.205 124.159 346.205 83.575 346.205 83.571 C 346.202 83.571 319.113 83.571 319.110 83.571 C 319.110 83.569 319.110 56.513 319.110 56.510 C 319.113 56.510 346.202 56.510 346.205 56.510 C 346.205 56.508 346.205 29.452 346.205 29.450 C 346.206 29.450 359.752 29.450 359.753 29.450 C 359.754 29.450 373.299 29.450 373.300 29.450 C 373.300 29.452 373.300 56.508 373.300 56.510 C 373.303 56.510 400.393 56.510 400.396 56.510 C 400.396 56.513 400.396 83.569 400.396 83.571 C 400.393 83.571 373.303 83.571 373.300 83.571 C 373.300 83.575 373.300 124.159 373.300 124.163 C 373.310 124.170 468.124 191.809 468.133 191.816 C 468.136 191.813 495.227 164.758 495.229 164.755 C 495.229 164.781 495.229 421.809 495.229 421.835 C 495.236 421.840 562.960 475.951 562.966 475.956 C 562.969 475.951 590.059 421.840 590.062 421.835 C 590.062 421.832 590.062 394.776 590.062 394.774 C 590.060 394.774 576.516 394.774 576.514 394.774 C 576.514 394.772 576.514 381.244 576.514 381.243 C 576.516 381.243 590.060 381.243 590.062 381.243 C 590.062 381.241 590.062 367.713 590.062 367.712 C 590.063 367.712 603.608 367.712 603.609 367.712 C 603.609 367.713 603.609 381.241 603.609 381.243 C 603.611 381.243 617.156 381.243 617.158 381.243 C 617.158 381.244 617.158 394.772 617.158 394.774 C 617.156 394.774 603.611 394.774 603.609 394.774 C 603.609 394.800 603.609 665.357 603.609 665.384 C 603.604 665.384 115.901 665.384 115.896 665.384 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"windows\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 170.086 597.731 C 170.086 598.199 170.086 665.384 170.086 665.384 C 188.149 665.384 206.213 665.384 224.276 665.384 C 224.276 665.370 224.276 530.091 224.276 530.078 C 224.271 530.085 170.086 557.138 170.086 597.731 M 305.562 557.139 C 305.562 557.329 306.231 666.770 306.231 666.770 C 342.135 666.308 378.039 665.846 413.943 665.384 C 413.943 665.373 413.906 566.160 413.943 557.139 C 414.219 489.882 359.758 479.688 359.753 479.681 C 359.747 479.688 305.562 489.483 305.562 557.139 M 495.229 665.384 C 513.293 665.384 531.356 665.384 549.419 665.384 C 549.419 665.377 549.419 597.731 549.419 597.731 C 549.419 557.137 495.235 530.085 495.229 530.078 C 495.229 530.091 495.229 665.384 495.229 665.384 M 359.753 380.241 C 411.835 378.227 439.944 337.134 440.035 300.060 C 440.128 262.068 411.202 219.879 359.753 219.879 C 308.304 219.879 279.471 262.042 279.471 300.060 C 279.471 338.077 308.291 380.087 359.753 380.241 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":293.444,\\\"max\\\":426.556},\\\"y\\\":{\\\"min\\\":234.144,\\\"max\\\":367.256}},{\\\"x\\\":{\\\"min\\\":314.693,\\\"max\\\":405.307},\\\"y\\\":{\\\"min\\\":496.99,\\\"max\\\":651.328}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":698.939,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":30.599,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":116.681,\\\"y\\\":522.606,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875096983345,\\\"y\\\":0.004998044349876638}},{\\\"point\\\":{\\\"x\\\":603.319,\\\"y\\\":522.606,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875096983345,\\\"y\\\":0.0049980443498766226}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":579.169,\\\"y\\\":662.127,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129398236144084,\\\"y\\\":0.7012252191020059}},{\\\"point\\\":{\\\"x\\\":140.65,\\\"y\\\":662.172,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986833748150326,\\\"y\\\":0.7154310181681227}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":492.655,\\\"y\\\":170.911,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314504127234041,\\\"y\\\":-0.7754162599993907}},{\\\"point\\\":{\\\"x\\\":228.009,\\\"y\\\":170.989,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817136231748407,\\\"y\\\":-0.7316191194725785}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":662.581,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"812EF8AF-E5B6-45E7-80F2-BB55437CEC0C_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"97.17%\\\",\\\"r\\\":\\\"139.95%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"23.92%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"centaur_half\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":104.89147398780625,\\\"max\\\":682.089},\\\"y\\\":{\\\"min\\\":266.06664476806264,\\\"max\\\":689.4806509469037}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"centaur_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"centaur_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 158.339 357.313 C 158.339 357.316 153.248 373.401 153.924 383.573 C 155.087 401.062 168.582 426.941 168.584 426.945 C 168.580 426.948 140.718 448.636 129.369 458.234 C 122.331 464.186 107.453 473.582 106.141 478.934 C 104.259 486.615 113.294 502.506 124.106 519.804 C 127.444 525.145 131.240 557.971 135.684 565.527 C 138.457 570.242 151.308 582.957 156.582 586.251 C 163.095 590.318 191.012 597.869 191.016 597.870 C 191.016 597.867 193.628 580.047 190.910 572.535 C 188.014 564.530 173.632 551.797 173.630 551.795 C 173.629 551.795 161.107 556.459 160.077 556.376 C 154.124 555.896 158.509 545.862 157.306 542.815 C 154.666 536.129 145.560 528.165 140.685 517.397 C 136.488 508.128 133.568 492.244 133.567 492.241 C 133.573 492.238 195.851 457.600 195.858 457.596 C 195.859 457.597 205.821 460.269 205.822 460.269 C 205.824 460.271 210.470 472.469 216.779 483.750 C 221.241 491.726 226.796 499.089 226.797 499.090 C 226.798 499.094 235.078 531.604 235.076 531.631 C 235.076 531.638 232.353 536.323 232.396 539.786 C 232.532 550.573 243.356 564.169 243.357 564.171 C 243.358 564.176 251.723 617.518 251.724 617.523 C 251.723 617.524 246.702 622.145 245.435 628.408 C 244.519 632.939 246.377 637.452 246.378 637.452 C 246.376 637.454 231.795 645.895 228.330 649.291 C 223.093 654.425 210.348 676.510 210.347 676.512 C 210.349 676.513 222.367 680.561 233.888 680.033 C 248.334 679.371 262.810 672.674 262.813 672.673 C 262.813 672.672 268.222 660.714 268.177 657.268 C 268.141 654.426 263.393 649.394 263.600 644.619 C 264.081 633.536 268.276 645.238 273.554 644.578 C 279.570 643.825 279.853 636.409 279.853 636.408 C 279.852 636.403 268.803 590.310 268.802 590.306 C 268.801 590.302 264.142 557.754 264.142 557.750 C 264.142 557.749 266.733 545.729 266.795 543.261 C 267.003 534.962 259.382 498.619 258.448 494.434 C 257.818 491.612 249.671 462.221 249.670 462.217 C 249.667 462.217 220.345 456.127 220.342 456.126 C 220.345 456.127 249.256 460.992 249.259 460.992 C 249.267 460.992 289.309 466.693 329.786 459.750 C 340.477 457.917 350.746 455.434 360.057 452.727 C 396.390 442.166 422.772 427.397 425.564 426.775 C 426.786 426.503 460.295 422.356 460.299 422.356 C 460.295 422.357 425.778 427.824 425.775 427.825 C 425.775 427.828 422.942 444.227 427.873 456.098 C 435.627 474.761 463.403 492.209 463.580 501.418 C 463.752 510.413 430.595 547.096 430.592 547.100 C 430.588 547.104 405.922 570.233 396.346 580.270 C 391.397 585.457 390.692 607.579 390.135 609.705 C 389.854 610.778 385.672 620.070 385.671 624.202 C 385.669 633.637 397.569 656.724 397.570 656.727 C 397.572 656.726 407.941 651.733 413.866 645.145 C 419.810 638.537 423.689 627.664 423.690 627.662 C 423.689 627.660 412.343 612.975 414.531 601.459 C 416.462 591.295 424.965 593.503 427.150 589.643 C 429.259 585.919 428.153 576.182 430.702 573.341 C 445.107 557.281 482.444 519.626 502.198 516.963 C 504.850 516.605 509.509 503.900 498.795 495.152 C 481.341 480.900 491.253 458.706 491.252 458.703 C 491.249 458.699 464.026 423.391 464.023 423.387 C 464.026 423.391 490.743 457.757 490.746 457.760 C 490.749 457.762 522.981 474.296 526.214 477.026 C 528.534 478.986 536.934 494.117 544.405 499.571 C 553.579 506.269 568.468 509.762 570.032 514.697 C 573.655 526.131 594.689 560.405 597.178 569.025 C 600.119 579.211 606.799 634.904 603.811 640.481 C 603.037 641.926 591.626 648.075 588.775 651.405 C 583.539 657.521 574.127 682.226 574.125 682.229 C 574.127 682.230 586.533 688.300 594.963 688.476 C 604.744 688.681 619.365 682.041 619.368 682.040 C 619.368 682.039 621.117 667.556 621.117 667.555 C 621.117 667.554 625.965 664.220 626.523 662.103 C 627.721 657.557 620.170 650.478 620.729 646.669 C 622.740 632.963 634.721 647.293 634.419 638.845 C 633.105 602.043 624.626 612.451 614.298 551.761 C 612.527 541.353 612.907 507.600 609.566 502.014 C 607.488 498.540 591.243 492.193 584.454 483.718 C 571.694 467.792 560.114 454.682 563.114 429.365 C 564.897 414.313 577.035 421.668 586.441 381.763 C 591.467 360.442 586.138 309.383 586.138 309.376 C 586.141 309.378 606.583 321.387 610.273 328.580 C 625.456 358.176 588.790 373.944 600.096 455.077 C 606.288 499.507 649.673 543.994 681.089 548.398 C 651.859 512.579 658.491 479.332 652.439 440.531 C 645.997 399.228 662.491 359.221 636.649 325.000 C 620.327 303.387 570.690 292.251 570.684 292.248 C 570.677 292.246 537.529 268.723 505.429 267.185 C 480.032 265.969 458.443 274.240 405.071 286.607 C 389.157 290.294 373.749 291.265 359.986 290.269 C 342.451 289.001 320.004 280.001 320.000 280.000 C 319.984 280.000 160.016 280.000 160.000 280.000 C 160.000 280.008 158.339 357.306 158.339 357.313 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":243.552,\\\"y\\\":280.101,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":243.419,\\\"y\\\":280.562,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":100.781,\\\"y\\\":418.19,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999304948362255,\\\"y\\\":0.011790059227211842}},{\\\"point\\\":{\\\"x\\\":675.377,\\\"y\\\":418.19,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999304845276384,\\\"y\\\":0.011790933479671157}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\"]}},{\\\"name\\\":\\\"chair\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":128.623,\\\"max\\\":590.506},\\\"y\\\":{\\\"min\\\":12.096,\\\"max\\\":687.262}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"chair\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"chair_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 418.083 424.812 C 418.083 424.824 418.083 534.829 418.083 534.840 C 418.080 534.841 388.463 542.456 388.460 542.457 C 388.457 542.456 362.225 532.302 362.223 532.301 C 362.223 532.292 362.223 440.903 362.223 440.893 C 362.219 440.894 326.137 450.819 326.133 450.820 C 326.133 450.842 326.133 673.391 326.133 673.413 C 326.131 673.414 297.360 685.261 297.357 685.262 C 297.354 685.260 264.352 663.259 264.349 663.257 C 264.349 663.235 265.195 448.302 265.195 448.281 C 265.188 448.277 189.030 409.352 189.023 409.348 C 189.023 409.367 189.023 606.531 189.023 606.551 C 189.020 606.552 161.095 616.246 161.092 616.247 C 161.089 616.245 130.627 599.781 130.623 599.780 C 130.623 599.753 130.623 333.202 130.623 333.175 C 130.647 333.170 361.888 282.168 361.911 282.163 C 361.914 282.137 390.454 24.278 390.457 24.253 C 390.460 24.251 423.462 14.097 423.465 14.096 C 423.482 14.101 588.490 67.412 588.506 67.417 C 588.503 67.446 556.348 357.690 556.344 357.720 C 556.344 357.746 556.344 621.759 556.344 621.785 C 556.341 621.786 526.724 629.401 526.721 629.402 C 526.719 629.401 497.948 611.630 497.945 611.629 C 497.945 611.607 497.945 400.884 497.945 400.884 C 497.945 400.884 418.091 424.810 418.083 424.812 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.911 282.163 C 361.914 282.137 390.454 24.278 390.457 24.253 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 525.886 356.062 C 525.870 356.055 361.927 282.170 361.911 282.163 C 361.914 282.137 390.454 24.278 390.457 24.253 C 446.281 43.452 557.912 81.846 557.928 81.851 C 557.925 81.879 525.889 356.035 525.886 356.062 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 130.623 333.175 C 130.623 333.202 130.623 599.753 130.623 599.780 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 130.623 599.780 C 130.627 599.781 161.089 616.245 161.092 616.247 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 189.023 409.348 C 189.030 409.352 265.188 448.277 265.195 448.281 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 265.195 448.281 C 265.195 448.302 264.349 663.235 264.349 663.257 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 264.349 663.257 C 264.352 663.259 297.354 685.260 297.357 685.262 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 297.357 413.580 C 297.340 413.572 130.640 333.183 130.623 333.175 C 130.623 333.202 130.623 599.753 130.623 599.780 C 130.627 599.781 161.089 616.245 161.092 616.247 C 161.092 542.202 161.092 394.135 161.092 394.113 C 161.095 394.115 179.712 404.270 189.023 409.348 C 189.030 409.352 265.188 448.277 265.195 448.281 C 265.195 448.302 264.349 663.235 264.349 663.257 C 264.352 663.259 297.354 685.260 297.357 685.262 C 297.357 594.701 297.357 413.607 297.357 413.580 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 388.460 542.457 C 388.457 542.456 362.225 532.302 362.223 532.301 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 362.223 532.301 C 362.223 532.292 362.223 440.903 362.223 440.893 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 387.856 433.704 C 387.856 433.715 388.259 506.206 388.460 542.457 C 388.457 542.456 362.225 532.302 362.223 532.301 C 362.223 532.292 362.223 440.903 362.223 440.893 C 370.767 438.497 387.854 433.705 387.856 433.704 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 497.945 400.884 C 497.945 400.884 497.945 611.607 497.945 611.629 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 497.945 611.629 C 497.948 611.630 526.719 629.401 526.721 629.402 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 527.123 391.850 C 517.397 394.861 497.948 400.883 497.945 400.884 C 497.945 400.884 497.945 611.607 497.945 611.629 C 497.948 611.630 526.719 629.401 526.721 629.402 C 526.722 629.378 527.123 391.873 527.123 391.850 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 387.856 433.704 C 397.932 430.740 408.007 427.776 418.083 424.812 M 297.357 413.580 C 373.533 394.407 449.710 375.235 525.886 356.062 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":183.87,\\\"max\\\":493.636},\\\"y\\\":{\\\"min\\\":48.21,\\\"max\\\":357.976}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":298.192,\\\"y\\\":704.102,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":497.137,\\\"y\\\":39.311,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":130.707,\\\"y\\\":348.874,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871827565018,\\\"y\\\":0.0050630349312050255}},{\\\"point\\\":{\\\"x\\\":557.482,\\\"y\\\":348.874,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871827565018,\\\"y\\\":0.005063034931204999}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":137.262,\\\"y\\\":596.446,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987071455865725,\\\"y\\\":0.7154078030789601}},{\\\"point\\\":{\\\"x\\\":550.048,\\\"y\\\":620.543,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129015191744774,\\\"y\\\":0.7012641613249049}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":424.316,\\\"y\\\":14.709,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.199501019027961,\\\"y\\\":-0.9798976188392362}},{\\\"point\\\":{\\\"x\\\":582.36,\\\"y\\\":69.734,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314542557442752,\\\"y\\\":-0.7754131304681676}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":false,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"chariot\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":50.30933686342936,\\\"max\\\":669.6906631365707},\\\"y\\\":{\\\"min\\\":20.896,\\\"max\\\":687.4140378283405}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"chariot\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"charioteer_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17_2_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 221.846 25.338 C 221.873 25.338 498.127 25.338 498.154 25.338 C 498.148 25.342 435.179 57.836 435.172 57.839 C 435.157 57.839 284.843 57.839 284.828 57.839 C 284.821 57.836 221.852 25.342 221.846 25.338 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 284.828 57.295 C 284.843 57.295 435.157 57.295 435.172 57.295 C 435.172 57.329 435.172 406.269 435.172 406.304 C 435.157 406.304 284.843 406.304 284.828 406.304 C 284.828 406.269 284.828 57.329 284.828 57.295 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 279.991 359.182 C 279.993 359.171 304.226 324.228 304.114 255.814 C 289.656 240.901 281.007 195.446 281.004 195.440 C 270.275 291.568 231.122 351.052 231.117 351.068 C 231.122 351.069 279.986 359.181 279.991 359.182 M 439.382 356.048 C 439.380 356.038 415.867 322.170 415.886 255.814 C 430.324 240.882 438.993 195.446 438.996 195.440 C 449.992 292.123 490.131 351.679 490.136 351.695 C 490.131 351.695 439.387 356.048 439.382 356.048 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 319.783 97.221 C 347.590 71.220 372.410 71.220 400.217 97.221 C 409.100 105.527 392.893 112.852 406.083 122.237 C 414.475 128.209 398.406 138.276 411.948 144.731 C 421.273 149.176 406.828 159.888 417.814 167.428 C 433.911 178.476 429.335 186.983 423.680 210.040 C 409.321 268.584 306.236 269.498 296.320 210.040 C 292.367 186.340 285.222 177.741 302.186 169.003 C 312.897 163.485 299.894 153.006 308.052 147.254 C 321.281 137.925 304.767 128.566 313.917 122.237 C 328.612 112.074 310.900 105.527 319.783 97.221 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S14\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.271 200.044 C 373.875 200.042 413.798 199.859 434.061 199.766 C 434.061 199.773 431.982 267.156 431.982 267.162 C 431.979 267.171 426.972 322.984 407.682 355.750 C 376.636 355.583 312.328 355.750 312.318 355.750 C 291.741 325.055 287.472 266.884 287.469 266.875 C 287.469 266.868 286.082 200.419 286.082 200.412 C 286.088 200.412 346.195 200.137 346.410 200.136 C 346.505 200.136 373.004 200.045 373.271 200.044 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 434.061 199.766 C 413.798 199.859 373.875 200.042 373.271 200.044 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.271 200.044 C 373.004 200.045 346.505 200.136 346.410 200.136 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.410 200.136 C 346.195 200.137 286.088 200.412 286.082 200.412 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 286.082 200.412 C 286.082 200.410 289.305 182.549 289.305 182.547 C 289.319 182.547 430.681 182.547 430.695 182.547 C 430.061 187.747 434.061 199.765 434.061 199.766 C 413.798 199.859 373.875 200.042 373.271 200.044 C 373.004 200.045 346.505 200.136 346.410 200.136 C 346.195 200.137 286.088 200.412 286.082 200.412 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 390.219 121.748 C 394.828 171.731 374.655 188.387 360.000 188.387 C 345.345 188.387 325.172 171.731 329.781 121.748 C 348.885 110.265 371.708 112.130 390.219 121.748 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 354.011 173.962 C 358.004 173.962 361.996 173.962 365.989 173.962 M 388.972 136.554 C 388.969 136.554 369.174 131.030 363.683 136.266 C 363.681 136.268 363.683 166.512 363.683 166.515 C 363.682 166.515 356.319 166.515 356.318 166.515 C 356.318 166.512 356.320 136.268 356.318 136.266 C 350.893 130.961 331.031 135.945 331.028 135.945 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 364.912 145.083 C 364.913 145.082 371.360 139.075 376.453 139.075 C 381.545 139.075 387.992 145.082 387.993 145.083 C 387.992 145.083 381.545 151.090 376.453 151.090 C 371.361 151.090 364.913 145.083 364.912 145.083 M 332.007 145.083 C 332.008 145.082 338.455 139.075 343.547 139.075 C 348.639 139.075 355.086 145.082 355.087 145.083 C 355.086 145.083 348.639 151.090 343.547 151.090 C 338.455 151.090 332.008 145.083 332.007 145.083 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 404.165 184.815 C 406.874 182.106 409.982 180.047 413.309 178.330 C 423.102 177.578 433.372 181.033 441.052 188.713 C 448.172 195.834 451.662 205.183 451.514 214.760 C 450.385 218.736 448.110 222.439 444.950 225.600 C 433.663 236.887 415.452 236.887 404.165 225.600 C 392.878 214.313 392.878 196.102 404.165 184.815 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 404.165 184.815 C 406.874 182.106 409.982 180.047 413.309 178.330 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 451.514 214.760 C 450.385 218.736 448.110 222.439 444.950 225.600 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 444.950 225.600 C 433.663 236.887 415.452 236.887 404.165 225.600 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 404.165 225.600 C 392.878 214.313 392.878 196.102 404.165 184.815 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 404.165 184.815 C 406.874 182.106 409.982 180.047 413.309 178.330 C 404.899 178.974 396.882 182.430 390.599 188.713 C 376.636 202.675 376.636 225.203 390.599 239.166 C 404.561 253.128 427.089 253.128 441.051 239.166 C 447.893 232.324 451.382 223.426 451.514 214.760 C 450.385 218.736 448.110 222.439 444.950 225.600 C 433.663 236.887 415.452 236.887 404.165 225.600 C 392.878 214.313 392.878 196.102 404.165 184.815 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 315.835 184.815 C 313.126 182.106 310.018 180.047 306.691 178.330 C 296.898 177.578 286.628 181.033 278.949 188.713 C 271.828 195.834 268.339 205.183 268.486 214.760 C 269.615 218.736 271.890 222.439 275.050 225.600 C 286.337 236.887 304.548 236.887 315.835 225.600 C 327.122 214.313 327.122 196.102 315.835 184.815 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 315.835 184.815 C 313.126 182.106 310.018 180.047 306.691 178.330 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 268.486 214.760 C 269.615 218.736 271.890 222.439 275.050 225.600 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 275.050 225.600 C 286.337 236.887 304.548 236.887 315.835 225.600 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 315.835 225.600 C 327.122 214.313 327.122 196.102 315.835 184.815 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 315.835 184.815 C 313.126 182.106 310.018 180.047 306.691 178.330 C 315.101 178.974 323.118 182.430 329.401 188.713 C 343.364 202.675 343.364 225.203 329.401 239.166 C 315.439 253.128 292.911 253.128 278.949 239.166 C 272.107 232.324 268.618 223.426 268.486 214.760 C 269.615 218.736 271.890 222.439 275.050 225.600 C 286.337 236.887 304.548 236.887 315.835 225.600 C 327.122 214.313 327.122 196.102 315.835 184.815 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 330.504 116.153 C 330.504 116.152 328.338 106.089 328.337 106.088 C 328.338 106.088 338.633 106.227 338.634 106.227 C 338.633 106.227 329.392 101.618 329.391 101.617 C 329.392 101.616 335.926 93.663 335.926 93.663 C 335.926 93.663 326.596 98.000 326.595 98.000 C 326.595 97.999 324.434 87.900 324.434 87.899 C 324.434 87.900 322.009 97.934 322.009 97.935 C 322.008 97.935 312.765 93.324 312.764 93.323 C 312.764 93.324 319.099 101.476 319.099 101.477 C 319.098 101.477 309.740 105.835 309.739 105.836 C 309.740 105.836 320.067 105.976 320.068 105.976 C 320.068 105.977 317.626 115.987 317.626 115.988 C 317.626 115.987 324.173 108.007 324.173 108.006 C 324.174 108.007 330.503 116.153 330.504 116.153 M 390.526 116.153 C 390.526 116.152 392.692 106.089 392.693 106.088 C 392.692 106.088 382.397 106.227 382.396 106.227 C 382.397 106.227 391.638 101.618 391.639 101.617 C 391.638 101.616 385.104 93.663 385.104 93.663 C 385.104 93.663 394.434 98.000 394.435 98.000 C 394.435 97.999 396.596 87.900 396.596 87.899 C 396.596 87.900 399.021 97.934 399.021 97.935 C 399.022 97.935 408.265 93.324 408.266 93.323 C 408.266 93.324 401.931 101.476 401.931 101.477 C 401.932 101.477 411.290 105.835 411.291 105.836 C 411.290 105.836 400.963 105.976 400.962 105.976 C 400.962 105.977 403.404 115.987 403.404 115.988 C 403.403 115.987 396.857 108.007 396.857 108.006 C 396.856 108.007 390.526 116.153 390.526 116.153 M 349.686 118.707 C 349.686 118.706 353.564 100.694 353.564 100.692 C 353.562 100.692 335.137 100.941 335.135 100.941 C 335.137 100.941 351.676 92.691 351.678 92.690 C 351.677 92.688 339.982 78.455 339.981 78.453 C 339.983 78.454 356.681 86.216 356.683 86.217 C 356.683 86.215 360.550 68.138 360.550 68.136 C 360.551 68.138 364.890 86.098 364.891 86.100 C 364.892 86.099 381.436 77.847 381.438 77.846 C 381.436 77.848 370.099 92.437 370.098 92.439 C 370.100 92.440 386.849 100.240 386.851 100.240 C 386.849 100.240 368.365 100.491 368.364 100.491 C 368.364 100.493 372.735 118.409 372.735 118.411 C 372.734 118.409 361.018 104.127 361.017 104.126 C 361.016 104.127 349.687 118.706 349.686 118.707 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 231.983 432.105 C 231.983 432.066 231.983 34.039 231.983 33.999 C 232.008 33.999 487.992 33.999 488.017 33.999 C 488.017 34.039 488.017 432.066 488.017 432.105 C 487.992 432.105 232.008 432.105 231.983 432.105 M 219.979 440.719 C 219.979 440.677 219.979 22.921 219.979 22.879 C 220.007 22.879 499.993 22.879 500.021 22.879 C 500.021 22.921 500.021 440.677 500.021 440.719 C 499.993 440.719 220.007 440.719 219.979 440.719 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 471.750 104.534 C 471.753 104.534 501.441 104.534 501.444 104.534 C 501.444 104.555 501.444 317.944 501.444 317.966 C 501.440 317.966 462.516 317.966 462.513 317.966 C 462.513 317.944 471.750 104.555 471.750 104.534 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 355.400 21.896 C 371.781 21.976 502.819 21.896 502.834 21.896 C 502.834 21.906 502.530 101.899 502.834 121.896 C 420.006 123.154 355.239 54.835 355.400 21.896 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 248.250 104.534 C 248.247 104.534 218.559 104.534 218.556 104.534 C 218.556 104.555 218.556 317.944 218.556 317.966 C 218.560 317.966 257.484 317.966 257.487 317.966 C 257.487 317.944 248.250 104.555 248.250 104.534 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2_2_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 364.600 21.896 C 348.219 21.976 217.181 21.896 217.166 21.896 C 217.166 21.906 217.470 101.899 217.166 121.896 C 299.994 123.154 364.761 54.835 364.600 21.896 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.271 200.044 C 373.004 200.045 346.505 200.136 346.410 200.136 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 287.469 266.875 C 287.472 266.884 291.741 325.055 312.318 355.750 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 312.318 355.750 C 312.328 355.750 376.636 355.583 407.682 355.750 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 407.682 355.750 C 426.972 322.984 431.979 267.171 431.982 267.162 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S26\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 431.982 267.162 C 379.599 270.279 365.275 223.977 373.271 200.044 C 373.004 200.045 346.505 200.136 346.410 200.136 C 355.202 225.027 339.623 270.285 287.469 266.875 C 287.472 266.884 291.741 325.055 312.318 355.750 C 312.328 355.750 376.636 355.583 407.682 355.750 C 426.972 322.984 431.979 267.171 431.982 267.162 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 219.311 360.394 C 219.339 360.394 500.661 360.394 500.689 360.394 C 500.689 360.418 500.689 591.347 500.689 591.370 C 500.661 591.370 219.339 591.370 219.311 591.370 C 219.311 591.347 219.311 360.418 219.311 360.394 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 236.168 48.816 C 236.167 48.816 226.216 50.159 226.215 50.159 C 226.215 50.159 234.622 44.612 234.622 44.611 C 234.622 44.610 227.362 37.677 227.362 37.676 C 227.363 37.677 236.904 40.781 236.905 40.781 C 236.905 40.780 237.812 30.748 237.812 30.747 C 237.812 30.748 241.338 40.179 241.338 40.179 C 241.339 40.179 249.747 34.630 249.748 34.630 C 249.748 34.631 244.571 43.266 244.571 43.267 C 244.572 43.268 254.144 46.389 254.145 46.389 C 254.144 46.389 244.161 47.737 244.160 47.737 C 244.161 47.738 247.700 57.143 247.701 57.144 C 247.700 57.143 240.425 50.186 240.424 50.185 C 240.424 50.186 235.252 58.815 235.251 58.816 C 235.251 58.815 236.167 48.817 236.168 48.816 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 260.480 74.865 C 260.479 74.865 248.180 72.779 248.179 72.779 C 248.180 72.779 260.201 69.307 260.202 69.306 C 260.202 69.305 254.154 58.399 254.153 58.398 C 254.154 58.398 264.324 65.607 264.325 65.608 C 264.326 65.607 269.110 54.042 269.110 54.041 C 269.110 54.042 269.805 66.531 269.805 66.533 C 269.806 66.532 281.830 63.059 281.831 63.059 C 281.830 63.059 272.499 71.389 272.498 71.390 C 272.499 71.390 282.699 78.631 282.700 78.631 C 282.699 78.631 270.360 76.540 270.359 76.539 C 270.359 76.541 271.081 89.004 271.081 89.006 C 271.080 89.004 265.024 78.063 265.023 78.062 C 265.022 78.063 255.698 86.386 255.697 86.387 C 255.697 86.386 260.480 74.866 260.480 74.865 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 271.501 39.428 C 271.500 39.428 265.589 39.426 265.589 39.426 C 265.589 39.426 270.931 36.853 270.932 36.853 C 270.931 36.853 267.243 32.235 267.243 32.234 C 267.243 32.234 272.565 34.799 272.566 34.799 C 272.566 34.798 273.887 29.017 273.887 29.017 C 273.887 29.017 275.199 34.797 275.199 34.798 C 275.200 34.798 280.543 32.224 280.544 32.224 C 280.543 32.225 276.842 36.854 276.841 36.854 C 276.842 36.855 282.180 39.431 282.181 39.432 C 282.180 39.432 276.250 39.430 276.249 39.430 C 276.249 39.430 277.572 45.197 277.572 45.197 C 277.572 45.197 273.876 40.563 273.876 40.563 C 273.876 40.563 270.177 45.189 270.177 45.190 C 270.177 45.189 271.501 39.429 271.501 39.428 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 290.840 55.990 C 290.840 55.990 285.406 55.608 285.406 55.608 C 285.406 55.608 290.482 53.586 290.482 53.586 C 290.482 53.586 287.389 49.104 287.388 49.104 C 287.389 49.104 292.116 51.803 292.116 51.803 C 292.116 51.803 293.702 46.573 293.702 46.573 C 293.702 46.573 294.537 51.970 294.537 51.971 C 294.537 51.971 299.614 49.949 299.615 49.948 C 299.614 49.949 295.915 53.966 295.914 53.967 C 295.915 53.967 300.656 56.678 300.657 56.679 C 300.656 56.679 295.205 56.296 295.205 56.296 C 295.205 56.296 296.050 61.682 296.050 61.682 C 296.050 61.682 292.951 57.186 292.951 57.185 C 292.950 57.186 289.254 61.200 289.253 61.201 C 289.253 61.200 290.840 55.990 290.840 55.990 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 283.818 94.798 C 283.817 94.798 277.906 94.796 277.905 94.796 C 277.906 94.796 283.248 92.223 283.248 92.223 C 283.248 92.222 279.560 87.604 279.560 87.604 C 279.560 87.604 284.882 90.168 284.882 90.168 C 284.883 90.168 286.203 84.387 286.204 84.386 C 286.204 84.387 287.516 90.167 287.516 90.168 C 287.516 90.167 292.860 87.594 292.860 87.594 C 292.860 87.594 289.158 92.223 289.158 92.224 C 289.159 92.224 294.497 94.801 294.497 94.801 C 294.497 94.801 288.567 94.799 288.566 94.799 C 288.566 94.800 289.888 100.566 289.889 100.567 C 289.888 100.566 286.194 95.933 286.193 95.933 C 286.193 95.933 282.494 100.559 282.493 100.559 C 282.494 100.559 283.817 94.799 283.818 94.798 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 227.256 76.057 C 227.255 76.057 222.118 76.055 222.117 76.055 C 222.118 76.055 226.761 73.819 226.761 73.819 C 226.761 73.818 223.555 69.805 223.555 69.804 C 223.555 69.804 228.181 72.033 228.181 72.033 C 228.181 72.033 229.330 67.008 229.330 67.007 C 229.330 67.008 230.470 72.032 230.470 72.032 C 230.471 72.032 235.115 69.795 235.116 69.795 C 235.115 69.796 231.898 73.820 231.898 73.820 C 231.898 73.820 236.538 76.060 236.538 76.060 C 236.538 76.060 231.383 76.058 231.383 76.058 C 231.383 76.059 232.532 81.071 232.532 81.071 C 232.532 81.071 229.321 77.044 229.320 77.043 C 229.320 77.044 226.105 81.064 226.105 81.065 C 226.105 81.064 227.256 76.057 227.256 76.057 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 239.986 101.758 C 239.985 101.758 232.990 102.594 232.989 102.594 C 232.990 102.594 238.947 98.792 238.947 98.792 C 238.947 98.791 233.928 93.850 233.927 93.849 C 233.928 93.850 240.589 96.129 240.589 96.130 C 240.590 96.129 241.333 89.100 241.333 89.100 C 241.333 89.100 243.705 95.754 243.706 95.755 C 243.706 95.754 249.664 91.952 249.665 91.951 C 249.665 91.952 245.941 97.955 245.940 97.955 C 245.941 97.956 252.623 100.248 252.624 100.248 C 252.623 100.248 245.605 101.087 245.605 101.087 C 245.605 101.087 247.987 107.723 247.987 107.724 C 247.987 107.724 242.958 102.765 242.958 102.764 C 242.957 102.765 239.236 108.763 239.236 108.764 C 239.236 108.763 239.986 101.759 239.986 101.758 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 305.280 78.172 C 305.279 78.172 299.368 78.170 299.367 78.170 C 299.368 78.170 304.710 75.598 304.711 75.597 C 304.710 75.597 301.022 70.979 301.022 70.979 C 301.022 70.979 306.344 73.543 306.345 73.543 C 306.345 73.543 307.666 67.761 307.666 67.760 C 307.666 67.761 308.978 73.542 308.978 73.542 C 308.978 73.542 314.322 70.968 314.322 70.968 C 314.322 70.969 310.621 75.598 310.620 75.599 C 310.621 75.599 315.959 78.175 315.959 78.176 C 315.959 78.176 310.029 78.174 310.028 78.174 C 310.028 78.174 311.351 83.941 311.351 83.941 C 311.350 83.941 307.656 79.308 307.655 79.307 C 307.655 79.308 303.956 83.933 303.956 83.934 C 303.956 83.933 305.280 78.173 305.280 78.172 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 313.552 43.677 C 313.551 43.677 303.600 45.020 303.599 45.020 C 303.600 45.020 312.006 39.473 312.007 39.472 C 312.006 39.471 304.747 32.538 304.746 32.537 C 304.747 32.538 314.289 35.642 314.290 35.642 C 314.290 35.641 315.196 25.609 315.197 25.608 C 315.197 25.609 318.722 35.040 318.722 35.040 C 318.723 35.040 327.132 29.491 327.133 29.491 C 327.132 29.492 321.956 38.127 321.955 38.128 C 321.956 38.128 331.528 41.250 331.529 41.250 C 331.528 41.250 321.546 42.598 321.545 42.598 C 321.545 42.599 325.085 52.004 325.085 52.005 C 325.084 52.004 317.809 45.047 317.809 45.046 C 317.808 45.047 312.636 53.676 312.636 53.677 C 312.636 53.676 313.552 43.678 313.552 43.677 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 347.175 36.359 C 347.174 36.360 340.905 37.109 340.905 37.109 C 340.905 37.109 346.243 33.702 346.244 33.701 C 346.243 33.701 341.746 29.272 341.745 29.272 C 341.746 29.272 347.715 31.315 347.715 31.316 C 347.715 31.315 348.381 25.016 348.381 25.016 C 348.382 25.016 350.508 30.979 350.508 30.980 C 350.508 30.979 355.848 27.572 355.849 27.571 C 355.848 27.572 352.511 32.951 352.511 32.952 C 352.511 32.952 358.499 35.006 358.500 35.006 C 358.499 35.006 352.210 35.758 352.210 35.758 C 352.210 35.759 354.345 41.705 354.345 41.706 C 354.345 41.705 349.838 37.261 349.838 37.261 C 349.837 37.261 346.503 42.637 346.502 42.638 C 346.502 42.637 347.175 36.360 347.175 36.359 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 328.986 63.401 C 328.986 63.401 323.977 63.999 323.977 63.999 C 323.977 63.999 328.242 61.277 328.242 61.277 C 328.242 61.276 324.648 57.738 324.648 57.738 C 324.648 57.738 329.418 59.370 329.418 59.370 C 329.418 59.370 329.950 54.337 329.950 54.337 C 329.951 54.337 331.649 59.102 331.649 59.102 C 331.650 59.102 335.916 56.379 335.916 56.379 C 335.916 56.379 333.250 60.677 333.249 60.678 C 333.250 60.678 338.034 62.319 338.035 62.319 C 338.034 62.319 333.010 62.920 333.009 62.920 C 333.009 62.920 334.715 67.671 334.715 67.672 C 334.715 67.672 331.114 64.121 331.114 64.121 C 331.113 64.121 328.449 68.416 328.449 68.416 C 328.449 68.416 328.986 63.401 328.986 63.401 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 485.918 48.816 C 485.919 48.816 495.869 50.159 495.871 50.159 C 495.870 50.159 487.464 44.612 487.463 44.611 C 487.463 44.610 494.723 37.677 494.724 37.676 C 494.723 37.677 485.181 40.781 485.180 40.781 C 485.180 40.780 484.273 30.748 484.273 30.747 C 484.273 30.748 480.748 40.179 480.747 40.179 C 480.746 40.179 472.338 34.630 472.337 34.630 C 472.337 34.631 477.514 43.266 477.514 43.267 C 477.513 43.268 467.941 46.389 467.940 46.389 C 467.941 46.389 477.924 47.737 477.925 47.737 C 477.924 47.738 474.385 57.143 474.385 57.144 C 474.385 57.143 481.660 50.186 481.661 50.185 C 481.661 50.186 486.834 58.815 486.834 58.816 C 486.834 58.815 485.918 48.817 485.918 48.816 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 461.605 74.865 C 461.606 74.865 473.905 72.779 473.906 72.779 C 473.905 72.779 461.884 69.307 461.883 69.306 C 461.884 69.305 467.931 58.399 467.932 58.398 C 467.931 58.398 457.761 65.607 457.760 65.608 C 457.759 65.607 452.976 54.042 452.975 54.041 C 452.975 54.042 452.280 66.531 452.280 66.533 C 452.279 66.532 440.255 63.059 440.254 63.059 C 440.255 63.059 449.586 71.389 449.587 71.390 C 449.586 71.390 439.386 78.631 439.385 78.631 C 439.386 78.631 451.725 76.540 451.726 76.539 C 451.726 76.541 451.004 89.004 451.004 89.006 C 451.005 89.004 457.061 78.063 457.062 78.062 C 457.063 78.063 466.387 86.386 466.388 86.387 C 466.388 86.386 461.605 74.866 461.605 74.865 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 450.584 39.428 C 450.585 39.428 456.496 39.426 456.497 39.426 C 456.496 39.426 451.154 36.853 451.153 36.853 C 451.154 36.853 454.842 32.235 454.842 32.234 C 454.842 32.234 449.520 34.799 449.519 34.799 C 449.519 34.798 448.198 29.017 448.198 29.017 C 448.198 29.017 446.886 34.797 446.886 34.798 C 446.885 34.798 441.542 32.224 441.541 32.224 C 441.542 32.225 445.243 36.854 445.244 36.854 C 445.243 36.855 439.905 39.431 439.905 39.432 C 439.905 39.432 445.835 39.430 445.836 39.430 C 445.836 39.430 444.513 45.197 444.513 45.197 C 444.514 45.197 448.209 40.563 448.209 40.563 C 448.209 40.563 451.908 45.189 451.908 45.190 C 451.908 45.189 450.584 39.429 450.584 39.428 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 431.245 55.990 C 431.245 55.990 436.679 55.608 436.679 55.608 C 436.679 55.608 431.603 53.586 431.603 53.586 C 431.603 53.586 434.696 49.104 434.697 49.104 C 434.696 49.104 429.969 51.803 429.969 51.803 C 429.969 51.803 428.384 46.573 428.383 46.573 C 428.383 46.573 427.548 51.970 427.548 51.971 C 427.548 51.971 422.471 49.949 422.470 49.948 C 422.471 49.949 426.171 53.966 426.171 53.967 C 426.170 53.967 421.429 56.678 421.429 56.679 C 421.429 56.679 426.880 56.296 426.880 56.296 C 426.880 56.296 426.035 61.682 426.035 61.682 C 426.035 61.682 429.134 57.186 429.134 57.185 C 429.135 57.186 432.832 61.200 432.832 61.201 C 432.832 61.200 431.245 55.990 431.245 55.990 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 438.268 94.798 C 438.268 94.798 444.179 94.796 444.180 94.796 C 444.179 94.796 438.837 92.223 438.837 92.223 C 438.837 92.222 442.525 87.604 442.525 87.604 C 442.525 87.604 437.203 90.168 437.203 90.168 C 437.203 90.168 435.882 84.387 435.882 84.386 C 435.881 84.387 434.569 90.167 434.569 90.168 C 434.569 90.167 429.225 87.594 429.225 87.594 C 429.225 87.594 432.927 92.223 432.927 92.224 C 432.926 92.224 427.588 94.801 427.588 94.801 C 427.588 94.801 433.519 94.799 433.519 94.799 C 433.519 94.800 432.197 100.566 432.197 100.567 C 432.197 100.566 435.892 95.933 435.892 95.933 C 435.892 95.933 439.591 100.559 439.592 100.559 C 439.592 100.559 438.268 94.799 438.268 94.798 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 494.829 76.057 C 494.830 76.057 499.967 76.055 499.968 76.055 C 499.968 76.055 495.324 73.819 495.324 73.819 C 495.324 73.818 498.530 69.805 498.530 69.804 C 498.530 69.804 493.904 72.033 493.904 72.033 C 493.904 72.033 492.756 67.008 492.755 67.007 C 492.755 67.008 491.615 72.032 491.615 72.032 C 491.614 72.032 486.970 69.795 486.969 69.795 C 486.970 69.796 490.187 73.820 490.188 73.820 C 490.187 73.820 485.548 76.060 485.547 76.060 C 485.548 76.060 490.702 76.058 490.702 76.058 C 490.702 76.059 489.553 81.071 489.553 81.071 C 489.553 81.071 492.764 77.044 492.765 77.043 C 492.765 77.044 495.980 81.064 495.980 81.065 C 495.980 81.064 494.829 76.057 494.829 76.057 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 482.099 101.758 C 482.100 101.758 489.095 102.594 489.096 102.594 C 489.095 102.594 483.139 98.792 483.138 98.792 C 483.138 98.791 488.157 93.850 488.158 93.849 C 488.157 93.850 481.496 96.129 481.496 96.130 C 481.496 96.129 480.752 89.100 480.752 89.100 C 480.752 89.100 478.380 95.754 478.380 95.755 C 478.379 95.754 472.421 91.952 472.420 91.951 C 472.420 91.952 476.144 97.955 476.145 97.955 C 476.144 97.956 469.462 100.248 469.462 100.248 C 469.462 100.248 476.480 101.087 476.481 101.087 C 476.480 101.087 474.098 107.723 474.098 107.724 C 474.098 107.724 479.127 102.765 479.128 102.764 C 479.128 102.765 482.849 108.763 482.849 108.764 C 482.849 108.763 482.099 101.759 482.099 101.758 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 416.806 78.172 C 416.806 78.172 422.717 78.170 422.718 78.170 C 422.717 78.170 417.375 75.598 417.375 75.597 C 417.375 75.597 421.063 70.979 421.063 70.979 C 421.063 70.979 415.741 73.543 415.741 73.543 C 415.740 73.543 414.420 67.761 414.419 67.760 C 414.419 67.761 413.107 73.542 413.107 73.542 C 413.107 73.542 407.763 70.968 407.763 70.968 C 407.763 70.969 411.465 75.598 411.465 75.599 C 411.464 75.599 406.126 78.175 406.126 78.176 C 406.126 78.176 412.056 78.174 412.057 78.174 C 412.057 78.174 410.735 83.941 410.734 83.941 C 410.735 83.941 414.429 79.308 414.430 79.307 C 414.430 79.308 418.129 83.933 418.130 83.934 C 418.129 83.933 416.806 78.173 416.806 78.172 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 408.533 43.677 C 408.534 43.677 418.485 45.020 418.486 45.020 C 418.485 45.020 410.079 39.473 410.078 39.472 C 410.079 39.471 417.338 32.538 417.339 32.537 C 417.338 32.538 407.796 35.642 407.795 35.642 C 407.795 35.641 406.889 25.609 406.889 25.608 C 406.888 25.609 403.363 35.040 403.363 35.040 C 403.362 35.040 394.953 29.491 394.952 29.491 C 394.953 29.492 400.129 38.127 400.130 38.128 C 400.129 38.128 390.557 41.250 390.556 41.250 C 390.557 41.250 400.539 42.598 400.540 42.598 C 400.540 42.599 397.000 52.004 397.000 52.005 C 397.001 52.004 404.276 45.047 404.276 45.046 C 404.277 45.047 409.449 53.676 409.450 53.677 C 409.450 53.676 408.533 43.678 408.533 43.677 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 374.911 36.359 C 374.911 36.360 381.180 37.109 381.181 37.109 C 381.180 37.109 375.842 33.702 375.841 33.701 C 375.842 33.701 380.340 29.272 380.340 29.272 C 380.339 29.272 374.370 31.315 374.370 31.316 C 374.370 31.315 373.704 25.016 373.704 25.016 C 373.704 25.016 371.577 30.979 371.577 30.980 C 371.577 30.979 366.237 27.572 366.237 27.571 C 366.237 27.572 369.574 32.951 369.575 32.952 C 369.574 32.952 363.586 35.006 363.586 35.006 C 363.586 35.006 369.875 35.758 369.876 35.758 C 369.875 35.759 367.740 41.705 367.740 41.706 C 367.740 41.705 372.247 37.261 372.248 37.261 C 372.248 37.261 375.583 42.637 375.583 42.638 C 375.583 42.637 374.911 36.360 374.911 36.359 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 393.099 63.401 C 393.099 63.401 398.108 63.999 398.109 63.999 C 398.108 63.999 393.843 61.277 393.843 61.277 C 393.843 61.276 397.437 57.738 397.437 57.738 C 397.437 57.738 392.667 59.370 392.667 59.370 C 392.667 59.370 392.135 54.337 392.135 54.337 C 392.135 54.337 390.436 59.102 390.436 59.102 C 390.435 59.102 386.169 56.379 386.169 56.379 C 386.169 56.379 388.835 60.677 388.836 60.678 C 388.835 60.678 384.051 62.319 384.051 62.319 C 384.051 62.319 389.076 62.920 389.076 62.920 C 389.076 62.920 387.370 67.671 387.370 67.672 C 387.370 67.672 390.971 64.121 390.972 64.121 C 390.972 64.121 393.636 68.416 393.636 68.416 C 393.636 68.416 393.099 63.401 393.099 63.401 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 228.500 136.815 C 228.499 136.815 222.588 136.813 222.588 136.813 C 222.588 136.813 227.930 134.241 227.931 134.240 C 227.930 134.240 224.243 129.622 224.242 129.621 C 224.243 129.622 229.564 132.186 229.565 132.186 C 229.565 132.186 230.886 126.404 230.886 126.403 C 230.886 126.404 232.198 132.184 232.198 132.185 C 232.199 132.185 237.542 129.611 237.543 129.611 C 237.542 129.611 233.841 134.241 233.841 134.242 C 233.841 134.242 239.179 136.818 239.180 136.819 C 239.179 136.819 233.249 136.817 233.248 136.817 C 233.248 136.817 234.571 142.584 234.571 142.584 C 234.571 142.584 230.876 137.951 230.876 137.950 C 230.875 137.951 227.176 142.576 227.176 142.577 C 227.176 142.576 228.500 136.816 228.500 136.815 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 233.870 169.395 C 233.869 169.395 226.851 167.926 226.850 167.925 C 226.851 167.925 233.833 166.196 233.833 166.196 C 233.833 166.195 230.599 159.797 230.599 159.796 C 230.600 159.796 236.283 164.162 236.283 164.162 C 236.284 164.161 239.287 157.624 239.287 157.623 C 239.287 157.624 239.411 164.814 239.411 164.814 C 239.412 164.814 246.396 163.084 246.396 163.084 C 246.396 163.084 240.851 167.664 240.851 167.664 C 240.851 167.665 246.551 172.048 246.552 172.049 C 246.551 172.049 239.509 170.575 239.509 170.575 C 239.509 170.576 239.648 177.751 239.648 177.752 C 239.648 177.751 236.410 171.333 236.410 171.332 C 236.409 171.333 230.869 175.908 230.868 175.908 C 230.869 175.908 233.870 169.396 233.870 169.395 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 227.290 222.664 C 227.290 222.664 221.379 222.662 221.378 222.662 C 221.379 222.661 226.721 220.089 226.721 220.089 C 226.721 220.088 223.033 215.470 223.033 215.470 C 223.033 215.470 228.355 218.034 228.355 218.035 C 228.355 218.034 229.676 212.252 229.676 212.252 C 229.677 212.252 230.988 218.033 230.989 218.033 C 230.989 218.033 236.333 215.460 236.333 215.460 C 236.333 215.460 232.631 220.090 232.631 220.090 C 232.631 220.090 237.970 222.667 237.970 222.667 C 237.969 222.667 232.039 222.665 232.039 222.665 C 232.039 222.666 233.361 228.432 233.361 228.433 C 233.361 228.432 229.666 223.799 229.666 223.799 C 229.666 223.799 225.967 228.425 225.966 228.425 C 225.966 228.425 227.290 222.664 227.290 222.664 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 238.099 259.871 C 238.098 259.871 230.975 259.868 230.974 259.868 C 230.975 259.868 237.412 256.768 237.413 256.768 C 237.412 256.767 232.968 251.203 232.968 251.202 C 232.969 251.202 239.381 254.292 239.382 254.292 C 239.382 254.292 240.974 247.325 240.974 247.324 C 240.974 247.325 242.555 254.291 242.555 254.291 C 242.556 254.291 248.995 251.190 248.996 251.189 C 248.995 251.190 244.535 256.769 244.534 256.770 C 244.535 256.770 250.968 259.875 250.968 259.875 C 250.968 259.875 243.822 259.873 243.821 259.873 C 243.821 259.873 245.414 266.822 245.415 266.823 C 245.414 266.822 240.962 261.239 240.962 261.238 C 240.961 261.239 236.504 266.813 236.503 266.814 C 236.503 266.813 238.098 259.872 238.099 259.871 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 224.857 306.670 C 224.856 306.670 220.774 306.668 220.774 306.668 C 220.774 306.668 224.463 304.891 224.464 304.891 C 224.463 304.891 221.917 301.702 221.916 301.701 C 221.917 301.702 225.592 303.472 225.592 303.473 C 225.592 303.472 226.505 299.479 226.505 299.479 C 226.505 299.479 227.411 303.472 227.411 303.472 C 227.411 303.472 231.102 301.694 231.102 301.694 C 231.102 301.695 228.546 304.892 228.545 304.892 C 228.546 304.892 232.232 306.672 232.233 306.672 C 232.232 306.672 228.137 306.671 228.136 306.671 C 228.136 306.671 229.050 310.654 229.050 310.654 C 229.049 310.654 226.498 307.454 226.498 307.453 C 226.497 307.454 223.943 310.649 223.942 310.649 C 223.942 310.648 224.857 306.670 224.857 306.670 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 237.875 198.138 C 237.874 198.138 233.470 198.136 233.469 198.136 C 233.470 198.136 237.450 196.219 237.451 196.219 C 237.450 196.219 234.703 192.778 234.702 192.778 C 234.703 192.778 238.668 194.688 238.668 194.689 C 238.668 194.688 239.653 190.380 239.653 190.380 C 239.653 190.380 240.630 194.687 240.630 194.688 C 240.631 194.688 244.612 192.770 244.613 192.770 C 244.613 192.770 241.854 196.220 241.854 196.220 C 241.855 196.221 245.832 198.140 245.832 198.140 C 245.832 198.140 241.413 198.139 241.413 198.139 C 241.413 198.140 242.398 202.436 242.398 202.436 C 242.398 202.436 239.645 198.984 239.645 198.983 C 239.645 198.984 236.889 202.430 236.888 202.431 C 236.888 202.430 237.875 198.139 237.875 198.138 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 246.036 292.451 C 246.036 292.451 241.631 292.449 241.631 292.449 C 241.631 292.449 245.612 290.532 245.612 290.532 C 245.612 290.531 242.864 287.090 242.864 287.090 C 242.864 287.090 246.829 289.001 246.830 289.001 C 246.830 289.001 247.814 284.693 247.814 284.692 C 247.814 284.693 248.792 289.000 248.792 289.000 C 248.792 289.000 252.774 287.082 252.774 287.082 C 252.774 287.083 250.016 290.532 250.016 290.533 C 250.016 290.533 253.994 292.453 253.994 292.453 C 253.994 292.453 249.575 292.452 249.574 292.452 C 249.574 292.452 250.560 296.749 250.560 296.749 C 250.560 296.749 247.807 293.296 247.806 293.296 C 247.806 293.296 245.050 296.743 245.050 296.743 C 245.050 296.743 246.036 292.451 246.036 292.451 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 491.722 136.815 C 491.722 136.815 497.634 136.813 497.634 136.813 C 497.634 136.813 492.292 134.241 492.291 134.240 C 492.291 134.240 495.979 129.622 495.980 129.621 C 495.979 129.622 490.658 132.186 490.657 132.186 C 490.657 132.186 489.336 126.404 489.336 126.403 C 489.336 126.404 488.024 132.184 488.024 132.185 C 488.023 132.185 482.680 129.611 482.679 129.611 C 482.679 129.611 486.381 134.241 486.381 134.242 C 486.381 134.242 481.043 136.818 481.042 136.819 C 481.043 136.819 486.973 136.817 486.973 136.817 C 486.973 136.817 485.651 142.584 485.651 142.584 C 485.651 142.584 489.346 137.951 489.346 137.950 C 489.347 137.951 493.046 142.576 493.046 142.577 C 493.046 142.576 491.722 136.816 491.722 136.815 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 486.352 169.395 C 486.352 169.395 493.371 167.926 493.372 167.925 C 493.371 167.925 486.389 166.196 486.388 166.196 C 486.389 166.195 489.622 159.797 489.623 159.796 C 489.622 159.796 483.939 164.162 483.938 164.162 C 483.938 164.161 480.935 157.624 480.935 157.623 C 480.935 157.624 480.811 164.814 480.811 164.814 C 480.810 164.814 473.826 163.084 473.826 163.084 C 473.826 163.084 479.370 167.664 479.371 167.664 C 479.370 167.665 473.671 172.048 473.670 172.049 C 473.671 172.049 480.712 170.575 480.713 170.575 C 480.713 170.576 480.574 177.751 480.574 177.752 C 480.574 177.751 483.812 171.333 483.812 171.332 C 483.812 171.333 489.353 175.908 489.353 175.908 C 489.353 175.908 486.352 169.396 486.352 169.395 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 492.931 222.664 C 492.932 222.664 498.843 222.662 498.844 222.662 C 498.843 222.661 493.501 220.089 493.501 220.089 C 493.501 220.088 497.189 215.470 497.189 215.470 C 497.189 215.470 491.867 218.034 491.867 218.035 C 491.866 218.034 490.546 212.252 490.545 212.252 C 490.545 212.252 489.233 218.033 489.233 218.033 C 489.233 218.033 483.889 215.460 483.889 215.460 C 483.889 215.460 487.590 220.090 487.591 220.090 C 487.590 220.090 482.252 222.667 482.252 222.667 C 482.252 222.667 488.182 222.665 488.183 222.665 C 488.183 222.666 486.861 228.432 486.860 228.433 C 486.861 228.432 490.555 223.799 490.556 223.799 C 490.556 223.799 494.255 228.425 494.256 228.425 C 494.255 228.425 492.932 222.664 492.931 222.664 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 482.123 259.871 C 482.124 259.871 489.247 259.868 489.248 259.868 C 489.247 259.868 482.810 256.768 482.809 256.768 C 482.809 256.767 487.253 251.203 487.254 251.202 C 487.253 251.202 480.840 254.292 480.840 254.292 C 480.840 254.292 479.248 247.325 479.248 247.324 C 479.248 247.325 477.667 254.291 477.666 254.291 C 477.666 254.291 471.227 251.190 471.226 251.189 C 471.226 251.190 475.687 256.769 475.687 256.770 C 475.687 256.770 469.254 259.875 469.254 259.875 C 469.254 259.875 476.400 259.873 476.401 259.873 C 476.401 259.873 474.807 266.822 474.807 266.823 C 474.808 266.822 479.260 261.239 479.260 261.238 C 479.261 261.239 483.718 266.813 483.719 266.814 C 483.719 266.813 482.123 259.872 482.123 259.871 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 495.365 306.670 C 495.365 306.670 499.448 306.668 499.448 306.668 C 499.448 306.668 495.759 304.891 495.758 304.891 C 495.758 304.891 498.305 301.702 498.306 301.701 C 498.305 301.702 494.630 303.472 494.630 303.473 C 494.629 303.472 493.717 299.479 493.717 299.479 C 493.717 299.479 492.811 303.472 492.811 303.472 C 492.810 303.472 489.120 301.694 489.120 301.694 C 489.120 301.695 491.676 304.892 491.677 304.892 C 491.676 304.892 487.989 306.672 487.989 306.672 C 487.989 306.672 492.085 306.671 492.085 306.671 C 492.085 306.671 491.172 310.654 491.172 310.654 C 491.172 310.654 493.724 307.454 493.724 307.453 C 493.724 307.454 496.279 310.649 496.279 310.649 C 496.279 310.648 495.365 306.670 495.365 306.670 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 482.347 198.138 C 482.348 198.138 486.752 198.136 486.752 198.136 C 486.752 198.136 482.772 196.219 482.771 196.219 C 482.771 196.219 485.519 192.778 485.519 192.778 C 485.519 192.778 481.554 194.688 481.554 194.689 C 481.554 194.688 480.569 190.380 480.569 190.380 C 480.569 190.380 479.591 194.687 479.591 194.688 C 479.591 194.688 475.609 192.770 475.609 192.770 C 475.609 192.770 478.367 196.220 478.368 196.220 C 478.367 196.221 474.390 198.140 474.389 198.140 C 474.390 198.140 478.809 198.139 478.809 198.139 C 478.809 198.140 477.823 202.436 477.823 202.436 C 477.824 202.436 480.577 198.984 480.577 198.983 C 480.577 198.984 483.333 202.430 483.333 202.431 C 483.333 202.430 482.347 198.139 482.347 198.138 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 474.186 292.451 C 474.186 292.451 478.590 292.449 478.591 292.449 C 478.590 292.449 474.610 290.532 474.610 290.532 C 474.610 290.531 477.358 287.090 477.358 287.090 C 477.357 287.090 473.392 289.001 473.392 289.001 C 473.392 289.001 472.408 284.693 472.408 284.692 C 472.407 284.693 471.430 289.000 471.430 289.000 C 471.429 289.000 467.448 287.082 467.447 287.082 C 467.448 287.083 470.206 290.532 470.206 290.533 C 470.206 290.533 466.228 292.453 466.228 292.453 C 466.228 292.453 470.647 292.452 470.647 292.452 C 470.647 292.452 469.662 296.749 469.662 296.749 C 469.662 296.749 472.415 293.296 472.415 293.296 C 472.416 293.296 475.172 296.743 475.172 296.743 C 475.172 296.743 474.186 292.451 474.186 292.451 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 296.548 409.581 C 296.553 409.582 339.999 427.578 340.003 427.580 C 340.003 427.581 343.110 429.302 341.888 432.253 C 340.665 435.203 337.251 434.224 337.251 434.224 C 337.247 434.222 293.800 416.226 293.796 416.224 C 293.796 416.224 290.431 414.510 291.694 411.461 C 292.957 408.413 296.548 409.581 296.548 409.581 M 365.887 416.678 C 365.889 416.674 383.885 373.228 383.887 373.223 C 383.888 373.223 385.609 370.116 388.560 371.338 C 391.510 372.561 390.531 375.975 390.531 375.975 C 390.529 375.980 372.533 419.426 372.531 419.430 C 372.531 419.430 370.817 422.795 367.768 421.533 C 364.720 420.270 365.888 416.679 365.887 416.678 M 380.152 427.075 C 380.156 427.073 423.603 409.077 423.607 409.075 C 423.607 409.075 427.022 408.096 428.244 411.046 C 429.466 413.997 426.359 415.718 426.359 415.719 C 426.354 415.721 382.908 433.717 382.904 433.719 C 382.903 433.718 379.313 434.886 378.050 431.838 C 376.787 428.789 380.152 427.075 380.152 427.075 M 383.608 506.077 C 383.606 506.072 365.610 462.626 365.608 462.622 C 365.609 462.621 364.629 459.207 367.580 457.985 C 370.530 456.763 372.252 459.870 372.252 459.870 C 372.254 459.874 390.250 503.321 390.252 503.325 C 390.252 503.325 391.420 506.916 388.371 508.179 C 385.322 509.442 383.609 506.077 383.608 506.077 M 385.131 445.496 C 385.135 445.497 426.445 462.970 426.449 462.972 C 426.449 462.972 429.556 464.694 428.333 467.645 C 427.111 470.595 423.697 469.616 423.697 469.616 C 423.693 469.614 380.246 451.618 380.242 451.616 C 380.242 451.616 376.726 449.835 378.140 446.853 C 380.073 442.775 385.130 445.496 385.131 445.496 M 330.237 503.016 C 330.238 503.012 348.234 459.566 348.236 459.561 C 348.237 459.561 349.958 456.455 352.909 457.677 C 355.859 458.899 354.880 462.313 354.880 462.314 C 354.878 462.318 336.882 505.764 336.880 505.769 C 336.880 505.769 335.166 509.134 332.118 507.871 C 329.069 506.608 330.237 503.017 330.237 503.016 M 293.595 462.927 C 293.600 462.926 337.046 444.930 337.050 444.928 C 337.051 444.928 340.465 443.949 341.687 446.899 C 342.909 449.850 339.802 451.572 339.802 451.572 C 339.798 451.574 296.352 469.570 296.347 469.572 C 296.347 469.571 292.756 470.739 291.493 467.690 C 290.230 464.641 293.595 462.928 293.595 462.927 M 347.658 419.285 C 347.656 419.281 329.660 375.835 329.658 375.830 C 329.658 375.830 328.679 372.416 331.629 371.194 C 334.580 369.971 336.301 373.078 336.302 373.078 C 336.304 373.083 354.300 416.529 354.302 416.533 C 354.301 416.534 355.469 420.125 352.420 421.387 C 349.372 422.650 347.658 419.285 347.658 419.285 M 312.899 387.590 C 312.902 387.594 346.155 420.846 346.158 420.849 C 346.158 420.850 348.369 423.629 346.111 425.887 C 343.853 428.145 341.074 425.934 341.073 425.934 C 341.070 425.931 307.817 392.679 307.814 392.675 C 307.814 392.675 305.361 389.804 307.695 387.470 C 310.028 385.137 312.899 387.590 312.899 387.590 M 374.244 420.683 C 374.247 420.679 407.500 387.427 407.503 387.424 C 407.504 387.424 410.283 385.212 412.541 387.470 C 414.800 389.729 412.588 392.508 412.588 392.509 C 412.585 392.512 379.332 425.764 379.329 425.768 C 379.329 425.768 376.458 428.220 374.125 425.887 C 371.791 423.554 374.244 420.683 374.244 420.683 M 383.445 435.746 C 383.449 435.746 430.475 435.746 430.480 435.746 C 430.480 435.747 434.009 436.149 434.009 439.342 C 434.009 442.536 430.480 442.937 430.480 442.938 C 430.475 442.938 383.449 442.938 383.445 442.938 C 383.444 442.937 379.679 442.642 379.679 439.342 C 379.679 436.042 383.444 435.747 383.445 435.746 M 356.404 510.058 C 356.404 510.053 356.404 463.027 356.404 463.022 C 356.405 463.022 356.807 459.493 360.000 459.493 C 363.194 459.493 363.595 463.022 363.596 463.022 C 363.596 463.027 363.596 510.053 363.596 510.058 C 363.595 510.058 363.300 513.822 360.000 513.822 C 356.700 513.822 356.405 510.058 356.404 510.058 M 379.221 453.369 C 379.224 453.373 412.476 486.625 412.480 486.628 C 412.480 486.629 414.691 489.408 412.433 491.667 C 410.175 493.925 407.395 491.713 407.395 491.713 C 407.391 491.710 374.139 458.458 374.136 458.454 C 374.136 458.454 371.683 455.583 374.016 453.250 C 376.350 450.916 379.220 453.369 379.221 453.369 M 308.267 486.806 C 308.270 486.803 341.523 453.550 341.526 453.547 C 341.526 453.547 344.306 451.335 346.564 453.594 C 348.822 455.852 346.611 458.631 346.611 458.632 C 346.608 458.635 313.355 491.888 313.352 491.891 C 313.351 491.891 310.481 494.344 308.147 492.011 C 305.814 489.677 308.267 486.806 308.267 486.806 M 289.756 435.746 C 289.761 435.746 336.786 435.746 336.791 435.746 C 336.792 435.747 340.321 436.148 340.321 439.342 C 340.321 442.536 336.792 442.937 336.791 442.938 C 336.786 442.938 289.761 442.938 289.756 442.938 C 289.756 442.937 285.991 442.642 285.991 439.342 C 285.991 436.042 289.756 435.747 289.756 435.746 M 356.404 416.115 C 356.404 416.110 356.404 369.084 356.404 369.079 C 356.405 369.079 356.807 365.550 360.000 365.550 C 363.194 365.550 363.595 369.079 363.596 369.079 C 363.596 369.084 363.596 416.110 363.596 416.115 C 363.595 416.115 363.300 419.880 360.000 419.880 C 356.700 419.880 356.405 416.115 356.404 416.115 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 464.980 C 367.095 464.980 373.504 462.118 378.140 457.482 C 382.776 452.847 385.638 446.437 385.638 439.342 C 385.638 432.247 382.776 425.838 378.140 421.202 C 373.504 416.567 367.095 413.705 360.000 413.705 C 352.905 413.705 346.496 416.567 341.860 421.202 C 337.224 425.838 334.362 432.247 334.362 439.342 C 334.362 446.437 337.224 452.847 341.860 457.482 C 346.496 462.118 352.905 464.980 360.000 464.980 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 315.351 483.991 C 326.761 495.401 342.537 502.445 360.000 502.445 C 377.463 502.445 393.239 495.401 404.649 483.991 C 416.059 472.582 423.103 456.806 423.103 439.342 C 423.103 421.879 416.059 406.103 404.649 394.693 C 393.239 383.283 377.463 376.239 360.000 376.239 C 342.537 376.239 326.761 383.283 315.351 394.693 C 303.941 406.103 296.897 421.879 296.897 439.342 C 296.897 456.806 303.941 472.582 315.351 483.991 M 306.987 492.355 C 320.534 505.902 339.265 514.266 360.000 514.266 C 380.735 514.266 399.466 505.902 413.013 492.355 C 426.560 478.808 434.923 460.077 434.923 439.342 C 434.923 418.607 426.560 399.876 413.013 386.329 C 399.466 372.782 380.735 364.419 360.000 364.419 C 339.265 364.419 320.534 372.782 306.987 386.329 C 293.440 399.876 285.077 418.607 285.077 439.342 C 285.077 460.077 293.440 478.808 306.987 492.355 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S67\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 219.561 349.783 C 219.589 349.783 500.411 349.783 500.439 349.783 C 500.439 349.784 500.439 360.532 500.439 360.533 C 500.411 360.533 219.589 360.533 219.561 360.533 C 219.561 360.532 219.561 349.784 219.561 349.783 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 239.803 326.577 C 252.893 326.577 263.453 337.137 263.453 350.227 C 263.453 363.318 252.893 373.878 239.803 373.878 C 226.712 373.878 216.152 363.318 216.152 350.227 C 216.152 337.137 226.712 326.577 239.803 326.577 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 481.015 332.131 C 495.962 336.896 505.591 340.739 503.848 367.639 C 494.731 368.838 487.558 369.526 477.744 371.664 C 474.039 350.527 463.093 349.730 455.320 348.831 C 456.689 336.915 469.214 329.988 481.015 332.131 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 483.648 370.238 C 483.925 361.020 482.537 354.217 475.880 346.114 M 491.417 369.011 C 490.942 358.893 491.508 352.457 484.875 344.478 M 493.053 344.069 C 498.370 352.014 499.275 358.080 499.186 367.376 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 245.741 348.733 C 235.595 348.363 228.225 346.342 219.810 338.437 M 245.210 357.390 C 233.199 356.139 225.501 356.378 216.452 347.944 M 218.339 358.990 C 227.068 364.652 233.684 365.541 243.798 365.299 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 200.672 148.951 C 200.673 148.950 208.044 147.473 208.044 147.472 C 208.049 147.494 251.895 366.161 251.900 366.183 C 251.899 366.183 244.528 367.661 244.527 367.661 C 244.523 367.639 200.677 148.972 200.672 148.951 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 200.514 148.102 C 200.513 148.102 192.271 150.317 192.270 150.318 C 192.271 150.317 198.754 144.726 198.755 144.725 C 198.754 144.725 191.879 139.670 191.879 139.669 C 191.879 139.669 200.261 141.248 200.262 141.248 C 200.262 141.248 199.935 132.691 199.935 132.690 C 199.935 132.691 203.933 140.258 203.934 140.259 C 203.934 140.258 210.419 134.666 210.420 134.665 C 210.420 134.666 206.995 142.509 206.995 142.510 C 206.995 142.510 215.404 144.100 215.405 144.100 C 215.404 144.101 207.135 146.323 207.135 146.323 C 207.135 146.324 211.142 153.867 211.143 153.868 C 211.142 153.868 204.252 148.793 204.252 148.793 C 204.251 148.794 200.830 156.631 200.829 156.632 C 200.829 156.631 200.514 148.103 200.514 148.102 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"chariot_horses_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 546.626 558.155 C 546.634 558.154 588.087 559.890 623.104 548.499 C 633.666 545.064 635.912 557.436 637.903 560.552 C 641.859 566.746 660.956 605.509 667.974 618.292 C 670.130 622.218 666.646 634.958 667.560 647.398 C 668.122 655.045 653.785 674.290 653.784 674.292 C 653.783 674.290 641.783 648.375 641.782 648.372 C 641.783 648.371 654.778 638.140 654.306 632.473 C 653.656 624.671 642.761 627.455 643.339 622.659 C 645.351 605.946 627.601 570.936 623.801 569.117 C 619.279 566.953 560.418 593.200 560.412 593.202 C 560.409 593.202 535.844 587.692 535.842 587.691 C 535.843 587.688 546.625 558.158 546.626 558.155 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 617.974 389.739 C 637.482 394.512 638.075 410.797 640.302 432.389 C 649.298 424.045 663.383 414.667 658.302 392.747 C 655.418 380.303 640.526 370.419 631.867 371.945 C 630.625 381.736 625.137 386.502 617.974 389.739 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 631.867 371.945 C 630.625 381.736 625.137 386.502 617.974 389.739 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 631.867 371.945 C 630.625 381.736 625.137 386.502 617.974 389.739 C 615.567 389.150 613.440 387.344 610.684 386.237 C 614.500 379.402 620.254 372.701 614.288 353.473 C 623.614 356.386 629.571 366.552 631.867 371.945 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 614.288 353.473 C 620.254 372.701 614.500 379.402 610.684 386.237 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 614.288 353.473 C 620.254 372.701 614.500 379.402 610.684 386.237 C 605.315 384.082 599.897 382.403 593.830 381.009 C 595.248 363.592 589.230 350.053 573.957 341.959 C 589.551 338.814 604.240 342.900 614.288 353.473 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 573.957 341.959 C 589.230 350.053 595.248 363.592 593.830 381.009 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 573.957 341.959 C 589.230 350.053 595.248 363.592 593.830 381.009 C 587.715 379.605 581.408 378.745 574.538 378.712 C 568.560 364.573 559.236 349.171 533.562 345.075 C 542.775 338.271 565.044 337.418 573.957 341.959 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 533.562 345.075 C 559.236 349.171 568.560 364.573 574.538 378.712 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 533.562 345.075 C 559.236 349.171 568.560 364.573 574.538 378.712 C 565.688 378.669 556.249 379.165 546.410 382.645 C 539.073 369.027 521.625 359.482 500.333 359.198 C 505.761 352.921 521.306 344.288 533.562 345.075 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 500.333 359.198 C 521.625 359.482 539.073 369.027 546.410 382.645 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 500.333 359.198 C 521.625 359.482 539.073 369.027 546.410 382.645 C 539.035 385.253 531.719 388.349 525.125 393.679 C 512.978 387.524 496.533 379.171 465.249 391.629 C 472.634 372.433 489.373 361.741 500.333 359.198 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 465.249 391.629 C 496.533 379.171 512.978 387.524 525.125 393.679 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 465.249 391.629 C 496.533 379.171 512.978 387.524 525.125 393.679 C 515.256 401.657 507.712 411.083 502.652 420.632 C 481.833 415.142 463.983 413.687 443.564 426.529 C 444.327 418.986 452.920 398.072 465.249 391.629 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 443.564 426.529 C 463.983 413.687 481.833 415.142 502.652 420.632 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 443.564 426.529 C 463.983 413.687 481.833 415.142 502.652 420.632 C 494.183 436.615 487.172 448.778 483.768 461.939 C 469.068 454.782 436.430 462.762 418.431 482.648 C 418.867 474.634 418.686 448.723 443.564 426.529 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 418.431 482.648 C 436.430 462.762 469.068 454.782 483.768 461.939 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 418.431 482.648 C 436.430 462.762 469.068 454.782 483.768 461.939 C 480.340 475.197 468.790 522.210 468.789 522.216 C 468.783 522.217 425.852 527.544 413.230 529.921 C 408.337 517.115 403.168 501.184 418.431 482.648 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 556.455 514.890 C 566.559 532.867 571.930 559.794 565.710 583.437 C 583.318 587.303 603.603 591.827 619.341 594.331 C 627.444 595.620 628.673 608.373 626.190 610.393 C 617.509 617.456 597.643 650.173 593.970 666.664 C 592.367 673.861 580.269 676.723 568.056 684.914 C 563.376 688.053 542.420 685.291 542.417 685.291 C 542.419 685.289 556.616 663.168 556.618 663.166 C 556.620 663.166 572.974 664.236 574.381 663.185 C 579.119 659.642 576.737 654.080 577.342 652.706 C 580.180 646.259 608.702 616.142 606.009 610.414 C 603.436 604.940 540.463 616.382 532.123 614.143 C 524.741 612.162 516.841 600.801 516.840 600.800 C 516.841 600.801 525.013 612.036 531.548 614.195 C 533.877 614.965 543.630 612.930 548.823 613.328 C 513.380 644.652 473.880 664.619 360.000 663.052 C 360.000 663.052 359.999 528.946 360.000 528.928 C 378.782 529.577 430.008 524.348 457.758 502.550 C 475.544 488.578 478.085 412.246 522.504 386.073 C 572.205 356.787 621.579 384.741 621.589 384.741 C 621.590 384.739 633.747 364.912 633.748 364.910 C 633.748 364.913 634.719 392.045 634.719 392.047 C 634.719 392.049 641.637 398.459 642.468 410.661 C 643.105 420.010 639.698 481.064 637.672 485.225 C 636.016 488.628 627.281 491.383 627.280 491.384 C 627.280 491.382 621.823 477.230 621.823 477.229 C 621.822 477.230 618.453 488.666 618.453 488.667 C 618.452 488.667 611.101 485.867 610.984 484.533 C 609.898 472.127 607.870 460.359 607.870 460.357 C 607.868 460.354 594.170 450.590 588.039 434.663 C 562.076 438.262 556.683 489.768 556.455 514.890 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 556.455 514.890 C 566.559 532.867 571.930 559.794 565.710 583.437 C 583.318 587.303 603.603 591.827 619.341 594.331 C 627.444 595.620 628.673 608.373 626.190 610.393 C 617.509 617.456 597.643 650.173 593.970 666.664 C 592.367 673.861 580.269 676.723 568.056 684.914 C 563.376 688.053 542.420 685.291 542.417 685.291 C 542.419 685.289 556.616 663.168 556.618 663.166 C 556.620 663.166 572.974 664.236 574.381 663.185 C 579.119 659.642 576.737 654.080 577.342 652.706 C 580.180 646.259 608.702 616.142 606.009 610.414 C 603.436 604.940 540.463 616.382 532.123 614.143 C 524.741 612.162 516.841 600.801 516.840 600.800 C 516.841 600.801 525.013 612.036 531.548 614.195 C 533.877 614.965 543.630 612.930 548.823 613.328 C 513.380 644.652 473.880 664.619 360.000 663.052 C 360.000 663.052 359.999 528.946 360.000 528.928 C 378.782 529.577 430.008 524.348 457.758 502.550 C 475.544 488.578 478.085 412.246 522.504 386.073 C 572.205 356.787 621.579 384.741 621.589 384.741 C 621.590 384.739 633.747 364.912 633.748 364.910 C 633.748 364.913 634.719 392.045 634.719 392.047 C 634.719 392.049 641.637 398.459 642.468 410.661 C 643.105 420.010 639.698 481.064 637.672 485.225 C 636.016 488.628 627.281 491.383 627.280 491.384 C 627.280 491.382 621.823 477.230 621.823 477.229 C 621.822 477.230 618.453 488.666 618.453 488.667 C 618.452 488.667 611.101 485.867 610.984 484.533 C 609.898 472.127 607.870 460.359 607.870 460.357 C 607.868 460.354 594.170 450.590 588.039 434.663 C 562.076 438.262 556.683 489.768 556.455 514.890 M 532.399 575.590 C 538.785 577.400 551.277 580.210 565.710 583.437 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 625.373 424.882 C 629.680 423.188 631.788 418.346 630.094 414.039 C 628.400 409.731 623.558 407.623 619.250 409.317 C 614.943 411.012 612.835 415.854 614.529 420.161 C 616.224 424.468 621.065 426.577 625.373 424.882 M 630.493 437.485 C 630.493 437.482 639.623 427.516 633.810 412.740 C 627.998 397.964 614.525 396.889 614.523 396.887 C 614.523 396.890 605.395 406.856 611.207 421.631 C 617.019 436.407 630.491 437.483 630.493 437.485 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 173.374 558.155 C 173.366 558.154 131.913 559.890 96.896 548.499 C 86.334 545.064 84.088 557.436 82.098 560.552 C 78.141 566.746 59.044 605.509 52.026 618.292 C 49.870 622.218 53.354 634.958 52.440 647.398 C 51.878 655.045 66.215 674.290 66.216 674.292 C 66.217 674.290 78.217 648.375 78.218 648.372 C 78.217 648.371 65.222 638.140 65.694 632.473 C 66.344 624.671 77.239 627.455 76.661 622.659 C 74.649 605.946 92.399 570.936 96.199 569.117 C 100.721 566.953 159.582 593.200 159.588 593.202 C 159.591 593.202 184.156 587.692 184.158 587.691 C 184.157 587.688 173.375 558.158 173.374 558.155 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 102.027 389.739 C 82.518 394.512 81.925 410.797 79.698 432.389 C 70.702 424.045 56.617 414.667 61.698 392.747 C 64.582 380.303 79.474 370.419 88.133 371.945 C 89.375 381.736 94.863 386.502 102.027 389.739 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 88.133 371.945 C 89.375 381.736 94.863 386.502 102.027 389.739 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 88.133 371.945 C 89.375 381.736 94.863 386.502 102.027 389.739 C 104.433 389.150 106.560 387.344 109.316 386.237 C 105.500 379.402 99.746 372.701 105.712 353.473 C 96.386 356.386 90.429 366.552 88.133 371.945 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 105.712 353.473 C 99.746 372.701 105.500 379.402 109.316 386.237 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 105.712 353.473 C 99.746 372.701 105.500 379.402 109.316 386.237 C 114.685 384.082 120.103 382.403 126.170 381.009 C 124.752 363.592 130.770 350.053 146.043 341.959 C 130.449 338.814 115.760 342.900 105.712 353.473 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 146.043 341.959 C 130.770 350.053 124.752 363.592 126.170 381.009 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 146.043 341.959 C 130.770 350.053 124.752 363.592 126.170 381.009 C 132.285 379.605 138.592 378.745 145.462 378.712 C 151.440 364.573 160.764 349.171 186.438 345.075 C 177.225 338.271 154.957 337.418 146.043 341.959 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 186.438 345.075 C 160.764 349.171 151.440 364.573 145.462 378.712 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 186.438 345.075 C 160.764 349.171 151.440 364.573 145.462 378.712 C 154.312 378.669 163.751 379.165 173.590 382.645 C 180.927 369.027 198.375 359.482 219.667 359.198 C 214.239 352.921 198.695 344.288 186.438 345.075 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 219.667 359.198 C 198.375 359.482 180.927 369.027 173.590 382.645 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 219.667 359.198 C 198.375 359.482 180.927 369.027 173.590 382.645 C 180.965 385.253 188.281 388.349 194.875 393.679 C 207.022 387.524 223.467 379.171 254.751 391.629 C 247.366 372.433 230.627 361.741 219.667 359.198 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 254.751 391.629 C 223.467 379.171 207.022 387.524 194.875 393.679 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 254.751 391.629 C 223.467 379.171 207.022 387.524 194.875 393.679 C 204.744 401.657 212.288 411.083 217.348 420.632 C 238.167 415.142 256.017 413.687 276.436 426.529 C 275.673 418.986 267.080 398.072 254.751 391.629 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 276.436 426.529 C 256.017 413.687 238.167 415.142 217.348 420.632 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 276.436 426.529 C 256.017 413.687 238.167 415.142 217.348 420.632 C 225.817 436.615 232.828 448.778 236.232 461.939 C 250.932 454.782 283.571 462.762 301.569 482.648 C 301.133 474.634 301.314 448.723 276.436 426.529 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.569 482.648 C 283.571 462.762 250.932 454.782 236.232 461.939 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.569 482.648 C 283.571 462.762 250.932 454.782 236.232 461.939 C 239.660 475.197 251.210 522.210 251.211 522.216 C 251.217 522.217 294.148 527.544 306.770 529.921 C 311.663 517.115 316.832 501.184 301.569 482.648 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 163.545 514.890 C 153.441 532.867 148.070 559.794 154.290 583.437 C 136.682 587.303 116.397 591.827 100.659 594.331 C 92.556 595.620 91.327 608.373 93.810 610.393 C 102.491 617.456 122.357 650.173 126.030 666.664 C 127.633 673.861 139.731 676.723 151.944 684.914 C 156.624 688.053 177.580 685.291 177.583 685.291 C 177.581 685.289 163.384 663.168 163.382 663.166 C 163.381 663.166 147.026 664.236 145.619 663.185 C 140.881 659.642 143.263 654.080 142.658 652.706 C 139.820 646.259 111.298 616.142 113.991 610.414 C 116.564 604.940 179.537 616.382 187.877 614.143 C 195.259 612.162 203.159 600.801 203.160 600.800 C 203.159 600.801 194.987 612.036 188.452 614.195 C 186.123 614.965 176.370 612.930 171.177 613.328 C 206.620 644.652 246.120 664.619 360.000 663.052 C 360.000 663.052 360.001 528.946 360.000 528.928 C 341.218 529.577 289.992 524.348 262.242 502.550 C 244.456 488.578 241.915 412.246 197.496 386.073 C 147.795 356.787 98.421 384.741 98.411 384.741 C 98.410 384.739 86.253 364.912 86.252 364.910 C 86.252 364.913 85.281 392.045 85.281 392.047 C 85.281 392.049 78.363 398.459 77.532 410.661 C 76.895 420.010 80.302 481.064 82.328 485.225 C 83.984 488.628 92.719 491.383 92.720 491.384 C 92.720 491.382 98.177 477.230 98.177 477.229 C 98.178 477.230 101.547 488.666 101.548 488.667 C 101.548 488.667 108.899 485.867 109.016 484.533 C 110.102 472.127 112.130 460.359 112.130 460.357 C 112.132 460.354 125.830 450.590 131.961 434.663 C 157.924 438.262 163.317 489.768 163.545 514.890 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 163.545 514.890 C 153.441 532.867 148.070 559.794 154.290 583.437 C 136.682 587.303 116.397 591.827 100.659 594.331 C 92.556 595.620 91.327 608.373 93.810 610.393 C 102.491 617.456 122.357 650.173 126.030 666.664 C 127.633 673.861 139.731 676.723 151.944 684.914 C 156.624 688.053 177.580 685.291 177.583 685.291 C 177.581 685.289 163.384 663.168 163.382 663.166 C 163.381 663.166 147.026 664.236 145.619 663.185 C 140.881 659.642 143.263 654.080 142.658 652.706 C 139.820 646.259 111.298 616.142 113.991 610.414 C 116.564 604.940 179.537 616.382 187.877 614.143 C 195.259 612.162 203.159 600.801 203.160 600.800 C 203.159 600.801 194.987 612.036 188.452 614.195 C 186.123 614.965 176.370 612.930 171.177 613.328 C 206.620 644.652 246.120 664.619 360.000 663.052 C 360.000 663.052 360.001 528.946 360.000 528.928 C 341.218 529.577 289.992 524.348 262.242 502.550 C 244.456 488.578 241.915 412.246 197.496 386.073 C 147.795 356.787 98.421 384.741 98.411 384.741 C 98.410 384.739 86.253 364.912 86.252 364.910 C 86.252 364.913 85.281 392.045 85.281 392.047 C 85.281 392.049 78.363 398.459 77.532 410.661 C 76.895 420.010 80.302 481.064 82.328 485.225 C 83.984 488.628 92.719 491.383 92.720 491.384 C 92.720 491.382 98.177 477.230 98.177 477.229 C 98.178 477.230 101.547 488.666 101.548 488.667 C 101.548 488.667 108.899 485.867 109.016 484.533 C 110.102 472.127 112.130 460.359 112.130 460.357 C 112.132 460.354 125.830 450.590 131.961 434.663 C 157.924 438.262 163.317 489.768 163.545 514.890 M 187.601 575.590 C 181.215 577.400 168.723 580.210 154.290 583.437 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 94.627 424.882 C 90.320 423.188 88.212 418.346 89.906 414.039 C 91.600 409.731 96.442 407.623 100.750 409.317 C 105.057 411.012 107.165 415.854 105.471 420.161 C 103.776 424.468 98.935 426.577 94.627 424.882 M 89.507 437.485 C 89.507 437.482 80.377 427.516 86.190 412.740 C 92.002 397.964 105.475 396.889 105.477 396.887 C 105.477 396.890 114.605 406.856 108.793 421.631 C 102.981 436.407 89.509 437.483 89.507 437.485 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 632.478 478.082 C 631.032 477.452 629.358 478.111 628.729 479.556 C 628.099 481.002 628.758 482.676 630.204 483.305 C 631.649 483.935 633.323 483.276 633.953 481.830 C 634.582 480.385 633.924 478.711 632.478 478.082 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 87.522 478.082 C 88.968 477.452 90.642 478.111 91.271 479.556 C 91.901 481.002 91.242 482.676 89.796 483.305 C 88.351 483.935 86.677 483.276 86.047 481.830 C 85.418 480.385 86.076 478.711 87.522 478.082 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":320.907,\\\"max\\\":399.093},\\\"y\\\":{\\\"min\\\":264.574,\\\"max\\\":342.76}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.81,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":18.963,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":51.108,\\\"y\\\":520.845,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873265770782,\\\"y\\\":0.005034549158346252}},{\\\"point\\\":{\\\"x\\\":668.892,\\\"y\\\":520.845,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873265770782,\\\"y\\\":0.005034549158346255}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":572.608,\\\"y\\\":272.009,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314075321647938,\\\"y\\\":-0.7754511772675083}},{\\\"point\\\":{\\\"x\\\":148.124,\\\"y\\\":272.081,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817690095223382,\\\"y\\\":-0.7315675072438155}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"church\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":113.136,\\\"max\\\":623.242},\\\"y\\\":{\\\"min\\\":61.477,\\\"max\\\":648.776}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"church\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"windows\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6E36C5C5-556A-415B-BCBF-99F9A1AF819E_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 191.700 171.321 C 191.858 149.744 191.865 123.636 191.875 108.366 C 179.035 108.366 159.471 108.366 159.468 108.366 C 159.468 108.365 159.468 96.022 159.468 96.021 C 159.471 96.021 179.035 96.021 191.876 96.021 C 191.852 83.135 191.852 63.480 191.852 63.477 C 191.853 63.477 204.195 63.477 204.196 63.477 C 204.196 63.480 204.197 84.874 204.246 96.021 C 214.989 96.021 236.577 96.021 236.580 96.021 C 236.580 96.022 236.580 108.365 236.580 108.366 C 236.577 108.366 212.328 108.366 204.244 108.366 C 204.220 128.512 204.195 153.215 204.048 172.702 C 229.192 230.560 279.244 345.734 279.252 345.751 C 279.281 345.751 572.943 345.751 572.972 345.751 C 572.977 345.762 618.604 450.178 618.608 450.189 C 618.609 450.208 621.242 645.878 621.242 645.898 C 621.191 645.898 115.186 646.775 115.136 646.776 C 115.136 646.745 115.136 344.062 115.136 344.032 C 115.136 344.032 191.700 171.321 191.700 171.321 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 549.705 493.864 C 550.395 485.541 556.014 479.734 563.834 479.734 C 571.655 479.734 577.798 484.461 577.963 493.864 C 578.321 514.202 577.669 590.085 577.669 590.095 C 577.666 590.095 549.985 590.159 549.982 590.159 C 549.982 590.149 547.945 515.093 549.705 493.864 M 169.110 344.874 C 169.110 360.661 181.845 373.396 197.632 373.396 C 213.419 373.396 226.155 360.661 226.155 344.874 C 226.155 329.086 213.420 316.351 197.632 316.351 C 181.845 316.351 169.110 329.086 169.110 344.874 M 484.393 493.864 C 484.717 485.518 490.702 479.734 498.523 479.734 C 506.343 479.734 512.486 484.461 512.652 493.864 C 513.010 514.202 512.357 590.085 512.357 590.095 C 512.354 590.095 484.672 590.159 484.670 590.159 C 484.670 590.149 483.570 515.093 484.393 493.864 M 415.938 493.864 C 416.277 485.519 422.248 479.734 430.068 479.734 C 437.889 479.734 443.600 484.479 444.197 493.864 C 445.493 514.202 443.903 590.085 443.903 590.095 C 443.900 590.095 416.218 590.159 416.216 590.159 C 416.216 590.149 415.115 514.155 415.938 493.864 M 348.421 493.864 C 349.112 485.541 354.730 479.734 362.551 479.734 C 370.371 479.734 376.082 484.479 376.680 493.864 C 377.976 514.202 376.385 590.085 376.385 590.095 C 376.382 590.095 348.701 590.159 348.698 590.159 C 348.698 590.149 346.660 515.093 348.421 493.864 M 279.908 493.864 C 280.231 485.518 286.216 479.734 294.037 479.734 C 301.858 479.734 308.001 484.461 308.167 493.864 C 308.525 514.202 307.871 590.085 307.871 590.095 C 307.869 590.095 280.187 590.159 280.184 590.159 C 280.184 590.149 279.084 515.093 279.908 493.864 M 174.593 498.596 C 174.917 484.896 184.946 475.412 197.779 475.412 C 210.611 475.412 221.170 483.167 220.964 498.596 C 220.552 529.544 220.480 644.978 220.480 644.992 C 220.475 644.992 175.052 645.097 175.047 645.097 C 175.047 645.082 173.851 529.962 174.593 498.596 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":236.564,\\\"max\\\":564.993},\\\"y\\\":{\\\"min\\\":354.599,\\\"max\\\":472.404}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":693.725,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":198.124,\\\"y\\\":66.829,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":115.012,\\\"y\\\":451.235,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873181281341,\\\"y\\\":0.005036227050266388}},{\\\"point\\\":{\\\"x\\\":619.248,\\\"y\\\":451.235,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873181281341,\\\"y\\\":0.005036227050266405}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":616.459,\\\"y\\\":642.247,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129699922269475,\\\"y\\\":0.7011945451755215}},{\\\"point\\\":{\\\"x\\\":120.091,\\\"y\\\":642.294,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698688399112506,\\\"y\\\":0.7154261114507937}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":642.687,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6E36C5C5-556A-415B-BCBF-99F9A1AF819E_0\\\",\\\"x1\\\":\\\"49.77%\\\",\\\"y1\\\":\\\"68.86%\\\",\\\"x2\\\":\\\"49.77%\\\",\\\"y2\\\":\\\"-26.34%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"circle\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":36.178,\\\"max\\\":683.822},\\\"y\\\":{\\\"min\\\":15.588000000000001,\\\"max\\\":663.231}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"circle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Circle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#8E02C545-A61C-4A1F-B3C0-8285B9A2D747_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 17.588 C 538.126 17.588 681.822 161.283 681.822 339.409 C 681.822 517.536 538.126 661.231 360.000 661.231 C 181.874 661.231 38.178 517.536 38.178 339.409 C 38.178 161.283 181.874 17.588 360.000 17.588 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":144.21,\\\"max\\\":575.79},\\\"y\\\":{\\\"min\\\":123.619,\\\"max\\\":555.2}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.804,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":19.072,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":40.272,\\\"y\\\":340.321,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874183983771,\\\"y\\\":0.005016277997588125}},{\\\"point\\\":{\\\"x\\\":679.728,\\\"y\\\":340.321,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874183983771,\\\"y\\\":0.005016277997588111}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":133.095,\\\"y\\\":566.388,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698697008836314,\\\"y\\\":0.7154177030540882}},{\\\"point\\\":{\\\"x\\\":586.738,\\\"y\\\":566.484,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128963966821081,\\\"y\\\":0.701269368786108}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":133.86,\\\"y\\\":110.542,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817006374191383,\\\"y\\\":-0.7316312192234149}},{\\\"point\\\":{\\\"x\\\":586.882,\\\"y\\\":110.864,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314191618063133,\\\"y\\\":-0.7754417077406998}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.959,\\\"y\\\":658.327,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"8E02C545-A61C-4A1F-B3C0-8285B9A2D747_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"68.81%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"51.76%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"circle_spiral\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":103.279,\\\"max\\\":616.721},\\\"y\\\":{\\\"min\\\":85.03,\\\"max\\\":598.472}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"circle_spiral\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cloud_spiral_root\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#4FEEBBB3-33A9-4473-9C80-C31EBD03A545_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 596.472 C 500.986 596.472 614.721 482.737 614.721 341.751 C 614.721 200.765 500.986 87.030 360.000 87.030 C 219.014 87.030 105.279 200.765 105.279 341.751 C 105.279 482.737 219.014 596.472 360.000 596.472 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 604.402 371.163 C 602.809 412.482 597.532 433.366 576.252 476.334 M 530.468 180.233 C 584.048 228.491 607.500 290.791 604.402 371.163 M 212.253 216.293 C 280.760 106.011 438.011 96.960 530.468 180.233 M 208.007 406.623 C 174.848 346.544 176.555 273.758 212.253 216.293 M 437.115 451.615 C 365.708 514.002 255.048 491.855 208.007 406.623 M 479.325 353.509 C 480.360 390.547 465.022 427.232 437.115 451.615 M 383.261 252.270 C 437.425 252.004 477.877 301.708 479.325 353.509 M 315.669 293.563 C 328.963 268.106 355.031 252.409 383.261 252.270 M 324.454 355.826 C 305.291 339.468 306.266 311.569 315.669 293.563 M 347.824 363.177 C 337.650 362.944 332.173 362.415 324.454 355.826 M 366.141 334.377 C 377.871 347.373 363.200 363.529 347.824 363.177 M 354.453 336.490 C 354.799 332.844 362.308 330.130 366.141 334.377 M 105.279 341.751 C 105.279 482.737 219.014 596.472 360.000 596.472 C 500.986 596.472 614.721 482.737 614.721 341.751 C 614.721 200.765 500.986 87.030 360.000 87.030 C 219.014 87.030 105.279 200.765 105.279 341.751 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":265.634,\\\"max\\\":454.366},\\\"y\\\":{\\\"min\\\":247.385,\\\"max\\\":436.117}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":692.004,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":66.206,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":78.458,\\\"y\\\":345.79,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874700083806,\\\"y\\\":0.005005979048893389}},{\\\"point\\\":{\\\"x\\\":641.542,\\\"y\\\":345.79,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874700083806,\\\"y\\\":0.005005979048893383}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":559.655,\\\"y\\\":545.603,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129517580740846,\\\"y\\\":0.7012130850597925}},{\\\"point\\\":{\\\"x\\\":160.18,\\\"y\\\":545.644,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987282236274913,\\\"y\\\":0.715387216482354}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":559.795,\\\"y\\\":146.068,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314500680668252,\\\"y\\\":-0.7754165406659841}},{\\\"point\\\":{\\\"x\\\":160.884,\\\"y\\\":146.136,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817245493463407,\\\"y\\\":-0.7316089384490383}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":617.159,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"4FEEBBB3-33A9-4473-9C80-C31EBD03A545_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"50.00%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"43.53%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"96.08%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"circles_concentric\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":72.154,\\\"max\\\":647.846},\\\"y\\\":{\\\"min\\\":72.154,\\\"max\\\":647.846}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"circles_concentric\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"circles_concentric\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 74.654 360.000 C 74.654 517.937 202.063 645.346 360.000 645.346 C 517.937 645.346 645.346 517.937 645.346 360.000 C 645.346 202.063 517.937 74.654 360.000 74.654 C 202.063 74.654 74.654 202.063 74.654 360.000 M 96.603 360.000 C 96.603 505.788 214.212 623.397 360.000 623.397 C 505.788 623.397 623.397 505.788 623.397 360.000 C 623.397 214.212 505.788 96.603 360.000 96.603 C 214.212 96.603 96.603 214.212 96.603 360.000 M 118.553 360.000 C 118.553 493.639 226.361 601.447 360.000 601.447 C 493.639 601.447 601.447 493.639 601.447 360.000 C 601.447 226.361 493.639 118.553 360.000 118.553 C 226.361 118.553 118.553 226.361 118.553 360.000 M 140.503 360.000 C 140.503 481.490 238.510 579.497 360.000 579.497 C 481.490 579.497 579.497 481.490 579.497 360.000 C 579.497 238.510 481.490 140.503 360.000 140.503 C 238.510 140.503 140.503 238.510 140.503 360.000 M 162.453 360.000 C 162.453 469.341 250.659 557.547 360.000 557.547 C 469.341 557.547 557.547 469.341 557.547 360.000 C 557.547 250.659 469.341 162.453 360.000 162.453 C 250.659 162.453 162.453 250.659 162.453 360.000 M 182.094 360.000 C 182.094 458.470 261.530 537.906 360.000 537.906 C 458.470 537.906 537.906 458.470 537.906 360.000 C 537.906 261.530 458.470 182.094 360.000 182.094 C 261.530 182.094 182.094 261.530 182.094 360.000 M 204.058 360.000 C 204.058 446.313 273.687 515.942 360.000 515.942 C 446.313 515.942 515.942 446.313 515.942 360.000 C 515.942 273.687 446.313 204.058 360.000 204.058 C 273.687 204.058 204.058 273.687 204.058 360.000 M 224.686 360.000 C 224.686 434.895 285.105 495.314 360.000 495.314 C 434.895 495.314 495.314 434.895 495.314 360.000 C 495.314 285.105 434.895 224.686 360.000 224.686 C 285.105 224.686 224.686 285.105 224.686 360.000 M 246.321 360.000 C 246.321 422.920 297.080 473.679 360.000 473.679 C 422.920 473.679 473.679 422.920 473.679 360.000 C 473.679 297.080 422.920 246.321 360.000 246.321 C 297.080 246.321 246.321 297.080 246.321 360.000 M 267.260 360.000 C 267.260 411.331 308.669 452.740 360.000 452.740 C 411.331 452.740 452.740 411.331 452.740 360.000 C 452.740 308.669 411.331 267.260 360.000 267.260 C 308.669 267.260 267.260 308.669 267.260 360.000 M 287.254 360.000 C 287.254 400.265 319.736 432.746 360.000 432.746 C 400.265 432.746 432.746 400.265 432.746 360.000 C 432.746 319.736 400.265 287.254 360.000 287.254 C 319.736 287.254 287.254 319.736 287.254 360.000 M 311.503 360.000 C 311.503 386.843 333.157 408.497 360.000 408.497 C 386.843 408.497 408.497 386.843 408.497 360.000 C 408.497 333.157 386.843 311.503 360.000 311.503 C 333.157 311.503 311.503 333.157 311.503 360.000 M 330.398 358.116 C 329.355 374.501 341.731 388.560 358.116 389.602 C 374.501 390.645 388.560 378.269 389.602 361.884 C 390.645 345.499 378.269 331.440 361.884 330.398 C 345.499 329.355 331.440 341.731 330.398 358.116 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"circles_concentric_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 85.800 360.000 C 85.800 511.768 208.232 634.200 360.000 634.200 C 511.768 634.200 634.200 511.768 634.200 360.000 C 634.200 208.232 511.768 85.800 360.000 85.800 C 208.232 85.800 85.800 208.232 85.800 360.000 M 106.892 360.000 C 106.892 500.093 219.907 613.108 360.000 613.108 C 500.093 613.108 613.108 500.093 613.108 360.000 C 613.108 219.907 500.093 106.892 360.000 106.892 C 219.907 106.892 106.892 219.907 106.892 360.000 M 127.985 360.000 C 127.985 488.419 231.581 592.015 360.000 592.015 C 488.419 592.015 592.015 488.419 592.015 360.000 C 592.015 231.581 488.419 127.985 360.000 127.985 C 231.581 127.985 127.985 231.581 127.985 360.000 M 149.077 360.000 C 149.077 476.745 243.256 570.923 360.000 570.923 C 476.745 570.923 570.923 476.745 570.923 360.000 C 570.923 243.256 476.745 149.077 360.000 149.077 C 243.256 149.077 149.077 243.256 149.077 360.000 M 170.169 360.000 C 170.169 465.070 254.930 549.831 360.000 549.831 C 465.070 549.831 549.831 465.070 549.831 360.000 C 549.831 254.930 465.070 170.169 360.000 170.169 C 254.930 170.169 170.169 254.930 170.169 360.000 M 191.262 360.000 C 191.262 453.395 266.605 528.738 360.000 528.738 C 453.395 528.738 528.738 453.395 528.738 360.000 C 528.738 266.605 453.395 191.262 360.000 191.262 C 266.605 191.262 191.262 266.605 191.262 360.000 M 212.354 360.000 C 212.354 441.721 278.279 507.646 360.000 507.646 C 441.721 507.646 507.646 441.721 507.646 360.000 C 507.646 278.279 441.721 212.354 360.000 212.354 C 278.279 212.354 212.354 278.279 212.354 360.000 M 233.446 360.000 C 233.446 430.047 289.953 486.554 360.000 486.554 C 430.047 486.554 486.554 430.047 486.554 360.000 C 486.554 289.953 430.047 233.446 360.000 233.446 C 289.953 233.446 233.446 289.953 233.446 360.000 M 254.538 360.000 C 254.538 418.372 301.628 465.462 360.000 465.462 C 418.372 465.462 465.462 418.372 465.462 360.000 C 465.462 301.628 418.372 254.538 360.000 254.538 C 301.628 254.538 254.538 301.628 254.538 360.000 M 275.631 360.000 C 275.631 406.698 313.302 444.369 360.000 444.369 C 406.698 444.369 444.369 406.698 444.369 360.000 C 444.369 313.302 406.698 275.631 360.000 275.631 C 313.302 275.631 275.631 313.302 275.631 360.000 M 296.723 360.000 C 296.723 395.023 324.977 423.277 360.000 423.277 C 395.023 423.277 423.277 395.023 423.277 360.000 C 423.277 324.977 395.023 296.723 360.000 296.723 C 324.977 296.723 296.723 324.977 296.723 360.000 M 317.815 360.000 C 317.815 383.349 336.651 402.185 360.000 402.185 C 383.349 402.185 402.185 383.349 402.185 360.000 C 402.185 336.651 383.349 317.815 360.000 317.815 C 336.651 317.815 317.815 336.651 317.815 360.000 M 338.908 360.000 C 338.908 371.675 348.325 381.092 360.000 381.092 C 371.675 381.092 381.092 371.675 381.092 360.000 C 381.092 348.325 371.675 338.908 360.000 338.908 C 348.325 338.908 338.908 348.325 338.908 360.000 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":242.319,\\\"max\\\":477.681},\\\"y\\\":{\\\"min\\\":242.805,\\\"max\\\":478.167}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":648.628,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":77.796,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":74.465,\\\"y\\\":361.3,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873936290595,\\\"y\\\":0.005021213295666688}},{\\\"point\\\":{\\\"x\\\":645.535,\\\"y\\\":361.3,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873936290595,\\\"y\\\":0.005021213295666688}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":562.487,\\\"y\\\":563.947,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129123427503464,\\\"y\\\":0.7012531579638074}},{\\\"point\\\":{\\\"x\\\":157.347,\\\"y\\\":563.989,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987607928207248,\\\"y\\\":0.7153554042687819}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":562.629,\\\"y\\\":158.746,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314380392234107,\\\"y\\\":-0.7754263360382432}},{\\\"point\\\":{\\\"x\\\":158.06,\\\"y\\\":158.815,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817328457201344,\\\"y\\\":-0.7316012076714522}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":639.318,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"clock\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":118.325,\\\"max\\\":601.675},\\\"y\\\":{\\\"min\\\":27.278,\\\"max\\\":510.628}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"clock\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"clock\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 510.628 C 493.766 510.628 601.675 402.718 601.675 268.953 C 601.675 135.187 493.766 27.278 360.000 27.278 C 226.235 27.278 118.325 135.187 118.325 268.953 C 118.325 402.718 226.235 510.628 360.000 510.628 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 492.300 C 483.621 492.300 583.347 392.574 583.347 268.953 C 583.347 145.332 483.621 45.606 360.000 45.606 C 236.379 45.606 136.653 145.332 136.653 268.953 C 136.653 392.574 236.379 492.300 360.000 492.300 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 473.815 C 473.390 473.815 564.862 382.343 564.862 268.953 C 564.862 155.563 473.390 64.090 360.000 64.090 C 246.610 64.090 155.138 155.563 155.138 268.953 C 155.138 382.343 246.610 473.815 360.000 473.815 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 197.369 362.848 C 202.297 360.003 207.225 357.157 212.153 354.312 M 522.631 175.058 C 517.703 177.903 512.775 180.748 507.847 183.593 M 266.105 431.584 C 268.950 426.656 271.795 421.728 274.641 416.800 M 453.895 106.321 C 451.050 111.249 448.205 116.178 445.359 121.106 M 522.631 362.848 C 517.703 360.003 512.775 357.157 507.847 354.312 M 197.369 175.058 C 202.297 177.903 207.225 180.748 212.153 183.593 M 453.895 431.584 C 451.050 426.656 448.205 421.728 445.359 416.800 M 266.105 106.321 C 268.950 111.249 271.795 116.178 274.641 121.106 M 172.209 268.953 C 177.900 268.953 183.591 268.953 189.281 268.953 M 547.791 268.953 C 542.100 268.953 536.409 268.953 530.719 268.953 M 360.000 456.743 C 360.000 451.053 360.000 445.362 360.000 439.671 M 360.000 81.162 C 360.000 86.853 360.000 92.544 360.000 98.234 M 155.138 268.953 C 155.138 382.343 246.610 473.815 360.000 473.815 C 473.390 473.815 564.862 382.343 564.862 268.953 C 564.862 155.563 473.390 64.090 360.000 64.090 C 246.610 64.090 155.138 155.563 155.138 268.953 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 239.659 137.260 C 239.672 137.273 370.494 269.672 370.507 269.685 C 370.506 269.687 357.845 281.133 357.843 281.135 C 357.832 281.120 239.671 137.274 239.659 137.260 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 265.579 350.722 C 265.589 350.714 370.461 271.310 370.471 271.302 C 370.470 271.301 359.245 258.443 359.244 258.442 C 359.234 258.451 265.588 350.713 265.579 350.722 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 136.653 268.953 C 136.653 392.574 236.379 492.300 360.000 492.300 C 483.621 492.300 583.347 392.574 583.347 268.953 C 583.347 145.332 483.621 45.606 360.000 45.606 C 236.379 45.606 136.653 145.332 136.653 268.953 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":431.197,\\\"max\\\":561.681},\\\"y\\\":{\\\"min\\\":203.711,\\\"max\\\":334.194}},{\\\"x\\\":{\\\"min\\\":158.32,\\\"max\\\":288.803},\\\"y\\\":{\\\"min\\\":203.711,\\\"max\\\":334.194}},{\\\"x\\\":{\\\"min\\\":294.758,\\\"max\\\":425.242},\\\"y\\\":{\\\"min\\\":340.15,\\\"max\\\":470.633}},{\\\"x\\\":{\\\"min\\\":294.758,\\\"max\\\":425.242},\\\"y\\\":{\\\"min\\\":67.272,\\\"max\\\":197.756}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.475,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":28.98,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":117.292,\\\"y\\\":270.24,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869665965315,\\\"y\\\":0.005105549634238743}},{\\\"point\\\":{\\\"x\\\":602.709,\\\"y\\\":270.24,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869639866393,\\\"y\\\":0.005106060789277737}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":532.116,\\\"y\\\":442.493,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129394206807778,\\\"y\\\":0.7012256287667735}},{\\\"point\\\":{\\\"x\\\":187.742,\\\"y\\\":442.528,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986978199346778,\\\"y\\\":0.7154169109117623}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":532.237,\\\"y\\\":98.067,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6313988243194999,\\\"y\\\":-0.7754582675089314}},{\\\"point\\\":{\\\"x\\\":188.348,\\\"y\\\":98.125,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817402126941753,\\\"y\\\":-0.7315943427854678}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":510.408,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"cloud\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":15.273999979526028,\\\"max\\\":705.012736874176},\\\"y\\\":{\\\"min\\\":138.10195866370364,\\\"max\\\":583.1438045291293}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cloud\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cloud\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#4A5CA113-4EFD-477B-A9CD-40406528EDB8_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 17.274 446.587 C 17.273 398.281 53.904 358.752 100.682 354.213 C 94.920 341.255 91.551 326.238 91.551 310.414 C 91.551 250.461 140.046 206.054 199.869 202.095 C 232.802 199.916 263.627 209.628 285.036 232.077 C 297.260 175.189 349.412 137.955 408.770 140.198 C 475.031 142.702 533.199 190.372 530.957 258.295 C 540.499 254.088 551.728 250.935 563.510 251.613 C 608.685 254.211 649.987 302.394 631.208 354.070 C 668.089 365.837 699.459 396.683 702.726 437.303 C 707.325 494.474 655.897 532.932 599.102 540.927 C 566.226 545.555 534.350 539.953 514.367 516.748 C 501.463 530.151 484.173 543.356 463.506 543.680 C 450.075 543.891 437.935 537.417 427.529 530.922 C 399.585 573.819 348.581 585.736 295.809 579.664 C 247.602 574.117 204.198 556.096 182.112 515.371 C 163.269 533.027 137.598 541.016 110.119 539.431 C 58.815 536.472 17.274 497.976 17.274 446.587 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":203.085,\\\"max\\\":520.049},\\\"y\\\":{\\\"min\\\":240.991,\\\"max\\\":508.471}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":363.49,\\\"y\\\":656.868,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":405.982,\\\"y\\\":141.797,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":21.685,\\\"y\\\":429.06,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9998214234863877,\\\"y\\\":-0.018897648998045198}},{\\\"point\\\":{\\\"x\\\":698.894,\\\"y\\\":429.06,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9998214436905114,\\\"y\\\":-0.0188965800244813}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":309.677,\\\"y\\\":179.915,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7329804220865964,\\\"y\\\":-0.6802497341695585}},{\\\"point\\\":{\\\"x\\\":500.159,\\\"y\\\":179.915,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7329804220865964,\\\"y\\\":-0.6802497341695585}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":312.218,\\\"y\\\":579.606,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":114.645,\\\"y\\\":538.752,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7129431031070351,\\\"y\\\":0.7012218848068786}},{\\\"point\\\":{\\\"x\\\":612.499,\\\"y\\\":538.752,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129431031070341,\\\"y\\\":0.7012218848068796}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"4A5CA113-4EFD-477B-A9CD-40406528EDB8_0\\\",\\\"cx\\\":\\\"50.31%\\\",\\\"cy\\\":\\\"50.28%\\\",\\\"r\\\":\\\"100.17%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"30.98%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"cloud_spiraly\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":17.497,\\\"max\\\":702.503},\\\"y\\\":{\\\"min\\\":193.6997869453825,\\\"max\\\":512.3959978664127}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cloud_spiraly\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cloud_spiraly\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 437.618 353.840 C 468.488 353.840 485.735 372.588 485.735 390.886 C 485.735 409.185 468.488 427.933 437.618 427.933 C 406.748 427.933 389.500 409.185 389.500 390.886 C 389.500 372.588 406.747 353.840 437.618 353.840 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 282.029 415.095 C 332.449 420.242 363.897 397.891 389.240 372.977 C 406.163 383.905 432.464 389.004 455.087 380.818 C 485.663 369.754 514.845 337.580 517.113 309.276 C 520.709 264.386 491.963 225.920 467.780 210.230 C 418.726 178.406 363.920 203.476 351.072 215.124 C 301.659 259.924 307.188 305.432 304.672 324.797 C 300.877 353.997 288.476 369.326 273.207 380.641 C 260.281 390.220 231.362 399.019 231.358 399.021 C 231.363 399.023 265.214 413.378 282.029 415.095 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 282.029 415.095 C 332.449 420.242 363.897 397.891 389.240 372.977 C 406.163 383.905 432.464 389.004 455.087 380.818 C 485.663 369.754 514.845 337.580 517.113 309.276 C 520.709 264.386 491.963 225.920 467.780 210.230 C 418.726 178.406 363.920 203.476 351.072 215.124 C 301.659 259.924 307.188 305.432 304.672 324.797 C 300.877 353.997 288.476 369.326 273.207 380.641 C 260.281 390.220 231.362 399.019 231.358 399.021 C 231.363 399.023 265.214 413.378 282.029 415.095 M 392.151 245.309 C 342.386 270.776 326.917 332.731 389.240 372.977 M 463.541 312.341 C 483.723 267.395 434.012 223.886 392.151 245.309 M 403.508 324.523 C 421.442 346.920 453.400 334.923 463.541 312.341 M 418.747 286.854 C 401.556 284.101 387.358 304.353 403.508 324.523 M 421.218 302.963 C 430.239 302.952 430.420 288.724 418.747 286.854 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 332.318 435.715 C 352.000 397.367 344.027 365.538 332.135 337.752 C 346.029 327.729 358.207 308.472 358.724 288.018 C 359.423 260.373 342.968 227.299 321.249 216.743 C 286.802 200.001 247.434 210.867 227.521 225.168 C 187.130 254.177 190.027 305.351 195.278 319.133 C 215.474 372.140 253.234 381.846 267.795 389.832 C 289.752 401.875 298.057 416.442 302.294 432.040 C 305.882 445.245 303.902 470.876 303.902 470.880 C 303.905 470.876 325.753 448.504 332.318 435.715 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 332.318 435.715 C 352.000 397.367 344.027 365.538 332.135 337.752 C 346.029 327.729 358.207 308.472 358.724 288.018 C 359.423 260.373 342.968 227.299 321.249 216.743 C 286.802 200.001 247.434 210.867 227.521 225.168 C 187.130 254.177 190.027 305.351 195.278 319.133 C 215.474 372.140 253.234 381.846 267.795 389.832 C 289.752 401.875 298.057 416.442 302.294 432.040 C 305.882 445.245 303.902 470.876 303.902 470.880 C 303.905 470.876 325.753 448.504 332.318 435.715 M 231.902 295.935 C 236.674 343.238 280.965 374.666 332.135 337.752 M 307.097 260.129 C 277.739 230.231 227.887 256.143 231.902 295.935 M 298.167 311.454 C 321.460 304.180 321.847 275.151 307.097 260.129 M 273.044 287.724 C 265.542 300.490 277.190 318.005 298.167 311.454 M 286.570 290.752 C 289.353 283.602 278.138 279.055 273.044 287.724 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 48.206 348.166 C 82.655 321.689 115.662 323.816 145.371 330.563 C 152.787 314.967 169.670 299.396 189.858 295.170 C 217.142 289.458 252.923 299.770 267.333 319.389 C 290.186 350.504 286.558 391.512 275.993 413.852 C 254.562 459.167 203.296 465.584 188.678 462.880 C 132.453 452.479 115.975 416.800 105.413 403.812 C 89.486 384.228 73.535 378.638 57.300 377.268 C 43.556 376.108 18.501 382.724 18.497 382.724 C 18.500 382.721 36.717 356.996 48.206 348.166 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 75.489 358.473 C 111.999 355.387 135.505 368.779 135.511 368.780 M 22.135 379.693 C 22.140 379.691 45.507 361.006 75.489 358.473 M 48.206 348.166 C 82.655 321.689 115.662 323.816 145.371 330.563 C 152.787 314.967 169.670 299.396 189.858 295.170 C 217.142 289.458 252.923 299.770 267.333 319.389 C 290.186 350.504 286.558 391.512 275.993 413.852 C 254.562 459.167 203.296 465.584 188.678 462.880 C 132.453 452.479 115.975 416.800 105.413 403.812 C 89.486 384.228 73.535 378.638 57.300 377.268 C 43.556 376.108 18.501 382.724 18.497 382.724 C 18.500 382.721 36.717 356.996 48.206 348.166 M 205.031 422.355 C 157.262 426.210 118.059 388.001 145.371 330.563 M 226.883 341.297 C 261.857 364.978 245.214 419.112 205.031 422.355 M 177.614 359.469 C 180.598 335.053 209.311 329.399 226.883 341.297 M 205.703 380.071 C 194.407 389.826 174.927 381.456 177.614 359.469 M 200.245 367.210 C 206.829 363.152 213.373 373.447 205.703 380.071 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 672.935 350.243 C 639.703 320.191 606.049 314.431 574.266 325.071 C 568.549 309.571 553.811 293.276 534.944 287.504 C 509.444 279.703 474.463 286.433 459.039 303.879 C 434.576 331.546 434.157 371.051 442.619 393.125 C 460.438 439.613 511.745 447.148 526.499 446.563 C 577.053 444.558 595.510 414.855 606.000 404.487 C 625.382 385.330 642.730 380.532 660.318 380.644 C 675.208 380.738 701.498 390.296 701.503 390.297 C 701.500 390.293 684.537 360.735 672.935 350.243 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 642.597 358.662 C 605.715 351.812 580.361 362.332 580.355 362.333 M 697.887 386.682 C 697.881 386.679 674.532 364.594 642.597 358.662 M 672.935 350.243 C 639.703 320.191 606.049 314.431 574.266 325.071 C 568.549 309.571 553.811 293.276 534.944 287.504 C 509.444 279.703 474.463 286.433 459.039 303.879 C 434.576 331.546 434.157 371.051 442.619 393.125 C 460.438 439.613 511.745 447.148 526.499 446.563 C 577.053 444.558 595.510 414.855 606.000 404.487 C 625.382 385.330 642.730 380.532 660.318 380.644 C 675.208 380.738 701.498 390.296 701.503 390.297 C 701.500 390.293 684.537 360.735 672.935 350.243 M 509.490 407.363 C 554.666 415.167 595.319 382.154 574.266 325.071 M 495.680 328.249 C 460.313 347.786 471.487 400.798 509.490 407.363 M 541.049 349.821 C 540.318 326.302 513.451 318.432 495.680 328.249 M 512.506 367.020 C 522.424 377.291 541.708 371.002 541.049 349.821 M 518.818 355.239 C 512.896 350.804 505.772 360.046 512.506 367.020 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 511.934 464.803 C 474.470 487.837 440.874 491.329 399.141 472.278 C 391.224 488.828 373.248 505.330 351.791 509.770 C 322.791 515.770 284.802 504.728 269.542 483.849 C 245.340 450.736 249.295 407.179 260.575 383.471 C 283.454 335.382 337.934 328.690 353.458 331.599 C 413.165 342.788 432.666 379.281 441.772 394.557 C 455.948 418.339 469.251 427.926 484.765 436.794 C 506.719 449.344 533.321 446.473 533.326 446.474 C 533.324 446.476 525.933 456.196 511.934 464.803 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 466.128 458.181 C 429.142 452.015 409.715 431.704 409.710 431.701 M 531.316 447.989 C 531.310 447.990 500.232 463.867 466.128 458.181 M 511.934 464.803 C 474.470 487.837 440.874 491.329 399.141 472.278 C 391.224 488.828 373.248 505.330 351.791 509.770 C 322.791 515.770 284.802 504.728 269.542 483.849 C 245.340 450.736 249.295 407.179 260.575 383.471 C 283.454 335.382 337.934 328.690 353.458 331.599 C 413.165 342.788 432.666 379.281 441.772 394.557 C 455.948 418.339 469.251 427.926 484.765 436.794 C 506.719 449.344 533.321 446.473 533.326 446.474 C 533.324 446.476 525.933 456.196 511.934 464.803 M 335.984 374.612 C 386.743 370.633 428.298 411.324 399.141 472.278 M 312.569 460.674 C 275.471 435.429 293.286 377.959 335.984 374.612 M 364.958 441.490 C 361.727 467.421 331.209 473.358 312.569 460.674 M 335.166 419.532 C 347.190 409.196 367.867 418.136 364.958 441.490 M 340.933 433.210 C 333.928 437.504 327.001 426.551 335.166 419.532 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":225.98,\\\"max\\\":494.02},\\\"y\\\":{\\\"min\\\":253.465,\\\"max\\\":434.173}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":593.123,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.025,\\\"y\\\":171.719,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":37.532,\\\"y\\\":369.745,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873181281341,\\\"y\\\":0.005036227050266388}},{\\\"point\\\":{\\\"x\\\":680.958,\\\"y\\\":369.745,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.005035854088752063}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":519.314,\\\"y\\\":459.891,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128942432634375,\\\"y\\\":0.701271557901681}},{\\\"point\\\":{\\\"x\\\":201.881,\\\"y\\\":459.924,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986942804382802,\\\"y\\\":0.7154203676740228}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":487.847,\\\"y\\\":227.192,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314331147428337,\\\"y\\\":-0.7754303460699506}},{\\\"point\\\":{\\\"x\\\":225.834,\\\"y\\\":227.236,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817655631627131,\\\"y\\\":-0.731570718991287}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":502.734,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"cloud_spiraly_vertical\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":220.42819759562494,\\\"max\\\":512.2983085362782},\\\"y\\\":{\\\"min\\\":21.746,\\\"max\\\":648.897}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cloud_spiraly_vertical\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cloud_spiraly\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 365.638 264.278 C 365.638 236.023 348.478 220.236 331.730 220.236 C 314.981 220.237 297.822 236.023 297.822 264.278 C 297.822 292.534 314.981 308.320 331.730 308.320 C 348.478 308.320 365.638 292.534 365.638 264.278 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 309.572 406.688 C 304.861 360.538 325.318 331.754 348.122 308.558 C 338.120 293.069 333.453 268.995 340.946 248.289 C 351.072 220.302 380.521 193.592 406.427 191.517 C 447.515 188.225 482.723 214.536 497.083 236.671 C 526.212 281.570 503.266 331.734 492.604 343.493 C 451.599 388.720 409.946 383.660 392.221 385.963 C 365.494 389.436 351.464 400.786 341.108 414.762 C 332.340 426.594 324.286 453.063 324.284 453.067 C 324.283 453.062 311.143 422.079 309.572 406.688 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 309.572 406.688 C 304.861 360.538 325.318 331.754 348.122 308.558 C 338.120 293.069 333.453 268.995 340.946 248.289 C 351.072 220.302 380.521 193.592 406.427 191.517 C 447.515 188.225 482.723 214.536 497.083 236.671 C 526.212 281.570 503.266 331.734 492.604 343.493 C 451.599 388.720 409.946 383.660 392.221 385.963 C 365.494 389.436 351.464 400.786 341.108 414.762 C 332.340 426.594 324.286 453.063 324.284 453.067 C 324.283 453.062 311.143 422.079 309.572 406.688 M 464.977 305.894 C 441.666 351.443 384.959 365.602 348.122 308.558 M 403.622 240.551 C 444.761 222.079 484.585 267.578 464.977 305.894 M 392.472 295.498 C 371.972 279.084 382.953 249.832 403.622 240.551 M 426.950 281.550 C 429.470 297.285 410.934 310.281 392.472 295.498 M 412.206 279.289 C 412.216 271.032 425.239 270.866 426.950 281.550 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 290.698 360.659 C 325.798 342.644 354.931 349.941 380.363 360.826 C 389.537 348.109 407.163 336.962 425.885 336.489 C 451.188 335.849 481.461 350.910 491.123 370.790 C 506.446 402.319 496.501 438.352 483.411 456.578 C 456.859 493.548 410.020 490.896 397.405 486.090 C 348.888 467.605 340.005 433.044 332.695 419.716 C 321.672 399.619 308.339 392.018 294.062 388.139 C 281.976 384.855 258.516 386.668 258.512 386.668 C 258.516 386.665 278.993 366.667 290.698 360.659 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 290.698 360.659 C 325.798 342.644 354.931 349.941 380.363 360.826 C 389.537 348.109 407.163 336.962 425.885 336.489 C 451.188 335.849 481.461 350.910 491.123 370.790 C 506.446 402.319 496.501 438.352 483.411 456.578 C 456.859 493.548 410.020 490.896 397.405 486.090 C 348.888 467.605 340.005 433.044 332.695 419.716 C 321.672 399.619 308.339 392.018 294.062 388.139 C 281.976 384.855 258.516 386.668 258.512 386.668 C 258.516 386.665 278.993 366.667 290.698 360.659 M 418.639 452.569 C 375.342 448.201 346.576 407.662 380.363 360.826 M 451.412 383.743 C 478.777 410.614 455.060 456.243 418.639 452.569 M 404.434 391.916 C 411.091 370.597 437.662 370.242 451.412 383.743 M 426.154 414.912 C 414.470 421.778 398.437 411.117 404.434 391.916 M 423.382 402.532 C 429.926 399.984 434.089 410.249 426.154 414.912 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 370.832 620.705 C 395.066 589.174 393.119 558.963 386.943 531.770 C 401.218 524.982 415.471 509.529 419.339 491.052 C 424.567 466.079 415.129 433.328 397.171 420.139 C 368.692 399.222 331.158 402.542 310.710 412.213 C 269.233 431.828 263.359 478.751 265.835 492.132 C 275.355 543.594 308.012 558.676 319.899 568.343 C 337.825 582.921 342.941 597.522 344.195 612.381 C 345.257 624.961 339.201 647.893 339.201 647.897 C 339.204 647.894 362.750 631.221 370.832 620.705 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.398 595.733 C 364.222 562.315 351.965 540.800 351.964 540.795 M 341.975 644.567 C 341.977 644.562 359.079 623.175 361.398 595.733 M 370.832 620.705 C 395.066 589.174 393.119 558.963 386.943 531.770 C 401.218 524.982 415.471 509.529 419.339 491.052 C 424.567 466.079 415.129 433.328 397.171 420.139 C 368.692 399.222 331.158 402.542 310.710 412.213 C 269.233 431.828 263.359 478.751 265.835 492.132 C 275.355 543.594 308.012 558.676 319.899 568.343 C 337.825 582.921 342.941 597.522 344.195 612.381 C 345.257 624.961 339.201 647.893 339.201 647.897 C 339.204 647.894 362.750 631.221 370.832 620.705 M 302.927 477.164 C 299.398 520.886 334.371 556.768 386.943 531.770 M 377.118 457.163 C 355.443 425.151 305.895 440.385 302.927 477.164 M 360.486 502.258 C 382.834 499.527 388.009 473.247 377.118 457.163 M 341.629 476.549 C 332.701 486.887 340.361 504.718 360.486 502.258 M 353.401 481.544 C 357.115 475.518 347.692 469.528 341.629 476.549 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 368.930 48.894 C 396.437 79.311 401.709 110.114 391.971 139.205 C 406.157 144.437 421.072 157.927 426.355 175.196 C 433.495 198.536 427.335 230.554 411.368 244.672 C 386.044 267.063 349.885 267.445 329.681 259.701 C 287.131 243.391 280.234 196.430 280.769 182.926 C 282.605 136.654 309.791 119.761 319.281 110.159 C 336.815 92.419 341.207 76.540 341.105 60.442 C 341.019 46.813 332.270 22.749 332.269 22.746 C 332.273 22.748 359.327 38.274 368.930 48.894 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.224 76.662 C 367.494 110.420 357.865 133.626 357.865 133.631 M 335.578 26.055 C 335.580 26.060 355.795 47.432 361.224 76.662 M 368.930 48.894 C 396.437 79.311 401.709 110.114 391.971 139.205 C 406.157 144.437 421.072 157.927 426.355 175.196 C 433.495 198.536 427.335 230.554 411.368 244.672 C 386.044 267.063 349.885 267.445 329.681 259.701 C 287.131 243.391 280.234 196.430 280.769 182.926 C 282.605 136.654 309.791 119.761 319.281 110.159 C 336.815 92.419 341.207 76.540 341.105 60.442 C 341.019 46.813 332.270 22.749 332.269 22.746 C 332.273 22.748 359.327 38.274 368.930 48.894 M 316.649 198.494 C 309.506 157.145 339.723 119.935 391.971 139.205 M 389.062 211.134 C 371.179 243.506 322.657 233.277 316.649 198.494 M 369.316 169.608 C 390.844 170.277 398.047 194.869 389.062 211.134 M 353.574 195.733 C 344.174 186.656 349.930 169.005 369.316 169.608 M 364.357 189.956 C 368.417 195.376 359.958 201.897 353.574 195.733 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 264.074 196.257 C 242.992 230.548 239.795 261.298 257.233 299.496 C 242.084 306.742 226.980 323.195 222.917 342.835 C 217.424 369.379 227.531 404.149 246.641 418.117 C 276.950 440.269 316.817 436.649 338.517 426.325 C 382.533 405.383 388.658 355.518 385.995 341.309 C 375.754 286.660 342.353 268.810 328.370 260.476 C 306.602 247.501 297.828 235.324 289.711 221.125 C 278.224 201.030 280.852 176.681 280.851 176.677 C 280.849 176.679 271.952 183.443 264.074 196.257 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 270.135 238.183 C 275.780 272.036 294.370 289.817 294.372 289.822 M 279.464 178.517 C 279.463 178.523 264.931 206.968 270.135 238.183 M 264.074 196.257 C 242.992 230.548 239.795 261.298 257.233 299.496 C 242.084 306.742 226.980 323.195 222.917 342.835 C 217.424 369.379 227.531 404.149 246.641 418.117 C 276.950 440.269 316.817 436.649 338.517 426.325 C 382.533 405.383 388.658 355.518 385.995 341.309 C 375.754 286.660 342.353 268.810 328.370 260.476 C 306.602 247.501 297.828 235.324 289.711 221.125 C 278.224 201.030 280.852 176.681 280.851 176.677 C 280.849 176.679 271.952 183.443 264.074 196.257 M 346.626 357.303 C 350.267 310.844 313.024 272.809 257.233 299.496 M 267.854 378.734 C 290.961 412.690 343.563 396.384 346.626 357.303 M 285.413 330.784 C 261.678 333.740 256.244 361.674 267.854 378.734 M 305.510 358.052 C 314.971 347.046 306.788 328.121 285.413 330.784 M 292.992 352.773 C 289.061 359.185 299.086 365.525 305.510 358.052 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":292.11,\\\"max\\\":457.511},\\\"y\\\":{\\\"min\\\":212.654,\\\"max\\\":457.989}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":354.128,\\\"y\\\":688.039,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":349.361,\\\"y\\\":34.597,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":217.837,\\\"y\\\":355.531,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875136159713,\\\"y\\\":0.00499726046425822}},{\\\"point\\\":{\\\"x\\\":485.082,\\\"y\\\":355.531,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875136159713,\\\"y\\\":0.004997260464258208}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":343.105,\\\"y\\\":641.197,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"clouds\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":13.46819945902843,\\\"max\\\":675.096},\\\"y\\\":{\\\"min\\\":6.053967119420255,\\\"max\\\":643.4093860538943}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"clouds\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"clouds\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#E67AFCE8-1A39-4432-A5BD-732E88591300_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 250.559 119.554 C 250.735 93.442 277.202 64.095 317.802 76.822 C 314.003 43.900 365.078 9.495 400.789 51.417 C 422.930 -11.773 510.274 -1.684 519.682 54.466 C 544.546 30.699 573.984 50.447 574.870 69.479 C 613.409 46.977 651.657 81.912 651.821 109.125 C 651.986 136.611 618.781 168.117 576.559 149.928 C 578.612 189.513 521.498 218.598 478.675 169.928 C 470.908 192.767 386.929 229.427 365.097 162.797 C 359.459 175.396 333.888 185.359 321.082 160.566 C 281.515 177.725 250.382 145.942 250.559 119.554 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#E67AFCE8-1A39-4432-A5BD-732E88591300_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 599.608 592.116 C 594.184 600.054 582.610 612.182 554.082 604.963 C 545.994 635.452 489.387 659.574 450.005 622.898 C 427.775 649.855 375.728 630.405 376.763 604.754 C 376.807 603.680 376.875 602.281 376.872 601.814 C 366.160 607.689 349.947 607.622 344.555 593.527 C 340.303 598.226 324.854 608.223 311.487 607.344 C 290.598 605.970 272.974 590.977 273.150 570.044 C 273.324 549.391 292.530 527.717 326.722 536.007 C 325.992 502.191 378.184 470.838 418.718 500.756 C 425.403 480.518 453.747 461.250 481.412 461.250 C 512.151 461.250 538.137 481.088 547.198 508.385 C 577.083 491.512 601.810 522.267 604.465 531.463 C 611.866 525.613 622.464 522.699 633.205 523.418 C 655.235 524.893 673.096 541.229 673.096 563.309 C 673.096 585.388 642.648 614.952 599.608 592.116 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#E67AFCE8-1A39-4432-A5BD-732E88591300_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 221.169 409.612 C 209.357 434.284 137.970 441.838 120.601 398.103 C 101.790 411.390 78.536 407.331 67.314 381.037 C 35.657 399.851 13.601 371.571 15.593 352.860 C 18.363 326.826 46.206 325.966 54.780 325.948 C 53.861 293.127 91.150 261.718 136.652 285.269 C 148.348 240.737 200.042 248.293 207.223 273.737 C 252.085 226.165 323.714 270.620 315.528 311.940 C 353.197 292.319 390.043 324.987 387.636 351.916 C 385.538 375.384 346.735 394.457 319.731 377.954 C 312.104 411.053 271.663 443.158 221.169 409.612 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.792,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":566.695,\\\"y\\\":504.121,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":94.951,\\\"y\\\":279.628,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":277.581,\\\"y\\\":417.32,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"E67AFCE8-1A39-4432-A5BD-732E88591300_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"52.29%\\\",\\\"r\\\":\\\"123.53%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"21.57%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"E67AFCE8-1A39-4432-A5BD-732E88591300_1\\\",\\\"cx\\\":\\\"49.98%\\\",\\\"cy\\\":\\\"55.04%\\\",\\\"r\\\":\\\"120.04%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"21.57%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"E67AFCE8-1A39-4432-A5BD-732E88591300_2\\\",\\\"cx\\\":\\\"48.52%\\\",\\\"cy\\\":\\\"48.37%\\\",\\\"r\\\":\\\"123.84%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"21.57%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}]},{\\\"name\\\":\\\"coffin\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":237.851,\\\"max\\\":482.149},\\\"y\\\":{\\\"min\\\":57.632,\\\"max\\\":662.368}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"coffin\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"coffin\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#432CCB3F-ABD4-445E-8996-A4F384431FCC_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 420.075 660.368 C 420.063 660.368 299.937 660.368 299.925 660.368 C 299.919 660.322 239.857 199.853 239.851 199.807 C 239.857 199.793 299.919 59.646 299.925 59.632 C 299.937 59.632 420.063 59.632 420.075 59.632 C 420.081 59.646 480.142 199.794 480.149 199.807 C 480.149 199.807 420.081 660.322 420.075 660.368 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":280.661,\\\"max\\\":439.339},\\\"y\\\":{\\\"min\\\":91.761,\\\"max\\\":554.726}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":697.991,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.054,\\\"y\\\":60.316,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":262.592,\\\"y\\\":355.705,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872906762893,\\\"y\\\":0.005041674909603205}},{\\\"point\\\":{\\\"x\\\":457.408,\\\"y\\\":355.705,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872906762893,\\\"y\\\":0.005041674909603205}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":418.216,\\\"y\\\":648.752,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129100341718151,\\\"y\\\":0.7012555049175312}},{\\\"point\\\":{\\\"x\\\":301.612,\\\"y\\\":648.795,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987090269036205,\\\"y\\\":0.7154059656750116}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":655.259,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"432CCB3F-ABD4-445E-8996-A4F384431FCC_0\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"165.98%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.39%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"cornucopia_half\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":51.06227687351811,\\\"max\\\":651.3241651462271},\\\"y\\\":{\\\"min\\\":68.11951449392149,\\\"max\\\":610.466}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cornucopia_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cornucopia\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 246.813 607.653 C 246.904 608.427 515.055 607.450 649.170 608.466 C 649.942 568.027 647.566 498.864 647.518 497.970 C 647.466 496.991 642.102 425.724 637.070 393.620 C 631.705 359.386 625.379 327.729 615.785 299.161 C 606.625 271.885 594.502 247.716 581.547 225.623 C 568.389 203.186 554.028 182.804 537.163 165.337 C 519.441 146.983 499.325 131.675 477.567 118.507 C 456.701 105.879 434.113 95.264 409.503 87.306 C 385.465 79.533 359.416 75.078 331.839 70.953 C 322.363 69.535 276.011 69.984 263.727 71.862 C 236.565 76.013 211.204 81.590 190.565 89.629 C 165.709 99.311 146.777 111.877 134.683 122.484 C 118.745 136.462 103.581 151.436 90.747 168.170 C 84.744 175.996 67.737 211.175 64.887 220.538 C 59.551 238.070 55.152 256.031 53.623 274.698 C 52.217 291.857 53.468 309.303 57.231 326.040 C 60.995 342.776 67.293 358.805 76.049 373.134 C 84.805 387.463 96.017 400.093 109.609 410.031 C 123.201 419.969 139.173 427.215 157.445 430.777 C 171.466 433.511 183.938 434.509 194.954 433.314 C 208.800 431.813 220.662 427.465 230.938 422.005 C 236.679 418.955 241.525 415.139 245.764 410.788 C 251.801 404.591 256.954 397.623 261.137 389.982 C 265.611 381.809 267.783 372.777 267.940 364.014 C 268.097 355.250 266.238 346.754 262.650 339.652 C 259.062 332.551 253.744 326.843 246.982 323.656 C 240.221 320.469 232.016 319.803 222.653 322.784 C 227.269 325.659 231.130 331.843 231.131 331.844 C 231.131 331.845 230.976 340.942 230.976 340.943 C 230.975 340.944 225.351 348.834 225.350 348.835 C 225.349 348.836 217.417 354.275 217.416 354.276 C 217.415 354.276 206.741 357.190 206.739 357.190 C 206.738 357.190 195.805 356.514 195.804 356.514 C 195.803 356.513 185.788 352.526 185.787 352.526 C 185.786 352.525 177.866 345.506 177.865 345.505 C 177.864 345.504 171.005 330.769 171.005 330.767 C 171.005 330.765 169.921 313.755 169.921 313.753 C 169.921 313.751 174.074 296.461 174.074 296.459 C 174.075 296.458 182.925 280.883 182.926 280.881 C 182.927 280.880 195.765 268.118 195.766 268.117 C 195.768 268.116 214.131 257.857 214.133 257.855 C 214.135 257.855 233.999 253.432 234.001 253.431 C 234.003 253.431 256.770 250.612 256.773 250.611 C 256.775 250.612 283.380 254.772 283.383 254.773 C 283.385 254.774 302.264 264.683 302.266 264.684 C 302.268 264.686 320.329 282.664 320.331 282.666 C 320.333 282.669 331.686 307.602 331.687 307.605 C 331.688 307.608 337.329 337.395 337.330 337.398 C 337.330 337.402 335.470 378.517 335.469 378.522 C 335.467 378.529 317.646 447.377 317.644 447.385 C 317.640 447.393 285.161 515.637 285.152 515.664 C 285.133 515.696 255.039 559.885 246.813 607.653 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 285.152 515.664 C 285.133 515.696 255.117 559.285 246.813 607.653 C 246.852 607.644 515.055 607.450 649.170 608.466 C 649.942 568.027 647.566 498.864 647.518 497.970 C 647.466 496.991 642.102 425.724 637.070 393.620 C 558.353 437.811 396.842 463.931 317.644 447.385 C 317.640 447.393 285.161 515.637 285.152 515.664 C 353.949 535.875 569.227 527.378 647.518 497.970 M 335.469 378.522 C 335.467 378.529 317.646 447.377 317.644 447.385 M 337.330 337.398 C 337.330 337.402 335.470 378.517 335.469 378.522 C 409.426 382.701 556.074 353.786 615.785 299.161 C 606.625 271.885 594.502 247.716 581.547 225.623 C 528.062 288.084 401.292 337.442 337.330 337.398 C 337.329 337.395 331.688 307.608 331.687 307.605 C 331.686 307.602 320.333 282.669 320.331 282.666 C 320.329 282.664 302.268 264.686 302.266 264.684 C 302.264 264.683 283.385 254.774 283.383 254.773 C 283.380 254.772 256.775 250.612 256.773 250.611 C 256.770 250.612 234.003 253.431 234.001 253.431 C 233.999 253.432 214.135 257.855 214.133 257.855 C 214.131 257.857 195.768 268.116 195.766 268.117 C 195.765 268.118 182.927 280.880 182.926 280.881 C 182.925 280.883 174.075 296.458 174.074 296.459 C 174.074 296.461 169.921 313.751 169.921 313.753 C 169.921 313.755 171.005 330.765 171.005 330.767 C 171.005 330.769 177.864 345.504 177.865 345.505 C 177.866 345.506 185.786 352.525 185.787 352.526 C 185.788 352.526 195.803 356.513 195.804 356.514 C 195.805 356.514 206.738 357.190 206.739 357.190 C 206.741 357.190 217.415 354.276 217.416 354.276 C 217.417 354.275 225.349 348.836 225.350 348.835 C 225.351 348.834 230.975 340.944 230.976 340.943 C 230.976 340.942 231.131 331.845 231.131 331.844 C 242.320 332.067 241.699 326.385 246.982 323.656 C 240.221 320.469 232.016 319.803 222.653 322.784 C 227.269 325.659 231.130 331.843 231.131 331.844 M 174.074 296.459 C 156.496 273.122 97.676 265.635 53.623 274.698 C 52.217 291.857 53.468 309.303 57.231 326.040 C 87.458 305.467 144.869 298.430 169.921 313.753 M 171.005 330.767 C 143.623 324.864 96.367 349.172 76.049 373.134 C 84.805 387.463 96.017 400.093 109.609 410.031 C 121.064 382.300 145.900 355.030 177.865 345.505 M 185.787 352.526 C 165.743 369.831 160.587 397.384 159.020 403.381 C 158.271 406.245 157.970 421.645 157.445 430.777 C 171.466 433.511 183.938 434.509 194.954 433.314 C 193.202 425.526 189.869 412.527 189.696 409.950 C 189.309 404.162 185.442 376.654 195.804 356.514 M 206.739 357.190 C 206.146 377.319 214.363 395.087 216.209 399.368 C 217.362 402.043 226.028 414.459 230.938 422.005 C 236.679 418.955 241.525 415.139 245.764 410.788 C 251.801 404.591 256.954 397.623 261.137 389.982 C 255.085 388.598 244.714 386.847 242.982 385.829 C 239.207 383.608 220.150 371.828 217.416 354.276 M 225.350 348.835 C 231.100 361.661 248.961 364.977 252.319 365.668 C 253.978 366.009 262.733 364.565 267.940 364.014 C 268.097 355.250 266.238 346.754 262.650 339.652 C 259.546 341.739 254.521 345.653 253.339 345.913 C 250.926 346.442 236.661 348.785 230.976 340.943 M 182.926 280.881 C 170.598 250.599 114.884 222.953 64.887 220.538 C 59.551 238.070 55.152 256.031 53.623 274.698 M 234.001 253.431 C 243.032 216.880 239.142 150.300 190.565 89.629 C 165.709 99.311 146.777 111.877 134.683 122.484 C 187.255 160.352 216.008 222.782 214.133 257.855 M 256.773 250.611 C 273.304 208.767 283.536 147.668 263.727 71.862 C 236.565 76.013 211.204 81.590 190.565 89.629 M 283.383 254.773 C 308.843 216.482 341.127 153.511 331.839 70.953 C 322.363 69.535 276.011 69.984 263.727 71.862 M 302.266 264.684 C 340.276 240.347 394.020 174.753 409.503 87.306 C 385.465 79.533 359.416 75.078 331.839 70.953 M 320.331 282.666 C 364.009 265.563 452.713 200.180 477.567 118.507 C 456.701 105.879 434.113 95.264 409.503 87.306 M 331.687 307.605 C 391.410 295.458 500.566 241.213 537.163 165.337 C 519.441 146.983 499.325 131.675 477.567 118.507 M 195.766 268.117 C 190.313 234.544 137.714 186.059 90.747 168.170 C 84.744 175.996 67.737 211.175 64.887 220.538 M 262.650 339.652 C 259.062 332.551 253.744 326.843 246.982 323.656 M 261.137 389.982 C 265.611 381.809 267.783 372.777 267.940 364.014 M 194.954 433.314 C 208.800 431.813 220.662 427.465 230.938 422.005 M 109.609 410.031 C 123.201 419.969 139.173 427.215 157.445 430.777 M 57.231 326.040 C 60.995 342.776 67.293 358.805 76.049 373.134 M 134.683 122.484 C 118.745 136.462 103.581 151.436 90.747 168.170 M 581.547 225.623 C 568.389 203.186 554.028 182.804 537.163 165.337 M 637.070 393.620 C 631.705 359.386 625.379 327.729 615.785 299.161 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":448.723,\\\"y\\\":606.682,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":638.106,\\\"y\\\":602.105,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.712902628479816,\\\"y\\\":0.7012630336090514}},{\\\"point\\\":{\\\"x\\\":255.97,\\\"y\\\":602.144,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987116039190656,\\\"y\\\":0.7154034487957455}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":449.271,\\\"y\\\":607.867,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"cow_head\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":14.211212280476229,\\\"max\\\":702.3657877195237},\\\"y\\\":{\\\"min\\\":126.98500000000001,\\\"max\\\":643.9039359451795}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cow_head2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cow_head_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 447.837 219.023 C 447.846 219.020 512.802 210.310 542.768 191.620 C 568.603 175.507 600.503 128.992 600.509 128.985 C 600.505 128.996 593.623 202.016 557.448 238.596 C 529.302 267.057 473.291 274.803 473.282 274.807 C 473.283 274.809 486.982 298.293 486.983 298.295 C 486.993 298.294 554.275 281.083 581.914 287.530 C 623.457 297.220 702.205 359.479 700.333 368.759 C 698.481 377.938 593.972 413.076 561.362 398.119 C 543.851 390.088 533.860 339.965 519.279 334.506 C 517.213 333.732 508.515 335.484 508.514 335.484 C 508.516 335.495 534.821 405.307 530.045 439.223 C 522.953 489.584 452.738 576.223 452.730 576.237 C 452.728 576.241 450.280 606.546 436.092 620.277 C 412.473 643.134 365.217 641.764 360.735 641.807 C 355.984 641.853 305.641 644.389 280.484 620.277 C 266.231 606.615 263.848 576.241 263.847 576.237 C 263.839 576.223 193.624 489.584 186.532 439.223 C 181.756 405.307 208.061 335.495 208.063 335.484 C 208.062 335.484 199.364 333.732 197.298 334.506 C 182.716 339.965 172.726 390.088 155.215 398.119 C 122.605 413.076 18.096 377.938 16.244 368.759 C 14.372 359.479 93.120 297.220 134.663 287.530 C 162.302 281.083 229.584 298.294 229.593 298.295 C 229.595 298.293 243.293 274.809 243.295 274.807 C 243.286 274.803 187.274 267.057 159.129 238.596 C 122.954 202.016 116.072 128.996 116.068 128.985 C 116.074 128.992 147.974 175.507 173.809 191.620 C 203.775 210.310 268.731 219.020 268.740 219.023 C 268.749 219.022 357.790 211.194 357.799 211.194 C 357.799 211.194 447.828 219.022 447.837 219.023 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 209.042 333.527 C 202.944 329.844 190.751 322.478 190.749 322.477 C 190.745 322.475 161.314 304.963 143.471 306.124 C 102.464 308.794 41.290 355.079 44.626 364.844 M 509.493 333.527 C 515.436 329.939 527.321 322.766 527.322 322.765 C 527.327 322.763 557.030 304.967 575.063 306.124 C 616.073 308.757 677.253 355.082 673.909 364.844 M 264.826 574.279 C 264.830 574.274 266.554 545.750 310.823 525.346 C 321.568 520.393 357.794 521.432 357.799 521.431 C 357.804 521.432 394.780 520.304 405.754 525.346 C 450.959 546.117 452.725 575.253 452.730 575.258 M 380.308 570.365 C 391.798 570.650 429.046 572.293 427.285 555.685 C 426.877 551.844 413.882 546.436 404.775 547.855 C 388.561 550.381 383.436 562.743 380.308 570.365 C 375.314 582.534 387.910 613.089 385.276 623.213 C 384.083 627.798 380.343 635.372 358.233 635.427 C 341.386 635.469 332.740 627.709 331.301 623.213 C 327.758 612.140 341.263 582.534 336.268 570.365 C 333.140 562.743 331.786 551.329 311.802 547.855 C 301.160 546.006 289.699 551.844 289.292 555.685 C 287.531 572.293 324.779 570.650 336.268 570.365 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 473.282 274.807 C 473.280 274.805 463.587 264.229 457.153 250.517 C 449.907 235.071 450.942 229.521 447.837 219.023 M 243.295 274.807 C 243.296 274.805 253.858 264.494 260.402 250.517 C 267.578 235.190 265.961 229.521 268.740 219.023 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 594.733 372.568 C 561.777 364.054 604.847 318.742 527.322 322.765 C 527.327 322.763 557.030 304.967 575.063 306.124 C 616.073 308.757 677.253 355.082 673.909 364.844 C 671.594 371.599 635.744 383.162 594.733 372.568 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 124.147 372.568 C 156.874 363.944 113.633 319.135 190.749 322.477 C 190.745 322.475 161.314 304.963 143.471 306.124 C 102.464 308.794 41.290 355.079 44.626 364.844 C 46.943 371.630 83.010 383.407 124.147 372.568 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 418.583 393.072 C 418.582 393.071 412.640 387.303 409.669 384.418 C 409.673 384.412 414.723 336.685 449.794 323.740 C 474.514 314.616 499.701 335.483 499.706 335.484 C 499.703 335.491 500.956 381.491 470.346 398.119 C 447.332 410.621 418.588 393.073 418.583 393.072 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 295.144 393.141 C 295.145 393.140 302.987 387.325 306.908 384.418 C 306.904 384.412 301.854 336.685 266.783 323.740 C 242.063 314.616 216.876 335.483 216.871 335.484 C 216.874 335.491 215.520 381.678 246.231 398.119 C 268.058 409.805 295.139 393.141 295.144 393.141 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 312.634 520.442 C 312.633 520.429 306.909 384.431 306.908 384.418 M 403.943 520.442 C 403.944 520.429 409.668 384.431 409.669 384.418 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":297.322,\\\"max\\\":422.678},\\\"y\\\":{\\\"min\\\":222.225,\\\"max\\\":347.582}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":693.882,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":210.669,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":191.995,\\\"y\\\":452.121,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873181281341,\\\"y\\\":0.005036227050270593}},{\\\"point\\\":{\\\"x\\\":525.086,\\\"y\\\":452.121,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.0050358540887562725}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":459.532,\\\"y\\\":561.086,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064748,\\\"y\\\":0.7012692123096449}},{\\\"point\\\":{\\\"x\\\":258.629,\\\"y\\\":561.134,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986883991125071,\\\"y\\\":0.7154261114507926}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":593.877,\\\"y\\\":144.915,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.4872519015636219,\\\"y\\\":-0.8732614639514529}},{\\\"point\\\":{\\\"x\\\":123.002,\\\"y\\\":145.056,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5443686174596458,\\\"y\\\":-0.8388461171901994}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":632.235,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"crescent\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":30.33364723678065,\\\"max\\\":657.93},\\\"y\\\":{\\\"min\\\":15.648719386668894,\\\"max\\\":676.3174193674872}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crescent\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crescent\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 655.930 491.343 C 655.930 491.343 655.930 491.343 655.930 491.343 C 617.462 567.084 551.460 628.012 465.387 656.990 C 379.314 685.967 289.872 677.427 214.703 640.124 C 139.534 602.820 78.639 536.754 49.661 450.681 C 20.684 364.608 29.224 275.166 66.528 199.997 C 103.831 124.828 169.897 63.933 255.970 34.955 C 341.182 6.267 429.697 14.351 503.304 51.024 C 464.583 45.617 424.837 46.802 385.256 58.025 C 310.384 79.254 249.736 125.967 215.824 190.857 C 184.008 251.737 174.902 331.993 198.186 401.121 C 222.411 473.040 276.923 529.006 342.635 553.475 C 409.849 578.504 473.647 580.163 552.962 554.870 C 593.627 541.903 626.163 516.605 655.930 491.343 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":288.29,\\\"max\\\":612.556},\\\"y\\\":{\\\"min\\\":153.746,\\\"max\\\":478.012}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.999,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":16.462,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":32.423,\\\"y\\\":346.124,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088752079}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":593.334,\\\"y\\\":578.981,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129329685826609,\\\"y\\\":0.7012321885851466}},{\\\"point\\\":{\\\"x\\\":127.799,\\\"y\\\":579.029,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986883991125066,\\\"y\\\":0.7154261114507933}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":671.988,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"crescent_interlock\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":111.379,\\\"max\\\":608.621},\\\"y\\\":{\\\"min\\\":155.90488842429815,\\\"max\\\":564.0951011584016}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crescent_interlock\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crescent_interlock\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 319.666 502.446 C 313.478 496.180 307.697 489.511 302.272 482.358 C 269.556 507.232 234.040 519.464 185.741 520.542 C 159.398 521.131 135.327 512.889 112.879 504.113 C 150.535 540.614 201.294 562.943 257.360 562.591 C 294.925 562.356 329.993 551.984 360.005 534.078 C 345.227 525.258 331.679 514.610 319.666 502.446 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 398.535 215.755 C 387.108 204.471 374.343 194.542 360.040 185.901 C 390.323 167.706 426.496 157.166 465.182 157.409 C 520.688 157.757 570.744 180.237 606.360 216.416 C 584.839 205.490 561.396 198.208 536.035 196.818 C 490.941 194.347 448.667 207.545 415.986 235.391 C 410.665 228.539 404.801 221.943 398.535 215.755 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 415.986 235.391 C 410.665 228.539 404.801 221.943 398.535 215.755 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 398.535 215.755 C 387.108 204.471 374.343 194.542 360.040 185.901 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.402 359.594 C 360.380 362.838 360.346 366.045 359.784 369.142 C 363.426 411.458 381.464 451.392 411.742 477.527 C 413.753 479.263 415.859 480.847 417.726 482.272 C 443.662 448.164 458.972 405.264 458.680 358.729 C 458.388 312.194 442.541 269.489 415.986 235.391 C 410.665 228.539 404.801 221.943 398.535 215.755 C 387.108 204.471 374.343 194.542 360.040 185.901 C 329.678 167.706 293.504 157.166 254.818 157.409 C 199.312 157.757 149.256 180.237 113.640 216.416 C 135.162 205.490 158.605 198.208 183.965 196.818 C 229.059 194.347 271.333 207.545 304.011 235.379 C 305.556 236.702 307.613 238.463 309.537 240.375 C 337.344 267.994 355.541 309.122 360.181 350.195 C 360.377 353.418 360.423 356.508 360.402 359.594 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 309.537 240.375 C 337.344 267.994 355.541 309.122 360.181 350.195 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.784 369.142 C 363.426 411.458 381.464 451.392 411.742 477.527 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.742 477.527 C 413.753 479.263 415.859 480.847 417.726 482.272 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.005 534.078 C 345.227 525.258 331.679 514.610 319.666 502.446 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 319.666 502.446 C 313.478 496.180 307.697 489.511 302.272 482.358 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 304.011 235.379 C 305.556 236.702 307.613 238.463 309.537 240.375 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 309.537 240.375 C 337.344 267.994 355.541 309.122 360.181 350.195 C 359.728 353.413 359.657 356.507 359.598 359.594 C 359.536 362.836 359.517 366.037 359.784 369.142 C 363.426 411.458 381.464 451.392 411.742 477.527 C 413.753 479.263 415.859 480.847 417.726 482.272 C 450.445 507.231 485.960 519.463 534.259 520.542 C 560.602 521.131 584.674 512.889 607.121 504.113 C 569.465 540.614 518.706 562.943 462.640 562.591 C 425.075 562.356 390.007 551.984 360.005 534.078 C 345.227 525.258 331.679 514.610 319.666 502.446 C 313.478 496.180 307.697 489.511 302.272 482.358 C 276.338 448.164 261.028 405.264 261.320 358.729 C 261.612 312.194 277.460 269.489 304.011 235.379 C 305.556 236.702 307.613 238.463 309.537 240.375 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":483.178,\\\"max\\\":715.749},\\\"y\\\":{\\\"min\\\":243.714,\\\"max\\\":476.286}},{\\\"x\\\":{\\\"min\\\":4.251,\\\"max\\\":236.822},\\\"y\\\":{\\\"min\\\":243.714,\\\"max\\\":476.286}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":636.603,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":102.375,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":544.512,\\\"y\\\":544.918,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129201686221815,\\\"y\\\":0.7012452018885549}},{\\\"point\\\":{\\\"x\\\":175.336,\\\"y\\\":544.956,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986983952206235,\\\"y\\\":0.7154163490696347}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":544.641,\\\"y\\\":175.687,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314255409680891,\\\"y\\\":-0.7754365133350092}},{\\\"point\\\":{\\\"x\\\":175.986,\\\"y\\\":175.75,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817324154662258,\\\"y\\\":-0.7316016085975928}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":564.253,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"crescent_interlock_3\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":14.552,\\\"max\\\":705.448},\\\"y\\\":{\\\"min\\\":17.547,\\\"max\\\":632.6264419362478}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crescent_interlock_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crescent_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 639.764 246.165 C 630.229 239.905 620.417 234.409 611.190 230.075 C 612.409 219.748 613.049 210.078 613.137 200.270 C 613.212 191.863 612.878 183.551 612.026 175.193 C 658.415 210.039 689.881 258.634 703.448 311.476 C 687.052 286.164 666.293 263.583 639.764 246.165 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 225.964 279.219 C 255.644 304.678 294.894 323.163 335.656 328.676 C 338.496 322.432 341.683 316.294 345.219 310.292 C 349.794 302.525 354.956 295.099 360.990 287.583 C 386.375 255.956 422.389 231.753 459.923 219.210 C 465.407 217.377 471.078 215.758 476.750 214.418 C 497.676 209.474 519.022 208.121 540.286 210.198 C 549.359 189.870 555.325 168.094 558.376 144.163 C 505.705 121.673 448.687 118.357 396.042 131.962 C 384.134 135.039 372.450 138.983 361.449 143.615 C 322.909 159.842 288.274 185.498 261.017 219.923 C 254.032 228.745 247.377 238.427 241.327 248.694 C 235.426 258.708 230.290 268.955 225.964 279.219 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 214.172 440.595 C 210.770 427.434 208.427 413.999 207.140 400.040 C 240.178 425.027 279.585 442.109 322.482 448.401 C 324.165 456.043 326.461 463.855 329.297 471.457 C 337.845 494.369 348.718 514.586 363.231 533.268 C 376.152 549.902 392.211 565.276 411.999 579.732 C 418.766 584.677 426.456 589.803 434.676 594.826 C 462.770 611.994 493.951 618.196 523.712 622.802 C 469.657 636.238 411.799 632.668 359.344 609.779 C 349.202 605.355 339.957 600.646 330.903 595.310 C 324.264 591.398 317.869 587.233 311.221 582.473 C 261.997 547.244 228.586 496.374 214.172 440.595 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.449 143.615 C 322.909 159.842 288.274 185.498 261.017 219.923 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 329.118 132.189 C 340.345 135.305 351.358 139.194 361.449 143.615 C 322.909 159.842 288.274 185.498 261.017 219.923 C 255.542 218.526 250.204 217.363 244.827 216.460 C 221.175 212.485 198.649 211.743 176.415 214.675 C 154.268 217.596 132.422 223.904 109.382 234.090 C 102.042 237.333 93.758 241.430 85.298 246.036 C 56.383 261.782 35.421 285.685 16.552 309.156 C 31.582 256.884 62.467 209.581 107.888 174.918 C 116.605 168.265 126.398 161.787 136.764 155.925 C 143.472 152.131 150.277 148.675 157.160 145.552 C 212.845 120.283 273.605 116.784 329.118 132.189 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.990 287.583 C 386.375 255.956 422.389 231.753 459.923 219.210 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.999 579.732 C 392.211 565.276 376.152 549.902 363.231 533.268 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 376.439 310.832 C 371.827 302.680 366.688 294.950 360.990 287.583 C 386.375 255.956 422.389 231.753 459.923 219.210 C 467.966 229.359 475.226 240.156 481.731 251.657 C 486.511 260.109 490.754 268.715 494.348 277.141 C 511.410 317.140 517.447 359.141 513.645 399.322 C 512.166 414.968 509.447 429.664 505.466 444.010 C 490.753 497.029 458.796 545.262 411.999 579.732 C 392.211 565.276 376.152 549.902 363.231 533.268 C 376.708 515.045 387.099 494.678 393.703 472.678 C 396.141 464.558 398.066 456.147 399.360 448.189 C 405.773 408.798 401.418 365.996 385.381 328.879 C 382.639 322.533 379.698 316.592 376.439 310.832 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 311.221 582.473 C 317.869 587.233 324.264 591.398 330.903 595.310 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 330.903 595.310 C 339.957 600.646 349.202 605.355 359.344 609.779 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_5)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 284.703 597.978 C 293.819 593.390 302.517 588.305 311.221 582.473 C 317.869 587.233 324.264 591.398 330.903 595.310 C 339.957 600.646 349.202 605.355 359.344 609.779 C 306.663 632.194 248.845 635.146 196.299 620.475 C 226.418 618.931 256.354 612.244 284.703 597.978 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 385.381 328.879 C 401.418 365.996 405.773 408.798 399.360 448.189 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.482 448.401 C 279.585 442.109 240.178 425.027 207.140 400.040 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 109.382 234.090 C 132.422 223.904 154.268 217.596 176.415 214.675 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 225.964 279.219 C 255.644 304.678 294.894 323.163 335.656 328.676 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_6)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.145 330.381 C 367.926 330.458 376.618 329.947 385.381 328.879 C 401.418 365.996 405.773 408.798 399.360 448.189 C 385.728 450.254 371.870 451.279 357.747 451.153 C 345.838 451.048 334.131 450.127 322.482 448.401 C 279.585 442.109 240.178 425.027 207.140 400.040 C 197.260 392.530 187.956 384.347 179.296 375.532 C 142.553 338.128 117.401 289.336 109.382 234.090 C 132.422 223.904 154.268 217.596 176.415 214.675 C 185.134 232.991 196.455 249.658 210.350 264.408 C 215.074 269.422 220.133 274.240 225.964 279.219 C 255.644 304.678 294.894 323.163 335.656 328.676 C 343.482 329.732 351.313 330.312 359.145 330.381 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 513.645 399.322 C 517.447 359.141 511.410 317.140 494.348 277.141 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 540.286 210.198 C 549.359 189.870 555.325 168.094 558.376 144.163 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 612.026 175.193 C 612.878 183.551 613.212 191.863 613.137 200.270 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 613.137 200.270 C 613.049 210.078 612.409 219.748 611.190 230.075 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_7)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 537.515 378.720 C 530.127 385.979 522.294 392.784 513.645 399.322 C 517.447 359.141 511.410 317.140 494.348 277.141 C 498.824 272.610 502.875 268.197 506.680 263.588 C 520.769 246.521 531.994 228.909 540.286 210.198 C 549.359 189.870 555.325 168.094 558.376 144.163 C 559.744 133.167 560.542 122.199 560.831 110.643 C 561.652 77.729 551.433 47.624 540.541 19.547 C 580.569 61.057 606.848 115.211 612.026 175.193 C 612.878 183.551 613.212 191.863 613.137 200.270 C 613.049 210.078 612.409 219.748 611.190 230.075 C 604.103 287.628 577.228 339.708 537.515 378.720 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 157.160 145.552 C 150.277 148.675 143.472 152.131 136.764 155.925 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 136.764 155.925 C 126.398 161.787 116.605 168.265 107.888 174.918 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_8)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 156.338 107.362 C 155.581 120.547 155.897 133.542 157.160 145.552 C 150.277 148.675 143.472 152.131 136.764 155.925 C 126.398 161.787 116.605 168.265 107.888 174.918 C 113.301 114.096 140.265 59.499 181.057 19.553 C 167.334 46.409 158.157 75.677 156.338 107.362 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":260.795,\\\"max\\\":459.205},\\\"y\\\":{\\\"min\\\":225.035,\\\"max\\\":423.444}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.278,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":141.372,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}},{\\\"point\\\":{\\\"x\\\":514.658,\\\"y\\\":399.581,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8660425293174793,\\\"y\\\":0.4999703365334618}},{\\\"point\\\":{\\\"x\\\":205.341,\\\"y\\\":402.708,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.866024015056127,\\\"y\\\":0.5000024053402794}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":613.114,\\\"y\\\":171.455,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8660265386344244,\\\"y\\\":-0.4999980343770141}},{\\\"point\\\":{\\\"x\\\":106.886,\\\"y\\\":175.629,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8660265386344249,\\\"y\\\":-0.49999803437701323}},{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":611.074,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_0\\\",\\\"x1\\\":\\\"-46.47%\\\",\\\"y1\\\":\\\"-0.86%\\\",\\\"x2\\\":\\\"150.26%\\\",\\\"y2\\\":\\\"113.18%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"40.39%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_1\\\",\\\"x1\\\":\\\"-14.92%\\\",\\\"y1\\\":\\\"107.11%\\\",\\\"x2\\\":\\\"132.02%\\\",\\\"y2\\\":\\\"17.28%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"32.16%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"71.76%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_2\\\",\\\"x1\\\":\\\"13.43%\\\",\\\"y1\\\":\\\"-37.25%\\\",\\\"x2\\\":\\\"52.50%\\\",\\\"y2\\\":\\\"153.97%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"40.39%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_3\\\",\\\"x1\\\":\\\"111.20%\\\",\\\"y1\\\":\\\"60.61%\\\",\\\"x2\\\":\\\"-10.84%\\\",\\\"y2\\\":\\\"-21.92%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"40.39%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_4\\\",\\\"x1\\\":\\\"-7.01%\\\",\\\"y1\\\":\\\"128.00%\\\",\\\"x2\\\":\\\"23.54%\\\",\\\"y2\\\":\\\"-21.12%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"32.16%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"71.76%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_5\\\",\\\"x1\\\":\\\"111.84%\\\",\\\"y1\\\":\\\"-22.72%\\\",\\\"x2\\\":\\\"-38.45%\\\",\\\"y2\\\":\\\"147.31%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"40.39%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_6\\\",\\\"x1\\\":\\\"140.99%\\\",\\\"y1\\\":\\\"80.00%\\\",\\\"x2\\\":\\\"-7.22%\\\",\\\"y2\\\":\\\"-20.02%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"32.16%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"71.76%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_7\\\",\\\"x1\\\":\\\"-68.65%\\\",\\\"y1\\\":\\\"96.46%\\\",\\\"x2\\\":\\\"194.15%\\\",\\\"y2\\\":\\\"6.90%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"40.39%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C39E0CB1-FEA3-4E24-88FE-E38E2E2D91A2_8\\\",\\\"x1\\\":\\\"41.39%\\\",\\\"y1\\\":\\\"121.48%\\\",\\\"x2\\\":\\\"97.78%\\\",\\\"y2\\\":\\\"-23.38%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"40.39%\\\",\\\"color\\\":\\\"#ffffff\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"],\\\"never_flip_attachments\\\":true}},{\\\"name\\\":\\\"cross\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":44.144,\\\"max\\\":675.856},\\\"y\\\":{\\\"min\\\":20.357,\\\"max\\\":652.069}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cross\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cross\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 46.144 279.148 C 46.170 279.148 199.024 279.148 302.919 279.148 C 302.935 175.238 302.935 22.383 302.935 22.357 C 302.947 22.357 417.053 22.357 417.065 22.357 C 417.065 22.383 417.065 193.931 417.142 279.148 C 502.281 279.148 673.830 279.148 673.856 279.148 C 673.856 279.160 673.856 393.266 673.856 393.278 C 673.830 393.278 502.282 393.278 417.147 393.278 C 417.065 497.188 417.065 650.043 417.065 650.069 C 417.053 650.069 302.947 650.069 302.935 650.069 C 302.935 650.043 302.935 478.494 302.924 393.278 C 199.024 393.278 46.170 393.278 46.144 393.278 C 46.144 393.266 46.144 279.160 46.144 279.148 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":201.285,\\\"max\\\":518.715},\\\"y\\\":{\\\"min\\\":177.498,\\\"max\\\":494.928}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":704.39,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":22.731,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":47.114,\\\"y\\\":337.105,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872583262418,\\\"y\\\":0.005048087277974795}},{\\\"point\\\":{\\\"x\\\":672.886,\\\"y\\\":337.105,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872583262418,\\\"y\\\":0.0050480872779748035}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":581.883,\\\"y\\\":559.163,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128690054290197,\\\"y\\\":0.7012972130977281}},{\\\"point\\\":{\\\"x\\\":137.935,\\\"y\\\":559.209,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987090223112513,\\\"y\\\":0.7154059701601988}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":582.038,\\\"y\\\":115.148,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314810462492056,\\\"y\\\":-0.7753913129691413}},{\\\"point\\\":{\\\"x\\\":138.716,\\\"y\\\":115.224,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817397690748632,\\\"y\\\":-0.7315947561743129}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":647.492,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"cross_hierophant\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":258.803,\\\"max\\\":461.197},\\\"y\\\":{\\\"min\\\":50.733,\\\"max\\\":673.723}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cross_hierophant\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cross_hierophant\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S24\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 460.197 207.596 C 460.188 207.596 401.415 207.596 371.101 207.596 C 373.322 380.467 377.034 672.677 377.035 672.723 C 377.032 672.723 342.969 672.723 342.965 672.723 C 342.966 672.677 346.883 364.246 348.893 207.596 C 314.645 207.596 259.812 207.596 259.803 207.596 C 259.803 207.594 259.803 185.332 259.803 185.330 C 259.812 185.330 314.645 185.330 348.891 185.330 C 348.888 178.006 348.885 170.350 348.836 163.064 C 322.430 163.064 282.076 163.064 282.069 163.064 C 282.069 163.062 282.069 140.800 282.069 140.798 C 282.076 140.798 322.430 140.798 348.835 140.798 C 348.841 133.286 348.846 125.732 348.833 118.532 C 330.832 118.532 304.340 118.532 304.335 118.532 C 304.335 118.529 304.335 96.268 304.335 96.266 C 304.340 96.266 330.832 96.266 348.832 96.266 C 348.867 75.608 348.867 51.738 348.867 51.733 C 348.869 51.733 371.131 51.733 371.133 51.733 C 371.133 51.738 371.133 82.015 371.120 96.266 C 385.977 96.266 415.661 96.266 415.666 96.266 C 415.666 96.268 415.666 118.529 415.666 118.532 C 415.661 118.532 385.978 118.532 371.122 118.532 C 371.122 125.641 371.122 132.843 371.186 140.798 C 393.251 140.798 437.925 140.798 437.931 140.798 C 437.931 140.800 437.931 163.062 437.931 163.064 C 437.925 163.064 393.251 163.064 371.188 163.064 C 371.186 170.022 371.184 177.050 371.100 185.330 C 401.415 185.330 460.188 185.330 460.197 185.330 C 460.197 185.332 460.197 207.594 460.197 207.596 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.17,\\\"y\\\":683.365,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.12,\\\"y\\\":38.451,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":203.11,\\\"y\\\":196.086,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999877161383834,\\\"y\\\":0.004956568605391953}},{\\\"point\\\":{\\\"x\\\":516.89,\\\"y\\\":196.086,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999877161383834,\\\"y\\\":0.004956568605391953}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":471.258,\\\"y\\\":307.446,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128907511869773,\\\"y\\\":0.7012751078371934}},{\\\"point\\\":{\\\"x\\\":248.65,\\\"y\\\":307.469,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986934379825982,\\\"y\\\":0.7154211904326411}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":471.31,\\\"y\\\":84.785,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314143699413368,\\\"y\\\":-0.77544560958947}},{\\\"point\\\":{\\\"x\\\":249.015,\\\"y\\\":84.822,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6818103818443091,\\\"y\\\":-0.7315289489892505}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360.17,\\\"y\\\":676.8,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"cross_tall\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":141.752,\\\"max\\\":578.248},\\\"y\\\":{\\\"min\\\":13.969,\\\"max\\\":706.031}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cross_tall\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cross_tall\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 143.752 192.899 C 143.769 192.899 249.087 192.899 320.671 192.899 C 320.682 120.817 320.682 15.986 320.682 15.969 C 320.690 15.969 399.310 15.969 399.318 15.969 C 399.318 15.986 399.318 131.825 399.371 192.899 C 458.033 192.899 576.231 192.899 576.248 192.899 C 576.248 192.907 576.248 271.527 576.248 271.535 C 576.231 271.535 458.033 271.535 399.374 271.535 C 399.316 432.423 399.318 703.988 399.318 704.031 C 399.310 704.031 320.690 704.031 320.682 704.031 C 320.682 703.988 320.682 414.602 320.674 271.535 C 249.087 271.535 143.769 271.535 143.752 271.535 C 143.752 271.527 143.752 192.907 143.752 192.899 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":212.722,\\\"max\\\":507.611},\\\"y\\\":{\\\"min\\\":85.313,\\\"max\\\":380.203}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.167,\\\"y\\\":702.942,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.167,\\\"y\\\":14.692,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":142.349,\\\"y\\\":233.376,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873799329543,\\\"y\\\":0.005023940169361445}},{\\\"point\\\":{\\\"x\\\":577.651,\\\"y\\\":233.376,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873799329543,\\\"y\\\":0.005023940169361445}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":514.347,\\\"y\\\":387.865,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128887745836083,\\\"y\\\":0.701277117174574}},{\\\"point\\\":{\\\"x\\\":205.526,\\\"y\\\":387.896,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986837139562596,\\\"y\\\":0.715430686965752}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":514.418,\\\"y\\\":78.97,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314244252646386,\\\"y\\\":-0.7754374218331361}},{\\\"point\\\":{\\\"x\\\":206.032,\\\"y\\\":79.022,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817133757444261,\\\"y\\\":-0.7316193500250927}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360.167,\\\"y\\\":696.497,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"crown\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":25.114999191682596,\\\"max\\\":694.885},\\\"y\\\":{\\\"min\\\":39.694,\\\"max\\\":493.846}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crown\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crown\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 50.305 459.012 C 50.336 459.009 111.107 427.245 360.000 427.246 C 553.799 427.246 669.664 459.009 669.695 459.012 C 669.723 459.035 625.815 491.846 360.000 491.846 C 94.185 491.846 50.336 459.015 50.305 459.012 C 50.303 458.978 27.110 124.786 27.115 124.753 C 27.121 124.767 219.384 276.359 219.389 276.371 C 219.407 276.350 359.983 41.715 360.000 41.694 C 360.003 41.712 500.610 277.455 500.611 277.469 C 500.632 277.456 692.866 124.768 692.885 124.753 C 692.883 124.787 669.436 458.799 669.695 459.012 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6FD5DCA2-19D9-4D91-8CA6-4FCDFC0BAEF9_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 27.115 124.753 C 27.121 124.767 219.384 276.359 219.389 276.371 C 219.407 276.350 359.983 41.715 360.000 41.694 C 360.003 41.712 500.610 277.455 500.611 277.469 C 500.632 277.456 692.866 124.768 692.885 124.753 C 692.883 124.787 669.436 458.799 669.695 459.012 C 669.723 459.035 625.815 491.846 360.000 491.846 C 94.185 491.846 50.336 459.015 50.305 459.012 C 50.303 458.978 27.110 124.786 27.115 124.753 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.727 427.407 C 532.499 428.172 636.213 451.318 636.240 451.320 C 636.264 451.342 596.347 471.294 360.132 470.217 C 123.728 469.139 84.015 448.785 83.987 448.783 C 84.015 448.781 138.621 426.429 359.727 427.407 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 50.305 459.012 C 50.336 459.009 111.107 427.245 360.000 427.246 C 553.799 427.246 669.664 459.009 669.695 459.012 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":197.046,\\\"max\\\":522.954},\\\"y\\\":{\\\"min\\\":170.876,\\\"max\\\":449.848}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":682.75,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":41.126,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":29.342,\\\"y\\\":129.47,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.47807111005873953,\\\"y\\\":-0.8783211335993257}},{\\\"point\\\":{\\\"x\\\":690.351,\\\"y\\\":130.394,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.4976058390874751,\\\"y\\\":-0.86740326775154}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":46.049,\\\"y\\\":358.308,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9845185257543309,\\\"y\\\":-0.17528055353209895}},{\\\"point\\\":{\\\"x\\\":673.951,\\\"y\\\":358.308,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9845185257543307,\\\"y\\\":-0.1752805535320994}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":132.064,\\\"y\\\":477.009,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5860451057049829,\\\"y\\\":0.8102784299728306}},{\\\"point\\\":{\\\"x\\\":587.936,\\\"y\\\":477.009,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5860451057049805,\\\"y\\\":0.8102784299728324}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.967,\\\"y\\\":490.137,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6FD5DCA2-19D9-4D91-8CA6-4FCDFC0BAEF9_1\\\",\\\"x1\\\":\\\"-39.69%\\\",\\\"y1\\\":\\\"56.37%\\\",\\\"x2\\\":\\\"129.73%\\\",\\\"y2\\\":\\\"56.37%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"36.86%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"67.45%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"crown_5pt\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":83.016,\\\"max\\\":636.984},\\\"y\\\":{\\\"min\\\":32.344,\\\"max\\\":604.205}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crown_5pt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crown_5pt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#D3A6B0D3-4D70-439F-8893-2197D22DB198_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 110.117 137.095 C 110.128 137.117 220.696 362.207 220.707 362.230 C 220.708 362.202 235.057 81.053 235.058 81.024 C 235.066 81.050 313.561 335.958 313.569 335.984 C 313.573 335.956 359.995 59.578 360.000 59.551 C 360.005 59.578 406.427 335.956 406.431 335.984 C 406.439 335.958 484.934 81.050 484.942 81.024 C 484.943 81.053 499.292 362.202 499.293 362.230 C 499.304 362.207 609.872 137.117 609.883 137.095 C 609.878 137.139 555.023 443.666 556.126 581.336 C 457.870 557.607 262.130 557.608 163.874 581.336 C 164.977 443.666 110.122 137.139 110.117 137.095 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 85.016 136.344 C 85.016 122.147 96.469 110.694 110.666 110.694 C 124.863 110.694 136.315 122.147 136.315 136.344 C 136.315 150.540 124.863 161.993 110.666 161.993 C 96.469 161.993 85.016 150.540 85.016 136.344 M 583.685 136.344 C 583.685 122.147 595.137 110.694 609.334 110.694 C 623.531 110.694 634.984 122.147 634.984 136.344 C 634.984 150.540 623.531 161.993 609.334 161.993 C 595.137 161.993 583.685 150.540 583.685 136.344 M 209.087 82.659 C 209.088 68.463 220.540 57.010 234.737 57.010 C 248.933 57.010 260.386 68.463 260.386 82.659 C 260.386 96.856 248.933 108.309 234.737 108.309 C 220.540 108.309 209.087 96.856 209.087 82.659 M 459.615 82.659 C 459.615 68.463 471.067 57.010 485.264 57.010 C 499.460 57.010 510.913 68.463 510.913 82.659 C 510.913 96.856 499.461 108.309 485.264 108.309 C 471.067 108.309 459.615 96.856 459.615 82.659 M 334.351 59.993 C 334.351 45.796 345.803 34.344 360.000 34.344 C 374.197 34.344 385.649 45.796 385.649 59.993 C 385.649 74.190 374.197 85.642 360.000 85.642 C 345.803 85.642 334.351 74.190 334.351 59.993 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 556.126 535.009 C 457.870 511.280 262.130 511.280 163.874 535.009 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.949 560.752 C 491.431 560.752 556.079 571.862 556.079 581.479 C 556.079 591.096 491.431 602.205 359.949 602.205 C 228.467 602.205 163.820 591.096 163.820 581.479 C 163.820 571.862 228.467 560.752 359.949 560.752 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":260.795,\\\"max\\\":459.205},\\\"y\\\":{\\\"min\\\":345.707,\\\"max\\\":544.116}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":690.413,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":34.419,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":154.559,\\\"y\\\":439.544,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999870678341088,\\\"y\\\":0.005085682308323256}},{\\\"point\\\":{\\\"x\\\":565.441,\\\"y\\\":439.544,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999870678341088,\\\"y\\\":0.00508568230832329}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":549.959,\\\"y\\\":578.053,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129337270328766,\\\"y\\\":0.7012314174785752}},{\\\"point\\\":{\\\"x\\\":169.885,\\\"y\\\":578.092,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987578770327179,\\\"y\\\":0.7153582524055547}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":629.021,\\\"y\\\":117.746,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314560735200178,\\\"y\\\":-0.7754116501669819}},{\\\"point\\\":{\\\"x\\\":91.875,\\\"y\\\":117.837,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817333964226698,\\\"y\\\":-0.7316006945062389}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":601.979,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"D3A6B0D3-4D70-439F-8893-2197D22DB198_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"97.70%\\\",\\\"r\\\":\\\"184.22%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"25.49%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"crown_5pt2\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":58.275,\\\"max\\\":661.715},\\\"y\\\":{\\\"min\\\":18.937,\\\"max\\\":372.07974999999993}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crown_5pt2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crown_5pt2.2g\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 586.261 337.104 C 467.022 382.405 253.151 382.405 134.281 337.104 C 249.663 286.607 449.653 277.578 586.261 337.104 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 586.261 337.104 C 449.653 277.578 249.663 286.607 134.281 337.104 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 59.275 132.451 C 59.281 132.454 119.867 168.228 119.872 168.232 C 109.525 279.666 246.443 224.496 171.472 141.836 C 177.394 113.857 185.625 58.512 185.627 58.504 C 185.632 58.510 234.898 114.729 244.341 123.589 C 220.260 230.718 383.320 216.836 314.585 103.344 C 328.247 75.886 360.131 19.946 360.136 19.937 C 360.140 19.946 405.622 103.333 405.627 103.341 C 342.778 218.912 507.422 232.384 476.793 123.770 C 495.008 103.434 534.562 58.879 534.568 58.872 C 534.570 58.881 548.699 142.000 548.701 142.008 C 472.087 221.923 613.472 274.909 600.198 168.555 C 616.826 157.752 660.709 133.124 660.715 133.121 C 660.708 133.141 593.218 319.078 586.261 337.104 C 449.653 277.578 249.663 286.607 134.281 337.104 C 127.842 315.887 59.283 132.471 59.275 132.451 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 600.704 288.401 C 465.676 230.850 243.583 237.696 119.838 289.101 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":167.897,\\\"max\\\":552.104},\\\"y\\\":{\\\"min\\\":325.553,\\\"max\\\":709.76}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":330.616,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":165.596,\\\"y\\\":524.56,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999868707286589,\\\"y\\\":0.005124292175969085}},{\\\"point\\\":{\\\"x\\\":554.404,\\\"y\\\":524.56,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999868707286589,\\\"y\\\":0.005124292175969103}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":false,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"crown_hierophant\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":67.578,\\\"max\\\":652.145},\\\"y\\\":{\\\"min\\\":50.333,\\\"max\\\":639.8695}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crown_hierophant\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crown_hierophant\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 554.622 609.645 C 452.056 648.611 268.091 648.611 165.843 609.645 C 265.908 568.125 436.155 560.706 554.622 609.645 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.074 127.377 C 360.099 127.405 606.867 156.088 613.652 399.414 C 613.604 399.431 243.073 440.187 106.813 399.904 C 113.329 155.965 360.048 127.405 360.074 127.377 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_2\\\",\\\"fill\\\":\\\"url(#5E81175E-F71D-4939-95D1-EBD2959F77EA_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 210.009 129.175 C 210.016 129.180 275.737 181.846 275.744 181.851 C 279.905 222.678 333.535 210.767 311.360 161.956 C 313.402 159.127 360.111 51.344 360.116 51.333 C 360.121 51.344 408.817 161.942 408.820 161.953 C 386.558 210.796 440.224 222.795 444.403 182.006 C 466.194 167.031 510.150 129.497 510.157 129.492 C 510.156 129.499 463.708 360.103 453.645 374.688 C 404.481 337.582 308.254 343.744 266.819 375.264 C 256.470 357.699 210.010 129.182 210.009 129.175 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#5E81175E-F71D-4939-95D1-EBD2959F77EA_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 68.578 284.292 C 68.583 284.296 116.155 324.045 116.160 324.050 C 118.864 419.568 218.792 356.527 177.274 292.094 C 182.113 267.881 190.805 220.387 190.806 220.380 C 190.811 220.386 238.394 272.933 238.398 272.938 C 223.219 358.951 356.304 361.927 322.866 252.833 C 334.450 229.225 359.736 180.177 359.740 180.169 C 359.743 180.177 396.913 252.638 396.916 252.645 C 363.998 361.899 497.056 358.241 481.445 272.488 C 495.545 255.283 528.793 219.861 528.798 219.856 C 528.799 219.863 542.663 291.324 542.665 291.331 C 501.480 355.796 601.709 418.315 603.838 323.113 C 617.283 310.495 651.140 283.421 651.145 283.417 C 651.137 283.440 586.762 488.138 579.551 507.817 C 446.262 452.430 254.065 461.840 141.756 509.484 C 135.023 486.357 68.585 284.315 68.578 284.292 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 554.622 609.645 C 436.155 560.706 265.908 568.125 165.843 609.645 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"url(#5E81175E-F71D-4939-95D1-EBD2959F77EA_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 101.326 398.871 C 101.330 398.875 143.488 438.744 143.492 438.748 C 145.448 525.968 237.431 464.647 197.834 406.944 C 201.953 382.692 210.008 335.272 210.009 335.265 C 210.013 335.270 252.152 387.935 252.156 387.941 C 237.431 464.646 360.074 464.646 327.210 368.046 C 337.830 344.626 360.113 295.482 360.116 295.475 C 360.119 295.482 392.967 368.036 392.971 368.043 C 360.074 464.646 482.717 464.646 467.991 388.096 C 481.239 371.596 510.153 335.587 510.157 335.582 C 510.158 335.589 522.312 407.085 522.313 407.092 C 482.717 464.646 574.699 525.968 576.567 439.025 C 589.137 427.208 618.660 399.452 618.665 399.448 C 618.658 399.469 561.311 591.273 554.622 609.645 C 436.155 560.706 265.908 568.125 165.843 609.645 C 159.745 588.067 101.332 398.893 101.326 398.871 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 567.045 567.752 C 440.973 515.767 259.862 524.137 153.420 568.354 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":216.05,\\\"max\\\":503.95},\\\"y\\\":{\\\"min\\\":282.655,\\\"max\\\":570.556}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":602.467,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":58.481,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":135.96,\\\"y\\\":523.623,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875517033758,\\\"y\\\":0.004989633081493728}},{\\\"point\\\":{\\\"x\\\":584.04,\\\"y\\\":523.623,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875517033758,\\\"y\\\":0.004989633081493704}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":552.941,\\\"y\\\":228.2,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314401624162213,\\\"y\\\":-0.7754246070945752}},{\\\"point\\\":{\\\"x\\\":167.719,\\\"y\\\":228.266,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817321223700673,\\\"y\\\":-0.7316018817149144}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"5E81175E-F71D-4939-95D1-EBD2959F77EA_2\\\",\\\"cx\\\":\\\"50.26%\\\",\\\"cy\\\":\\\"189.95%\\\",\\\"r\\\":\\\"271.04%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"5E81175E-F71D-4939-95D1-EBD2959F77EA_3\\\",\\\"cx\\\":\\\"50.51%\\\",\\\"cy\\\":\\\"186.82%\\\",\\\"r\\\":\\\"255.43%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"5E81175E-F71D-4939-95D1-EBD2959F77EA_4\\\",\\\"cx\\\":\\\"50.75%\\\",\\\"cy\\\":\\\"194.24%\\\",\\\"r\\\":\\\"279.59%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"crown_ornate\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":48.82199993929521,\\\"max\\\":671.1780000607049},\\\"y\\\":{\\\"min\\\":138.769,\\\"max\\\":577.825}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crown_ornate_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"crown_ornate\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 303.490 187.004 C 303.494 187.004 331.016 187.004 349.722 187.004 C 349.725 168.295 349.725 140.773 349.725 140.769 C 349.727 140.769 370.273 140.769 370.275 140.769 C 370.275 140.773 370.275 171.661 370.288 187.004 C 385.618 187.004 416.506 187.004 416.510 187.004 C 416.510 187.007 416.510 207.552 416.510 207.554 C 416.506 207.554 385.618 207.554 370.290 207.554 C 370.275 226.263 370.275 253.785 370.275 253.789 C 370.273 253.789 349.727 253.789 349.725 253.789 C 349.725 253.785 349.725 222.897 349.723 207.554 C 331.016 207.554 303.494 207.554 303.490 207.554 C 303.490 207.552 303.490 187.007 303.490 187.004 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 575.825 C 420.889 575.825 547.968 574.857 563.451 566.994 C 561.209 566.895 420.017 558.050 360.002 558.050 C 299.985 558.050 156.569 566.993 156.549 566.994 C 172.671 574.256 299.111 575.825 360.000 575.825 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.007 270.408 C 389.270 244.787 428.592 228.836 470.148 229.862 C 549.233 231.816 636.489 306.158 613.164 372.700 C 604.852 396.412 588.018 418.735 570.963 436.097 C 558.257 451.279 538.283 468.802 538.280 468.806 C 538.277 468.806 521.696 468.903 513.312 468.953 C 417.546 469.515 280.018 470.323 209.710 470.735 C 199.085 470.798 182.904 470.892 182.901 470.892 C 182.897 470.889 162.057 450.415 148.380 433.866 C 131.041 415.193 113.532 392.185 106.836 372.700 C 85.172 309.660 163.146 227.263 249.851 229.862 C 291.402 231.108 330.730 244.787 360.007 270.408 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 513.312 468.953 C 417.546 469.515 280.018 470.323 209.710 470.735 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 571.471 388.330 C 560.187 422.166 529.820 453.326 513.312 468.953 C 417.546 469.515 280.018 470.323 209.710 470.735 C 189.527 452.269 153.760 416.861 143.754 388.330 C 125.121 335.193 191.323 265.475 264.565 267.670 C 299.665 268.722 332.888 280.276 357.619 301.920 C 382.339 280.277 415.582 266.039 450.660 267.670 C 517.466 270.777 590.314 331.826 571.471 388.330 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 563.451 566.994 C 561.209 566.895 420.017 558.050 360.002 558.050 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.002 558.050 C 299.985 558.050 156.569 566.993 156.549 566.994 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 138.493 474.677 C 138.515 474.676 295.309 466.608 360.894 466.619 C 425.953 466.631 581.485 474.676 581.507 474.677 C 581.505 474.686 563.956 567.016 563.451 566.994 C 561.209 566.895 420.017 558.050 360.002 558.050 C 299.985 558.050 156.569 566.993 156.549 566.994 C 156.547 566.984 138.495 474.686 138.493 474.677 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 581.507 474.677 C 581.485 474.676 425.953 466.631 360.894 466.619 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.894 466.619 C 295.309 466.608 138.515 474.676 138.493 474.677 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 596.798 445.503 C 593.559 451.682 590.737 457.065 588.401 461.524 C 584.181 469.575 583.805 470.293 581.507 474.677 C 581.485 474.676 425.953 466.631 360.894 466.619 C 295.309 466.608 138.515 474.676 138.493 474.677 C 138.492 474.676 133.788 465.699 131.349 461.046 C 128.688 455.969 125.838 450.531 122.983 445.083 C 117.274 434.190 111.219 422.637 105.246 411.241 C 102.461 405.927 99.617 400.500 96.882 395.281 C 87.111 376.638 74.329 352.249 74.326 352.245 C 74.338 352.249 155.879 375.086 187.025 393.056 C 203.905 402.795 207.162 438.208 237.568 433.866 C 271.854 428.971 262.817 388.728 277.800 372.651 C 298.762 350.158 359.992 311.441 360.000 311.435 C 360.008 311.441 421.238 350.158 442.200 372.651 C 457.183 388.728 448.146 428.971 482.432 433.866 C 512.838 438.208 516.095 402.795 532.975 393.056 C 564.122 375.086 645.664 352.249 645.675 352.245 C 645.672 352.249 630.702 380.812 622.964 395.578 C 620.524 400.232 617.632 405.749 614.591 411.552 C 608.792 422.617 602.346 434.915 596.798 445.503 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 312.258 403.667 C 312.258 377.242 333.575 355.924 360.000 355.924 C 386.425 355.924 407.742 377.242 407.742 403.667 C 407.742 430.092 386.425 451.409 360.000 451.409 C 333.575 451.409 312.258 430.092 312.258 403.667 M 210.290 400.971 C 210.290 388.795 220.112 378.973 232.288 378.973 C 244.463 378.973 254.285 388.795 254.285 400.971 C 254.285 413.146 244.463 422.968 232.288 422.968 C 220.112 422.968 210.290 413.146 210.290 400.971 M 465.715 400.971 C 465.715 388.795 475.538 378.973 487.713 378.973 C 499.889 378.973 509.710 388.796 509.710 400.971 C 509.710 413.146 499.888 422.968 487.713 422.968 C 475.538 422.969 465.716 413.146 465.715 400.971 M 50.822 323.027 C 50.822 307.715 63.175 295.362 78.488 295.362 C 93.801 295.362 106.154 307.715 106.154 323.027 C 106.154 338.340 93.801 350.694 78.488 350.694 C 63.175 350.694 50.821 338.341 50.822 323.027 M 613.847 323.027 C 613.847 307.715 626.199 295.362 641.512 295.362 C 656.825 295.362 669.178 307.715 669.178 323.027 C 669.179 338.341 656.825 350.694 641.512 350.694 C 626.199 350.694 613.847 338.340 613.847 323.027 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 504.519 519.602 C 504.519 504.674 516.561 492.631 531.489 492.631 C 546.417 492.631 558.461 504.674 558.461 519.602 C 558.461 534.531 546.417 546.574 531.489 546.574 C 516.561 546.574 504.519 534.531 504.519 519.602 M 421.670 515.335 C 421.670 500.406 433.713 488.363 448.641 488.363 C 463.570 488.363 475.614 500.406 475.614 515.335 C 475.614 530.263 463.570 542.306 448.641 542.306 C 433.713 542.306 421.670 530.263 421.670 515.335 M 333.028 514.597 C 333.028 499.669 345.071 487.626 360.000 487.626 C 374.929 487.626 386.972 499.669 386.972 514.597 C 386.972 529.526 374.929 541.569 360.000 541.569 C 345.071 541.569 333.028 529.526 333.028 514.597 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 378.942 C 373.685 378.942 384.725 389.982 384.725 403.667 C 384.725 417.352 373.686 428.393 360.000 428.393 C 346.314 428.393 335.275 417.352 335.275 403.667 C 335.275 389.982 346.315 378.942 360.000 378.942 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 641.081 309.257 C 648.772 309.257 654.976 315.460 654.976 323.151 C 654.976 330.841 648.772 337.046 641.081 337.046 C 633.390 337.046 627.186 330.841 627.186 323.151 C 627.186 315.460 633.391 309.257 641.081 309.257 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 78.920 309.255 C 86.610 309.255 92.814 315.460 92.814 323.151 C 92.814 330.841 86.610 337.045 78.920 337.045 C 71.229 337.045 65.025 330.841 65.025 323.151 C 65.025 315.460 71.229 309.255 78.920 309.255 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 82.335 368.343 C 82.344 368.347 151.301 388.313 178.156 402.894 C 197.383 413.333 202.478 450.648 236.694 446.387 C 288.138 439.982 270.251 402.265 285.751 384.278 C 306.586 360.100 359.993 327.539 360.000 327.534 C 360.007 327.539 411.625 360.100 434.249 384.278 C 450.472 401.616 431.862 439.088 483.306 446.387 C 517.444 451.231 522.617 413.333 541.844 402.894 C 568.699 388.312 637.657 368.347 637.666 368.343 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 221.614 519.602 C 221.614 504.674 209.572 492.631 194.644 492.631 C 179.715 492.631 167.673 504.674 167.673 519.602 C 167.673 534.531 179.715 546.574 194.644 546.574 C 209.572 546.574 221.614 534.531 221.614 519.602 M 304.463 515.335 C 304.463 500.406 292.420 488.363 277.492 488.363 C 262.563 488.363 250.519 500.406 250.519 515.335 C 250.519 530.263 262.563 542.306 277.492 542.306 C 292.420 542.306 304.463 530.263 304.463 515.335 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 157.910 556.631 C 157.930 556.630 300.991 547.697 360.000 547.676 C 419.811 547.655 496.562 553.646 564.842 556.631 M 143.600 485.977 C 143.622 485.976 296.840 478.845 360.000 478.844 C 423.180 478.844 504.313 483.599 576.469 485.977 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 588.401 461.524 C 579.402 456.145 572.842 446.895 570.963 436.097 C 570.617 433.920 570.432 431.784 570.432 429.603 C 570.431 408.955 587.088 392.298 607.737 392.298 C 613.105 392.298 618.204 393.424 622.964 395.578 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 96.882 395.281 C 101.294 393.339 106.207 392.298 111.369 392.298 C 132.017 392.298 148.674 408.955 148.674 429.603 C 148.674 431.048 148.592 432.474 148.380 433.866 C 147.104 445.420 140.565 455.348 131.349 461.046 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 122.983 445.083 C 117.274 434.190 111.219 422.637 105.246 411.241 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 130.689 429.603 C 130.689 435.912 127.686 441.502 122.983 445.083 C 117.274 434.190 111.219 422.637 105.246 411.241 C 107.174 410.628 109.230 410.283 111.369 410.283 C 122.062 410.283 130.688 418.910 130.689 429.603 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 614.591 411.552 C 608.792 422.617 602.346 434.915 596.798 445.503 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 607.737 410.283 C 610.196 410.283 612.546 410.740 614.591 411.552 C 608.792 422.617 602.346 434.915 596.798 445.503 C 591.733 442.069 588.417 436.233 588.417 429.603 C 588.417 418.910 597.043 410.283 607.737 410.283 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 429.301 241.069 C 435.009 241.069 439.613 245.674 439.613 251.382 C 439.613 257.090 435.009 261.694 429.301 261.694 C 423.593 261.694 418.988 257.090 418.988 251.382 C 418.988 245.674 423.593 241.069 429.301 241.069 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 462.292 237.429 C 468.533 237.429 473.567 242.464 473.567 248.704 C 473.567 254.944 468.533 259.979 462.292 259.979 C 456.052 259.979 451.018 254.944 451.018 248.704 C 451.018 242.464 456.052 237.429 462.292 237.429 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 496.679 241.069 C 503.822 241.069 509.584 246.831 509.584 253.974 C 509.584 261.116 503.822 266.878 496.679 266.878 C 489.537 266.878 483.775 261.116 483.775 253.974 C 483.775 246.831 489.537 241.069 496.679 241.069 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 528.709 254.172 C 535.852 254.172 541.613 259.934 541.613 267.076 C 541.613 274.219 535.852 279.981 528.709 279.981 C 521.566 279.981 515.805 274.219 515.805 267.076 C 515.805 259.934 521.567 254.172 528.709 254.172 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 556.371 272.371 C 563.513 272.371 569.275 278.133 569.275 285.275 C 569.275 292.418 563.513 298.180 556.371 298.180 C 549.228 298.180 543.466 292.418 543.466 285.275 C 543.466 278.133 549.228 272.371 556.371 272.371 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 580.393 299.304 C 587.535 299.304 593.297 305.066 593.297 312.209 C 593.297 319.351 587.535 325.113 580.393 325.113 C 573.250 325.113 567.489 319.351 567.489 312.209 C 567.489 305.066 573.250 299.304 580.393 299.304 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 593.496 332.062 C 600.638 332.062 606.400 337.824 606.400 344.966 C 606.400 352.109 600.638 357.871 593.496 357.871 C 586.353 357.871 580.591 352.109 580.591 344.966 C 580.591 337.824 586.353 332.062 593.496 332.062 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 288.896 241.069 C 283.188 241.069 278.584 245.674 278.583 251.382 C 278.583 257.090 283.188 261.694 288.896 261.694 C 294.604 261.694 299.209 257.090 299.209 251.382 C 299.209 245.674 294.604 241.069 288.896 241.069 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 255.905 237.429 C 249.664 237.429 244.630 242.464 244.630 248.704 C 244.630 254.944 249.664 259.979 255.905 259.979 C 262.145 259.979 267.179 254.944 267.179 248.704 C 267.179 242.464 262.145 237.429 255.905 237.429 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 221.517 241.069 C 214.375 241.069 208.613 246.831 208.613 253.974 C 208.613 261.116 214.375 266.878 221.517 266.878 C 228.660 266.878 234.422 261.116 234.422 253.974 C 234.422 246.831 228.660 241.069 221.517 241.069 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 189.488 254.172 C 182.345 254.172 176.584 259.934 176.584 267.076 C 176.584 274.219 182.345 279.981 189.488 279.981 C 196.630 279.981 202.392 274.219 202.392 267.076 C 202.392 259.934 196.630 254.172 189.488 254.172 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 161.826 272.371 C 154.684 272.371 148.922 278.133 148.922 285.275 C 148.922 292.418 154.684 298.180 161.826 298.180 C 168.969 298.180 174.730 292.418 174.730 285.275 C 174.730 278.133 168.969 272.371 161.826 272.371 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 137.804 299.304 C 130.662 299.304 124.900 305.066 124.900 312.209 C 124.900 319.351 130.662 325.113 137.804 325.113 C 144.947 325.113 150.708 319.351 150.708 312.209 C 150.708 305.066 144.947 299.304 137.804 299.304 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 124.701 332.062 C 117.559 332.062 111.797 337.824 111.797 344.966 C 111.797 352.109 117.559 357.871 124.701 357.871 C 131.844 357.871 137.605 352.109 137.605 344.966 C 137.605 337.824 131.844 332.062 124.701 332.062 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 317.251 251.191 C 311.543 251.191 306.939 255.796 306.939 261.504 C 306.938 267.212 311.543 271.817 317.251 271.817 C 322.959 271.817 327.564 267.212 327.564 261.504 C 327.564 255.796 322.959 251.191 317.251 251.191 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 402.749 251.191 C 397.041 251.191 392.436 255.796 392.436 261.504 C 392.436 267.212 397.041 271.817 402.749 271.817 C 408.457 271.817 413.062 267.212 413.062 261.504 C 413.061 255.796 408.457 251.191 402.749 251.191 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 249.606 C 378.105 249.606 392.710 264.211 392.710 282.316 C 392.710 300.420 378.105 315.026 360.000 315.026 C 341.895 315.026 327.290 300.420 327.290 282.316 C 327.290 264.211 341.895 249.606 360.000 249.606 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 266.707 C 368.639 266.707 375.609 273.676 375.609 282.316 C 375.609 290.955 368.639 297.925 360.000 297.925 C 351.361 297.925 344.391 290.955 344.391 282.316 C 344.391 273.676 351.361 266.707 360.000 266.707 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":648.536,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":141.355,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":131.964,\\\"y\\\":475.881,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874575738875,\\\"y\\\":0.005008462330136208}},{\\\"point\\\":{\\\"x\\\":588.036,\\\"y\\\":475.881,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874575738875,\\\"y\\\":0.0050084623301362005}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":558.339,\\\"y\\\":569.705,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129035080045204,\\\"y\\\":0.7012621394848353}},{\\\"point\\\":{\\\"x\\\":161.497,\\\"y\\\":569.746,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987167746284594,\\\"y\\\":0.7153983986932055}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":559.677,\\\"y\\\":253.963,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314960764983152,\\\"y\\\":-0.7753790720462052}},{\\\"point\\\":{\\\"x\\\":161.017,\\\"y\\\":254.031,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817518635479985,\\\"y\\\":-0.7315834856999106}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":578.079,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"cube_die\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":77.026,\\\"max\\\":642.974},\\\"y\\\":{\\\"min\\\":12.187,\\\"max\\\":665.069}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cube_die\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cube\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 14.187 C 360.028 14.204 640.946 176.392 640.974 176.408 C 640.974 176.440 640.974 500.816 640.974 500.849 C 640.946 500.865 453.658 608.996 360.000 663.069 C 359.972 663.053 79.051 500.863 79.026 500.849 C 79.026 392.702 79.026 284.555 79.026 176.408 C 79.054 176.392 359.975 14.202 360.000 14.187 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 14.187 C 359.975 14.202 79.054 176.392 79.026 176.408 C 176.899 230.984 359.972 338.612 360.000 338.628 C 360.028 338.612 542.683 232.079 640.974 176.408 C 640.946 176.392 360.028 14.204 360.000 14.187 M 79.026 176.408 C 79.026 284.555 79.026 392.702 79.026 500.849 C 79.051 500.863 359.972 663.053 360.000 663.069 C 358.696 550.771 360.000 338.661 360.000 338.628 M 640.974 500.849 C 640.974 500.816 640.974 176.440 640.974 176.408 M 360.000 663.069 C 453.658 608.996 640.946 500.865 640.974 500.849 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 663.069 C 359.972 663.053 79.051 500.863 79.026 500.849 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 79.026 500.849 C 79.026 392.702 79.026 284.555 79.026 176.408 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 663.069 C 359.972 663.053 79.051 500.863 79.026 500.849 C 79.026 392.702 79.026 284.555 79.026 176.408 C 176.899 230.984 359.972 338.612 360.000 338.628 C 360.000 338.661 358.696 550.771 360.000 663.069 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 79.026 176.408 C 79.026 284.555 79.026 392.702 79.026 500.849 C 79.051 500.863 359.972 663.053 360.000 663.069 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 663.069 C 359.972 663.053 79.051 500.863 79.026 500.849 C 79.026 392.702 79.026 284.555 79.026 176.408 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dots2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 175.223 478.169 C 182.193 456.092 168.792 431.249 146.095 426.683 C 133.001 424.049 120.989 431.728 116.968 444.464 C 109.998 466.542 123.398 491.385 146.095 495.951 C 159.189 498.585 171.202 490.906 175.223 478.169 M 262.605 528.726 C 266.626 515.990 278.639 508.311 291.733 510.945 C 314.430 515.511 327.830 540.354 320.860 562.431 C 316.839 575.168 304.826 582.846 291.733 580.212 C 269.036 575.646 255.635 550.804 262.605 528.726 M 248.041 433.716 C 255.011 411.639 241.611 386.797 218.914 382.231 C 205.820 379.596 193.807 387.275 189.786 400.012 C 182.816 422.089 196.217 446.932 218.914 451.498 C 232.008 454.132 244.020 446.453 248.041 433.716 M 175.223 305.001 C 171.202 317.738 159.189 325.416 146.095 322.782 C 123.398 318.216 109.998 293.374 116.968 271.297 C 120.989 258.560 133.001 250.881 146.095 253.515 C 168.792 258.081 182.193 282.924 175.223 305.001 M 320.860 389.263 C 327.830 367.186 314.429 342.343 291.733 337.777 C 278.639 335.143 266.626 342.822 262.605 355.559 C 255.635 377.636 269.036 402.479 291.733 407.044 C 304.826 409.678 316.839 402.000 320.860 389.263 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 548.217 478.169 C 541.247 456.092 554.647 431.249 577.344 426.683 C 590.438 424.049 602.450 431.728 606.471 444.464 C 613.441 466.542 600.041 491.385 577.344 495.951 C 564.250 498.585 552.238 490.906 548.217 478.169 M 460.834 528.726 C 456.813 515.990 444.801 508.311 431.707 510.945 C 409.010 515.511 395.609 540.354 402.579 562.431 C 406.600 575.168 418.613 582.846 431.707 580.212 C 454.404 575.646 467.804 550.804 460.834 528.726 M 548.217 305.001 C 552.238 317.738 564.250 325.416 577.344 322.782 C 600.041 318.216 613.441 293.374 606.471 271.297 C 602.451 258.560 590.438 250.881 577.344 253.515 C 554.647 258.081 541.247 282.924 548.217 305.001 M 402.579 389.263 C 395.609 367.186 409.010 342.343 431.707 337.777 C 444.801 335.143 456.813 342.822 460.834 355.558 C 467.805 377.636 454.404 402.478 431.707 407.044 C 418.613 409.678 406.600 402.000 402.579 389.263 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 330.006 187.367 C 321.178 177.345 321.822 163.102 330.842 153.251 C 346.477 136.177 374.691 135.361 389.994 152.734 C 398.822 162.756 398.178 176.999 389.159 186.850 C 373.524 203.925 345.309 204.741 330.006 187.367 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":359.561,\\\"y\\\":709.372,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":359.488,\\\"y\\\":16.584,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":81,\\\"y\\\":348.512,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999867959855171,\\\"y\\\":0.005138857326293132}},{\\\"point\\\":{\\\"x\\\":639,\\\"y\\\":348.512,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999867959855171,\\\"y\\\":0.005138857326293132}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":522.91,\\\"y\\\":566.781,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5070996150903193,\\\"y\\\":0.8618874522669708}},{\\\"point\\\":{\\\"x\\\":196.908,\\\"y\\\":566.841,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.48970204908451026,\\\"y\\\":0.8718898457502713}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.488,\\\"y\\\":657.017,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":215.634,\\\"y\\\":98.503,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.4897425046771502,\\\"y\\\":-0.8718671223945491}},{\\\"point\\\":{\\\"x\\\":504.206,\\\"y\\\":98.556,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5070484866958855,\\\"y\\\":-0.8619175320988735}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"cube_die_2\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":77.026,\\\"max\\\":642.974},\\\"y\\\":{\\\"min\\\":12.187,\\\"max\\\":665.069}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cube_die_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cube\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 14.187 C 360.028 14.204 640.946 176.392 640.974 176.408 C 640.974 176.440 640.974 500.816 640.974 500.849 C 640.946 500.865 453.658 608.996 360.000 663.069 C 359.972 663.053 79.051 500.863 79.026 500.849 C 79.026 392.702 79.026 284.555 79.026 176.408 C 79.054 176.392 359.975 14.202 360.000 14.187 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 14.187 C 359.975 14.202 79.054 176.392 79.026 176.408 C 176.899 230.984 359.972 338.612 360.000 338.628 C 360.028 338.612 542.683 232.079 640.974 176.408 C 640.946 176.392 360.028 14.204 360.000 14.187 M 79.026 176.408 C 79.026 284.555 79.026 392.702 79.026 500.849 C 79.051 500.863 359.972 663.053 360.000 663.069 C 358.696 550.771 360.000 338.661 360.000 338.628 M 640.974 500.849 C 640.974 500.816 640.974 176.440 640.974 176.408 M 360.000 663.069 C 453.658 608.996 640.946 500.865 640.974 500.849 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 663.069 C 359.972 663.053 79.051 500.863 79.026 500.849 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 79.026 500.849 C 79.026 392.702 79.026 284.555 79.026 176.408 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 663.069 C 359.972 663.053 79.051 500.863 79.026 500.849 C 79.026 392.702 79.026 284.555 79.026 176.408 C 176.899 230.984 359.972 338.612 360.000 338.628 C 360.000 338.661 358.696 550.771 360.000 663.069 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 79.026 176.408 C 79.026 284.555 79.026 392.702 79.026 500.849 C 79.051 500.863 359.972 663.053 360.000 663.069 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 663.069 C 359.972 663.053 79.051 500.863 79.026 500.849 C 79.026 392.702 79.026 284.555 79.026 176.408 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dots2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 262.605 528.726 C 266.626 515.990 278.639 508.311 291.733 510.945 C 314.430 515.511 327.830 540.354 320.860 562.431 C 316.839 575.168 304.826 582.846 291.733 580.212 C 269.036 575.646 255.635 550.804 262.605 528.726 M 248.041 433.716 C 255.011 411.639 241.611 386.797 218.914 382.231 C 205.820 379.596 193.807 387.275 189.786 400.012 C 182.816 422.089 196.217 446.932 218.914 451.498 C 232.008 454.132 244.020 446.453 248.041 433.716 M 175.223 305.001 C 171.202 317.738 159.189 325.416 146.095 322.782 C 123.398 318.216 109.998 293.374 116.968 271.297 C 120.989 258.560 133.001 250.881 146.095 253.515 C 168.792 258.081 182.193 282.924 175.223 305.001 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 559.346 474.122 C 552.376 452.045 565.777 427.202 588.474 422.637 C 601.567 420.003 613.580 427.681 617.601 440.417 C 624.571 462.495 611.171 487.338 588.474 491.904 C 575.380 494.538 563.367 486.859 559.346 474.122 M 448.694 536.820 C 444.673 524.084 432.660 516.405 419.566 519.039 C 396.869 523.605 383.468 548.448 390.438 570.525 C 394.459 583.262 406.472 590.940 419.566 588.306 C 442.263 583.740 455.663 558.898 448.694 536.820 M 559.346 296.908 C 563.367 309.644 575.380 317.323 588.474 314.688 C 611.170 310.122 624.571 285.280 617.601 263.203 C 613.580 250.466 601.567 242.787 588.474 245.421 C 565.777 249.987 552.376 274.830 559.346 296.908 M 390.438 393.310 C 383.469 371.232 396.869 346.390 419.566 341.824 C 432.660 339.190 444.673 346.869 448.694 359.605 C 455.664 381.683 442.263 406.525 419.566 411.091 C 406.472 413.725 394.459 406.047 390.438 393.310 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 330.006 265.283 C 321.178 255.260 321.822 241.017 330.842 231.167 C 346.477 214.092 374.691 213.276 389.994 230.649 C 398.822 240.672 398.178 254.914 389.159 264.765 C 373.524 281.840 345.309 282.656 330.006 265.283 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 330.006 111.498 C 321.178 101.475 321.822 87.233 330.842 77.382 C 346.477 60.307 374.691 59.491 389.994 76.864 C 398.822 86.887 398.178 101.130 389.159 110.980 C 373.524 128.055 345.309 128.871 330.006 111.498 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 535.704 487.244 C 531.683 474.508 519.671 466.829 506.577 469.463 C 483.880 474.029 470.479 498.872 477.449 520.949 C 481.470 533.686 493.483 541.364 506.577 538.730 C 529.274 534.164 542.674 509.322 535.704 487.244 M 477.449 343.734 C 470.479 321.657 483.880 296.814 506.577 292.248 C 519.670 289.614 531.683 297.293 535.704 310.029 C 542.674 332.107 529.274 356.949 506.577 361.515 C 493.483 364.150 481.470 356.471 477.449 343.734 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":359.561,\\\"y\\\":709.372,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":359.488,\\\"y\\\":16.584,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":81,\\\"y\\\":348.512,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999867959855171,\\\"y\\\":0.005138857326293132}},{\\\"point\\\":{\\\"x\\\":639,\\\"y\\\":348.512,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999867959855171,\\\"y\\\":0.005138857326293132}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":522.91,\\\"y\\\":566.781,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5070996150903193,\\\"y\\\":0.8618874522669708}},{\\\"point\\\":{\\\"x\\\":196.908,\\\"y\\\":566.841,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.48970204908451026,\\\"y\\\":0.8718898457502713}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.488,\\\"y\\\":657.017,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":215.634,\\\"y\\\":98.503,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.4897425046771502,\\\"y\\\":-0.8718671223945491}},{\\\"point\\\":{\\\"x\\\":504.206,\\\"y\\\":98.556,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5070484866958855,\\\"y\\\":-0.8619175320988735}}]}},{\\\"name\\\":\\\"cube_paradox\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":62.385000000000005,\\\"max\\\":660.534},\\\"y\\\":{\\\"min\\\":23.245,\\\"max\\\":639.759}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cube_paradox_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cube2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 153.466 465.206 C 153.476 465.214 250.295 539.333 250.304 539.340 C 250.304 539.331 249.688 442.851 249.688 442.842 C 249.679 442.844 153.476 465.204 153.466 465.206 M 64.885 458.305 C 64.885 458.270 64.885 222.841 64.885 105.110 C 179.402 78.655 293.919 52.200 408.436 25.745 C 491.635 70.262 574.835 114.780 658.034 159.298 C 656.737 285.736 655.439 412.175 654.142 538.614 C 529.001 571.495 403.859 604.377 278.718 637.259 C 207.440 577.608 64.906 458.323 64.885 458.305 M 591.798 464.232 C 591.798 464.205 595.417 200.065 595.417 200.039 C 595.400 200.043 430.203 237.270 430.187 237.273 C 430.187 237.286 430.914 363.476 430.914 363.489 C 430.930 363.499 591.782 464.222 591.798 464.232 M 308.738 566.053 C 308.762 566.047 469.488 524.513 549.863 503.743 C 499.927 471.398 449.991 439.053 400.055 406.709 C 369.204 414.028 338.353 421.346 307.502 428.665 C 307.914 474.461 308.738 566.039 308.738 566.053 M 169.895 138.409 C 169.907 138.416 289.790 213.999 289.802 214.007 C 289.811 214.005 376.078 196.428 376.087 196.426 C 376.087 196.415 376.087 85.550 376.087 85.539 C 376.066 85.544 169.915 138.403 169.895 138.409 M 550.946 160.629 C 550.934 160.623 430.717 97.036 430.705 97.030 C 430.705 97.038 430.381 185.031 430.381 185.040 C 430.393 185.037 550.934 160.631 550.946 160.629 M 306.101 265.777 C 306.101 265.788 306.734 336.909 307.051 372.474 C 329.669 366.867 374.898 355.654 374.904 355.652 C 374.904 355.641 375.560 285.181 375.889 249.945 C 352.626 255.223 306.108 265.776 306.101 265.777 M 120.723 176.504 C 120.723 176.528 122.938 333.844 124.045 412.513 C 165.769 403.846 207.493 395.178 249.216 386.511 C 249.013 343.710 248.606 258.121 248.606 258.108 C 248.593 258.100 120.736 176.513 120.723 176.504 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 408.436 25.745 C 293.919 52.200 64.919 105.102 64.885 105.110 C 64.906 105.123 207.440 195.423 278.718 240.579 C 278.728 240.577 343.630 226.699 376.087 219.758 M 658.034 159.298 C 574.835 114.780 491.635 70.262 408.436 25.745 M 278.718 240.579 C 278.718 240.619 278.718 637.220 278.718 637.259 C 278.696 637.241 136.163 517.956 64.885 458.305 M 654.142 538.614 C 655.439 412.175 658.034 159.336 658.034 159.298 C 658.012 159.302 506.209 191.548 430.297 207.673 M 278.718 637.259 C 403.859 604.377 529.001 571.495 654.142 538.614 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 400.055 406.709 C 369.204 414.028 338.353 421.346 307.502 428.665 C 307.502 428.662 307.221 400.045 307.221 400.042 C 338.403 391.725 400.756 375.094 400.766 375.091 C 400.785 375.103 591.289 494.899 591.308 494.911 C 591.311 494.913 612.727 508.972 623.436 516.003 C 623.432 516.004 581.602 526.174 581.598 526.176 C 581.571 526.183 309.004 597.544 308.977 597.551 C 308.977 597.548 308.738 566.056 308.738 566.053 C 308.738 566.039 307.502 428.679 307.502 428.665 M 93.232 450.028 C 103.371 447.887 123.647 443.606 123.650 443.606 C 123.662 443.603 207.496 423.868 249.420 413.999 C 249.420 413.996 249.216 386.514 249.216 386.511 C 207.493 395.178 165.769 403.846 124.045 412.513 C 124.045 412.489 121.830 255.174 120.723 176.504 C 120.720 176.503 92.310 158.404 92.307 158.402 C 92.307 158.431 93.232 449.999 93.232 450.028 C 93.248 450.041 250.508 577.348 250.524 577.360 C 250.524 577.357 250.304 539.344 250.304 539.340 C 218.025 514.629 153.476 465.214 153.466 465.206 C 153.463 465.204 123.653 443.608 123.650 443.606 C 123.650 443.603 124.045 412.516 124.045 412.513 M 249.688 442.842 C 217.614 450.296 185.540 457.751 153.466 465.206 M 400.766 375.091 C 400.763 375.089 383.525 362.132 374.904 355.652 C 374.898 355.654 329.669 366.867 307.051 372.474 C 307.051 372.464 306.101 265.788 306.101 265.777 C 306.108 265.776 352.626 255.223 375.889 249.945 C 375.888 249.956 374.904 355.641 374.904 355.652 M 591.798 464.232 C 591.634 474.458 591.308 494.908 591.308 494.911 C 591.304 494.912 549.867 503.742 549.863 503.743 C 549.839 503.749 389.113 545.283 308.738 566.053 M 400.766 375.091 C 400.769 375.090 420.865 367.356 430.914 363.489 C 430.914 363.476 430.187 237.286 430.187 237.273 C 485.263 224.862 595.400 200.043 595.417 200.039 C 595.420 200.038 627.267 192.916 627.270 192.915 C 627.270 192.948 623.436 515.970 623.436 516.003 M 401.013 50.067 C 400.931 158.408 400.766 375.059 400.766 375.091 C 400.766 375.094 400.055 406.706 400.055 406.709 C 400.070 406.719 499.927 471.398 549.863 503.743 M 430.381 185.040 C 470.569 176.903 550.934 160.631 550.946 160.629 C 550.950 160.628 595.628 151.691 595.633 151.690 C 595.613 151.680 401.033 50.077 401.013 50.067 C 400.987 50.073 133.558 115.252 133.532 115.259 C 133.535 115.261 169.891 138.406 169.895 138.409 C 169.907 138.416 289.790 213.999 289.802 214.007 C 289.811 214.005 347.325 202.286 376.087 196.426 C 376.087 196.428 376.087 219.756 376.087 219.758 C 343.630 226.699 278.728 240.577 278.718 240.579 C 278.718 240.619 278.718 637.220 278.718 637.259 C 403.859 604.377 529.001 571.495 654.142 538.614 C 655.439 412.175 658.034 159.336 658.034 159.298 C 574.835 114.780 491.635 70.262 408.436 25.745 C 293.919 52.200 64.919 105.102 64.885 105.110 C 64.885 222.841 64.885 340.573 64.885 458.305 C 136.163 517.956 278.696 637.241 278.718 637.259 M 550.946 160.629 C 510.865 139.429 430.717 97.036 430.705 97.030 C 430.705 97.038 430.381 185.031 430.381 185.040 C 430.381 185.042 430.297 207.671 430.297 207.673 C 430.297 207.676 430.187 237.270 430.187 237.273 M 375.889 249.945 C 375.889 249.942 376.087 219.761 376.087 219.758 M 376.087 196.426 C 376.087 196.415 376.087 85.550 376.087 85.539 C 376.066 85.544 238.625 120.786 169.895 138.409 M 307.051 372.474 C 307.051 372.477 307.221 400.039 307.221 400.042 M 248.606 258.108 C 248.593 258.100 120.736 176.513 120.723 176.504 M 249.216 386.511 C 249.216 386.498 248.606 258.121 248.606 258.108 M 249.688 442.842 C 249.688 442.839 249.420 414.002 249.420 413.999 M 250.304 539.340 C 250.304 539.331 249.688 442.851 249.688 442.842 M 430.914 363.489 C 430.930 363.499 591.782 464.222 591.798 464.232 C 591.798 464.205 594.211 288.103 595.417 200.039 M 658.034 159.298 C 658.012 159.302 506.209 191.548 430.297 207.673 M 64.885 105.110 C 64.906 105.123 207.440 195.423 278.718 240.579 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 278.718 240.579 C 278.696 240.566 64.906 105.123 64.885 105.110 C 64.885 105.145 64.885 458.270 64.885 458.305 C 64.906 458.323 278.696 637.241 278.718 637.259 C 278.718 637.220 278.718 240.619 278.718 240.579 M 250.524 577.360 C 250.524 577.328 248.637 258.742 248.636 258.710 C 248.621 258.700 92.323 158.412 92.307 158.402 C 92.307 158.431 93.232 449.999 93.232 450.028 C 93.248 450.041 250.508 577.348 250.524 577.360 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 623.436 516.003 C 623.433 516.001 591.311 494.913 591.308 494.911 C 591.289 494.899 400.785 375.103 400.766 375.091 C 400.766 375.094 400.055 406.706 400.055 406.709 C 400.070 406.719 549.848 503.733 549.863 503.743 C 549.867 503.742 591.304 494.912 591.308 494.911 C 591.308 494.882 595.556 199.952 595.556 199.922 C 595.559 199.922 627.267 192.916 627.270 192.915 C 627.270 192.948 623.436 515.970 623.436 516.003 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 401.013 50.067 C 401.013 50.099 400.766 375.059 400.766 375.091 C 400.769 375.090 430.457 363.224 430.460 363.223 C 430.460 363.196 430.705 97.056 430.705 97.030 C 430.717 97.036 550.934 160.623 550.946 160.629 C 550.950 160.628 595.628 151.691 595.633 151.690 C 595.613 151.680 401.033 50.077 401.013 50.067 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.991,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":407.29,\\\"y\\\":25.164,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":657.474,\\\"y\\\":336.046,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873798915149,\\\"y\\\":0.005023948417628874}},{\\\"point\\\":{\\\"x\\\":59.398,\\\"y\\\":336.813,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873798915149,\\\"y\\\":0.00502394841762886}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":158.349,\\\"y\\\":543.83,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6285439478965765,\\\"y\\\":0.7777740710274326}},{\\\"point\\\":{\\\"x\\\":497.009,\\\"y\\\":584.944,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.24528795152159552,\\\"y\\\":0.9694502673362565}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":64.706,\\\"y\\\":103.651,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817084818456944,\\\"y\\\":-0.7316239100655736}},{\\\"point\\\":{\\\"x\\\":657.325,\\\"y\\\":159.298,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314454286031296,\\\"y\\\":-0.7754203187279851}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":650.927,\\\"y\\\":536.294,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7071067811865476,\\\"y\\\":0.7071067811865476}}]},\\\"meta\\\":{\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"cup\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":80.83096088641506,\\\"max\\\":639.1690391135849},\\\"y\\\":{\\\"min\\\":19.591,\\\"max\\\":648.38}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cup\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"cup_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#3192170F-A0C1-4DEA-9A1E-71F270174773_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 86.902 41.997 C 86.929 41.996 177.347 21.591 360.000 21.591 C 542.653 21.591 633.071 41.996 633.098 41.997 C 633.092 42.020 683.074 263.791 432.936 386.056 C 393.692 405.238 392.241 522.275 432.936 546.256 C 488.166 578.802 560.918 565.822 560.249 605.724 C 559.903 626.352 453.855 646.380 360.000 646.380 C 266.145 646.380 160.102 626.662 159.751 605.724 C 159.082 565.822 231.834 578.802 287.064 546.256 C 327.759 522.275 326.308 405.238 287.064 386.056 C 36.926 263.791 86.908 42.020 86.902 41.997 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 56.669 C 483.809 56.669 545.520 50.918 545.520 48.204 C 545.520 45.491 483.809 39.739 360.000 39.739 C 236.191 39.739 174.480 45.491 174.480 48.204 C 174.480 50.918 236.191 56.669 360.000 56.669 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 86.902 41.997 C 86.929 41.998 226.001 56.476 360.000 56.476 C 493.999 56.476 542.066 46.823 633.098 41.997 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 546.149 586.998 C 545.397 606.087 446.906 620.877 360.000 620.877 C 273.094 620.877 174.614 606.374 173.851 586.998 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":209.126,\\\"max\\\":510.874},\\\"y\\\":{\\\"min\\\":78.766,\\\"max\\\":323.481}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":705.072,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":24.034,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":101.449,\\\"y\\\":193.464,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999870146736293,\\\"y\\\":0.00509612442183099}},{\\\"point\\\":{\\\"x\\\":618.551,\\\"y\\\":193.464,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999870146736293,\\\"y\\\":0.005096124421830995}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":540.978,\\\"y\\\":616.364,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129099334034343,\\\"y\\\":0.7012556073606191}},{\\\"point\\\":{\\\"x\\\":179.026,\\\"y\\\":616.419,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987196000423073,\\\"y\\\":0.7153956391513147}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":643.989,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"3192170F-A0C1-4DEA-9A1E-71F270174773_0\\\",\\\"cx\\\":\\\"51.03%\\\",\\\"cy\\\":\\\"8.36%\\\",\\\"r\\\":\\\"89.59%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"30.59%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"dagger\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":224.25914481786768,\\\"max\\\":495.74085518213235},\\\"y\\\":{\\\"min\\\":65.749,\\\"max\\\":707.639}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dagger\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dagger\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"url(#29FDC0B1-D6C7-4963-B710-8F1BE02B488A_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 339.209 228.155 C 345.528 233.501 374.472 233.501 380.791 228.155 C 396.146 215.164 396.146 140.100 380.791 127.109 C 374.472 121.763 345.528 121.763 339.209 127.109 C 323.854 140.100 323.854 215.164 339.209 228.155 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#29FDC0B1-D6C7-4963-B710-8F1BE02B488A_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 431.814 485.805 C 431.806 485.827 383.938 632.361 360.000 705.639 C 360.000 705.598 360.000 429.022 360.000 290.714 C 360.005 290.714 409.788 290.702 409.793 290.702 C 409.795 290.722 431.811 485.786 431.814 485.805 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 290.714 C 360.000 429.022 360.000 705.598 360.000 705.639 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 310.207 290.702 C 310.212 290.702 359.995 290.714 360.000 290.714 C 360.000 429.022 360.000 705.598 360.000 705.639 C 359.993 705.617 288.194 485.827 288.186 485.805 C 288.189 485.786 310.205 290.722 310.207 290.702 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#29FDC0B1-D6C7-4963-B710-8F1BE02B488A_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 303.957 293.539 C 303.968 293.539 416.032 293.539 416.043 293.539 C 416.043 293.538 416.043 278.987 416.043 278.985 C 416.032 278.985 303.968 278.985 303.957 278.985 C 303.957 278.987 303.957 293.538 303.957 293.539 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"url(#29FDC0B1-D6C7-4963-B710-8F1BE02B488A_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 415.299 281.173 C 415.299 281.171 420.173 264.696 422.611 256.458 C 417.225 286.722 464.336 308.652 487.424 271.140 C 502.935 245.938 487.832 219.593 464.330 209.842 C 449.797 203.812 433.397 206.002 419.893 213.810 C 379.951 236.193 300.119 281.095 300.107 281.101 C 300.118 281.101 415.287 281.173 415.299 281.173 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 415.299 281.173 C 415.299 281.171 420.173 264.696 422.611 256.458 C 417.225 286.722 464.336 308.652 487.424 271.140 C 502.935 245.938 487.832 219.593 464.330 209.842 C 449.797 203.812 433.397 206.002 419.893 213.810 C 379.951 236.193 300.119 281.095 300.107 281.101 C 300.118 281.101 415.287 281.173 415.299 281.173 M 455.742 235.158 C 440.198 229.253 425.333 241.159 422.611 256.458 M 457.892 265.079 C 471.046 260.859 468.694 240.078 455.742 235.158 M 450.129 253.342 C 444.336 255.693 445.642 269.010 457.892 265.079 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"url(#29FDC0B1-D6C7-4963-B710-8F1BE02B488A_5)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.992 215.833 C 323.000 215.833 397.000 215.833 397.008 215.833 C 397.008 215.832 397.008 201.280 397.008 201.279 C 397.000 201.279 323.000 201.279 322.992 201.279 C 322.992 201.280 322.992 215.832 322.992 215.833 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"url(#29FDC0B1-D6C7-4963-B710-8F1BE02B488A_6)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 143.128 C 380.861 143.128 397.690 126.300 397.690 105.438 C 397.690 84.577 380.861 67.749 360.000 67.749 C 339.139 67.749 322.310 84.577 322.310 105.438 C 322.310 126.300 339.139 143.128 360.000 143.128 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 419.893 213.810 C 379.951 236.193 300.119 281.095 300.107 281.101 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"url(#29FDC0B1-D6C7-4963-B710-8F1BE02B488A_7)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 232.576 223.772 C 255.664 186.259 302.775 208.190 297.389 238.454 C 299.827 230.215 304.701 213.740 304.701 213.738 C 304.713 213.738 381.496 213.786 419.893 213.810 C 379.951 236.193 300.119 281.095 300.107 281.101 C 286.196 288.158 270.203 291.099 255.670 285.069 C 232.168 275.318 217.065 248.974 232.576 223.772 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 297.389 238.454 C 294.667 253.752 279.802 265.658 264.258 259.753 C 251.306 254.833 248.954 234.052 262.108 229.832 C 274.358 225.901 275.664 239.218 269.871 241.569 M 232.576 223.772 C 255.664 186.259 302.775 208.190 297.389 238.454 C 299.827 230.215 304.701 213.740 304.701 213.738 C 304.713 213.738 381.496 213.786 419.893 213.810 C 379.951 236.193 300.119 281.095 300.107 281.101 C 286.196 288.158 270.203 291.099 255.670 285.069 C 232.168 275.318 217.065 248.974 232.576 223.772 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":15.672,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":700.607,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":226.043,\\\"y\\\":248.05,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999870589770065,\\\"y\\\":-0.005087423563746617}},{\\\"point\\\":{\\\"x\\\":493.957,\\\"y\\\":248.05,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999870589770065,\\\"y\\\":-0.005087423563746617}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":286.687,\\\"y\\\":489.544,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817526902115878,\\\"y\\\":0.7315827153434277}},{\\\"point\\\":{\\\"x\\\":434.036,\\\"y\\\":489.628,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314359083177964,\\\"y\\\":0.7754280712528272}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":67.559,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"29FDC0B1-D6C7-4963-B710-8F1BE02B488A_0\\\",\\\"x1\\\":\\\"52.71%\\\",\\\"y1\\\":\\\"7.68%\\\",\\\"x2\\\":\\\"52.71%\\\",\\\"y2\\\":\\\"146.91%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"27.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"29FDC0B1-D6C7-4963-B710-8F1BE02B488A_1\\\",\\\"x1\\\":\\\"-102.97%\\\",\\\"y1\\\":\\\"-1.67%\\\",\\\"x2\\\":\\\"87.01%\\\",\\\"y2\\\":\\\"47.24%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"97.25%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"29FDC0B1-D6C7-4963-B710-8F1BE02B488A_3\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"435.06%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"27.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"29FDC0B1-D6C7-4963-B710-8F1BE02B488A_4\\\",\\\"x1\\\":\\\"14.52%\\\",\\\"y1\\\":\\\"-27.02%\\\",\\\"x2\\\":\\\"35.23%\\\",\\\"y2\\\":\\\"63.92%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"29FDC0B1-D6C7-4963-B710-8F1BE02B488A_5\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"304.27%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"27.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"29FDC0B1-D6C7-4963-B710-8F1BE02B488A_6\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"107.78%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"27.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"29FDC0B1-D6C7-4963-B710-8F1BE02B488A_7\\\",\\\"x1\\\":\\\"46.57%\\\",\\\"y1\\\":\\\"68.86%\\\",\\\"x2\\\":\\\"46.57%\\\",\\\"y2\\\":\\\"-47.10%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"27.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}]},{\\\"name\\\":\\\"death\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":155.815,\\\"max\\\":602.3940243742625},\\\"y\\\":{\\\"min\\\":24.351,\\\"max\\\":641.236}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"death\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"death\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 26.351 C 470.149 26.351 470.149 118.141 470.149 356.798 C 470.149 426.026 429.866 450.933 402.458 505.282 C 389.857 530.269 430.624 545.893 380.962 581.414 C 362.922 594.316 386.745 603.443 360.000 639.236 C 362.174 607.445 328.433 599.938 339.038 579.813 C 363.712 532.992 308.345 536.100 317.542 507.109 C 336.082 448.670 249.851 447.008 249.851 356.798 C 249.851 118.141 249.851 26.351 360.000 26.351 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 299.689 112.931 C 299.689 98.092 311.659 86.121 326.498 86.121 C 341.338 86.120 353.309 98.091 353.308 112.931 C 353.308 127.770 341.337 139.740 326.498 139.740 C 311.659 139.740 299.689 127.770 299.689 112.931 M 345.833 154.360 C 345.834 154.357 359.999 128.675 360.000 128.672 C 360.001 128.675 374.166 154.357 374.167 154.360 C 374.164 154.360 345.836 154.360 345.833 154.360 M 366.267 112.458 C 366.267 97.729 378.149 85.848 392.878 85.848 C 407.606 85.848 419.488 97.729 419.488 112.458 C 419.488 127.187 407.606 139.068 392.878 139.068 C 378.149 139.068 366.267 127.187 366.267 112.458 M 321.468 205.733 C 321.468 205.730 321.845 178.573 321.943 171.485 C 303.066 158.985 287.822 137.926 287.240 112.861 C 286.337 73.987 321.116 45.208 360.000 45.208 C 398.884 45.208 433.663 73.987 432.760 112.861 C 432.178 137.926 416.934 158.985 398.057 171.485 C 398.155 178.573 398.532 205.730 398.532 205.733 C 398.531 205.733 386.281 205.733 386.279 205.733 C 386.279 205.732 386.279 188.191 386.279 188.189 C 386.279 188.189 382.237 188.189 382.236 188.189 C 382.236 188.191 382.236 205.732 382.236 205.733 C 382.235 205.733 370.109 205.733 370.108 205.733 C 370.108 205.732 370.108 188.191 370.108 188.189 C 370.107 188.189 366.065 188.189 366.065 188.189 C 366.065 188.191 366.065 205.732 366.065 205.733 C 366.064 205.733 353.937 205.733 353.935 205.733 C 353.935 205.732 353.935 188.191 353.935 188.189 C 353.935 188.189 349.893 188.189 349.892 188.189 C 349.892 188.191 349.892 205.732 349.892 205.733 C 349.891 205.733 337.764 205.733 337.763 205.733 C 337.763 205.732 337.764 188.191 337.764 188.189 C 337.763 188.189 333.721 188.189 333.721 188.189 C 333.721 188.191 333.721 205.732 333.721 205.733 C 333.719 205.733 321.469 205.733 321.468 205.733 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"scythe\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 546.944 154.585 C 546.947 154.605 645.167 223.620 575.309 351.636 C 597.646 231.278 517.752 178.628 517.746 178.611 C 517.749 178.608 546.941 154.587 546.944 154.585 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 544.567 147.638 C 545.022 147.502 552.107 156.089 551.666 156.264 C 486.478 182.123 421.687 383.578 170.028 452.181 C 163.216 447.489 159.763 440.711 157.815 433.140 C 440.715 343.159 474.870 168.362 544.567 147.638 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 336.873 383.914 C 336.871 383.910 316.114 350.927 316.112 350.923 C 316.113 350.923 327.108 344.004 327.109 344.003 C 327.111 344.006 347.868 376.990 347.870 376.993 C 347.869 376.994 336.874 383.913 336.873 383.914 M 328.261 394.624 C 328.259 394.620 305.118 357.847 305.116 357.843 C 305.117 357.843 316.111 350.924 316.112 350.923 C 316.115 350.927 339.256 387.699 339.258 387.703 C 339.257 387.704 328.262 394.623 328.261 394.624 M 314.879 397.754 C 314.877 397.750 294.121 364.767 294.119 364.763 C 294.120 364.763 305.115 357.844 305.116 357.843 C 305.118 357.847 325.874 390.831 325.876 390.834 C 325.875 390.835 314.880 397.753 314.879 397.754 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 390.032 294.190 C 390.035 294.192 416.156 323.114 416.158 323.117 C 416.157 323.118 406.517 331.825 406.516 331.826 C 406.513 331.823 380.392 302.901 380.390 302.898 C 380.391 302.897 390.031 294.190 390.032 294.190 M 396.673 282.158 C 396.676 282.161 425.797 314.405 425.800 314.409 C 425.799 314.410 416.159 323.116 416.158 323.117 C 416.155 323.114 387.034 290.870 387.031 290.867 C 387.032 290.866 396.672 282.159 396.673 282.158 M 409.318 276.773 C 409.320 276.776 435.440 305.697 435.443 305.700 C 435.442 305.701 425.801 314.408 425.800 314.409 C 425.798 314.406 399.677 285.484 399.675 285.481 C 399.676 285.480 409.317 276.774 409.318 276.773 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":689.403,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":26.762,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":245.267,\\\"y\\\":234.451,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874557628811,\\\"y\\\":0.0050088239018670645}},{\\\"point\\\":{\\\"x\\\":474.733,\\\"y\\\":234.451,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874557628811,\\\"y\\\":0.0050088239018670645}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":519.398,\\\"y\\\":558.906,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129033067134974,\\\"y\\\":0.7012623441173502}},{\\\"point\\\":{\\\"x\\\":200.233,\\\"y\\\":558.998,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987015731139016,\\\"y\\\":0.7154132454240412}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":642.632,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"devil\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":103.497,\\\"max\\\":615.059},\\\"y\\\":{\\\"min\\\":120.39693877606955,\\\"max\\\":620.8190728660453}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"devil_4\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"devil_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 511.425 260.574 C 530.338 293.333 519.169 335.016 486.411 353.930 C 453.652 372.843 415.835 368.372 393.055 328.915 C 393.055 328.915 511.413 260.581 511.425 260.574 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 453.615 282.665 C 463.321 282.665 475.172 291.501 475.172 320.575 C 475.172 349.649 453.617 358.481 453.615 358.485 C 453.613 358.481 432.059 349.649 432.059 320.575 C 432.059 291.502 443.910 282.665 453.615 282.665 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 486.411 353.930 C 453.652 372.843 415.835 368.372 393.055 328.915 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 393.055 328.915 C 393.055 328.915 511.413 260.581 511.425 260.574 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 511.425 260.574 C 530.338 293.333 519.169 335.016 486.411 353.930 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 486.411 353.930 C 453.652 372.843 415.835 368.372 393.055 328.915 C 393.055 328.915 511.413 260.581 511.425 260.574 C 530.338 293.333 519.169 335.016 486.411 353.930 M 457.964 525.703 C 457.954 525.702 419.190 506.317 361.029 506.317 C 361.029 506.328 361.033 618.804 361.029 618.814 C 514.950 619.682 613.059 509.051 613.059 370.608 C 613.059 232.166 514.950 121.535 361.029 122.402 C 361.029 122.402 361.029 197.401 361.029 234.900 C 361.029 238.236 361.029 479.546 361.029 479.570 C 361.029 479.571 361.029 486.748 361.029 486.749 C 438.577 486.930 457.954 525.700 457.964 525.703 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 511.425 260.574 C 530.338 293.333 519.169 335.016 486.411 353.930 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 486.411 353.930 C 453.652 372.843 415.835 368.372 393.055 328.915 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 393.055 328.915 C 393.055 328.915 511.413 260.581 511.425 260.574 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.029 234.900 C 361.029 238.236 361.029 479.546 361.029 479.570 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 511.425 260.574 C 530.338 293.333 519.169 335.016 486.411 353.930 C 453.652 372.843 415.835 368.372 393.055 328.915 C 393.055 328.915 511.413 260.581 511.425 260.574 M 562.378 324.929 C 553.743 253.514 516.415 197.656 476.641 189.730 C 432.715 180.976 388.622 202.532 361.029 234.900 C 361.029 238.236 361.029 479.546 361.029 479.570 C 361.033 479.567 403.698 446.237 403.750 445.787 C 480.963 425.318 514.460 466.483 525.444 471.592 C 557.414 440.284 563.056 393.425 563.060 393.417 C 563.063 393.409 609.677 397.290 597.995 312.617 C 589.863 314.625 571.990 320.092 562.378 324.929 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 380.416 312.448 C 380.416 312.459 380.416 428.758 380.416 428.769 C 380.421 428.767 410.905 409.463 424.452 404.872 C 446.254 397.484 476.544 416.316 464.936 441.430 M 526.250 228.441 C 477.639 256.443 380.431 312.439 380.416 312.448 M 403.750 445.787 C 415.180 438.305 425.894 426.662 437.951 428.865 M 511.425 260.574 C 530.338 293.333 519.169 335.016 486.411 353.930 C 453.652 372.843 415.835 368.372 393.055 328.915 C 393.055 328.915 511.413 260.581 511.425 260.574 M 562.378 324.929 C 553.743 253.514 516.415 197.656 476.641 189.730 C 432.715 180.976 388.622 202.532 361.029 234.900 C 361.029 238.236 361.029 479.546 361.029 479.570 C 361.033 479.567 403.698 446.237 403.750 445.787 C 480.963 425.318 514.460 466.483 525.444 471.592 C 557.414 440.284 563.056 393.425 563.060 393.417 C 563.063 393.409 609.677 397.290 597.995 312.617 C 589.863 314.625 571.990 320.092 562.378 324.929 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 460.074 136.952 C 435.582 158.719 439.417 164.923 442.409 189.948 C 433.277 203.572 411.506 212.615 400.451 202.846 C 398.190 161.385 416.857 132.220 460.074 136.952 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"devil_half_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 207.131 260.574 C 188.218 293.333 199.387 335.016 232.145 353.930 C 264.904 372.843 302.721 368.372 325.501 328.915 C 325.501 328.915 207.143 260.581 207.131 260.574 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.145 353.930 C 264.904 372.843 302.721 368.372 325.501 328.915 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 325.501 328.915 C 325.501 328.915 207.143 260.581 207.131 260.574 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 207.131 260.574 C 188.218 293.333 199.387 335.016 232.145 353.930 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.145 353.930 C 264.904 372.843 302.721 368.372 325.501 328.915 C 325.501 328.915 207.143 260.581 207.131 260.574 C 188.218 293.333 199.387 335.016 232.145 353.930 M 260.592 525.703 C 260.602 525.702 299.366 506.317 357.527 506.317 C 357.527 506.328 357.523 618.804 357.527 618.814 C 203.606 619.682 105.497 509.051 105.497 370.608 C 105.497 232.166 203.606 121.535 357.527 122.402 C 357.527 122.402 357.527 197.401 357.527 234.900 C 357.527 238.236 357.527 479.546 357.527 479.570 C 357.527 479.571 357.527 486.748 357.527 486.749 C 279.979 486.930 260.602 525.700 260.592 525.703 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 264.941 282.665 C 255.235 282.665 243.384 291.501 243.384 320.575 C 243.384 349.649 264.939 358.481 264.941 358.485 C 264.943 358.481 286.497 349.649 286.497 320.575 C 286.497 291.502 274.646 282.665 264.941 282.665 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 207.131 260.574 C 188.218 293.333 199.387 335.016 232.145 353.930 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.145 353.930 C 264.904 372.843 302.721 368.372 325.501 328.915 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 325.501 328.915 C 325.501 328.915 207.143 260.581 207.131 260.574 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 357.527 234.900 C 357.527 238.236 357.527 479.546 357.527 479.570 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 207.131 260.574 C 188.218 293.333 199.387 335.016 232.145 353.930 C 264.904 372.843 302.721 368.372 325.501 328.915 C 325.501 328.915 207.143 260.581 207.131 260.574 M 156.178 324.929 C 164.813 253.514 202.141 197.656 241.915 189.730 C 285.841 180.976 329.934 202.532 357.527 234.900 C 357.527 238.236 357.527 479.546 357.527 479.570 C 357.523 479.567 314.858 446.237 314.806 445.787 C 237.593 425.318 204.096 466.483 193.112 471.592 C 161.142 440.284 155.500 393.425 155.496 393.417 C 155.493 393.409 108.879 397.290 120.561 312.617 C 128.693 314.625 146.566 320.092 156.178 324.929 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 338.140 312.448 C 338.140 312.459 338.140 428.758 338.140 428.769 C 338.135 428.767 307.651 409.463 294.104 404.872 C 272.302 397.484 242.012 416.316 253.620 441.430 M 192.306 228.441 C 240.917 256.443 338.125 312.439 338.140 312.448 M 314.806 445.787 C 303.376 438.305 292.662 426.662 280.605 428.865 M 207.131 260.574 C 188.218 293.333 199.387 335.016 232.145 353.930 C 264.904 372.843 302.721 368.372 325.501 328.915 C 325.501 328.915 207.143 260.581 207.131 260.574 M 156.178 324.929 C 164.813 253.514 202.141 197.656 241.915 189.730 C 285.841 180.976 329.934 202.532 357.527 234.900 C 357.527 238.236 357.527 479.546 357.527 479.570 C 357.523 479.567 314.858 446.237 314.806 445.787 C 237.593 425.318 204.096 466.483 193.112 471.592 C 161.142 440.284 155.500 393.425 155.496 393.417 C 155.493 393.409 108.879 397.290 120.561 312.617 C 128.693 314.625 146.566 320.092 156.178 324.929 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 258.482 136.952 C 282.974 158.719 279.139 164.923 276.147 189.948 C 285.279 203.572 307.050 212.615 318.105 202.846 C 320.365 161.385 301.699 132.220 258.482 136.952 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":703.479,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":119.938,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":103.764,\\\"y\\\":370.789,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873291494513,\\\"y\\\":0.005034038194809824}},{\\\"point\\\":{\\\"x\\\":616.236,\\\"y\\\":370.789,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873291494513,\\\"y\\\":0.005034038194809813}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":549.562,\\\"y\\\":537.582,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129009603494577,\\\"y\\\":0.7012647294230766}},{\\\"point\\\":{\\\"x\\\":170.282,\\\"y\\\":537.621,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986940826594948,\\\"y\\\":0.7154205608288086}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":534.985,\\\"y\\\":188.288,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314974491510122,\\\"y\\\":-0.7753779541073919}},{\\\"point\\\":{\\\"x\\\":185.63,\\\"y\\\":188.348,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6816824390812377,\\\"y\\\":-0.7316481751827544}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":618.112,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"dog\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":28.793,\\\"max\\\":670.5152109983026},\\\"y\\\":{\\\"min\\\":119.89229066863356,\\\"max\\\":603.242}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dog\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dog_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 557.648 322.378 C 578.368 322.248 616.723 323.526 642.356 297.330 C 695.812 242.698 661.120 170.538 617.537 155.304 C 651.250 282.611 547.709 302.622 521.094 297.313 C 451.538 274.677 381.777 315.275 329.511 285.549 C 269.282 251.292 270.903 184.407 253.850 167.518 C 289.483 158.606 290.964 127.075 290.968 127.071 C 290.962 127.072 261.017 109.565 232.542 133.485 C 120.105 108.525 164.030 170.997 76.202 174.159 C 63.922 237.732 133.190 202.559 159.219 206.363 C 146.603 218.436 107.697 232.685 97.127 237.942 C 99.950 263.662 133.519 227.402 171.827 245.423 C 200.222 258.780 166.392 332.861 194.432 373.492 C 183.653 375.313 176.132 372.459 148.959 367.465 C 109.744 360.258 29.806 438.447 29.793 438.455 C 58.971 461.655 103.646 399.657 142.295 407.551 C 176.393 414.516 205.569 425.237 205.575 425.239 C 205.571 425.241 206.648 432.370 163.112 446.264 C 119.575 460.159 111.789 531.370 115.900 556.275 C 150.557 549.072 136.087 503.416 175.727 482.508 C 202.613 470.473 231.236 477.978 278.865 448.959 C 398.231 474.558 379.053 418.485 448.481 433.212 C 463.888 475.111 475.286 489.969 529.412 504.523 C 524.237 531.743 501.802 573.723 523.137 602.242 C 546.608 580.974 551.317 533.593 562.880 491.293 C 528.902 465.847 523.684 433.121 523.680 433.116 C 523.687 433.118 550.706 461.174 592.059 458.393 C 596.453 505.448 593.326 530.029 632.132 560.310 C 650.801 530.950 612.197 493.553 632.469 420.298 C 583.782 404.966 553.922 369.180 557.648 322.378 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 240.355 147.057 C 253.921 129.121 267.124 131.436 279.973 131.796 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 637.569 545.314 C 633.344 542.093 629.120 538.873 624.896 535.652 M 636.090 526.268 C 631.864 523.044 627.638 519.821 623.412 516.597 M 540.450 576.257 C 537.863 570.684 535.276 565.112 532.690 559.539 M 532.691 592.022 C 530.335 586.392 527.979 580.762 525.622 575.131 M 57.796 442.099 C 60.130 436.091 62.464 430.084 64.798 424.076 M 42.973 443.665 C 45.647 439.079 48.321 434.493 50.995 429.907 M 138.494 537.152 C 137.270 532.620 136.045 528.089 134.820 523.557 M 128.977 551.009 C 127.588 545.690 126.199 540.371 124.811 535.051 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 75.629 172.521 C 85.402 171.440 93.652 169.944 93.573 173.879 C 93.366 184.207 86.378 194.440 78.805 196.568 C 73.987 197.921 72.570 191.141 71.110 186.354 C 69.623 181.477 69.968 173.147 75.629 172.521 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 174.435 147.833 C 187.317 144.161 207.836 155.282 207.839 155.282 C 207.836 155.285 196.264 175.551 183.382 179.223 C 170.501 182.895 149.981 171.776 149.978 171.775 C 149.980 171.773 161.553 151.505 174.435 147.833 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 171.149 152.533 C 177.270 148.580 185.398 150.329 189.351 156.451 C 193.304 162.573 191.555 170.700 185.433 174.653 C 179.311 178.606 171.184 176.857 167.231 170.735 C 163.278 164.613 165.027 156.486 171.149 152.533 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":548.613,\\\"y\\\":646.035,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.4709387581732436,\\\"y\\\":-0.882165906193525}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":193.443,\\\"y\\\":113.198,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.075688384845054,\\\"y\\\":-0.9971315201113378}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":63.755,\\\"y\\\":234.815,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8797709791964349,\\\"y\\\":0.47539775363767345}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":312.013,\\\"y\\\":580.196,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.27951079753615815,\\\"y\\\":0.9601425488231948}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":377.28,\\\"y\\\":293.504,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.19181312266690698,\\\"y\\\":-0.9814314677922092}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":624.863,\\\"y\\\":361.007,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9564093291927153,\\\"y\\\":0.29202944206559145}}],\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":216.949,\\\"max\\\":382.154},\\\"y\\\":{\\\"min\\\":294.16,\\\"max\\\":440.513}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"door\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":140.751,\\\"max\\\":623.426},\\\"y\\\":{\\\"min\\\":14.021,\\\"max\\\":711.047}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"door\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"door\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 297.325 536.213 C 297.325 536.162 297.913 197.716 298.207 28.469 C 298.237 28.486 598.494 201.838 598.524 201.855 C 598.524 201.906 598.620 709.496 598.620 709.547 C 598.590 709.530 297.355 536.230 297.325 536.213 M 360.917 519.908 C 360.825 510.205 360.732 500.502 360.640 490.800 C 425.206 527.944 489.771 565.089 554.337 602.233 C 554.318 602.222 360.659 490.811 360.640 490.800 C 360.640 490.761 361.207 107.819 361.207 107.780 C 425.563 144.936 554.255 219.236 554.275 219.247 C 554.275 219.286 554.337 602.195 554.337 602.233 C 554.337 611.830 554.337 631.021 554.337 631.024 C 554.318 631.013 425.391 556.947 360.917 519.908 M 335.319 96.436 C 335.321 96.437 351.957 104.755 360.276 108.915 C 360.276 108.956 360.276 520.693 360.276 520.734 C 360.276 520.693 360.276 246.188 360.276 108.915 C 351.957 104.755 335.321 96.437 335.319 96.436 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 297.325 536.213 C 297.325 536.162 297.913 197.716 298.207 28.469 C 298.237 28.486 598.494 201.838 598.524 201.855 C 598.524 201.906 598.620 709.496 598.620 709.547 C 598.590 709.530 297.355 536.230 297.325 536.213 M 360.917 519.908 C 360.825 510.205 360.732 500.502 360.640 490.800 C 425.206 527.944 489.771 565.089 554.337 602.233 C 554.337 611.830 554.337 621.427 554.337 631.024 C 554.337 631.021 554.337 611.830 554.337 602.233 C 554.318 602.222 360.659 490.811 360.640 490.800 C 360.640 490.761 361.207 107.819 361.207 107.780 C 361.226 107.792 489.919 182.092 554.275 219.247 C 554.255 219.236 425.563 144.936 361.207 107.780 M 554.337 602.233 C 554.337 602.195 554.275 219.286 554.275 219.247 M 360.917 519.908 C 425.391 556.947 554.318 631.013 554.337 631.024 M 361.207 108.248 C 361.207 245.521 361.207 382.794 361.207 520.067 M 335.319 96.436 C 335.321 96.437 351.957 104.755 360.276 108.915 C 360.276 108.956 360.276 520.693 360.276 520.734 C 360.276 520.693 360.276 246.188 360.276 108.915 C 351.957 104.755 335.321 96.437 335.319 96.436 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 335.319 96.436 C 335.321 96.437 351.957 104.755 360.276 108.915 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.276 108.915 C 360.276 246.188 360.276 520.693 360.276 520.734 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 167.210 632.202 C 167.207 632.200 150.571 623.882 142.251 619.722 C 142.251 482.449 142.251 207.945 142.251 207.903 C 142.271 207.892 335.299 96.447 335.319 96.436 C 335.321 96.437 351.957 104.755 360.276 108.915 C 360.276 246.188 360.276 520.693 360.276 520.734 C 360.257 520.746 167.229 632.190 167.210 632.202 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 142.251 619.722 C 142.251 619.720 142.251 207.942 142.251 207.903 C 142.268 207.894 335.299 96.447 335.319 96.436 C 335.321 96.437 351.957 104.755 360.276 108.915 C 360.276 108.956 360.276 520.693 360.276 520.734 C 360.257 520.746 167.229 632.190 167.210 632.202 C 158.890 628.042 150.571 623.882 142.251 619.722 M 142.251 207.903 C 150.571 212.063 158.890 216.223 167.210 220.383 C 167.227 220.373 360.257 108.926 360.276 108.915 M 167.210 632.202 C 167.210 632.199 167.210 220.421 167.210 220.383 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.917 519.908 C 360.825 510.205 360.732 500.502 360.640 490.800 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.640 490.800 C 425.206 527.944 489.771 565.089 554.337 602.233 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 554.337 602.233 C 554.337 611.830 554.337 631.021 554.337 631.024 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 554.337 631.024 C 554.318 631.013 425.391 556.947 360.917 519.908 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.917 519.908 C 360.825 510.205 360.732 500.502 360.640 490.800 C 425.206 527.944 489.771 565.089 554.337 602.233 C 554.337 611.830 554.337 631.021 554.337 631.024 C 554.318 631.013 425.391 556.947 360.917 519.908 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 142.251 619.722 C 142.251 619.719 142.251 207.942 142.251 207.903 C 150.571 212.063 158.890 216.223 167.210 220.383 C 167.210 220.421 167.210 632.199 167.210 632.202 C 158.890 628.042 150.571 623.882 142.251 619.722 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 200.270 394.740 C 210.630 394.740 218.988 403.098 218.988 413.459 C 218.989 423.820 210.630 432.178 200.270 432.178 C 189.909 432.178 181.550 423.820 181.550 413.459 C 181.550 403.098 189.909 394.740 200.270 394.740 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 554.337 631.024 C 554.337 621.427 554.337 611.830 554.337 602.233 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 598.524 201.855 C 598.494 201.838 298.237 28.486 298.207 28.469 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 321.513 15.521 C 421.618 73.317 621.799 188.891 621.829 188.908 C 614.061 193.224 606.292 197.540 598.524 201.855 C 598.494 201.838 298.237 28.486 298.207 28.469 C 298.210 28.467 313.744 19.837 321.513 15.521 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 598.524 201.855 C 606.292 197.540 614.061 193.224 621.829 188.908 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 598.620 709.547 C 598.620 709.496 598.524 201.906 598.524 201.855 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 598.524 201.855 C 606.292 197.540 614.061 193.224 621.829 188.908 C 621.829 188.959 621.926 696.549 621.926 696.600 C 621.923 696.601 606.389 705.231 598.620 709.547 C 598.620 709.496 598.524 201.906 598.524 201.855 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":232.66,\\\"max\\\":553.719},\\\"y\\\":{\\\"min\\\":221.364,\\\"max\\\":614.153}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":700.544,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":40.816,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":622.848,\\\"y\\\":368.302,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875002343701,\\\"y\\\":0.004999937501169377}},{\\\"point\\\":{\\\"x\\\":140.261,\\\"y\\\":369.089,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999870306009792,\\\"y\\\":0.005092998118627711}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":152.551,\\\"y\\\":621.189,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986691571538629,\\\"y\\\":0.7154449027297006}},{\\\"point\\\":{\\\"x\\\":612.779,\\\"y\\\":699.128,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129208414116204,\\\"y\\\":0.7012445178972504}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":609.115,\\\"y\\\":182.925,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6313905507300575,\\\"y\\\":-0.7754650040129436}},{\\\"point\\\":{\\\"x\\\":162.584,\\\"y\\\":195.649,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817605159348934,\\\"y\\\":-0.7315754225725384}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":514.984,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"dragon\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":8.124,\\\"max\\\":710.6207112358421},\\\"y\\\":{\\\"min\\\":135.129,\\\"max\\\":569.96}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dragon\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tongue\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 186.872 231.321 C 191.401 229.932 182.109 220.415 178.322 218.519 C 166.813 212.757 120.901 202.328 132.348 227.217 C 139.498 242.764 82.109 227.737 93.473 245.855 C 102.140 259.673 47.357 247.832 51.049 259.524 C 57.839 281.034 8.628 273.190 8.624 273.192 C 8.629 273.191 62.550 289.365 57.425 264.838 C 54.917 252.837 108.736 267.788 100.574 253.666 C 88.959 233.571 150.420 249.877 143.013 233.973 C 132.152 210.652 178.842 233.784 186.872 231.321 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 178.322 218.519 C 166.813 212.757 120.901 202.328 132.348 227.217 C 139.498 242.764 82.109 227.737 93.473 245.855 C 102.140 259.673 47.357 247.832 51.049 259.524 C 57.839 281.034 8.628 273.190 8.624 273.192 C 8.629 273.191 62.550 289.365 57.425 264.838 C 54.917 252.837 108.736 267.788 100.574 253.666 C 88.959 233.571 150.420 249.877 143.013 233.973 C 132.152 210.652 178.842 233.784 186.872 231.321 C 191.401 229.932 182.109 220.415 178.322 218.519 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dragon\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 499.118 365.434 C 549.656 367.345 575.279 391.666 597.413 405.574 C 589.747 385.164 582.339 357.487 574.416 344.344 C 553.017 308.846 498.884 265.962 409.957 288.996 C 351.961 304.018 304.567 342.610 293.615 349.596 C 289.019 352.527 246.715 380.083 229.608 345.089 C 221.781 329.080 251.635 306.897 260.139 279.766 C 273.294 237.798 256.302 205.806 239.206 194.220 C 221.480 182.206 196.240 177.523 196.236 177.521 C 196.238 177.520 211.540 169.785 215.407 166.160 C 221.730 160.234 235.286 135.632 235.288 135.629 C 235.284 135.632 211.000 159.457 198.366 164.740 C 183.385 171.005 155.106 163.548 142.983 171.131 C 91.462 203.355 70.934 200.157 62.039 215.863 C 56.666 225.351 66.299 251.361 66.300 251.365 C 66.300 251.363 71.269 237.166 71.270 237.164 C 71.280 237.162 163.952 207.657 169.965 217.993 C 174.822 226.342 98.968 268.400 98.961 268.405 C 98.960 268.405 82.632 262.726 82.630 262.725 C 82.632 262.728 94.355 285.413 96.831 287.576 C 98.896 289.381 117.551 298.320 118.842 296.807 C 119.806 295.678 111.053 283.200 111.742 280.476 C 115.140 267.043 192.678 246.398 192.686 246.394 C 192.687 246.394 204.526 230.721 204.703 226.797 C 205.063 218.828 191.977 202.375 191.976 202.372 C 191.977 202.375 205.732 217.800 205.197 227.246 C 205.136 228.327 200.475 236.575 198.501 238.915 C 198.097 239.393 216.414 242.872 206.177 266.275 C 195.809 289.977 136.113 292.507 122.392 349.350 C 114.500 382.046 131.779 401.285 129.181 402.610 C 119.924 407.333 122.393 429.581 122.392 429.583 C 122.388 429.585 82.151 447.882 81.920 446.624 C 74.098 403.995 89.396 408.002 81.210 390.532 C 79.332 386.521 72.891 369.579 60.619 367.810 C 45.018 365.562 30.801 374.910 30.798 374.911 C 30.801 374.911 54.091 375.181 57.069 377.751 C 67.063 386.375 61.329 392.660 61.329 392.662 C 61.327 392.661 47.315 385.537 36.478 387.691 C 27.885 389.399 14.469 406.861 14.467 406.862 C 14.470 406.862 33.998 397.722 39.318 398.342 C 43.510 398.831 57.067 408.991 57.069 408.992 C 57.066 408.994 38.733 405.685 29.378 421.773 C 27.578 424.867 29.378 443.782 29.378 443.784 C 29.379 443.782 38.150 424.993 40.028 423.903 C 45.853 420.523 63.457 426.033 63.460 426.033 C 63.460 426.040 67.495 492.571 69.850 489.936 C 90.709 466.597 164.650 447.662 161.781 445.161 C 145.327 430.815 131.495 403.636 131.494 403.635 C 131.495 403.636 148.035 433.553 168.197 450.780 C 171.170 453.320 170.176 452.018 179.195 456.565 C 176.388 435.614 181.325 416.097 181.325 416.093 C 181.325 416.097 177.007 448.383 181.325 460.115 C 186.312 473.661 216.138 493.823 214.697 498.457 C 212.860 504.363 156.834 512.146 150.794 509.107 C 147.671 507.537 140.616 482.764 133.043 480.706 C 114.314 475.617 97.545 491.355 97.541 491.356 C 97.544 491.357 121.132 486.296 128.073 492.777 C 132.341 496.763 131.622 511.236 131.623 511.237 C 131.620 511.237 111.109 504.067 102.511 509.107 C 90.317 516.257 86.892 547.445 86.891 547.449 C 86.893 547.447 96.610 524.646 105.351 521.178 C 113.426 517.975 134.460 526.858 134.463 526.858 C 134.461 526.860 115.184 531.617 111.742 540.349 C 107.765 550.440 120.971 569.458 120.972 569.460 C 120.973 569.458 117.855 553.417 123.812 546.029 C 132.946 534.703 149.246 548.259 158.604 536.089 C 168.440 523.299 259.202 516.338 260.139 513.368 C 260.631 511.808 246.081 479.964 228.898 465.085 C 222.430 459.485 243.807 428.877 243.808 428.873 C 243.807 428.877 223.483 458.275 229.226 462.955 C 232.692 465.780 266.920 479.163 307.712 472.895 C 363.650 464.301 407.721 421.814 407.731 421.809 C 407.737 421.803 439.946 375.878 475.990 367.891 C 484.424 366.021 492.220 366.265 499.118 365.434 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 292.112 436.582 C 261.281 439.629 242.528 432.256 242.523 432.255 M 413.507 369.941 C 393.286 385.653 370.585 428.828 292.112 436.582 M 509.075 365.245 C 487.872 341.127 437.699 351.142 413.507 369.941 M 499.118 365.434 C 549.656 367.345 575.279 391.666 597.413 405.574 C 589.747 385.164 582.339 357.487 574.416 344.344 C 553.017 308.846 498.884 265.962 409.957 288.996 C 351.961 304.018 304.567 342.610 293.615 349.596 C 289.019 352.527 246.715 380.083 229.608 345.089 C 221.781 329.080 251.635 306.897 260.139 279.766 C 273.294 237.798 256.302 205.806 239.206 194.220 C 221.480 182.206 196.240 177.523 196.236 177.521 C 196.238 177.520 211.540 169.785 215.407 166.160 C 221.730 160.234 235.286 135.632 235.288 135.629 C 235.284 135.632 211.000 159.457 198.366 164.740 C 183.385 171.005 155.106 163.548 142.983 171.131 C 91.462 203.355 70.934 200.157 62.039 215.863 C 56.666 225.351 66.299 251.361 66.300 251.365 C 66.300 251.363 71.269 237.166 71.270 237.164 C 71.280 237.162 163.952 207.657 169.965 217.993 C 174.822 226.342 98.968 268.400 98.961 268.405 C 98.960 268.405 82.632 262.726 82.630 262.725 C 82.632 262.728 94.355 285.413 96.831 287.576 C 98.896 289.381 117.551 298.320 118.842 296.807 C 119.806 295.678 111.053 283.200 111.742 280.476 C 115.140 267.043 192.678 246.398 192.686 246.394 C 192.687 246.394 204.526 230.721 204.703 226.797 C 205.063 218.828 191.977 202.375 191.976 202.372 C 191.977 202.375 205.732 217.800 205.197 227.246 C 205.136 228.327 200.475 236.575 198.501 238.915 C 198.097 239.393 216.414 242.872 206.177 266.275 C 195.809 289.977 136.113 292.507 122.392 349.350 C 114.500 382.046 131.779 401.285 129.181 402.610 C 119.924 407.333 122.393 429.581 122.392 429.583 C 122.388 429.585 82.151 447.882 81.920 446.624 C 74.098 403.995 89.396 408.002 81.210 390.532 C 79.332 386.521 72.891 369.579 60.619 367.810 C 45.018 365.562 30.801 374.910 30.798 374.911 C 30.801 374.911 54.091 375.181 57.069 377.751 C 67.063 386.375 61.329 392.660 61.329 392.662 C 61.327 392.661 47.315 385.537 36.478 387.691 C 27.885 389.399 14.469 406.861 14.467 406.862 C 14.470 406.862 33.998 397.722 39.318 398.342 C 43.510 398.831 57.067 408.991 57.069 408.992 C 57.066 408.994 38.733 405.685 29.378 421.773 C 27.578 424.867 29.378 443.782 29.378 443.784 C 29.379 443.782 38.150 424.993 40.028 423.903 C 45.853 420.523 63.457 426.033 63.460 426.033 C 63.460 426.040 67.495 492.571 69.850 489.936 C 90.709 466.597 164.650 447.662 161.781 445.161 C 145.327 430.815 131.495 403.636 131.494 403.635 C 131.495 403.636 148.035 433.553 168.197 450.780 C 171.170 453.320 170.176 452.018 179.195 456.565 C 176.388 435.614 181.325 416.097 181.325 416.093 C 181.325 416.097 177.007 448.383 181.325 460.115 C 186.312 473.661 216.138 493.823 214.697 498.457 C 212.860 504.363 156.834 512.146 150.794 509.107 C 147.671 507.537 140.616 482.764 133.043 480.706 C 114.314 475.617 97.545 491.355 97.541 491.356 C 97.544 491.357 121.132 486.296 128.073 492.777 C 132.341 496.763 131.622 511.236 131.623 511.237 C 131.620 511.237 111.109 504.067 102.511 509.107 C 90.317 516.257 86.892 547.445 86.891 547.449 C 86.893 547.447 96.610 524.646 105.351 521.178 C 113.426 517.975 134.460 526.858 134.463 526.858 C 134.461 526.860 115.184 531.617 111.742 540.349 C 107.765 550.440 120.971 569.458 120.972 569.460 C 120.973 569.458 117.855 553.417 123.812 546.029 C 132.946 534.703 149.246 548.259 158.604 536.089 C 168.440 523.299 259.202 516.338 260.139 513.368 C 260.631 511.808 246.081 479.964 228.898 465.085 C 222.430 459.485 243.807 428.877 243.808 428.873 C 243.807 428.877 223.483 458.275 229.226 462.955 C 232.692 465.780 266.920 479.163 307.712 472.895 C 363.650 464.301 407.721 421.814 407.731 421.809 C 407.737 421.803 439.946 375.878 475.990 367.891 C 484.424 366.021 492.220 366.265 499.118 365.434 M 152.214 349.414 C 147.167 396.616 177.265 412.884 180.472 416.077 M 227.865 264.404 C 223.737 293.064 156.100 313.070 152.214 349.414 M 201.787 215.927 C 201.790 215.932 233.577 224.738 227.865 264.404 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 407.731 421.809 C 407.737 421.803 439.946 375.878 475.990 367.891 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 475.990 367.891 C 484.424 366.021 492.220 366.265 499.118 365.434 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 499.118 365.434 C 549.656 367.345 575.279 391.666 597.413 405.574 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 507.787 477.872 C 518.782 475.284 526.500 461.119 530.066 455.613 C 530.067 455.610 501.994 441.837 489.543 454.298 C 480.355 463.493 489.229 482.239 507.787 477.872 M 637.168 462.245 C 628.474 464.875 616.513 467.698 602.333 468.304 C 600.872 482.286 597.322 494.643 591.016 504.137 C 567.954 538.854 519.267 568.991 458.239 546.029 C 417.921 530.860 397.391 488.135 397.176 465.085 C 396.923 438.065 407.730 421.815 407.731 421.809 C 407.737 421.803 439.946 375.878 475.990 367.891 C 484.424 366.021 492.220 366.265 499.118 365.434 C 549.656 367.345 575.279 391.666 597.413 405.574 C 608.369 412.459 618.661 416.526 630.778 412.542 C 649.327 406.444 686.001 388.670 682.610 356.450 C 676.802 301.259 622.973 285.756 622.967 285.749 C 622.976 285.757 696.351 278.055 709.122 362.934 C 713.374 391.192 706.636 441.232 637.168 462.245 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 602.333 468.304 C 581.770 469.184 530.065 455.618 530.066 455.613 C 530.065 455.618 581.770 469.184 602.333 468.304 C 581.770 469.184 530.065 455.618 530.066 455.613 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 559.064 464.375 C 559.060 464.380 550.028 498.384 524.272 509.817 C 502.402 519.526 474.250 513.871 459.659 494.907 C 445.906 477.033 448.091 450.860 461.079 432.424 C 473.135 415.310 496.862 407.850 515.042 411.122 C 550.553 417.515 574.121 442.963 610.186 441.883 C 637.837 441.055 665.134 437.148 682.088 415.289 C 700.362 391.728 703.308 359.597 689.795 333.019 C 670.866 295.785 628.630 287.882 628.624 287.877 M 602.333 468.304 C 581.770 469.184 530.065 455.618 530.066 455.613 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 77.018 218.093 C 70.448 220.311 67.611 226.300 67.610 226.301 C 67.610 226.300 68.427 218.066 71.213 215.891 C 77.741 210.796 83.189 216.011 77.018 218.093 M 155.206 193.271 C 145.067 196.631 134.072 192.220 134.070 192.220 C 134.071 192.219 144.134 180.858 150.101 178.658 C 161.132 174.590 171.536 181.927 171.538 181.927 C 171.536 181.928 168.728 188.790 155.206 193.271 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 566.173 154.848 C 566.167 154.850 524.403 161.356 515.535 175.106 C 502.845 194.784 507.321 221.659 507.320 221.664 C 507.316 221.667 478.793 235.695 469.937 254.480 C 463.273 268.614 463.004 295.112 463.004 295.116 C 463.001 295.118 442.576 300.579 434.973 310.663 C 427.999 319.913 428.120 339.250 428.119 339.253 C 428.114 339.254 402.281 339.606 382.996 348.166 C 364.491 356.380 347.562 374.471 347.559 374.474 C 347.556 374.472 323.862 358.294 323.859 358.292 C 323.861 358.288 345.396 315.915 345.398 315.911 C 345.399 315.905 346.792 262.072 346.793 262.067 C 346.790 262.064 322.624 226.739 322.621 226.736 C 322.629 226.731 360.479 193.843 397.095 182.324 C 532.650 139.678 566.156 154.851 566.173 154.848 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 569.584 155.835 C 569.568 155.837 542.986 134.708 409.771 172.610 C 330.487 195.168 299.959 234.923 299.948 234.930 C 299.950 234.930 317.200 232.191 327.977 241.394 C 337.922 249.887 343.748 273.459 343.395 286.074 C 342.969 301.356 334.190 325.779 320.946 338.751 C 309.854 349.615 304.485 355.038 324.341 359.888 C 334.137 350.811 348.793 324.977 349.365 324.626 C 350.125 324.160 369.072 322.676 377.620 323.806 C 395.649 326.191 434.267 342.389 434.272 342.391 C 434.267 342.388 404.840 320.385 382.899 314.840 C 373.623 312.496 350.139 311.429 350.136 311.428 C 350.137 311.427 353.968 294.949 354.381 294.525 C 355.498 293.378 383.538 287.307 400.952 287.494 C 430.244 287.810 478.764 302.361 478.772 302.362 C 478.765 302.359 436.299 279.669 405.000 275.940 C 392.895 274.498 355.828 282.134 355.823 282.134 C 355.823 282.132 351.204 259.499 351.393 259.063 C 352.017 257.625 391.739 237.040 423.131 229.755 C 462.354 220.653 519.767 223.862 519.777 223.862 C 519.768 223.861 492.679 208.815 425.244 218.171 C 387.274 223.439 346.901 248.058 346.893 248.061 C 346.891 248.059 342.551 235.225 331.978 225.512 C 330.622 224.267 347.395 208.177 415.993 182.727 C 522.318 143.280 569.568 155.838 569.584 155.835 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":323.08,\\\"y\\\":600.719,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":150.822,\\\"y\\\":166.1,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.050794388467099376,\\\"y\\\":-0.9987091318798749}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":120.189,\\\"y\\\":358.358,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872168704637,\\\"y\\\":0.005056292679846634}},{\\\"point\\\":{\\\"x\\\":581.558,\\\"y\\\":358.358,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872195631562,\\\"y\\\":0.005055760115760814}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":569.994,\\\"y\\\":528.533,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129599815034307,\\\"y\\\":0.7012047238678786}},{\\\"point\\\":{\\\"x\\\":93.814,\\\"y\\\":528.582,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987283661265411,\\\"y\\\":0.7153870773016063}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"dragon_fore\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":118.808,\\\"max\\\":601.192},\\\"y\\\":{\\\"min\\\":14.96,\\\"max\\\":705.04}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dragon_fore\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dragon_fore\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 418.118 59.448 C 418.121 59.449 446.594 62.639 446.597 62.640 C 446.598 62.636 460.659 29.398 460.660 29.394 C 460.656 29.397 418.122 59.445 418.118 59.448 M 525.280 394.642 C 525.284 394.641 570.486 384.475 570.491 384.474 C 570.491 384.469 572.871 329.251 572.871 329.245 C 572.866 329.252 525.285 394.635 525.280 394.642 M 468.128 341.446 C 468.130 341.450 485.349 377.106 485.351 377.109 C 485.356 377.105 533.456 331.361 533.461 331.357 C 533.454 331.358 468.134 341.445 468.128 341.446 M 535.794 261.976 C 535.792 261.979 509.672 296.043 509.669 296.046 C 509.675 296.046 569.437 291.864 569.443 291.864 C 569.440 291.861 535.798 261.979 535.794 261.976 M 551.025 194.041 C 551.024 194.044 545.199 231.469 545.198 231.473 C 545.204 231.471 600.686 207.226 600.692 207.224 C 600.687 207.223 551.030 194.042 551.025 194.041 M 533.293 128.940 C 533.294 128.943 549.680 162.330 549.682 162.333 C 549.686 162.329 586.318 121.829 586.322 121.825 C 586.317 121.826 533.298 128.939 533.293 128.940 M 478.874 90.197 C 478.877 90.198 507.220 104.253 507.223 104.255 C 507.226 104.251 532.512 67.919 532.515 67.915 C 532.509 67.918 478.879 90.194 478.874 90.197 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 422.034 140.677 C 404.254 129.135 331.023 103.645 345.192 146.480 C 354.043 173.238 262.871 138.118 278.148 169.856 C 289.799 194.061 202.308 164.631 206.205 184.445 C 213.374 220.897 134.270 199.032 134.263 199.034 C 134.271 199.033 219.555 235.395 215.666 194.313 C 213.762 174.209 299.106 208.551 288.337 183.941 C 273.013 148.922 370.614 186.881 361.408 159.493 C 347.909 119.333 420.085 165.756 433.679 163.198 C 441.347 161.755 427.883 144.475 422.034 140.677 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 487.908 502.273 C 487.912 502.274 504.651 510.640 534.103 513.599 C 569.021 517.107 585.831 515.870 585.837 515.870 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 587.146 371.725 C 587.146 441.398 587.146 511.071 587.146 580.745 C 537.859 582.130 465.667 555.338 460.513 550.079 C 451.972 541.366 490.628 496.978 490.631 496.973 C 490.628 496.978 450.027 543.155 459.585 553.506 C 484.980 581.010 502.954 635.797 501.862 638.259 C 499.784 642.949 349.957 637.694 331.514 656.823 C 313.964 675.026 289.773 649.849 272.747 666.711 C 261.641 677.710 263.801 704.536 263.800 704.540 C 263.799 704.535 245.673 670.988 254.033 655.201 C 261.267 641.541 293.691 637.290 293.695 637.288 C 293.690 637.287 260.894 618.890 247.090 622.651 C 232.147 626.723 212.060 662.259 212.057 662.263 C 212.060 662.257 223.386 611.840 244.656 602.375 C 259.651 595.702 291.907 611.200 291.911 611.201 C 291.911 611.197 295.742 587.641 289.486 580.334 C 279.316 568.454 239.781 572.411 239.776 572.410 C 239.782 572.409 270.115 549.726 299.836 561.491 C 311.852 566.247 318.856 608.087 323.679 611.231 C 333.008 617.311 426.132 614.849 430.222 605.520 C 433.431 598.200 388.312 559.731 382.635 536.645 C 377.719 516.652 390.709 464.602 390.710 464.594 C 390.709 464.601 379.050 495.640 379.800 530.444 C 365.873 521.348 367.262 523.662 362.861 518.958 C 333.022 487.065 311.438 435.067 311.437 435.066 C 311.438 435.067 329.091 482.088 353.391 508.586 C 357.627 513.205 233.137 530.634 194.715 565.007 C 190.379 568.887 195.977 459.256 195.978 459.245 C 195.974 459.244 168.171 446.997 158.018 451.461 C 154.745 452.901 136.942 482.044 136.940 482.047 C 136.941 482.044 137.465 450.756 140.977 446.022 C 159.240 421.407 188.638 430.184 188.643 430.182 C 188.641 430.180 168.316 411.065 161.545 409.496 C 152.951 407.504 119.313 418.882 119.308 418.883 C 119.312 418.880 144.472 392.762 158.850 391.542 C 176.982 390.004 198.608 404.234 198.612 404.235 C 198.612 404.233 209.149 394.998 194.374 379.050 C 189.972 374.298 151.901 369.584 151.897 369.583 C 151.902 369.583 176.886 356.890 202.008 363.432 C 221.768 368.577 229.202 397.488 231.542 404.396 C 241.735 434.491 217.431 425.127 222.416 496.332 C 222.563 498.434 291.773 475.868 291.780 475.866 C 291.781 475.862 291.822 438.996 307.839 432.964 C 312.335 431.271 287.583 396.614 306.497 344.547 C 339.379 254.030 437.548 260.838 458.864 223.948 C 479.912 187.522 450.577 178.475 451.319 177.760 C 454.967 174.250 463.927 161.403 464.214 159.634 C 466.693 144.358 447.343 116.759 447.342 116.754 C 447.343 116.759 465.742 146.087 463.692 159.065 C 462.683 165.455 440.430 188.934 440.429 188.935 C 440.416 188.939 309.723 208.507 301.698 229.869 C 300.071 234.201 312.107 256.230 310.324 257.900 C 307.933 260.140 279.040 242.088 275.992 238.756 C 272.336 234.760 257.310 195.481 257.308 195.477 C 257.310 195.478 282.992 207.768 282.995 207.770 C 283.007 207.763 414.870 152.840 408.451 138.283 C 400.506 120.264 243.418 151.557 243.402 151.558 C 243.401 151.560 232.664 173.886 232.663 173.888 C 232.663 173.882 221.667 129.545 232.201 115.001 C 249.640 90.927 282.651 99.927 372.886 56.635 C 394.118 46.449 439.035 63.841 464.703 56.335 C 486.351 50.004 530.465 15.464 530.472 15.460 C 530.468 15.465 503.769 53.244 492.333 61.784 C 485.338 67.008 458.876 76.860 458.872 76.862 C 458.879 76.865 499.329 89.160 526.138 112.074 C 551.995 134.173 573.937 189.650 544.709 255.926 C 525.813 298.772 472.243 329.839 482.756 357.240 C 505.674 416.970 587.136 371.723 587.146 371.725 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 534.103 513.599 C 569.021 517.107 585.831 515.870 585.837 515.870 M 487.908 502.273 C 487.912 502.274 504.651 510.640 534.103 513.599 M 460.914 140.739 C 460.918 140.748 511.328 160.991 494.703 224.863 C 482.690 271.014 368.320 291.351 355.293 350.122 C 338.375 426.452 384.653 458.599 389.317 464.413 M 587.146 371.725 C 587.146 441.398 587.146 511.071 587.146 580.745 C 537.859 582.130 465.667 555.338 460.513 550.079 C 451.972 541.366 490.628 496.978 490.631 496.973 C 490.628 496.978 450.027 543.155 459.585 553.506 C 484.980 581.010 502.954 635.797 501.862 638.259 C 499.784 642.949 349.957 637.694 331.514 656.823 C 313.964 675.026 289.773 649.849 272.747 666.711 C 261.641 677.710 263.801 704.536 263.800 704.540 C 263.799 704.535 245.673 670.988 254.033 655.201 C 261.267 641.541 293.691 637.290 293.695 637.288 C 293.690 637.287 260.894 618.890 247.090 622.651 C 232.147 626.723 212.060 662.259 212.057 662.263 C 212.060 662.257 223.386 611.840 244.656 602.375 C 259.651 595.702 291.907 611.200 291.911 611.201 C 291.911 611.197 295.742 587.641 289.486 580.334 C 279.316 568.454 239.781 572.411 239.776 572.410 C 239.782 572.409 270.115 549.726 299.836 561.491 C 311.852 566.247 318.856 608.087 323.679 611.231 C 333.008 617.311 426.132 614.849 430.222 605.520 C 433.431 598.200 388.312 559.731 382.635 536.645 C 377.719 516.652 390.709 464.602 390.710 464.594 C 390.709 464.601 379.050 495.640 379.800 530.444 C 365.873 521.348 367.262 523.662 362.861 518.958 C 333.022 487.065 311.438 435.067 311.437 435.066 C 311.438 435.067 329.091 482.088 353.391 508.586 C 357.627 513.205 233.137 530.634 194.715 565.007 C 190.379 568.887 195.977 459.256 195.978 459.245 C 195.974 459.244 168.171 446.997 158.018 451.461 C 154.745 452.901 136.942 482.044 136.940 482.047 C 136.941 482.044 137.465 450.756 140.977 446.022 C 159.240 421.407 188.638 430.184 188.643 430.182 C 188.641 430.180 168.316 411.065 161.545 409.496 C 152.951 407.504 119.313 418.882 119.308 418.883 C 119.312 418.880 144.472 392.762 158.850 391.542 C 176.982 390.004 198.608 404.234 198.612 404.235 C 198.612 404.233 209.149 394.998 194.374 379.050 C 189.972 374.298 151.901 369.584 151.897 369.583 C 151.902 369.583 176.886 356.890 202.008 363.432 C 221.768 368.577 229.202 397.488 231.542 404.396 C 241.735 434.491 217.431 425.127 222.416 496.332 C 222.563 498.434 291.773 475.868 291.780 475.866 C 291.781 475.862 291.822 438.996 307.839 432.964 C 312.335 431.271 287.583 396.614 306.497 344.547 C 339.379 254.030 437.548 260.838 458.864 223.948 C 479.912 187.522 450.577 178.475 451.319 177.760 C 454.967 174.250 463.927 161.403 464.214 159.634 C 466.693 144.358 447.343 116.759 447.342 116.754 C 447.343 116.759 465.742 146.087 463.692 159.065 C 462.683 165.455 440.430 188.934 440.429 188.935 C 440.416 188.939 309.723 208.507 301.698 229.869 C 300.071 234.201 312.107 256.230 310.324 257.900 C 307.933 260.140 279.040 242.088 275.992 238.756 C 272.336 234.760 257.310 195.481 257.308 195.477 C 257.310 195.478 282.992 207.768 282.995 207.770 C 283.007 207.763 414.870 152.840 408.451 138.283 C 400.506 120.264 243.418 151.557 243.402 151.558 C 243.401 151.560 232.664 173.886 232.663 173.888 C 232.663 173.882 221.667 129.545 232.201 115.001 C 249.640 90.927 282.651 99.927 372.886 56.635 C 394.118 46.449 439.035 63.841 464.703 56.335 C 486.351 50.004 530.465 15.464 530.472 15.460 C 530.468 15.465 503.769 53.244 492.333 61.784 C 485.338 67.008 458.876 76.860 458.872 76.862 C 458.879 76.865 499.329 89.160 526.138 112.074 C 551.995 134.173 573.937 189.650 544.709 255.926 C 525.813 298.772 472.243 329.839 482.756 357.240 C 505.674 416.970 587.136 371.723 587.146 371.725 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 265.983 120.272 C 249.520 124.913 243.164 132.702 243.162 132.704 C 243.163 132.702 247.569 115.009 254.198 113.244 C 263.746 110.702 271.058 118.842 265.983 120.272 M 412.858 74.609 C 412.855 74.611 386.313 95.654 378.202 95.442 C 359.374 94.949 343.648 89.565 343.645 89.564 C 343.648 89.562 367.323 73.885 373.199 71.984 C 385.020 68.159 412.854 74.609 412.858 74.609 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":587.121,\\\"y\\\":474.337,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":587.298,\\\"y\\\":474.224,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"dragon_hind\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":29.069,\\\"max\\\":690.9932323883971},\\\"y\\\":{\\\"min\\\":139.6636281170547,\\\"max\\\":595.9260365052077}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dragon_hind\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"dragon_hind\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 29.569 215.614 C 29.589 215.606 135.444 155.217 233.596 142.838 C 384.056 123.863 457.633 210.177 492.483 265.468 C 506.108 287.086 517.575 326.782 522.555 370.144 C 499.870 350.242 479.858 317.161 426.146 294.445 C 399.857 283.327 364.656 281.370 328.458 285.529 C 254.857 293.985 205.602 362.274 205.590 362.283 C 192.185 374.929 132.987 409.149 84.477 422.746 C 64.674 428.297 29.574 428.990 29.569 428.991 C 29.569 357.865 29.569 286.739 29.569 215.614 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 29.569 215.614 C 29.589 215.606 135.444 155.217 233.596 142.838 C 384.056 123.863 457.633 210.177 492.483 265.468 C 506.108 287.086 517.575 326.782 522.555 370.144 C 499.870 350.242 479.858 317.161 426.146 294.445 C 360.679 226.087 275.605 227.549 198.158 280.910 C 174.583 297.153 115.215 338.505 31.056 346.796 M 328.458 285.529 C 364.656 281.370 399.857 283.327 426.146 294.445 M 205.590 362.283 C 205.602 362.274 254.857 293.985 328.458 285.529 M 29.569 215.614 C 29.569 286.739 29.569 357.865 29.569 428.991 C 29.574 428.990 64.674 428.297 84.477 422.746 C 132.987 409.149 192.185 374.929 205.590 362.283 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 205.590 362.283 C 205.602 362.274 254.857 293.985 328.458 285.529 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 328.458 285.529 C 364.656 281.370 399.857 283.327 426.146 294.445 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 426.146 294.445 C 479.858 317.161 499.870 350.242 522.555 370.144 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.953 473.410 C 379.760 473.779 401.904 440.644 401.908 440.644 C 401.908 440.644 357.963 412.700 335.070 431.046 C 318.176 444.585 325.355 472.712 360.953 473.410 M 690.431 364.105 C 689.464 402.865 654.437 490.055 516.831 479.750 C 510.945 500.313 504.972 518.770 493.916 532.130 C 449.661 585.608 367.221 617.641 266.451 577.162 C 205.378 552.630 176.252 470.176 180.193 431.988 C 184.584 389.435 205.588 362.293 205.590 362.283 C 205.602 362.274 254.857 293.985 328.458 285.529 C 364.656 281.370 399.857 283.327 426.146 294.445 C 479.858 317.161 499.870 350.242 522.555 370.144 C 544.869 389.721 593.754 384.490 614.705 353.451 C 654.943 293.838 614.384 233.585 614.384 233.573 C 614.392 233.586 693.013 260.638 690.431 364.105 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 29.569 215.614 C 29.569 286.739 29.569 357.865 29.569 428.991 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 29.569 215.614 C 29.569 286.739 29.569 357.865 29.569 428.991 C 29.569 428.969 29.569 215.635 29.569 215.614 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 401.908 440.644 C 449.648 467.356 472.528 474.615 516.412 479.829 M 451.162 464.450 C 451.156 464.457 427.098 516.355 382.391 529.311 C 344.115 540.403 298.845 526.860 278.164 492.796 C 258.672 460.690 267.081 417.765 291.957 389.624 C 315.048 363.502 355.677 355.543 385.185 364.245 C 444.525 381.744 479.753 435.025 541.617 434.418 C 579.644 434.045 621.005 421.466 638.698 393.404 C 691.275 310.017 627.462 246.736 618.546 237.174 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":30.457,\\\"y\\\":324.361,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":29.273,\\\"y\\\":324.367,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"drape\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":13.629,\\\"max\\\":706.371},\\\"y\\\":{\\\"min\\\":200.705,\\\"max\\\":519.2959324600237}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"drape\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"bunting\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 705.371 489.514 C 705.365 489.485 647.815 201.734 647.809 201.705 C 647.803 201.734 590.253 489.485 590.247 489.514 C 590.250 489.515 612.746 495.253 618.328 497.912 C 625.154 501.164 637.152 518.442 647.809 518.295 C 658.127 518.153 668.533 501.470 675.890 497.912 C 682.389 494.768 705.368 489.515 705.371 489.514 M 360.000 518.295 C 131.363 518.295 72.191 201.705 72.191 201.705 C 72.191 201.705 203.354 259.267 360.000 259.267 C 516.647 259.267 647.809 201.705 647.809 201.705 C 647.809 201.705 588.638 518.295 360.000 518.295 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 216.096 288.048 C 120.898 245.983 120.159 230.486 72.191 201.705 C 100.972 259.267 129.753 288.048 158.534 316.829 M 503.904 288.048 C 599.103 245.983 599.841 230.486 647.809 201.705 C 647.812 201.734 664.028 396.319 672.138 493.627 M 623.479 493.627 C 631.589 396.319 647.807 201.734 647.809 201.705 C 619.028 240.080 619.028 259.267 561.466 316.829 M 705.371 489.514 C 705.365 489.485 647.815 201.734 647.809 201.705 C 647.803 201.734 590.253 489.485 590.247 489.514 C 590.250 489.515 612.746 495.253 618.328 497.912 C 625.154 501.164 637.152 518.442 647.809 518.295 C 658.127 518.153 668.533 501.470 675.890 497.912 C 682.389 494.768 705.368 489.515 705.371 489.514 M 360.000 518.295 C 131.363 518.295 72.191 201.705 72.191 201.705 C 72.191 201.705 203.354 259.267 360.000 259.267 C 516.647 259.267 647.809 201.705 647.809 201.705 C 647.809 201.705 588.638 518.295 360.000 518.295 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 72.191 201.705 C 72.186 201.734 14.635 489.485 14.629 489.514 C 14.632 489.515 37.129 495.253 42.711 497.912 C 49.536 501.164 61.534 518.441 72.191 518.295 C 82.509 518.152 92.915 501.470 100.272 497.912 C 106.772 494.768 129.750 489.515 129.753 489.514 C 129.747 489.485 72.197 201.734 72.191 201.705 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 72.191 201.705 C 72.194 201.734 88.411 396.319 96.521 493.627 M 47.862 493.627 C 55.972 396.319 72.189 201.734 72.191 201.705 C 72.197 201.734 129.747 489.485 129.753 489.514 C 129.750 489.515 106.772 494.768 100.272 497.912 C 92.915 501.470 82.509 518.152 72.191 518.295 C 61.534 518.441 49.536 501.164 42.711 497.912 C 37.129 495.253 14.632 489.515 14.629 489.514 C 14.635 489.485 72.186 201.734 72.191 201.705 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":256.266,\\\"max\\\":463.734},\\\"y\\\":{\\\"min\\\":277.337,\\\"max\\\":484.806}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":638.934,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":235.021,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":521.215,\\\"y\\\":451.807,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129078968039947,\\\"y\\\":0.701257677800753}},{\\\"point\\\":{\\\"x\\\":198.652,\\\"y\\\":451.84,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987204419418092,\\\"y\\\":0.7153948168757186}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":656.943,\\\"y\\\":189.834,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314273408121039,\\\"y\\\":-0.775435047747363}},{\\\"point\\\":{\\\"x\\\":64.035,\\\"y\\\":189.934,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817263056225,\\\"y\\\":-0.7316073019197509}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":548.545,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"eagle_head\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":104.865,\\\"max\\\":577.2540462286611},\\\"y\\\":{\\\"min\\\":25.128197723556095,\\\"max\\\":707.2045463631528}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eagle_head_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eagle_head_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 248.042 220.366 C 277.136 187.906 258.904 160.585 253.332 152.219 C 266.344 154.303 292.878 165.302 293.554 170.211 C 295.927 187.445 273.115 216.807 259.188 227.797 C 225.264 254.567 202.537 245.442 202.531 245.444 C 202.535 245.442 231.120 239.246 248.042 220.366 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 326.062 165.567 C 308.948 143.260 264.874 143.688 226.656 166.691 C 198.144 183.852 197.776 210.439 168.166 215.722 C 132.846 222.025 106.871 211.078 106.865 211.078 C 106.871 211.080 135.076 234.797 168.166 231.512 C 207.872 227.569 213.875 206.580 237.019 199.224 C 285.520 183.809 321.418 210.149 321.418 210.149 C 321.418 210.149 333.778 175.625 326.062 165.567 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.646 241.444 C 362.818 211.213 332.800 189.684 332.797 189.679 C 332.796 189.684 332.643 233.438 324.908 243.742 C 303.206 272.652 278.705 278.922 278.701 278.925 C 278.709 278.922 359.679 292.167 361.646 241.444 M 307.928 353.658 C 343.048 339.824 333.350 285.882 333.352 285.875 C 333.346 285.879 291.717 323.314 275.285 325.663 C 233.539 331.631 207.791 319.840 207.784 319.839 C 207.794 319.843 227.647 385.282 307.928 353.658 M 235.003 445.118 C 261.310 418.790 243.371 376.049 243.372 376.042 C 243.367 376.046 211.972 417.965 197.540 424.004 C 167.300 436.656 146.378 435.150 146.216 435.813 C 145.942 436.938 199.813 480.336 235.003 445.118 M 243.700 561.010 C 260.082 528.172 229.608 493.873 229.606 493.866 C 229.603 493.872 213.154 542.471 201.551 552.480 C 176.730 573.892 156.284 578.353 156.373 579.545 C 156.524 581.565 221.475 605.559 243.700 561.010 M 307.995 638.891 C 301.189 602.489 254.902 594.468 254.897 594.463 C 254.898 594.469 269.174 642.141 266.101 656.744 C 259.481 688.196 247.802 704.757 248.204 705.183 C 248.899 705.920 317.144 687.828 307.995 638.891 M 495.952 558.191 C 456.667 544.962 451.535 494.696 451.530 494.690 C 451.537 494.692 481.353 513.069 513.830 516.832 C 551.871 521.240 574.714 511.993 575.240 513.068 C 576.021 514.662 544.168 574.428 495.952 558.191 M 440.924 445.274 C 404.874 436.801 398.990 390.194 398.986 390.188 C 398.992 390.190 445.711 409.493 460.558 407.015 C 492.890 401.618 509.647 388.365 509.897 388.597 C 510.321 388.991 489.388 456.666 440.924 445.274 M 458.095 341.592 C 427.831 320.251 439.805 274.826 439.803 274.819 C 439.808 274.823 475.917 310.198 490.613 313.452 C 522.618 320.539 543.133 314.553 543.260 314.823 C 543.475 315.282 498.783 370.282 458.095 341.592 M 489.268 252.006 C 453.447 242.610 448.762 195.868 448.758 195.862 C 448.764 195.864 494.972 216.360 509.877 214.263 C 542.338 209.697 559.520 196.968 559.672 197.117 C 559.931 197.370 537.424 264.637 489.268 252.006 M 468.913 155.414 C 432.268 160.757 409.697 119.558 409.691 119.554 C 409.697 119.553 460.241 120.372 473.143 112.619 C 501.241 95.737 512.126 77.324 512.285 77.386 C 512.555 77.491 518.178 148.232 468.913 155.414 M 403.152 83.833 C 366.488 90.033 339.071 56.900 339.065 56.897 C 339.072 56.896 393.745 55.563 408.725 48.538 C 433.331 36.998 437.227 35.168 446.806 27.175 C 448.988 25.355 442.481 77.182 403.152 83.833 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 379.502 67.257 C 379.498 67.259 368.121 75.526 345.566 80.117 C 342.392 106.408 334.646 118.978 311.201 124.700 C 273.086 134.001 256.407 108.912 256.402 108.910 C 256.406 108.908 273.663 92.320 298.637 85.715 C 324.603 78.847 337.310 81.798 345.566 80.117 M 483.958 189.716 C 505.501 287.954 418.321 347.356 422.657 420.058 C 425.500 467.731 472.722 507.466 472.727 507.474 C 472.716 507.479 381.105 539.939 367.479 551.296 C 353.391 563.038 303.519 650.295 303.511 650.304 C 303.500 650.296 173.498 557.914 223.893 403.340 C 250.713 321.077 353.501 310.332 336.279 235.227 C 332.417 218.389 290.772 233.369 290.767 233.369 C 290.760 233.360 344.371 140.416 223.893 138.632 C 218.281 138.549 208.425 107.085 215.534 91.263 C 225.391 69.330 303.477 54.344 327.919 52.253 C 390.829 46.873 456.764 65.711 483.958 189.716 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 379.502 67.257 C 379.498 67.259 368.121 75.526 345.566 80.117 C 342.392 106.408 334.646 118.978 311.201 124.700 C 273.086 134.001 256.407 108.912 256.402 108.910 C 256.406 108.908 273.663 92.320 298.637 85.715 C 324.603 78.847 337.310 81.798 345.566 80.117 M 483.958 189.716 C 505.501 287.954 418.321 347.356 422.657 420.058 C 425.500 467.731 472.722 507.466 472.727 507.474 C 472.716 507.479 381.105 539.939 367.479 551.296 C 353.391 563.038 303.519 650.295 303.511 650.304 C 303.500 650.296 173.498 557.914 223.893 403.340 C 250.713 321.077 353.501 310.332 336.279 235.227 C 332.417 218.389 290.772 233.369 290.767 233.369 C 290.760 233.360 344.371 140.416 223.893 138.632 C 218.281 138.549 208.425 107.085 215.534 91.263 C 225.391 69.330 303.477 54.344 327.919 52.253 C 390.829 46.873 456.764 65.711 483.958 189.716 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 202.531 245.444 C 202.537 245.442 225.264 254.567 259.188 227.797 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 259.188 227.797 C 273.115 216.807 295.927 187.445 293.554 170.211 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 293.554 170.211 C 292.878 165.302 266.344 154.303 253.332 152.219 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 305.628 162.780 C 309.742 184.473 325.306 229.527 271.263 246.373 C 226.069 260.460 202.538 245.444 202.531 245.444 C 202.537 245.442 225.264 254.567 259.188 227.797 C 273.115 216.807 295.927 187.445 293.554 170.211 C 292.878 165.302 266.344 154.303 253.332 152.219 C 251.559 151.935 191.791 141.202 171.296 149.770 C 140.902 162.477 142.020 186.928 142.017 186.932 C 142.017 186.925 113.748 160.467 148.652 122.090 C 164.992 104.123 216.682 86.274 226.048 89.580 C 232.087 91.711 235.647 133.211 255.132 135.229 C 268.563 136.621 285.408 142.763 285.411 142.764 C 285.413 142.766 303.780 153.040 305.628 162.780 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 285.411 142.764 C 285.418 142.763 333.662 156.032 358.723 131.737 C 378.804 112.270 379.500 67.264 379.502 67.257 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 389.068 605.547 C 359.748 578.266 323.847 568.788 323.841 568.784 C 323.842 568.791 328.748 619.000 336.102 632.388 C 364.597 684.264 420.629 679.054 419.885 677.361 C 402.868 638.676 420.974 635.234 389.068 605.547 M 424.647 605.905 C 389.060 577.997 384.510 531.500 384.506 531.492 C 384.513 531.495 443.488 556.182 461.204 564.852 C 501.206 584.429 496.903 592.193 514.855 612.195 C 517.646 615.304 464.329 637.025 424.647 605.905 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 311.201 124.700 C 334.646 118.978 342.392 106.408 345.566 80.117 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 345.566 80.117 C 337.310 81.798 324.603 78.847 298.637 85.715 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.637 85.715 C 273.663 92.320 256.406 108.908 256.402 108.910 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 256.402 108.910 C 256.407 108.912 273.086 134.001 311.201 124.700 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 311.201 124.700 C 334.646 118.978 342.392 106.408 345.566 80.117 C 337.310 81.798 324.603 78.847 298.637 85.715 C 273.663 92.320 256.406 108.908 256.402 108.910 C 256.407 108.912 273.086 134.001 311.201 124.700 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 302.414 88.437 C 311.831 88.437 319.428 96.034 319.428 105.451 C 319.428 114.868 311.831 122.465 302.414 122.465 C 292.996 122.465 285.400 114.868 285.400 105.451 C 285.400 96.034 292.996 88.437 302.414 88.437 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 218.151 99.493 C 220.992 99.493 223.284 101.785 223.284 104.626 C 223.284 107.467 220.992 109.758 218.151 109.758 C 215.310 109.758 213.019 107.467 213.019 104.626 C 213.018 101.785 215.310 99.493 218.151 99.493 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eagle_head_details\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 226.170 395.930 C 226.169 395.939 207.918 443.899 218.934 480.812 C 229.704 516.902 270.212 546.435 270.217 546.442 C 270.217 546.437 269.685 516.710 275.690 493.320 C 280.619 474.126 292.521 452.861 292.522 452.857 C 292.524 452.863 291.371 489.347 308.149 510.521 C 326.638 533.855 366.331 541.321 366.337 541.324 C 366.336 541.319 354.003 515.592 353.386 492.960 C 352.840 472.980 362.219 449.653 362.220 449.649 C 362.221 449.654 363.536 482.699 381.481 497.788 C 404.962 517.531 448.239 509.832 448.246 509.834 C 448.244 509.830 432.035 491.497 426.053 472.990 C 419.121 451.544 422.265 423.295 422.264 423.290 C 422.269 423.298 437.321 481.892 473.441 504.234 C 474.190 504.697 475.074 521.595 480.950 534.331 C 492.225 558.771 516.761 581.867 516.765 581.872 C 516.757 581.871 476.876 582.090 445.741 573.315 C 430.200 568.935 412.996 559.083 412.993 559.081 C 412.993 559.084 412.989 575.398 416.342 588.239 C 422.427 611.537 437.763 636.986 437.765 636.990 C 437.759 636.989 402.869 629.265 376.239 617.238 C 360.330 610.053 342.873 597.831 342.869 597.829 C 342.869 597.833 340.126 620.543 343.758 638.642 C 348.190 660.732 362.305 684.880 362.307 684.884 C 362.301 684.881 294.916 647.089 294.908 647.086 C 294.903 647.080 204.863 571.618 204.389 492.505 C 203.978 424.101 226.168 395.940 226.170 395.930 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 432.393 368.177 C 432.390 368.179 417.171 379.478 409.390 392.440 C 399.916 408.220 396.829 431.153 396.828 431.157 C 396.826 431.153 376.842 417.108 371.286 399.617 C 366.030 383.069 373.637 361.295 373.637 361.291 C 373.635 361.294 355.336 376.029 346.553 392.535 C 338.574 407.532 336.602 428.756 336.601 428.760 C 336.599 428.756 318.089 412.996 313.651 395.127 C 309.296 377.596 318.056 355.427 318.056 355.423 C 318.053 355.426 297.466 371.555 286.421 389.411 C 277.698 403.513 273.249 423.630 273.248 423.633 C 273.246 423.628 256.743 398.362 257.729 375.526 C 258.582 355.760 274.274 335.026 274.275 335.022 M 335.207 272.756 C 335.207 272.758 336.868 288.405 334.238 300.834 C 331.196 315.208 321.954 330.911 321.953 330.914 C 321.958 330.911 357.629 321.729 373.275 299.455 C 382.532 286.274 381.935 264.908 381.936 264.904 C 381.937 264.907 389.172 280.938 391.189 295.057 C 393.660 312.346 390.401 333.669 390.401 333.673 C 390.404 333.669 416.675 317.579 427.551 296.420 C 436.319 279.362 435.102 254.687 435.102 254.683 C 435.103 254.686 442.691 273.240 444.325 289.400 C 445.763 303.612 442.621 320.941 442.621 320.944 C 442.624 320.941 461.970 304.459 472.064 286.711 M 330.290 227.752 C 348.282 228.220 364.626 244.587 364.629 244.589 C 364.630 244.586 371.261 229.036 370.210 215.831 C 368.898 199.335 357.215 181.625 357.214 181.622 C 357.217 181.625 377.398 193.193 390.753 206.569 C 404.259 220.095 415.917 240.530 415.919 240.534 C 415.920 240.529 422.699 212.701 420.647 189.712 C 419.180 173.282 411.306 154.454 411.305 154.451 C 411.308 154.453 431.122 163.695 444.079 175.696 C 456.697 187.384 467.174 205.915 467.177 205.918 C 467.177 205.912 470.871 176.971 467.244 153.588 C 464.061 133.066 453.452 109.785 453.451 109.781 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 412.993 559.081 C 393.355 547.312 377.571 520.444 370.667 484.954 M 342.869 597.829 C 315.958 566.706 309.202 545.909 301.934 501.714 M 294.908 647.086 C 256.062 592.782 244.474 567.551 235.069 512.228 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":361.356,\\\"y\\\":546.8,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":361.356,\\\"y\\\":49.678,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":205.721,\\\"y\\\":432.51,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873559740994,\\\"y\\\":-0.0050287067850341505}},{\\\"point\\\":{\\\"x\\\":426.375,\\\"y\\\":432.51,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873571967549,\\\"y\\\":-0.005028463647057703}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":495.703,\\\"y\\\":564.087,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128810715840902,\\\"y\\\":0.7012849476333564}},{\\\"point\\\":{\\\"x\\\":225.309,\\\"y\\\":564.125,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698687209876367,\\\"y\\\":0.7154272728622928}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":415.604,\\\"y\\\":597.956,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7096963441520611,\\\"y\\\":0.7045076998139902}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"eagle_shield\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":4.344,\\\"max\\\":716.33},\\\"y\\\":{\\\"min\\\":27.812,\\\"max\\\":633.275352209078}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eagle_shield\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"head_eagle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"head_eagle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 352.774 95.086 C 352.770 95.085 327.752 82.373 314.799 84.079 C 303.657 85.546 303.875 97.745 294.359 96.714 C 286.279 95.838 283.358 83.608 273.034 82.974 C 262.063 82.299 252.252 95.144 252.250 95.145 C 252.252 95.144 264.368 85.356 272.477 87.065 C 281.736 89.017 281.117 102.006 291.813 103.452 C 306.064 105.378 307.595 92.433 317.958 92.120 C 327.585 91.831 350.764 109.814 350.767 109.816 C 350.768 109.814 352.774 95.088 352.774 95.086 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.348 52.840 C 376.817 52.090 372.645 67.476 359.764 68.910 C 352.590 69.709 339.083 59.426 339.081 59.425 C 339.085 59.424 359.563 55.820 373.348 52.840 M 336.225 76.162 C 336.223 76.161 315.033 67.441 315.031 67.440 C 315.034 67.438 322.305 48.943 343.713 45.092 C 352.923 43.435 362.285 40.809 371.607 41.316 C 393.449 42.505 404.259 28.314 404.262 28.312 C 404.261 28.314 408.236 43.549 393.940 47.494 C 391.019 48.301 397.323 51.135 399.936 53.584 C 413.945 66.715 435.833 54.169 435.836 54.169 C 435.834 54.171 431.450 72.006 410.085 74.298 C 407.311 74.596 409.250 84.750 411.766 88.916 C 420.658 103.645 440.994 101.685 440.996 101.686 C 440.993 101.686 424.828 113.726 410.190 105.795 C 407.685 104.437 396.604 123.723 398.987 127.535 C 413.047 150.022 430.872 148.010 430.875 148.012 C 430.871 148.012 412.037 158.906 392.820 146.284 C 389.531 144.124 381.295 163.603 384.392 168.798 C 396.053 188.352 414.581 191.021 414.584 191.023 C 414.581 191.023 410.361 199.342 384.197 190.996 C 378.667 189.232 382.336 210.909 388.402 215.386 C 410.239 231.501 430.762 217.554 430.766 217.554 C 430.764 217.556 429.225 232.742 409.670 234.547 C 399.244 235.509 413.213 245.163 424.125 253.183 C 405.971 268.036 384.697 284.139 332.445 276.528 C 330.451 276.237 325.664 253.260 322.121 255.630 C 308.479 264.753 290.923 252.951 290.920 252.950 C 290.922 252.949 308.446 254.709 314.307 243.141 C 315.881 240.035 313.420 221.542 306.403 222.884 C 288.208 226.363 274.570 214.057 274.567 214.056 C 274.570 214.055 300.869 216.337 306.962 206.300 C 310.529 200.425 313.699 186.245 309.023 186.229 C 288.192 186.158 276.903 171.352 276.900 171.351 C 276.904 171.350 300.486 179.459 315.019 166.930 C 321.956 160.951 323.579 152.146 321.208 151.905 C 300.648 149.816 298.505 135.184 298.503 135.183 C 298.506 135.183 311.183 144.778 328.742 140.232 C 331.004 139.647 331.779 135.859 336.692 131.936 C 353.872 118.219 335.317 112.713 335.316 112.712 C 335.316 112.708 336.225 76.165 336.225 76.162 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 305.433 63.215 C 288.116 69.891 292.956 86.102 292.955 86.104 C 292.957 86.103 296.277 74.957 308.035 73.989 C 311.677 73.689 326.651 76.830 329.563 80.255 C 332.767 84.023 336.877 100.900 332.667 105.266 C 328.398 109.695 307.843 102.302 307.841 102.301 C 307.844 102.303 337.087 125.899 344.551 121.353 C 353.726 115.766 356.450 84.417 342.607 69.498 C 333.743 59.944 327.782 54.599 305.433 63.215 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 352.429 96.833 C 352.430 96.835 371.067 100.326 367.854 121.630 C 364.103 146.499 337.323 152.195 336.621 190.857 C 335.729 239.936 371.375 263.798 385.209 274.778 \\\"},\\\"children\\\":[]}]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tail_eagle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"longfeathers\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 369.018 349.616 C 369.023 349.627 422.008 467.869 448.275 514.228 C 457.931 531.270 478.491 556.135 507.668 552.628 C 499.785 569.052 454.313 586.341 418.411 530.924 C 405.210 510.547 360.424 343.611 360.420 343.598 C 360.420 343.599 369.017 349.616 369.018 349.616 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 368.777 361.075 C 368.780 361.087 403.359 490.034 422.506 541.488 C 429.544 560.404 446.418 588.602 476.652 590.259 C 465.980 605.149 419.015 612.363 392.888 551.318 C 383.129 528.516 361.016 353.562 361.013 353.548 C 361.014 353.549 368.776 361.074 368.777 361.075 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 368.052 355.112 C 368.053 355.126 383.897 506.715 393.636 568.689 C 396.920 589.588 404.118 617.744 437.344 631.333 C 390.388 637.568 366.592 625.276 359.899 560.972 C 355.562 519.308 361.179 345.611 361.179 345.596 C 361.180 345.597 368.051 355.111 368.052 355.112 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 350.982 349.616 C 350.977 349.627 297.992 467.869 271.725 514.228 C 262.069 531.270 241.509 556.135 212.332 552.628 C 220.215 569.052 265.687 586.341 301.589 530.924 C 314.790 510.547 359.576 343.611 359.581 343.598 C 359.580 343.599 350.983 349.616 350.982 349.616 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 351.223 361.075 C 351.220 361.087 316.641 490.034 297.494 541.488 C 290.456 560.404 273.582 588.602 243.348 590.259 C 254.020 605.149 300.985 612.363 327.112 551.318 C 336.871 528.516 358.984 353.562 358.987 353.548 C 358.986 353.549 351.224 361.074 351.223 361.075 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 351.948 355.112 C 351.947 355.126 336.103 506.715 326.364 568.689 C 323.080 589.588 315.882 617.744 282.656 631.333 C 329.612 637.568 353.408 625.276 360.101 560.972 C 364.438 519.308 358.821 345.611 358.821 345.596 C 358.820 345.597 351.949 355.111 351.948 355.112 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tail_eagle_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 511.958 C 365.176 501.606 373.733 499.733 378.291 489.094 C 382.318 479.695 379.400 470.667 378.291 466.230 C 373.718 447.939 346.281 447.940 341.709 466.230 C 340.600 470.666 337.682 479.695 341.709 489.094 C 346.267 499.733 354.824 501.606 360.000 511.958 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 457.085 C 360.000 473.852 360.000 490.618 360.000 507.385 M 341.709 489.094 C 346.267 499.733 354.824 501.606 360.000 511.958 C 365.176 501.606 373.733 499.733 378.291 489.094 C 382.318 479.695 379.400 470.667 378.291 466.230 C 373.718 447.939 346.281 447.940 341.709 466.230 C 340.600 470.666 337.682 479.695 341.709 489.094 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 332.829 493.548 C 340.508 484.888 349.258 485.294 356.414 476.197 C 362.737 468.161 362.255 458.684 362.332 454.112 C 362.649 435.261 336.147 428.160 326.996 444.644 C 324.777 448.642 319.621 456.608 321.078 466.729 C 322.728 478.185 330.508 482.209 332.829 493.548 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 347.031 440.544 C 342.692 456.740 338.352 472.935 334.012 489.131 M 321.078 466.729 C 322.728 478.185 330.508 482.209 332.829 493.548 C 340.508 484.888 349.258 485.294 356.414 476.197 C 362.737 468.161 362.255 458.684 362.332 454.112 C 362.649 435.261 336.147 428.160 326.996 444.644 C 324.777 448.642 319.621 456.608 321.078 466.729 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 387.171 493.548 C 389.492 482.209 397.272 478.185 398.922 466.729 C 400.379 456.608 395.223 448.642 393.004 444.644 C 383.853 428.160 357.351 435.261 357.668 454.112 C 357.745 458.684 357.263 468.161 363.586 476.197 C 370.742 485.294 379.492 484.888 387.171 493.548 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 372.969 440.544 C 377.308 456.740 381.648 472.935 385.988 489.131 M 363.586 476.197 C 370.742 485.294 379.492 484.888 387.171 493.548 C 389.492 482.209 397.272 478.185 398.922 466.729 C 400.379 456.608 395.223 448.642 393.004 444.644 C 383.853 428.160 357.351 435.261 357.668 454.112 C 357.745 458.684 357.263 468.161 363.586 476.197 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 459.774 C 365.176 449.422 373.733 447.548 378.291 436.910 C 382.318 427.511 379.400 418.482 378.291 414.046 C 373.718 395.755 346.281 395.755 341.709 414.046 C 340.600 418.482 337.682 427.511 341.709 436.910 C 346.267 447.548 354.824 449.422 360.000 459.774 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 402.194 C 360.000 419.863 360.000 437.532 360.000 455.201 M 341.709 436.910 C 346.267 447.548 354.824 449.422 360.000 459.774 C 365.176 449.422 373.733 447.548 378.291 436.910 C 382.318 427.511 379.400 418.482 378.291 414.046 C 373.718 395.755 346.281 395.755 341.709 414.046 C 340.600 418.482 337.682 427.511 341.709 436.910 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 403.060 458.839 C 405.380 447.500 413.161 443.476 414.811 432.020 C 416.268 421.899 411.112 413.933 408.893 409.935 C 399.742 393.451 373.240 400.552 373.557 419.403 C 373.634 423.975 373.152 433.452 379.474 441.488 C 386.631 450.585 395.381 450.179 403.060 458.839 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 388.649 405.835 C 392.988 422.031 397.328 438.226 401.667 454.422 M 379.474 441.488 C 386.631 450.585 395.381 450.179 403.060 458.839 C 405.380 447.500 413.161 443.476 414.811 432.020 C 416.268 421.899 411.112 413.933 408.893 409.935 C 399.742 393.451 373.240 400.552 373.557 419.403 C 373.634 423.975 373.152 433.452 379.474 441.488 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 316.940 458.839 C 324.619 450.179 333.369 450.585 340.526 441.488 C 346.848 433.452 346.366 423.975 346.443 419.403 C 346.760 400.552 320.258 393.451 311.107 409.935 C 308.888 413.933 303.732 421.899 305.190 432.020 C 306.839 443.476 314.620 447.500 316.940 458.839 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 331.142 405.835 C 326.803 422.031 322.463 438.226 318.124 454.422 M 305.190 432.020 C 306.839 443.476 314.620 447.500 316.940 458.839 C 324.619 450.179 333.369 450.585 340.526 441.488 C 346.848 433.452 346.366 423.975 346.443 419.403 C 346.760 400.552 320.258 393.451 311.107 409.935 C 308.888 413.933 303.732 421.899 305.190 432.020 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 332.829 422.931 C 340.508 414.271 349.258 414.677 356.414 405.580 C 362.737 397.544 362.255 388.067 362.332 383.495 C 362.649 364.644 336.147 357.543 326.996 374.027 C 324.777 378.025 319.621 385.991 321.078 396.112 C 322.728 407.568 330.508 411.592 332.829 422.931 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 347.031 369.927 C 342.692 386.123 338.352 402.319 334.012 418.514 M 321.078 396.112 C 322.728 407.568 330.508 411.592 332.829 422.931 C 340.508 414.271 349.258 414.677 356.414 405.580 C 362.737 397.544 362.255 388.067 362.332 383.495 C 362.649 364.644 336.147 357.543 326.996 374.027 C 324.777 378.025 319.621 385.991 321.078 396.112 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 387.171 422.931 C 389.492 411.592 397.272 407.568 398.922 396.112 C 400.379 385.991 395.223 378.025 393.004 374.027 C 383.853 357.543 357.351 364.644 357.668 383.495 C 357.745 388.067 357.263 397.544 363.586 405.580 C 370.742 414.677 379.492 414.271 387.171 422.931 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 372.969 369.927 C 377.308 386.123 381.648 402.319 385.988 418.514 M 363.586 405.580 C 370.742 414.677 379.492 414.271 387.171 422.931 C 389.492 411.592 397.272 407.568 398.922 396.112 C 400.379 385.991 395.223 378.025 393.004 374.027 C 383.853 357.543 357.351 364.644 357.668 383.495 C 357.745 388.067 357.263 397.544 363.586 405.580 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 342.004 C 373.862 342.004 385.044 353.186 385.044 367.048 C 385.044 380.910 373.862 392.092 360.000 392.092 C 346.138 392.092 334.956 380.910 334.956 367.048 C 334.956 353.186 346.138 342.004 360.000 342.004 Z\\\"},\\\"children\\\":[]}]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_eagle_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 453.308 228.316 C 463.923 219.334 513.040 211.791 530.760 197.245 C 558.164 174.751 563.808 140.921 557.306 119.238 C 550.715 97.264 524.041 100.111 524.037 100.109 C 524.042 100.108 536.162 77.794 575.603 84.307 C 596.798 87.807 612.742 104.813 612.746 104.815 C 612.748 104.817 623.546 121.712 626.130 128.801 C 640.941 169.428 630.864 218.203 647.961 269.777 C 665.218 321.831 715.324 397.015 715.330 397.028 C 715.325 397.026 674.533 409.446 629.490 322.936 C 614.776 294.675 604.334 243.612 604.331 243.604 C 604.333 243.612 611.295 295.527 621.242 326.126 C 634.425 366.679 666.254 428.623 666.259 428.633 C 666.255 428.631 618.514 434.801 583.331 327.858 C 573.961 299.377 569.263 250.413 569.261 250.405 C 569.262 250.413 570.869 302.043 578.302 332.678 C 587.878 372.144 617.185 431.950 617.189 431.960 C 617.181 431.951 562.409 419.084 543.998 342.136 C 538.659 319.818 536.615 282.347 536.615 282.341 C 536.615 282.346 535.490 314.939 537.065 334.893 C 539.619 367.259 546.492 409.496 546.493 409.504 C 546.489 409.496 513.092 398.428 505.326 333.819 C 503.067 315.030 501.444 284.289 501.444 284.284 C 501.443 284.288 498.336 309.230 498.981 324.600 C 500.155 352.584 501.581 390.368 501.581 390.375 C 501.578 390.367 470.944 375.192 468.175 312.645 C 467.570 298.977 467.379 276.737 467.379 276.733 C 467.379 276.736 465.018 290.179 465.088 303.252 C 465.212 326.202 462.491 348.785 462.491 348.789 C 462.489 348.783 434.479 336.143 437.540 283.916 C 439.302 253.856 445.369 235.034 453.308 228.316 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 453.308 228.316 C 463.923 219.334 513.040 211.791 530.760 197.245 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 530.760 197.245 C 558.164 174.751 563.808 140.921 557.306 119.238 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 557.306 119.238 C 550.715 97.264 524.041 100.111 524.037 100.109 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 524.037 100.109 C 524.042 100.108 536.162 77.794 575.603 84.307 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 575.603 84.307 C 596.798 87.807 612.742 104.813 612.746 104.815 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 474.225 292.230 C 474.223 292.224 428.974 284.054 453.308 228.316 C 463.923 219.334 513.040 211.791 530.760 197.245 C 558.164 174.751 563.808 140.921 557.306 119.238 C 550.715 97.264 524.041 100.111 524.037 100.109 C 524.042 100.108 536.162 77.794 575.603 84.307 C 596.798 87.807 612.742 104.813 612.746 104.815 C 649.544 144.030 632.521 203.993 665.120 263.699 C 644.156 263.504 629.517 262.471 617.221 221.919 C 612.530 206.449 610.923 180.168 610.922 180.164 C 610.922 180.168 611.036 206.647 611.785 222.991 C 612.712 243.214 625.456 259.567 631.375 277.179 C 600.298 271.238 592.923 264.228 584.108 244.792 C 578.662 232.783 580.011 210.417 580.010 210.414 C 580.010 210.417 580.915 226.815 580.570 238.772 C 579.780 266.092 591.202 290.430 591.203 290.436 C 591.199 290.432 560.110 292.587 552.514 255.386 C 550.434 245.199 552.491 228.090 552.491 228.088 C 552.490 228.090 549.197 242.343 548.445 251.278 C 546.100 279.138 551.234 301.335 551.234 301.340 C 551.230 301.336 525.782 294.487 517.414 263.989 C 514.774 254.367 513.621 238.072 513.621 238.069 C 513.621 238.072 515.115 252.879 512.967 262.195 C 509.205 278.509 510.438 301.457 510.438 301.461 C 510.435 301.456 479.912 294.360 481.707 254.295 C 481.889 250.225 480.942 243.627 480.942 243.626 C 480.942 243.628 479.590 251.922 477.923 258.164 C 473.476 274.822 474.225 292.227 474.225 292.230 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 493.460 264.443 C 493.456 264.439 451.694 272.181 453.160 228.006 C 463.775 219.024 512.892 211.481 530.612 196.935 C 558.016 174.441 563.660 140.611 557.158 118.929 C 550.568 96.955 523.893 99.801 523.890 99.800 C 523.895 99.798 533.877 77.830 573.378 79.842 C 592.512 80.817 596.348 83.842 608.810 93.126 C 638.846 118.901 624.486 133.956 656.266 146.336 C 641.195 157.012 616.483 164.831 603.245 128.330 C 591.405 95.686 563.871 98.087 563.867 98.084 C 563.871 98.087 587.960 97.656 601.441 127.547 C 612.688 152.483 607.311 157.361 633.904 183.887 C 606.780 187.792 582.999 185.064 583.603 162.672 C 584.281 137.580 574.889 128.939 574.889 128.936 C 574.889 128.940 584.324 138.667 582.392 165.104 C 581.716 174.364 594.610 182.166 594.523 184.526 C 593.516 211.759 605.646 223.004 605.647 223.008 C 605.643 223.007 560.604 242.850 563.847 211.481 C 565.521 195.295 561.210 184.978 561.210 184.975 C 561.210 184.979 566.860 196.785 561.740 219.772 C 557.586 238.426 570.775 249.076 570.776 249.079 C 570.772 249.077 530.215 252.746 531.540 234.948 C 532.743 218.785 531.534 213.428 531.534 213.426 C 531.533 213.428 534.950 227.639 529.007 236.222 C 522.285 245.929 529.497 260.581 529.497 260.584 C 529.494 260.582 493.096 269.468 495.050 240.622 C 495.544 233.328 494.352 227.665 494.352 227.664 C 494.351 227.665 497.681 235.172 492.203 244.088 C 484.642 256.397 493.460 264.441 493.460 264.443 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_eagle_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 267.366 228.316 C 256.751 219.334 207.634 211.791 189.914 197.245 C 162.510 174.751 156.866 140.921 163.369 119.238 C 169.959 97.264 196.634 100.111 196.637 100.109 C 196.632 100.108 184.513 77.794 145.071 84.307 C 123.876 87.807 107.932 104.813 107.928 104.815 C 107.927 104.817 97.129 121.712 94.544 128.801 C 79.733 169.428 89.810 218.203 72.713 269.777 C 55.456 321.831 5.350 397.015 5.344 397.028 C 5.349 397.026 46.141 409.446 91.184 322.936 C 105.898 294.675 116.341 243.612 116.343 243.604 C 116.341 243.612 109.379 295.527 99.432 326.126 C 86.250 366.679 54.421 428.623 54.415 428.633 C 54.419 428.631 102.160 434.801 137.343 327.858 C 146.713 299.377 151.411 250.413 151.413 250.405 C 151.412 250.413 149.806 302.043 142.372 332.678 C 132.796 372.144 103.490 431.950 103.486 431.960 C 103.493 431.951 158.265 419.084 176.676 342.136 C 182.016 319.818 184.059 282.347 184.060 282.341 C 184.060 282.346 185.184 314.939 183.609 334.893 C 181.055 367.259 174.182 409.496 174.181 409.504 C 174.185 409.496 207.582 398.428 215.349 333.819 C 217.607 315.030 219.230 284.289 219.231 284.284 C 219.231 284.288 222.338 309.230 221.693 324.600 C 220.520 352.584 219.093 390.368 219.093 390.375 C 219.096 390.367 249.730 375.192 252.499 312.645 C 253.104 298.977 253.295 276.737 253.295 276.733 C 253.295 276.736 255.657 290.179 255.586 303.252 C 255.462 326.202 258.183 348.785 258.183 348.789 C 258.186 348.783 286.195 336.143 283.134 283.916 C 281.372 253.856 275.305 235.034 267.366 228.316 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 267.366 228.316 C 256.751 219.334 207.634 211.791 189.914 197.245 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 189.914 197.245 C 162.510 174.751 156.866 140.921 163.369 119.238 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 163.369 119.238 C 169.959 97.264 196.634 100.111 196.637 100.109 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 196.637 100.109 C 196.632 100.108 184.513 77.794 145.071 84.307 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 145.071 84.307 C 123.876 87.807 107.932 104.813 107.928 104.815 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 246.449 292.230 C 246.452 292.224 291.700 284.054 267.366 228.316 C 256.751 219.334 207.634 211.791 189.914 197.245 C 162.510 174.751 156.866 140.921 163.369 119.238 C 169.959 97.264 196.634 100.111 196.637 100.109 C 196.632 100.108 184.513 77.794 145.071 84.307 C 123.876 87.807 107.932 104.813 107.928 104.815 C 71.131 144.030 88.153 203.993 55.555 263.699 C 76.519 263.504 91.157 262.471 103.454 221.919 C 108.145 206.449 109.752 180.168 109.752 180.164 C 109.752 180.168 109.639 206.647 108.889 222.991 C 107.962 243.214 95.218 259.567 89.300 277.179 C 120.376 271.238 127.751 264.228 136.566 244.792 C 142.012 232.783 140.664 210.417 140.664 210.414 C 140.664 210.417 139.759 226.815 140.104 238.772 C 140.894 266.092 129.472 290.430 129.471 290.436 C 129.475 290.432 160.564 292.587 168.160 255.386 C 170.241 245.199 168.184 228.090 168.184 228.088 C 168.184 228.090 171.477 242.343 172.229 251.278 C 174.574 279.138 169.441 301.335 169.440 301.340 C 169.444 301.336 194.892 294.487 203.260 263.989 C 205.900 254.367 207.053 238.072 207.053 238.069 C 207.053 238.072 205.560 252.879 207.708 262.195 C 211.469 278.509 210.236 301.457 210.236 301.461 C 210.239 301.456 240.762 294.360 238.967 254.295 C 238.785 250.225 239.732 243.627 239.732 243.626 C 239.732 243.628 241.084 251.922 242.751 258.164 C 247.198 274.822 246.449 292.227 246.449 292.230 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 227.214 264.443 C 227.218 264.439 268.980 272.181 267.514 228.006 C 256.899 219.024 207.782 211.481 190.062 196.935 C 162.658 174.441 157.014 140.611 163.517 118.929 C 170.107 96.955 196.781 99.801 196.785 99.800 C 196.780 99.798 186.797 77.830 147.296 79.842 C 128.162 80.817 124.326 83.842 111.864 93.126 C 81.828 118.901 96.188 133.956 64.409 146.336 C 79.479 157.012 104.192 164.831 117.430 128.330 C 129.269 95.686 156.803 98.087 156.807 98.084 C 156.804 98.087 132.715 97.656 119.233 127.547 C 107.986 152.483 113.363 157.361 86.770 183.887 C 113.894 187.792 137.676 185.064 137.071 162.672 C 136.393 137.580 145.785 128.939 145.786 128.936 C 145.785 128.940 136.350 138.667 138.282 165.104 C 138.959 174.364 126.064 182.166 126.151 184.526 C 127.158 211.759 115.028 223.004 115.027 223.008 C 115.031 223.007 160.070 242.850 156.827 211.481 C 155.153 195.295 159.464 184.978 159.464 184.975 C 159.464 184.979 153.814 196.785 158.934 219.772 C 163.089 238.426 149.899 249.076 149.898 249.079 C 149.902 249.077 190.459 252.746 189.134 234.948 C 187.931 218.785 189.141 213.428 189.141 213.426 C 189.141 213.428 185.724 227.639 191.667 236.222 C 198.389 245.929 191.177 260.581 191.177 260.584 C 191.180 260.582 227.578 269.468 225.624 240.622 C 225.130 233.328 226.323 227.665 226.323 227.664 C 226.323 227.665 222.994 235.172 228.471 244.088 C 236.032 256.397 227.214 264.441 227.214 264.443 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg_eagle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg_eagle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 168.028 520.166 C 168.028 520.166 162.314 513.922 162.314 513.921 C 162.312 513.923 150.726 530.262 150.724 530.263 C 150.726 530.262 168.026 520.167 168.028 520.166 M 200.656 531.435 C 200.810 531.303 206.129 530.434 206.131 530.818 C 206.216 544.781 198.751 548.553 198.750 548.554 C 198.750 548.553 201.978 539.012 200.656 531.435 M 153.976 480.424 C 154.121 480.282 155.458 475.061 155.076 475.025 C 141.174 473.705 136.757 480.807 136.755 480.807 C 136.757 480.807 146.546 478.437 153.976 480.424 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 221.111 453.772 C 221.110 453.774 213.359 461.841 207.857 467.567 C 204.519 471.041 201.182 474.514 198.345 477.466 C 195.810 480.106 190.505 485.626 190.504 485.627 C 190.504 485.627 187.423 483.137 185.021 481.575 C 181.572 479.026 177.272 476.439 173.572 475.616 C 173.097 475.510 172.629 475.404 172.215 475.309 C 167.512 474.234 163.600 473.217 160.368 472.743 C 156.165 472.127 152.980 472.343 150.463 474.304 C 149.845 474.785 149.680 479.242 150.194 480.371 C 152.036 484.414 156.368 481.886 169.354 487.330 C 173.711 489.157 180.597 493.886 180.598 493.886 C 180.597 493.887 176.744 498.086 173.527 501.031 C 170.328 504.235 166.371 507.632 162.714 509.713 C 158.788 511.946 160.256 519.217 161.154 520.256 C 162.089 521.339 169.482 523.940 172.255 520.140 C 172.971 519.159 173.792 518.159 174.643 517.256 C 176.824 514.777 179.438 512.288 181.902 510.178 C 185.178 507.201 189.602 503.727 189.603 503.726 C 189.603 503.727 193.703 511.005 195.138 515.507 C 196.291 519.129 196.922 522.072 197.309 524.508 C 198.338 530.995 197.553 533.607 200.374 535.207 C 201.453 535.820 205.907 536.049 206.441 535.476 C 208.657 533.098 209.132 529.870 208.859 525.535 C 208.651 522.223 207.972 518.200 207.327 513.446 C 207.276 513.072 207.228 512.709 207.180 512.341 C 206.671 508.456 204.340 503.764 202.066 500.073 C 200.776 497.675 198.706 494.590 198.706 494.590 C 198.707 494.589 204.086 490.267 207.528 487.502 C 210.965 484.741 214.732 481.714 218.226 478.907 C 226.225 472.481 233.143 466.923 233.145 466.922 C 233.145 466.922 221.113 453.774 221.111 453.772 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 180.598 493.886 C 182.441 494.634 184.666 495.823 186.222 497.547 C 187.863 499.366 188.906 501.857 189.603 503.726 C 189.914 503.644 193.001 502.152 195.963 501.339 C 198.607 500.173 200.326 500.268 202.066 500.073 C 200.776 497.675 198.706 494.590 198.706 494.590 C 197.747 492.815 197.540 491.171 195.831 489.267 C 194.007 487.237 190.505 485.628 190.504 485.627 C 190.504 485.627 187.423 483.137 185.021 481.575 C 184.692 483.290 184.095 485.539 183.260 487.457 C 182.111 490.096 179.905 492.865 179.904 492.866 M 207.857 467.567 C 209.135 468.434 212.142 470.560 213.747 472.297 C 215.435 474.124 217.407 477.457 218.226 478.907 C 226.225 472.481 233.143 466.923 233.145 466.922 C 233.145 466.922 221.113 453.774 221.111 453.772 C 221.110 453.774 213.359 461.841 207.857 467.567 C 204.519 471.041 201.182 474.514 198.345 477.466 C 199.760 478.403 202.018 480.017 203.665 481.817 C 205.313 483.618 206.721 486.010 207.528 487.502 C 210.965 484.741 214.732 481.714 218.226 478.907 M 169.354 487.330 C 169.354 487.330 171.435 483.762 172.029 480.497 C 172.573 478.841 172.297 476.868 172.215 475.309 C 167.512 474.234 163.600 473.217 160.368 472.743 C 160.700 474.217 160.994 476.005 161.045 477.669 C 161.141 480.745 160.206 484.422 160.206 484.423 M 195.138 515.507 C 195.138 515.506 198.684 513.520 201.902 513.141 C 203.710 512.929 205.709 513.212 207.327 513.446 C 207.276 513.072 207.228 512.709 207.180 512.341 C 206.671 508.456 204.340 503.764 202.066 500.073 M 197.309 524.508 C 198.995 524.294 201.514 524.083 203.746 524.332 C 205.479 524.525 207.318 525.026 208.859 525.535 C 208.651 522.223 207.972 518.200 207.327 513.446 M 173.527 501.031 C 175.106 501.866 177.347 502.956 178.814 504.558 C 180.308 506.189 181.209 508.566 181.902 510.178 C 185.178 507.201 189.602 503.727 189.603 503.726 C 189.603 503.727 193.703 511.005 195.138 515.507 C 196.291 519.129 196.922 522.072 197.309 524.508 C 198.338 530.995 197.553 533.607 200.374 535.207 C 201.453 535.820 205.907 536.049 206.441 535.476 C 208.657 533.098 209.132 529.870 208.859 525.535 M 165.837 507.825 C 165.837 507.826 168.903 509.683 170.902 511.799 C 173.101 514.126 173.823 515.765 174.643 517.256 C 176.824 514.777 179.438 512.288 181.902 510.178 M 198.706 494.590 C 198.707 494.589 204.086 490.267 207.528 487.502 M 172.255 520.140 C 172.971 519.159 173.792 518.159 174.643 517.256 M 161.154 520.256 C 162.089 521.339 169.482 523.940 172.255 520.140 M 162.714 509.713 C 158.788 511.946 160.256 519.217 161.154 520.256 M 173.527 501.031 C 170.328 504.235 166.371 507.632 162.714 509.713 M 180.598 493.886 C 180.597 493.887 176.744 498.086 173.527 501.031 M 169.354 487.330 C 173.711 489.157 180.597 493.886 180.598 493.886 M 150.194 480.371 C 152.036 484.414 156.368 481.886 169.354 487.330 M 150.463 474.304 C 149.845 474.785 149.680 479.242 150.194 480.371 M 160.368 472.743 C 156.165 472.127 152.980 472.343 150.463 474.304 M 173.572 475.616 C 173.097 475.510 172.629 475.404 172.215 475.309 M 185.021 481.575 C 181.572 479.026 177.272 476.439 173.572 475.616 M 198.345 477.466 C 195.810 480.106 190.505 485.626 190.504 485.627 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 216.977 469.637 C 228.194 466.442 235.407 471.529 246.417 467.680 C 256.143 464.280 260.870 455.969 263.413 452.127 C 273.900 436.284 255.235 415.888 238.527 424.932 C 234.475 427.125 225.778 431.098 221.531 440.485 C 216.723 451.111 221.151 458.746 216.977 469.637 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 257.769 432.308 C 245.305 443.714 232.840 455.120 220.376 466.526 M 221.531 440.485 C 216.723 451.111 221.151 458.746 216.977 469.637 C 228.194 466.442 235.407 471.529 246.417 467.680 C 256.143 464.280 260.870 455.969 263.413 452.127 C 273.900 436.284 255.235 415.888 238.527 424.932 C 234.475 427.125 225.778 431.098 221.531 440.485 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 212.179 436.914 C 223.840 436.731 229.491 443.512 241.122 442.644 C 251.397 441.877 258.114 435.072 261.565 432.019 C 275.795 419.431 263.045 394.899 244.566 399.310 C 240.084 400.380 230.655 401.966 224.123 409.934 C 216.728 418.954 219.030 427.475 212.179 436.914 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 261.243 411.415 C 246.251 419.206 231.259 426.997 216.268 434.789 M 224.123 409.934 C 216.728 418.954 219.030 427.475 212.179 436.914 C 223.840 436.731 229.491 443.512 241.122 442.644 C 251.397 441.877 258.114 435.072 261.565 432.019 C 275.795 419.431 263.045 394.899 244.566 399.310 C 240.084 400.380 230.655 401.966 224.123 409.934 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 249.146 477.312 C 259.154 471.323 267.439 474.369 277.077 467.802 C 285.592 462.001 288.007 452.749 289.469 448.380 C 295.498 430.363 272.190 415.493 258.393 428.552 C 255.046 431.720 247.674 437.808 246.000 447.975 C 244.106 459.483 250.360 465.712 249.146 477.312 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 278.888 430.697 C 269.800 444.940 260.712 459.184 251.625 473.427 M 246.000 447.975 C 244.106 459.483 250.360 465.712 249.146 477.312 C 259.154 471.323 267.439 474.369 277.077 467.802 C 285.592 462.001 288.007 452.749 289.469 448.380 C 295.498 430.363 272.190 415.493 258.393 428.552 C 255.046 431.720 247.674 437.808 246.000 447.975 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 255.770 434.137 C 266.987 430.943 274.201 436.030 285.210 432.181 C 294.937 428.781 299.664 420.469 302.207 416.627 C 312.694 400.785 294.029 380.389 277.321 389.432 C 273.269 391.625 264.572 395.598 260.324 404.986 C 255.516 415.611 259.945 423.247 255.770 434.137 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 296.563 396.808 C 284.099 408.214 271.634 419.620 259.170 431.026 M 260.324 404.986 C 255.516 415.611 259.945 423.247 255.770 434.137 C 266.987 430.943 274.201 436.030 285.210 432.181 C 294.937 428.781 299.664 420.469 302.207 416.627 C 312.694 400.785 294.029 380.389 277.321 389.432 C 273.269 391.625 264.572 395.598 260.324 404.986 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 285.758 465.512 C 295.766 459.523 304.050 462.569 313.688 456.002 C 322.203 450.201 324.618 440.949 326.080 436.580 C 332.109 418.563 308.802 403.693 295.004 416.752 C 291.657 419.920 284.285 426.008 282.612 436.175 C 280.718 447.683 286.972 453.912 285.758 465.512 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 315.357 418.741 C 306.269 432.985 297.182 447.228 288.094 461.472 M 282.612 436.175 C 280.718 447.683 286.972 453.912 285.758 465.512 C 295.766 459.523 304.050 462.569 313.688 456.002 C 322.203 450.201 324.618 440.949 326.080 436.580 C 332.109 418.563 308.802 403.693 295.004 416.752 C 291.657 419.920 284.285 426.008 282.612 436.175 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 227.173 401.490 C 238.834 401.308 244.485 408.089 256.116 407.220 C 266.391 406.454 273.108 399.649 276.559 396.596 C 290.789 384.008 278.039 359.476 259.560 363.887 C 255.078 364.956 245.649 366.543 239.116 374.511 C 231.722 383.530 234.024 392.052 227.173 401.490 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 276.237 375.991 C 261.245 383.783 246.253 391.574 231.261 399.365 M 239.116 374.511 C 231.722 383.530 234.024 392.052 227.173 401.490 C 238.834 401.308 244.485 408.089 256.116 407.220 C 266.391 406.454 273.108 399.649 276.559 396.596 C 290.789 384.008 278.039 359.476 259.560 363.887 C 255.078 364.956 245.649 366.543 239.116 374.511 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 261.601 391.688 C 273.263 391.505 278.914 398.286 290.544 397.418 C 300.819 396.651 307.537 389.846 310.988 386.793 C 325.217 374.205 312.467 349.673 293.988 354.084 C 289.507 355.154 280.077 356.740 273.545 364.708 C 266.151 373.728 268.452 382.249 261.601 391.688 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 310.665 366.189 C 295.674 373.980 280.682 381.772 265.690 389.563 M 273.545 364.708 C 266.151 373.728 268.452 382.249 261.601 391.688 C 273.263 391.505 278.914 398.286 290.544 397.418 C 300.819 396.651 307.537 389.846 310.988 386.793 C 325.217 374.205 312.467 349.673 293.988 354.084 C 289.507 355.154 280.077 356.740 273.545 364.708 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 298.569 432.086 C 308.577 426.097 316.861 429.144 326.499 422.577 C 335.014 416.775 337.429 407.523 338.891 403.154 C 344.921 385.137 321.613 370.267 307.815 383.326 C 304.468 386.494 297.096 392.582 295.423 402.749 C 293.529 414.257 299.783 420.486 298.569 432.086 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 328.310 385.471 C 319.222 399.714 310.135 413.958 301.047 428.201 M 295.423 402.749 C 293.529 414.257 299.783 420.486 298.569 432.086 C 308.577 426.097 316.861 429.144 326.499 422.577 C 335.014 416.775 337.429 407.523 338.891 403.154 C 344.921 385.137 321.613 370.267 307.815 383.326 C 304.468 386.494 297.096 392.582 295.423 402.749 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 287.163 405.410 C 298.380 402.215 305.594 407.302 316.603 403.453 C 326.329 400.053 331.057 391.742 333.600 387.900 C 344.087 372.057 325.422 351.661 308.714 360.705 C 304.662 362.898 295.965 366.871 291.717 376.258 C 286.909 386.884 291.338 394.519 287.163 405.410 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 327.956 368.081 C 315.491 379.487 303.027 390.893 290.563 402.299 M 291.717 376.258 C 286.909 386.884 291.338 394.519 287.163 405.410 C 298.380 402.215 305.594 407.302 316.603 403.453 C 326.329 400.053 331.057 391.742 333.600 387.900 C 344.087 372.057 325.422 351.661 308.714 360.705 C 304.662 362.898 295.965 366.871 291.717 376.258 \\\"},\\\"children\\\":[]}]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg_eagle_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg_eagle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 549.397 517.872 C 549.397 517.872 555.382 511.887 555.382 511.886 C 555.383 511.888 566.235 528.724 566.236 528.726 C 566.235 528.724 549.399 517.873 549.397 517.872 M 516.302 527.685 C 516.153 527.546 510.879 526.442 510.859 526.825 C 510.157 540.772 517.447 544.870 517.448 544.872 C 517.448 544.870 514.646 535.195 516.302 527.685 M 565.195 478.791 C 565.057 478.643 563.953 473.368 564.336 473.349 C 578.282 472.646 582.380 479.936 582.382 479.937 C 582.381 479.937 572.706 477.135 565.195 478.791 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 499.306 449.192 C 499.308 449.193 506.694 457.596 511.937 463.560 C 515.117 467.178 518.298 470.796 521.001 473.871 C 523.417 476.620 528.472 482.371 528.472 482.371 C 528.473 482.371 531.661 480.020 534.130 478.566 C 537.688 476.172 542.099 473.778 545.831 473.120 C 546.311 473.035 546.783 472.950 547.201 472.874 C 551.947 472.008 555.900 471.165 559.150 470.835 C 563.376 470.406 566.548 470.763 568.977 472.833 C 569.572 473.341 569.540 477.801 568.976 478.906 C 566.957 482.864 562.742 480.146 549.527 485.010 C 545.093 486.642 538.004 491.060 538.003 491.061 C 538.004 491.062 541.667 495.428 544.751 498.513 C 547.805 501.854 551.607 505.423 555.169 507.664 C 558.992 510.069 557.204 517.268 556.261 518.267 C 555.279 519.307 547.777 521.578 545.175 517.658 C 544.503 516.647 543.728 515.612 542.918 514.672 C 540.849 512.099 538.347 509.496 535.979 507.280 C 532.838 504.160 528.573 500.493 528.572 500.493 C 528.571 500.494 524.152 507.582 522.520 512.016 C 521.207 515.584 520.447 518.496 519.953 520.913 C 518.637 527.347 519.306 529.992 516.416 531.466 C 515.312 532.029 510.851 532.061 510.344 531.466 C 508.234 528.991 507.904 525.745 508.368 521.427 C 508.723 518.128 509.579 514.139 510.434 509.418 C 510.501 509.046 510.566 508.686 510.630 508.321 C 511.311 504.462 513.847 499.878 516.282 496.291 C 517.677 493.952 519.882 490.962 519.882 490.962 C 519.881 490.961 514.698 486.405 511.382 483.490 C 508.071 480.580 504.442 477.389 501.076 474.430 C 493.369 467.655 486.705 461.797 486.703 461.796 C 486.703 461.796 499.305 449.193 499.306 449.192 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.003 491.061 C 536.129 491.727 533.854 492.816 532.223 494.470 C 530.502 496.214 529.350 498.656 528.572 500.493 C 528.264 500.397 525.247 498.769 522.323 497.826 C 519.733 496.544 518.012 496.563 516.282 496.291 C 517.677 493.952 519.882 490.962 519.882 490.962 C 520.918 489.232 521.198 487.598 522.990 485.772 C 524.902 483.824 528.472 482.372 528.472 482.371 C 528.473 482.371 531.661 480.020 534.130 478.566 C 534.383 480.294 534.879 482.567 535.629 484.520 C 536.660 487.207 538.741 490.072 538.742 490.072 M 511.937 463.560 C 510.622 464.370 507.524 466.360 505.844 468.025 C 504.076 469.775 501.958 473.018 501.076 474.430 C 493.369 467.655 486.705 461.797 486.703 461.796 C 486.703 461.796 499.305 449.193 499.306 449.192 C 499.308 449.193 506.694 457.596 511.937 463.560 C 515.117 467.178 518.298 470.796 521.001 473.871 C 519.546 474.744 517.219 476.257 515.493 477.982 C 513.768 479.708 512.255 482.036 511.382 483.490 C 508.071 480.580 504.442 477.389 501.076 474.430 M 549.527 485.010 C 549.527 485.009 547.605 481.352 547.157 478.065 C 546.687 476.386 547.050 474.428 547.201 472.874 C 551.947 472.008 555.900 471.165 559.150 470.835 C 558.753 472.293 558.380 474.065 558.255 475.726 C 558.023 478.795 558.794 482.510 558.794 482.510 M 522.520 512.016 C 522.520 512.016 519.066 509.874 515.867 509.354 C 514.071 509.061 512.061 509.256 510.434 509.418 C 510.501 509.046 510.566 508.686 510.630 508.321 C 511.311 504.462 513.847 499.878 516.282 496.291 M 519.953 520.913 C 518.278 520.624 515.771 520.302 513.529 520.452 C 511.790 520.568 509.930 520.987 508.368 521.427 C 508.723 518.128 509.579 514.139 510.434 509.418 M 544.751 498.513 C 543.136 499.277 540.850 500.266 539.312 501.802 C 537.748 503.365 536.743 505.700 535.979 507.280 C 532.838 504.160 528.573 500.493 528.572 500.493 C 528.571 500.494 524.152 507.582 522.520 512.016 C 521.207 515.584 520.447 518.496 519.953 520.913 C 518.637 527.347 519.306 529.992 516.416 531.466 C 515.312 532.029 510.851 532.061 510.344 531.466 C 508.234 528.991 507.904 525.745 508.368 521.427 M 552.133 505.640 C 552.132 505.641 548.987 507.360 546.896 509.386 C 544.597 511.613 543.803 513.219 542.918 514.672 C 540.849 512.099 538.347 509.496 535.979 507.280 M 519.882 490.962 C 519.881 490.961 514.698 486.405 511.382 483.490 M 545.175 517.658 C 544.503 516.647 543.728 515.612 542.918 514.672 M 556.261 518.267 C 555.279 519.307 547.777 521.578 545.175 517.658 M 555.169 507.664 C 558.992 510.069 557.204 517.268 556.261 518.267 M 544.751 498.513 C 547.805 501.854 551.607 505.423 555.169 507.664 M 538.003 491.061 C 538.004 491.062 541.667 495.428 544.751 498.513 M 549.527 485.010 C 545.093 486.642 538.004 491.060 538.003 491.061 M 568.976 478.906 C 566.957 482.864 562.742 480.146 549.527 485.010 M 568.977 472.833 C 569.572 473.341 569.540 477.801 568.976 478.906 M 559.150 470.835 C 563.376 470.406 566.548 470.763 568.977 472.833 M 545.831 473.120 C 546.311 473.035 546.783 472.950 547.201 472.874 M 534.130 478.566 C 537.688 476.172 542.099 473.778 545.831 473.120 M 521.001 473.871 C 523.417 476.620 528.472 482.371 528.472 482.371 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 502.734 465.224 C 491.670 461.536 484.238 466.298 473.410 461.966 C 463.844 458.138 459.490 449.626 457.119 445.674 C 447.344 429.383 466.894 409.834 483.185 419.608 C 487.136 421.979 495.649 426.333 499.476 435.900 C 503.809 446.728 499.046 454.159 502.734 465.224 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 463.635 426.125 C 475.582 438.072 487.529 450.019 499.476 461.966 M 499.476 435.900 C 503.809 446.728 499.046 454.159 502.734 465.224 C 491.670 461.536 484.238 466.298 473.410 461.966 C 463.844 458.138 459.490 449.626 457.119 445.674 C 447.344 429.383 466.894 409.834 483.185 419.608 C 487.136 421.979 495.649 426.333 499.476 435.900 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 508.977 432.746 C 497.335 432.047 491.389 438.570 479.809 437.188 C 469.578 435.967 463.168 428.871 459.856 425.668 C 446.198 412.462 460.022 388.519 478.287 393.744 C 482.717 395.011 492.067 397.014 498.240 405.264 C 505.228 414.602 502.551 423.013 508.977 432.746 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 461.090 405.098 C 475.722 413.546 490.354 421.994 504.986 430.442 M 498.240 405.264 C 505.228 414.602 502.551 423.013 508.977 432.746 C 497.335 432.047 491.389 438.570 479.809 437.188 C 469.578 435.967 463.168 428.871 459.856 425.668 C 446.198 412.462 460.022 388.519 478.287 393.744 C 482.717 395.011 492.067 397.014 498.240 405.264 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 470.256 471.466 C 460.523 465.040 452.112 467.717 442.774 460.729 C 434.525 454.556 432.522 445.207 431.255 440.777 C 426.030 422.511 449.973 408.687 463.179 422.345 C 466.382 425.658 473.478 432.067 474.699 442.298 C 476.081 453.879 469.557 459.824 470.256 471.466 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 442.609 423.580 C 451.057 438.212 459.505 452.844 467.952 467.476 M 474.699 442.298 C 476.081 453.879 469.557 459.824 470.256 471.466 C 460.523 465.040 452.112 467.717 442.774 460.729 C 434.525 454.556 432.522 445.207 431.255 440.777 C 426.030 422.511 449.973 408.687 463.179 422.345 C 466.382 425.658 473.478 432.067 474.699 442.298 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 465.551 428.041 C 454.487 424.353 447.055 429.115 436.227 424.783 C 426.661 420.955 422.306 412.442 419.936 408.491 C 410.161 392.200 429.711 372.651 446.002 382.425 C 449.953 384.796 458.465 389.150 462.293 398.716 C 466.626 409.545 461.863 416.976 465.551 428.041 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 426.452 388.942 C 438.399 400.889 450.346 412.836 462.293 424.783 M 462.293 398.716 C 466.626 409.545 461.863 416.976 465.551 428.041 C 454.487 424.353 447.055 429.115 436.227 424.783 C 426.661 420.955 422.306 412.442 419.936 408.491 C 410.161 392.200 429.711 372.651 446.002 382.425 C 449.953 384.796 458.465 389.150 462.293 398.716 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 434.204 458.056 C 424.471 451.630 416.060 454.307 406.722 447.319 C 398.472 441.146 396.469 431.797 395.202 427.367 C 389.977 409.101 413.921 395.277 427.126 408.935 C 430.329 412.248 437.425 418.657 438.646 428.888 C 440.028 440.468 433.505 446.414 434.204 458.056 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 406.705 410.021 C 415.153 424.653 423.601 439.285 432.049 453.917 M 438.646 428.888 C 440.028 440.468 433.505 446.414 434.204 458.056 C 424.471 451.630 416.060 454.307 406.722 447.319 C 398.472 441.146 396.469 431.797 395.202 427.367 C 389.977 409.101 413.921 395.277 427.126 408.935 C 430.329 412.248 437.425 418.657 438.646 428.888 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 495.567 396.693 C 483.925 395.994 477.979 402.518 466.398 401.135 C 456.168 399.914 449.758 392.819 446.446 389.616 C 432.788 376.409 446.612 352.466 464.877 357.691 C 469.307 358.959 478.657 360.962 484.830 369.211 C 491.817 378.549 489.141 386.960 495.567 396.693 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 447.680 369.046 C 462.312 377.493 476.944 385.941 491.576 394.389 M 484.830 369.211 C 491.817 378.549 489.141 386.960 495.567 396.693 C 483.925 395.994 477.979 402.518 466.398 401.135 C 456.168 399.914 449.758 392.819 446.446 389.616 C 432.788 376.409 446.612 352.466 464.877 357.691 C 469.307 358.959 478.657 360.962 484.830 369.211 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 461.606 385.375 C 449.965 384.676 444.019 391.200 432.438 389.817 C 422.207 388.596 415.798 381.501 412.485 378.298 C 398.827 365.091 412.651 341.148 430.917 346.374 C 435.347 347.641 444.696 349.644 450.869 357.893 C 457.857 367.231 455.180 375.642 461.606 385.375 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 413.720 357.728 C 428.352 366.175 442.984 374.623 457.616 383.071 M 450.869 357.893 C 457.857 367.231 455.180 375.642 461.606 385.375 C 449.965 384.676 444.019 391.200 432.438 389.817 C 422.207 388.596 415.798 381.501 412.485 378.298 C 398.827 365.091 412.651 341.148 430.917 346.374 C 435.347 347.641 444.696 349.644 450.869 357.893 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 422.886 424.096 C 413.153 417.670 404.742 420.346 395.404 413.359 C 387.154 407.186 385.152 397.836 383.884 393.406 C 378.659 375.140 402.603 361.317 415.808 374.975 C 419.011 378.287 426.107 384.696 427.328 394.927 C 428.710 406.508 422.187 412.454 422.886 424.096 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 395.238 376.209 C 403.686 390.841 412.134 405.473 420.582 420.105 M 427.328 394.927 C 428.710 406.508 422.187 412.454 422.886 424.096 C 413.153 417.670 404.742 420.346 395.404 413.359 C 387.154 407.186 385.152 397.836 383.884 393.406 C 378.659 375.140 402.603 361.317 415.808 374.975 C 419.011 378.287 426.107 384.696 427.328 394.927 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 435.462 397.951 C 424.397 394.263 416.966 399.025 406.137 394.693 C 396.571 390.865 392.217 382.353 389.846 378.402 C 380.071 362.110 399.621 342.561 415.912 352.335 C 419.863 354.706 428.376 359.061 432.203 368.627 C 436.536 379.455 431.774 386.887 435.462 397.951 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 396.363 358.852 C 408.310 370.799 420.257 382.746 432.203 394.693 M 432.203 368.627 C 436.536 379.455 431.774 386.887 435.462 397.951 C 424.397 394.263 416.966 399.025 406.137 394.693 C 396.571 390.865 392.217 382.353 389.846 378.402 C 380.071 362.110 399.621 342.561 415.912 352.335 C 419.863 354.706 428.376 359.061 432.203 368.627 \\\"},\\\"children\\\":[]}]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"shield\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"shield\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 236.126 173.480 C 236.151 173.480 483.849 173.480 483.874 173.480 C 483.874 173.501 506.095 297.411 483.874 387.443 C 464.177 467.246 360.012 511.305 360.000 511.317 C 359.988 511.305 255.823 467.246 236.126 387.443 C 213.905 297.411 236.126 173.501 236.126 173.480 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":244.746,\\\"max\\\":475.254},\\\"y\\\":{\\\"min\\\":190.383,\\\"max\\\":457.2}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":695.328,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":40.436,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":63.613,\\\"y\\\":242.447,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874940847915,\\\"y\\\":0.005001167265653793}},{\\\"point\\\":{\\\"x\\\":656.387,\\\"y\\\":242.447,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874940847915,\\\"y\\\":0.005001167265653793}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":558.834,\\\"y\\\":521.145,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.712890063991706,\\\"y\\\":0.7012758064142106}},{\\\"point\\\":{\\\"x\\\":161.003,\\\"y\\\":521.186,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987374608604087,\\\"y\\\":0.71537819423739}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":558.973,\\\"y\\\":90.697,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314144323869134,\\\"y\\\":-0.7754455587425283}},{\\\"point\\\":{\\\"x\\\":161.703,\\\"y\\\":90.764,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817962317794365,\\\"y\\\":-0.7315421370853226}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":550.725,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"egg\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":127.45386221540934,\\\"max\\\":592.5468343300855},\\\"y\\\":{\\\"min\\\":13.528,\\\"max\\\":650.033}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"egg\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"egg\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6CE5DBD2-CC60-459D-9650-8B059AB54BD3_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 15.528 C 470.069 15.528 625.198 262.332 583.646 448.465 C 558.086 562.959 477.312 648.033 360.000 648.033 C 242.688 648.033 161.914 562.959 136.355 448.465 C 94.802 262.332 249.931 15.528 360.000 15.528 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 130.806 371.193 C 157.441 348.363 210.704 302.709 210.712 302.703 C 210.717 302.709 265.641 369.046 265.646 369.053 C 265.652 369.049 324.856 330.531 324.862 330.527 C 324.868 330.529 368.144 346.698 389.785 354.784 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":189.648,\\\"max\\\":530.352},\\\"y\\\":{\\\"min\\\":197.433,\\\"max\\\":538.136}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.254,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":18.937,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":131.098,\\\"y\\\":397.504,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872087043342,\\\"y\\\":0.005057907444228417}},{\\\"point\\\":{\\\"x\\\":588.902,\\\"y\\\":397.504,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872087043342,\\\"y\\\":0.005057907444228422}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":509.197,\\\"y\\\":587.62,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.712919276649926,\\\"y\\\":0.7012461087100207}},{\\\"point\\\":{\\\"x\\\":210.62,\\\"y\\\":587.665,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986913597264861,\\\"y\\\":0.7154232200897269}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":444.012,\\\"y\\\":54.666,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314096317746991,\\\"y\\\":-0.7754494676651335}},{\\\"point\\\":{\\\"x\\\":276.635,\\\"y\\\":54.741,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817663038045618,\\\"y\\\":-0.7315700287714538}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":646.718,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"6CE5DBD2-CC60-459D-9650-8B059AB54BD3_0\\\",\\\"cx\\\":\\\"49.50%\\\",\\\"cy\\\":\\\"55.98%\\\",\\\"r\\\":\\\"64.40%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"37.25%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"eggshell\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":11.042,\\\"max\\\":710.905},\\\"y\\\":{\\\"min\\\":299.606,\\\"max\\\":656.89}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eggshell\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"egg\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#AC45C005-9D10-4014-ADEF-FAD44ABB36DB_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 581.897 305.503 C 581.898 305.517 593.561 401.910 583.646 448.465 C 559.208 563.204 477.312 648.033 360.000 648.033 C 242.688 648.033 161.915 562.959 136.355 448.465 C 130.537 422.407 129.730 369.369 129.729 369.361 C 129.737 369.354 210.703 302.709 210.712 302.703 C 210.716 302.711 256.536 389.279 256.541 389.287 C 256.547 389.282 324.855 330.533 324.862 330.527 C 324.870 330.535 401.841 414.941 401.849 414.949 C 401.854 414.938 454.885 301.617 454.890 301.606 C 454.898 301.613 527.837 374.910 527.844 374.917 C 527.850 374.910 581.892 305.510 581.897 305.503 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#AC45C005-9D10-4014-ADEF-FAD44ABB36DB_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 494.793 627.639 C 494.802 627.636 580.429 600.392 580.438 600.389 C 580.438 600.385 584.930 560.828 584.930 560.824 C 584.935 560.823 634.315 551.690 634.320 551.689 C 634.323 551.683 669.972 492.366 669.975 492.360 C 669.971 492.373 679.174 590.504 625.206 621.800 C 566.244 655.993 494.806 627.639 494.793 627.639 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#AC45C005-9D10-4014-ADEF-FAD44ABB36DB_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 688.467 654.890 C 688.462 654.888 640.783 632.508 640.778 632.505 C 640.785 632.504 708.898 614.016 708.905 614.014 C 708.903 614.018 688.469 654.886 688.467 654.890 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"url(#AC45C005-9D10-4014-ADEF-FAD44ABB36DB_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 109.392 638.345 C 109.402 638.342 205.733 606.232 205.742 606.228 C 205.741 606.233 193.092 654.885 193.090 654.890 C 193.082 654.888 109.400 638.347 109.392 638.345 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"url(#AC45C005-9D10-4014-ADEF-FAD44ABB36DB_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 13.042 649.051 C 13.047 649.043 18.929 600.167 58.784 572.165 C 100.896 542.578 159.990 550.756 160.001 550.754 C 159.997 550.757 129.558 580.543 129.555 580.546 C 129.554 580.549 121.496 611.310 121.496 611.313 C 121.491 611.313 75.333 611.095 75.329 611.095 C 75.326 611.098 51.974 647.100 51.971 647.104 C 51.967 647.104 13.046 649.050 13.042 649.051 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":152.902,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":131.098,\\\"y\\\":397.504,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872087043342,\\\"y\\\":0.005057907444228417}},{\\\"point\\\":{\\\"x\\\":588.902,\\\"y\\\":397.504,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872087043342,\\\"y\\\":0.005057907444228422}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":408.198,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"AC45C005-9D10-4014-ADEF-FAD44ABB36DB_0\\\",\\\"cx\\\":\\\"50.14%\\\",\\\"cy\\\":\\\"39.59%\\\",\\\"r\\\":\\\"85.42%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"AC45C005-9D10-4014-ADEF-FAD44ABB36DB_1\\\",\\\"cx\\\":\\\"53.77%\\\",\\\"cy\\\":\\\"51.15%\\\",\\\"r\\\":\\\"73.99%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"AC45C005-9D10-4014-ADEF-FAD44ABB36DB_2\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"119.93%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"AC45C005-9D10-4014-ADEF-FAD44ABB36DB_3\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"109.03%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"AC45C005-9D10-4014-ADEF-FAD44ABB36DB_4\\\",\\\"cx\\\":\\\"52.37%\\\",\\\"cy\\\":\\\"58.11%\\\",\\\"r\\\":\\\"75.85%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"emperor\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":137.378,\\\"max\\\":582.621},\\\"y\\\":{\\\"min\\\":58.74640270913094,\\\"max\\\":660.725}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"emperor\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"emperor\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 215.502 425.414 C 215.531 425.414 504.467 425.414 504.496 425.414 C 504.496 425.434 504.496 626.880 504.496 626.900 C 504.467 626.900 215.531 626.900 215.502 626.900 C 215.502 626.880 215.502 425.434 215.502 425.414 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2\\\",\\\"fill\\\":\\\"url(#2290D8ED-A93A-4C25-B708-A7A17043370F_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 138.378 623.927 C 138.422 623.927 581.577 623.927 581.621 623.927 C 581.621 623.930 581.621 659.721 581.621 659.725 C 581.577 659.725 138.422 659.725 138.378 659.725 C 138.378 659.721 138.378 623.930 138.378 623.927 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#2290D8ED-A93A-4C25-B708-A7A17043370F_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 229.442 66.479 C 229.469 66.479 490.530 66.479 490.556 66.479 C 490.556 66.514 490.556 416.955 490.556 416.990 C 490.530 416.990 229.469 416.990 229.442 416.990 C 229.442 416.955 229.442 66.514 229.442 66.479 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 269.650 361.539 C 269.650 361.513 269.650 107.743 269.650 107.717 C 269.668 107.717 450.330 107.717 450.349 107.717 C 450.349 107.743 450.349 361.513 450.349 361.539 C 450.330 361.539 269.668 361.539 269.650 361.539 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 496.951 89.596 C 503.080 91.253 507.065 91.923 512.122 93.086 C 517.736 81.549 512.957 67.712 501.420 62.098 C 489.882 56.484 476.045 61.263 470.431 72.801 C 464.818 84.339 469.596 98.175 481.134 103.789 C 474.516 97.381 473.213 85.546 480.754 80.256 C 491.588 72.657 499.173 81.904 496.951 89.596 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 223.646 89.596 C 217.517 91.253 213.532 91.923 208.475 93.086 C 202.861 81.548 207.640 67.712 219.178 62.098 C 230.716 56.484 244.552 61.263 250.166 72.801 C 255.780 84.339 251.001 98.175 239.464 103.789 C 246.081 97.381 247.384 85.546 239.843 80.256 C 229.009 72.657 221.425 81.904 223.646 89.596 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 491.257 135.468 C 491.258 135.463 467.004 97.256 497.388 84.605 C 501.975 87.317 508.324 90.966 512.166 92.768 C 502.851 124.395 491.259 135.464 491.257 135.468 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 229.340 135.468 C 229.340 135.463 253.593 97.257 223.209 84.605 C 218.622 87.317 212.274 90.966 208.431 92.768 C 217.746 124.395 229.338 135.464 229.340 135.468 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 374.256 512.623 C 429.837 511.534 472.073 437.912 475.098 452.982 C 451.697 498.969 395.598 609.218 395.590 609.233 C 395.594 609.236 436.704 639.140 436.708 639.143 C 436.701 639.143 364.427 639.143 364.419 639.143 C 364.420 639.130 374.255 512.638 374.256 512.623 M 345.743 512.623 C 292.664 513.403 253.956 443.440 244.900 452.982 C 270.672 503.629 324.401 609.218 324.409 609.233 C 324.405 609.236 283.294 639.140 283.290 639.143 C 283.297 639.143 355.572 639.143 355.579 639.143 C 355.578 639.130 345.744 512.636 345.743 512.623 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S38\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 236.884 303.102 C 366.092 530.180 485.792 297.678 531.478 439.134 C 523.178 434.265 508.094 425.246 496.458 426.295 C 448.286 430.642 445.063 502.297 360.503 501.934 C 276.122 501.571 271.715 434.690 223.541 430.923 C 212.309 430.045 188.524 439.133 188.520 439.134 C 188.525 439.121 236.879 303.115 236.884 303.102 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 236.884 303.102 C 366.092 530.180 485.792 297.678 531.478 439.134 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S39\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 236.884 303.102 C 366.092 530.180 485.792 297.678 531.478 439.134 C 533.408 423.866 456.347 227.811 456.340 227.790 C 456.320 227.790 263.678 227.790 263.659 227.790 C 263.656 227.798 236.886 303.094 236.884 303.102 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S29\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 319.611 160.036 C 319.619 160.036 400.380 160.036 400.388 160.036 C 400.389 160.046 417.223 254.749 417.224 254.758 C 417.213 254.758 302.786 254.758 302.774 254.758 C 302.776 254.749 319.609 160.046 319.611 160.036 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S30\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 392.522 224.084 C 387.335 342.599 360.003 383.587 359.999 383.603 C 359.996 383.587 332.664 342.599 327.477 224.091 C 344.858 198.701 375.241 198.619 392.522 224.084 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S32\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.999 87.604 C 360.004 87.608 405.345 107.851 405.345 132.950 C 405.345 158.049 385.098 178.296 359.999 178.296 C 334.901 178.296 314.653 158.049 314.653 132.950 C 314.653 107.851 359.995 87.608 359.999 87.604 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 327.477 224.091 C 344.858 198.701 375.241 198.619 392.522 224.084 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S31\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 327.477 224.091 C 344.858 198.701 375.241 198.619 392.522 224.084 C 393.219 212.763 393.625 198.710 393.808 183.495 C 386.131 176.496 372.759 173.346 363.537 183.542 C 363.516 193.219 363.514 212.401 363.514 212.404 C 363.514 212.404 356.485 212.404 356.484 212.404 C 356.484 212.401 356.484 193.219 356.485 183.541 C 347.272 172.992 333.963 178.248 326.191 183.499 C 326.374 198.714 326.780 212.767 327.477 224.091 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 363.537 183.542 C 372.759 173.346 386.131 176.496 393.808 183.495 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 326.191 183.499 C 333.963 178.248 347.272 172.992 356.485 183.541 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 356.485 183.541 C 356.484 193.219 356.484 212.401 356.484 212.404 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 356.484 212.404 C 356.485 212.404 363.514 212.404 363.514 212.404 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 363.514 212.404 C 363.514 212.401 363.516 193.219 363.537 183.542 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S35\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 363.537 183.542 C 372.759 173.346 386.131 176.496 393.808 183.495 C 393.942 176.092 393.983 169.506 393.983 162.709 C 376.991 162.709 346.985 162.709 326.016 162.709 C 326.016 169.506 326.056 176.092 326.191 183.499 C 333.963 178.248 347.272 172.992 356.485 183.541 C 356.484 193.219 356.484 212.401 356.484 212.404 C 356.485 212.404 363.514 212.404 363.514 212.404 C 363.514 212.401 363.516 193.219 363.537 183.542 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S33\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 317.520 167.515 C 317.519 167.512 310.815 133.535 310.815 133.532 C 310.816 133.531 317.650 127.907 320.651 127.907 C 323.653 127.907 330.488 133.531 330.489 133.532 C 330.489 133.535 334.511 167.512 334.512 167.515 C 334.510 167.515 317.521 167.515 317.520 167.515 M 379.673 127.907 C 382.675 127.907 389.509 133.531 389.510 133.532 C 389.510 133.535 385.487 167.512 385.487 167.515 C 385.485 167.515 368.497 167.515 368.495 167.515 C 368.495 167.512 369.836 133.535 369.836 133.532 C 369.837 133.531 376.671 127.907 379.673 127.907 M 385.487 167.515 C 385.487 167.512 389.510 133.535 389.510 133.532 C 389.511 133.531 396.345 127.907 399.347 127.907 C 402.349 127.907 409.183 133.531 409.184 133.532 C 409.183 133.535 402.480 167.512 402.479 167.515 C 402.477 167.515 385.489 167.515 385.487 167.515 M 340.325 127.907 C 343.327 127.907 350.161 133.531 350.162 133.532 C 350.162 133.535 351.503 167.512 351.503 167.515 C 351.502 167.515 334.513 167.515 334.512 167.515 C 334.511 167.512 330.489 133.535 330.489 133.532 C 330.490 133.531 337.324 127.907 340.325 127.907 M 351.503 167.515 C 351.503 167.512 350.162 133.535 350.162 133.532 C 350.163 133.531 356.997 127.907 359.999 127.907 C 363.001 127.907 369.835 133.531 369.836 133.532 C 369.836 133.535 368.495 167.512 368.495 167.515 C 368.494 167.515 351.505 167.515 351.503 167.515 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S34\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 327.835 139.467 C 327.835 135.867 324.931 132.964 321.332 132.964 C 317.733 132.964 314.829 135.867 314.829 139.467 C 314.829 143.066 317.733 145.970 321.332 145.970 C 324.931 145.970 327.835 143.066 327.835 139.467 M 347.169 139.467 C 347.169 135.867 344.265 132.964 340.666 132.964 C 337.066 132.964 334.163 135.867 334.163 139.467 C 334.163 143.066 337.066 145.970 340.666 145.970 C 344.265 145.970 347.169 143.066 347.169 139.467 M 392.164 139.467 C 392.164 135.867 395.067 132.964 398.667 132.964 C 402.266 132.964 405.170 135.867 405.170 139.467 C 405.170 143.066 402.266 145.970 398.667 145.970 C 395.067 145.970 392.164 143.066 392.164 139.467 M 372.830 139.467 C 372.830 135.867 375.733 132.964 379.333 132.964 C 382.932 132.964 385.836 135.867 385.836 139.467 C 385.836 143.066 382.932 145.970 379.333 145.970 C 375.733 145.970 372.830 143.066 372.830 139.467 M 353.496 139.467 C 353.496 135.867 356.400 132.964 359.999 132.964 C 363.599 132.964 366.502 135.867 366.502 139.467 C 366.502 143.066 363.599 145.970 359.999 145.970 C 356.400 145.970 353.496 143.066 353.496 139.467 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S36\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 365.509 190.205 C 365.510 190.205 372.742 183.466 378.454 183.466 C 384.166 183.467 391.397 190.205 391.398 190.205 C 391.397 190.206 384.166 196.944 378.454 196.944 C 372.742 196.944 365.510 190.206 365.509 190.205 M 328.600 190.205 C 328.601 190.205 335.833 183.467 341.545 183.467 C 347.256 183.467 354.488 190.205 354.489 190.205 C 354.488 190.206 347.256 196.944 341.545 196.944 C 335.833 196.944 328.601 190.206 328.600 190.205 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 567.460 407.964 C 567.458 407.964 554.985 408.025 548.748 408.056 C 548.748 408.058 548.748 428.444 548.748 428.446 C 554.985 421.618 567.458 407.966 567.460 407.964 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S16\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 529.797 349.706 C 549.487 349.706 565.133 365.591 565.370 385.279 C 565.622 406.115 549.044 423.966 528.214 423.411 C 508.229 422.878 493.622 405.262 494.224 385.279 C 494.817 365.598 510.108 349.706 529.797 349.706 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 507.968 428.446 C 507.968 428.442 507.968 387.669 507.968 387.665 C 507.969 387.665 518.162 387.665 518.163 387.665 C 518.163 401.259 518.163 414.852 518.163 428.446 C 518.162 428.446 507.969 428.446 507.968 428.446 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 518.163 387.665 C 518.163 401.259 518.163 414.852 518.163 428.446 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 518.163 387.665 C 518.163 401.259 518.163 414.852 518.163 428.446 C 518.164 428.446 528.357 428.446 528.358 428.446 C 528.358 414.852 528.358 401.259 528.358 387.665 C 528.357 387.665 518.164 387.665 518.163 387.665 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 528.358 387.665 C 528.358 401.259 528.358 414.852 528.358 428.446 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 528.358 387.665 C 528.358 401.259 528.358 414.852 528.358 428.446 C 528.359 428.446 538.552 428.446 538.553 428.446 C 538.553 414.852 538.553 401.259 538.553 387.665 C 538.552 387.665 528.359 387.665 528.358 387.665 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.553 387.665 C 538.553 401.259 538.553 414.852 538.553 428.446 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 548.748 428.446 C 548.748 428.444 548.748 408.058 548.748 408.056 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.553 387.665 C 538.553 401.259 538.553 414.852 538.553 428.446 C 538.554 428.446 548.747 428.446 548.748 428.446 C 548.748 428.444 548.748 408.058 548.748 408.056 C 548.748 408.054 548.748 387.667 548.748 387.665 C 548.747 387.665 538.554 387.665 538.553 387.665 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S37\\\",\\\"fill\\\":\\\"url(#2290D8ED-A93A-4C25-B708-A7A17043370F_25)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 490.374 427.174 C 490.382 427.174 569.933 427.174 569.941 427.174 C 569.941 427.195 569.941 640.646 569.941 640.668 C 569.933 640.668 490.382 640.668 490.374 640.668 C 490.374 640.646 490.374 427.195 490.374 427.174 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 546.070 458.476 C 539.834 457.284 535.958 456.143 530.902 454.977 C 530.902 442.146 541.253 431.795 554.084 431.795 C 566.915 431.795 577.265 442.146 577.265 454.977 C 577.266 467.808 566.915 478.159 554.084 478.159 C 562.838 475.292 569.187 465.220 564.721 457.164 C 558.304 445.591 547.438 450.588 546.070 458.476 M 515.733 458.476 C 521.990 457.280 525.846 456.143 530.902 454.977 C 530.902 442.146 520.551 431.795 507.720 431.795 C 494.889 431.795 484.538 442.146 484.538 454.977 C 484.538 467.808 494.888 478.159 507.720 478.159 C 498.965 475.292 492.616 465.220 497.082 457.164 C 503.499 445.590 514.361 450.561 515.733 458.476 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 531.120 502.216 C 531.122 502.211 546.224 489.891 547.861 453.797 C 537.300 453.431 514.383 453.797 514.380 453.797 C 514.538 489.323 531.119 502.211 531.120 502.216 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 179.143 394.562 C 179.143 394.549 182.818 308.321 184.756 262.830 C 175.209 263.214 166.551 265.122 163.921 268.573 C 163.921 264.474 163.921 254.974 163.921 254.973 C 163.923 254.973 214.921 254.973 214.923 254.973 C 214.923 254.974 214.923 268.572 214.923 268.573 C 211.960 265.334 203.556 263.417 194.088 262.827 C 195.935 308.320 199.436 394.549 199.437 394.562 C 199.435 394.563 179.145 394.563 179.143 394.562 M 174.548 229.787 C 174.548 221.554 181.189 214.912 189.422 214.912 C 197.654 214.912 204.296 221.554 204.296 229.787 C 204.296 238.019 197.654 244.660 189.422 244.660 C 181.189 244.660 174.548 238.019 174.548 229.787 M 164.478 229.787 C 164.478 215.980 175.615 204.843 189.422 204.843 C 203.228 204.842 214.366 215.980 214.366 229.787 C 214.366 243.593 203.228 254.731 189.422 254.731 C 175.615 254.731 164.478 243.593 164.478 229.787 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 162.475 397.160 C 171.677 397.160 180.879 397.160 190.081 397.160 C 190.081 397.159 190.081 390.363 190.081 386.965 C 190.080 386.965 162.476 386.965 162.475 386.965 C 162.475 386.966 162.475 397.159 162.475 397.160 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 190.081 397.160 C 180.879 397.160 171.677 397.160 162.475 397.160 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S23\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 162.475 407.355 C 171.677 407.355 180.879 407.355 190.081 407.355 C 190.081 407.354 190.081 397.161 190.081 397.160 C 180.879 397.160 171.677 397.160 162.475 397.160 C 162.475 397.161 162.475 407.354 162.475 407.355 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 190.081 407.355 C 180.879 407.355 171.677 407.355 162.475 407.355 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S24\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 162.475 417.550 C 171.677 417.550 190.078 417.550 190.081 417.550 C 190.081 417.549 190.081 407.356 190.081 407.355 C 180.879 407.355 171.677 407.355 162.475 407.355 C 162.475 407.356 162.475 417.549 162.475 417.550 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 162.475 417.550 C 171.677 417.550 190.078 417.550 190.081 417.550 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S25\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 190.081 417.550 C 190.081 417.551 190.081 424.347 190.081 427.745 C 190.078 427.745 162.478 427.745 162.475 427.745 C 162.475 427.744 162.475 417.551 162.475 417.550 C 171.677 417.550 190.078 417.550 190.081 417.550 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 190.081 417.550 C 190.081 417.551 190.081 424.347 190.081 427.745 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 190.081 386.965 C 190.081 390.363 190.081 397.159 190.081 397.160 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 190.081 397.160 C 190.081 397.161 190.081 407.354 190.081 407.355 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 190.081 407.355 C 190.081 407.356 190.081 417.549 190.081 417.550 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S26\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 190.081 417.550 C 190.081 417.551 190.081 424.347 190.081 427.745 C 190.084 427.745 217.685 427.745 217.687 427.745 C 217.687 427.741 217.687 386.969 217.687 386.965 C 217.686 386.965 190.082 386.965 190.081 386.965 C 190.081 390.363 190.081 397.159 190.081 397.160 C 190.081 397.161 190.081 407.354 190.081 407.355 C 190.081 407.356 190.081 417.549 190.081 417.550 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S26\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 203.544 417.539 C 203.544 417.537 203.544 405.119 203.544 398.908 M 190.081 417.550 C 190.082 417.550 203.543 417.539 203.544 417.539 M 190.081 417.550 C 190.081 417.551 190.081 424.347 190.081 427.745 C 190.084 427.745 217.685 427.745 217.687 427.745 C 217.687 427.741 217.687 386.969 217.687 386.965 C 217.686 386.965 190.082 386.965 190.081 386.965 C 190.081 390.363 190.081 397.159 190.081 397.160 C 190.081 397.161 190.081 407.354 190.081 407.355 C 190.081 407.356 190.081 417.549 190.081 417.550 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 500.656 95.549 C 500.656 95.550 493.806 100.202 492.742 104.866 C 491.678 109.531 495.835 116.692 495.835 116.694 C 495.836 116.693 502.685 112.041 503.749 107.376 C 504.813 102.711 500.657 95.551 500.656 95.549 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 219.941 95.549 C 219.942 95.550 226.792 100.202 227.856 104.866 C 228.919 109.531 224.763 116.692 224.763 116.694 C 224.762 116.693 217.912 112.041 216.849 107.376 C 215.785 102.711 219.941 95.551 219.941 95.549 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S40\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 220.758 C 365.712 220.758 372.943 227.496 372.945 227.497 C 372.943 227.498 347.056 227.498 347.055 227.497 C 347.056 227.496 354.288 220.758 360.000 220.758 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#2290D8ED-A93A-4C25-B708-A7A17043370F_37)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 150.058 427.174 C 150.066 427.174 229.617 427.174 229.625 427.174 C 229.625 427.195 229.625 640.646 229.625 640.668 C 229.617 640.668 150.066 640.668 150.058 640.668 C 150.058 640.646 150.058 427.195 150.058 427.174 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 203.865 458.476 C 197.630 457.284 193.753 456.143 188.697 454.977 C 188.697 442.146 199.048 431.795 211.879 431.795 C 224.710 431.795 235.060 442.146 235.061 454.977 C 235.061 467.808 224.710 478.159 211.879 478.159 C 220.633 475.292 226.982 465.220 222.516 457.164 C 216.099 445.591 205.233 450.588 203.865 458.476 M 173.528 458.476 C 179.764 457.284 183.641 456.143 188.697 454.977 C 188.697 442.146 178.346 431.795 165.515 431.795 C 152.684 431.795 142.333 442.146 142.333 454.977 C 142.333 467.808 152.684 478.159 165.515 478.159 C 156.761 475.292 150.411 465.220 154.877 457.164 C 161.294 445.591 172.160 450.588 173.528 458.476 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S14\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 188.915 502.216 C 188.917 502.211 204.019 489.891 205.656 453.797 C 195.095 453.431 172.178 453.797 172.175 453.797 C 172.333 489.323 188.914 502.211 188.915 502.216 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":437.147,\\\"max\\\":622.872},\\\"y\\\":{\\\"min\\\":197.296,\\\"max\\\":383.022}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":685.547,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":61.037,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"wildcard\\\":[{\\\"point\\\":{\\\"x\\\":10.051,\\\"y\\\":640.677,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.005042201956494592,\\\"y\\\":-0.9999872880189178}},{\\\"point\\\":{\\\"x\\\":709.949,\\\"y\\\":640.677,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005042575858893397,\\\"y\\\":-0.9999872861335325}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"2290D8ED-A93A-4C25-B708-A7A17043370F_1\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"66.14%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"-101.31%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"2290D8ED-A93A-4C25-B708-A7A17043370F_2\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"-21.53%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"2290D8ED-A93A-4C25-B708-A7A17043370F_25\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"-23.91%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"2290D8ED-A93A-4C25-B708-A7A17043370F_37\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"-24.38%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"empress\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":26.375439740968968,\\\"max\\\":691.718},\\\"y\\\":{\\\"min\\\":23.367,\\\"max\\\":704.62}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"empress_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"empress\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 264.137 116.886 C 343.100 115.305 317.001 149.129 375.706 179.646 C 405.590 195.182 380.683 226.784 415.795 250.839 C 458.310 279.964 414.376 328.207 434.700 356.459 C 488.040 430.603 390.869 513.443 342.112 531.598 C 267.997 559.194 176.962 532.079 113.909 485.800 C 86.592 465.751 36.551 429.508 87.418 373.314 C 113.408 344.601 43.517 322.586 104.691 270.690 C 132.576 247.034 97.376 206.455 143.115 180.212 C 205.823 144.231 168.426 118.803 264.137 116.886 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 159.664 186.813 C 214.818 153.483 177.516 125.675 262.769 122.067 C 326.723 119.360 308.651 155.040 360.840 185.237 C 394.592 204.766 365.081 231.895 401.126 257.561 C 439.125 284.619 399.840 327.594 418.238 353.168 C 466.521 420.282 378.337 494.676 334.428 511.702 C 269.100 537.033 186.883 518.473 131.096 477.369 C 107.774 460.185 60.168 426.583 103.880 373.604 C 127.402 345.096 60.794 324.648 119.516 275.530 C 147.302 252.288 114.955 213.831 159.664 186.813 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 172.138 195.003 C 221.954 160.882 185.028 130.185 264.967 128.700 C 318.285 127.710 300.079 160.215 341.695 188.345 C 386.345 218.525 352.430 234.974 384.368 261.290 C 417.682 288.739 385.617 324.728 400.715 349.664 C 449.157 429.671 332.462 513.518 273.056 507.322 C 112.215 490.547 82.523 417.195 120.261 376.052 C 147.328 346.543 82.119 329.613 138.723 281.253 C 164.885 258.902 131.201 223.044 172.138 195.003 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 183.077 203.244 C 229.933 165.057 204.329 136.638 265.610 133.410 C 305.156 131.326 294.011 170.894 341.226 203.642 C 363.709 219.236 339.083 242.966 366.022 262.454 C 396.996 284.862 371.068 318.168 385.366 339.666 C 433.473 411.996 324.149 492.018 268.841 487.722 C 160.317 479.293 95.807 431.832 135.346 380.405 C 168.783 336.913 105.564 329.626 156.244 285.185 C 180.669 263.767 147.222 232.465 183.077 203.244 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2_2_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 197.400 209.615 C 245.016 168.197 214.345 151.321 265.849 150.000 C 305.203 148.992 277.286 171.768 328.085 210.495 C 348.372 225.960 322.484 249.262 347.984 268.514 C 376.619 290.132 354.635 320.396 368.312 340.397 C 410.548 402.160 315.725 467.982 267.941 467.927 C 171.664 467.816 121.567 413.955 157.539 371.754 C 177.412 348.439 119.761 327.169 171.826 290.028 C 202.961 267.818 163.246 239.323 197.400 209.615 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 264.921 228.029 C 267.953 228.029 270.398 230.475 270.398 233.507 C 270.398 236.539 267.953 238.984 264.921 238.985 C 261.889 238.985 259.443 236.539 259.443 233.507 C 259.443 230.475 261.889 228.029 264.921 228.029 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 280.317 226.108 C 283.349 226.108 285.795 228.554 285.795 231.586 C 285.795 234.618 283.349 237.064 280.317 237.064 C 277.285 237.064 274.840 234.618 274.840 231.586 C 274.840 228.554 277.285 226.108 280.317 226.108 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15_2_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 295.981 225.574 C 299.013 225.574 301.459 228.020 301.459 231.052 C 301.459 234.084 299.013 236.529 295.981 236.529 C 292.949 236.529 290.503 234.084 290.503 231.052 C 290.503 228.020 292.949 225.574 295.981 225.574 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15_2_3\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 249.270 229.632 C 252.302 229.633 254.748 232.078 254.748 235.110 C 254.748 238.142 252.302 240.588 249.270 240.588 C 246.238 240.588 243.792 238.142 243.792 235.110 C 243.792 232.078 246.238 229.632 249.270 229.632 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15_2_4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 233.989 231.987 C 237.021 231.987 239.467 234.432 239.467 237.464 C 239.467 240.496 237.021 242.942 233.989 242.942 C 230.957 242.942 228.511 240.496 228.511 237.464 C 228.511 234.432 230.957 231.987 233.989 231.987 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 239.835 28.086 C 239.835 28.087 241.237 30.515 242.255 32.278 C 241.440 33.678 239.835 36.457 239.835 36.458 C 239.836 36.458 242.610 36.458 244.676 36.470 C 245.406 37.735 246.916 40.351 246.916 40.351 C 246.917 40.351 248.212 38.107 249.166 36.454 C 250.787 36.458 253.997 36.458 253.997 36.458 C 253.997 36.457 252.643 34.111 251.586 32.263 C 252.392 30.867 253.997 28.087 253.997 28.086 C 253.997 28.086 250.787 28.086 249.155 28.086 C 248.427 26.809 246.917 24.193 246.916 24.193 C 246.916 24.193 245.648 26.389 244.664 28.086 C 242.623 28.086 239.836 28.086 239.835 28.086 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 269.286 27.261 C 269.287 27.261 270.689 29.689 271.706 31.452 C 270.891 32.852 269.287 35.631 269.286 35.632 C 269.287 35.632 272.062 35.632 274.127 35.644 C 274.857 36.909 276.367 39.525 276.368 39.525 C 276.368 39.525 277.663 37.282 278.618 35.628 C 280.238 35.632 283.448 35.632 283.449 35.632 C 283.448 35.631 282.094 33.286 281.037 31.437 C 281.844 30.041 283.448 27.261 283.449 27.261 C 283.448 27.261 280.239 27.261 278.606 27.261 C 277.878 25.984 276.368 23.368 276.368 23.367 C 276.367 23.368 275.099 25.564 274.115 27.261 C 272.075 27.261 269.287 27.261 269.286 27.261 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 300.288 30.355 C 300.288 30.355 301.301 32.970 302.037 34.867 C 301.018 36.126 299.007 38.627 299.006 38.627 C 299.007 38.627 301.749 39.052 303.788 39.380 C 304.316 40.742 305.408 43.559 305.408 43.559 C 305.408 43.559 307.031 41.540 308.228 40.052 C 309.829 40.304 313.001 40.795 313.001 40.795 C 313.001 40.794 312.022 38.269 311.261 36.281 C 312.271 35.024 314.282 32.523 314.283 32.523 C 314.282 32.523 311.111 32.031 309.497 31.781 C 308.974 30.408 307.882 27.592 307.881 27.591 C 307.881 27.591 306.292 29.567 305.059 31.094 C 303.043 30.782 300.288 30.355 300.288 30.355 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 331.436 37.192 C 331.436 37.192 331.918 39.955 332.267 41.959 C 331.021 42.994 328.558 45.052 328.558 45.052 C 328.558 45.052 331.164 46.006 333.099 46.728 C 333.349 48.167 333.868 51.143 333.868 51.144 C 333.868 51.143 335.856 49.482 337.321 48.258 C 338.841 48.819 341.855 49.922 341.856 49.922 C 341.856 49.922 341.391 47.254 341.034 45.155 C 342.272 44.121 344.734 42.062 344.735 42.062 C 344.734 42.062 341.721 40.958 340.187 40.396 C 339.944 38.947 339.425 35.971 339.425 35.971 C 339.425 35.971 337.479 37.597 335.970 38.852 C 334.055 38.150 331.437 37.192 331.436 37.192 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 356.057 48.170 C 356.057 48.170 356.368 50.957 356.594 52.980 C 355.287 53.936 352.703 55.840 352.703 55.840 C 352.703 55.840 355.246 56.952 357.133 57.790 C 357.295 59.242 357.630 62.244 357.630 62.245 C 357.631 62.244 359.716 60.708 361.254 59.575 C 362.737 60.228 365.678 61.514 365.678 61.514 C 365.678 61.513 365.377 58.822 365.150 56.705 C 366.448 55.748 369.032 53.845 369.032 53.844 C 369.032 53.844 366.091 52.558 364.595 51.904 C 364.441 50.442 364.105 47.441 364.105 47.440 C 364.105 47.440 362.063 48.944 360.481 50.104 C 358.612 49.287 356.057 48.170 356.057 48.170 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 380.142 63.260 C 380.142 63.260 380.067 66.063 380.012 68.098 C 378.585 68.865 375.764 70.395 375.764 70.395 C 375.764 70.395 378.129 71.846 379.883 72.937 C 379.844 74.397 379.763 77.417 379.763 77.417 C 379.763 77.417 382.040 76.182 383.719 75.272 C 385.098 76.123 387.834 77.801 387.834 77.802 C 387.834 77.801 387.907 75.094 387.973 72.966 C 389.391 72.197 392.212 70.668 392.212 70.667 C 392.212 70.667 389.477 68.988 388.085 68.134 C 388.133 66.665 388.214 63.646 388.214 63.645 C 388.214 63.646 385.984 64.854 384.258 65.785 C 382.519 64.718 380.142 63.260 380.142 63.260 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 401.642 83.786 C 401.642 83.786 401.247 86.563 400.960 88.578 C 399.455 89.177 396.477 90.374 396.477 90.374 C 396.477 90.374 398.661 92.086 400.278 93.370 C 400.072 94.816 399.646 97.807 399.646 97.808 C 399.647 97.808 402.050 96.841 403.821 96.129 C 405.094 97.132 407.620 99.112 407.621 99.112 C 407.621 99.112 408.003 96.431 408.312 94.324 C 409.808 93.723 412.786 92.526 412.786 92.525 C 412.786 92.525 410.260 90.544 408.975 89.537 C 409.191 88.083 409.617 85.093 409.617 85.092 C 409.617 85.093 407.264 86.038 405.442 86.766 C 403.836 85.507 401.642 83.786 401.642 83.786 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 222.687 32.006 C 222.687 32.007 221.673 34.621 220.937 36.518 C 221.957 37.777 223.968 40.278 223.968 40.279 C 223.968 40.279 221.226 40.703 219.187 41.032 C 218.659 42.393 217.567 45.210 217.567 45.211 C 217.566 45.210 215.943 43.191 214.747 41.703 C 213.146 41.955 209.974 42.446 209.973 42.446 C 209.973 42.446 210.953 39.921 211.714 37.932 C 210.703 36.676 208.692 34.174 208.692 34.174 C 208.692 34.174 211.864 33.683 213.477 33.432 C 214.001 32.059 215.093 29.243 215.093 29.242 C 215.093 29.243 216.683 31.219 217.916 32.745 C 219.932 32.433 222.687 32.006 222.687 32.006 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 195.532 39.757 C 195.532 39.758 194.866 42.482 194.383 44.459 C 195.557 45.574 197.876 47.793 197.877 47.793 C 197.876 47.793 195.212 48.570 193.233 49.161 C 192.887 50.579 192.170 53.514 192.170 53.515 C 192.169 53.514 190.298 51.724 188.918 50.404 C 187.363 50.861 184.282 51.760 184.282 51.760 C 184.282 51.760 184.925 49.129 185.421 47.058 C 184.256 45.944 181.937 43.725 181.937 43.725 C 181.937 43.724 185.018 42.825 186.585 42.368 C 186.926 40.938 187.643 38.004 187.643 38.003 C 187.643 38.004 189.476 39.756 190.896 41.109 C 192.855 40.538 195.531 39.757 195.532 39.757 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 168.294 50.372 C 168.294 50.372 167.983 53.159 167.756 55.182 C 169.064 56.138 171.648 58.041 171.648 58.042 C 171.648 58.042 169.105 59.153 167.218 59.992 C 167.056 61.443 166.720 64.446 166.720 64.446 C 166.720 64.446 164.634 62.909 163.097 61.777 C 161.614 62.430 158.673 63.715 158.673 63.716 C 158.673 63.715 158.973 61.024 159.201 58.907 C 157.903 57.950 155.319 56.047 155.318 56.046 C 155.319 56.046 158.259 54.760 159.755 54.105 C 159.910 52.644 160.246 49.642 160.246 49.642 C 160.246 49.642 162.288 51.146 163.870 52.306 C 165.739 51.489 168.294 50.372 168.294 50.372 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 140.906 64.635 C 140.906 64.636 140.981 67.439 141.036 69.474 C 142.462 70.241 145.284 71.770 145.284 71.771 C 145.284 71.771 142.919 73.222 141.165 74.313 C 141.204 75.773 141.285 78.793 141.285 78.793 C 141.285 78.793 139.008 77.558 137.329 76.648 C 135.950 77.499 133.214 79.177 133.214 79.178 C 133.214 79.177 133.141 76.470 133.075 74.342 C 131.657 73.573 128.836 72.043 128.835 72.043 C 128.836 72.043 131.571 70.364 132.963 69.510 C 132.915 68.041 132.834 65.022 132.834 65.021 C 132.834 65.022 135.063 66.230 136.790 67.161 C 138.529 66.094 140.905 64.636 140.906 64.635 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 114.452 84.612 C 114.452 84.612 114.847 87.388 115.134 89.403 C 116.639 90.002 119.616 91.199 119.617 91.199 C 119.616 91.199 117.433 92.911 115.815 94.196 C 116.021 95.642 116.447 98.633 116.447 98.633 C 116.447 98.633 114.044 97.666 112.272 96.954 C 110.999 97.957 108.473 99.938 108.473 99.938 C 108.473 99.937 108.091 97.256 107.782 95.150 C 106.286 94.548 103.308 93.351 103.307 93.351 C 103.308 93.351 105.833 91.370 107.118 90.362 C 106.902 88.909 106.476 85.918 106.476 85.918 C 106.477 85.918 108.830 86.864 110.652 87.591 C 112.257 86.332 114.451 84.612 114.452 84.612 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S32\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.478 342.606 C 288.853 359.963 218.229 377.320 147.604 394.677 C 147.613 394.698 182.243 553.372 242.873 580.810 C 324.130 617.581 384.443 583.805 442.777 549.049 C 520.260 657.727 669.442 664.315 689.718 667.413 C 664.078 639.963 525.566 502.965 487.383 472.436 C 463.698 578.861 519.137 671.787 519.140 671.807 C 519.142 671.781 586.842 435.993 540.861 412.666 C 507.742 395.865 395.469 437.572 386.729 435.086 C 350.420 424.757 359.483 342.612 359.478 342.606 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.478 342.606 C 288.853 359.963 218.229 377.320 147.604 394.677 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S33\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.478 342.606 C 288.853 359.963 218.229 377.320 147.604 394.677 C 147.607 394.664 148.277 317.018 163.008 296.133 C 200.158 243.467 279.247 236.057 323.294 241.721 C 386.276 249.820 440.804 312.731 440.816 312.738 C 440.823 312.729 508.111 226.783 508.118 226.774 C 508.120 226.774 555.756 222.104 555.758 222.104 C 555.758 222.105 554.824 262.271 554.824 262.272 C 554.820 262.271 510.925 254.799 510.920 254.798 C 510.914 254.810 504.662 351.804 450.693 367.238 C 424.380 374.763 359.477 342.614 359.478 342.606 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 544.005 413.262 C 586.426 432.170 533.824 659.689 517.543 702.189 C 497.736 657.924 458.723 586.516 466.984 487.582 C 471.373 435.016 498.025 392.769 544.005 413.262 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S34\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 555.058 252.230 C 547.595 251.599 540.133 250.969 532.671 250.339 M 555.291 242.188 C 547.439 242.511 539.586 242.834 531.734 243.157 M 555.525 232.146 C 547.594 233.005 539.664 233.865 531.734 234.725 M 531.938 224.439 C 531.938 224.442 531.171 238.969 531.734 253.462 C 519.749 251.002 521.117 234.102 521.116 234.100 M 555.058 252.230 C 555.058 252.229 555.291 242.189 555.291 242.188 C 555.291 242.187 555.525 232.147 555.525 232.146 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 338.996 294.897 C 367.433 294.897 390.373 317.837 390.373 346.274 C 390.373 374.711 367.433 397.651 338.996 397.651 C 310.559 397.651 287.619 374.711 287.619 346.274 C 287.619 317.837 310.559 294.897 338.996 294.897 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 243.432 310.695 C 271.868 310.695 294.809 333.636 294.809 362.073 C 294.809 390.509 271.868 413.450 243.432 413.450 C 214.995 413.450 192.055 390.509 192.055 362.073 C 192.055 333.636 214.995 310.696 243.432 310.695 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 174.874 291.005 C 217.579 280.571 212.072 354.375 208.736 394.175 C 270.171 360.700 343.429 423.565 336.229 505.126 C 335.236 504.202 330.064 504.414 330.064 504.414 C 330.063 504.414 325.004 503.752 325.004 503.752 C 325.003 503.752 319.546 503.236 319.546 503.236 C 319.530 503.234 213.112 492.748 160.086 490.819 C 144.247 482.334 107.742 307.406 174.874 291.005 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 319.546 503.236 C 320.098 497.140 319.664 491.041 318.242 484.937 M 325.004 503.752 C 325.717 498.265 325.801 491.430 324.311 484.262 M 330.064 504.414 C 332.209 497.702 332.002 491.187 330.380 484.937 M 325.004 503.752 C 325.003 503.752 319.546 503.236 319.546 503.236 M 330.064 504.414 C 330.063 504.414 325.004 503.752 325.004 503.752 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 171.846 702.620 C 171.846 702.620 45.143 638.986 30.282 545.326 C 11.238 425.300 140.387 388.031 171.846 482.408 C 203.305 388.031 329.397 426.895 313.411 529.595 C 296.640 637.342 171.846 702.620 171.846 702.620 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S35\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 261.528 193.143 C 261.528 193.146 260.710 214.539 260.300 225.237 C 288.643 224.767 309.776 201.139 310.259 172.796 C 310.776 142.519 297.048 137.913 294.487 135.346 C 283.856 128.370 262.595 131.441 262.592 131.440 C 262.593 131.446 270.393 192.073 270.393 192.079 C 270.393 192.079 261.529 193.143 261.528 193.143 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S36\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 289.011 157.204 C 296.755 157.204 306.354 166.723 306.356 166.724 C 306.354 166.725 296.755 176.244 289.011 176.244 C 281.267 176.244 271.667 166.725 271.666 166.724 C 271.667 166.723 281.267 157.204 289.011 157.204 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 294.487 135.346 C 283.856 128.370 262.595 131.441 262.592 131.440 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 262.592 131.440 C 262.593 131.446 270.393 192.073 270.393 192.079 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 270.393 192.079 C 270.393 192.079 261.529 193.143 261.528 193.143 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 261.528 193.143 C 261.528 193.146 260.710 214.539 260.300 225.237 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S38\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 207.505 172.796 C 207.525 144.359 230.834 126.109 258.882 121.419 C 273.640 118.951 284.132 124.969 294.487 135.346 C 283.856 128.370 262.595 131.441 262.592 131.440 C 262.593 131.446 270.393 192.073 270.393 192.079 C 270.393 192.079 261.529 193.143 261.528 193.143 C 261.528 193.146 260.710 214.539 260.300 225.237 C 231.180 225.719 207.484 201.920 207.505 172.796 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S37\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 237.592 157.204 C 245.336 157.204 254.936 166.723 254.937 166.724 C 254.936 166.725 245.336 176.244 237.592 176.244 C 229.848 176.244 220.249 166.725 220.247 166.724 C 220.249 166.723 229.848 157.204 237.592 157.204 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 117.630 99.580 C 117.632 99.581 162.381 137.199 162.384 137.202 C 162.382 137.196 142.322 81.156 142.320 81.150 C 142.324 81.155 182.008 130.239 182.012 130.244 C 182.011 130.237 167.747 66.817 167.745 66.811 C 167.748 66.816 199.467 122.014 199.471 122.019 C 199.470 122.013 193.118 55.781 193.118 55.775 C 193.120 55.781 219.211 114.860 219.213 114.866 C 219.213 114.860 218.649 48.772 218.649 48.765 C 218.651 48.771 239.289 109.225 239.291 109.231 C 239.292 109.224 246.961 43.476 246.962 43.469 C 246.963 43.475 259.309 106.734 259.311 106.740 C 259.312 106.734 275.823 42.880 275.825 42.873 C 275.825 42.880 281.381 107.063 281.382 107.069 C 281.384 107.063 304.498 46.549 304.501 46.543 C 304.500 46.550 302.076 108.914 302.076 108.921 C 302.079 108.915 332.729 53.986 332.732 53.980 C 332.731 53.986 320.568 115.949 320.566 115.956 C 320.570 115.951 356.586 64.821 356.589 64.816 C 356.587 64.822 337.025 124.485 337.023 124.491 C 337.027 124.487 377.819 79.517 377.823 79.513 C 377.820 79.518 353.898 134.298 353.895 134.304 C 353.899 134.300 397.001 99.732 397.005 99.729 C 397.001 99.736 357.080 158.948 355.331 164.865 C 299.098 127.701 225.778 126.164 160.629 167.653 C 159.056 163.875 117.634 99.587 117.630 99.580 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":89.931,\\\"max\\\":251.301},\\\"y\\\":{\\\"min\\\":481.396,\\\"max\\\":642.766}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":703.784,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":536.688,\\\"y\\\":238.212,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}},{\\\"point\\\":{\\\"x\\\":536.688,\\\"y\\\":245.899,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"eye\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":13.047,\\\"max\\\":706.953},\\\"y\\\":{\\\"min\\\":190.972,\\\"max\\\":529.028}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#AB73A7F7-98AF-4043-895F-7E3AE0D791B3_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 192.972 C 564.753 192.972 704.919 359.983 704.953 360.000 C 704.919 360.017 564.753 527.028 360.000 527.028 C 155.247 527.028 15.081 360.017 15.047 360.000 C 15.081 359.983 155.247 192.972 360.000 192.972 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 221.924 C 436.424 221.924 498.076 283.576 498.076 360.000 C 498.076 436.424 436.424 498.076 360.000 498.076 C 283.576 498.076 221.924 436.424 221.924 360.000 C 221.924 283.576 283.576 221.924 360.000 221.924 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 331.602 C 375.718 331.602 388.398 344.282 388.398 360.000 C 388.398 375.718 375.718 388.398 360.000 388.398 C 344.282 388.398 331.602 375.718 331.602 360.000 C 331.602 344.282 344.282 331.602 360.000 331.602 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":251.724,\\\"max\\\":471.643},\\\"y\\\":{\\\"min\\\":250.04,\\\"max\\\":469.96}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":361.684,\\\"y\\\":568.535,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":361.684,\\\"y\\\":197.193,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":14.26,\\\"y\\\":359.365,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875634527172,\\\"y\\\":0.0049872778043753814}},{\\\"point\\\":{\\\"x\\\":705.539,\\\"y\\\":359.365,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875634527172,\\\"y\\\":0.004987277804375375}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":157.893,\\\"y\\\":470.253,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5860254780827434,\\\"y\\\":0.8102926255606009}},{\\\"point\\\":{\\\"x\\\":563.828,\\\"y\\\":470.253,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5860254780827449,\\\"y\\\":0.8102926255605999}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":187.267,\\\"y\\\":235.185,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5014596828785342,\\\"y\\\":-0.8651810136886731}},{\\\"point\\\":{\\\"x\\\":533.088,\\\"y\\\":235.185,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5015171182352989,\\\"y\\\":-0.8651477215579784}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":361.656,\\\"y\\\":522.995,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"AB73A7F7-98AF-4043-895F-7E3AE0D791B3_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"93.35%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"45.88%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"],\\\"creature_frequency_multiplier\\\":6}},{\\\"name\\\":\\\"eye_eyelashes\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":10.643878860546883,\\\"max\\\":709.33},\\\"y\\\":{\\\"min\\\":134.658,\\\"max\\\":571.32}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_eyelashes\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_eyelashes\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 210.495 C 499.782 210.495 635.864 359.985 635.892 360.000 C 635.864 360.015 499.782 509.505 360.000 509.505 C 220.218 509.505 84.136 360.015 84.108 360.000 C 84.136 359.985 220.218 210.495 360.000 210.495 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 484.761 359.228 C 484.871 427.261 440.768 483.907 360.000 483.989 C 292.018 483.989 235.239 428.069 235.239 359.228 C 235.239 289.527 290.299 234.467 360.000 234.467 C 433.688 233.331 484.647 289.220 484.761 359.228 M 634.473 359.228 C 634.446 359.213 482.807 209.653 360.000 209.515 C 222.764 209.514 85.554 359.213 85.527 359.228 C 85.554 359.242 222.764 508.940 360.000 508.941 C 497.236 508.940 634.446 359.242 634.473 359.228 M 397.429 571.320 C 397.425 571.314 360.000 508.941 360.000 508.941 C 360.000 508.941 322.575 571.314 322.571 571.320 C 322.569 571.314 301.539 503.378 301.537 503.371 C 301.531 503.376 246.896 555.402 246.889 555.408 C 246.889 555.400 246.891 482.311 246.891 482.303 C 246.883 482.307 181.079 522.271 181.072 522.276 C 181.075 522.269 200.834 457.771 200.836 457.763 C 200.827 457.766 122.996 481.408 122.989 481.410 C 122.992 481.405 156.084 426.357 156.087 426.351 C 156.077 426.353 60.618 445.699 60.608 445.701 C 60.613 445.695 116.934 393.224 116.940 393.218 C 116.929 393.215 8.717 361.195 10.670 359.228 C 10.681 359.224 116.070 326.512 116.081 326.509 C 116.075 326.505 60.648 281.318 60.642 281.314 C 60.651 281.315 154.805 294.234 154.815 294.236 C 154.812 294.229 126.016 227.566 126.013 227.560 C 126.020 227.563 200.828 263.678 200.836 263.683 C 200.834 263.674 181.933 188.866 181.931 188.859 C 181.939 188.863 252.451 233.570 252.458 233.574 C 252.458 233.566 248.610 153.604 248.609 153.597 C 248.615 153.602 304.935 215.077 304.940 215.083 C 304.942 215.075 322.570 134.666 322.571 134.658 C 322.575 134.665 359.996 206.483 360.000 206.490 C 360.004 206.483 397.425 134.665 397.429 134.658 C 397.431 134.666 416.330 217.652 416.332 217.661 C 416.338 217.655 476.508 159.170 476.513 159.164 C 476.513 159.172 467.510 236.145 467.509 236.152 C 467.517 236.148 543.596 193.160 543.603 193.156 C 543.601 193.163 518.274 264.534 518.271 264.541 C 518.280 264.538 600.407 233.577 600.415 233.574 C 600.412 233.580 566.048 297.220 566.045 297.226 C 566.054 297.225 658.490 283.034 658.499 283.032 C 658.494 283.037 607.361 329.941 607.356 329.945 C 607.366 329.948 709.319 358.242 709.330 359.228 C 709.318 359.232 600.493 395.380 600.482 395.384 C 600.488 395.388 655.916 440.128 655.922 440.132 C 655.911 440.131 560.486 428.070 560.477 428.069 C 560.480 428.074 597.421 481.851 597.424 481.856 C 597.417 481.854 518.314 457.766 518.305 457.763 C 518.308 457.770 543.221 517.560 543.224 517.566 C 543.217 517.563 468.821 484.025 468.814 484.021 C 468.815 484.028 477.406 551.964 477.407 551.970 C 477.401 551.966 420.187 502.518 420.181 502.512 C 420.179 502.520 397.431 571.314 397.429 571.320 M 360.000 396.656 C 379.206 395.625 397.380 377.451 397.429 359.228 C 397.478 340.513 378.714 321.799 360.000 321.799 C 341.286 321.799 322.571 340.513 322.571 359.228 C 322.571 377.942 341.286 396.606 360.000 396.656 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":252.4,\\\"max\\\":470.947},\\\"y\\\":{\\\"min\\\":250.727,\\\"max\\\":469.273}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":361.673,\\\"y\\\":602.802,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":361.673,\\\"y\\\":205.698,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":16.418,\\\"y\\\":359.369,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874074164002,\\\"y\\\":0.005018466760505231}},{\\\"point\\\":{\\\"x\\\":703.383,\\\"y\\\":359.369,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874054717116,\\\"y\\\":0.005018854247213299}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":536.347,\\\"y\\\":509.814,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5860486058072052,\\\"y\\\":0.8102758984638695}},{\\\"point\\\":{\\\"x\\\":186.299,\\\"y\\\":515.43,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5860486058072018,\\\"y\\\":0.810275898463872}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":186.473,\\\"y\\\":194.779,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.501492745540327,\\\"y\\\":-0.8651618496965899}},{\\\"point\\\":{\\\"x\\\":537.624,\\\"y\\\":200.395,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.501492745540326,\\\"y\\\":-0.8651618496965904}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":361.645,\\\"y\\\":512.617,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"eye_starburst\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":39.134,\\\"max\\\":680.867},\\\"y\\\":{\\\"min\\\":25.631,\\\"max\\\":667.364}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_starburst\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"starburst\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 667.364 C 360.002 667.349 377.203 513.589 377.204 513.574 C 377.209 513.589 424.772 660.847 424.777 660.861 C 424.775 660.846 410.017 506.921 410.016 506.906 C 410.023 506.919 485.052 642.190 485.059 642.203 C 485.055 642.188 440.145 494.225 440.141 494.210 C 440.151 494.222 539.560 612.656 539.570 612.667 C 539.563 612.654 466.917 476.168 466.910 476.155 C 466.922 476.164 587.020 573.520 587.032 573.530 C 587.023 573.518 489.667 453.420 489.657 453.408 C 489.671 453.415 626.156 526.061 626.170 526.068 C 626.158 526.058 507.724 426.648 507.712 426.638 C 507.727 426.643 655.691 471.552 655.706 471.557 C 655.692 471.549 520.422 396.521 520.408 396.514 C 520.424 396.515 674.348 411.273 674.364 411.275 C 674.349 411.270 527.091 363.707 527.076 363.702 C 527.092 363.700 680.851 346.499 680.867 346.498 C 680.851 346.496 527.092 329.295 527.076 329.293 C 527.091 329.288 674.349 281.725 674.364 281.721 C 674.348 281.722 520.424 296.480 520.408 296.482 C 520.422 296.474 655.692 221.446 655.706 221.438 C 655.691 221.443 507.727 266.352 507.712 266.357 C 507.724 266.347 626.158 166.938 626.170 166.928 C 626.156 166.935 489.671 239.580 489.657 239.587 C 489.667 239.575 587.023 119.477 587.032 119.465 C 587.020 119.475 466.923 216.831 466.911 216.841 C 466.918 216.827 539.563 80.342 539.570 80.328 C 539.560 80.340 440.151 198.774 440.141 198.786 C 440.145 198.771 485.055 50.807 485.059 50.792 C 485.052 50.806 410.023 186.076 410.016 186.090 C 410.017 186.074 424.775 32.149 424.777 32.134 C 424.772 32.149 377.209 179.407 377.204 179.421 C 377.203 179.406 360.002 25.647 360.000 25.631 C 359.998 25.647 342.797 179.406 342.796 179.421 C 342.791 179.407 295.228 32.149 295.223 32.134 C 295.225 32.149 309.983 186.074 309.984 186.090 C 309.977 186.076 234.948 50.806 234.941 50.792 C 234.945 50.807 279.855 198.771 279.859 198.786 C 279.849 198.774 180.440 80.340 180.430 80.328 C 180.437 80.342 253.083 216.827 253.090 216.841 C 253.078 216.831 132.980 119.475 132.968 119.465 C 132.977 119.477 230.333 239.575 230.343 239.587 C 230.329 239.580 93.844 166.935 93.830 166.927 C 93.842 166.937 212.276 266.347 212.288 266.357 C 212.273 266.352 64.309 221.443 64.294 221.438 C 64.308 221.446 199.578 296.474 199.592 296.482 C 199.577 296.480 45.652 281.722 45.636 281.721 C 45.651 281.725 192.909 329.288 192.924 329.293 C 192.908 329.295 39.149 346.496 39.134 346.498 C 39.149 346.499 192.908 363.700 192.924 363.702 C 192.909 363.707 45.651 411.270 45.636 411.275 C 45.652 411.273 199.577 396.515 199.592 396.514 C 199.578 396.521 64.308 471.549 64.294 471.557 C 64.309 471.552 212.273 426.643 212.288 426.638 C 212.276 426.648 93.842 526.057 93.830 526.067 C 93.844 526.060 230.329 453.415 230.343 453.408 C 230.333 453.420 132.977 573.518 132.968 573.530 C 132.980 573.520 253.077 476.164 253.089 476.155 C 253.082 476.168 180.437 612.654 180.430 612.667 C 180.440 612.656 279.849 494.222 279.859 494.210 C 279.855 494.225 234.945 642.188 234.941 642.203 C 234.948 642.190 309.977 506.919 309.984 506.906 C 309.983 506.921 295.225 660.846 295.223 660.861 C 295.228 660.847 342.791 513.589 342.796 513.574 C 342.797 513.589 359.998 667.349 360.000 667.364 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 332.735 346.498 C 332.735 331.406 344.909 319.232 360.000 319.232 C 375.091 319.232 387.265 331.406 387.265 346.498 C 387.265 361.589 375.091 373.763 360.000 373.763 C 344.909 373.763 332.735 361.589 332.735 346.498 M 271.397 346.498 C 271.397 297.457 310.959 257.895 360.000 257.895 C 409.041 257.895 448.603 297.457 448.603 346.498 C 448.603 395.539 409.041 435.100 360.000 435.100 C 310.959 435.100 271.397 395.539 271.397 346.498 M 178.467 346.498 C 178.485 346.487 246.405 235.782 360.000 235.782 C 473.595 235.782 541.515 346.487 541.533 346.498 C 541.515 346.509 473.595 457.213 360.000 457.213 C 246.405 457.213 178.485 346.509 178.467 346.498 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 332.735 346.498 C 332.735 331.406 344.909 319.232 360.000 319.232 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 319.232 C 375.091 319.232 387.265 331.406 387.265 346.498 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 387.265 346.498 C 387.265 361.589 375.091 373.763 360.000 373.763 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 373.763 C 344.909 373.763 332.735 361.589 332.735 346.498 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 271.397 346.498 C 271.397 297.457 310.959 257.895 360.000 257.895 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 257.895 C 409.041 257.895 448.603 297.457 448.603 346.498 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 448.603 346.498 C 448.603 395.539 409.041 435.100 360.000 435.100 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 435.100 C 310.959 435.100 271.397 395.539 271.397 346.498 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 332.735 346.498 C 332.735 331.406 344.909 319.232 360.000 319.232 C 375.091 319.232 387.265 331.406 387.265 346.498 C 387.265 361.589 375.091 373.763 360.000 373.763 C 344.909 373.763 332.735 361.589 332.735 346.498 M 271.397 346.498 C 271.397 297.457 310.959 257.895 360.000 257.895 C 409.041 257.895 448.603 297.457 448.603 346.498 C 448.603 395.539 409.041 435.100 360.000 435.100 C 310.959 435.100 271.397 395.539 271.397 346.498 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":292.123,\\\"max\\\":427.877},\\\"y\\\":{\\\"min\\\":278.62,\\\"max\\\":414.375}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.072,\\\"y\\\":697.15,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.011,\\\"y\\\":44.434,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":60.329,\\\"y\\\":346.023,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874049384118,\\\"y\\\":0.005018960504018174}},{\\\"point\\\":{\\\"x\\\":660.65,\\\"y\\\":346.023,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874049384118,\\\"y\\\":0.005018960504018148}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":573.476,\\\"y\\\":559.051,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128712231972893,\\\"y\\\":0.7012949587279238}},{\\\"point\\\":{\\\"x\\\":147.583,\\\"y\\\":559.095,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987192905433214,\\\"y\\\":0.7153959414356764}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":573.019,\\\"y\\\":133.093,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314242570759948,\\\"y\\\":-0.7754375587860237}},{\\\"point\\\":{\\\"x\\\":147.727,\\\"y\\\":133.165,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817758203984837,\\\"y\\\":-0.7315611599312626}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360.072,\\\"y\\\":644.425,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"],\\\"creature_frequency_multiplier\\\":4}},{\\\"name\\\":\\\"eye_up\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":21.462,\\\"max\\\":698.538},\\\"y\\\":{\\\"min\\\":156.582,\\\"max\\\":563.418}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_up\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_up\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 288.521 252.605 C 288.521 213.042 320.437 181.126 360.000 181.126 C 399.563 181.126 431.479 213.042 431.479 252.605 C 431.479 292.168 399.563 324.084 360.000 324.084 C 320.437 324.084 288.521 292.168 288.521 252.605 M 190.547 205.425 C 232.533 176.045 290.043 158.582 360.000 158.582 C 427.899 158.582 484.073 175.033 528.990 205.164 C 533.272 220.114 535.537 236.088 535.537 252.605 C 535.537 349.764 457.159 428.142 360.000 428.142 C 262.841 428.142 184.463 349.764 184.463 252.605 C 184.463 236.088 186.728 220.114 190.547 205.425 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 181.126 C 399.563 181.126 431.479 213.042 431.479 252.605 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 431.479 252.605 C 431.479 292.168 399.563 324.084 360.000 324.084 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 324.084 C 320.437 324.084 288.521 292.168 288.521 252.605 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 288.521 252.605 C 288.521 213.042 320.437 181.126 360.000 181.126 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 181.126 C 399.563 181.126 431.479 213.042 431.479 252.605 C 431.479 292.168 399.563 324.084 360.000 324.084 C 320.437 324.084 288.521 292.168 288.521 252.605 C 288.521 213.042 320.437 181.126 360.000 181.126 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 184.463 252.605 C 184.463 236.088 186.728 220.114 190.547 205.425 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 528.990 205.164 C 533.272 220.114 535.537 236.088 535.537 252.605 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 535.537 252.605 C 535.537 349.764 457.159 428.142 360.000 428.142 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 428.142 C 262.841 428.142 184.463 349.764 184.463 252.605 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#77A2BF57-080F-4D74-BD9F-7CCB18A2BEE7_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 184.463 252.605 C 184.463 236.088 186.728 220.114 190.547 205.425 C 95.105 249.663 23.479 359.985 23.462 360.000 C 23.496 360.020 154.245 561.418 360.000 561.418 C 565.755 561.418 696.504 360.020 696.538 360.000 C 696.521 359.985 623.371 247.317 528.990 205.164 C 533.272 220.114 535.537 236.088 535.537 252.605 C 535.537 349.764 457.159 428.142 360.000 428.142 C 262.841 428.142 184.463 349.764 184.463 252.605 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":685.952,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":156.323,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":31.9,\\\"y\\\":360.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869443305633,\\\"y\\\":0.00510990884683594}},{\\\"point\\\":{\\\"x\\\":688.1,\\\"y\\\":360.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869443305632,\\\"y\\\":0.005109908846835966}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":592.672,\\\"y\\\":473.156,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064706,\\\"y\\\":0.7012692123096491}},{\\\"point\\\":{\\\"x\\\":127.136,\\\"y\\\":473.204,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698688399112506,\\\"y\\\":0.7154261114507937}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":592.835,\\\"y\\\":241.465,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314454286031296,\\\"y\\\":-0.7754203187279851}},{\\\"point\\\":{\\\"x\\\":127.956,\\\"y\\\":241.544,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817850569385165,\\\"y\\\":-0.7315525518616852}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":561.726,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"77A2BF57-080F-4D74-BD9F-7CCB18A2BEE7_2\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"4.96%\\\",\\\"r\\\":\\\"133.14%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"],\\\"creature_frequency_multiplier\\\":4}},{\\\"name\\\":\\\"eye_up_starburst\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":17.114,\\\"max\\\":702.886},\\\"y\\\":{\\\"min\\\":17.114,\\\"max\\\":702.886}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_up_starburst\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_up_starburst\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 702.886 C 360.002 702.870 378.383 538.558 378.385 538.542 C 378.390 538.558 429.217 695.922 429.222 695.937 C 429.221 695.921 413.450 531.433 413.448 531.416 C 413.456 531.431 493.634 675.984 493.642 675.999 C 493.637 675.983 445.645 517.865 445.640 517.849 C 445.651 517.862 551.882 644.423 551.893 644.436 C 551.885 644.421 474.255 498.570 474.247 498.555 C 474.260 498.565 602.600 602.602 602.613 602.613 C 602.602 602.600 498.565 474.260 498.555 474.247 C 498.570 474.255 644.421 551.886 644.436 551.893 C 644.423 551.883 517.862 445.651 517.849 445.640 C 517.865 445.645 675.983 493.637 675.999 493.642 C 675.984 493.634 531.431 413.456 531.416 413.448 C 531.433 413.450 695.921 429.221 695.937 429.222 C 695.922 429.217 538.558 378.390 538.542 378.385 C 538.558 378.383 702.870 360.002 702.886 360.000 C 702.870 359.998 538.558 341.617 538.542 341.615 C 538.558 341.610 695.922 290.783 695.937 290.778 C 695.921 290.779 531.433 306.550 531.416 306.552 C 531.431 306.544 675.984 226.366 675.999 226.358 C 675.983 226.363 517.865 274.355 517.849 274.360 C 517.862 274.349 644.423 168.118 644.436 168.107 C 644.421 168.115 498.570 245.745 498.555 245.753 C 498.565 245.740 602.602 117.400 602.613 117.387 C 602.600 117.398 474.260 221.435 474.247 221.445 C 474.255 221.431 551.886 75.579 551.893 75.564 C 551.883 75.577 445.651 202.138 445.640 202.151 C 445.645 202.135 493.637 44.017 493.642 44.001 C 493.634 44.016 413.456 188.569 413.448 188.584 C 413.450 188.567 429.221 24.079 429.222 24.063 C 429.217 24.079 378.390 181.442 378.385 181.458 C 378.383 181.442 360.002 17.130 360.000 17.114 C 359.998 17.130 341.617 181.442 341.615 181.458 C 341.610 181.442 290.783 24.079 290.778 24.063 C 290.779 24.079 306.550 188.567 306.552 188.584 C 306.544 188.569 226.366 44.016 226.358 44.001 C 226.363 44.017 274.355 202.135 274.360 202.151 C 274.349 202.138 168.118 75.577 168.107 75.564 C 168.115 75.579 245.745 221.431 245.753 221.445 C 245.740 221.435 117.400 117.398 117.387 117.387 C 117.398 117.400 221.435 245.740 221.445 245.753 C 221.431 245.745 75.579 168.114 75.564 168.107 C 75.577 168.117 202.138 274.349 202.151 274.360 C 202.135 274.355 44.017 226.363 44.001 226.358 C 44.016 226.366 188.569 306.544 188.584 306.552 C 188.567 306.550 24.079 290.779 24.063 290.778 C 24.079 290.783 181.442 341.610 181.458 341.615 C 181.442 341.617 17.130 359.998 17.114 360.000 C 17.130 360.002 181.442 378.383 181.458 378.385 C 181.442 378.390 24.079 429.217 24.063 429.222 C 24.079 429.221 188.567 413.450 188.584 413.448 C 188.569 413.456 44.016 493.634 44.001 493.642 C 44.017 493.637 202.135 445.645 202.151 445.640 C 202.138 445.651 75.577 551.882 75.564 551.893 C 75.579 551.885 221.431 474.255 221.445 474.247 C 221.435 474.260 117.398 602.600 117.387 602.613 C 117.400 602.602 245.740 498.565 245.753 498.555 C 245.745 498.570 168.114 644.421 168.107 644.436 C 168.117 644.423 274.349 517.862 274.360 517.849 C 274.355 517.865 226.363 675.983 226.358 675.999 C 226.366 675.984 306.544 531.431 306.552 531.416 C 306.550 531.433 290.779 695.921 290.778 695.937 C 290.783 695.922 341.610 538.558 341.615 538.542 C 341.617 538.558 359.998 702.870 360.000 702.886 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 325.096 307.559 C 325.096 288.240 340.681 272.655 360.000 272.655 C 379.319 272.655 394.904 288.240 394.904 307.559 C 394.904 326.877 379.319 342.462 360.000 342.462 C 340.681 342.462 325.096 326.877 325.096 307.559 M 277.255 284.520 C 297.757 270.174 325.840 261.647 360.000 261.647 C 393.155 261.647 420.586 269.680 442.519 284.393 C 444.610 291.693 445.716 299.493 445.715 307.559 C 445.715 355.002 407.443 393.274 360.000 393.274 C 312.557 393.274 274.284 355.002 274.285 307.559 C 274.285 299.493 275.391 291.693 277.255 284.520 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 272.655 C 379.319 272.655 394.904 288.240 394.904 307.559 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 394.904 307.559 C 394.904 326.877 379.319 342.462 360.000 342.462 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 342.462 C 340.681 342.462 325.096 326.877 325.096 307.559 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 325.096 307.559 C 325.096 288.240 340.681 272.655 360.000 272.655 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 272.655 C 379.319 272.655 394.904 288.240 394.904 307.559 C 394.904 326.877 379.319 342.462 360.000 342.462 C 340.681 342.462 325.096 326.877 325.096 307.559 C 325.096 288.240 340.681 272.655 360.000 272.655 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 274.285 307.559 C 274.285 299.493 275.391 291.693 277.255 284.520 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 442.519 284.393 C 444.610 291.693 445.716 299.493 445.715 307.559 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 445.715 307.559 C 445.715 355.002 407.443 393.274 360.000 393.274 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 393.274 C 312.557 393.274 274.284 355.002 274.285 307.559 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 274.285 307.559 C 274.285 299.493 275.391 291.693 277.255 284.520 C 230.651 306.122 195.675 359.992 195.667 360.000 C 195.683 360.010 259.529 458.353 360.000 458.353 C 460.471 458.353 524.317 360.010 524.333 360.000 C 524.325 359.992 488.605 304.976 442.519 284.393 C 444.610 291.693 445.716 299.493 445.715 307.559 C 445.715 355.002 407.443 393.274 360.000 393.274 C 312.557 393.274 274.284 355.002 274.285 307.559 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":704.417,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":31.274,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":32.423,\\\"y\\\":360.936,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869443305633,\\\"y\\\":0.00510990884683594}},{\\\"point\\\":{\\\"x\\\":688.623,\\\"y\\\":360.936,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869443305632,\\\"y\\\":0.005109908846835966}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":593.334,\\\"y\\\":593.794,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129699922269517,\\\"y\\\":0.7011945451755173}},{\\\"point\\\":{\\\"x\\\":127.799,\\\"y\\\":593.842,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987254201015096,\\\"y\\\":0.7153899547127908}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":592.835,\\\"y\\\":128.186,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314454286031289,\\\"y\\\":-0.7754203187279854}},{\\\"point\\\":{\\\"x\\\":127.956,\\\"y\\\":128.265,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817481203990752,\\\"y\\\":-0.73158697386731}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":692.017,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"],\\\"creature_frequency_multiplier\\\":4}},{\\\"name\\\":\\\"eye_up_starburst_2\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":30.005,\\\"max\\\":689.995},\\\"y\\\":{\\\"min\\\":205.691,\\\"max\\\":592.597}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_up_starburst_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_up_starburst\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 592.597 C 360.002 592.579 384.405 411.275 384.408 411.257 C 384.413 411.274 440.304 584.020 440.310 584.037 C 440.309 584.019 430.957 403.373 430.956 403.355 C 430.965 403.370 515.039 559.462 515.048 559.477 C 515.044 559.460 473.698 388.327 473.694 388.310 C 473.704 388.323 582.618 520.586 582.629 520.599 C 582.622 520.584 511.678 366.930 511.670 366.915 C 511.683 366.925 641.460 469.072 641.473 469.082 C 641.463 469.069 543.951 339.973 543.941 339.960 C 543.956 339.968 689.981 424.894 689.995 424.902 C 689.984 424.891 580.052 307.601 580.043 307.588 C 580.054 307.594 494.226 205.691 360.000 205.691 C 225.774 205.691 139.946 307.594 139.957 307.588 C 139.948 307.601 30.016 424.890 30.005 424.902 C 30.019 424.893 176.044 339.967 176.059 339.959 C 176.049 339.971 78.537 469.069 78.527 469.082 C 78.540 469.072 208.316 366.925 208.329 366.915 C 208.322 366.930 137.377 520.584 137.370 520.599 C 137.381 520.586 246.296 388.323 246.306 388.310 C 246.302 388.327 204.956 559.460 204.952 559.477 C 204.961 559.462 289.035 403.370 289.044 403.355 C 289.043 403.373 279.691 584.019 279.690 584.037 C 279.696 584.020 335.587 411.274 335.593 411.257 C 335.595 411.275 359.998 592.579 360.000 592.597 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 322.434 267.021 C 322.434 246.228 339.208 229.455 360.000 229.455 C 380.792 229.455 397.566 246.228 397.566 267.021 C 397.566 287.813 380.792 304.586 360.000 304.586 C 339.208 304.586 322.434 287.813 322.434 267.021 M 269.641 244.620 C 293.268 231.877 323.353 226.810 360.000 226.812 C 395.572 226.815 424.914 231.560 450.112 244.521 C 451.833 251.655 452.425 259.228 452.253 267.021 C 451.130 318.070 411.061 359.274 360.000 359.274 C 308.939 359.274 268.922 318.069 267.747 267.021 C 267.567 259.217 268.143 251.634 269.641 244.620 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 229.455 C 380.792 229.455 397.566 246.228 397.566 267.021 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 397.566 267.021 C 397.566 287.813 380.792 304.586 360.000 304.586 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 304.586 C 339.208 304.586 322.434 287.813 322.434 267.021 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.434 267.021 C 322.434 246.228 339.208 229.455 360.000 229.455 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 229.455 C 380.792 229.455 397.566 246.228 397.566 267.021 C 397.566 287.813 380.792 304.586 360.000 304.586 C 339.208 304.586 322.434 287.813 322.434 267.021 C 322.434 246.228 339.208 229.455 360.000 229.455 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 267.747 267.021 C 267.567 259.217 268.143 251.634 269.641 244.620 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 450.112 244.521 C 451.833 251.655 452.425 259.228 452.253 267.021 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 452.253 267.021 C 451.130 318.070 411.061 359.274 360.000 359.274 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 359.274 C 308.939 359.274 268.922 318.069 267.747 267.021 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 267.747 267.021 C 267.567 259.217 268.143 251.634 269.641 244.620 C 222.790 260.046 180.555 303.377 180.546 303.382 C 180.564 303.390 257.645 379.953 360.000 379.953 C 462.355 379.953 539.436 303.390 539.454 303.382 C 539.445 303.377 496.362 259.042 450.112 244.521 C 451.833 251.655 452.425 259.228 452.253 267.021 C 451.130 318.070 411.061 359.274 360.000 359.274 C 308.939 359.274 268.922 318.069 267.747 267.021 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":645.921,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":179.411,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":42.872,\\\"y\\\":417.247,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8634726332158469,\\\"y\\\":0.50439568960023}},{\\\"point\\\":{\\\"x\\\":677.128,\\\"y\\\":417.247,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.863472633215845,\\\"y\\\":0.5043956896002331}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":580.693,\\\"y\\\":518.793,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129000543792842,\\\"y\\\":0.701265650425011}},{\\\"point\\\":{\\\"x\\\":139.126,\\\"y\\\":518.838,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987423116869965,\\\"y\\\":0.7153734562159211}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":589.061,\\\"y\\\":261.749,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314651427950151,\\\"y\\\":-0.7754042645193997}},{\\\"point\\\":{\\\"x\\\":131.717,\\\"y\\\":261.827,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817494092242942,\\\"y\\\":-0.7315857728402909}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":594.284,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"eye_vertical\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":199.114,\\\"max\\\":522.798},\\\"y\\\":{\\\"min\\\":8.588,\\\"max\\\":672.813}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_vertical\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_vertical_\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 201.114 340.701 C 201.114 144.757 360.940 10.621 360.956 10.588 C 360.972 10.621 520.798 144.757 520.798 340.701 C 520.798 536.644 360.972 670.780 360.956 670.813 C 360.940 670.780 201.114 536.644 201.114 340.701 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.956 390.282 C 333.513 390.282 311.375 368.143 311.375 340.701 C 311.375 313.258 333.513 291.119 360.956 291.119 C 388.399 291.119 410.537 313.258 410.537 340.701 C 410.537 368.143 388.399 390.282 360.956 390.282 M 360.956 472.836 C 287.820 472.836 228.821 413.837 228.821 340.701 C 228.821 267.565 287.820 208.565 360.956 208.565 C 434.092 208.565 493.091 267.565 493.091 340.701 C 493.091 413.837 434.092 472.836 360.956 472.836 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":251.527,\\\"max\\\":470.385},\\\"y\\\":{\\\"min\\\":231.272,\\\"max\\\":450.129}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.956,\\\"y\\\":705.429,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.956,\\\"y\\\":19.999,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":201.036,\\\"y\\\":341.291,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872464433512,\\\"y\\\":0.005050440638603526}},{\\\"point\\\":{\\\"x\\\":520.62,\\\"y\\\":341.291,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872494386687,\\\"y\\\":0.005049847530930028}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":461.447,\\\"y\\\":545.748,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128964530124513,\\\"y\\\":0.7012693115218046}},{\\\"point\\\":{\\\"x\\\":261.179,\\\"y\\\":545.778,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987185559104256,\\\"y\\\":0.71539665894275}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":463.876,\\\"y\\\":138.73,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6315030131668488,\\\"y\\\":-0.7753734225269724}},{\\\"point\\\":{\\\"x\\\":257.619,\\\"y\\\":138.78,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817070244783117,\\\"y\\\":-0.731625268000584}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360.929,\\\"y\\\":665.578,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"],\\\"creature_frequency_multiplier\\\":4}},{\\\"name\\\":\\\"eyeball\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":120.512,\\\"max\\\":599.488},\\\"y\\\":{\\\"min\\\":54.225,\\\"max\\\":533.201}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eyeball\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"starburst_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 533.201 C 360.002 533.195 377.796 466.562 377.798 466.556 C 377.801 466.562 408.345 528.342 408.348 528.348 C 408.348 528.341 411.742 459.664 411.742 459.658 C 411.746 459.663 453.338 514.416 453.342 514.422 C 453.341 514.415 442.908 446.530 442.906 446.523 C 442.912 446.528 494.022 492.372 494.027 492.377 C 494.025 492.371 470.602 427.852 470.600 427.845 C 470.606 427.849 529.446 463.162 529.452 463.166 C 529.449 463.160 494.136 404.319 494.132 404.314 C 494.138 404.316 558.657 427.738 558.664 427.741 C 558.659 427.736 512.815 376.625 512.810 376.620 C 512.817 376.621 580.702 387.054 580.709 387.055 C 580.703 387.051 525.950 345.460 525.944 345.455 C 525.951 345.455 594.628 342.062 594.635 342.061 C 594.628 342.058 532.849 311.514 532.843 311.511 C 532.849 311.510 599.482 293.715 599.488 293.713 C 599.482 293.711 532.849 275.917 532.843 275.915 C 532.849 275.912 594.628 245.368 594.635 245.365 C 594.628 245.365 525.951 241.971 525.944 241.971 C 525.950 241.967 580.703 200.376 580.709 200.372 C 580.702 200.373 512.817 210.806 512.810 210.807 C 512.815 210.802 558.659 159.691 558.664 159.686 C 558.657 159.688 494.138 183.111 494.132 183.113 C 494.136 183.107 529.449 124.267 529.452 124.261 C 529.446 124.264 470.606 159.578 470.600 159.581 C 470.603 159.575 494.025 95.056 494.028 95.049 C 494.022 95.054 442.912 140.899 442.906 140.903 C 442.908 140.896 453.341 73.011 453.342 73.005 C 453.338 73.010 411.746 127.763 411.742 127.769 C 411.742 127.762 408.348 59.085 408.348 59.079 C 408.345 59.085 377.801 120.864 377.798 120.871 C 377.796 120.864 360.002 54.232 360.000 54.225 C 359.998 54.232 342.204 120.864 342.202 120.871 C 342.199 120.864 311.655 59.085 311.652 59.079 C 311.652 59.085 308.258 127.762 308.258 127.769 C 308.254 127.763 266.662 73.010 266.658 73.005 C 266.659 73.011 277.092 140.896 277.094 140.903 C 277.088 140.899 225.978 95.054 225.973 95.049 C 225.975 95.056 249.398 159.575 249.400 159.581 C 249.394 159.578 190.554 124.264 190.548 124.261 C 190.551 124.267 225.864 183.107 225.868 183.113 C 225.862 183.110 161.343 159.688 161.336 159.686 C 161.341 159.691 207.185 210.802 207.190 210.807 C 207.183 210.806 139.298 200.373 139.291 200.372 C 139.297 200.376 194.050 241.967 194.056 241.971 C 194.049 241.971 125.372 245.365 125.365 245.365 C 125.372 245.368 187.151 275.912 187.157 275.915 C 187.151 275.917 120.518 293.711 120.512 293.713 C 120.518 293.715 187.151 311.510 187.157 311.511 C 187.151 311.514 125.372 342.058 125.365 342.061 C 125.372 342.062 194.049 345.455 194.056 345.455 C 194.050 345.460 139.297 387.051 139.291 387.055 C 139.298 387.054 207.183 376.621 207.190 376.620 C 207.185 376.625 161.341 427.735 161.336 427.740 C 161.343 427.738 225.862 404.315 225.868 404.313 C 225.864 404.319 190.551 463.160 190.548 463.166 C 190.554 463.162 249.394 427.849 249.400 427.845 C 249.397 427.852 225.975 492.371 225.972 492.377 C 225.978 492.372 277.088 446.528 277.094 446.523 C 277.092 446.530 266.659 514.415 266.658 514.422 C 266.662 514.416 308.254 459.663 308.258 459.658 C 308.258 459.664 311.652 528.341 311.652 528.348 C 311.655 528.342 342.199 466.562 342.202 466.556 C 342.204 466.562 359.998 533.195 360.000 533.201 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eyeball\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#CFF21D5D-28C3-4C68-9AB6-9D56F4044F2C_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 82.066 C 477.145 82.066 571.647 176.568 571.647 293.713 C 571.647 410.858 477.145 505.360 360.000 505.360 C 242.855 505.360 148.353 410.858 148.353 293.713 C 148.353 176.568 242.855 82.066 360.000 82.066 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.992 190.780 C 385.805 190.780 442.930 247.905 442.930 318.718 C 442.930 389.531 385.805 446.656 314.992 446.656 C 244.179 446.656 187.054 389.531 187.054 318.718 C 187.054 247.905 244.179 190.780 314.992 190.780 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 299.566 296.866 C 316.997 296.866 331.059 310.928 331.059 328.359 C 331.059 345.791 316.997 359.853 299.566 359.853 C 282.134 359.853 268.072 345.791 268.072 328.359 C 268.072 310.928 282.134 296.866 299.566 296.866 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":215.459,\\\"max\\\":384.475},\\\"y\\\":{\\\"min\\\":243.38,\\\"max\\\":412.397}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.057,\\\"y\\\":697.505,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.057,\\\"y\\\":84.409,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":151.74,\\\"y\\\":294.051,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999868693859837,\\\"y\\\":0.005124554187400743}},{\\\"point\\\":{\\\"x\\\":569.039,\\\"y\\\":294.051,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999868724439995,\\\"y\\\":0.005123957422566158}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":508.442,\\\"y\\\":442.133,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129635150717997,\\\"y\\\":0.7012011310433431}},{\\\"point\\\":{\\\"x\\\":212.393,\\\"y\\\":442.163,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986716018009902,\\\"y\\\":0.7154425153964772}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":508.124,\\\"y\\\":146.038,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314733538627079,\\\"y\\\":-0.7753975776086637}},{\\\"point\\\":{\\\"x\\\":212.493,\\\"y\\\":146.088,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817454325875962,\\\"y\\\":-0.7315894785642771}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360.057,\\\"y\\\":504.102,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"CFF21D5D-28C3-4C68-9AB6-9D56F4044F2C_0\\\",\\\"cx\\\":\\\"40.25%\\\",\\\"cy\\\":\\\"54.60%\\\",\\\"r\\\":\\\"68.93%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"],\\\"creature_frequency_multiplier\\\":5}},{\\\"name\\\":\\\"eyelash\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":38.516,\\\"max\\\":681.484},\\\"y\\\":{\\\"min\\\":228.463,\\\"max\\\":491.537}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_closed\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"eye_closed\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 315.824 399.052 C 315.827 399.052 345.744 402.331 345.747 402.332 C 351.677 432.067 363.535 491.528 363.537 491.537 C 363.538 491.528 372.142 432.242 376.444 402.594 C 376.448 402.594 407.010 399.777 407.013 399.776 C 418.546 427.205 441.609 482.053 441.612 482.062 C 441.612 482.053 438.243 423.364 436.559 394.015 C 436.562 394.014 464.936 385.467 464.939 385.466 C 481.278 409.650 513.951 458.011 513.956 458.018 C 513.954 458.010 499.327 402.196 492.012 374.284 C 492.015 374.283 517.632 360.625 517.635 360.624 C 538.108 380.742 579.049 420.973 579.055 420.979 C 579.051 420.972 554.128 370.087 541.664 344.640 C 541.666 344.638 563.956 326.490 563.958 326.488 C 587.773 341.832 635.394 372.516 635.401 372.521 C 635.396 372.514 601.383 328.388 584.374 306.322 C 584.376 306.319 602.768 284.299 602.770 284.297 C 629.008 294.270 681.476 314.212 681.484 314.215 C 681.478 314.210 639.830 278.451 619.002 260.569 C 619.004 260.566 635.480 228.466 635.481 228.463 C 635.455 228.477 539.325 371.876 367.141 372.621 C 195.081 373.366 93.284 231.625 93.256 231.611 C 93.257 231.613 103.804 250.639 103.805 250.641 C 82.042 276.274 38.522 327.531 38.516 327.539 C 38.524 327.534 94.772 296.688 122.900 281.263 C 122.902 281.266 141.051 303.555 141.053 303.557 C 123.027 330.333 86.980 383.877 86.974 383.885 C 86.982 383.879 136.471 343.944 161.219 323.973 C 161.221 323.975 183.241 342.367 183.244 342.369 C 170.589 371.569 145.284 429.959 145.280 429.968 C 145.286 429.961 186.408 382.390 206.972 358.602 C 206.974 358.603 232.247 372.527 232.250 372.529 C 225.453 403.112 211.860 464.268 211.858 464.278 C 211.863 464.270 243.233 410.764 258.920 384.008 C 258.923 384.009 286.827 392.896 286.830 392.896 C 286.265 423.699 285.135 485.295 285.135 485.304 C 285.138 485.295 305.594 427.802 315.824 399.052 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":228.662,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_be_nested\\\":true}},{\\\"name\\\":\\\"face\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":37.601,\\\"max\\\":682.399},\\\"y\\\":{\\\"min\\\":20.422,\\\"max\\\":665.219}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"face\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"face\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 22.422 C 540.224 22.422 680.399 162.596 680.399 342.821 C 680.399 523.045 540.224 663.219 360.000 663.219 C 179.776 663.219 39.601 523.045 39.601 342.821 C 39.601 162.596 179.776 22.422 360.000 22.422 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 663.219 C 540.224 663.219 680.399 523.333 680.399 342.821 C 680.399 523.045 540.224 663.219 360.000 663.219 C 179.776 663.219 39.601 523.045 39.601 342.821 C 39.601 162.596 179.776 22.422 360.000 22.422 C 540.224 22.422 680.399 162.596 680.399 342.821 M 39.601 342.821 C 39.601 523.333 179.776 663.219 360.000 663.219 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 39.601 342.821 C 39.601 162.596 179.776 22.422 360.000 22.422 C 540.224 22.422 680.399 162.596 680.399 342.821 C 680.399 523.045 540.224 663.219 360.000 663.219 C 179.776 663.219 39.601 523.045 39.601 342.821 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#40214646-CF47-41F5-871C-6C2EC9E91AE6_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 375.524 572.541 C 375.524 563.949 368.593 557.017 360.000 557.017 C 351.407 557.017 344.476 563.949 344.476 572.541 C 344.476 581.134 351.408 588.065 360.000 588.065 C 368.592 588.065 375.524 581.134 375.524 572.541 M 401.372 572.541 C 401.372 549.642 382.899 531.169 360.000 531.169 C 337.101 531.169 318.628 549.642 318.628 572.541 C 318.628 595.441 337.101 613.914 360.000 613.914 C 382.899 613.914 401.372 595.441 401.372 572.541 M 463.360 572.541 C 463.350 572.536 421.351 522.494 360.000 522.494 C 298.649 522.494 256.650 572.536 256.640 572.541 C 256.650 572.546 298.649 622.588 360.000 622.588 C 421.351 622.588 463.350 572.546 463.360 572.541 M 554.204 343.393 C 554.204 334.800 547.272 327.869 538.680 327.869 C 530.088 327.868 523.156 334.800 523.156 343.393 C 523.156 351.985 530.088 358.917 538.680 358.917 C 547.272 358.917 554.204 351.985 554.204 343.393 M 580.052 343.393 C 580.052 320.494 561.579 302.021 538.680 302.021 C 515.781 302.021 497.308 320.494 497.308 343.393 C 497.308 366.292 515.781 384.765 538.680 384.765 C 561.579 384.765 580.052 366.292 580.052 343.393 M 642.040 343.393 C 642.030 343.388 600.031 293.346 538.680 293.346 C 477.329 293.346 435.330 343.388 435.320 343.393 C 435.330 343.398 477.329 393.440 538.680 393.440 C 600.031 393.440 642.030 343.398 642.040 343.393 M 165.796 343.393 C 165.796 334.800 172.728 327.868 181.320 327.869 C 189.913 327.869 196.844 334.800 196.844 343.393 C 196.844 351.985 189.913 358.917 181.320 358.917 C 172.728 358.917 165.796 351.985 165.796 343.393 M 139.948 343.393 C 139.948 320.494 158.421 302.021 181.320 302.021 C 204.220 302.021 222.693 320.494 222.693 343.393 C 222.693 366.292 204.220 384.765 181.320 384.765 C 158.421 384.765 139.948 366.292 139.948 343.393 M 77.960 343.393 C 77.970 343.388 119.969 293.346 181.320 293.346 C 242.671 293.346 284.670 343.388 284.680 343.393 C 284.670 343.398 242.671 393.440 181.320 393.440 C 119.969 393.440 77.970 343.398 77.960 343.393 M 179.776 242.696 C 79.651 242.696 39.601 302.771 39.601 342.821 C 39.601 523.333 179.776 663.219 360.000 663.219 C 540.224 663.219 680.399 523.333 680.399 342.821 C 680.399 302.771 640.349 242.696 540.224 242.696 C 460.125 242.696 397.178 305.507 391.888 314.341 C 386.585 323.198 398.840 479.319 398.841 479.335 C 398.837 479.336 372.941 486.769 360.000 486.769 C 347.059 486.769 321.163 479.336 321.159 479.335 C 321.160 479.319 333.415 323.198 328.112 314.341 C 322.822 305.507 259.875 242.696 179.776 242.696 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 149.189 C 351.407 149.189 344.476 156.121 344.476 164.713 C 344.476 173.306 351.407 180.237 360.000 180.237 C 368.592 180.237 375.524 173.305 375.524 164.713 C 375.524 156.121 368.592 149.189 360.000 149.189 M 360.000 123.341 C 337.101 123.341 318.628 141.814 318.628 164.713 C 318.628 187.612 337.101 206.085 360.000 206.085 C 382.899 206.085 401.372 187.612 401.372 164.713 C 401.372 141.814 382.899 123.341 360.000 123.341 M 360.000 61.353 C 359.995 61.363 309.953 103.362 309.953 164.713 C 309.953 226.064 359.995 268.062 360.000 268.073 C 360.005 268.062 410.047 226.064 410.047 164.713 C 410.047 103.362 360.005 61.363 360.000 61.353 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 39.601 342.821 C 39.601 162.596 179.776 22.422 360.000 22.422 C 540.224 22.422 680.399 162.596 680.399 342.821 C 680.399 523.045 540.224 663.219 360.000 663.219 C 179.776 663.219 39.601 523.045 39.601 342.821 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 39.601 342.821 C 39.601 523.333 179.776 663.219 360.000 663.219 C 540.224 663.219 680.399 523.333 680.399 342.821 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":262.585,\\\"max\\\":457.415},\\\"y\\\":{\\\"min\\\":63.363,\\\"max\\\":265.134}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":705.909,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":22.716,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":41.014,\\\"y\\\":343.733,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874030844323,\\\"y\\\":0.005019329880869008}},{\\\"point\\\":{\\\"x\\\":680.005,\\\"y\\\":343.733,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874011682236,\\\"y\\\":0.005019711627401636}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":587.215,\\\"y\\\":570.483,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129387585883934,\\\"y\\\":0.7012263019186036}},{\\\"point\\\":{\\\"x\\\":133.889,\\\"y\\\":570.53,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987295668057304,\\\"y\\\":0.7153859045798122}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":586.729,\\\"y\\\":117.086,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314054370598631,\\\"y\\\":-0.7754528831922952}},{\\\"point\\\":{\\\"x\\\":134.041,\\\"y\\\":117.163,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817598307345952,\\\"y\\\":-0.7315760611151352}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":661.078,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"40214646-CF47-41F5-871C-6C2EC9E91AE6_2\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"34.20%\\\",\\\"r\\\":\\\"112.08%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"31.37%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"attach_to\\\":[\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"face_nest\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":165.143,\\\"max\\\":554.857},\\\"y\\\":{\\\"min\\\":165.143,\\\"max\\\":554.857}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"face_nest\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"face\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 552.857 C 466.745 552.857 552.857 466.745 552.857 360.000 C 552.857 253.255 466.745 167.143 360.000 167.143 C 253.255 167.143 167.143 253.255 167.143 360.000 C 167.143 466.745 253.255 552.857 360.000 552.857 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":173.729,\\\"max\\\":356.626},\\\"y\\\":{\\\"min\\\":268.551,\\\"max\\\":451.449}},{\\\"x\\\":{\\\"min\\\":363.374,\\\"max\\\":546.271},\\\"y\\\":{\\\"min\\\":268.551,\\\"max\\\":451.449}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":685.547,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":360.027,\\\"y\\\":184.025,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005095357237546288,\\\"y\\\":-0.9999870185830523}},{\\\"point\\\":{\\\"x\\\":271.989,\\\"y\\\":207.615,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.504406589298403,\\\"y\\\":-0.8634662660882313}},{\\\"point\\\":{\\\"x\\\":448.011,\\\"y\\\":207.615,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.504406589298403,\\\"y\\\":-0.8634662660882313}},{\\\"point\\\":{\\\"x\\\":207.587,\\\"y\\\":272.036,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8685280541802166,\\\"y\\\":-0.4956400095855124}},{\\\"point\\\":{\\\"x\\\":512.413,\\\"y\\\":272.036,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8685280541802166,\\\"y\\\":-0.4956400095855124}},{\\\"point\\\":{\\\"x\\\":184.025,\\\"y\\\":360.027,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999870185830523,\\\"y\\\":0.005095357237546288}},{\\\"point\\\":{\\\"x\\\":535.975,\\\"y\\\":360.027,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999870185830523,\\\"y\\\":0.005095357237546302}},{\\\"point\\\":{\\\"x\\\":207.615,\\\"y\\\":448.011,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8634662660882313,\\\"y\\\":0.504406589298403}},{\\\"point\\\":{\\\"x\\\":512.385,\\\"y\\\":448.011,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.863466266088232,\\\"y\\\":0.5044065892984019}},{\\\"point\\\":{\\\"x\\\":272.036,\\\"y\\\":512.413,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.4956400095855124,\\\"y\\\":0.8685280541802166}},{\\\"point\\\":{\\\"x\\\":447.964,\\\"y\\\":512.413,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.4956400095855124,\\\"y\\\":0.8685280541802166}},{\\\"point\\\":{\\\"x\\\":360.027,\\\"y\\\":535.975,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005095357237546302,\\\"y\\\":0.9999870185830523}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"never_flip_attachments\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"feather\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":262.24,\\\"max\\\":457.76},\\\"y\\\":{\\\"min\\\":17.28,\\\"max\\\":641.392}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"frond_leaf\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"frond\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 394.477 56.528 C 394.474 56.524 371.503 31.696 360.015 19.280 C 360.015 19.342 360.015 639.330 360.015 639.392 C 360.024 639.382 438.136 563.069 446.579 542.860 C 450.607 533.219 453.136 481.353 453.137 481.347 C 453.137 481.342 455.498 425.087 455.498 425.081 C 455.498 425.075 455.760 368.820 455.760 368.814 C 455.760 368.809 452.875 314.652 452.874 314.646 C 452.874 314.641 448.492 256.549 448.492 256.543 C 448.491 256.538 440.963 201.594 440.962 201.588 C 440.961 201.583 430.285 145.590 430.284 145.584 C 430.283 145.579 417.508 95.880 417.507 95.875 C 417.505 95.871 394.479 56.532 394.477 56.528 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.015 19.280 C 360.015 19.342 360.015 639.330 360.015 639.392 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.015 19.280 C 360.015 19.342 360.015 639.330 360.015 639.392 C 360.007 639.382 281.867 563.071 273.421 542.860 C 269.392 533.219 266.864 481.353 266.863 481.347 C 266.863 481.342 264.502 425.087 264.502 425.081 C 264.502 425.075 264.240 368.820 264.240 368.814 C 264.240 368.809 267.125 314.652 267.126 314.646 C 267.126 314.641 271.508 256.549 271.508 256.543 C 271.509 256.538 279.037 201.594 279.038 201.588 C 279.039 201.583 289.715 145.590 289.716 145.584 C 289.717 145.579 302.492 95.880 302.493 95.875 C 302.495 95.871 325.521 56.532 325.523 56.528 C 325.526 56.524 360.012 19.283 360.015 19.280 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 394.477 56.528 C 382.990 79.675 360.019 125.963 360.015 125.970 C 360.015 125.976 360.015 184.969 360.015 184.975 C 360.021 184.966 398.343 125.575 417.507 95.875 C 417.508 95.880 430.283 145.579 430.284 145.584 C 406.861 177.333 360.022 240.823 360.015 240.832 C 360.015 240.838 360.015 293.020 360.015 293.025 C 360.023 293.016 413.980 232.067 440.962 201.588 C 440.963 201.594 448.491 256.538 448.492 256.543 C 419.000 288.110 360.024 351.234 360.015 351.244 C 360.015 351.249 360.015 409.456 360.015 409.462 C 360.025 409.452 421.921 346.252 452.874 314.646 C 452.875 314.652 455.760 368.809 455.760 368.814 C 423.845 401.769 360.025 467.670 360.015 467.680 C 360.015 467.686 360.015 525.893 360.015 525.898 C 360.025 525.888 423.670 458.687 455.498 425.081 C 455.498 425.087 453.137 481.342 453.137 481.347 C 422.096 515.604 360.025 584.107 360.015 584.117 C 360.015 584.122 360.015 639.386 360.015 639.392 C 360.015 639.330 360.015 19.342 360.015 19.280 C 360.015 19.290 360.015 125.960 360.015 125.970 M 360.015 525.898 C 360.015 525.904 360.015 584.111 360.015 584.117 M 360.015 409.462 C 360.015 409.468 360.015 467.674 360.015 467.680 M 360.015 293.025 C 360.015 293.031 360.015 351.238 360.015 351.244 M 360.015 184.975 C 360.015 184.981 360.015 240.827 360.015 240.832 M 446.579 542.860 C 438.136 563.069 360.024 639.382 360.015 639.392 M 453.137 481.347 C 453.136 481.353 450.607 533.219 446.579 542.860 M 455.760 368.814 C 455.760 368.820 455.498 425.075 455.498 425.081 M 448.492 256.543 C 448.492 256.549 452.874 314.641 452.874 314.646 M 430.284 145.584 C 430.285 145.590 440.961 201.583 440.962 201.588 M 394.477 56.528 C 394.479 56.532 417.505 95.871 417.507 95.875 M 360.015 19.280 C 360.019 19.283 394.474 56.524 394.477 56.528 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.015 125.970 C 360.012 125.963 337.020 79.675 325.523 56.528 C 325.526 56.524 360.012 19.283 360.015 19.280 C 360.015 19.290 360.015 125.960 360.015 125.970 C 360.015 125.976 360.015 184.969 360.015 184.975 C 360.010 184.966 321.667 125.575 302.493 95.875 C 302.495 95.871 325.521 56.532 325.523 56.528 M 360.015 240.832 C 360.008 240.823 313.149 177.333 289.716 145.584 C 289.717 145.579 302.492 95.880 302.493 95.875 M 360.015 293.025 C 360.007 293.016 306.030 232.067 279.038 201.588 C 279.039 201.583 289.715 145.590 289.716 145.584 M 360.015 351.244 C 360.006 351.234 301.010 288.110 271.508 256.543 C 271.509 256.538 279.037 201.594 279.038 201.588 M 360.015 409.462 C 360.006 409.452 298.089 346.252 267.126 314.646 C 267.126 314.641 271.508 256.549 271.508 256.543 M 360.015 467.680 C 360.006 467.670 296.165 401.769 264.240 368.814 C 264.240 368.809 267.125 314.652 267.126 314.646 M 360.015 525.898 C 360.006 525.888 296.340 458.687 264.502 425.081 C 264.502 425.075 264.240 368.820 264.240 368.814 M 360.015 584.117 C 360.006 584.107 297.914 515.604 266.863 481.347 C 266.863 481.342 264.502 425.087 264.502 425.081 M 273.421 542.860 C 269.392 533.219 266.864 481.353 266.863 481.347 M 360.015 639.392 C 360.007 639.382 281.867 563.071 273.421 542.860 M 360.015 584.117 C 360.015 584.122 360.015 639.386 360.015 639.392 C 360.015 639.330 360.015 19.342 360.015 19.280 M 360.015 525.898 C 360.015 525.904 360.015 584.111 360.015 584.117 M 360.015 467.680 C 360.015 467.686 360.015 525.893 360.015 525.898 M 360.015 409.462 C 360.015 409.468 360.015 467.674 360.015 467.680 M 360.015 351.244 C 360.015 351.249 360.015 409.456 360.015 409.462 M 360.015 293.025 C 360.015 293.031 360.015 351.238 360.015 351.244 M 360.015 240.832 C 360.015 240.838 360.015 293.020 360.015 293.025 M 360.015 184.975 C 360.015 184.981 360.015 240.827 360.015 240.832 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.972,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":17.368,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":162.643,\\\"y\\\":330.161,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872590020044,\\\"y\\\":0.005047953412839069}},{\\\"point\\\":{\\\"x\\\":557.357,\\\"y\\\":330.161,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872590020044,\\\"y\\\":0.005047953412839034}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":533.075,\\\"y\\\":542.212,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6389108486823514,\\\"y\\\":0.7692807858227044}},{\\\"point\\\":{\\\"x\\\":186.783,\\\"y\\\":542.256,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6237624424621819,\\\"y\\\":0.7816139810505012}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":533.196,\\\"y\\\":118.322,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5539340237528295,\\\"y\\\":-0.8325605667631634}},{\\\"point\\\":{\\\"x\\\":187.392,\\\"y\\\":118.394,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6057313141419982,\\\"y\\\":-0.7956692623620747}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":633.96,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"fire\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":168.94726309618682,\\\"max\\\":528.6748422496752},\\\"y\\\":{\\\"min\\\":53.733,\\\"max\\\":653.5776833162997}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fire\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fire\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.787 651.576 C 205.454 652.158 90.213 501.712 244.220 371.101 C 216.541 464.032 245.347 512.915 269.862 499.310 C 321.089 470.879 289.492 346.193 248.875 293.379 C 222.305 258.831 251.282 198.683 287.811 178.787 C 259.845 220.824 279.046 279.861 302.873 283.148 C 323.774 286.031 337.491 238.385 347.584 210.678 C 369.575 150.310 321.442 129.224 360.353 55.733 C 369.799 125.299 430.990 195.865 391.971 275.106 C 378.259 302.955 363.845 349.791 395.506 376.230 C 423.077 399.252 464.833 310.222 438.775 278.966 C 567.447 347.619 361.733 459.669 431.405 504.439 C 479.238 535.176 477.221 452.701 510.895 424.950 C 554.690 540.342 509.625 650.905 346.787 651.576 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 336.808 641.236 C 298.776 637.412 245.785 611.154 225.908 578.505 C 184.028 509.713 209.107 469.856 209.105 469.846 C 209.111 469.852 210.661 534.492 269.596 534.817 C 289.611 534.927 316.831 465.918 317.764 446.322 C 319.823 403.062 310.538 382.697 302.812 356.493 C 296.411 334.779 273.155 287.115 273.152 287.108 C 273.157 287.110 298.903 316.811 321.643 307.141 C 361.343 290.258 377.129 186.448 377.135 186.436 C 377.134 186.445 371.657 251.816 367.160 279.547 C 363.881 299.768 350.339 325.483 352.822 346.309 C 364.250 442.123 448.818 370.146 448.827 370.148 C 448.822 370.155 438.779 397.003 400.659 438.480 C 373.014 468.560 392.245 534.161 423.063 542.659 C 469.003 555.327 500.348 509.056 500.356 509.053 C 500.347 509.065 510.400 592.927 413.123 632.417 C 390.940 641.422 359.452 643.512 336.808 641.236 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 320.450 624.575 C 246.147 598.073 237.119 550.507 237.111 550.500 C 237.117 550.500 276.940 581.091 300.961 553.861 C 321.688 530.365 336.780 488.529 341.289 457.524 C 343.667 441.169 339.794 418.891 337.010 402.601 C 332.721 377.508 326.727 330.949 326.726 330.942 C 326.727 330.947 337.000 368.779 343.849 382.494 C 350.411 395.634 365.845 415.400 380.495 414.956 C 391.286 414.629 379.375 438.478 379.375 438.480 C 379.374 438.484 368.936 463.645 367.053 477.688 C 364.640 495.677 358.035 523.123 368.173 538.178 C 399.070 584.060 458.900 563.940 458.909 563.942 C 458.904 563.948 431.806 606.641 413.372 616.325 C 388.596 629.340 346.810 633.977 320.450 624.575 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":230.146,\\\"max\\\":489.854},\\\"y\\\":{\\\"min\\\":413.041,\\\"max\\\":650.755}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":688.175,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":60.399,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":182.529,\\\"y\\\":449.432,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088752084}},{\\\"point\\\":{\\\"x\\\":517.233,\\\"y\\\":449.432,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.005035854088752063}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":481.315,\\\"y\\\":611.717,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129335762692849,\\\"y\\\":0.7012315707581112}},{\\\"point\\\":{\\\"x\\\":230.857,\\\"y\\\":611.765,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987254201015092,\\\"y\\\":0.7153899547127913}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":259.018,\\\"y\\\":201.078,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817084818456935,\\\"y\\\":-0.7316239100655744}},{\\\"point\\\":{\\\"x\\\":472.974,\\\"y\\\":305.177,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314091670147453,\\\"y\\\":-0.7754498460956359}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":648.014,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"fire_swirl\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":173.7729406819721,\\\"max\\\":580.3897987017871},\\\"y\\\":{\\\"min\\\":21.992,\\\"max\\\":656.86209197185}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fire_swirl\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fire_swirl_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 547.049 327.735 C 555.272 386.829 544.910 395.166 529.649 412.286 C 546.542 418.966 600.438 457.929 570.502 517.508 C 544.229 569.797 454.956 582.370 413.359 534.522 C 385.719 502.728 381.243 454.779 400.228 417.827 C 434.590 350.947 460.252 356.912 466.078 323.763 C 471.479 293.037 446.754 277.282 449.711 251.206 C 454.367 210.139 470.359 196.287 470.362 196.282 C 470.365 196.288 473.423 230.562 500.774 256.374 C 528.668 282.699 544.370 308.484 547.049 327.735 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 547.049 327.735 C 555.272 386.829 544.910 395.166 529.649 412.286 C 546.542 418.966 600.438 457.929 570.502 517.508 C 544.229 569.797 454.956 582.370 413.359 534.522 C 385.719 502.728 381.243 454.779 400.228 417.827 C 434.590 350.947 460.252 356.912 466.078 323.763 C 471.479 293.037 446.754 277.282 449.711 251.206 C 454.367 210.139 470.359 196.287 470.362 196.282 C 470.365 196.288 473.423 230.562 500.774 256.374 C 528.668 282.699 544.370 308.484 547.049 327.735 M 476.607 409.390 C 493.293 404.417 517.787 407.596 529.649 412.286 M 450.952 427.681 C 455.588 420.534 471.532 410.902 476.607 409.390 M 480.760 515.126 C 434.784 509.371 425.559 466.831 450.952 427.681 M 523.826 465.990 C 537.666 493.235 516.678 519.621 480.760 515.126 M 482.914 460.066 C 495.333 445.071 516.585 451.738 523.826 465.990 M 496.384 477.783 C 487.905 488.811 473.954 470.885 482.914 460.066 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 239.062 249.155 C 160.206 323.471 159.470 410.704 206.686 493.281 C 193.328 514.891 186.116 547.816 196.573 576.299 C 210.916 615.366 250.702 647.566 289.266 654.361 C 343.510 663.919 395.496 625.984 414.699 592.975 C 455.663 522.562 426.046 472.712 407.779 445.115 C 388.897 416.590 364.079 413.653 350.510 404.333 C 301.456 370.640 290.486 341.215 294.783 291.690 C 305.475 168.450 278.695 156.188 278.694 156.175 C 278.690 156.184 281.349 209.301 239.062 249.155 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 239.062 249.155 C 160.206 323.471 159.470 410.704 206.686 493.281 C 193.328 514.891 186.116 547.816 196.573 576.299 C 210.916 615.366 250.702 647.566 289.266 654.361 C 343.510 663.919 395.496 625.984 414.699 592.975 C 455.663 522.562 426.046 472.712 407.779 445.115 C 388.897 416.590 364.079 413.653 350.510 404.333 C 301.456 370.640 290.486 341.215 294.783 291.690 C 305.475 168.450 278.695 156.188 278.694 156.175 C 278.690 156.184 281.349 209.301 239.062 249.155 M 367.690 497.387 C 339.471 426.689 252.436 419.267 206.686 493.281 M 282.907 587.194 C 334.836 611.549 387.405 546.781 367.690 497.387 M 267.747 511.440 C 237.029 530.567 254.641 573.937 282.907 587.194 M 309.048 537.288 C 315.883 517.564 294.048 495.064 267.747 511.440 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 440.663 159.660 C 449.212 221.097 438.439 229.765 422.573 247.564 C 439.481 256.097 496.169 295.016 465.047 356.958 C 437.732 411.322 344.918 424.393 301.670 374.647 C 272.935 341.592 268.281 291.741 288.019 253.324 C 323.744 183.792 350.424 189.993 356.482 155.530 C 362.096 123.584 336.389 107.205 339.464 80.094 C 344.305 37.398 360.931 22.998 360.933 22.992 C 360.937 22.998 364.117 58.632 392.553 85.468 C 421.554 112.837 437.878 139.645 440.663 159.660 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 440.663 159.660 C 449.212 221.097 438.439 229.765 422.573 247.564 C 439.481 256.097 496.169 295.016 465.047 356.958 C 437.732 411.322 344.918 424.393 301.670 374.647 C 272.935 341.592 268.281 291.741 288.019 253.324 C 323.744 183.792 350.424 189.993 356.482 155.530 C 362.096 123.584 336.389 107.205 339.464 80.094 C 344.305 37.398 360.931 22.998 360.933 22.992 C 360.937 22.998 364.117 58.632 392.553 85.468 C 421.554 112.837 437.878 139.645 440.663 159.660 M 367.428 244.551 C 382.774 238.474 408.019 240.219 422.573 247.564 M 340.755 263.567 C 347.129 254.894 362.308 246.578 367.428 244.551 M 371.745 354.481 C 323.945 348.498 312.027 302.663 340.755 263.567 M 416.519 303.397 C 430.909 331.722 409.087 359.156 371.745 354.481 M 373.985 297.238 C 384.567 279.982 408.991 288.579 416.519 303.397 M 387.988 315.658 C 379.173 327.123 368.871 305.577 373.985 297.238 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 468.961 200.312 C 451.344 282.708 510.791 280.717 512.176 338.763 C 512.874 368.045 498.924 388.408 476.607 409.390 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 280.553 161.787 C 280.553 161.795 289.504 209.547 277.676 236.309 C 265.991 262.748 218.989 295.258 248.300 379.700 C 263.731 424.155 281.663 442.460 281.666 442.467 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.478 27.181 C 341.162 112.847 402.968 110.775 404.408 171.125 C 405.134 201.567 390.630 222.738 367.428 244.551 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":700.722,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":26.07,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":211.538,\\\"y\\\":292.05,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874728093985,\\\"y\\\":0.005005419490153414}},{\\\"point\\\":{\\\"x\\\":508.462,\\\"y\\\":292.05,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874728093985,\\\"y\\\":0.005005419490153421}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":549.443,\\\"y\\\":574.973,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129121482047388,\\\"y\\\":0.7012533557439168}},{\\\"point\\\":{\\\"x\\\":170.186,\\\"y\\\":575.065,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986774464303269,\\\"y\\\":0.7154368077262991}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":643.382,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"fish\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":24.536572042871473,\\\"max\\\":645.2085195747563},\\\"y\\\":{\\\"min\\\":195.10785222666556,\\\"max\\\":524.8921477733345}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fish\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fish\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#2581A12F-5D29-460D-9D0A-585CF0296182_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 202.245 285.722 C 202.261 284.937 213.442 227.802 230.522 213.696 C 243.065 203.337 274.384 190.108 286.016 201.480 C 305.024 220.062 274.973 274.395 252.084 287.911 C 239.786 295.173 201.955 300.001 202.245 285.722 M 368.180 310.938 C 367.917 310.452 400.088 267.623 419.712 263.534 C 435.533 260.237 469.434 265.005 473.508 280.644 C 478.561 300.042 441.600 323.960 421.976 328.049 C 406.155 331.346 375.867 325.154 368.180 310.938 M 368.180 405.107 C 367.917 405.593 400.088 448.423 419.712 452.512 C 435.533 455.809 469.434 451.041 473.508 435.402 C 478.561 416.004 441.600 392.086 421.976 387.997 C 406.155 384.700 375.867 390.891 368.180 405.107 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 427.301 401.299 C 439.678 411.425 452.055 421.552 464.432 431.679 M 412.449 405.349 C 424.376 416.601 436.303 427.853 448.230 439.105 M 394.896 409.400 C 406.598 420.652 418.300 431.904 430.002 443.155 M 427.301 313.535 C 439.228 302.734 451.155 291.932 463.082 281.130 M 407.723 310.160 C 420.776 298.458 433.828 286.756 446.880 275.055 M 391.521 308.134 C 403.673 295.983 415.825 283.831 427.977 271.679 M 251.880 270.527 C 262.629 249.565 273.379 228.602 284.128 207.639 M 234.247 274.176 C 243.507 252.119 252.768 230.062 262.029 208.005 M 216.613 275.392 C 223.777 256.780 230.941 238.169 238.105 219.557 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#2581A12F-5D29-460D-9D0A-585CF0296182_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 114.271 307.632 C 124.949 307.632 133.563 316.246 133.563 326.924 C 133.563 337.602 124.949 346.216 114.271 346.216 C 103.593 346.216 94.979 337.602 94.979 326.924 C 94.979 316.246 103.593 307.632 114.271 307.632 M 640.003 455.925 C 657.127 438.920 600.065 390.341 600.065 360.808 C 600.065 331.275 657.127 282.696 640.003 265.691 C 622.012 247.825 571.074 301.524 541.482 310.851 C 527.063 315.395 504.780 322.181 489.695 321.185 C 441.358 317.995 410.983 264.947 333.347 256.474 C 328.119 255.903 322.901 255.445 317.187 255.054 C 236.327 249.515 160.790 269.037 146.355 274.256 C 130.731 279.904 42.478 303.727 27.095 357.827 C 25.311 364.101 27.900 371.904 33.454 379.705 C 64.819 423.755 136.721 438.364 146.355 441.399 C 159.576 445.563 238.071 466.013 317.266 460.605 C 323.138 460.205 328.248 459.751 333.347 459.181 C 410.960 450.497 441.254 394.780 489.695 394.469 C 505.237 394.370 526.954 405.244 541.482 410.765 C 570.485 421.787 622.012 473.790 640.003 455.925 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#2581A12F-5D29-460D-9D0A-585CF0296182_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 230.522 506.304 C 243.065 516.663 274.384 529.892 286.016 518.520 C 305.024 499.938 274.973 445.606 252.084 432.089 C 239.786 424.827 216.508 433.562 202.245 434.278 C 202.245 434.278 213.442 492.198 230.522 506.304 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 199.284 381.320 C 188.121 419.642 155.795 441.611 155.791 441.617 M 196.319 318.057 C 196.319 318.063 208.793 348.675 199.284 381.320 M 202.245 434.278 C 202.245 434.278 213.442 492.198 230.522 506.304 C 243.065 516.663 274.384 529.892 286.016 518.520 C 305.024 499.938 274.973 445.606 252.084 432.089 C 239.786 424.827 216.508 433.562 202.245 434.278 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 563.286 367.814 C 573.014 368.219 582.743 368.625 592.472 369.030 M 562.678 380.583 C 575.041 383.420 587.405 386.258 599.768 389.095 M 560.854 392.136 C 578.892 400.243 596.931 408.350 614.969 416.457 M 557.206 405.512 C 581.730 419.497 606.254 433.482 630.779 447.467 M 563.894 354.437 C 573.623 353.221 583.351 352.005 593.080 350.789 M 563.286 340.452 C 575.447 337.412 587.608 334.372 599.768 331.331 M 560.246 328.291 C 578.487 320.792 596.728 313.293 614.969 305.794 M 557.206 316.739 C 581.730 302.754 606.254 288.769 630.779 274.784 M 243.052 437.423 C 257.387 458.729 271.722 480.035 286.058 501.341 M 228.859 439.937 C 243.375 465.139 257.891 490.341 272.407 515.544 M 214.032 441.428 C 224.093 463.694 234.155 485.961 244.216 508.227 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 36.115 381.191 C 51.722 381.393 67.328 381.596 82.934 381.799 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":213.312,\\\"max\\\":385.754},\\\"y\\\":{\\\"min\\\":279.078,\\\"max\\\":422.947}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":701.029,\\\"y\\\":361.689,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":130.503,\\\"y\\\":277.124,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":326.135,\\\"y\\\":254.261,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.004941538946871695,\\\"y\\\":-0.9999877905218827}},{\\\"point\\\":{\\\"x\\\":326.135,\\\"y\\\":461.84,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.004942649128457766,\\\"y\\\":0.9999877850351938}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":500.099,\\\"y\\\":318.725,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.0116696700709083,\\\"y\\\":-0.9999319070818954}},{\\\"point\\\":{\\\"x\\\":500.099,\\\"y\\\":396.491,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.0116696700709083,\\\"y\\\":0.9999319070818954}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":598.638,\\\"y\\\":361.111,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"2581A12F-5D29-460D-9D0A-585CF0296182_0\\\",\\\"cx\\\":\\\"41.58%\\\",\\\"cy\\\":\\\"54.54%\\\",\\\"r\\\":\\\"94.38%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"42.35%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"2581A12F-5D29-460D-9D0A-585CF0296182_2\\\",\\\"cx\\\":\\\"44.71%\\\",\\\"cy\\\":\\\"51.81%\\\",\\\"r\\\":\\\"85.88%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"42.35%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"2581A12F-5D29-460D-9D0A-585CF0296182_3\\\",\\\"cx\\\":\\\"22.90%\\\",\\\"cy\\\":\\\"19.74%\\\",\\\"r\\\":\\\"131.68%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"17.65%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"fish_head\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":74.13132435510332,\\\"max\\\":592.424},\\\"y\\\":{\\\"min\\\":69.84812527137808,\\\"max\\\":650.151874728622}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fish_head\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fish_head\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 436.976 101.192 C 459.164 82.867 514.567 59.466 535.143 79.582 C 568.767 112.454 515.608 208.566 475.118 232.477 C 453.364 245.323 386.442 253.863 386.954 228.605 C 386.983 227.216 406.763 126.146 436.976 101.192 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 474.757 201.726 C 493.773 164.643 512.789 127.560 531.805 90.477 M 443.565 208.180 C 459.947 169.161 476.329 130.143 492.711 91.125 M 412.372 210.330 C 425.045 177.407 437.718 144.484 450.390 111.561 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 590.285 174.354 C 590.241 282.109 590.228 423.481 590.424 537.968 C 450.332 547.535 311.476 511.359 288.087 503.992 C 271.045 498.624 143.853 472.779 88.370 394.858 C 78.545 381.059 73.963 367.255 77.119 356.157 C 104.331 260.454 260.450 218.312 288.087 208.321 C 313.623 199.090 447.245 164.554 590.285 174.354 M 231.332 335.617 C 212.442 335.617 197.204 320.379 197.204 301.490 C 197.204 282.600 212.442 267.362 231.332 267.362 C 250.221 267.362 265.458 282.601 265.458 301.490 C 265.458 320.379 250.221 335.617 231.332 335.617 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 436.976 618.808 C 459.164 637.133 514.567 660.534 535.143 640.418 C 568.767 607.546 515.608 511.434 475.118 487.523 C 453.364 474.677 412.187 490.130 386.954 491.395 C 386.954 491.395 406.763 593.854 436.976 618.808 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 381.717 397.714 C 361.971 465.505 304.787 504.368 304.779 504.379 M 376.472 285.803 C 376.473 285.815 398.538 339.966 381.717 397.714 M 386.954 491.395 C 386.954 491.395 406.763 593.854 436.976 618.808 C 459.164 637.133 514.567 660.534 535.143 640.418 C 568.767 607.546 515.608 511.434 475.118 487.523 C 453.364 474.677 412.187 490.130 386.954 491.395 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 459.141 496.960 C 484.500 534.649 509.858 572.339 535.217 610.028 M 434.035 501.405 C 459.713 545.988 485.391 590.570 511.069 635.153 M 407.805 504.044 C 425.604 543.432 443.403 582.821 461.201 622.209 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 93.077 397.486 C 120.684 397.844 148.291 398.203 175.898 398.561 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":314.301,\\\"max\\\":568.031},\\\"y\\\":{\\\"min\\\":216.886,\\\"max\\\":460.128}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":591.974,\\\"y\\\":360,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":589.712,\\\"y\\\":360,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"fish_tail\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":87.6238222836559,\\\"max\\\":668.3718163549055},\\\"y\\\":{\\\"min\\\":172.354,\\\"max\\\":539.968}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fish_tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fish_tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 179.856 273.212 C 179.391 272.351 236.300 196.588 271.013 189.354 C 299.001 183.523 358.970 191.957 366.177 219.622 C 375.116 253.937 309.733 296.247 275.019 303.480 C 247.032 309.312 193.453 298.359 179.856 273.212 M 179.856 439.793 C 179.391 440.653 236.299 516.418 271.013 523.651 C 299.001 529.483 358.970 521.049 366.177 493.384 C 375.116 459.069 309.733 416.759 275.019 409.526 C 247.032 403.694 193.453 414.646 179.856 439.793 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 284.439 433.056 C 306.334 450.970 328.228 468.884 350.122 486.797 M 258.166 440.222 C 279.264 460.126 300.363 480.030 321.461 499.934 M 227.116 447.388 C 247.816 467.291 268.516 487.195 289.217 507.099 M 284.439 277.805 C 305.537 258.697 326.636 239.590 347.734 220.482 M 249.806 271.834 C 272.895 251.134 295.984 230.434 319.073 209.734 M 221.145 268.251 C 242.641 246.755 264.137 225.259 285.634 203.763 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 89.651 174.354 C 89.607 282.109 89.594 423.481 89.790 537.968 C 100.177 537.260 109.216 536.457 118.237 535.448 C 255.532 520.086 309.122 421.525 394.812 420.975 C 422.306 420.799 460.722 440.035 486.422 449.802 C 537.727 469.300 628.877 561.292 660.701 529.689 C 690.994 499.607 590.052 413.673 590.052 361.429 C 590.052 309.186 690.994 223.252 660.701 193.169 C 628.877 161.566 538.769 256.558 486.422 273.057 C 460.916 281.096 421.498 293.099 394.812 291.338 C 309.306 285.694 255.573 191.855 118.237 176.865 C 108.989 175.856 99.758 175.045 89.651 174.354 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 524.992 373.823 C 542.201 374.540 559.411 375.257 576.621 375.974 M 523.916 396.411 C 545.787 401.430 567.658 406.449 589.528 411.469 M 520.690 416.847 C 552.599 431.189 584.509 445.530 616.418 459.871 M 514.236 440.510 C 557.619 465.249 601.002 489.988 644.384 514.727 M 526.068 350.160 C 543.277 348.009 560.487 345.857 577.697 343.706 M 524.992 325.421 C 546.504 320.043 568.016 314.664 589.528 309.286 M 519.614 303.908 C 551.882 290.643 584.150 277.377 616.418 264.111 M 514.236 283.472 C 557.619 258.733 601.002 233.994 644.384 209.256 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":101.148,\\\"max\\\":294.987},\\\"y\\\":{\\\"min\\\":258.035,\\\"max\\\":451.873}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":90.341,\\\"y\\\":360,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":90.14,\\\"y\\\":360,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"arm\\\"]}},{\\\"name\\\":\\\"fish_tail_curved\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":27.24417946458257,\\\"max\\\":701.6027791450713},\\\"y\\\":{\\\"min\\\":79.93028799313547,\\\"max\\\":603.41454879365}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fish_tail_curved_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fish_tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 315.705 98.377 C 316.395 97.880 388.049 138.568 398.135 167.707 C 406.267 191.200 405.638 243.860 382.575 253.142 C 353.970 264.654 310.230 212.950 300.145 183.810 C 292.013 160.317 295.522 112.892 315.705 98.377 M 98.421 90.624 C 97.652 90.261 34.602 143.313 29.989 173.801 C 26.269 198.382 36.473 250.047 60.840 254.976 C 91.064 261.089 124.659 202.286 129.272 171.797 C 132.992 147.217 120.909 101.222 98.421 90.624 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 109.295 181.107 C 94.792 200.978 80.290 220.849 65.788 240.719 M 101.811 158.639 C 85.542 177.914 69.274 197.189 53.005 216.465 M 94.098 132.023 C 77.810 150.953 61.522 169.883 45.234 188.812 M 323.333 189.090 C 342.152 205.170 360.971 221.250 379.790 237.329 M 324.645 158.557 C 345.058 176.177 365.471 193.798 385.883 211.418 M 324.559 133.439 C 345.482 149.598 366.405 165.756 387.328 181.915 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.104 81.948 C 273.359 81.917 160.866 81.910 69.766 82.070 C 93.156 379.793 157.898 560.546 308.695 595.578 C 391.414 614.795 462.978 585.980 510.353 517.665 C 547.594 463.963 717.133 437.744 698.121 387.839 C 684.904 353.147 580.297 396.213 539.917 375.395 C 499.537 354.576 473.761 243.702 438.019 253.738 C 392.147 266.618 442.309 399.583 434.574 457.372 C 431.485 480.450 417.151 502.322 389.450 499.017 C 316.812 490.352 325.313 398.817 328.101 324.294 C 329.631 283.403 344.342 213.366 359.104 81.948 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 517.328 427.945 C 526.821 415.821 536.314 403.697 545.806 391.572 M 531.683 435.994 C 547.250 422.577 562.817 409.159 578.384 395.741 M 547.977 447.523 C 574.155 429.764 600.333 412.004 626.511 394.244 M 561.020 461.049 C 600.698 438.862 640.377 416.675 680.055 394.488 M 500.360 418.576 C 507.338 405.011 514.316 391.447 521.294 377.882 M 483.484 409.548 C 488.792 391.373 494.099 373.197 499.406 355.021 M 465.605 405.133 C 468.805 375.501 472.005 345.868 475.204 316.235 M 448.559 402.038 C 447.023 358.945 445.486 315.853 443.950 272.760 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":126.699,\\\"max\\\":311.678},\\\"y\\\":{\\\"min\\\":90.093,\\\"max\\\":364.456}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":214.435,\\\"y\\\":82.433,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":216.979,\\\"y\\\":548.351,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986900482112895,\\\"y\\\":0.7154245009296969}},{\\\"point\\\":{\\\"x\\\":484.21,\\\"y\\\":548.852,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129446361714129,\\\"y\\\":0.7012203261132779}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":355.923,\\\"y\\\":85.568,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631455011940419,\\\"y\\\":-0.7754125146625668}},{\\\"point\\\":{\\\"x\\\":72.147,\\\"y\\\":85.621,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817513083387288,\\\"y\\\":-0.731584003090849}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":214.435,\\\"y\\\":82.456,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\"]}},{\\\"name\\\":\\\"flame\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":193.72210696287632,\\\"max\\\":527.3338795756015},\\\"y\\\":{\\\"min\\\":29.847,\\\"max\\\":690.153}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flame\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flame\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 31.847 C 313.603 111.130 320.782 195.697 362.316 247.481 C 422.618 322.666 416.941 385.419 357.131 396.225 C 288.123 408.692 254.659 304.833 284.690 208.747 C 204.463 286.404 193.581 353.443 196.024 417.557 C 201.783 568.720 323.303 598.331 360.000 688.153 C 406.809 604.283 553.571 543.039 520.538 359.912 C 495.266 219.805 368.959 186.994 360.000 31.847 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flame_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 502.010 362.213 C 478.376 240.689 394.920 239.211 351.978 82.276 C 334.204 151.030 352.134 205.163 383.838 245.914 C 453.470 335.415 434.097 410.682 363.171 419.804 C 299.966 427.933 246.979 368.108 257.321 270.962 C 219.509 333.816 213.156 372.402 216.845 414.391 C 229.001 552.762 328.534 568.474 360.000 645.746 C 400.706 573.006 532.838 520.734 502.010 362.213 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":269.456,\\\"max\\\":450.544},\\\"y\\\":{\\\"min\\\":396.685,\\\"max\\\":577.772}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.786,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":29.88,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":196.389,\\\"y\\\":410.914,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872752351093,\\\"y\\\":0.005044736649405886}},{\\\"point\\\":{\\\"x\\\":523.611,\\\"y\\\":410.914,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872752351092,\\\"y\\\":0.0050447366494058635}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":465.889,\\\"y\\\":604.158,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128578758000718,\\\"y\\\":0.7013085261921529}},{\\\"point\\\":{\\\"x\\\":253.987,\\\"y\\\":604.189,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986524222519056,\\\"y\\\":0.7154612448494643}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":461.79,\\\"y\\\":167.613,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314396424293217,\\\"y\\\":-0.7754250305276006}},{\\\"point\\\":{\\\"x\\\":258.74,\\\"y\\\":167.663,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817198049942274,\\\"y\\\":-0.7316133592811388}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":686.172,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"flower\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":91.545,\\\"max\\\":629.534},\\\"y\\\":{\\\"min\\\":21.126,\\\"max\\\":532.98}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flower_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flower\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.540 23.126 C 360.540 58.218 448.269 87.971 448.269 145.947 C 448.269 216.131 360.548 303.399 360.540 303.415 C 360.531 303.399 272.810 216.131 272.810 145.947 C 272.810 87.971 360.540 58.218 360.540 23.126 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.540 303.415 C 348.842 256.775 337.145 210.134 325.448 163.493 M 360.540 303.415 C 360.543 303.401 383.934 210.134 395.631 163.493 M 360.540 128.401 C 360.540 186.739 360.540 303.398 360.540 303.415 C 360.531 303.399 272.810 216.131 272.810 145.947 C 272.810 87.971 360.540 58.218 360.540 23.126 C 360.540 58.218 448.269 87.971 448.269 145.947 C 448.269 216.131 360.548 303.399 360.540 303.415 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flower_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 627.534 217.109 C 594.160 227.953 592.973 320.583 537.834 338.499 C 471.085 360.186 360.981 303.726 360.963 303.723 C 360.975 303.710 416.866 193.315 483.614 171.627 C 538.753 153.711 594.160 227.953 627.534 217.109 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.963 303.723 C 401.706 278.185 442.450 252.648 483.193 227.110 M 360.963 303.723 C 360.978 303.722 456.908 297.147 504.881 293.859 M 527.411 249.641 C 471.929 267.668 360.980 303.718 360.963 303.723 C 360.975 303.710 416.866 193.315 483.614 171.627 C 538.753 153.711 594.160 227.953 627.534 217.109 C 594.160 227.953 592.973 320.583 537.834 338.499 C 471.085 360.186 360.981 303.726 360.963 303.723 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flower_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 525.551 530.980 C 504.925 502.590 416.461 530.085 382.384 483.181 C 341.131 426.401 360.804 304.239 360.801 304.221 C 360.818 304.228 483.081 323.269 524.334 380.049 C 558.411 426.952 504.925 502.590 525.551 530.980 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.801 304.221 C 397.679 335.078 434.557 365.936 471.435 396.794 M 360.801 304.221 C 360.807 304.234 396.704 393.438 414.656 438.046 M 463.672 445.810 C 429.382 398.614 360.812 304.235 360.801 304.221 C 360.818 304.228 483.081 323.269 524.334 380.049 C 558.411 426.952 504.925 502.590 525.551 530.980 C 504.925 502.590 416.461 530.085 382.384 483.181 C 341.131 426.401 360.804 304.239 360.801 304.221 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flower_4\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 195.528 530.980 C 216.154 502.590 162.668 426.952 196.746 380.049 C 237.999 323.269 360.262 304.228 360.278 304.221 C 360.276 304.239 379.948 426.401 338.695 483.181 C 304.618 530.085 216.154 502.590 195.528 530.980 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.278 304.221 C 342.327 348.829 324.375 393.438 306.424 438.046 M 360.278 304.221 C 360.267 304.230 286.522 365.936 249.644 396.794 M 257.407 445.810 C 291.697 398.614 360.268 304.235 360.278 304.221 C 360.276 304.239 379.948 426.401 338.695 483.181 C 304.618 530.085 216.154 502.590 195.528 530.980 C 216.154 502.590 162.668 426.952 196.746 380.049 C 237.999 323.269 360.262 304.228 360.278 304.221 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flower_5\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 93.545 217.109 C 126.919 227.953 182.327 153.711 237.465 171.627 C 304.214 193.315 360.104 303.710 360.116 303.723 C 360.098 303.726 249.994 360.186 183.245 338.499 C 128.107 320.583 126.919 227.953 93.545 217.109 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.116 303.723 C 312.144 300.435 264.171 297.147 216.199 293.859 M 360.116 303.723 C 360.104 303.715 278.630 252.648 237.886 227.110 M 193.668 249.641 C 249.151 267.668 360.099 303.718 360.116 303.723 C 360.098 303.726 249.994 360.186 183.245 338.499 C 128.107 320.583 126.919 227.953 93.545 217.109 C 126.919 227.953 182.327 153.711 237.465 171.627 C 304.214 193.315 360.104 303.710 360.116 303.723 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":262.156,\\\"max\\\":458.924},\\\"y\\\":{\\\"min\\\":205.477,\\\"max\\\":402.245}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.54,\\\"y\\\":668.19,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360.54,\\\"y\\\":585.182,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":109.79,\\\"y\\\":223.122,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9510519564609249,\\\"y\\\":-0.3090310277493946}},{\\\"point\\\":{\\\"x\\\":611.29,\\\"y\\\":223.122,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9510458380498793,\\\"y\\\":-0.30904985670277}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":204.739,\\\"y\\\":516.648,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5877631074167142,\\\"y\\\":0.809033083105906}},{\\\"point\\\":{\\\"x\\\":516.341,\\\"y\\\":516.648,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5877190168716862,\\\"y\\\":0.8090651130826113}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.54,\\\"y\\\":43.972,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"flower_8petal\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":52.755,\\\"max\\\":667.245},\\\"y\\\":{\\\"min\\\":14.632000000000001,\\\"max\\\":629.122}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flower_8petal\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flower_8petal_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#F77F9977-CA01-4803-89BE-2EE0D86F6CD9_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 163.959 321.877 C 163.959 430.384 251.493 517.918 360.000 517.918 C 468.507 517.918 556.041 430.384 556.041 321.877 C 556.041 213.369 468.507 125.836 360.000 125.836 C 251.493 125.836 163.959 213.369 163.959 321.877 M 144.159 106.035 C 195.961 123.303 206.927 74.887 278.942 126.122 C 293.572 39.015 335.581 65.471 360.000 16.632 C 384.420 65.471 426.372 39.108 441.236 125.995 C 512.897 75.013 524.040 123.303 575.841 106.035 C 558.574 157.837 606.990 168.803 555.755 240.818 C 642.861 255.448 616.406 297.457 665.245 321.877 C 616.406 346.296 642.767 388.248 555.883 403.113 C 606.863 474.773 558.574 485.916 575.841 537.718 C 524.039 520.450 512.896 568.740 441.235 517.759 C 426.371 604.645 384.420 578.283 360.000 627.122 C 335.581 578.282 293.572 604.738 278.942 517.631 C 206.927 568.866 195.961 520.450 144.159 537.718 C 161.426 485.916 113.136 474.774 164.118 403.112 C 77.232 388.249 103.594 346.296 54.755 321.877 C 103.594 297.457 77.138 255.448 164.246 240.819 C 113.009 168.801 161.427 157.837 144.159 106.035 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":209.061,\\\"max\\\":510.939},\\\"y\\\":{\\\"min\\\":170.938,\\\"max\\\":472.816}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.806,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":18.7,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":57.4,\\\"y\\\":322.739,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987203394228,\\\"y\\\":0.005058957184122814}},{\\\"point\\\":{\\\"x\\\":662.6,\\\"y\\\":322.739,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999987203394228,\\\"y\\\":0.005058957184122823}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":574.588,\\\"y\\\":537.498,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129045744828948,\\\"y\\\":0.7012610553006368}},{\\\"point\\\":{\\\"x\\\":145.235,\\\"y\\\":537.542,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987060732834047,\\\"y\\\":0.7154088503484463}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":574.739,\\\"y\\\":108.08,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6313994414689371,\\\"y\\\":-0.7754577650089747}},{\\\"point\\\":{\\\"x\\\":145.99,\\\"y\\\":108.152,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817314607549524,\\\"y\\\":-0.7316024982303702}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":625.55,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F77F9977-CA01-4803-89BE-2EE0D86F6CD9_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"50.00%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"18.82%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"84.31%\\\",\\\"color\\\":\\\"#ffffff\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"invert_nested\\\":false,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"flower_jacobean_smaller\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":142.786,\\\"max\\\":577.214},\\\"y\\\":{\\\"min\\\":74.048,\\\"max\\\":645.952}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flower_jacobean\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"flower_jacobean\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 505.912 528.065 C 464.768 506.808 429.084 524.056 403.222 550.494 M 345.939 358.002 C 374.071 352.189 410.949 373.931 425.863 402.443 M 509.194 352.544 C 465.755 357.966 443.217 385.575 430.988 428.054 C 426.325 377.831 387.557 310.786 346.084 280.818 M 292.719 433.133 C 359.850 433.178 404.741 472.580 418.623 515.321 M 473.692 261.304 C 422.458 299.005 412.195 352.643 423.670 394.702 M 430.988 428.054 C 437.315 496.199 406.725 576.714 328.797 643.952 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 427.735 459.670 C 391.257 423.904 363.417 452.714 343.280 391.174 C 375.570 405.567 413.128 372.820 427.735 459.670 M 389.702 582.123 C 425.727 568.555 438.953 625.649 491.396 592.056 C 458.961 580.477 445.064 538.592 389.702 582.123 M 432.734 477.879 C 460.275 466.820 510.864 500.466 531.098 433.751 C 494.990 448.983 460.457 418.832 432.734 477.879 M 357.601 611.712 C 352.295 558.557 285.655 567.186 312.006 488.735 C 333.851 537.035 393.775 526.861 357.601 611.712 M 394.349 329.365 C 394.375 289.759 445.736 288.375 420.063 226.147 C 411.235 253.404 358.893 259.810 394.349 329.365 M 541.180 546.812 C 546.368 537.051 542.680 524.992 532.920 519.804 C 523.159 514.616 511.100 518.305 505.912 528.065 C 500.724 537.825 504.413 549.884 514.173 555.072 C 523.933 560.260 535.992 556.572 541.180 546.812 M 306.528 364.484 C 304.734 353.577 312.086 343.331 322.993 341.537 C 333.900 339.744 344.146 347.096 345.939 358.002 C 347.733 368.909 340.381 379.155 329.474 380.949 C 318.567 382.742 308.321 375.391 306.528 364.484 M 549.130 353.144 C 549.296 342.092 540.514 333.042 529.461 332.876 C 518.409 332.710 509.360 341.492 509.194 352.544 C 509.028 363.596 517.810 372.646 528.862 372.812 C 539.914 372.978 548.964 364.196 549.130 353.144 M 282.303 396.003 C 280.135 392.497 277.232 388.669 273.822 384.949 C 256.930 366.522 249.052 370.991 227.455 355.404 C 238.023 376.334 223.652 389.149 243.972 407.832 C 222.341 404.651 215.848 414.673 189.980 420.357 C 214.179 431.354 217.095 444.408 238.865 446.477 C 221.394 461.637 220.824 475.389 209.296 492.813 C 229.513 484.231 242.628 488.748 261.747 476.327 C 265.896 473.631 269.638 470.684 272.670 467.798 C 293.333 448.141 297.709 420.897 282.303 396.003 M 465.866 223.543 C 466.178 219.433 466.995 214.699 468.312 209.828 C 474.838 185.696 483.889 186.042 495.899 162.269 C 496.140 185.714 514.794 190.485 505.342 216.419 C 523.088 203.647 533.462 209.561 559.047 202.712 C 542.616 223.605 546.029 236.539 527.648 248.387 C 550.134 253.815 556.965 265.765 575.214 275.935 C 553.316 277.612 543.747 287.654 521.058 285.417 C 516.134 284.931 511.456 284.034 507.436 282.866 C 480.048 274.913 463.634 252.734 465.866 223.543 M 325.036 204.377 C 338.896 219.373 337.980 242.651 322.984 256.510 C 307.988 270.370 284.711 269.454 270.851 254.458 C 256.991 239.463 257.907 216.185 272.903 202.325 C 287.899 188.465 311.176 189.382 325.036 204.377 M 300.047 175.968 C 286.421 175.432 272.501 180.142 261.660 190.161 C 250.820 200.180 245.030 213.688 244.494 227.314 C 243.958 240.940 248.667 254.861 258.687 265.701 C 268.706 276.542 282.213 282.331 295.839 282.867 C 309.466 283.404 323.386 278.694 334.227 268.675 C 345.067 258.656 350.857 245.148 351.393 231.522 C 351.930 217.896 347.220 203.975 337.201 193.134 C 327.182 182.294 313.674 176.505 300.047 175.968 M 367.776 200.572 C 369.195 214.487 372.881 255.733 345.584 280.963 C 318.287 306.192 277.459 299.275 263.698 296.767 C 234.410 315.604 215.730 315.235 184.770 328.851 C 197.593 300.843 200.772 271.617 223.016 252.751 C 184.587 251.845 183.516 234.012 144.786 220.703 C 180.447 215.420 183.802 186.004 225.290 194.963 C 202.113 170.611 208.945 153.569 193.147 116.033 C 228.418 136.680 247.403 128.767 269.307 154.281 C 272.858 118.891 289.629 105.980 301.295 76.048 C 308.440 109.054 329.939 122.258 327.093 156.556 C 348.905 135.911 380.100 136.995 405.965 124.410 C 392.614 150.534 386.812 175.894 367.776 200.572 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 272.670 467.798 C 258.084 460.749 249.161 445.189 251.370 428.469 C 253.607 411.540 266.555 398.724 282.303 396.003 C 297.709 420.897 293.333 448.141 272.670 467.798 M 507.436 282.866 C 517.147 269.899 517.914 251.979 508.264 238.148 C 498.492 224.144 481.100 218.717 465.866 223.543 C 463.634 252.734 480.048 274.913 507.436 282.866 M 297.233 117.324 C 298.171 136.872 299.109 156.420 300.047 175.968 C 286.421 175.432 272.501 180.142 261.660 190.161 C 248.444 175.729 235.228 161.296 222.011 146.864 M 379.132 148.253 C 365.155 163.214 351.178 178.174 337.201 193.134 C 327.182 182.294 313.674 176.505 300.047 175.968 M 213.853 299.988 C 228.798 288.559 243.742 277.130 258.687 265.701 C 248.667 254.861 243.958 240.940 244.494 227.314 C 227.313 225.513 210.132 223.711 192.950 221.910 M 261.660 190.161 C 250.820 200.180 245.030 213.688 244.494 227.314 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.327,\\\"y\\\":661.861,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.028256046500734718,\\\"y\\\":-0.9996007182050983}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":193.993,\\\"y\\\":116.122,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7011123050903227,\\\"y\\\":-0.7130508647010634}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":551.034,\\\"y\\\":353.613,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872880189178,\\\"y\\\":0.0050422019564934075}},{\\\"point\\\":{\\\"x\\\":186.048,\\\"y\\\":420.722,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872880189178,\\\"y\\\":0.005042201956497622}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":538.887,\\\"y\\\":549.623,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6986777434832896,\\\"y\\\":0.7154365176317871}},{\\\"point\\\":{\\\"x\\\":326.503,\\\"y\\\":647.188,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7128673373492072,\\\"y\\\":0.7012989086977476}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":562.465,\\\"y\\\":200.591,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7826379980597337,\\\"y\\\":-0.6224771192526294}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"fool\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":69.892,\\\"max\\\":636.9174483580406},\\\"y\\\":{\\\"min\\\":13.16,\\\"max\\\":691.231}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fool_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"fool_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 366.122 145.832 C 387.322 145.832 398.374 159.957 398.377 159.959 C 398.374 159.960 387.322 174.086 366.122 174.086 C 344.923 174.086 333.871 159.960 333.868 159.959 C 333.871 159.957 344.923 145.832 366.122 145.832 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 75.127 287.058 C 75.174 287.044 541.698 151.082 541.745 151.068 C 541.745 151.067 538.971 144.545 538.971 144.544 C 538.924 144.558 72.400 280.520 72.353 280.534 C 72.354 280.535 75.127 287.057 75.127 287.058 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 581.407 266.318 C 583.821 269.859 586.236 273.401 588.650 276.943 C 617.890 283.152 611.859 258.975 635.885 254.377 C 636.646 254.231 623.873 251.397 613.184 257.646 C 620.142 243.649 609.909 242.958 603.140 234.457 C 603.492 246.444 618.559 250.250 599.041 259.770 C 581.890 247.926 595.926 246.741 599.375 234.595 C 587.546 243.502 581.313 246.174 581.407 266.318 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 120.242 291.095 C 124.457 289.767 128.671 288.439 132.885 287.111 C 132.886 287.108 134.307 256.878 134.307 256.875 C 134.304 256.875 101.824 265.707 101.821 265.708 C 101.822 265.711 120.241 291.092 120.242 291.095 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 581.407 266.318 C 583.821 269.859 586.236 273.401 588.650 276.943 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 422.783 317.565 C 437.880 281.006 444.193 257.124 454.314 237.749 C 456.282 237.908 466.666 292.173 515.023 300.477 C 549.796 306.447 580.159 270.191 581.407 266.318 C 583.821 269.859 586.236 273.401 588.650 276.943 C 588.446 280.433 569.761 369.513 506.900 368.854 C 449.473 368.253 424.969 325.069 422.783 317.565 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 407.579 494.370 C 342.140 508.602 272.611 481.716 244.736 420.990 M 399.249 401.417 C 415.156 428.215 407.934 471.689 407.579 494.370 M 342.670 415.118 C 366.834 416.738 398.574 400.279 399.249 401.417 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.385 628.800 C 371.772 627.280 383.955 621.266 393.991 617.352 C 397.900 635.751 413.772 664.505 427.732 689.924 C 411.062 690.356 343.714 689.899 338.271 690.231 C 362.287 676.746 384.161 674.993 394.528 672.435 C 384.245 660.511 370.174 644.634 360.385 628.800 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 342.670 415.118 C 366.834 416.738 398.574 400.279 399.249 401.417 C 399.662 393.951 414.217 341.980 422.783 317.565 C 437.880 281.006 444.193 257.124 454.314 237.749 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 132.885 287.111 C 128.671 288.439 124.457 289.767 120.242 291.095 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S14\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 286.620 328.738 C 281.831 301.563 280.625 260.457 287.284 226.406 C 284.666 226.224 254.491 291.323 205.046 302.711 C 164.986 311.938 132.893 287.112 132.885 287.111 C 128.671 288.439 124.457 289.767 120.242 291.095 C 120.250 291.102 143.267 351.737 195.463 360.630 C 251.950 370.254 284.821 332.336 286.620 328.738 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 244.736 420.990 C 270.869 408.679 289.075 401.030 314.502 400.502 C 327.888 409.025 338.776 414.857 342.670 415.118 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 161.918 518.088 C 172.098 524.847 182.278 531.606 192.458 538.364 C 185.506 544.503 164.345 566.398 139.950 610.524 C 116.967 597.409 79.227 572.006 70.892 564.423 C 80.713 560.432 121.928 577.128 134.723 576.727 C 147.896 549.051 155.211 530.463 161.918 518.088 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 518.681 118.648 C 518.679 118.650 508.724 121.698 504.310 133.186 C 499.896 144.673 505.250 153.603 505.250 153.605 C 505.251 153.604 515.207 150.556 519.621 139.069 C 524.035 127.581 518.681 118.650 518.681 118.648 M 477.020 126.364 C 477.022 126.365 487.366 125.178 496.005 133.942 C 504.644 142.706 503.308 153.032 503.309 153.034 C 503.307 153.033 492.963 154.221 484.324 145.457 C 475.684 136.692 477.021 126.366 477.020 126.364 M 561.047 232.964 C 566.924 179.566 506.168 161.547 506.162 161.540 C 506.161 161.549 460.456 213.710 492.748 253.027 C 513.711 278.550 557.201 267.900 561.047 232.964 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 604.595 193.022 C 604.596 193.023 608.562 200.485 607.635 207.592 C 610.154 200.580 619.424 200.128 619.426 200.128 C 619.424 200.129 611.299 217.260 601.815 216.811 C 592.486 216.370 586.059 198.894 586.057 198.892 C 586.059 198.893 596.919 200.794 598.466 207.901 C 598.812 200.839 604.595 193.023 604.595 193.022 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 598.466 207.901 C 598.812 200.839 604.595 193.023 604.595 193.022 C 604.596 193.023 608.562 200.485 607.635 207.592 C 610.154 200.580 619.424 200.128 619.426 200.128 C 619.424 200.129 611.299 217.260 601.815 216.811 C 592.486 216.370 586.059 198.894 586.057 198.892 C 586.059 198.893 596.919 200.794 598.466 207.901 M 600.270 251.723 C 600.785 240.292 601.300 228.861 601.815 217.429 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.502 400.502 C 327.888 409.025 338.776 414.857 342.670 415.118 M 287.284 226.406 C 310.129 227.990 440.190 236.612 454.314 237.749 M 286.620 328.738 C 281.831 301.563 280.625 260.457 287.284 226.406 M 314.502 400.502 C 314.499 400.495 291.795 358.000 286.620 328.738 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 333.868 159.959 C 333.871 159.957 344.923 145.832 366.122 145.832 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 366.122 145.832 C 387.322 145.832 398.374 159.957 398.377 159.959 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 398.377 159.959 C 398.374 159.960 387.322 174.086 366.122 174.086 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 366.122 174.086 C 344.923 174.086 333.871 159.960 333.868 159.959 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 376.712 159.355 C 376.712 165.525 371.735 170.502 365.565 170.502 C 359.396 170.502 354.419 165.525 354.419 159.355 C 354.419 153.186 359.396 148.209 365.565 148.209 C 371.735 148.209 376.712 153.186 376.712 159.355 M 333.868 159.959 C 333.871 159.957 344.923 145.832 366.122 145.832 C 387.322 145.832 398.374 159.957 398.377 159.959 C 398.374 159.960 387.322 174.086 366.122 174.086 C 344.923 174.086 333.871 159.960 333.868 159.959 M 417.730 148.948 C 417.138 134.166 363.696 122.911 341.650 132.909 C 323.089 153.514 309.891 170.339 309.888 170.343 C 309.890 170.343 325.768 178.282 325.769 178.283 C 325.769 178.284 323.500 189.626 323.500 189.627 C 323.503 189.627 348.454 191.478 348.456 191.478 C 348.454 191.479 335.656 196.053 326.305 199.239 C 327.072 214.481 342.323 225.055 366.832 226.353 C 393.208 227.750 420.299 213.061 417.730 148.948 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 294.568 39.807 C 298.820 39.807 302.250 43.237 302.250 47.489 C 302.250 51.741 298.820 55.171 294.568 55.171 C 290.316 55.171 286.886 51.741 286.886 47.489 C 286.886 43.237 290.316 39.807 294.568 39.807 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S25\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 534.085 193.374 C 524.824 183.094 515.562 172.815 506.301 162.536 C 510.575 177.497 514.545 192.457 518.514 207.418 M 498.363 203.144 C 501.009 189.913 503.655 176.683 506.301 163.452 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 506.014 148.477 C 511.279 148.606 515.422 152.958 515.293 158.222 C 515.163 163.487 510.812 167.630 505.547 167.500 C 500.282 167.371 496.139 163.019 496.269 157.754 C 496.398 152.490 500.750 148.348 506.014 148.477 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 403.568 14.160 C 407.820 14.160 411.250 17.590 411.250 21.842 C 411.250 26.094 407.820 29.524 403.568 29.524 C 399.316 29.524 395.886 26.094 395.886 21.842 C 395.886 17.590 399.316 14.160 403.568 14.160 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22_2_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 493.638 72.171 C 497.890 72.171 501.320 75.601 501.320 79.853 C 501.320 84.105 497.890 87.535 493.638 87.535 C 489.386 87.535 485.956 84.105 485.956 79.853 C 485.956 75.601 489.386 72.171 493.638 72.171 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 161.918 518.088 C 172.098 524.847 182.278 531.606 192.458 538.364 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.385 628.800 C 371.772 627.280 383.955 621.266 393.991 617.352 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S27\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 161.918 518.088 C 172.098 524.847 182.278 531.606 192.458 538.364 C 197.813 533.635 221.417 514.923 246.424 502.197 C 271.577 489.398 320.401 482.041 320.408 482.039 C 320.409 482.046 317.758 510.881 328.249 553.731 C 337.880 593.068 354.086 618.610 360.385 628.800 C 371.772 627.280 383.955 621.266 393.991 617.352 C 387.686 587.674 386.614 545.238 401.812 491.191 C 406.978 472.817 405.421 414.627 399.249 401.417 C 398.574 400.279 366.834 416.738 342.670 415.118 C 338.776 414.857 327.888 409.025 314.502 400.502 C 314.490 400.508 242.935 419.807 202.784 460.204 C 175.593 487.562 166.719 509.229 161.918 518.088 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 342.670 415.118 C 366.834 416.738 398.574 400.279 399.249 401.417 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 422.783 317.565 C 437.880 281.006 444.193 257.124 454.314 237.749 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 287.284 226.406 C 280.625 260.457 281.831 301.563 286.620 328.738 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.502 400.502 C 327.888 409.025 338.776 414.857 342.670 415.118 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S28\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 342.670 415.118 C 366.834 416.738 398.574 400.279 399.249 401.417 C 399.662 393.951 414.217 341.980 422.783 317.565 C 437.880 281.006 444.193 257.124 454.314 237.749 C 440.190 236.612 310.129 227.990 287.284 226.406 C 280.625 260.457 281.831 301.563 286.620 328.738 C 291.795 358.000 314.499 400.495 314.502 400.502 C 327.888 409.025 338.776 414.857 342.670 415.118 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.502 400.502 C 327.888 409.025 338.776 414.857 342.670 415.118 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 342.670 415.118 C 366.834 416.738 398.574 400.279 399.249 401.417 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S29\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.502 400.502 C 327.888 409.025 338.776 414.857 342.670 415.118 C 366.834 416.738 398.574 400.279 399.249 401.417 C 415.156 428.215 407.934 471.689 407.579 494.370 C 342.140 508.602 272.611 481.716 244.736 420.990 C 270.869 408.679 289.075 401.030 314.502 400.502 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S24\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 308.341 388.294 C 337.126 404.028 359.817 410.194 402.495 393.387 C 402.275 400.537 402.238 402.407 403.618 410.745 C 361.411 424.802 334.733 423.991 303.692 400.654 C 302.830 400.006 307.919 392.900 308.341 388.294 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S30\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 419.665 137.202 C 434.666 115.066 451.219 98.887 485.715 81.383 C 460.645 76.227 428.699 75.834 406.566 97.521 C 411.477 70.109 413.130 58.015 401.772 29.202 C 377.627 53.101 372.265 69.167 366.649 87.975 C 350.776 66.954 332.596 54.795 300.171 51.654 C 314.140 66.197 326.648 90.199 342.880 123.415 C 354.759 119.700 379.392 121.697 379.395 121.697 C 379.400 121.698 406.620 126.302 419.665 137.202 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":294.811,\\\"max\\\":410.622},\\\"y\\\":{\\\"min\\\":245.191,\\\"max\\\":361.002}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":387.227,\\\"y\\\":705.453,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":602.731,\\\"y\\\":197.256,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":581.332,\\\"y\\\":692.638,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005035797584254094,\\\"y\\\":-0.9999873202909577}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":226.048,\\\"y\\\":161.856,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817553008338527,\\\"y\\\":-0.7315802825288164}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":387.227,\\\"y\\\":687.38,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"foot\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":234.5558443125144,\\\"max\\\":520.864786651902},\\\"y\\\":{\\\"min\\\":25.08370992918838,\\\"max\\\":675.344543336746}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"foot\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"foot\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#9771C251-E580-48DC-B32D-621B4B6B6BC3_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 518.315 169.263 C 520.086 160.796 518.250 142.721 502.715 138.098 C 492.316 135.003 480.444 153.697 478.979 161.914 C 471.215 205.462 464.646 206.679 462.853 205.789 C 459.837 204.294 463.419 185.333 481.363 126.451 C 486.140 110.774 475.620 95.029 466.801 93.316 C 457.585 91.526 442.325 100.671 440.071 120.071 C 433.910 173.094 420.962 189.577 418.104 188.443 C 415.440 187.385 413.133 175.018 431.235 122.822 C 441.000 94.667 429.168 71.441 415.462 68.990 C 404.315 66.996 388.591 74.941 385.572 103.454 C 378.617 169.124 371.422 178.232 368.170 177.868 C 364.803 177.490 365.954 160.099 377.844 99.342 C 382.604 75.019 367.741 54.074 354.984 53.166 C 344.688 52.434 328.587 67.532 329.189 85.787 C 331.648 160.418 324.662 172.140 319.086 172.150 C 317.531 172.152 315.367 161.280 317.623 135.871 C 320.111 107.852 328.543 83.171 314.494 48.576 C 310.247 38.119 295.520 25.154 274.295 27.324 C 260.623 28.721 245.709 46.535 242.840 57.570 C 236.776 80.892 240.624 103.714 242.947 118.939 C 245.632 136.543 256.838 148.183 255.575 189.559 C 244.406 208.772 232.305 236.558 238.020 290.587 C 245.459 360.910 294.794 369.683 289.283 487.620 C 288.104 512.838 263.888 564.974 268.541 596.579 C 282.593 692.012 406.524 682.611 434.318 652.667 C 455.810 629.512 473.417 583.683 477.849 565.231 C 489.067 518.530 497.237 376.254 507.981 324.711 C 512.119 304.859 520.207 283.486 509.721 220.355 C 514.287 203.550 512.053 199.189 518.315 169.263 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":284.564,\\\"max\\\":469.095},\\\"y\\\":{\\\"min\\\":208.51,\\\"max\\\":393.041}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":700.357,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":278.719,\\\"y\\\":26.676,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":260.673,\\\"y\\\":350.097,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873181281341,\\\"y\\\":0.005036227050270593}},{\\\"point\\\":{\\\"x\\\":503.499,\\\"y\\\":350.097,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873181281341,\\\"y\\\":0.005036227050270614}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":449.617,\\\"y\\\":626.069,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128976981929063,\\\"y\\\":0.7012680456938388}},{\\\"point\\\":{\\\"x\\\":279.442,\\\"y\\\":626.112,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698708874621677,\\\"y\\\":0.7154061144027983}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":669.923,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"9771C251-E580-48DC-B32D-621B4B6B6BC3_0\\\",\\\"cx\\\":\\\"43.98%\\\",\\\"cy\\\":\\\"47.04%\\\",\\\"r\\\":\\\"108.07%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"30.20%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"foot_of_god\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":23.548429425323715,\\\"max\\\":692.4282720460413},\\\"y\\\":{\\\"min\\\":260.1431111111112,\\\"max\\\":619.1511071608666}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"foot_of_god\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"foot_of_god\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 654.072 262.144 C 654.072 262.154 654.270 347.456 655.981 358.588 C 659.010 378.295 749.212 563.497 624.924 594.788 C 575.433 607.249 507.115 592.100 450.818 591.985 C 370.679 591.821 376.376 624.749 293.652 596.671 C 277.480 604.082 234.970 629.430 203.166 609.925 C 188.140 600.710 226.934 587.740 252.400 574.926 C 257.029 572.597 170.912 616.608 149.661 597.631 C 133.445 583.150 178.296 566.865 211.090 551.438 C 212.097 550.964 119.096 596.380 102.605 568.457 C 90.607 548.141 142.767 546.367 188.602 524.106 C 157.283 531.243 95.535 560.690 71.548 529.871 C 52.843 505.838 124.440 508.916 163.310 494.991 C 135.755 499.924 53.410 518.544 28.257 457.406 C 20.567 438.714 27.184 397.586 75.313 418.820 C 110.684 434.425 155.217 445.147 178.052 435.740 C 270.337 397.722 407.437 382.185 426.862 353.883 C 433.686 343.940 433.670 305.113 434.010 262.144 C 434.032 262.142 654.050 262.144 654.072 262.144 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":448.489,\\\"max\\\":638.389},\\\"y\\\":{\\\"min\\\":277.033,\\\"max\\\":482.494}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":549.827,\\\"y\\\":262.277,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":428.632,\\\"y\\\":353.268,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872880189178,\\\"y\\\":0.005042201956497622}},{\\\"point\\\":{\\\"x\\\":655.295,\\\"y\\\":353.268,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872880189178,\\\"y\\\":0.005042201956497622}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":593.985,\\\"y\\\":596.326,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129038061651503,\\\"y\\\":0.701261836374433}},{\\\"point\\\":{\\\"x\\\":307.841,\\\"y\\\":596.374,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987156961473312,\\\"y\\\":0.7153994520247764}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":649.186,\\\"y\\\":263.342,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314312882360851,\\\"y\\\":-0.7754318333912518}},{\\\"point\\\":{\\\"x\\\":435.913,\\\"y\\\":263.413,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.681705589814273,\\\"y\\\":-0.7316266047759431}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":549.827,\\\"y\\\":262.542,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\"]}},{\\\"name\\\":\\\"globe\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":65.509,\\\"max\\\":651.845},\\\"y\\\":{\\\"min\\\":37.172696206739076,\\\"max\\\":623.522}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"globe\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"circle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#8E8B3F22-3ECA-490A-B60F-ADE6EEC19437_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 571.042 131.078 C 568.948 128.810 566.767 126.628 564.585 124.359 C 536.136 95.953 504.921 74.274 470.445 60.468 C 448.584 51.714 425.578 45.900 401.818 42.129 C 387.925 39.923 373.551 39.052 358.634 39.186 C 302.348 39.691 251.731 53.148 206.963 81.075 C 206.701 81.162 206.265 81.424 206.002 81.598 C 187.240 93.379 169.438 107.691 152.770 124.359 C 124.321 152.808 103.006 184.203 88.803 218.543 C 87.028 222.835 85.364 227.174 83.810 231.558 C 82.257 235.943 80.815 240.373 79.484 244.850 C 76.822 253.803 74.604 262.940 72.830 272.261 C 69.282 290.904 67.509 310.283 67.509 330.398 C 67.510 410.771 95.871 479.363 152.770 536.261 C 209.581 593.073 278.260 621.522 358.634 621.522 C 439.094 621.522 507.687 593.073 564.585 536.261 C 621.396 479.363 649.845 410.771 649.845 330.398 C 649.845 291.695 643.278 255.762 630.144 222.557 C 626.860 214.256 623.167 206.125 619.062 198.164 C 614.958 190.203 610.443 182.411 605.518 174.789 C 595.668 159.544 584.176 144.976 571.042 131.078 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 88.803 218.543 C 87.028 222.835 85.364 227.174 83.810 231.558 M 152.770 124.359 C 124.321 152.808 103.006 184.203 88.803 218.543 M 206.002 81.598 C 187.240 93.379 169.438 107.691 152.770 124.359 M 206.963 81.075 C 206.701 81.162 206.265 81.424 206.002 81.598 M 358.634 39.186 C 302.348 39.691 251.731 53.148 206.963 81.075 M 401.818 42.129 C 387.925 39.923 373.551 39.052 358.634 39.186 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 605.518 174.789 C 595.668 159.544 584.176 144.976 571.042 131.078 C 568.948 128.810 566.767 126.628 564.585 124.359 C 536.136 95.953 504.921 74.274 470.445 60.468 M 619.062 198.164 C 614.958 190.203 610.443 182.411 605.518 174.789 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"continents\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 612.909 208.412 C 612.960 208.352 613.018 208.294 613.084 208.237 C 613.084 208.237 612.996 208.237 612.909 208.412 C 613.075 208.999 613.162 209.144 613.258 209.285 C 611.948 209.635 610.988 209.111 610.289 207.714 C 610.115 207.189 609.765 206.840 609.416 206.491 C 603.566 200.727 598.675 194.353 594.572 187.368 C 602.801 194.678 611.038 201.984 619.283 209.285 C 619.187 206.757 619.100 204.225 619.021 201.689 C 619.217 200.761 619.420 199.830 619.632 198.894 C 607.930 176.017 593.523 154.973 576.321 135.849 C 547.418 103.891 513.364 79.179 474.070 61.889 C 470.752 60.318 467.260 59.095 463.679 58.135 C 462.631 57.698 461.671 57.786 460.624 58.135 C 453.813 61.279 446.739 62.152 439.317 60.842 C 438.495 59.479 437.680 58.112 436.872 56.737 C 436.697 56.301 436.435 55.864 436.348 55.428 C 435.911 53.943 435.038 53.245 433.816 53.245 C 429.450 53.070 426.656 55.253 425.346 59.881 C 423.477 60.905 421.614 61.924 419.757 62.938 C 421.061 64.515 422.371 66.087 423.687 67.653 C 422.109 69.609 420.537 71.559 418.971 73.503 C 419.577 76.070 420.187 78.631 420.805 81.187 C 421.416 81.187 422.028 81.187 422.814 81.099 C 425.434 80.838 427.966 81.449 430.148 83.021 C 431.458 80.314 433.554 79.092 436.523 79.528 C 438.059 80.552 439.602 81.571 441.151 82.584 C 441.413 83.021 441.588 83.458 441.588 83.894 C 442.024 86.601 443.509 88.435 446.040 89.308 C 449.272 90.355 452.065 90.181 454.249 88.784 C 454.510 88.173 454.424 87.387 454.161 86.601 C 453.288 84.505 451.629 83.021 449.446 82.148 C 450.843 80.751 452.590 79.965 454.685 79.965 C 457.305 79.877 459.750 80.576 461.758 82.060 C 462.887 82.211 464.022 82.357 465.164 82.497 C 466.124 84.767 466.037 87.125 464.989 89.483 C 464.465 90.443 463.767 91.054 462.631 91.403 C 456.693 93.063 450.581 93.325 444.294 92.102 C 443.246 91.316 442.461 90.269 442.286 88.958 C 441.413 84.418 438.968 82.847 435.038 84.069 C 433.816 85.990 433.729 87.824 435.038 89.832 C 437.309 93.499 436.785 96.469 433.466 98.739 C 433.205 98.476 432.855 98.214 432.680 97.953 C 428.774 98.744 424.874 99.529 420.980 100.310 C 422.021 103.255 423.069 106.195 424.123 109.130 C 421.759 110.008 419.402 110.881 417.051 111.749 C 416.265 111.836 415.478 111.836 414.518 111.836 C 412.073 112.098 410.764 113.146 410.501 115.154 C 414.483 117.139 418.470 119.118 422.464 121.093 C 423.622 121.331 424.787 121.564 425.957 121.791 C 426.213 124.299 426.475 126.802 426.743 129.300 C 420.596 130.149 414.454 130.994 408.319 131.833 C 408.056 131.833 407.794 131.833 407.533 131.833 C 404.040 131.135 400.983 131.745 398.626 133.579 C 399.552 134.516 400.483 135.447 401.420 136.373 C 402.055 139.987 402.695 143.596 403.341 147.201 C 404.033 149.418 404.732 151.630 405.437 153.837 C 406.828 154.163 408.225 154.482 409.628 154.798 C 409.855 155.123 410.088 155.443 410.327 155.758 C 411.922 155.851 413.522 155.938 415.130 156.020 C 415.938 158.179 416.753 160.332 417.574 162.482 C 415.741 166.411 413.208 169.817 410.065 172.698 C 409.105 173.572 407.969 174.270 406.747 174.707 C 402.817 175.842 400.547 178.199 399.849 181.692 C 400.221 181.872 400.599 182.046 400.983 182.216 C 402.730 186.145 402.119 189.813 399.063 193.131 C 395.570 197.060 391.379 199.069 386.488 198.982 C 385.702 198.982 385.091 199.244 384.829 199.942 C 382.035 205.356 378.717 210.508 374.962 215.573 C 374.351 216.271 373.914 217.057 373.478 217.843 C 372.168 220.637 371.906 223.518 372.780 226.487 C 373.565 229.281 374.351 232.076 374.875 234.870 C 375.050 235.743 375.137 236.616 375.137 237.577 C 375.398 249.976 375.662 262.463 376.098 274.862 C 376.796 275.561 377.582 275.998 378.543 276.172 C 379.416 276.347 380.289 276.783 380.900 277.569 C 382.211 278.791 383.520 280.102 384.917 281.324 C 385.354 281.761 385.790 281.936 386.402 281.848 C 388.847 281.586 390.942 282.022 392.776 283.507 C 392.945 284.675 393.119 285.840 393.299 287.000 C 394.603 288.866 395.913 290.729 397.229 292.588 C 400.547 294.859 403.952 297.216 407.183 299.661 C 409.367 301.320 411.724 302.543 414.257 303.416 C 418.273 304.987 421.591 307.433 424.211 310.751 C 427.180 309.004 430.236 307.345 433.379 305.774 C 436.523 304.202 439.841 303.241 443.334 302.979 C 444.906 303.154 445.954 303.940 446.565 305.512 C 447.088 306.909 448.136 307.433 449.708 307.171 C 455.820 306.035 461.671 304.026 467.172 300.883 C 470.752 298.875 474.332 298.177 477.912 298.701 C 478.349 298.788 478.611 298.963 478.698 299.224 C 479.833 304.114 482.715 307.346 487.168 309.179 C 488.652 309.703 490.050 309.878 491.622 309.703 C 493.630 309.528 495.638 309.267 497.647 309.004 C 500.615 309.353 501.925 311.275 501.488 314.505 C 501.227 316.689 500.877 319.046 500.528 321.491 C 499.567 327.341 499.393 333.104 500.266 338.955 C 501.838 341.836 503.584 344.806 505.505 347.513 C 513.015 358.602 515.895 370.477 514.063 383.400 C 514.063 383.925 514.063 384.361 514.238 384.798 C 515.722 387.418 516.333 390.125 516.333 392.918 C 515.635 393.530 514.849 394.228 514.063 394.840 C 512.840 395.975 511.531 397.110 510.133 398.158 C 508.387 399.381 507.252 401.040 506.728 403.135 C 506.204 405.580 505.854 408.025 505.680 410.558 C 505.593 411.954 505.243 413.264 504.545 414.486 C 502.274 418.416 501.925 422.608 503.497 426.887 C 504.458 429.505 505.767 432.125 507.426 434.483 C 509.784 438.063 510.569 442.080 509.697 446.620 C 509.398 446.855 509.108 447.088 508.824 447.319 C 507.601 450.288 506.728 453.431 506.292 456.575 C 505.855 459.543 506.379 462.338 507.688 464.958 C 508.736 467.140 509.435 469.498 509.784 471.769 C 509.958 472.380 509.872 472.991 509.697 473.515 C 507.339 479.278 506.466 485.390 507.077 491.677 C 509.872 492.812 512.928 493.598 516.158 494.035 C 517.643 494.123 519.127 493.773 520.349 492.900 C 521.485 492.289 522.620 491.764 523.668 491.328 C 526.200 490.455 528.732 490.193 531.527 490.542 C 532.662 490.455 533.710 490.018 534.496 489.320 C 536.416 487.923 538.512 486.700 540.608 485.653 C 544.188 483.731 547.943 481.898 551.523 479.976 C 556.413 477.531 559.906 473.602 561.740 468.538 C 562.962 465.220 564.708 462.250 566.891 459.631 C 567.415 459.020 568.026 458.409 568.463 457.797 C 570.297 455.352 571.607 452.558 572.218 449.502 C 578.505 447.144 581.736 442.604 581.998 435.793 C 581.998 434.571 582.085 433.348 582.085 432.126 C 582.260 428.545 583.919 425.576 586.887 423.394 C 588.896 421.908 590.904 420.249 592.912 418.678 C 593.523 418.154 594.310 417.542 594.921 417.106 C 599.025 414.050 601.557 410.120 602.605 405.318 C 602.780 404.358 602.954 403.397 603.041 402.611 C 604.089 394.403 604.526 386.370 604.526 378.336 C 604.526 375.891 604.701 373.446 604.875 371.001 C 605.399 366.548 605.312 362.269 604.439 358.078 C 604.352 357.467 604.351 356.856 604.439 356.419 C 605.661 351.442 607.932 347.251 611.336 343.670 C 611.599 342.361 611.773 341.050 611.861 339.741 C 612.384 334.152 614.568 329.350 618.672 325.246 C 621.117 322.801 622.513 319.745 622.863 316.165 C 623.038 314.593 623.299 313.196 623.911 311.711 C 625.658 307.520 626.617 302.979 626.880 298.351 C 627.054 297.216 627.321 296.021 627.404 294.858 C 628.018 286.301 629.412 277.657 628.451 269.012 C 627.404 270.409 626.094 271.806 624.697 273.028 C 623.213 274.339 621.640 275.648 620.156 276.784 C 618.060 278.530 615.790 279.228 613.345 278.966 C 612.143 275.128 610.951 271.286 609.765 267.440 C 610.717 268.200 611.678 268.957 612.647 269.711 C 613.083 269.536 613.345 269.274 613.608 268.925 C 613.957 268.401 614.393 267.964 614.830 267.615 C 616.751 266.043 618.147 264.035 618.933 261.677 C 621.117 254.692 623.736 247.793 626.705 240.982 C 627.142 240.022 627.229 238.974 627.142 238.013 C 625.920 227.447 622.340 217.842 616.140 209.023 C 615.229 208.737 614.327 208.446 613.433 208.150 C 612.909 208.412 612.909 208.412 612.909 208.587 M 613.433 208.150 C 613.258 208.150 613.170 208.237 613.084 208.237 M 525.414 141.438 C 524.978 141.176 524.541 141.089 524.017 141.001 C 521.048 140.216 518.953 138.382 517.730 135.326 C 516.246 131.483 515.023 127.379 514.063 123.188 C 515.511 123.484 516.966 123.776 518.429 124.061 C 525.240 124.236 531.701 125.808 537.901 128.777 C 542.180 130.872 544.625 134.103 545.411 138.644 C 546.596 140.191 547.790 141.733 548.990 143.271 C 548.118 144.144 547.070 144.494 545.848 144.145 C 543.926 143.708 542.441 142.835 541.307 141.263 C 540.608 140.215 539.560 139.604 538.425 139.167 C 537.814 138.992 537.464 138.644 537.115 138.119 C 536.177 138.270 535.245 138.416 534.321 138.556 C 532.313 141.700 529.343 142.661 525.414 141.438 M 511.531 144.930 C 511.960 143.859 512.397 142.781 512.840 141.699 C 513.102 141.700 513.276 141.700 513.538 141.612 C 515.896 142.049 517.206 143.446 517.381 145.891 C 517.520 146.420 517.665 146.944 517.817 147.463 C 520.401 150.116 522.991 152.765 525.589 155.409 C 527.707 155.618 529.831 155.821 531.964 156.020 C 532.400 156.457 532.837 156.806 533.360 156.980 C 537.639 158.553 542.005 158.640 546.371 157.068 C 546.371 156.806 546.371 156.544 546.371 156.369 C 546.546 154.623 546.807 154.186 547.244 155.234 C 548.547 156.025 549.856 156.811 551.174 157.592 C 551.894 157.800 552.621 158.004 553.356 158.203 C 555.416 164.262 557.482 170.317 559.556 176.366 C 559.382 177.501 558.596 178.200 557.286 178.200 C 555.802 178.549 554.404 179.335 553.356 180.645 C 552.745 181.343 551.872 181.692 550.737 181.431 C 546.459 180.383 542.005 179.334 537.639 178.461 C 536.766 178.199 535.980 177.850 535.369 177.413 C 532.924 175.580 530.217 174.532 527.248 174.008 C 526.600 174.275 525.960 174.537 525.327 174.794 C 521.921 173.397 519.040 173.834 516.508 175.754 C 516.849 178.029 517.199 180.300 517.556 182.565 C 514.318 182.366 511.087 182.162 507.863 181.954 C 507.303 181.405 506.749 180.853 506.204 180.295 C 504.596 179.892 502.995 179.485 501.402 179.072 C 501.402 178.200 501.314 177.413 501.139 176.627 C 500.965 175.667 500.441 175.143 499.655 174.881 C 497.036 174.357 494.678 173.658 492.233 172.524 C 491.709 172.261 491.185 172.087 490.574 171.738 C 487.430 171.825 484.461 171.476 481.580 170.777 C 481.340 167.202 481.107 163.622 480.881 160.037 C 479.419 159.838 477.964 159.634 476.515 159.426 C 475.926 157.771 475.344 156.112 474.769 154.448 C 470.752 153.314 466.910 153.662 463.330 155.584 C 460.710 155.147 458.003 154.798 455.210 154.623 C 452.851 154.361 450.669 155.059 448.747 156.544 C 445.517 159.338 441.936 161.172 437.832 162.307 C 436.348 162.657 435.038 162.744 433.554 162.482 C 428.489 162.394 423.600 161.172 418.884 158.902 C 419.671 157.068 420.805 155.933 422.552 155.671 C 424.036 155.846 425.521 155.933 427.092 155.932 C 431.633 155.932 434.777 154.187 436.348 150.432 C 435.643 149.651 434.945 148.865 434.252 148.074 C 433.292 146.066 433.641 144.319 435.300 143.010 C 437.221 141.437 439.491 140.215 442.024 139.255 C 442.017 138.067 442.017 136.873 442.024 135.675 C 441.290 135.301 440.562 134.923 439.841 134.540 C 440.277 134.190 440.714 134.015 441.063 133.667 C 445.517 133.666 449.883 132.881 454.074 131.396 C 458.178 129.999 462.108 130.261 465.950 132.269 C 468.831 136.199 472.848 137.683 477.825 136.810 C 482.272 140.279 486.725 143.742 491.185 147.201 C 491.528 146.216 491.876 145.226 492.233 144.232 C 493.070 144.121 493.914 144.004 494.765 143.883 C 494.852 142.922 494.241 142.224 493.106 141.699 C 489.439 140.215 486.033 138.382 482.802 136.024 C 481.318 134.976 479.659 134.103 477.825 133.753 C 474.507 132.967 472.673 131.134 472.498 127.990 C 471.793 127.559 471.095 127.123 470.403 126.681 C 475.555 128.164 480.707 129.737 485.771 131.483 C 486.907 131.745 487.867 132.269 488.740 132.967 C 493.979 137.333 499.567 141.613 505.331 145.891 C 505.506 146.328 505.767 146.764 505.942 147.114 C 509.253 150.436 512.572 153.755 515.896 157.068 C 514.434 153.027 512.979 148.981 511.531 144.930 M 569.598 147.026 C 568.987 145.978 568.113 145.280 566.979 144.669 C 564.533 143.533 562.351 141.962 560.342 140.128 C 558.945 138.731 557.374 137.247 555.889 135.849 C 551.611 132.008 549.777 127.379 550.300 121.791 C 552.767 124.591 555.241 127.384 557.722 130.174 C 560.866 132.793 563.922 135.587 566.979 138.382 C 571.170 142.223 574.750 146.328 577.719 150.955 C 579.553 153.750 581.124 156.719 582.347 159.688 C 580.862 159.600 579.553 158.989 578.330 157.679 C 575.186 154.273 572.392 150.694 569.598 147.026 M 569.685 195.401 C 570.471 195.925 571.083 196.624 571.344 197.497 C 574.314 201.077 577.544 204.482 581.037 207.714 C 581.648 208.237 582.172 208.848 582.609 209.634 C 588.371 218.541 593.523 227.884 598.239 237.402 C 602.605 246.221 606.447 255.215 609.940 264.471 C 610.027 264.646 610.027 264.821 609.940 265.170 C 609.066 265.344 608.368 264.733 607.844 263.074 C 607.407 261.852 606.709 260.717 605.836 259.669 C 602.431 255.565 599.200 251.199 596.143 246.658 C 590.118 237.664 584.705 228.320 579.902 218.716 C 578.156 215.223 576.060 211.992 573.790 208.936 C 570.297 204.308 567.153 199.244 564.358 194.092 C 566.367 193.917 568.113 194.353 569.685 195.401 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 464.290 140.652 C 463.760 140.948 463.236 141.239 462.719 141.525 C 463.242 144.494 465.164 146.241 468.656 146.764 C 469.355 143.708 468.220 141.787 465.513 141.001 C 465.076 140.826 464.727 140.652 464.290 140.652 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 488.216 155.584 C 488.740 156.020 489.439 156.282 490.137 156.282 C 490.923 156.282 491.709 156.020 492.233 155.584 C 492.757 155.147 493.106 154.623 493.106 154.099 C 493.106 153.400 492.757 152.877 492.233 152.527 C 491.709 152.091 490.923 151.916 490.137 151.916 C 489.438 151.916 488.740 152.091 488.216 152.527 C 487.605 152.877 487.343 153.400 487.343 154.099 C 487.343 154.623 487.605 155.147 488.216 155.584 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 406.922 95.769 C 407.008 96.119 406.834 96.294 406.572 96.555 C 402.730 99.087 401.595 102.231 403.167 105.898 C 407.934 105.496 412.707 105.089 417.487 104.676 C 418.098 104.676 418.797 104.589 419.408 104.502 C 419.926 103.110 420.450 101.713 420.980 100.310 C 420.107 98.739 419.059 97.341 418.011 96.119 C 415.042 93.062 411.637 91.491 407.707 91.403 C 407.008 92.626 406.660 94.110 406.922 95.769 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 369.985 48.093 C 376.709 47.045 383.432 47.220 390.156 48.791 C 396.181 50.189 400.808 48.617 404.040 44.164 C 403.189 43.325 402.345 42.481 401.508 41.631 C 365.096 36.739 328.770 38.313 292.620 46.259 C 245.642 56.650 204.165 77.782 168.190 109.566 C 156.401 119.870 145.486 131.047 135.269 143.010 C 128.022 151.480 121.386 160.211 115.099 169.468 C 108.986 178.374 103.485 187.717 98.508 197.235 C 93.531 206.841 89.164 216.533 85.410 226.575 C 84.537 229.020 83.664 231.552 82.703 234.084 C 85.235 237.751 86.545 241.856 86.371 246.134 C 86.371 248.142 86.982 249.889 88.292 251.461 C 90.825 254.779 92.919 258.359 94.578 262.201 C 95.102 263.423 95.714 264.646 96.325 265.955 C 97.548 268.314 98.770 270.846 99.993 273.203 C 101.041 275.212 101.389 277.569 101.215 279.927 C 100.691 285.079 102.088 289.357 105.494 292.675 C 107.441 292.097 109.391 291.515 111.345 290.929 C 112.244 294.135 113.146 297.336 114.051 300.535 C 114.051 307.083 113.614 313.633 112.915 320.182 C 112.915 320.530 112.654 320.880 112.304 321.316 C 108.375 325.421 106.367 330.223 106.367 335.812 C 106.367 340.963 106.366 346.028 106.367 351.006 C 106.367 353.712 106.454 356.419 106.716 359.126 C 106.804 360.610 106.716 362.095 106.367 363.667 C 115.972 375.891 122.522 389.600 126.276 404.707 C 126.451 405.406 126.887 406.192 127.411 406.890 C 130.903 411.169 135.182 414.487 140.247 417.019 C 141.295 417.543 142.168 418.242 143.041 419.115 C 147.232 423.742 150.463 429.157 152.646 435.182 C 155.091 442.080 156.489 449.152 157.012 456.400 C 157.100 459.281 157.711 462.163 158.759 464.870 C 159.632 467.315 160.767 469.673 161.990 471.943 C 162.688 473.253 163.299 474.563 163.823 475.785 C 164.434 477.357 165.308 478.754 166.356 480.151 C 167.752 481.985 168.626 483.993 168.975 486.264 C 169.063 486.787 169.324 487.311 169.674 487.748 C 170.721 488.884 171.420 490.018 171.682 491.416 C 171.944 492.550 172.381 493.773 172.817 495.082 C 174.215 498.575 175.786 501.981 177.794 505.211 C 179.541 508.268 181.025 511.586 181.985 514.992 C 182.597 517.087 183.208 519.095 183.819 521.191 C 184.344 523.112 185.042 525.033 186.090 526.954 C 186.963 528.613 188.098 530.273 189.321 531.844 C 197.441 541.799 205.736 551.491 214.207 561.097 C 215.168 562.145 215.953 563.279 216.739 564.502 C 219.882 564.327 222.938 564.764 225.995 565.899 C 229.138 567.122 232.195 568.431 235.251 569.829 C 236.561 570.440 237.871 570.265 239.093 569.392 C 238.919 567.645 238.045 566.336 236.474 565.725 C 232.981 564.327 229.313 563.104 225.645 562.145 C 224.597 561.795 223.550 561.534 222.502 561.534 C 221.192 556.993 220.144 552.364 219.445 547.649 C 219.271 546.514 218.747 545.641 217.961 544.768 C 215.954 542.759 213.770 541.275 211.150 540.402 C 211.088 530.477 211.032 520.552 210.976 510.626 C 211.412 510.277 211.849 509.927 212.286 509.752 C 212.548 509.577 212.809 509.404 213.159 509.316 C 213.509 509.316 213.770 509.316 214.207 509.316 C 214.731 509.404 215.342 509.491 215.953 509.665 C 216.386 510.075 216.822 510.481 217.263 510.888 C 222.327 500.234 228.440 490.193 235.425 481.025 C 236.036 480.151 236.474 479.191 236.474 478.055 C 237.172 469.585 237.434 460.940 237.259 452.471 C 237.172 451.685 237.346 450.986 237.783 450.288 C 238.219 449.240 238.744 448.192 239.355 447.232 C 244.769 445.310 250.270 444.612 255.859 445.136 C 256.295 444.874 256.557 444.700 256.906 444.350 C 260.399 441.644 263.018 438.237 264.764 434.221 C 265.813 431.601 266.511 428.982 266.773 426.275 C 267.123 421.908 267.035 417.542 266.249 413.176 C 265.463 408.287 265.725 403.572 267.123 399.031 C 267.821 396.761 269.043 394.840 270.790 393.093 C 272.886 391.085 274.981 388.814 276.989 386.545 C 279.347 383.925 281.705 380.956 283.975 377.812 C 284.238 377.376 284.412 376.939 284.499 376.416 C 285.285 372.137 285.285 368.032 284.586 363.841 C 284.411 362.531 283.888 361.396 283.015 360.349 C 282.142 359.475 281.705 358.427 281.704 357.205 C 281.704 356.681 281.617 356.332 281.356 355.983 C 281.006 355.633 280.745 355.458 280.308 355.371 C 279.959 355.284 279.609 355.109 279.260 355.109 C 278.911 354.935 278.649 354.847 278.299 354.673 C 277.601 354.498 276.990 354.499 276.204 354.498 C 275.505 354.411 274.981 354.672 274.632 355.371 C 273.147 354.934 271.925 353.538 270.790 351.006 C 269.743 348.822 267.909 347.774 265.202 348.211 C 263.018 348.036 260.836 347.425 258.914 346.202 C 257.692 345.591 256.470 344.893 255.073 344.194 C 254.374 341.225 252.628 339.654 249.658 339.391 C 248.698 339.828 247.737 339.916 246.777 339.915 C 238.744 339.479 231.845 336.598 225.907 331.446 C 224.336 330.136 223.375 328.477 222.852 326.468 C 222.065 323.412 221.454 320.443 220.668 317.562 C 220.494 316.776 220.145 316.164 219.445 315.641 C 216.652 313.371 213.770 311.100 210.889 309.004 C 209.317 307.869 208.094 306.647 207.221 305.076 C 206.523 304.028 205.475 303.067 204.165 302.368 C 202.331 301.408 200.673 300.272 199.362 298.788 C 198.751 298.002 197.791 297.740 196.742 297.740 C 195.782 297.915 194.821 298.264 193.948 298.613 C 193.425 298.963 192.726 299.224 192.028 299.224 C 190.544 299.399 189.146 299.661 187.662 300.097 C 182.685 296.430 178.668 291.802 175.612 285.952 C 175.262 285.254 174.913 284.555 174.389 283.856 C 172.729 281.324 170.722 279.403 168.277 277.832 C 165.919 276.259 163.212 275.648 160.243 275.910 C 157.012 276.172 153.956 276.784 150.900 277.832 C 150.464 277.832 150.027 277.832 149.590 277.832 C 149.005 277.107 148.423 276.380 147.844 275.648 C 148.543 271.807 147.232 269.099 143.827 267.440 C 143.303 267.178 142.779 266.741 142.343 266.305 C 139.723 263.249 137.191 263.424 134.571 266.829 C 133.262 268.488 132.126 270.060 130.904 271.719 C 129.158 274.164 127.410 276.521 125.839 278.879 C 125.315 279.665 124.704 280.451 124.092 281.324 C 122.259 283.507 120.425 285.777 118.679 288.047 C 118.417 288.397 118.068 288.747 117.718 289.095 C 116.551 286.712 115.387 284.325 114.226 281.936 C 112.534 282.695 110.846 283.452 109.161 284.206 C 106.454 283.507 105.320 282.022 105.494 279.490 C 105.843 276.084 105.930 272.854 105.930 269.623 C 105.930 266.043 106.454 262.637 107.415 259.319 C 108.113 257.049 107.852 254.953 106.716 252.945 C 105.287 252.483 103.861 252.017 102.438 251.548 C 104.268 243.169 106.102 234.787 107.939 226.400 C 107.645 225.996 107.353 225.589 107.066 225.177 C 105.756 225.352 104.271 226.400 102.874 228.321 C 100.953 230.853 99.294 233.472 97.897 236.179 C 96.642 236.562 95.391 236.940 94.142 237.315 C 92.483 233.124 93.007 228.757 95.452 224.217 C 98.071 219.414 100.167 214.350 101.652 209.023 C 101.827 208.412 102.175 208.062 102.700 207.801 C 104.359 206.753 105.668 205.356 106.629 203.610 C 109.249 199.069 111.693 194.353 114.226 189.726 C 115.535 187.281 117.544 186.058 120.163 186.058 C 120.338 186.058 120.338 186.058 120.425 186.058 C 121.412 187.431 122.401 188.799 123.394 190.163 C 124.704 190.424 125.839 189.988 126.626 188.853 C 128.022 186.931 129.769 185.622 131.864 184.749 C 132.126 184.661 132.563 184.661 132.999 184.749 C 133.174 187.281 132.475 189.638 130.816 192.083 C 130.554 192.520 130.292 192.957 130.031 193.394 C 128.110 196.712 127.935 200.117 129.332 203.348 C 129.944 204.745 130.292 206.229 130.380 207.889 C 131.512 210.163 132.647 212.433 133.785 214.699 C 134.135 214.350 134.396 214.088 134.571 213.651 C 134.746 213.127 134.833 212.603 134.746 212.080 C 134.746 211.294 134.833 210.508 135.182 209.721 C 135.619 208.500 135.444 207.539 134.484 206.840 C 132.825 206.055 132.476 204.570 133.261 202.562 C 136.055 195.663 139.287 188.940 142.866 182.391 C 146.272 176.017 151.511 171.475 158.409 168.943 C 162.950 167.109 166.618 164.054 169.150 159.775 C 170.547 157.592 171.420 155.059 171.944 152.527 C 172.118 151.829 172.468 151.130 172.992 150.607 C 174.477 148.860 176.397 147.463 178.667 146.328 C 181.287 145.105 183.733 143.883 186.090 142.573 C 187.137 141.962 188.010 141.437 188.709 140.826 C 189.582 140.215 190.019 139.517 190.281 138.644 C 190.630 137.247 191.067 136.111 191.678 134.976 C 192.639 133.143 193.687 131.396 194.821 129.737 C 195.346 129.213 195.695 128.427 196.044 127.467 C 196.307 126.244 197.180 125.371 198.314 124.934 C 199.625 124.411 200.934 124.236 202.419 124.498 C 204.776 124.061 207.046 124.148 209.229 124.585 C 211.761 125.109 214.381 125.458 217.001 125.458 C 221.192 125.808 223.637 124.061 224.249 120.306 C 224.336 119.782 224.511 119.259 224.511 118.822 C 224.773 115.853 225.035 113.059 225.384 110.177 C 225.384 109.741 225.209 109.304 224.860 108.955 C 224.336 108.431 223.899 107.907 223.375 107.470 C 226.019 107.184 228.668 106.894 231.321 106.597 C 231.671 106.859 231.933 107.121 232.020 107.470 C 232.108 107.907 232.282 108.257 232.544 108.518 C 232.718 108.868 232.893 109.130 233.242 109.304 C 233.504 109.566 233.854 109.653 234.290 109.653 C 234.988 109.741 235.600 110.090 236.299 110.352 C 236.735 110.789 237.085 111.312 237.172 111.836 C 237.346 112.360 237.434 112.884 237.608 113.409 C 237.696 114.020 237.608 114.543 237.347 115.067 C 236.997 116.027 236.822 116.988 236.910 117.949 C 241.708 118.507 246.510 119.060 251.318 119.608 C 251.929 117.250 251.928 114.980 251.405 112.709 C 251.055 110.788 250.619 108.955 250.357 107.121 C 250.968 105.724 251.928 104.589 253.151 103.629 C 254.199 102.930 255.247 102.318 256.470 101.969 C 256.644 101.795 256.906 101.795 257.080 101.620 C 257.430 101.184 257.692 100.572 257.605 100.048 C 257.430 98.825 257.343 97.778 256.994 96.730 C 256.470 94.721 255.334 93.062 253.850 91.840 C 251.928 91.840 251.928 90.880 253.588 88.871 C 255.160 87.037 256.819 85.553 258.740 84.156 C 258.740 84.069 258.914 84.069 259.002 83.981 C 257.862 81.338 256.727 78.690 255.596 76.035 C 254.136 78.079 252.681 80.116 251.230 82.148 C 250.702 79.708 250.178 77.263 249.658 74.813 C 247.651 74.114 245.642 74.376 243.721 75.860 C 240.839 77.869 238.045 80.314 235.513 82.846 C 234.901 82.933 234.290 82.846 233.679 82.584 C 232.893 82.322 232.108 82.322 231.321 82.584 C 230.623 82.846 230.186 83.283 229.749 83.981 C 229.488 84.767 229.226 85.466 228.876 86.078 C 226.083 88.348 222.938 90.007 219.533 91.141 C 218.834 91.316 218.136 91.578 217.263 91.840 C 215.953 92.189 214.818 91.840 213.770 91.055 C 212.897 89.133 213.246 87.387 214.905 86.078 C 221.018 81.537 227.130 76.909 233.068 72.368 C 235.076 70.883 237.172 70.360 239.355 70.883 C 239.555 72.606 239.758 74.324 239.966 76.035 C 244.157 75.599 247.388 73.241 249.833 69.049 C 250.881 67.041 252.540 65.993 254.723 65.644 C 256.295 65.382 257.779 65.208 259.176 65.208 C 260.050 65.033 260.923 64.859 261.709 64.684 C 261.709 65.993 261.272 67.042 260.486 68.002 C 259.962 68.701 259.176 69.137 258.303 69.399 C 257.343 69.661 256.469 70.098 255.771 70.796 C 255.684 70.970 255.596 71.145 255.596 71.233 C 255.945 73.415 257.255 74.638 259.439 74.726 C 261.272 74.376 263.018 73.765 264.591 72.717 C 265.202 72.368 266.075 72.106 266.948 72.106 C 270.266 72.455 272.186 70.796 272.711 67.304 C 272.886 66.867 273.061 66.430 273.235 65.993 C 275.238 66.698 277.247 67.397 279.260 68.089 C 282.141 68.177 283.538 66.779 283.626 63.811 C 283.801 58.572 286.507 55.602 291.834 54.904 C 292.096 54.816 292.358 54.643 292.533 54.293 C 293.494 52.546 294.017 50.713 294.017 48.617 C 298.233 48.740 302.453 48.856 306.678 48.966 C 306.761 50.078 306.848 51.184 306.941 52.284 C 307.110 52.639 307.284 52.989 307.464 53.332 C 303.621 57.523 299.344 61.366 294.890 64.945 C 290.699 68.177 289.738 72.019 291.922 76.560 C 292.533 77.782 293.231 79.004 294.192 79.965 C 294.803 80.576 295.414 81.100 296.287 81.537 C 296.637 81.711 297.073 81.973 297.510 82.148 C 300.566 80.401 303.447 78.481 306.329 76.385 C 307.115 75.686 308.075 75.249 309.210 74.900 C 314.100 73.328 318.292 70.622 321.523 66.779 C 321.872 66.430 322.309 66.343 322.832 66.430 C 327.286 66.866 331.652 66.517 335.931 65.208 C 338.463 64.597 340.558 63.374 342.479 61.540 C 344.226 59.620 346.408 59.095 349.116 59.794 C 350.076 59.968 350.949 59.794 351.823 59.270 C 352.958 58.572 354.006 58.135 355.140 57.698 C 354.553 56.831 353.971 55.958 353.394 55.079 C 358.919 52.756 364.449 50.428 369.985 48.093 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 622.165 394.665 C 621.632 394.696 621.109 394.726 620.593 394.752 C 618.846 398.594 616.576 402.175 613.782 405.406 C 611.861 407.763 609.940 410.295 608.106 412.915 C 606.797 414.661 605.749 416.669 604.875 418.678 C 604.352 419.988 603.915 421.210 603.478 422.608 C 601.469 428.720 599.548 435.007 597.541 441.207 C 595.794 446.882 594.396 452.645 593.523 458.497 C 597.453 454.916 601.033 451.248 604.439 447.319 C 605.312 446.184 606.185 445.136 607.058 443.913 C 609.329 440.770 610.900 437.277 611.686 433.260 C 613.432 424.267 616.402 415.710 620.681 407.501 C 622.776 403.484 623.212 399.206 622.165 394.665 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 147.320 240.458 C 149.586 238.221 151.856 235.980 154.131 233.735 C 151.857 233.390 149.586 233.040 147.320 232.686 C 145.424 232.836 143.532 232.982 141.644 233.124 C 140.418 234.670 139.196 236.213 137.976 237.751 C 141.087 238.657 144.202 239.560 147.320 240.458 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 154.568 238.101 C 154.480 238.188 154.568 238.363 154.654 238.363 C 155.963 240.546 157.885 241.419 160.505 241.070 C 160.094 239.968 159.686 238.861 159.283 237.751 C 157.708 237.872 156.136 237.989 154.568 238.101 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 119.901 216.271 C 120.043 216.682 120.189 217.090 120.338 217.493 C 122.172 219.152 123.831 220.899 125.403 222.820 C 126.363 223.955 126.887 225.177 126.887 226.487 C 127.149 230.679 129.069 233.822 132.562 235.743 C 133.436 235.743 134.221 235.481 135.007 235.045 C 136.753 234.258 137.627 233.036 137.802 231.377 C 137.802 231.202 137.802 231.115 137.802 230.941 C 135.968 226.225 132.999 222.383 128.895 219.327 C 127.760 218.629 126.712 217.930 125.839 217.318 C 124.092 216.009 122.084 215.660 119.901 216.271 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 397.840 86.078 C 397.753 86.252 397.578 86.426 397.491 86.601 C 396.181 88.783 396.617 90.880 398.801 92.626 C 395.483 91.665 393.386 92.714 392.252 95.682 C 390.942 99.525 390.767 103.105 391.815 106.597 C 394.697 105.200 397.054 103.191 399.149 100.659 C 401.333 97.953 401.245 95.333 398.888 92.626 C 401.595 93.849 403.953 93.325 405.612 91.055 C 404.738 86.776 402.119 85.118 397.840 86.078 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":212.688,\\\"max\\\":504.667},\\\"y\\\":{\\\"min\\\":184.364,\\\"max\\\":476.343}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":358.677,\\\"y\\\":701.029,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":358.677,\\\"y\\\":36.72,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":63.36,\\\"y\\\":331.256,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869891268289,\\\"y\\\":0.0051011348795355635}},{\\\"point\\\":{\\\"x\\\":653.994,\\\"y\\\":331.256,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869891268289,\\\"y\\\":0.0051011348795355635}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":568.101,\\\"y\\\":540.846,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128838074391485,\\\"y\\\":0.7012821665286114}},{\\\"point\\\":{\\\"x\\\":149.081,\\\"y\\\":540.889,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987062292667334,\\\"y\\\":0.7154086980068547}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":568.248,\\\"y\\\":121.763,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6313945384208971,\\\"y\\\":-0.7754617571823011}},{\\\"point\\\":{\\\"x\\\":149.818,\\\"y\\\":121.834,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.681693569027433,\\\"y\\\":-0.7316378051649877}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":358.677,\\\"y\\\":626.784,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"8E8B3F22-3ECA-490A-B60F-ADE6EEC19437_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"49.99%\\\",\\\"r\\\":\\\"63.14%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"61.57%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"goat\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":13.50635484243,\\\"max\\\":705.8752923127654},\\\"y\\\":{\\\"min\\\":55.117,\\\"max\\\":627.2227333210717}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goat\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goat\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 157.344 121.781 C 157.335 121.787 84.166 148.070 69.800 176.618 C 65.774 184.618 69.358 203.697 78.864 205.293 C 89.158 207.021 116.037 198.838 116.040 198.837 C 116.038 198.839 89.401 219.219 89.399 219.221 C 89.399 219.222 91.978 225.215 95.955 226.564 C 99.459 227.752 104.496 225.062 104.497 225.062 C 104.497 225.064 98.134 231.306 105.231 239.357 C 107.638 242.087 120.304 245.335 120.305 245.336 C 120.304 245.334 113.364 236.280 113.993 231.421 C 114.756 225.524 133.756 221.744 130.462 213.278 C 129.636 211.154 155.355 219.500 155.358 219.500 C 155.360 219.500 170.482 220.303 175.868 219.043 C 180.024 218.070 190.276 212.488 190.277 212.488 C 190.276 212.488 179.924 218.843 175.653 220.055 C 170.695 221.462 156.487 220.828 156.587 221.379 C 160.877 244.873 145.431 275.806 132.500 351.686 C 126.434 387.286 151.376 414.683 151.378 414.689 C 151.380 414.690 169.315 427.813 169.317 427.815 C 169.320 427.816 201.792 438.983 201.795 438.984 C 201.792 438.983 169.471 427.809 169.468 427.808 C 169.466 427.806 147.175 411.825 147.173 411.823 C 147.169 411.821 112.457 393.454 108.394 393.723 C 100.768 394.228 72.180 429.815 44.064 441.796 C 41.381 442.940 40.164 455.794 38.285 459.688 C 34.890 466.724 16.380 475.013 19.004 487.656 C 25.864 520.716 13.929 530.896 15.685 530.962 C 27.262 531.401 37.341 516.885 37.344 516.884 C 37.343 516.887 26.265 546.897 27.597 546.124 C 64.278 524.835 66.579 494.147 66.583 494.142 C 66.581 494.141 47.146 491.893 45.925 479.922 C 44.400 464.972 62.059 479.696 68.820 458.547 C 70.610 452.946 78.151 465.619 79.057 468.904 C 79.852 471.787 75.286 481.815 76.176 481.359 C 103.950 467.132 69.318 435.210 108.818 417.253 C 111.381 416.088 127.561 427.429 132.704 429.819 C 139.399 432.930 165.280 442.944 165.284 442.945 C 165.287 442.945 201.936 440.158 201.939 440.157 C 201.936 440.158 166.217 444.326 166.214 444.327 C 166.210 444.328 132.026 446.351 126.580 451.978 C 119.110 459.697 130.613 517.746 117.046 536.660 C 112.875 542.474 125.041 547.250 127.298 560.272 C 128.635 567.983 129.083 582.127 133.725 584.026 C 167.643 597.902 170.439 613.371 170.687 612.830 C 175.419 602.518 171.699 590.597 171.699 590.595 C 171.701 590.597 185.694 612.250 185.848 610.735 C 190.398 566.045 161.661 551.838 161.659 551.832 C 161.657 551.833 152.796 564.579 146.721 562.368 C 138.577 559.404 141.288 544.383 142.672 538.201 C 143.746 533.401 147.107 524.033 153.202 522.352 C 160.647 520.299 173.792 533.127 173.795 533.128 C 173.793 533.126 168.146 507.156 162.119 504.933 C 145.435 498.782 143.786 493.215 142.165 474.579 C 141.662 468.792 180.338 470.443 215.740 466.891 C 219.225 466.541 234.841 474.150 244.185 464.903 C 246.192 462.917 255.422 420.204 255.423 420.200 C 255.422 420.204 245.634 464.299 245.633 464.304 C 245.641 464.304 295.237 475.939 331.846 470.609 C 366.091 465.623 411.954 450.564 411.962 450.562 C 411.961 450.560 405.396 439.017 403.597 433.810 C 401.477 427.675 399.262 412.180 399.262 412.177 C 399.262 412.179 401.955 426.904 404.133 432.721 C 406.241 438.353 413.343 450.486 413.621 450.824 C 432.631 473.966 478.591 481.144 478.598 481.147 C 478.594 481.149 442.652 507.345 442.648 507.347 C 442.647 507.349 430.899 509.087 426.616 520.133 C 424.627 525.263 432.000 537.066 431.384 540.038 C 429.733 547.998 419.499 569.587 426.110 577.093 C 443.406 596.728 444.008 622.488 444.956 621.706 C 451.160 616.583 456.502 599.331 456.503 599.329 C 456.504 599.332 457.576 627.857 459.893 625.025 C 485.613 593.602 467.685 559.549 467.686 559.542 C 467.684 559.542 444.371 569.606 446.251 551.103 C 447.861 535.254 458.120 546.179 459.893 522.735 C 460.142 519.440 473.311 520.358 471.206 535.153 C 469.106 549.912 485.388 552.467 485.390 552.468 C 485.389 552.466 476.145 540.032 481.675 533.954 C 487.164 527.920 492.653 511.606 486.178 503.889 C 483.741 500.984 525.500 489.768 525.504 489.766 C 525.506 489.766 538.386 497.621 550.072 488.080 C 556.695 482.672 555.062 467.647 555.063 467.645 C 555.059 467.646 527.106 475.494 517.069 477.289 C 507.530 478.995 480.027 481.232 480.024 481.232 C 480.027 481.232 507.708 478.774 517.276 476.869 C 527.411 474.851 551.927 467.259 555.487 465.986 C 559.878 464.415 592.961 453.146 600.394 446.352 C 606.051 441.180 604.266 459.075 597.641 532.894 C 595.443 557.382 611.822 544.680 622.912 562.073 C 627.830 569.787 632.688 583.253 638.367 584.309 C 654.636 587.335 687.844 605.005 688.689 603.520 C 689.076 602.838 676.777 581.863 676.776 581.861 C 676.779 581.862 704.834 601.962 703.850 598.105 C 692.330 552.964 671.365 543.963 671.362 543.958 C 671.359 543.959 649.474 559.880 640.604 555.729 C 626.000 548.893 642.251 537.081 627.173 521.510 C 624.254 518.496 633.496 507.250 644.242 518.770 C 651.927 527.009 667.028 513.635 667.030 513.635 C 667.028 513.634 655.670 518.615 645.113 503.709 C 640.154 496.706 630.846 492.233 623.206 490.540 C 618.500 489.498 625.588 443.913 625.588 443.908 C 625.588 443.905 647.670 428.341 631.940 415.593 C 612.290 399.669 599.688 424.142 598.704 424.471 C 579.692 430.831 538.018 431.985 538.160 427.000 C 540.391 348.668 504.613 297.187 504.610 297.174 C 504.617 297.174 545.829 324.690 578.283 303.007 C 614.899 278.544 596.962 232.785 596.964 232.778 C 596.959 232.781 578.656 258.116 550.373 269.333 C 523.211 280.106 504.572 277.204 466.467 279.416 C 426.791 281.720 398.251 329.455 329.151 331.701 C 269.279 333.647 241.198 306.418 235.006 287.736 C 224.352 255.592 226.047 208.316 231.699 195.448 C 236.937 183.527 234.728 166.362 234.728 166.359 C 234.733 166.362 250.137 188.837 277.317 195.245 C 330.564 207.798 362.066 160.697 349.872 158.573 C 335.376 156.048 322.134 168.200 274.459 159.259 C 257.339 156.049 230.281 139.117 228.068 136.481 C 218.293 124.839 212.133 121.970 212.131 121.969 C 212.131 121.966 205.809 113.601 207.717 97.979 C 209.310 84.933 220.632 59.015 220.633 59.012 C 220.630 59.014 202.563 69.760 194.361 82.900 C 183.683 100.006 183.356 117.704 183.355 117.708 C 183.356 117.702 171.540 105.338 190.152 57.117 C 148.142 91.049 157.347 121.775 157.344 121.781 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 285.840 174.056 C 305.935 176.650 324.854 169.019 344.360 166.501 M 231.171 151.894 C 231.177 151.896 265.751 171.462 285.840 174.056 M 190.152 57.117 C 148.142 91.049 157.347 121.775 157.344 121.781 C 157.335 121.787 84.166 148.070 69.800 176.618 C 65.774 184.618 69.358 203.697 78.864 205.293 C 89.158 207.021 116.037 198.838 116.040 198.837 C 116.038 198.839 89.401 219.219 89.399 219.221 C 89.399 219.222 91.978 225.215 95.955 226.564 C 99.459 227.752 104.496 225.062 104.497 225.062 C 104.497 225.064 98.134 231.306 105.231 239.357 C 107.638 242.087 120.304 245.335 120.305 245.336 C 120.304 245.334 113.364 236.280 113.993 231.421 C 114.756 225.524 133.756 221.744 130.462 213.278 C 129.636 211.154 155.355 219.500 155.358 219.500 C 155.360 219.500 170.482 220.303 175.868 219.043 C 180.024 218.070 190.276 212.488 190.277 212.488 C 190.276 212.488 179.924 218.843 175.653 220.055 C 170.695 221.462 156.487 220.828 156.587 221.379 C 160.877 244.873 145.431 275.806 132.500 351.686 C 126.434 387.286 151.376 414.683 151.378 414.689 C 151.380 414.690 169.315 427.813 169.317 427.815 C 169.466 427.806 147.175 411.825 147.173 411.823 C 147.169 411.821 112.457 393.454 108.394 393.723 C 100.768 394.228 72.180 429.815 44.064 441.796 C 41.381 442.940 40.164 455.794 38.285 459.688 C 34.890 466.724 16.380 475.013 19.004 487.656 C 25.864 520.716 13.929 530.896 15.685 530.962 C 27.262 531.401 37.341 516.885 37.344 516.884 C 37.343 516.887 26.265 546.897 27.597 546.124 C 64.278 524.835 66.579 494.147 66.583 494.142 C 66.581 494.141 47.146 491.893 45.925 479.922 C 44.400 464.972 62.059 479.696 68.820 458.547 C 70.610 452.946 78.151 465.619 79.057 468.904 C 79.852 471.787 75.286 481.815 76.176 481.359 C 103.950 467.132 69.318 435.210 108.818 417.253 C 111.381 416.088 127.561 427.429 132.704 429.819 C 139.399 432.930 165.280 442.944 165.284 442.945 C 165.287 442.945 201.936 440.158 201.939 440.157 C 201.936 440.158 166.217 444.326 166.214 444.327 C 166.210 444.328 132.026 446.351 126.580 451.978 C 119.110 459.697 130.613 517.746 117.046 536.660 C 112.875 542.474 125.041 547.250 127.298 560.272 C 128.635 567.983 129.083 582.127 133.725 584.026 C 167.643 597.902 170.439 613.371 170.687 612.830 C 175.419 602.518 171.699 590.597 171.699 590.595 C 171.701 590.597 185.694 612.250 185.848 610.735 C 190.398 566.045 161.661 551.838 161.659 551.832 C 161.657 551.833 152.796 564.579 146.721 562.368 C 138.577 559.404 141.288 544.383 142.672 538.201 C 143.746 533.401 147.107 524.033 153.202 522.352 C 160.647 520.299 173.792 533.127 173.795 533.128 C 173.793 533.126 168.146 507.156 162.119 504.933 C 145.435 498.782 143.786 493.215 142.165 474.579 C 141.662 468.792 180.338 470.443 215.740 466.891 C 219.225 466.541 234.841 474.150 244.185 464.903 C 246.192 462.917 255.422 420.204 255.423 420.200 C 255.422 420.204 245.634 464.299 245.633 464.304 C 245.641 464.304 295.237 475.939 331.846 470.609 C 366.091 465.623 411.954 450.564 411.962 450.562 C 411.961 450.560 405.396 439.017 403.597 433.810 C 401.477 427.675 399.262 412.180 399.262 412.177 C 399.262 412.179 401.955 426.904 404.133 432.721 C 406.241 438.353 413.343 450.486 413.621 450.824 C 432.631 473.966 478.591 481.144 478.598 481.147 C 478.594 481.149 442.652 507.345 442.648 507.347 C 442.647 507.349 430.899 509.087 426.616 520.133 C 424.627 525.263 432.000 537.066 431.384 540.038 C 429.733 547.998 419.499 569.587 426.110 577.093 C 443.406 596.728 444.008 622.488 444.956 621.706 C 451.160 616.583 456.502 599.331 456.503 599.329 C 456.504 599.332 457.576 627.857 459.893 625.025 C 485.613 593.602 467.685 559.549 467.686 559.542 C 467.684 559.542 444.371 569.606 446.251 551.103 C 447.861 535.254 458.120 546.179 459.893 522.735 C 460.142 519.440 473.311 520.358 471.206 535.153 C 469.106 549.912 485.388 552.467 485.390 552.468 C 485.389 552.466 476.145 540.032 481.675 533.954 C 487.164 527.920 492.653 511.606 486.178 503.889 C 483.741 500.984 525.500 489.768 525.504 489.766 C 525.506 489.766 538.386 497.621 550.072 488.080 C 556.695 482.672 555.062 467.647 555.063 467.645 C 555.059 467.646 527.106 475.494 517.069 477.289 C 507.530 478.995 480.027 481.232 480.024 481.232 C 480.027 481.232 507.708 478.774 517.276 476.869 C 527.411 474.851 551.927 467.259 555.487 465.986 C 559.878 464.415 592.961 453.146 600.394 446.352 C 606.051 441.180 604.266 459.075 597.641 532.894 C 595.443 557.382 611.822 544.680 622.912 562.073 C 627.830 569.787 632.688 583.253 638.367 584.309 C 654.636 587.335 687.844 605.005 688.689 603.520 C 689.076 602.838 676.777 581.863 676.776 581.861 C 676.779 581.862 704.834 601.962 703.850 598.105 C 692.330 552.964 671.365 543.963 671.362 543.958 C 671.359 543.959 649.474 559.880 640.604 555.729 C 626.000 548.893 642.251 537.081 627.173 521.510 C 624.254 518.496 633.496 507.250 644.242 518.770 C 651.927 527.009 667.028 513.635 667.030 513.635 C 667.028 513.634 655.670 518.615 645.113 503.709 C 640.154 496.706 630.846 492.233 623.206 490.540 C 618.500 489.498 625.588 443.913 625.588 443.908 C 625.588 443.905 647.670 428.341 631.940 415.593 C 612.290 399.669 599.688 424.142 598.704 424.471 C 579.692 430.831 538.018 431.985 538.160 427.000 C 540.391 348.668 504.613 297.187 504.610 297.174 C 504.617 297.174 545.829 324.690 578.283 303.007 C 614.899 278.544 596.962 232.785 596.964 232.778 C 596.959 232.781 578.656 258.116 550.373 269.333 C 523.211 280.106 504.572 277.204 466.467 279.416 C 426.791 281.720 398.251 329.455 329.151 331.701 C 269.279 333.647 241.198 306.418 235.006 287.736 C 224.352 255.592 226.047 208.316 231.699 195.448 C 236.937 183.527 234.728 166.362 234.728 166.359 C 234.733 166.362 250.137 188.837 277.317 195.245 C 330.564 207.798 362.066 160.697 349.872 158.573 C 335.376 156.048 322.134 168.200 274.459 159.259 C 257.339 156.049 230.281 139.117 228.068 136.481 C 218.293 124.839 212.133 121.970 212.131 121.969 C 212.131 121.966 205.809 113.601 207.717 97.979 C 209.310 84.933 220.632 59.015 220.633 59.012 C 220.630 59.014 202.563 69.760 194.361 82.900 C 183.683 100.006 183.356 117.704 183.355 117.708 C 183.356 117.702 171.540 105.338 190.152 57.117 M 201.795 438.984 C 201.792 438.983 169.471 427.809 169.468 427.808 C 169.320 427.816 201.792 438.983 201.795 438.984 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 182.358 117.728 C 182.356 117.729 175.893 121.097 170.026 121.913 C 162.572 122.950 162.001 122.060 157.988 122.133 M 184.635 118.608 C 184.636 118.609 188.324 121.445 196.012 122.792 C 203.503 124.105 211.791 122.204 211.793 122.204 M 503.214 295.298 C 503.220 295.298 543.895 300.478 566.967 286.487 C 595.845 268.974 596.950 236.959 596.953 236.954 M 657.675 588.455 C 657.675 588.454 662.084 581.090 661.995 575.104 C 661.863 566.300 654.534 555.865 654.534 555.863 M 23.502 500.495 C 23.504 500.495 32.215 503.350 38.031 502.066 C 45.404 500.438 53.737 492.250 53.739 492.249 M 436.598 588.063 C 436.599 588.062 446.280 585.653 451.127 580.602 C 455.861 575.669 457.409 564.111 457.410 564.109 M 151.372 591.347 C 151.373 591.346 158.756 586.183 160.546 580.209 C 163.205 571.334 157.530 558.988 157.530 558.986 M 254.958 418.819 C 254.965 418.820 291.763 429.811 318.920 428.991 C 353.243 427.954 398.662 410.556 398.670 410.554 M 183.590 219.034 C 184.475 263.725 168.985 283.427 168.793 353.242 C 168.683 393.029 208.449 401.536 208.453 401.541 C 208.453 401.545 204.118 438.773 204.118 438.777 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 491.919 310.095 C 491.921 310.103 513.835 352.203 513.613 388.687 C 513.365 429.542 491.667 444.223 492.864 444.570 C 540.027 458.245 587.385 438.909 593.150 435.847 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 156.089 161.766 C 155.570 154.955 160.645 149.042 167.455 148.522 C 174.266 148.003 180.179 153.078 180.699 159.888 C 181.218 166.699 176.143 172.612 169.333 173.132 C 162.522 173.652 156.609 168.577 156.089 161.766 M 133.495 167.603 C 133.498 167.600 141.169 147.234 167.810 141.379 C 182.249 138.206 208.365 156.183 208.369 156.184 C 208.366 156.187 189.432 180.026 171.990 182.565 C 147.833 186.082 133.498 167.604 133.495 167.603 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 90.004 174.724 C 96.764 172.949 98.246 176.597 99.721 179.689 C 101.013 182.397 93.230 182.782 87.898 183.877 C 83.999 184.679 82.657 187.217 82.657 187.217 C 82.657 187.216 81.026 177.081 90.004 174.724 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":412.942,\\\"max\\\":492.241},\\\"y\\\":{\\\"min\\\":328.992,\\\"max\\\":408.291}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":322.963,\\\"y\\\":671.138,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":331.605,\\\"y\\\":330.036,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":133.656,\\\"y\\\":360.936,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869423966429,\\\"y\\\":0.005110287292651839}},{\\\"point\\\":{\\\"x\\\":533.07,\\\"y\\\":360.936,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869423966429,\\\"y\\\":0.005110287292651861}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":469.879,\\\"y\\\":582.683,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129335762692849,\\\"y\\\":0.7012315707581112}},{\\\"point\\\":{\\\"x\\\":135.206,\\\"y\\\":583.965,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986883991125055,\\\"y\\\":0.7154261114507943}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":146.477,\\\"y\\\":124.491,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5123703016030172,\\\"y\\\":-0.8587646208567474}},{\\\"point\\\":{\\\"x\\\":217.531,\\\"y\\\":126.951,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314454286031308,\\\"y\\\":-0.7754203187279841}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":593.778,\\\"y\\\":247.79,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.42632319145155145,\\\"y\\\":-0.9045709128811096}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"goat_fore\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":13.934734135126346,\\\"max\\\":354.4963633292218},\\\"y\\\":{\\\"min\\\":44.406,\\\"max\\\":603.4417631469097}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goat_fore\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goat_fore\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 329.190 320.648 C 329.162 346.721 329.143 381.346 329.100 417.097 C 329.101 431.326 329.101 445.650 329.115 460.421 C 293.052 464.574 245.783 453.087 245.775 453.086 C 245.776 453.082 255.552 409.041 255.553 409.037 C 255.552 409.041 246.333 451.701 244.329 453.684 C 234.997 462.920 219.400 455.321 215.919 455.670 C 180.561 459.217 141.934 457.568 142.436 463.348 C 144.055 481.961 145.702 487.521 162.365 493.665 C 168.385 495.885 174.025 521.822 174.026 521.825 C 174.024 521.824 160.895 509.012 153.460 511.062 C 147.372 512.741 144.015 522.097 142.942 526.892 C 141.560 533.066 138.852 548.068 146.986 551.028 C 153.054 553.236 161.904 540.507 161.905 540.506 C 161.908 540.512 190.609 554.701 186.065 599.335 C 185.911 600.848 171.935 579.222 171.933 579.220 C 171.933 579.222 175.649 591.129 170.923 601.428 C 170.675 601.968 167.882 586.518 134.007 572.660 C 129.371 570.763 128.923 556.636 127.588 548.935 C 125.333 535.929 113.182 531.159 117.348 525.352 C 130.898 506.462 119.409 448.485 126.871 440.775 C 132.309 435.156 166.451 433.135 166.455 433.134 C 166.459 433.134 202.132 428.970 202.136 428.970 C 202.132 428.970 165.530 431.754 165.526 431.754 C 165.523 431.753 139.673 421.751 132.987 418.644 C 127.850 416.257 111.690 404.930 109.130 406.094 C 69.680 424.028 104.268 455.911 76.530 470.120 C 75.640 470.575 80.200 460.560 79.406 457.680 C 78.502 454.400 70.970 441.742 69.182 447.336 C 62.429 468.459 44.792 453.753 46.315 468.685 C 47.535 480.641 66.946 482.886 66.948 482.887 C 66.944 482.892 64.646 513.542 28.011 534.804 C 26.680 535.576 37.744 505.604 37.745 505.601 C 37.743 505.602 27.676 520.100 16.113 519.662 C 14.360 519.595 26.280 509.428 19.428 476.409 C 16.808 463.781 35.294 455.503 38.685 448.476 C 40.562 444.587 41.777 431.749 44.457 430.606 C 72.538 418.640 101.091 383.097 108.707 382.593 C 112.765 382.324 147.434 400.669 147.438 400.671 C 147.440 400.672 169.703 416.634 169.705 416.635 C 169.708 416.636 201.989 427.797 201.992 427.798 C 201.989 427.797 169.557 416.644 169.554 416.642 C 169.552 416.641 151.639 403.534 151.637 403.533 C 151.636 403.527 126.724 376.164 132.783 340.608 C 145.698 264.822 161.125 233.928 156.840 210.464 C 156.740 209.913 170.931 210.546 175.882 209.141 C 180.148 207.931 190.487 201.584 190.488 201.583 C 190.487 201.584 180.248 207.159 176.097 208.130 C 170.718 209.389 155.614 208.587 155.612 208.587 C 155.610 208.587 129.922 200.251 130.748 202.372 C 134.038 210.828 115.061 214.603 114.299 220.493 C 113.670 225.346 120.603 234.389 120.603 234.390 C 120.602 234.390 107.952 231.146 105.548 228.419 C 98.459 220.378 104.814 214.143 104.814 214.142 C 104.813 214.142 99.783 216.828 96.283 215.642 C 92.311 214.295 89.736 208.309 89.735 208.309 C 89.738 208.307 116.341 187.952 116.344 187.950 C 116.340 187.951 89.495 196.124 79.214 194.397 C 69.719 192.803 66.140 173.748 70.161 165.758 C 84.509 137.246 157.587 110.995 157.596 110.989 C 157.599 110.983 148.405 80.296 190.363 46.406 C 171.775 94.567 183.575 106.915 183.575 106.921 C 183.576 106.918 183.902 89.242 194.567 72.157 C 202.759 59.033 220.804 48.300 220.806 48.298 C 220.805 48.302 209.497 74.187 207.906 87.217 C 206.001 102.820 212.315 111.174 212.315 111.177 C 212.317 111.178 218.469 114.044 228.232 125.671 C 230.443 128.304 257.466 145.215 274.565 148.421 C 322.181 157.351 335.406 145.214 349.884 147.735 C 362.064 149.857 330.601 196.899 277.420 184.362 C 250.274 177.962 234.888 155.515 234.884 155.512 C 234.884 155.515 237.090 172.658 231.859 184.565 C 226.213 197.417 224.521 244.634 235.161 276.737 C 241.346 295.397 269.392 322.592 329.190 320.648 M 156.343 150.925 C 155.824 144.122 160.893 138.216 167.695 137.697 C 174.497 137.179 180.403 142.247 180.922 149.049 C 181.441 155.852 176.372 161.758 169.570 162.276 C 162.768 162.795 156.862 157.727 156.343 150.925 M 133.776 156.754 C 133.780 156.751 141.441 136.410 168.049 130.563 C 182.471 127.394 208.554 145.348 208.558 145.350 C 208.554 145.352 189.644 169.162 172.224 171.698 C 148.097 175.210 133.780 156.756 133.776 156.754 M 83.002 176.344 C 83.002 176.343 81.373 166.221 90.340 163.866 C 97.091 162.093 98.572 165.738 100.045 168.826 C 101.335 171.530 93.561 171.914 88.237 173.008 C 84.343 173.809 83.002 176.344 83.002 176.344 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 151.631 579.972 C 151.632 579.970 159.006 574.814 160.794 568.847 C 163.450 559.983 157.782 547.653 157.782 547.650 M 329.190 320.648 C 329.162 346.721 329.143 381.346 329.100 417.097 C 329.101 431.326 329.101 445.650 329.115 460.421 C 293.052 464.574 245.783 453.087 245.775 453.086 C 245.776 453.082 255.552 409.041 255.553 409.037 C 255.552 409.041 246.333 451.701 244.329 453.684 C 234.997 462.920 219.400 455.321 215.919 455.670 C 180.561 459.217 141.934 457.568 142.436 463.348 C 144.055 481.961 145.702 487.521 162.365 493.665 C 168.385 495.885 174.025 521.822 174.026 521.825 C 174.024 521.824 160.895 509.012 153.460 511.062 C 147.372 512.741 144.015 522.097 142.942 526.892 C 141.560 533.066 138.852 548.068 146.986 551.028 C 153.054 553.236 161.904 540.507 161.905 540.506 C 161.908 540.512 190.609 554.701 186.065 599.335 C 185.911 600.848 171.935 579.222 171.933 579.220 C 171.933 579.222 175.649 591.129 170.923 601.428 C 170.675 601.968 167.882 586.518 134.007 572.660 C 129.371 570.763 128.923 556.636 127.588 548.935 C 125.333 535.929 113.182 531.159 117.348 525.352 C 130.898 506.462 119.409 448.485 126.871 440.775 C 132.309 435.156 166.451 433.135 166.455 433.134 C 166.459 433.134 202.132 428.970 202.136 428.970 C 202.132 428.970 165.530 431.754 165.526 431.754 C 165.523 431.753 139.673 421.751 132.987 418.644 C 127.850 416.257 111.690 404.930 109.130 406.094 C 69.680 424.028 104.268 455.911 76.530 470.120 C 75.640 470.575 80.200 460.560 79.406 457.680 C 78.502 454.400 70.970 441.742 69.182 447.336 C 62.429 468.459 44.792 453.753 46.315 468.685 C 47.535 480.641 66.946 482.886 66.948 482.887 C 66.944 482.892 64.646 513.542 28.011 534.804 C 26.680 535.576 37.744 505.604 37.745 505.601 C 37.743 505.602 27.676 520.100 16.113 519.662 C 14.360 519.595 26.280 509.428 19.428 476.409 C 16.808 463.781 35.294 455.503 38.685 448.476 C 40.562 444.587 41.777 431.749 44.457 430.606 C 72.538 418.640 101.091 383.097 108.707 382.593 C 112.765 382.324 147.434 400.669 147.438 400.671 C 147.440 400.672 169.703 416.634 169.705 416.635 C 169.708 416.636 201.989 427.797 201.992 427.798 C 201.989 427.797 169.557 416.644 169.554 416.642 C 169.552 416.641 151.639 403.534 151.637 403.533 C 151.636 403.527 126.724 376.164 132.783 340.608 C 145.698 264.822 161.125 233.928 156.840 210.464 C 156.740 209.913 170.931 210.546 175.882 209.141 C 180.148 207.931 190.487 201.584 190.488 201.583 C 190.487 201.584 180.248 207.159 176.097 208.130 C 170.718 209.389 155.614 208.587 155.612 208.587 C 155.610 208.587 129.922 200.251 130.748 202.372 C 134.038 210.828 115.061 214.603 114.299 220.493 C 113.670 225.346 120.603 234.389 120.603 234.390 C 120.602 234.390 107.952 231.146 105.548 228.419 C 98.459 220.378 104.814 214.143 104.814 214.142 C 104.813 214.142 99.783 216.828 96.283 215.642 C 92.311 214.295 89.736 208.309 89.735 208.309 C 89.738 208.307 116.341 187.952 116.344 187.950 C 116.340 187.951 89.495 196.124 79.214 194.397 C 69.719 192.803 66.140 173.748 70.161 165.758 C 84.509 137.246 157.587 110.995 157.596 110.989 C 157.599 110.983 148.405 80.296 190.363 46.406 C 171.775 94.567 183.575 106.915 183.575 106.921 C 183.576 106.918 183.902 89.242 194.567 72.157 C 202.759 59.033 220.804 48.300 220.806 48.298 C 220.805 48.302 209.497 74.187 207.906 87.217 C 206.001 102.820 212.315 111.174 212.315 111.177 C 212.317 111.178 218.469 114.044 228.232 125.671 C 230.443 128.304 257.466 145.215 274.565 148.421 C 322.181 157.351 335.406 145.214 349.884 147.735 C 362.064 149.857 330.601 196.899 277.420 184.362 C 250.274 177.962 234.888 155.515 234.884 155.512 C 234.884 155.515 237.090 172.658 231.859 184.565 C 226.213 197.417 224.521 244.634 235.161 276.737 C 241.346 295.397 269.392 322.592 329.190 320.648 M 170.263 111.122 C 162.818 112.157 162.247 111.268 158.240 111.341 M 182.579 106.942 C 182.577 106.942 176.122 110.306 170.263 111.122 M 196.216 111.999 C 203.698 113.310 211.975 111.411 211.977 111.411 M 184.853 107.821 C 184.854 107.821 188.537 110.654 196.216 111.999 M 38.432 490.801 C 45.795 489.176 54.118 480.998 54.120 480.997 M 23.921 489.232 C 23.922 489.233 32.622 492.084 38.432 490.801 M 318.971 417.817 C 322.399 417.714 325.938 417.447 329.100 417.097 M 255.089 407.658 C 255.095 407.659 291.848 418.636 318.971 417.817 M 208.642 390.401 C 208.641 390.405 204.312 427.587 204.312 427.591 M 169.031 342.162 C 168.921 381.900 208.638 390.396 208.642 390.401 M 183.809 208.121 C 184.693 252.757 169.223 272.434 169.031 342.162 M 285.933 163.199 C 306.002 165.790 324.897 158.169 344.380 155.654 M 231.331 141.065 C 231.337 141.067 265.868 160.609 285.933 163.199 M 156.343 150.925 C 155.824 144.122 160.893 138.216 167.695 137.697 C 174.497 137.179 180.403 142.247 180.922 149.049 C 181.441 155.852 176.372 161.758 169.570 162.276 C 162.768 162.795 156.862 157.727 156.343 150.925 M 133.776 156.754 C 133.780 156.751 141.441 136.410 168.049 130.563 C 182.471 127.394 208.554 145.348 208.558 145.350 C 208.554 145.352 189.644 169.162 172.224 171.698 C 148.097 175.210 133.780 156.756 133.776 156.754 M 83.002 176.344 C 83.002 176.343 81.373 166.221 90.340 163.866 C 97.091 162.093 98.572 165.738 100.045 168.826 C 101.335 171.530 93.561 171.914 88.237 173.008 C 84.343 173.809 83.002 176.344 83.002 176.344 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 329.190 320.648 C 329.162 346.721 329.143 381.346 329.100 417.097 C 329.101 431.107 329.101 445.209 329.115 459.751 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":329.312,\\\"y\\\":385.244,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":328.826,\\\"y\\\":385.419,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"goat_head\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":4.632,\\\"max\\\":716.158},\\\"y\\\":{\\\"min\\\":31.146594126977348,\\\"max\\\":676.901}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goat_head\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goat_head\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 327.736 581.000 C 327.737 581.002 337.451 594.968 339.367 607.995 C 340.811 617.815 334.682 620.335 337.150 630.039 C 340.027 641.352 346.848 640.710 351.940 651.215 C 356.820 661.281 359.123 674.899 359.124 674.901 C 359.125 674.898 370.016 657.669 371.363 641.958 C 371.817 636.650 369.158 634.505 370.283 628.513 C 372.514 616.620 379.138 616.394 382.879 604.886 C 386.345 594.222 386.376 580.324 386.376 580.324 C 386.376 580.324 327.742 581.000 327.736 581.000 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 278.261 81.193 C 330.637 126.107 350.644 241.102 350.568 242.077 C 350.570 242.077 369.969 242.128 369.971 242.128 C 369.978 242.112 390.373 126.534 443.209 81.630 C 496.376 36.444 561.722 14.095 640.165 61.990 C 706.939 102.761 713.153 209.779 713.160 209.794 C 713.152 209.785 682.197 148.074 630.602 125.777 C 566.983 98.283 513.495 112.209 486.736 156.194 C 472.997 178.779 460.101 256.053 460.098 256.063 C 460.100 256.064 476.035 270.941 476.037 270.942 C 476.042 270.939 513.889 247.251 528.609 243.690 C 543.079 240.189 572.088 246.010 586.817 243.844 C 599.790 241.936 626.633 219.892 635.932 229.137 C 648.901 242.030 619.212 281.379 606.085 294.112 C 591.339 308.418 546.339 310.196 531.819 324.732 C 525.637 330.920 523.079 349.316 516.901 355.508 C 511.368 361.052 489.475 369.130 489.472 369.131 C 489.472 369.139 495.811 426.499 486.994 443.310 C 480.917 454.897 453.592 463.881 446.964 475.161 C 440.667 485.876 445.489 512.569 438.847 523.075 C 435.291 528.701 422.010 533.498 418.261 538.998 C 413.158 546.488 413.819 565.513 409.040 573.214 C 403.915 581.473 389.619 595.044 380.441 598.247 C 375.480 599.977 365.152 598.206 359.898 598.192 C 354.352 598.177 343.436 599.999 338.213 598.135 C 329.058 594.867 314.828 581.237 309.747 572.951 C 305.009 565.225 305.770 546.204 300.707 538.687 C 296.988 533.167 283.732 528.300 280.205 522.655 C 273.620 512.114 278.583 485.447 272.343 474.698 C 265.774 463.384 239.538 456.265 232.482 442.636 C 222.244 422.863 230.396 368.453 230.396 368.446 C 230.393 368.444 208.544 360.250 203.041 354.677 C 196.895 348.452 194.434 330.044 188.285 323.822 C 173.842 309.210 128.853 307.193 114.182 292.810 C 101.123 280.008 71.643 240.502 84.680 227.678 C 94.028 218.483 120.754 240.668 133.716 242.645 C 148.434 244.889 177.473 239.221 191.924 242.799 C 206.625 246.438 244.346 270.326 244.351 270.329 C 244.353 270.327 260.367 255.535 260.368 255.534 C 260.768 254.566 247.947 178.184 234.340 155.526 C 207.832 111.389 154.401 97.191 90.637 124.348 C 38.925 146.372 7.643 207.918 7.635 207.926 C 7.642 207.911 14.423 100.928 81.412 60.511 C 160.107 13.032 225.295 35.772 278.261 81.193 M 266.863 389.085 C 276.360 397.952 307.910 402.889 307.914 402.890 C 307.913 402.886 303.733 369.010 295.468 361.770 C 287.022 354.370 252.121 354.807 252.117 354.807 C 252.119 354.810 258.681 381.445 266.863 389.085 M 452.896 389.578 C 443.353 398.394 411.778 403.164 411.774 403.165 C 411.775 403.161 416.133 369.308 424.437 362.111 C 432.922 354.756 467.819 355.378 467.824 355.378 C 467.822 355.381 461.119 381.981 452.896 389.578 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 278.261 81.193 C 330.637 126.107 350.644 241.102 350.568 242.077 C 350.570 242.077 369.969 242.128 369.971 242.128 C 369.978 242.112 390.373 126.534 443.209 81.630 C 496.376 36.444 561.722 14.095 640.165 61.990 C 706.939 102.761 713.153 209.779 713.160 209.794 C 713.152 209.785 682.197 148.074 630.602 125.777 C 566.983 98.283 513.495 112.209 486.736 156.194 C 472.997 178.779 460.101 256.053 460.098 256.063 C 460.100 256.064 476.035 270.941 476.037 270.942 C 476.042 270.939 513.889 247.251 528.609 243.690 C 543.079 240.189 572.088 246.010 586.817 243.844 C 599.790 241.936 626.633 219.892 635.932 229.137 C 648.901 242.030 619.212 281.379 606.085 294.112 C 591.339 308.418 546.339 310.196 531.819 324.732 C 525.637 330.920 523.079 349.316 516.901 355.508 C 511.368 361.052 489.475 369.130 489.472 369.131 C 489.472 369.139 495.811 426.499 486.994 443.310 C 480.917 454.897 453.592 463.881 446.964 475.161 C 440.667 485.876 445.489 512.569 438.847 523.075 C 435.291 528.701 422.010 533.498 418.261 538.998 C 413.158 546.488 413.819 565.513 409.040 573.214 C 403.915 581.473 389.619 595.044 380.441 598.247 C 375.480 599.977 365.152 598.206 359.898 598.192 C 354.352 598.177 343.436 599.999 338.213 598.135 C 329.058 594.867 314.828 581.237 309.747 572.951 C 305.009 565.225 305.770 546.204 300.707 538.687 C 296.988 533.167 283.732 528.300 280.205 522.655 C 273.620 512.114 278.583 485.447 272.343 474.698 C 265.774 463.384 239.538 456.265 232.482 442.636 C 222.244 422.863 230.396 368.453 230.396 368.446 C 230.393 368.444 208.544 360.250 203.041 354.677 C 196.895 348.452 194.434 330.044 188.285 323.822 C 173.842 309.210 128.853 307.193 114.182 292.810 C 101.123 280.008 71.643 240.502 84.680 227.678 C 94.028 218.483 120.754 240.668 133.716 242.645 C 148.434 244.889 177.473 239.221 191.924 242.799 C 206.625 246.438 244.346 270.326 244.351 270.329 C 244.353 270.327 260.367 255.535 260.368 255.534 C 260.768 254.566 247.947 178.184 234.340 155.526 C 207.832 111.389 154.401 97.191 90.637 124.348 C 38.925 146.372 7.643 207.918 7.635 207.926 C 7.642 207.911 14.423 100.928 81.412 60.511 C 160.107 13.032 225.295 35.772 278.261 81.193 M 416.976 353.040 C 427.272 344.265 451.500 345.856 468.762 342.264 M 383.032 481.839 C 377.720 448.190 391.049 375.137 416.976 353.040 M 397.793 510.412 C 397.831 502.186 384.315 489.964 383.032 481.839 M 383.487 537.765 C 401.069 545.353 397.757 518.306 397.793 510.412 M 387.519 511.526 C 403.604 516.811 368.368 531.239 383.487 537.765 M 377.177 537.748 C 382.071 532.454 370.438 505.913 387.519 511.526 M 362.319 545.698 C 365.081 542.389 374.252 540.913 377.177 537.748 M 358.965 554.820 C 361.446 554.969 360.726 547.607 362.319 545.698 M 356.613 545.683 C 358.051 547.621 356.556 554.676 358.965 554.820 M 341.797 537.655 C 344.705 540.835 354.044 542.222 356.613 545.683 M 331.595 511.378 C 348.704 505.855 336.931 532.334 341.797 537.655 M 335.487 537.638 C 350.641 531.192 315.481 516.578 331.595 511.378 M 321.326 510.209 C 321.321 518.104 317.866 545.133 335.487 537.638 M 336.238 481.715 C 334.913 489.833 321.331 501.984 321.326 510.209 M 302.977 352.739 C 328.608 375.179 341.729 448.094 336.238 481.715 M 249.134 340.641 C 249.139 340.643 292.357 343.441 302.977 352.739 M 311.704 264.800 C 335.788 260.706 350.515 242.070 350.519 242.068 M 260.526 255.643 C 260.531 255.643 285.274 269.294 311.704 264.800 M 266.863 389.085 C 276.360 397.952 307.910 402.889 307.914 402.890 C 307.913 402.886 303.733 369.010 295.468 361.770 C 287.022 354.370 252.121 354.807 252.117 354.807 C 252.119 354.810 258.681 381.445 266.863 389.085 M 408.714 265.057 C 387.597 259.806 370.423 242.523 370.419 242.520 M 459.941 256.170 C 459.935 256.171 432.899 271.071 408.714 265.057 M 452.896 389.578 C 443.353 398.394 411.778 403.164 411.774 403.165 C 411.775 403.161 416.133 369.308 424.437 362.111 C 432.922 354.756 467.819 355.378 467.824 355.378 C 467.822 355.381 461.119 381.981 452.896 389.578 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.912 514.723 C 301.912 514.723 308.556 518.320 309.885 520.451 C 313.762 526.661 308.862 542.420 312.093 548.989 C 315.377 555.667 326.831 565.649 333.726 568.449 C 339.953 570.977 353.253 569.650 359.973 569.660 C 366.402 569.669 379.115 570.968 385.085 568.585 C 391.997 565.826 403.501 555.901 406.821 549.240 C 410.087 542.688 405.270 526.903 409.179 520.713 C 410.520 518.590 417.183 515.028 417.183 515.028 M 100.028 245.979 C 100.156 245.069 116.797 259.016 123.394 262.020 C 140.798 269.944 180.986 266.867 196.395 278.192 C 214.192 291.271 238.420 353.622 238.424 353.629 M 597.036 263.273 C 603.518 260.311 613.148 245.091 619.905 247.355 M 523.951 279.059 C 539.420 267.815 579.644 271.223 597.036 263.273 M 481.523 354.273 C 481.527 354.265 506.085 292.044 523.951 279.059 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 466.615 224.698 C 466.610 224.699 439.573 239.599 415.389 233.585 C 394.271 228.334 377.097 211.050 377.094 211.048 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 474.587 192.541 C 474.582 192.541 447.926 202.738 425.946 194.880 C 405.955 187.733 390.443 170.013 390.439 170.010 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 481.782 166.966 C 481.778 166.965 458.218 168.536 440.265 158.710 C 421.523 148.453 408.539 128.771 408.536 128.768 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 495.499 146.073 C 495.496 146.071 475.594 135.565 462.694 120.276 C 449.639 104.804 438.902 86.476 438.899 86.473 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 515.753 125.923 C 515.751 125.919 504.028 108.477 495.906 91.038 C 487.833 73.706 478.212 56.240 478.210 56.237 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 544.344 114.719 C 544.343 114.715 537.957 95.032 533.404 75.562 C 528.965 56.581 521.072 37.720 521.070 37.716 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 570.243 111.458 C 570.243 111.454 575.479 91.933 574.513 73.785 C 573.500 54.749 566.061 36.946 566.061 36.942 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 597.061 114.728 C 597.063 114.725 607.056 100.668 612.401 86.001 C 618.580 69.047 615.627 49.299 615.628 49.296 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 622.392 121.183 C 622.394 121.181 635.233 111.481 643.157 99.446 C 651.391 86.942 651.766 70.116 651.767 70.113 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 643.697 131.497 C 643.699 131.495 657.688 126.904 667.560 118.356 C 675.273 111.676 678.364 100.543 678.365 100.541 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 666.006 148.061 C 666.008 148.060 675.812 148.243 683.217 144.154 C 691.536 139.559 695.149 128.852 695.150 128.851 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 683.591 167.084 C 683.592 167.083 689.285 166.265 694.214 164.479 C 699.701 162.489 704.223 158.009 704.224 158.008 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 697.852 185.852 C 697.852 185.852 701.645 186.389 704.820 185.322 C 707.682 184.361 709.611 181.444 709.612 181.444 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 254.852 224.137 C 254.858 224.138 281.814 239.181 306.031 233.295 C 327.176 228.156 344.441 210.964 344.445 210.961 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 247.051 191.938 C 247.055 191.939 273.658 202.276 295.679 194.535 C 315.707 187.494 331.313 169.856 331.317 169.854 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 239.991 166.326 C 239.995 166.325 263.546 168.021 281.551 158.290 C 300.347 148.133 313.435 128.519 313.439 128.516 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 226.385 145.361 C 226.388 145.358 246.345 134.958 259.326 119.738 C 272.463 104.335 283.297 86.064 283.299 86.061 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 206.238 125.103 C 206.240 125.099 218.054 107.720 226.269 90.324 C 234.434 73.035 244.148 55.621 244.149 55.617 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 177.707 113.748 C 177.708 113.744 184.198 94.095 188.854 74.650 C 193.393 55.692 201.386 36.874 201.388 36.870 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 151.825 110.351 C 151.825 110.347 146.692 90.798 147.754 72.655 C 148.868 53.625 156.401 35.861 156.402 35.858 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 124.990 113.479 C 124.988 113.476 115.070 99.365 109.802 84.671 C 103.714 67.684 106.771 47.953 106.770 47.949 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 99.625 119.799 C 99.623 119.797 86.836 110.029 78.975 97.953 C 70.808 85.406 70.522 68.577 70.521 68.574 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 78.266 130.000 C 78.264 129.999 64.299 125.333 54.473 116.733 C 46.795 110.013 43.763 98.863 43.762 98.861 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 55.869 146.446 C 55.868 146.445 46.063 146.577 38.680 142.448 C 30.385 137.809 26.829 127.083 26.828 127.082 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 38.184 165.375 C 38.183 165.375 32.495 164.527 27.576 162.714 C 22.098 160.696 17.600 156.192 17.599 156.191 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 23.825 184.067 C 23.824 184.067 20.029 184.585 16.859 183.501 C 14.002 182.525 12.088 179.598 12.088 179.598 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 266.863 389.085 C 276.360 397.952 307.910 402.889 307.914 402.890 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 307.914 402.890 C 307.913 402.886 303.733 369.010 295.468 361.770 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 295.468 361.770 C 287.022 354.370 252.121 354.807 252.117 354.807 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 252.117 354.807 C 252.119 354.810 258.681 381.445 266.863 389.085 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 452.896 389.578 C 443.353 398.394 411.778 403.164 411.774 403.165 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.774 403.165 C 411.775 403.161 416.133 369.308 424.437 362.111 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 424.437 362.111 C 432.922 354.756 467.819 355.378 467.824 355.378 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 467.824 355.378 C 467.822 355.381 461.119 381.981 452.896 389.578 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 266.863 389.085 C 276.360 397.952 307.910 402.889 307.914 402.890 C 307.913 402.886 303.733 369.010 295.468 361.770 C 287.022 354.370 252.121 354.807 252.117 354.807 C 252.119 354.810 258.681 381.445 266.863 389.085 M 452.896 389.578 C 443.353 398.394 411.778 403.164 411.774 403.165 C 411.775 403.161 416.133 369.308 424.437 362.111 C 432.922 354.756 467.819 355.378 467.824 355.378 C 467.822 355.381 461.119 381.981 452.896 389.578 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 334.168 510.743 C 337.782 510.587 340.525 513.255 340.893 517.957 C 341.222 522.160 341.141 527.432 338.776 527.826 C 335.648 528.348 336.882 523.079 328.671 517.321 C 325.740 515.266 331.026 510.878 334.168 510.743 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 385.188 510.878 C 381.574 510.703 378.816 513.356 378.424 518.057 C 378.073 522.257 378.126 527.530 380.489 527.937 C 383.614 528.475 382.408 523.199 390.649 517.485 C 393.591 515.445 388.328 511.030 385.188 510.878 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 260.366 255.501 C 261.522 256.604 285.886 269.341 311.701 264.767 C 335.757 260.505 350.512 242.037 350.516 242.034 C 349.650 240.082 330.620 126.073 278.259 81.160 C 225.298 35.732 160.104 12.999 81.409 60.478 C 14.421 100.895 7.640 207.878 7.632 207.893 C 7.641 207.885 38.923 146.338 90.635 124.315 C 154.398 97.158 207.830 111.356 234.337 155.493 C 247.945 178.151 260.766 254.532 260.366 255.501 M 408.712 265.024 C 432.637 271.464 459.933 258.126 460.096 256.029 C 460.098 256.020 472.995 178.746 486.734 156.161 C 513.492 112.176 566.980 98.250 630.599 125.744 C 682.194 148.041 713.150 209.752 713.158 209.760 C 713.151 209.746 706.936 102.728 640.162 61.957 C 561.720 14.062 496.374 36.411 443.207 81.596 C 390.371 126.500 369.976 242.079 369.969 242.095 C 369.427 243.483 387.423 259.294 408.712 265.024 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"6\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 260.366 255.501 C 261.522 256.604 285.886 269.341 311.701 264.767 C 335.757 260.505 350.512 242.037 350.516 242.034 C 349.650 240.082 330.620 126.073 278.259 81.160 C 225.298 35.732 160.104 12.999 81.409 60.478 C 14.421 100.895 7.640 207.878 7.632 207.893 C 7.641 207.885 38.923 146.338 90.635 124.315 C 154.398 97.158 207.830 111.356 234.337 155.493 C 247.945 178.151 260.766 254.532 260.366 255.501 M 408.712 265.024 C 432.637 271.464 459.933 258.126 460.096 256.029 C 460.098 256.020 472.995 178.746 486.734 156.161 C 513.492 112.176 566.980 98.250 630.599 125.744 C 682.194 148.041 713.150 209.752 713.158 209.760 C 713.151 209.746 706.936 102.728 640.162 61.957 C 561.720 14.062 496.374 36.411 443.207 81.596 C 390.371 126.500 369.976 242.079 369.969 242.095 C 369.427 243.483 387.423 259.294 408.712 265.024 M 16.856 183.468 C 14.000 182.491 12.086 179.565 12.085 179.564 M 23.822 184.034 C 23.822 184.034 20.026 184.552 16.856 183.468 M 27.573 162.682 C 22.096 160.663 17.598 156.158 17.597 156.158 M 38.182 165.342 C 38.181 165.342 32.492 164.494 27.573 162.682 M 38.677 142.414 C 30.383 137.776 26.827 127.050 26.825 127.049 M 55.867 146.413 C 55.865 146.413 46.061 146.543 38.677 142.414 M 54.471 116.700 C 46.793 109.980 43.761 98.830 43.760 98.828 M 78.264 129.967 C 78.262 129.966 64.297 125.301 54.471 116.700 M 78.973 97.919 C 70.806 85.372 70.520 68.544 70.519 68.541 M 99.623 119.766 C 99.621 119.764 86.834 109.996 78.973 97.919 M 109.800 84.638 C 103.711 67.652 106.768 47.920 106.768 47.916 M 124.987 113.446 C 124.986 113.443 115.067 99.332 109.800 84.638 M 147.752 72.622 C 148.866 53.592 156.399 35.828 156.400 35.825 M 151.823 110.318 C 151.822 110.314 146.690 90.765 147.752 72.622 M 188.852 74.617 C 193.391 55.659 201.384 36.841 201.385 36.837 M 177.704 113.715 C 177.705 113.711 184.195 94.062 188.852 74.617 M 226.267 90.291 C 234.431 73.002 244.145 55.588 244.147 55.584 M 206.235 125.070 C 206.238 125.066 218.052 107.687 226.267 90.291 M 259.324 119.704 C 272.460 104.302 283.294 86.032 283.297 86.028 M 226.383 145.327 C 226.386 145.325 246.343 134.925 259.324 119.704 M 281.549 158.257 C 300.345 148.099 313.433 128.486 313.436 128.483 M 239.988 166.292 C 239.993 166.292 263.544 167.988 281.549 158.257 M 295.676 194.502 C 315.704 187.461 331.311 169.823 331.314 169.820 M 247.048 191.905 C 247.053 191.906 273.655 202.243 295.676 194.502 M 306.028 233.262 C 327.173 228.123 344.438 210.930 344.442 210.928 M 254.850 224.104 C 254.855 224.105 281.812 239.148 306.028 233.262 M 704.818 185.289 C 707.679 184.328 709.609 181.411 709.609 181.411 M 697.849 185.819 C 697.850 185.819 701.642 186.356 704.818 185.289 M 694.211 164.445 C 699.699 162.456 704.221 157.976 704.222 157.975 M 683.589 167.050 C 683.590 167.050 689.282 166.232 694.211 164.445 M 683.215 144.120 C 691.534 139.526 695.147 128.819 695.148 128.818 M 666.004 148.028 C 666.006 148.028 675.809 148.210 683.215 144.120 M 667.557 118.323 C 675.271 111.643 678.362 100.510 678.363 100.508 M 643.694 131.464 C 643.697 131.462 657.686 126.871 667.557 118.323 M 643.155 99.413 C 651.388 86.909 651.764 70.083 651.765 70.080 M 622.390 121.150 C 622.392 121.148 635.230 111.448 643.155 99.413 M 612.399 85.968 C 618.578 69.014 615.625 49.267 615.625 49.263 M 597.059 114.695 C 597.060 114.692 607.054 100.635 612.399 85.968 M 574.511 73.752 C 573.498 54.716 566.059 36.913 566.058 36.909 M 570.240 111.425 C 570.241 111.422 575.477 91.900 574.511 73.752 M 533.401 75.529 C 528.962 56.548 521.069 37.687 521.068 37.683 M 544.341 114.686 C 544.340 114.682 537.954 94.998 533.401 75.529 M 495.903 91.004 C 487.831 73.673 478.209 56.207 478.208 56.204 M 515.750 125.890 C 515.748 125.886 504.026 108.444 495.903 91.004 M 462.691 120.243 C 449.637 104.770 438.899 86.444 438.897 86.440 M 495.497 146.040 C 495.493 146.037 475.592 135.532 462.691 120.243 M 440.262 158.677 C 421.521 148.420 408.537 128.738 408.534 128.735 M 481.780 166.933 C 481.775 166.932 458.216 168.503 440.262 158.677 M 425.943 194.846 C 405.953 187.700 390.440 169.979 390.437 169.977 M 474.584 192.508 C 474.580 192.508 447.923 202.704 425.943 194.846 M 415.386 233.552 C 394.269 228.301 377.095 211.017 377.091 211.015 M 466.612 224.665 C 466.607 224.665 439.571 239.566 415.386 233.552 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 583.268 286.755 C 567.752 296.297 533.465 297.678 524.819 303.194 C 515.284 309.278 481.527 354.268 481.523 354.273 C 481.527 354.265 506.085 292.044 523.951 279.059 C 539.420 267.815 579.644 271.223 597.036 263.273 C 603.518 260.311 613.148 245.091 619.905 247.355 C 620.225 247.462 597.017 278.301 583.268 286.755 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 194.817 302.321 C 186.216 296.735 151.921 295.196 136.456 285.573 C 122.752 277.045 99.708 246.084 100.028 245.979 C 100.156 245.069 116.797 259.016 123.394 262.020 C 140.798 269.944 180.986 266.867 196.395 278.192 C 214.192 291.271 238.420 353.622 238.424 353.629 C 237.381 353.623 204.261 308.454 194.817 302.321 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":309.133,\\\"max\\\":411.074},\\\"y\\\":{\\\"min\\\":254.299,\\\"max\\\":356.24}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":359.05,\\\"y\\\":703.201,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.002667230779173959,\\\"y\\\":-0.9999964429336591}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.272,\\\"y\\\":241.686,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.0026660647306193668,\\\"y\\\":-0.9999964460431107}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":291.947,\\\"y\\\":536.103,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.700571258863464,\\\"y\\\":0.7135824488133529}},{\\\"point\\\":{\\\"x\\\":424.859,\\\"y\\\":536.428,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7110256769463813,\\\"y\\\":0.7031660449160925}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":226.479,\\\"y\\\":417.152,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999969743787684,\\\"y\\\":0.002459925468096517}},{\\\"point\\\":{\\\"x\\\":493.135,\\\"y\\\":417.858,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999705212783907,\\\"y\\\":0.007678318450252198}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":128.753,\\\"y\\\":42.854,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6797889561889565,\\\"y\\\":-0.7334077822354553}},{\\\"point\\\":{\\\"x\\\":593.631,\\\"y\\\":44.005,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6335240945223662,\\\"y\\\":-0.7737229618278212}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.157,\\\"y\\\":662.924,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.002624211226579388,\\\"y\\\":0.9999965567517911}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"goat_hind\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":327.1,\\\"max\\\":705.4472723262684},\\\"y\\\":{\\\"min\\\":219.848,\\\"max\\\":615.8052909309959}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goat_hind\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goat_hind\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 329.100 417.097 C 329.101 431.107 329.101 445.209 329.115 459.751 C 329.687 459.690 330.785 459.543 331.882 459.383 C 366.083 454.405 411.890 439.363 411.898 439.361 C 411.897 439.359 405.339 427.830 403.543 422.630 C 401.426 416.502 399.213 401.027 399.213 401.025 C 399.214 401.027 401.903 415.732 404.078 421.543 C 406.183 427.167 413.277 439.286 413.554 439.623 C 432.541 462.737 478.444 469.905 478.450 469.908 C 478.447 469.911 442.549 496.073 442.546 496.076 C 442.544 496.077 430.810 497.813 426.533 508.846 C 424.547 513.970 431.910 525.758 431.295 528.726 C 429.646 536.676 419.424 558.239 426.028 565.735 C 443.302 585.345 443.904 611.074 444.850 610.292 C 451.046 605.176 456.382 587.946 456.383 587.943 C 456.384 587.946 457.455 616.435 459.769 613.608 C 485.457 582.223 467.551 548.213 467.552 548.206 C 467.550 548.205 444.266 558.257 446.143 539.777 C 447.751 523.948 457.998 534.860 459.769 511.444 C 460.018 508.154 473.170 509.070 471.068 523.847 C 468.970 538.587 485.232 541.139 485.234 541.141 C 485.233 541.139 476.001 528.721 481.524 522.649 C 487.006 516.623 492.488 500.329 486.021 492.622 C 483.587 489.721 525.294 478.518 525.298 478.517 C 525.300 478.517 538.164 486.362 549.836 476.833 C 556.451 471.432 554.820 456.426 554.820 456.424 C 554.816 456.424 526.898 464.262 516.874 466.055 C 507.347 467.759 479.878 469.993 479.874 469.993 C 479.878 469.993 507.524 467.539 517.081 465.636 C 527.203 463.620 551.688 456.037 555.244 454.766 C 559.630 453.197 592.671 441.942 600.094 435.156 C 605.745 429.991 603.962 447.864 597.346 521.591 C 595.151 546.049 611.509 533.362 622.585 550.734 C 627.497 558.438 632.349 571.887 638.021 572.942 C 654.270 575.965 687.436 593.612 688.280 592.129 C 688.667 591.448 676.383 570.499 676.382 570.497 C 676.385 570.498 704.405 590.573 703.422 586.720 C 691.917 541.636 670.978 532.646 670.974 532.641 C 670.971 532.642 649.114 548.544 640.255 544.397 C 625.669 537.570 641.900 525.773 626.840 510.221 C 623.926 507.211 633.156 495.979 643.888 507.485 C 651.564 515.713 666.646 502.356 666.648 502.356 C 666.646 502.355 655.302 507.330 644.759 492.442 C 639.805 485.447 630.509 480.980 622.879 479.290 C 618.178 478.249 625.257 432.720 625.257 432.716 C 625.258 432.713 647.312 417.168 631.602 404.436 C 611.976 388.531 599.389 412.974 598.407 413.302 C 579.418 419.655 537.796 420.808 537.938 415.828 C 540.166 337.594 504.434 286.177 504.430 286.164 C 504.438 286.165 545.598 313.646 578.012 291.990 C 614.582 267.557 596.667 221.855 596.669 221.848 C 596.664 221.852 578.384 247.154 550.136 258.358 C 523.008 269.117 504.392 266.219 466.334 268.429 C 426.707 270.729 398.204 318.405 329.190 320.648 C 329.162 346.721 329.143 381.346 329.100 417.097 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 436.503 576.691 C 436.504 576.690 446.172 574.284 451.014 569.239 C 455.742 564.313 457.288 552.769 457.289 552.767 M 329.100 417.097 C 361.870 413.480 398.615 399.405 398.622 399.403 M 492.699 433.377 C 539.803 447.035 587.102 427.723 592.860 424.665 M 513.422 377.563 C 513.174 418.367 491.504 433.030 492.699 433.377 M 491.755 299.069 C 491.757 299.077 513.644 341.124 513.422 377.563 M 566.709 275.490 C 595.552 257.999 596.656 226.024 596.659 226.019 M 503.036 284.291 C 503.042 284.290 543.666 289.464 566.709 275.490 M 661.619 563.748 C 661.487 554.956 654.168 544.533 654.167 544.531 M 657.305 577.083 C 657.305 577.082 661.708 569.727 661.619 563.748 M 329.100 417.097 C 329.101 431.107 329.101 445.209 329.115 459.751 C 329.687 459.690 330.785 459.543 331.882 459.383 C 366.083 454.405 411.890 439.363 411.898 439.361 C 411.897 439.359 405.339 427.830 403.543 422.630 C 401.426 416.502 399.213 401.027 399.213 401.025 C 399.214 401.027 401.903 415.732 404.078 421.543 C 406.183 427.167 413.277 439.286 413.554 439.623 C 432.541 462.737 478.444 469.905 478.450 469.908 C 478.447 469.911 442.549 496.073 442.546 496.076 C 442.544 496.077 430.810 497.813 426.533 508.846 C 424.547 513.970 431.910 525.758 431.295 528.726 C 429.646 536.676 419.424 558.239 426.028 565.735 C 443.302 585.345 443.904 611.074 444.850 610.292 C 451.046 605.176 456.382 587.946 456.383 587.943 C 456.384 587.946 457.455 616.435 459.769 613.608 C 485.457 582.223 467.551 548.213 467.552 548.206 C 467.550 548.205 444.266 558.257 446.143 539.777 C 447.751 523.948 457.998 534.860 459.769 511.444 C 460.018 508.154 473.170 509.070 471.068 523.847 C 468.970 538.587 485.232 541.139 485.234 541.141 C 485.233 541.139 476.001 528.721 481.524 522.649 C 487.006 516.623 492.488 500.329 486.021 492.622 C 483.587 489.721 525.294 478.518 525.298 478.517 C 525.300 478.517 538.164 486.362 549.836 476.833 C 556.451 471.432 554.820 456.426 554.820 456.424 C 554.816 456.424 526.898 464.262 516.874 466.055 C 507.347 467.759 479.878 469.993 479.874 469.993 C 479.878 469.993 507.524 467.539 517.081 465.636 C 527.203 463.620 551.688 456.037 555.244 454.766 C 559.630 453.197 592.671 441.942 600.094 435.156 C 605.745 429.991 603.962 447.864 597.346 521.591 C 595.151 546.049 611.509 533.362 622.585 550.734 C 627.497 558.438 632.349 571.887 638.021 572.942 C 654.270 575.965 687.436 593.612 688.280 592.129 C 688.667 591.448 676.383 570.499 676.382 570.497 C 676.385 570.498 704.405 590.573 703.422 586.720 C 691.917 541.636 670.978 532.646 670.974 532.641 C 670.971 532.642 649.114 548.544 640.255 544.397 C 625.669 537.570 641.900 525.773 626.840 510.221 C 623.926 507.211 633.156 495.979 643.888 507.485 C 651.564 515.713 666.646 502.356 666.648 502.356 C 666.646 502.355 655.302 507.330 644.759 492.442 C 639.805 485.447 630.509 480.980 622.879 479.290 C 618.178 478.249 625.257 432.720 625.257 432.716 C 625.258 432.713 647.312 417.168 631.602 404.436 C 611.976 388.531 599.389 412.974 598.407 413.302 C 579.418 419.655 537.796 420.808 537.938 415.828 C 540.166 337.594 504.434 286.177 504.430 286.164 C 504.438 286.165 545.598 313.646 578.012 291.990 C 614.582 267.557 596.667 221.855 596.669 221.848 C 596.664 221.852 578.384 247.154 550.136 258.358 C 523.008 269.117 504.392 266.219 466.334 268.429 C 426.707 270.729 398.204 318.405 329.190 320.648 C 329.162 346.721 329.143 381.346 329.100 417.097 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 329.190 320.648 C 329.162 346.721 329.143 381.346 329.100 417.097 C 329.101 431.107 329.101 445.209 329.115 459.751 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":328.826,\\\"y\\\":391.476,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":329.312,\\\"y\\\":391.301,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"goat_horn\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":193.574,\\\"max\\\":571.994},\\\"y\\\":{\\\"min\\\":23.944,\\\"max\\\":700.1946353240007}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goat_horn\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goat_horn\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 252.376 221.785 C 252.372 221.794 207.722 319.241 207.718 319.251 C 207.716 319.264 195.575 428.225 195.574 428.237 C 195.576 428.253 216.175 560.677 216.177 560.690 C 216.188 560.715 271.887 687.743 271.892 687.753 C 271.902 687.755 319.760 702.030 375.180 697.195 C 455.663 690.173 492.194 657.847 492.205 657.843 C 492.199 657.835 431.916 588.464 417.005 563.792 C 409.232 550.931 375.545 477.694 369.698 453.680 C 365.553 436.659 358.437 390.074 358.557 359.092 C 358.659 332.680 362.902 303.095 370.147 272.728 C 377.334 242.607 385.629 216.049 395.208 193.955 C 406.679 167.499 423.514 138.527 436.148 121.012 C 448.453 103.953 471.073 84.436 481.946 76.009 C 518.330 47.810 569.990 25.953 569.994 25.944 C 569.989 25.949 456.700 51.908 456.679 51.913 C 456.671 51.917 381.387 89.082 381.378 89.087 C 381.371 89.093 309.070 148.344 309.061 148.351 C 309.055 148.358 252.381 221.778 252.376 221.785 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 456.679 51.913 C 456.680 51.915 454.943 61.463 462.011 68.928 C 470.396 77.785 481.944 76.008 481.946 76.009 C 518.330 47.810 569.990 25.953 569.994 25.944 C 569.989 25.949 456.700 51.908 456.679 51.913 C 456.671 51.917 381.387 89.082 381.378 89.087 C 381.380 89.089 391.264 107.724 403.895 115.739 C 418.074 124.735 436.144 121.012 436.148 121.012 C 448.453 103.953 471.073 84.436 481.946 76.009 M 309.061 148.351 C 309.065 148.354 321.428 169.361 348.372 183.163 C 373.035 195.795 395.204 193.953 395.208 193.955 C 406.679 167.499 423.514 138.527 436.148 121.012 M 216.177 560.690 C 216.188 560.692 261.121 583.956 325.456 583.318 C 382.210 582.755 416.996 563.794 417.005 563.792 C 409.232 550.931 375.545 477.694 369.698 453.680 C 369.690 453.681 336.584 469.493 289.076 464.261 C 231.654 457.938 195.583 428.240 195.574 428.237 C 195.576 428.253 216.175 560.677 216.177 560.690 C 216.188 560.715 271.887 687.743 271.892 687.753 C 271.902 687.755 319.760 702.030 375.180 697.195 C 455.663 690.173 492.194 657.847 492.205 657.843 C 492.199 657.835 431.916 588.464 417.005 563.792 M 207.718 319.251 C 207.725 319.255 235.396 351.365 285.502 362.790 C 326.619 372.165 358.550 359.093 358.557 359.092 C 358.659 332.680 362.902 303.095 370.147 272.728 C 370.141 272.727 342.220 273.965 309.046 260.039 C 272.700 244.780 252.382 221.789 252.376 221.785 C 252.381 221.778 309.055 148.358 309.061 148.351 C 309.070 148.344 381.371 89.093 381.378 89.087 M 370.147 272.728 C 377.334 242.607 385.629 216.049 395.208 193.955 M 369.698 453.680 C 365.553 436.659 358.437 390.074 358.557 359.092 M 207.718 319.251 C 207.716 319.264 195.575 428.225 195.574 428.237 M 252.376 221.785 C 252.372 221.794 207.722 319.241 207.718 319.251 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":365.465,\\\"y\\\":656.786,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.2978859905544768,\\\"y\\\":-0.9546014543417469}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":202.64,\\\"y\\\":379.771,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6961066963642558,\\\"y\\\":-0.7179383450386543}},{\\\"point\\\":{\\\"x\\\":364.875,\\\"y\\\":405.746,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8876480164494008,\\\"y\\\":-0.46052252810632865}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":387.291,\\\"y\\\":690.646,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.40035993775899475,\\\"y\\\":0.9163579651193162}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"goddess\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":233.904,\\\"max\\\":486.096},\\\"y\\\":{\\\"min\\\":11.855163037794128,\\\"max\\\":675.9580914866756}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goddess\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"goddess_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"0\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.974 98.943 C 343.640 98.933 334.071 111.922 333.561 124.555 C 332.995 138.551 342.472 144.795 350.168 154.715 C 353.315 158.772 355.826 168.448 350.192 171.168 C 341.877 175.183 331.698 171.298 321.717 170.275 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"0\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.974 98.943 C 343.640 98.933 334.071 111.922 333.561 124.555 C 332.995 138.551 342.472 144.795 350.168 154.715 C 353.315 158.772 355.826 168.448 350.192 171.168 C 341.877 175.183 331.698 171.298 321.717 170.275 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6A2EAF2B-3056-4613-87E1-068EB00F7051_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 335.028 245.057 C 325.596 245.052 317.992 237.438 317.997 228.006 C 318.003 218.575 325.616 210.970 335.048 210.976 C 344.480 210.982 352.084 218.595 352.078 228.026 C 352.073 237.458 344.460 245.062 335.028 245.057 M 384.627 245.086 C 394.058 245.092 401.672 237.488 401.677 228.056 C 401.683 218.625 394.079 211.011 384.647 211.005 C 375.215 211.000 367.602 218.604 367.597 228.036 C 367.591 237.468 375.195 245.081 384.627 245.086 M 350.192 171.168 C 341.877 175.183 331.647 171.711 321.717 170.275 C 301.455 167.345 276.419 141.690 267.786 114.463 C 255.829 76.754 277.269 37.993 314.501 32.105 C 320.474 31.160 328.365 31.729 327.466 28.266 C 327.120 26.934 317.974 28.966 318.366 26.517 C 318.674 24.596 328.483 23.831 328.773 21.842 C 329.107 19.554 318.760 24.663 315.898 20.604 C 318.861 18.283 325.283 16.862 325.695 16.064 C 328.113 11.381 304.893 15.292 297.952 17.310 C 244.098 32.965 235.904 82.305 235.904 100.040 C 235.904 162.088 297.503 197.732 305.694 249.056 C 315.030 307.557 272.211 285.620 268.338 373.307 C 265.833 430.015 316.483 612.208 331.673 653.705 C 333.997 660.053 338.585 673.479 340.030 673.904 C 341.526 674.345 341.484 670.808 343.004 671.442 C 344.398 672.023 345.847 674.107 346.564 673.908 C 347.969 673.518 348.801 670.231 349.789 670.446 C 350.916 670.690 352.322 674.010 353.098 673.912 C 354.720 673.708 360.129 673.449 360.130 673.449 C 360.130 673.449 364.805 673.504 366.165 673.920 C 366.860 674.133 368.762 671.540 369.822 671.379 C 370.633 671.256 371.538 673.694 372.699 673.924 C 373.460 674.075 374.681 671.588 376.145 671.003 C 377.888 670.305 377.567 674.350 379.233 673.927 C 380.690 673.558 385.104 660.047 387.493 653.738 C 401.365 617.106 452.803 425.935 451.283 373.416 C 448.801 287.644 402.921 307.177 413.672 249.117 C 422.763 200.023 484.096 162.088 484.096 100.040 C 484.096 82.305 484.096 37.992 422.048 17.310 C 415.400 15.094 392.810 11.930 395.135 16.479 C 395.461 17.116 400.453 18.518 402.780 20.404 C 400.871 22.525 393.124 20.091 392.988 21.855 C 392.651 26.250 400.613 22.233 400.746 26.213 C 400.840 29.021 392.337 27.552 392.538 29.003 C 393.172 33.572 403.129 30.630 407.643 31.469 C 442.731 37.992 464.107 79.672 454.071 109.187 C 443.076 141.525 421.117 165.175 394.039 170.518 C 385.575 172.188 376.741 174.545 369.549 171.180 C 363.883 168.528 366.441 158.781 369.593 154.727 C 377.301 144.815 386.559 138.590 386.236 124.586 C 385.945 111.914 376.309 98.952 359.974 98.943 C 343.640 98.933 334.071 111.922 333.561 124.555 C 332.995 138.551 342.472 144.795 350.168 154.715 C 353.315 158.772 355.826 168.448 350.192 171.168 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.130 673.449 C 360.043 599.150 359.957 524.851 359.870 450.552 M 335.028 245.057 C 325.596 245.052 317.992 237.438 317.997 228.006 C 318.003 218.575 325.616 210.970 335.048 210.976 C 344.480 210.982 352.084 218.595 352.078 228.026 C 352.073 237.458 344.460 245.062 335.028 245.057 M 384.627 245.086 C 394.058 245.092 401.672 237.488 401.677 228.056 C 401.683 218.625 394.079 211.011 384.647 211.005 C 375.215 211.000 367.602 218.604 367.597 228.036 C 367.591 237.468 375.195 245.081 384.627 245.086 M 350.168 154.715 C 353.315 158.772 355.826 168.448 350.192 171.168 C 355.826 168.448 353.315 158.772 350.168 154.715 C 342.472 144.795 332.995 138.551 333.561 124.555 C 334.071 111.922 343.640 98.933 359.974 98.943 C 343.640 98.933 334.071 111.922 333.561 124.555 C 332.995 138.551 342.472 144.795 350.168 154.715 C 353.315 158.772 355.826 168.448 350.192 171.168 C 341.877 175.183 331.698 171.298 321.717 170.275 C 331.647 171.711 341.877 175.183 350.192 171.168 C 341.877 175.183 331.698 171.298 321.717 170.275 C 301.455 167.345 276.419 141.690 267.786 114.463 C 255.829 76.754 277.269 37.993 314.501 32.105 C 320.474 31.160 328.365 31.729 327.466 28.266 C 327.120 26.934 317.974 28.966 318.366 26.517 C 318.674 24.596 328.483 23.831 328.773 21.842 C 329.107 19.554 318.760 24.663 315.898 20.604 C 318.861 18.283 325.283 16.862 325.695 16.064 C 328.113 11.381 304.893 15.292 297.952 17.310 C 244.098 32.965 235.904 82.305 235.904 100.040 C 235.904 162.088 297.503 197.732 305.694 249.056 C 315.030 307.557 272.211 285.620 268.338 373.307 C 265.833 430.015 316.483 612.208 331.673 653.705 C 333.997 660.053 338.585 673.479 340.030 673.904 C 341.526 674.345 341.484 670.808 343.004 671.442 C 344.398 672.023 345.847 674.107 346.564 673.908 C 347.969 673.518 348.801 670.231 349.789 670.446 C 350.916 670.690 352.322 674.010 353.098 673.912 C 354.720 673.708 360.129 673.449 360.130 673.449 C 360.130 673.449 364.805 673.504 366.165 673.920 C 366.860 674.133 368.762 671.540 369.822 671.379 C 370.633 671.256 371.538 673.694 372.699 673.924 C 373.460 674.075 374.681 671.588 376.145 671.003 C 377.888 670.305 377.567 674.350 379.233 673.927 C 380.690 673.558 385.104 660.047 387.493 653.738 C 401.365 617.106 452.803 425.935 451.283 373.416 C 448.801 287.644 402.921 307.177 413.672 249.117 C 422.763 200.023 484.096 162.088 484.096 100.040 C 484.096 82.305 484.096 37.992 422.048 17.310 C 415.400 15.094 392.810 11.930 395.135 16.479 C 395.461 17.116 400.453 18.518 402.780 20.404 C 400.871 22.525 393.124 20.091 392.988 21.855 C 392.651 26.250 400.613 22.233 400.746 26.213 C 400.840 29.021 392.337 27.552 392.538 29.003 C 393.172 33.572 403.129 30.630 407.643 31.469 C 442.731 37.992 464.107 79.672 454.071 109.187 C 443.076 141.525 421.117 165.175 394.039 170.518 C 385.575 172.188 376.741 174.545 369.549 171.180 C 363.883 168.528 366.441 158.781 369.593 154.727 C 377.301 144.815 386.559 138.590 386.236 124.586 C 385.945 111.914 376.309 98.952 359.974 98.943 C 343.640 98.933 334.071 111.922 333.561 124.555 C 332.995 138.551 342.472 144.795 350.168 154.715 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":705.553,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":302.791,\\\"y\\\":251.972,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871421587849,\\\"y\\\":0.0050710469437982835}},{\\\"point\\\":{\\\"x\\\":415.859,\\\"y\\\":251.972,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871421587849,\\\"y\\\":0.0050710469437982835}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":669.656,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":288.388,\\\"max\\\":431.612},\\\"y\\\":{\\\"min\\\":306.648,\\\"max\\\":449.872}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"6A2EAF2B-3056-4613-87E1-068EB00F7051_2\\\",\\\"cx\\\":\\\"49.52%\\\",\\\"cy\\\":\\\"50.93%\\\",\\\"r\\\":\\\"100.99%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"28.63%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":108.39032273780617,\\\"max\\\":649.7220418051177},\\\"y\\\":{\\\"min\\\":15.06228443585303,\\\"max\\\":667.7268482178374}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#AFB1A2DB-6DEB-4733-95CB-27EF552C2187_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 330.775 665.643 C 368.272 666.965 429.519 652.471 452.152 635.137 C 490.759 605.568 531.385 552.528 539.682 537.641 C 546.815 524.843 580.722 452.333 593.638 428.473 C 607.923 402.086 650.409 361.537 647.588 346.589 C 645.487 335.457 617.073 329.003 604.956 334.373 C 586.818 342.410 567.787 363.099 562.899 367.266 C 543.667 383.659 502.684 462.924 488.613 460.263 C 472.376 457.192 463.193 429.194 457.662 413.837 C 453.117 401.219 453.946 315.809 454.566 302.412 C 455.267 287.271 468.550 188.821 469.912 177.368 C 471.093 167.428 486.770 81.150 482.423 68.732 C 481.003 64.675 475.597 42.758 459.397 41.422 C 445.645 40.288 438.008 53.686 435.996 56.351 C 427.693 67.348 417.264 158.702 414.940 168.925 C 412.591 179.261 397.595 274.953 384.927 280.747 C 383.034 281.612 369.468 279.024 367.903 277.652 C 357.648 268.664 358.571 175.108 357.952 164.751 C 357.242 152.860 361.980 48.141 353.975 34.685 C 352.184 31.675 345.255 16.394 330.780 17.085 C 318.099 17.691 310.762 31.767 309.097 34.685 C 301.519 47.970 305.853 150.127 305.177 161.744 C 304.550 172.517 305.936 269.969 295.168 279.199 C 293.309 280.793 277.212 283.445 275.050 282.295 C 264.014 276.421 258.129 189.425 256.485 180.056 C 254.872 170.866 246.901 89.309 239.457 79.564 C 237.317 76.764 227.033 61.281 214.274 64.599 C 202.315 67.709 195.706 89.440 194.577 93.493 C 191.323 105.183 206.846 184.305 207.562 193.510 C 208.480 205.301 218.514 309.284 210.615 322.671 C 209.471 324.610 197.792 334.093 195.562 333.786 C 182.812 332.028 171.305 239.673 169.235 230.102 C 167.505 222.107 159.070 152.714 153.356 142.169 C 151.799 139.294 140.008 127.087 129.202 129.725 C 118.967 132.223 112.099 150.379 111.009 153.847 C 106.846 167.099 125.005 257.790 126.377 268.269 C 129.012 288.385 146.701 462.573 154.341 488.120 C 159.655 505.891 177.554 592.494 220.451 627.399 C 260.329 659.848 303.420 664.679 330.775 665.643 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":200.529,\\\"max\\\":445.312},\\\"y\\\":{\\\"min\\\":336.721,\\\"max\\\":586.252}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":336.997,\\\"y\\\":700.893,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":331.634,\\\"y\\\":15.811,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":147.498,\\\"y\\\":459.933,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9998303427928066,\\\"y\\\":-0.018419707674628798}},{\\\"point\\\":{\\\"x\\\":576.568,\\\"y\\\":459.933,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9998303532256179,\\\"y\\\":-0.018419141368049664}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":224.491,\\\"y\\\":633.439,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7129368852544249,\\\"y\\\":0.7012282065374431}},{\\\"point\\\":{\\\"x\\\":452.69,\\\"y\\\":635.631,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6987313789440864,\\\"y\\\":0.7153841346290086}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":336.892,\\\"y\\\":661.806,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"AFB1A2DB-6DEB-4733-95CB-27EF552C2187_0\\\",\\\"cx\\\":\\\"41.02%\\\",\\\"cy\\\":\\\"64.60%\\\",\\\"r\\\":\\\"142.35%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"13.73%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_2finger\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":194.2003454764455,\\\"max\\\":519.7736657919419},\\\"y\\\":{\\\"min\\\":20.090288048745695,\\\"max\\\":672.1074770805475}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_2finger\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_point\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S25\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 453.394 73.925 C 449.124 22.469 402.171 28.554 394.437 61.101 C 394.158 59.738 393.913 59.451 393.600 57.013 C 387.901 12.725 332.108 5.638 329.455 57.013 C 329.454 57.038 329.138 222.889 329.455 290.659 C 329.455 290.676 336.985 406.524 331.048 465.829 C 327.189 504.380 274.282 526.819 266.846 451.544 C 267.817 483.242 206.052 494.326 205.012 421.348 C 193.990 472.445 175.630 602.097 258.392 648.667 C 356.298 703.759 466.511 649.921 472.320 568.318 C 478.825 476.938 455.834 103.315 453.394 73.925 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S25\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 394.437 61.101 C 394.957 97.641 393.771 240.749 393.600 286.979 M 453.394 73.925 C 449.124 22.469 402.171 28.554 394.437 61.101 C 394.158 59.738 393.913 59.451 393.600 57.013 C 387.901 12.725 332.108 5.638 329.455 57.013 C 329.454 57.038 329.138 222.889 329.455 290.659 C 329.455 290.676 336.985 406.524 331.048 465.829 C 327.189 504.380 274.282 526.819 266.846 451.544 C 267.817 483.242 206.052 494.326 205.012 421.348 C 193.990 472.445 175.630 602.097 258.392 648.667 C 356.298 703.759 466.511 649.921 472.320 568.318 C 478.825 476.938 455.834 103.315 453.394 73.925 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 205.012 421.348 C 206.052 494.326 267.817 483.242 266.846 451.544 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S27\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 202.759 342.217 C 203.016 366.751 204.612 393.288 205.012 421.348 C 206.052 494.326 267.817 483.242 266.846 451.544 C 265.500 407.634 264.185 362.929 264.539 310.419 C 264.794 272.510 202.214 290.204 202.759 342.217 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S31\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 345.008 628.606 C 371.588 668.870 428.162 679.643 480.023 643.886 C 551.529 594.584 498.409 372.742 517.241 248.347 C 502.593 232.655 480.174 239.670 462.923 264.518 C 438.583 299.577 445.099 346.706 445.774 425.926 C 342.915 408.895 289.290 544.204 345.008 628.606 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 331.048 465.829 C 336.985 406.524 329.455 290.676 329.455 290.659 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 264.539 310.419 C 264.185 362.929 265.500 407.634 266.846 451.544 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 266.846 451.544 C 274.282 526.819 327.189 504.380 331.048 465.829 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S26\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 331.048 465.829 C 336.985 406.524 329.455 290.676 329.455 290.659 C 327.821 237.171 265.197 246.102 264.539 310.419 C 264.185 362.929 265.500 407.634 266.846 451.544 C 274.282 526.819 327.189 504.380 331.048 465.829 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":373.901,\\\"y\\\":705.026,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":359.73,\\\"y\\\":15.976,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":177.528,\\\"y\\\":489.707,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875675814167,\\\"y\\\":0.004986449899652173}},{\\\"point\\\":{\\\"x\\\":534.779,\\\"y\\\":489.707,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875675814167,\\\"y\\\":0.004986449899652195}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":374.42,\\\"y\\\":666.384,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"hand_card\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":119.085,\\\"max\\\":486.97339982175345},\\\"y\\\":{\\\"min\\\":17.405,\\\"max\\\":660.9529553872665}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_card\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"card\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 349.893 21.856 C 348.197 19.909 342.461 19.405 342.460 19.405 C 342.439 19.405 130.136 19.405 130.115 19.405 C 130.114 19.405 125.733 19.898 123.875 21.467 C 122.082 22.982 121.085 27.461 121.085 27.461 C 121.085 27.493 121.085 348.614 121.085 348.646 C 121.085 348.647 121.825 352.060 124.771 354.435 C 127.119 356.328 131.241 355.889 131.242 355.889 C 131.264 355.889 351.764 356.447 351.786 356.447 C 351.786 356.415 351.786 28.881 351.786 28.848 C 351.786 28.847 352.397 24.731 349.893 21.856 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_holding\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 481.586 528.847 C 486.701 542.191 493.000 635.387 442.904 655.672 C 405.605 670.774 364.096 629.738 353.493 613.819 C 339.325 592.550 329.258 536.545 322.420 531.384 C 320.113 529.642 293.254 525.677 293.251 525.676 C 293.254 525.677 315.520 527.983 321.787 533.286 C 330.062 540.290 331.982 555.987 331.298 557.382 C 329.276 561.508 300.228 564.186 288.812 557.383 C 266.512 544.094 258.973 518.913 259.642 513.628 C 261.717 497.253 265.730 492.408 278.666 482.556 C 285.217 477.566 331.927 483.824 331.932 483.824 C 331.927 483.824 285.674 477.003 277.398 483.190 C 259.058 496.900 256.702 518.440 264.081 530.115 C 273.411 544.878 237.379 530.175 234.278 511.091 C 228.043 472.727 252.972 437.329 264.081 432.460 C 272.255 428.878 336.364 436.899 336.371 436.899 C 336.364 436.898 274.942 429.739 265.349 431.826 C 256.473 433.758 240.334 461.369 236.814 471.776 C 234.353 479.052 232.558 506.433 229.839 506.018 C 204.398 502.136 207.556 447.909 210.181 437.533 C 215.629 415.996 247.834 392.892 253.935 387.437 C 270.629 372.514 359.823 392.510 359.834 392.510 C 359.823 392.510 281.313 369.936 253.935 387.437 C 250.128 389.871 233.773 391.513 233.771 391.514 C 233.768 391.516 207.446 406.896 200.669 409.631 C 180.951 417.588 152.471 398.733 163.255 389.974 C 184.578 372.656 203.053 355.843 213.351 351.292 C 241.673 338.779 278.523 331.443 295.153 334.805 C 336.982 343.259 409.978 353.034 424.515 368.413 C 440.866 385.713 458.165 467.742 481.586 528.847 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":150.186,\\\"max\\\":321.948},\\\"y\\\":{\\\"min\\\":47.194,\\\"max\\\":324.358}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":455.099,\\\"y\\\":700.077,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.336100184214079,\\\"y\\\":-0.9418262399037639}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":233.68,\\\"y\\\":20.625,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":121.73,\\\"y\\\":195.256,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874248983487,\\\"y\\\":0.005014982070704996}},{\\\"point\\\":{\\\"x\\\":350.972,\\\"y\\\":195.256,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874248983487,\\\"y\\\":0.005014982070704982}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":362.548,\\\"y\\\":624.794,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.712899988476634,\\\"y\\\":0.701265717421018}},{\\\"point\\\":{\\\"x\\\":471.639,\\\"y\\\":624.83,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6987335557481552,\\\"y\\\":0.7153820084902468}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":168.066,\\\"y\\\":401.91,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7800167753493046,\\\"y\\\":0.625758603755212}},{\\\"point\\\":{\\\"x\\\":457.748,\\\"y\\\":460.749,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8780833190833396,\\\"y\\\":-0.47850776874319}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":439.547,\\\"y\\\":653.267,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.336066945032441,\\\"y\\\":0.9418381009794422}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_card_2\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":160.387,\\\"max\\\":482.1444053271335},\\\"y\\\":{\\\"min\\\":15.488,\\\"max\\\":680.3340380063905}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_card_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"finger\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 180.865 359.799 C 193.314 331.589 209.616 312.259 211.303 311.098 C 221.590 304.018 278.344 279.264 299.235 282.013 C 320.616 284.826 360.073 284.883 353.347 296.894 C 342.344 316.540 293.153 310.420 293.147 310.422 C 293.142 310.424 244.451 334.770 244.447 334.772 C 244.443 334.778 227.430 379.695 209.950 396.324 C 185.539 419.548 176.908 368.764 180.865 359.799 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"card\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 380.919 19.830 C 379.299 17.970 373.821 17.489 373.821 17.488 C 373.800 17.488 171.032 17.488 171.012 17.488 C 171.011 17.489 166.826 17.959 165.052 19.459 C 163.339 20.906 162.388 25.183 162.387 25.183 C 162.387 25.214 162.387 331.913 162.387 331.944 C 162.388 331.945 163.094 335.205 165.908 337.473 C 168.150 339.280 172.087 338.861 172.088 338.862 C 172.108 338.862 372.696 339.374 372.716 339.374 C 372.717 339.373 377.370 339.414 380.276 337.352 C 383.384 335.146 383.136 328.023 383.136 328.022 C 383.136 327.992 382.728 26.538 382.728 26.508 C 382.728 26.507 383.311 22.576 380.919 19.830 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_holding\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 417.303 521.177 C 382.694 489.263 289.227 393.201 293.027 332.857 C 293.479 325.676 285.593 328.028 285.592 328.027 C 285.594 328.027 298.124 329.633 299.928 329.687 C 305.003 329.837 319.896 318.754 317.787 312.542 C 315.543 305.934 298.221 308.685 291.545 310.360 C 252.610 320.125 205.320 355.192 195.967 392.621 C 191.615 410.034 339.528 605.062 365.984 620.052 C 408.598 644.197 424.605 527.910 417.303 521.177 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.385 666.262 C 302.250 616.649 225.742 566.248 213.736 544.349 C 203.552 525.773 171.871 380.274 175.704 370.632 C 178.120 364.555 256.919 304.737 264.521 302.267 C 271.490 300.002 363.164 296.189 367.259 304.476 C 369.309 308.625 363.858 322.912 346.109 333.001 C 340.759 336.042 290.121 342.235 281.495 343.525 C 273.636 344.701 227.628 378.464 227.623 378.468 C 227.633 378.465 292.440 346.195 335.320 354.408 C 342.410 355.766 407.008 355.541 409.446 364.839 C 411.465 372.539 404.181 388.039 386.700 393.143 C 375.524 396.406 308.886 391.654 298.594 395.534 C 296.138 396.460 281.462 407.736 281.460 407.738 C 281.466 407.739 336.517 421.488 339.997 422.485 C 364.826 429.598 376.744 468.997 376.748 469.001 C 376.757 469.011 448.759 490.179 473.447 569.036 C 482.447 597.786 487.445 643.534 454.280 666.841 C 422.200 689.385 367.108 672.968 359.385 666.262 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 227.623 378.468 C 206.178 396.640 214.368 432.333 209.059 476.272 M 251.968 403.596 C 238.362 409.512 215.483 506.186 215.479 506.196 M 281.460 407.738 C 281.457 407.737 261.351 399.516 251.968 403.596 M 313.034 501.562 C 371.833 482.169 431.738 547.756 431.750 547.760 M 282.673 476.775 C 282.676 476.777 311.496 502.070 313.034 501.562 M 287.584 448.106 C 285.109 447.647 282.674 476.772 282.673 476.775 M 323.436 452.500 C 319.766 451.381 291.918 448.910 287.584 448.106 M 345.258 466.898 C 344.202 465.818 329.615 454.384 323.436 452.500 M 376.748 469.001 C 365.600 477.508 347.553 469.244 345.258 466.898 M 454.280 666.841 C 422.200 689.385 367.108 672.968 359.385 666.262 C 302.250 616.649 225.742 566.248 213.736 544.349 C 203.552 525.773 171.871 380.274 175.704 370.632 C 178.120 364.555 256.919 304.737 264.521 302.267 C 271.490 300.002 363.164 296.189 367.259 304.476 C 369.309 308.625 363.858 322.912 346.109 333.001 C 340.759 336.042 290.121 342.235 281.495 343.525 C 273.636 344.701 227.628 378.464 227.623 378.468 C 227.633 378.465 292.440 346.195 335.320 354.408 C 342.410 355.766 407.008 355.541 409.446 364.839 C 411.465 372.539 404.181 388.039 386.700 393.143 C 375.524 396.406 308.886 391.654 298.594 395.534 C 296.138 396.460 281.462 407.736 281.460 407.738 C 281.466 407.739 336.517 421.488 339.997 422.485 C 364.826 429.598 376.744 468.997 376.748 469.001 C 376.757 469.011 448.759 490.179 473.447 569.036 C 482.447 597.786 487.445 643.534 454.280 666.841 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":189.172,\\\"max\\\":355.239},\\\"y\\\":{\\\"min\\\":46.145,\\\"max\\\":297.121}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":442.313,\\\"y\\\":699.76,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.2862787859448257,\\\"y\\\":-0.9581463649766443}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":269.925,\\\"y\\\":18.654,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":163.004,\\\"y\\\":185.443,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872972826314,\\\"y\\\":0.005040364409279444}},{\\\"point\\\":{\\\"x\\\":381.95,\\\"y\\\":185.443,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872972826314,\\\"y\\\":0.005040364409279429}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":340.795,\\\"y\\\":651.867,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7129108010945265,\\\"y\\\":0.7012547252480801}},{\\\"point\\\":{\\\"x\\\":467.188,\\\"y\\\":651.901,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6986557813877585,\\\"y\\\":0.7154579646166926}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":437.432,\\\"y\\\":507.795,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7196981204144021,\\\"y\\\":-0.6942871275430483}},{\\\"point\\\":{\\\"x\\\":216.455,\\\"y\\\":547.231,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7800177573620175,\\\"y\\\":0.6257573796607826}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":416.496,\\\"y\\\":675.74,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_card_3\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":169.966,\\\"max\\\":438.94312999072326},\\\"y\\\":{\\\"min\\\":6.343,\\\"max\\\":673.4853966356794}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_card_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Layer_1\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 202.133 468.700 C 198.503 453.097 230.501 349.594 236.338 341.426 C 241.111 334.747 300.302 289.609 324.846 279.949 C 334.576 276.120 407.950 267.427 410.311 270.177 C 411.185 271.196 426.708 285.464 408.720 301.996 C 392.597 316.814 346.913 326.310 346.907 326.312 C 346.902 326.315 298.857 353.059 298.013 354.135 C 297.157 355.227 282.476 409.035 282.475 409.041 C 282.476 409.035 297.328 356.571 299.088 353.711 C 299.851 352.471 346.794 327.517 346.798 327.515 C 346.803 327.514 372.364 313.338 390.215 322.281 C 399.868 327.117 424.102 377.925 424.862 381.995 C 426.343 389.916 424.733 394.160 418.991 397.515 C 417.459 398.410 397.583 403.312 385.229 392.116 C 376.502 384.208 363.614 360.521 363.612 360.517 C 363.607 360.522 318.275 406.650 318.270 406.654 C 318.275 406.650 363.626 361.633 363.630 361.629 C 363.632 361.632 376.940 384.228 385.617 392.014 C 399.064 404.080 418.053 398.171 418.056 398.171 C 418.057 398.172 425.026 399.389 427.249 408.245 C 428.343 412.607 420.571 472.544 410.745 479.375 C 396.227 489.469 384.480 472.939 381.980 468.366 C 375.092 455.770 379.048 421.129 379.048 421.124 C 379.048 421.123 380.837 412.466 380.837 412.466 C 380.837 412.466 379.139 420.464 379.139 420.465 C 379.138 420.464 370.450 414.136 370.449 414.135 C 370.448 414.137 360.431 432.107 360.430 432.109 C 360.432 432.111 377.558 451.587 377.559 451.589 C 377.560 451.591 378.509 462.102 381.991 468.937 C 383.884 472.652 396.635 489.633 410.090 480.178 C 419.034 473.893 426.981 421.896 426.982 421.890 C 426.983 421.894 438.751 445.104 436.704 465.925 C 436.058 472.492 423.824 496.816 399.462 508.917 C 397.040 510.119 378.927 507.842 375.489 502.182 C 372.040 496.503 383.588 472.943 383.589 472.940 C 383.588 472.943 370.985 496.220 374.748 502.905 C 377.965 508.620 399.328 508.998 400.343 510.532 C 437.876 567.222 442.575 598.248 431.226 626.997 C 414.086 670.420 377.548 669.070 323.839 669.953 C 266.037 670.902 226.040 571.485 202.133 468.700 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"card\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 386.816 10.645 C 385.223 8.816 379.837 8.343 379.837 8.343 C 379.817 8.343 180.465 8.343 180.445 8.343 C 180.445 8.343 176.330 8.806 174.586 10.280 C 172.902 11.703 171.966 15.907 171.966 15.908 C 171.966 15.938 171.966 317.470 171.966 317.500 C 171.966 317.500 172.661 320.705 175.427 322.936 C 177.632 324.713 181.503 324.301 181.503 324.301 C 181.523 324.301 378.731 324.804 378.750 324.804 C 378.751 324.804 383.326 324.844 386.183 322.817 C 389.239 320.648 388.995 313.645 388.995 313.644 C 388.995 313.615 388.594 17.240 388.594 17.210 C 388.594 17.209 389.167 13.345 386.816 10.645 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Layer_10\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 403.385 617.066 C 412.674 598.887 412.142 557.257 388.271 510.475 C 372.391 479.351 339.068 461.667 338.087 459.372 C 337.196 457.287 335.504 403.877 335.546 394.349 C 335.605 381.194 327.046 330.799 322.974 324.144 C 320.065 319.391 312.649 294.797 283.200 292.325 C 259.526 290.337 261.023 330.567 260.903 331.135 C 260.723 331.988 269.917 369.328 269.846 397.785 C 269.844 398.372 267.122 439.568 265.340 459.278 C 260.850 508.907 235.311 539.303 240.098 580.955 C 241.866 596.340 240.697 631.411 303.952 668.772 C 381.803 683.247 393.715 635.991 403.385 617.066 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":198.299,\\\"max\\\":361.568},\\\"y\\\":{\\\"min\\\":36.517,\\\"max\\\":286.916}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":277.692,\\\"y\\\":9.489,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":172.572,\\\"y\\\":173.467,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873985582148,\\\"y\\\":0.005020231545848447}},{\\\"point\\\":{\\\"x\\\":387.829,\\\"y\\\":173.467,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999987398558215,\\\"y\\\":0.005020231545848464}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":279.877,\\\"y\\\":651.666,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7129034259466664,\\\"y\\\":0.7012622229048887}},{\\\"point\\\":{\\\"x\\\":417.828,\\\"y\\\":651.703,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6986375999278468,\\\"y\\\":0.7154757186425391}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":357.923,\\\"y\\\":668.936,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":235.006,\\\"y\\\":567.952,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872716102187,\\\"y\\\":0.005045455138106748}},{\\\"point\\\":{\\\"x\\\":429.435,\\\"y\\\":567.952,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872688175807,\\\"y\\\":0.0050460085964960395}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":358.567,\\\"y\\\":705.781,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_claddagh\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":143.305573722491,\\\"max\\\":649.1195385185963},\\\"y\\\":{\\\"min\\\":116.39535390698238,\\\"max\\\":582.2918715555926}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_claddagh\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_claddagh\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#23B4A8DF-3DAD-4703-8615-1FB6FFF771E1_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 535.877 136.931 C 467.682 115.269 398.732 109.308 326.291 133.823 C 205.955 174.546 145.068 132.509 150.520 158.676 C 156.578 187.756 179.388 206.328 253.420 201.198 C 372.521 192.945 376.955 244.152 382.634 288.144 C 386.167 315.507 373.712 356.950 366.783 367.397 C 303.345 463.044 239.802 494.446 154.386 534.356 C 135.727 543.074 138.907 574.285 213.562 555.490 C 243.870 547.860 324.516 506.247 396.371 439.252 C 401.263 434.692 322.313 512.274 223.072 556.547 C 186.258 572.970 235.062 590.055 285.417 569.227 C 403.506 520.383 472.029 456.934 468.228 460.387 C 432.800 492.564 393.889 517.729 307.608 562.887 C 289.342 572.448 314.218 582.745 355.160 577.681 C 438.405 567.385 533.935 476.611 529.516 481.521 C 499.571 514.791 432.566 554.688 391.088 570.284 C 383.922 572.979 414.060 594.335 478.794 567.114 C 569.519 528.964 593.819 482.704 624.134 418.563 C 646.472 371.300 652.504 311.804 643.809 266.693 C 633.159 211.434 614.579 161.930 535.877 136.931 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":8.552,\\\"max\\\":442.507},\\\"y\\\":{\\\"min\\\":202.379,\\\"max\\\":517.621}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":708.045,\\\"y\\\":315.327,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":449.078,\\\"y\\\":118.677,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":647.982,\\\"y\\\":314.735,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":153.339,\\\"y\\\":550.892,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7071067811865482,\\\"y\\\":0.7071067811865468}},{\\\"point\\\":{\\\"x\\\":512.442,\\\"y\\\":550.892,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7071067811865476,\\\"y\\\":0.7071067811865476}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"23B4A8DF-3DAD-4703-8615-1FB6FFF771E1_0\\\",\\\"cx\\\":\\\"49.58%\\\",\\\"cy\\\":\\\"50.54%\\\",\\\"r\\\":\\\"120.96%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"29.02%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_fist\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":111.47747720494829,\\\"max\\\":625.6019185987444},\\\"y\\\":{\\\"min\\\":16.992073002875472,\\\"max\\\":660.1137506042829}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_fist\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_fist\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 356.982 658.100 C 477.243 658.823 521.995 630.939 554.830 597.087 C 583.319 567.715 603.693 523.034 611.502 502.523 C 619.607 481.235 626.041 396.452 622.700 358.816 C 620.368 332.542 598.039 281.156 598.033 281.138 C 598.033 281.127 603.860 234.127 605.189 171.402 C 605.521 155.697 595.254 117.688 587.377 108.009 C 535.045 43.703 477.716 60.184 477.705 60.179 C 477.698 60.175 454.505 21.087 404.142 19.077 C 356.635 17.181 340.282 47.660 340.276 47.662 C 340.267 47.662 315.029 24.060 255.395 43.578 C 230.785 51.633 220.496 90.533 220.492 90.538 C 220.482 90.541 154.985 72.451 122.424 120.108 C 113.329 133.419 113.677 207.843 118.679 246.697 C 124.656 293.125 83.255 509.311 165.730 593.288 C 221.151 649.719 309.654 657.816 356.982 658.100 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 340.276 47.662 C 360.933 56.445 363.680 144.451 365.026 179.501 C 365.700 197.070 365.196 213.603 364.940 226.175 C 380.644 225.678 437.446 218.974 455.503 217.102 C 463.739 216.249 482.459 210.279 482.462 210.278 C 487.663 158.647 487.576 67.865 477.705 60.179 M 240.350 335.913 C 237.326 348.082 202.459 378.238 159.563 346.891 C 121.960 319.413 130.977 285.634 117.558 246.997 M 220.492 90.538 C 232.344 104.946 234.266 126.501 240.462 194.982 C 241.150 202.591 242.255 210.461 242.973 219.272 C 245.623 219.644 247.885 220.885 250.265 221.599 C 270.198 227.584 345.139 226.800 364.940 226.175 M 598.033 281.138 C 563.189 201.763 482.474 210.285 482.462 210.278 M 242.973 219.272 C 215.953 216.143 186.242 248.129 208.762 293.575 C 215.584 307.343 227.250 328.465 240.350 335.913 C 241.203 337.175 242.223 337.843 243.332 338.367 C 281.228 356.296 353.416 362.366 371.879 361.445 C 385.735 360.753 447.912 356.938 447.920 356.937 C 447.919 356.946 432.429 390.434 444.276 448.562 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":196.469,\\\"max\\\":527.606},\\\"y\\\":{\\\"min\\\":365.662,\\\"max\\\":603.681}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.926,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":389.799,\\\"y\\\":17.681,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":118.475,\\\"y\\\":259.777,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874193383655,\\\"y\\\":0.005016090608824136}},{\\\"point\\\":{\\\"x\\\":596.6,\\\"y\\\":259.777,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874193383655,\\\"y\\\":0.00501609060882416}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":165.609,\\\"y\\\":592.56,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7129525332410661,\\\"y\\\":0.7012122969152398}},{\\\"point\\\":{\\\"x\\\":553.262,\\\"y\\\":592.6,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6987416409929204,\\\"y\\\":0.7153741113169533}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":548.474,\\\"y\\\":80.321,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6517430560672007,\\\"y\\\":-0.7584398386610407}},{\\\"point\\\":{\\\"x\\\":143.841,\\\"y\\\":96.556,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.66215006199955,\\\"y\\\":-0.7493712667256411}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360.043,\\\"y\\\":655.36,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_half\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":185.09862953199126,\\\"max\\\":549.814},\\\"y\\\":{\\\"min\\\":14.205493741792967,\\\"max\\\":542}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Hand_open_3/4\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 193.830 540.000 C 193.830 539.997 192.786 518.898 192.842 514.995 C 193.134 494.556 194.482 382.960 194.841 345.108 C 195.125 315.199 180.493 258.608 190.753 247.444 C 198.609 238.897 226.799 249.236 234.256 260.587 C 245.439 277.608 250.349 306.047 252.251 312.361 C 259.734 337.206 252.439 442.082 264.684 433.941 C 274.796 427.219 273.292 399.891 275.243 385.527 C 277.029 372.367 275.324 288.425 275.413 275.145 C 275.489 263.833 276.342 189.731 276.514 181.125 C 276.721 170.766 274.008 80.332 279.743 67.980 C 281.599 63.982 288.375 41.803 305.045 41.480 C 319.190 41.207 326.222 55.371 328.013 58.289 C 335.428 70.375 332.765 165.244 333.268 176.021 C 333.791 187.238 332.613 298.407 339.231 298.538 C 345.891 298.671 347.890 186.139 347.495 175.393 C 347.052 163.381 342.085 58.900 347.565 44.082 C 349.005 40.187 350.788 17.015 367.950 16.224 C 384.571 15.459 391.394 38.644 393.325 42.602 C 399.902 56.081 400.246 155.643 401.006 167.030 C 401.781 178.651 403.252 294.292 410.108 293.931 C 416.869 293.575 414.047 179.712 413.230 168.530 C 412.546 159.159 409.709 76.886 415.377 65.915 C 417.036 62.704 424.214 45.025 437.710 45.822 C 450.363 46.570 461.347 67.130 463.252 71.002 C 468.479 81.629 467.520 160.321 468.087 169.313 C 468.980 183.489 472.564 323.482 480.171 324.004 C 485.740 324.386 479.502 230.531 480.270 220.572 C 481.028 210.740 475.455 142.109 477.482 128.389 C 478.202 123.521 485.683 107.906 497.524 107.513 C 508.234 107.158 519.089 124.199 520.972 127.381 C 528.157 139.521 532.689 233.257 533.564 243.955 C 535.497 267.614 546.138 460.230 546.851 502.916 C 547.139 520.165 547.814 539.996 547.814 540.000 C 547.778 540.000 193.865 540.000 193.830 540.000 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":285.858,\\\"max\\\":505.701},\\\"y\\\":{\\\"min\\\":302.824,\\\"max\\\":517.79}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":367.814,\\\"y\\\":539.495,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":368.601,\\\"y\\\":16.427,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":195.81,\\\"y\\\":447.176,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872880189178,\\\"y\\\":-0.0050422019564934075}},{\\\"point\\\":{\\\"x\\\":540.505,\\\"y\\\":447.177,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872880189178,\\\"y\\\":-0.005042201956497622}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":367.814,\\\"y\\\":540.217,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":194.653,\\\"y\\\":540.217,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}},{\\\"point\\\":{\\\"x\\\":540.974,\\\"y\\\":540.217,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_holding_fingers\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":154.91554323520373,\\\"max\\\":612.8561658055753},\\\"y\\\":{\\\"min\\\":61.73272867410894,\\\"max\\\":654.6856911064222}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_holding_fingers\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Hand_hold_fingers\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#9CBCD430-4F67-4320-8A4B-DD697F6DB275_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 605.801 366.784 C 604.898 343.064 600.751 283.573 599.036 259.898 C 597.982 245.334 596.826 208.498 593.736 194.227 C 590.189 177.845 579.100 135.579 567.827 123.174 C 562.965 117.824 547.421 102.439 539.273 107.401 C 527.752 114.415 534.813 126.127 534.861 131.573 C 534.981 145.046 547.230 177.346 548.951 190.709 C 550.739 204.583 552.123 239.941 550.312 253.812 C 548.831 265.157 550.851 301.720 536.282 303.490 C 527.252 304.587 526.005 234.414 521.276 215.118 C 517.864 201.198 508.074 166.319 501.673 153.496 C 493.470 137.065 466.662 98.759 453.129 86.345 C 446.429 80.198 425.738 59.943 418.496 64.356 C 406.075 71.924 413.424 90.867 419.430 102.755 C 425.469 114.711 446.279 144.910 452.155 157.838 C 458.282 171.319 470.516 206.729 472.931 221.339 C 476.134 240.716 482.259 309.202 473.157 309.956 C 465.326 310.605 454.129 253.722 447.799 238.054 C 440.631 220.311 423.161 174.979 411.810 159.574 C 397.289 139.868 351.712 95.329 328.792 86.735 C 322.087 84.221 302.477 77.922 296.563 84.447 C 292.206 89.254 301.889 107.483 305.246 113.242 C 314.696 129.453 356.259 155.862 366.760 171.413 C 376.605 185.992 391.638 228.159 396.011 245.199 C 399.825 260.056 411.345 309.699 404.880 313.837 C 396.028 319.505 369.583 265.460 334.060 250.859 C 317.595 244.092 269.968 234.862 247.721 241.494 C 234.441 245.454 200.898 260.474 190.303 269.930 C 182.536 276.863 155.774 291.580 164.180 308.968 C 169.585 320.151 198.797 311.116 208.371 309.051 C 219.525 306.644 243.861 288.565 255.090 287.422 C 269.586 285.947 303.278 291.248 314.511 298.552 C 330.473 308.932 354.175 353.002 361.080 370.747 C 371.281 396.967 389.622 469.628 380.403 496.209 C 374.040 514.558 337.211 552.855 318.567 558.293 C 304.085 562.517 277.553 555.978 251.765 545.240 C 241.410 540.928 220.712 521.499 210.165 509.555 C 185.941 482.123 153.280 500.645 157.245 513.358 C 163.253 532.617 196.484 574.711 212.414 587.620 C 239.979 609.958 324.670 645.094 359.792 650.126 C 399.758 655.853 502.855 653.715 544.788 625.405 C 571.648 607.271 602.099 548.000 607.384 502.841 C 615.527 433.260 606.947 396.919 605.801 366.784 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":42.762,\\\"max\\\":325.348},\\\"y\\\":{\\\"min\\\":315.6,\\\"max\\\":495.338}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":424.229,\\\"y\\\":681.754,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":537.981,\\\"y\\\":629.378,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129335762692849,\\\"y\\\":0.7012315707581112}},{\\\"point\\\":{\\\"x\\\":306.585,\\\"y\\\":633.634,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987263029800354,\\\"y\\\":0.7153890923992705}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":611.265,\\\"y\\\":446.362,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999682957071754,\\\"y\\\":-0.025179065516292138}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":425.038,\\\"y\\\":649.97,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":422.344,\\\"y\\\":64.902,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"9CBCD430-4F67-4320-8A4B-DD697F6DB275_0\\\",\\\"cx\\\":\\\"55.12%\\\",\\\"cy\\\":\\\"57.66%\\\",\\\"r\\\":\\\"111.79%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"31.37%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_open_3_4\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":40.21237811612145,\\\"max\\\":714.0464835200017},\\\"y\\\":{\\\"min\\\":177.0708819917752,\\\"max\\\":543.3452785736977}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_open_3_4\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Hand_open_3/4\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#7149E7AF-3CB6-4D7A-93D2-0C3C3F58B320_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 42.215 358.272 C 42.003 328.303 54.674 278.727 70.556 262.410 C 112.466 219.353 191.815 187.964 212.635 184.810 C 227.975 182.486 312.842 186.467 341.570 186.812 C 371.516 187.172 428.178 172.445 439.356 182.719 C 447.914 190.584 437.562 218.810 426.197 226.276 C 409.154 237.473 380.680 242.389 374.358 244.293 C 349.483 251.785 244.476 244.481 252.626 256.742 C 259.357 266.867 286.804 264.812 301.101 267.314 C 314.008 269.572 396.542 275.617 409.613 276.520 C 425.875 277.643 532.510 283.642 544.913 283.647 C 555.481 283.650 647.417 272.428 660.207 277.843 C 664.271 279.564 686.417 286.486 686.740 303.177 C 687.014 317.340 672.773 324.287 669.910 326.173 C 657.780 334.165 561.057 339.817 550.024 340.471 C 538.814 341.136 427.366 340.418 427.354 340.418 C 427.366 340.419 539.913 349.448 550.652 348.692 C 562.869 347.832 668.883 334.582 684.135 339.725 C 688.076 341.054 711.236 342.953 712.028 360.136 C 712.794 376.778 689.518 383.487 685.617 385.543 C 672.026 392.706 570.655 401.085 559.026 402.269 C 547.425 403.451 431.979 411.382 431.967 411.383 C 431.979 411.383 546.373 411.761 557.524 410.493 C 567.055 409.410 650.958 402.064 662.275 407.622 C 665.523 409.217 683.191 416.471 682.393 429.983 C 681.644 442.652 661.014 453.563 657.181 455.557 C 646.408 461.160 565.934 464.509 556.740 465.418 C 541.917 466.883 394.845 481.532 394.829 481.533 C 394.840 481.533 494.735 478.455 505.418 478.620 C 515.578 478.777 585.511 465.276 599.723 466.793 C 604.622 467.316 620.232 475.004 620.625 486.859 C 620.981 497.583 603.857 508.350 600.733 510.337 C 588.482 518.130 492.986 530.769 482.005 531.980 C 458.586 534.562 253.449 545.971 224.729 539.260 C 206.166 534.923 117.438 515.502 81.535 471.443 C 48.211 430.550 42.415 386.356 42.215 358.272 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":125.948,\\\"max\\\":576.154},\\\"y\\\":{\\\"min\\\":209.571,\\\"max\\\":495.085}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":15.411,\\\"y\\\":379.068,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":329.086,\\\"y\\\":184.318,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":51.178,\\\"y\\\":302.073,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873181281341,\\\"y\\\":0.005036227050270598}},{\\\"point\\\":{\\\"x\\\":685.515,\\\"y\\\":302.073,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.0050358540887562725}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":554.552,\\\"y\\\":518.354,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129355307283227,\\\"y\\\":0.7012295836779314}},{\\\"point\\\":{\\\"x\\\":156.951,\\\"y\\\":518.395,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987333317777815,\\\"y\\\":0.7153822272482877}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":437.466,\\\"y\\\":182.002,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631445428603132,\\\"y\\\":-0.7754203187279831}},{\\\"point\\\":{\\\"x\\\":204.715,\\\"y\\\":186.955,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.21188539139013307,\\\"y\\\":-0.9772945210710281}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":44.984,\\\"y\\\":379.068,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"7149E7AF-3CB6-4D7A-93D2-0C3C3F58B320_0\\\",\\\"cx\\\":\\\"45.93%\\\",\\\"cy\\\":\\\"50.05%\\\",\\\"r\\\":\\\"109.24%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"30.59%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_point\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":151.2409449151704,\\\"max\\\":582.1958754455674},\\\"y\\\":{\\\"min\\\":13.26116207424166,\\\"max\\\":672.4735748487225}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_point\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_point\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 470.929 634.844 C 577.785 549.185 531.429 383.658 538.718 341.937 C 547.727 290.360 586.664 250.483 579.267 234.236 C 567.285 207.920 520.035 228.673 494.645 269.841 C 453.050 337.285 465.988 395.843 461.969 447.776 C 464.484 287.525 475.655 94.573 461.667 43.207 C 460.250 38.004 446.571 12.392 426.417 15.526 C 399.838 19.658 399.281 57.922 398.835 72.836 C 395.842 172.870 390.477 275.287 390.474 275.296 C 390.469 275.292 372.484 260.712 359.653 260.163 C 320.877 258.504 312.194 276.071 308.015 273.720 C 294.727 266.244 276.621 256.282 247.086 276.874 C 236.718 284.102 233.586 296.499 233.584 296.502 C 233.571 296.510 186.373 282.793 163.111 335.349 C 154.185 355.517 149.142 400.943 157.506 489.558 C 178.590 712.930 406.511 686.483 470.929 634.844 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 390.474 275.296 C 407.488 292.085 418.787 346.492 419.198 358.570 C 419.584 369.919 422.649 419.177 397.887 438.552 C 379.311 453.086 346.685 452.450 335.903 442.197 M 264.894 444.268 C 272.164 453.155 304.130 461.952 322.388 450.737 C 356.693 429.667 348.330 375.271 343.856 344.435 C 337.385 299.844 322.314 284.052 308.015 273.720 M 195.903 370.458 C 210.869 367.056 221.136 375.885 220.701 407.185 M 233.584 296.502 C 233.588 296.514 288.189 295.881 272.641 417.381 C 270.158 436.780 258.026 465.273 231.042 470.387 C 187.232 478.690 175.693 434.964 175.190 418.546 C 174.461 394.724 177.149 374.155 195.903 370.458 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":231.662,\\\"max\\\":462.764},\\\"y\\\":{\\\"min\\\":430.591,\\\"max\\\":619.124}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":346.099,\\\"y\\\":700.218,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":428.539,\\\"y\\\":16.937,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":158.126,\\\"y\\\":486.828,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872931587463,\\\"y\\\":0.005041182504468998}},{\\\"point\\\":{\\\"x\\\":540.473,\\\"y\\\":486.828,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872931587463,\\\"y\\\":0.005041182504468965}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":220.865,\\\"y\\\":625.5,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7129256664097725,\\\"y\\\":0.7012396125249784}},{\\\"point\\\":{\\\"x\\\":470.235,\\\"y\\\":625.547,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6987322514833304,\\\"y\\\":0.715383282399747}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":574.523,\\\"y\\\":236.35,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6817683387979059,\\\"y\\\":-0.7315681323108217}},{\\\"point\\\":{\\\"x\\\":190.852,\\\"y\\\":304.584,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6314434020564988,\\\"y\\\":-0.7754219689945048}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":345.58,\\\"y\\\":661.576,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_point_2\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":153.50026729617127,\\\"max\\\":591.2642925883827},\\\"y\\\":{\\\"min\\\":16.645489372265892,\\\"max\\\":668.0097000527071}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_point_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_point\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 336.803 665.922 C 375.004 667.269 437.732 652.926 460.458 634.844 C 493.745 608.359 527.120 572.180 534.658 547.497 C 544.227 516.165 538.160 390.721 547.454 346.916 C 558.531 294.704 596.635 252.853 588.003 236.833 C 580.194 222.341 537.303 230.683 524.031 244.640 C 505.052 264.598 491.113 300.928 486.835 308.752 C 480.652 320.062 466.159 365.828 466.157 365.834 C 466.157 365.829 465.588 332.343 464.574 318.536 C 464.374 315.809 463.028 298.603 462.918 295.871 C 462.257 279.428 463.476 171.615 463.403 159.094 C 463.340 148.484 467.957 55.653 461.667 43.207 C 459.692 39.300 451.335 17.873 434.794 18.667 C 420.753 19.341 414.858 33.913 413.131 36.844 C 405.800 49.280 403.303 145.406 402.264 156.341 C 401.229 167.235 390.478 275.285 390.474 275.296 C 390.469 275.292 363.736 260.796 359.653 260.163 C 331.510 255.799 311.837 274.378 308.015 273.720 C 286.516 270.018 267.082 262.623 247.086 276.874 C 236.556 284.378 233.329 296.989 233.327 296.992 C 233.314 297.000 185.612 284.652 163.111 338.317 C 154.749 358.260 153.352 464.843 158.553 489.558 C 164.303 516.879 181.993 592.488 224.408 626.960 C 265.053 659.995 308.934 664.940 336.803 665.922 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":223.193,\\\"max\\\":441.339},\\\"y\\\":{\\\"min\\\":349.825,\\\"max\\\":582.492}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":346.099,\\\"y\\\":700.218,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":436.916,\\\"y\\\":17.984,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":158.126,\\\"y\\\":486.828,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872931587463,\\\"y\\\":0.005041182504468998}},{\\\"point\\\":{\\\"x\\\":540.473,\\\"y\\\":486.828,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872931587463,\\\"y\\\":0.005041182504468965}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":220.865,\\\"y\\\":625.5,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7129256664097725,\\\"y\\\":0.7012396125249784}},{\\\"point\\\":{\\\"x\\\":470.235,\\\"y\\\":625.547,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6987322514833304,\\\"y\\\":0.715383282399747}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":345.58,\\\"y\\\":661.576,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_relaxed\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":59.990151446077974,\\\"max\\\":660.4612521911711},\\\"y\\\":{\\\"min\\\":103.84223967585581,\\\"max\\\":593.1824672099115}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_relaxed\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"finger\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 568.725 366.567 C 596.473 340.411 613.764 313.947 617.517 305.492 C 622.903 293.357 657.622 238.289 658.365 215.900 C 659.692 175.916 647.227 91.110 625.356 108.051 C 588.428 136.657 604.320 213.796 604.318 213.807 C 604.313 213.813 559.257 276.670 559.252 276.676 C 559.247 276.684 514.742 323.809 505.549 354.934 C 492.417 399.389 558.914 375.815 568.725 366.567 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 205.120 377.191 C 292.497 332.549 426.295 345.490 468.050 232.178 C 482.703 192.411 481.492 200.785 484.557 190.602 C 493.480 160.952 490.465 165.827 493.892 154.741 C 511.664 97.235 553.579 150.566 531.232 223.590 C 510.598 291.018 497.334 348.492 463.637 392.957 C 452.587 407.538 239.404 526.482 208.587 529.793 C 141.860 536.961 193.001 383.383 205.120 377.191 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_holding\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 188.820 590.622 C 289.045 564.066 413.577 548.232 441.561 528.536 C 465.298 511.830 592.070 351.957 593.173 337.783 C 593.868 328.849 533.027 207.714 525.167 200.088 C 517.959 193.096 407.486 133.086 397.448 140.810 C 392.422 144.677 390.507 165.542 406.253 188.663 C 410.999 195.632 469.556 233.808 479.389 240.600 C 488.347 246.788 524.571 316.086 524.576 316.094 C 524.564 316.084 464.313 237.280 406.608 221.508 C 397.067 218.900 317.736 179.643 309.125 189.610 C 301.994 197.864 301.602 221.327 320.028 238.155 C 331.807 248.912 416.650 283.278 426.970 294.261 C 429.433 296.883 440.682 319.611 440.684 319.613 C 440.676 319.612 364.656 303.306 359.773 302.432 C 324.937 296.200 286.502 337.476 286.495 337.479 C 286.477 337.486 185.129 320.077 107.174 402.188 C 78.753 432.124 45.000 485.387 71.734 534.071 C 97.594 581.162 175.273 594.211 188.820 590.622 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 524.576 316.094 C 539.990 351.389 508.377 390.355 488.395 447.612 M 479.464 332.315 C 492.631 347.803 462.440 480.535 462.438 480.550 M 440.684 319.613 C 440.688 319.615 470.383 321.634 479.464 332.315 M 345.226 415.981 C 284.595 356.643 171.324 401.177 171.306 401.176 M 397.532 403.809 C 397.527 403.810 346.812 417.534 345.226 415.981 M 408.790 365.578 C 412.112 366.507 397.534 403.805 397.532 403.809 M 362.035 349.350 C 367.224 350.188 402.974 363.952 408.790 365.578 M 326.502 353.893 C 328.452 353.202 353.298 347.938 362.035 349.350 M 286.495 337.479 C 295.076 354.671 322.264 355.394 326.502 353.893 M 71.734 534.071 C 97.594 581.162 175.273 594.211 188.820 590.622 C 289.045 564.066 413.577 548.232 441.561 528.536 C 465.298 511.830 592.070 351.957 593.173 337.783 C 593.868 328.849 533.027 207.714 525.167 200.088 C 517.959 193.096 407.486 133.086 397.448 140.810 C 392.422 144.677 390.507 165.542 406.253 188.663 C 410.999 195.632 469.556 233.808 479.389 240.600 C 488.347 246.788 524.571 316.086 524.576 316.094 C 524.564 316.084 464.313 237.280 406.608 221.508 C 397.067 218.900 317.736 179.643 309.125 189.610 C 301.994 197.864 301.602 221.327 320.028 238.155 C 331.807 248.912 416.650 283.278 426.970 294.261 C 429.433 296.883 440.682 319.611 440.684 319.613 C 440.676 319.612 364.656 303.306 359.773 302.432 C 324.937 296.200 286.502 337.476 286.495 337.479 C 286.477 337.486 185.129 320.077 107.174 402.188 C 78.753 432.124 45.000 485.387 71.734 534.071 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":23.49,\\\"y\\\":516.801,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9930324991516346,\\\"y\\\":-0.1178408062967105}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":630.135,\\\"y\\\":111.368,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.0217035183169127,\\\"y\\\":-0.9997644509046455}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":64.87,\\\"y\\\":507.903,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9423576018699376,\\\"y\\\":0.3346074568773692}},{\\\"point\\\":{\\\"x\\\":220.376,\\\"y\\\":584.131,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.3312241814281665,\\\"y\\\":0.9435520874001821}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":112.844,\\\"y\\\":567.818,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.4403643856219724,\\\"y\\\":0.8978191398470979}}],\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":524.176,\\\"max\\\":619.892},\\\"y\\\":{\\\"min\\\":48.755,\\\"max\\\":192.279}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":103.427,\\\"y\\\":404.084,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9965212793333293,\\\"y\\\":-0.08333870550869243}},{\\\"point\\\":{\\\"x\\\":508.036,\\\"y\\\":453.335,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9991543071031284,\\\"y\\\":0.04111776498385355}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hand_side\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":66.91512682260131,\\\"max\\\":691.9944092954879},\\\"y\\\":{\\\"min\\\":415.42563700393185,\\\"max\\\":620.9656773178741}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_side\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hand_side_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 624.191 513.011 C 625.036 508.993 631.701 496.451 642.275 489.747 C 662.997 476.609 692.570 480.784 689.815 498.218 C 683.528 538.004 544.624 602.495 425.489 616.929 C 342.417 626.994 264.788 595.636 148.183 611.746 C 84.991 620.477 3.704 496.946 155.193 432.470 C 193.568 416.137 283.974 413.813 309.300 422.077 C 390.243 448.490 433.387 444.227 461.919 440.400 C 515.709 433.186 456.650 522.490 389.750 495.554 C 371.312 488.131 334.523 465.411 334.506 465.381 C 334.512 465.392 433.121 521.239 433.131 521.249 C 433.135 521.248 461.335 483.084 488.352 481.500 C 510.784 480.185 513.920 496.398 503.340 518.211 C 523.569 489.935 537.389 480.931 552.099 479.739 C 576.468 477.764 570.976 494.201 570.582 510.337 C 576.982 495.009 590.027 479.882 609.396 479.671 C 631.804 479.426 634.590 488.226 624.191 513.011 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 433.131 521.249 C 425.472 526.072 391.457 554.116 326.771 571.365 M 624.191 513.011 C 619.813 518.014 609.502 550.303 552.673 587.045 M 570.582 510.337 C 551.370 550.923 504.646 588.871 465.566 608.763 M 503.340 518.211 C 467.199 562.218 453.655 593.024 366.839 617.845 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 334.506 465.381 C 279.484 462.898 283.792 451.241 224.530 469.118 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":160.699,\\\"max\\\":592.485},\\\"y\\\":{\\\"min\\\":143.83,\\\"max\\\":483.377}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":21.131,\\\"y\\\":526.372,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":385.176,\\\"y\\\":146.45,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":158.094,\\\"y\\\":312.385,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872000553837,\\\"y\\\":-0.005059617119336025}},{\\\"point\\\":{\\\"x\\\":596.943,\\\"y\\\":312.385,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872000553837,\\\"y\\\":-0.005059617119336021}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hands_claddagh\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":17.171973113898062,\\\"max\\\":702.8282066943178},\\\"y\\\":{\\\"min\\\":200.33909102598173,\\\"max\\\":511.1650061501673}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hands_claddagh\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hands_claddagh_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#41483E29-D288-4F4E-BC28-FF05B80DC496_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 21.698 300.968 C 28.757 264.341 41.073 231.528 93.239 214.957 C 138.442 200.598 184.144 196.648 232.161 212.897 C 311.924 239.890 352.282 212.026 348.669 229.371 C 344.653 248.646 329.534 260.956 280.462 257.556 C 201.518 252.085 198.579 286.027 194.814 315.187 C 192.473 333.324 200.728 360.794 205.321 367.719 C 247.371 431.117 289.489 451.932 346.106 478.386 C 358.474 484.165 356.366 504.852 306.882 492.394 C 286.792 487.336 233.338 459.754 185.709 415.347 C 182.466 412.324 234.798 463.749 300.579 493.094 C 324.980 503.980 292.631 515.305 259.254 501.500 C 180.980 469.124 135.560 427.068 138.080 429.356 C 161.563 450.684 187.354 467.365 244.545 497.297 C 256.652 503.634 240.164 510.460 213.026 507.103 C 157.847 500.279 94.526 440.110 97.456 443.365 C 117.305 465.417 161.718 491.862 189.211 502.200 C 193.961 503.986 173.984 518.142 131.076 500.099 C 70.940 474.812 54.833 444.149 34.739 401.634 C 19.933 370.306 15.934 330.870 21.698 300.968 M 698.302 300.968 C 691.243 264.341 678.928 231.527 626.761 214.957 C 581.558 200.598 535.856 196.647 487.839 212.897 C 408.076 239.889 367.718 212.026 371.331 229.370 C 375.347 248.645 390.467 260.956 439.538 257.556 C 518.482 252.085 521.421 286.027 525.186 315.187 C 527.527 333.324 519.272 360.794 514.679 367.719 C 472.630 431.117 430.511 451.932 373.894 478.386 C 361.526 484.165 363.634 504.852 413.118 492.394 C 433.208 487.336 486.662 459.754 534.291 415.347 C 537.534 412.324 485.202 463.749 419.422 493.094 C 395.020 503.980 427.369 515.305 460.747 501.499 C 539.020 469.124 584.440 427.068 581.920 429.356 C 558.437 450.685 532.646 467.364 475.455 497.297 C 463.348 503.634 479.837 510.460 506.975 507.103 C 562.153 500.278 625.474 440.110 622.544 443.365 C 602.696 465.417 558.282 491.862 530.789 502.200 C 526.039 503.986 546.016 518.142 588.924 500.099 C 649.060 474.811 665.167 444.148 685.261 401.633 C 700.068 370.305 704.066 330.870 698.302 300.968 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":221.276,\\\"max\\\":498.724},\\\"y\\\":{\\\"min\\\":249.94,\\\"max\\\":476.896}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":685.952,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":218.997,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":20.195,\\\"y\\\":352.724,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874716149617,\\\"y\\\":0.005005658110200264}},{\\\"point\\\":{\\\"x\\\":699.805,\\\"y\\\":352.724,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874716149617,\\\"y\\\":0.005005658110200251}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":557.475,\\\"y\\\":505.785,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129291530323832,\\\"y\\\":0.7012360677806929}},{\\\"point\\\":{\\\"x\\\":162.362,\\\"y\\\":505.826,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987239451408815,\\\"y\\\":0.715391395312218}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":672.152,\\\"y\\\":239.74,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6313950247982124,\\\"y\\\":-0.7754613611651227}},{\\\"point\\\":{\\\"x\\\":48.871,\\\"y\\\":239.846,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817551651614339,\\\"y\\\":-0.7315804089611109}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":494.662,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"41483E29-D288-4F4E-BC28-FF05B80DC496_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.54%\\\",\\\"r\\\":\\\"109.04%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"35.29%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hands_giving\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":36.0976798300912,\\\"max\\\":683.9023201699088},\\\"y\\\":{\\\"min\\\":325.2510074417165,\\\"max\\\":628.0125179655881}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hands_giving\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hands_giving\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 636.749 394.777 C 636.745 394.771 654.094 360.025 656.279 356.720 C 661.388 348.993 675.845 341.514 680.411 346.319 C 690.699 357.146 646.239 467.942 593.830 520.096 C 555.761 557.980 501.056 567.049 444.864 617.550 C 416.608 642.944 335.869 610.700 387.549 527.380 C 401.595 504.733 432.273 460.428 446.027 451.197 C 473.816 432.550 502.457 402.349 516.225 404.875 C 518.866 405.360 533.182 403.174 514.168 439.726 C 507.298 452.932 459.137 468.612 460.016 503.137 C 460.183 509.689 508.669 495.715 535.634 483.606 C 544.400 479.670 552.710 454.096 559.087 437.396 C 564.486 423.258 548.342 407.580 553.285 388.578 C 554.636 383.383 559.491 376.453 561.012 376.240 C 565.873 375.558 582.231 417.661 582.231 417.661 C 582.231 417.661 583.337 413.683 584.153 411.700 C 585.302 408.904 575.411 374.704 579.814 358.568 C 581.814 351.242 588.075 343.710 589.981 343.561 C 595.908 343.098 609.784 396.127 609.784 396.127 C 609.780 396.125 619.131 354.083 628.576 338.747 C 634.510 329.114 645.964 325.739 646.628 327.861 C 653.322 330.354 636.757 394.780 636.749 394.777 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 582.231 417.661 C 575.565 443.344 570.633 456.017 568.141 474.014 M 609.784 396.127 C 598.635 424.452 591.927 445.362 588.389 464.854 M 636.749 394.777 C 636.747 394.781 625.971 422.388 616.991 437.030 C 598.479 467.211 576.000 471.607 554.283 479.887 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 83.251 394.777 C 83.255 394.771 65.907 360.025 63.722 356.720 C 58.612 348.993 44.155 341.514 39.589 346.319 C 29.301 357.146 73.761 467.942 126.170 520.096 C 164.239 557.980 218.944 567.049 275.136 617.550 C 303.392 642.944 384.131 610.700 332.451 527.380 C 318.405 504.734 287.728 460.428 273.973 451.197 C 246.185 432.550 217.543 402.349 203.775 404.875 C 201.134 405.360 186.819 403.174 205.833 439.726 C 212.703 452.932 260.863 468.612 259.984 503.137 C 259.817 509.690 211.331 495.715 184.366 483.606 C 175.600 479.670 167.290 454.096 160.913 437.396 C 155.514 423.258 171.659 407.580 166.715 388.578 C 165.364 383.383 160.509 376.453 158.988 376.239 C 154.127 375.558 137.769 417.661 137.769 417.661 C 137.769 417.661 136.663 413.683 135.847 411.700 C 134.698 408.904 144.589 374.704 140.186 358.568 C 138.186 351.242 131.925 343.710 130.019 343.561 C 124.092 343.098 110.217 396.127 110.217 396.127 C 110.220 396.125 100.869 354.083 91.424 338.747 C 85.491 329.113 74.036 325.738 73.372 327.860 C 66.678 330.354 83.243 394.780 83.251 394.777 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 137.769 417.661 C 144.435 443.344 149.368 456.017 151.859 474.014 M 110.217 396.127 C 121.365 424.452 128.073 445.362 131.611 464.854 M 83.251 394.777 C 83.253 394.781 94.029 422.388 103.009 437.030 C 121.520 467.211 144.000 471.607 165.717 479.886 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":90.486,\\\"max\\\":629.514},\\\"y\\\":{\\\"min\\\":22.275,\\\"max\\\":402.62}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":700.95,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":22.401,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":126.243,\\\"y\\\":517.473,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875521534511,\\\"y\\\":0.0049895428797679334}},{\\\"point\\\":{\\\"x\\\":593.757,\\\"y\\\":517.473,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875521534511,\\\"y\\\":0.0049895428797679265}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":455.709,\\\"y\\\":605.987,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128451255215488,\\\"y\\\":0.7013214862102595}},{\\\"point\\\":{\\\"x\\\":264.212,\\\"y\\\":606.007,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698683800256648,\\\"y\\\":0.7154306026854935}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":642.164,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hands_pair\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":48.131262457592456,\\\"max\\\":671.8696504755745},\\\"y\\\":{\\\"min\\\":64.84074212802682,\\\"max\\\":657.2070612272415}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hands_pair\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hands_pair\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#13F30A84-193E-47E3-BAAC-AE10ED73DE8E_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 540.224 C 360.000 554.341 348.527 672.227 518.534 651.799 C 664.232 634.292 668.644 508.347 669.825 489.147 C 670.829 472.820 654.627 384.551 648.853 354.814 C 643.583 327.677 644.543 273.869 633.038 265.867 C 624.322 259.803 601.212 274.630 596.809 286.246 C 590.208 303.666 591.513 330.035 591.032 336.048 C 589.044 360.900 603.290 452.824 603.287 452.836 C 603.287 452.835 569.604 456.472 556.837 460.785 C 547.021 464.100 524.602 477.323 524.599 477.325 C 524.602 477.323 545.587 464.124 554.872 460.802 C 567.350 456.338 600.482 452.593 600.486 452.592 C 600.482 452.558 562.359 120.380 557.098 109.764 C 555.308 106.151 547.782 86.336 532.544 86.955 C 519.614 87.480 514.008 100.818 512.496 103.561 C 506.100 115.163 523.079 324.899 523.081 324.910 C 523.078 324.899 507.850 109.269 504.047 93.036 C 503.108 89.028 499.056 66.582 482.028 66.843 C 465.608 67.095 458.976 89.885 458.432 94.197 C 455.856 114.588 465.722 325.999 465.719 326.010 C 465.721 325.999 456.626 127.015 452.686 114.138 C 451.719 110.976 443.473 95.548 431.194 97.016 C 419.682 98.392 410.772 117.763 409.253 121.406 C 405.342 130.790 413.082 342.087 413.082 342.100 C 413.082 342.091 408.329 185.836 405.904 174.413 C 404.873 169.556 395.583 154.903 383.646 155.515 C 372.176 156.103 360.255 174.732 360.243 178.695 C 360.065 235.144 360.000 500.174 360.000 540.224 C 360.000 554.398 372.300 672.059 201.466 653.157 C 55.610 637.018 51.356 509.704 50.176 490.504 C 49.171 474.177 65.373 385.908 71.147 356.171 C 76.417 329.034 75.457 275.226 86.962 267.224 C 95.678 261.160 118.789 275.987 123.191 287.603 C 129.793 305.023 128.487 331.392 128.968 337.405 C 130.955 362.257 116.710 454.182 116.713 454.193 C 116.713 454.193 150.465 456.444 163.163 460.770 C 173.145 464.171 195.398 478.681 195.402 478.682 C 195.399 478.681 174.586 464.203 165.128 460.787 C 152.723 456.307 119.518 453.950 119.514 453.949 C 119.518 453.915 157.641 121.737 162.902 111.121 C 164.692 107.508 172.218 87.693 187.456 88.312 C 200.386 88.838 205.992 102.175 207.504 104.918 C 213.901 116.520 196.921 326.256 196.919 326.267 C 196.922 326.256 212.150 110.626 215.953 94.393 C 216.892 90.384 220.944 67.940 237.972 68.201 C 254.392 68.453 261.024 91.242 261.568 95.554 C 264.144 115.945 254.278 327.356 254.281 327.368 C 254.279 327.356 263.374 128.372 267.314 115.495 C 268.281 112.333 276.527 96.905 288.806 98.373 C 300.317 99.749 309.228 119.120 310.747 122.763 C 314.658 132.147 306.918 343.444 306.918 343.458 C 306.918 343.449 311.671 187.193 314.096 175.770 C 315.127 170.913 324.417 156.261 336.354 156.873 C 347.824 157.461 359.745 176.089 359.757 180.052 C 359.932 236.289 360.000 500.174 360.000 540.224 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":147.6,\\\"max\\\":572.4},\\\"y\\\":{\\\"min\\\":254.74,\\\"max\\\":543.657}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":685.952,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":59.273,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":51.498,\\\"y\\\":488.928,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872946144645,\\\"y\\\":0.005040893734668171}},{\\\"point\\\":{\\\"x\\\":668.502,\\\"y\\\":488.928,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872946144645,\\\"y\\\":0.00504089373466816}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":564.031,\\\"y\\\":638.353,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7012291515375763,\\\"y\\\":0.712935955772951}},{\\\"point\\\":{\\\"x\\\":155.882,\\\"y\\\":641.831,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6984924366045455,\\\"y\\\":0.7156174369076294}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"13F30A84-193E-47E3-BAAC-AE10ED73DE8E_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"51.42%\\\",\\\"r\\\":\\\"100.69%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"39.22%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"handshake\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":6.447596035636888,\\\"max\\\":715.7041230064607},\\\"y\\\":{\\\"min\\\":30.11737049453511,\\\"max\\\":537.1137207320655}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"handshake\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"handshake\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 8.578 182.349 C 10.925 252.312 46.766 275.520 78.376 314.430 C 97.215 303.252 111.520 287.401 136.461 285.250 C 147.249 284.320 157.355 292.470 160.897 296.298 C 172.057 308.359 168.338 334.782 168.338 334.786 C 177.600 326.090 205.715 297.231 216.745 290.928 C 225.398 285.983 250.852 280.106 261.265 290.585 C 281.809 311.258 261.135 350.491 261.135 350.497 C 267.066 344.161 294.817 341.784 305.497 355.284 C 318.708 371.982 298.474 416.691 298.474 416.697 C 303.793 410.817 323.822 407.931 340.860 418.249 C 359.005 429.236 354.536 456.141 328.429 494.230 C 345.175 505.127 385.507 527.027 441.234 521.692 C 472.772 518.672 466.385 483.095 466.387 483.091 C 466.393 483.092 507.029 500.638 524.537 484.879 C 544.814 466.627 537.769 444.204 537.771 444.200 C 537.776 444.200 573.048 453.562 587.579 438.884 C 606.648 419.622 600.969 393.079 600.971 393.074 C 600.975 393.073 635.785 393.852 645.858 380.759 C 652.895 371.613 660.787 336.926 647.856 315.769 C 647.843 315.760 557.184 258.200 511.848 229.416 C 467.487 211.522 445.901 184.840 404.869 163.263 C 381.379 150.911 347.225 120.038 334.249 134.745 C 307.806 164.716 230.583 234.352 193.129 183.668 C 179.776 165.599 280.205 57.384 280.208 57.353 C 285.139 51.718 193.680 22.855 117.017 35.126 C 85.040 40.245 4.778 69.052 8.578 182.349 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 466.387 483.091 C 434.970 465.577 403.553 448.063 372.136 430.549 M 537.771 444.200 C 497.530 416.714 457.289 389.228 417.049 361.742 M 600.971 393.074 C 552.854 361.922 504.737 330.770 456.621 299.618 M 8.578 182.349 C 10.925 252.312 46.766 275.520 78.376 314.430 C 97.215 303.252 111.520 287.401 136.461 285.250 C 147.249 284.320 157.355 292.470 160.897 296.298 C 172.057 308.359 168.338 334.782 168.338 334.786 C 177.600 326.090 205.715 297.231 216.745 290.928 C 225.398 285.983 250.852 280.106 261.265 290.585 C 281.809 311.258 261.135 350.491 261.135 350.497 C 267.066 344.161 294.817 341.784 305.497 355.284 C 318.708 371.982 298.474 416.691 298.474 416.697 C 303.793 410.817 323.822 407.931 340.860 418.249 C 359.005 429.236 354.536 456.141 328.429 494.230 C 345.175 505.127 385.507 527.027 441.234 521.692 C 472.772 518.672 466.385 483.095 466.387 483.091 C 466.393 483.092 507.029 500.638 524.537 484.879 C 544.814 466.627 537.769 444.204 537.771 444.200 C 537.776 444.200 573.048 453.562 587.579 438.884 C 606.648 419.622 600.969 393.079 600.971 393.074 C 600.975 393.073 635.785 393.852 645.858 380.759 C 652.895 371.613 660.787 336.926 647.856 315.769 C 647.843 315.760 557.184 258.200 511.848 229.416 C 467.487 211.522 445.901 184.840 404.869 163.263 C 381.379 150.911 347.225 120.038 334.249 134.745 C 307.806 164.716 230.583 234.352 193.129 183.668 C 179.776 165.599 280.205 57.384 280.208 57.353 C 285.139 51.718 193.680 22.855 117.017 35.126 C 85.040 40.245 4.778 69.052 8.578 182.349 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 404.869 163.263 C 445.901 184.840 467.487 211.522 511.848 229.416 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 511.848 229.416 C 557.184 258.200 647.843 315.760 647.856 315.769 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 280.208 57.353 C 280.205 57.384 179.776 165.599 193.129 183.668 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 193.129 183.668 C 230.583 234.352 307.806 164.716 334.249 134.745 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 334.249 134.745 C 347.225 120.038 381.379 150.911 404.869 163.263 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 404.869 163.263 C 445.901 184.840 467.487 211.522 511.848 229.416 C 557.184 258.200 647.843 315.760 647.856 315.769 C 647.862 315.763 691.490 282.732 701.011 263.188 C 719.716 224.789 714.963 149.739 704.547 121.874 C 681.092 59.127 623.020 35.516 561.604 33.408 C 537.087 32.567 504.891 42.383 449.174 42.600 C 417.831 42.722 313.120 39.648 288.355 53.012 C 287.493 53.478 280.209 57.352 280.208 57.353 C 280.205 57.384 179.776 165.599 193.129 183.668 C 230.583 234.352 307.806 164.716 334.249 134.745 C 347.225 120.038 381.379 150.911 404.869 163.263 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 511.848 229.416 C 525.195 234.800 585.493 222.238 585.501 222.237 M 404.869 163.263 C 445.901 184.840 467.487 211.522 511.848 229.416 C 557.184 258.200 647.843 315.760 647.856 315.769 C 647.862 315.763 691.490 282.732 701.011 263.188 C 719.716 224.789 714.963 149.739 704.547 121.874 C 681.092 59.127 623.020 35.516 561.604 33.408 C 537.087 32.567 504.891 42.383 449.174 42.600 C 417.831 42.722 313.120 39.648 288.355 53.012 C 287.493 53.478 280.209 57.352 280.208 57.353 C 280.205 57.384 179.776 165.599 193.129 183.668 C 230.583 234.352 307.806 164.716 334.249 134.745 C 347.225 120.038 381.379 150.911 404.869 163.263 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.474 416.697 C 303.793 410.817 323.822 407.931 340.860 418.249 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 340.860 418.249 C 359.005 429.236 354.536 456.141 328.429 494.230 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 245.139 529.348 C 225.717 516.933 233.039 484.877 233.038 484.873 C 250.157 478.187 286.900 429.489 298.474 416.697 C 303.793 410.817 323.822 407.931 340.860 418.249 C 359.005 429.236 354.536 456.141 328.429 494.230 C 327.892 495.013 303.414 521.481 291.583 529.470 C 284.097 534.525 260.514 539.176 245.139 529.348 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 305.497 355.284 C 318.708 371.982 298.474 416.691 298.474 416.697 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.474 416.697 C 286.900 429.489 250.157 478.187 233.038 484.873 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 261.135 350.497 C 267.066 344.161 294.817 341.784 305.497 355.284 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 305.497 355.284 C 318.708 371.982 298.474 416.691 298.474 416.697 C 286.900 429.489 250.157 478.187 233.038 484.873 C 223.049 488.774 197.692 501.965 177.905 484.022 C 161.404 469.060 171.125 438.464 171.124 438.460 C 194.318 430.638 240.088 372.982 261.135 350.497 C 267.066 344.161 294.817 341.784 305.497 355.284 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 171.124 438.460 C 194.318 430.638 240.088 372.982 261.135 350.497 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 261.135 350.497 C 261.135 350.491 281.809 311.258 261.265 290.585 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 261.265 290.585 C 250.852 280.106 225.398 285.983 216.745 290.928 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 216.745 290.928 C 205.715 297.231 177.600 326.090 168.338 334.786 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 168.338 334.786 C 158.383 344.133 131.252 380.363 118.025 383.759 C 118.025 383.764 96.781 416.317 115.944 435.430 C 136.526 455.959 160.940 441.894 171.124 438.460 C 194.318 430.638 240.088 372.982 261.135 350.497 C 261.135 350.491 281.809 311.258 261.265 290.585 C 250.852 280.106 225.398 285.983 216.745 290.928 C 205.715 297.231 177.600 326.090 168.338 334.786 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 160.897 296.298 C 172.057 308.359 168.338 334.782 168.338 334.786 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 168.338 334.786 C 158.383 344.133 131.252 380.363 118.025 383.759 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 78.376 314.430 C 97.215 303.252 111.520 287.401 136.461 285.250 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 136.461 285.250 C 147.249 284.320 157.355 292.470 160.897 296.298 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 160.897 296.298 C 172.057 308.359 168.338 334.782 168.338 334.786 C 158.383 344.133 131.252 380.363 118.025 383.759 C 109.422 385.968 84.419 386.780 73.489 373.647 C 66.744 365.542 65.116 343.294 66.426 335.951 C 67.267 331.238 73.453 317.350 78.376 314.430 C 97.215 303.252 111.520 287.401 136.461 285.250 C 147.249 284.320 157.355 292.470 160.897 296.298 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":666.725,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":47.617,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":77.088,\\\"y\\\":310.93,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871186514683,\\\"y\\\":0.005075680361732248}},{\\\"point\\\":{\\\"x\\\":642.912,\\\"y\\\":310.93,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871186514683,\\\"y\\\":0.005075680361732277}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":547.32,\\\"y\\\":439.109,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128787909887463,\\\"y\\\":0.7012872659320312}},{\\\"point\\\":{\\\"x\\\":172.526,\\\"y\\\":439.148,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986858742534463,\\\"y\\\":0.7154285772309471}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":665.637,\\\"y\\\":74.437,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314481500353969,\\\"y\\\":-0.7754181025852277}},{\\\"point\\\":{\\\"x\\\":55.366,\\\"y\\\":74.54,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817310895168949,\\\"y\\\":-0.7316028441621228}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":506.158,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"harp\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":74.90458693436454,\\\"max\\\":645.1120675389463},\\\"y\\\":{\\\"min\\\":24.534211255600543,\\\"max\\\":620.375}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"harp\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"harp\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 263.700 553.151 C 263.700 399.615 263.700 246.079 263.700 92.543 M 291.880 553.151 C 291.880 399.615 291.880 246.079 291.880 92.543 M 320.060 553.151 C 320.060 399.615 320.060 246.079 320.060 92.543 M 348.240 553.151 C 348.240 399.615 348.240 246.079 348.240 92.543 M 460.960 92.543 C 460.960 246.079 460.960 399.615 460.960 553.151 M 432.780 92.543 C 432.780 246.079 432.780 399.615 432.780 553.151 M 404.600 92.543 C 404.600 246.079 404.600 399.615 404.600 553.151 M 376.420 92.543 C 376.420 246.079 376.420 399.615 376.420 553.151 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 259.040 553.151 C 259.040 399.615 259.040 246.079 259.040 92.543 M 287.220 553.151 C 287.220 399.615 287.220 246.079 287.220 92.543 M 315.400 553.151 C 315.400 399.615 315.400 246.079 315.400 92.543 M 343.579 553.151 C 343.579 399.615 343.579 246.079 343.579 92.543 M 456.300 92.543 C 456.300 246.079 456.300 399.615 456.300 553.151 M 428.119 92.543 C 428.119 246.079 428.119 399.615 428.119 553.151 M 399.940 92.543 C 399.940 246.079 399.940 399.615 399.940 553.151 M 371.760 92.543 C 371.760 246.079 371.760 399.615 371.760 553.151 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 223.684 82.462 C 223.711 82.462 496.289 82.462 496.316 82.462 C 496.316 82.464 496.316 104.208 496.316 104.211 C 496.289 104.211 223.711 104.211 223.684 104.211 C 223.684 104.208 223.684 82.464 223.684 82.462 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 641.693 387.820 C 635.514 318.449 595.982 216.512 563.272 167.837 C 642.332 167.343 631.671 89.317 625.755 72.770 C 618.177 51.575 578.407 8.463 513.642 34.813 C 472.596 51.513 446.359 102.341 494.348 182.123 C 568.821 305.936 626.285 529.526 360.000 537.185 C 93.243 530.996 151.178 305.936 225.652 182.123 C 273.641 102.341 247.404 51.513 206.358 34.813 C 141.593 8.463 101.823 51.575 94.245 72.770 C 88.329 89.317 77.669 167.343 156.728 167.837 C 124.018 216.512 84.486 318.449 78.307 387.820 C 62.343 567.031 184.320 615.079 360.000 618.375 C 537.360 614.098 657.657 567.031 641.693 387.820 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 641.693 387.820 C 635.514 318.449 595.982 216.512 563.272 167.837 C 552.581 167.904 530.158 155.126 523.914 127.593 C 513.370 81.106 551.572 61.163 577.178 84.405 C 587.719 93.972 587.255 118.820 566.919 119.757 M 360.000 618.375 C 537.360 614.098 657.657 567.031 641.693 387.820 M 78.307 387.820 C 62.343 567.031 184.320 615.079 360.000 618.375 M 156.728 167.837 C 124.018 216.512 84.486 318.449 78.307 387.820 M 625.755 72.770 C 631.671 89.317 642.332 167.343 563.272 167.837 M 513.642 34.813 C 578.407 8.463 618.177 51.575 625.755 72.770 M 494.348 182.123 C 446.359 102.341 472.596 51.513 513.642 34.813 M 360.000 537.185 C 626.285 529.526 568.821 305.936 494.348 182.123 M 225.652 182.123 C 151.178 305.936 93.243 530.996 360.000 537.185 M 206.358 34.813 C 247.404 51.513 273.641 102.341 225.652 182.123 M 94.245 72.770 C 101.823 51.575 141.593 8.463 206.358 34.813 M 156.728 167.837 C 77.669 167.343 88.329 89.317 94.245 72.770 M 196.086 127.593 C 189.842 155.126 167.419 167.904 156.728 167.837 M 142.822 84.405 C 168.428 61.163 206.630 81.106 196.086 127.593 M 153.081 119.757 C 132.745 118.820 132.281 93.972 142.822 84.405 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":228.128,\\\"max\\\":491.872},\\\"y\\\":{\\\"min\\\":194.722,\\\"max\\\":458.466}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":697.379,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":85.643,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":91.256,\\\"y\\\":327.447,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873250332783,\\\"y\\\":0.0050348557862656355}},{\\\"point\\\":{\\\"x\\\":628.744,\\\"y\\\":327.447,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873229744396,\\\"y\\\":0.005035264681590769}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":553.966,\\\"y\\\":577.61,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128578473018842,\\\"y\\\":0.7013085551596556}},{\\\"point\\\":{\\\"x\\\":165.874,\\\"y\\\":577.65,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986612749143499,\\\"y\\\":0.7154526000617059}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":608.451,\\\"y\\\":51.155,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314674762445839,\\\"y\\\":-0.7754023642247267}},{\\\"point\\\":{\\\"x\\\":112.375,\\\"y\\\":51.24,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.681717156817465,\\\"y\\\":-0.7316158268522571}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":614.949,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"head_beast\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":19.822,\\\"max\\\":691.728},\\\"y\\\":{\\\"min\\\":119.425,\\\"max\\\":558.1179953435507}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"head_beast\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"beast_head\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 323.164 353.878 C 324.204 334.831 340.408 320.305 359.456 321.345 C 378.502 322.385 393.029 338.589 391.990 357.636 C 390.950 376.683 374.745 391.210 355.698 390.170 C 336.651 389.130 322.124 372.926 323.164 353.878 M 93.647 402.348 C 94.050 394.966 100.331 389.335 107.713 389.738 C 115.096 390.141 120.726 396.422 120.323 403.804 C 119.920 411.187 113.639 416.816 106.257 416.413 C 98.875 416.010 93.245 409.730 93.647 402.348 M 363.052 452.486 C 363.045 452.488 284.455 477.328 284.447 477.330 C 284.446 477.328 270.589 457.329 270.587 457.328 C 270.587 457.330 262.989 484.437 262.988 484.439 C 262.984 484.440 225.257 494.075 225.253 494.076 C 225.251 494.073 207.879 466.385 207.878 466.382 C 207.877 466.386 194.970 502.751 194.969 502.754 C 194.966 502.755 160.734 510.707 160.731 510.708 C 160.728 510.705 135.839 478.686 135.837 478.683 C 135.836 478.686 126.850 518.708 126.849 518.712 C 126.843 518.714 73.504 536.633 73.498 536.634 C 73.526 536.637 256.695 563.547 347.483 554.112 C 393.925 549.286 446.672 547.966 483.543 519.320 C 509.221 499.370 525.178 466.499 532.986 434.933 C 538.744 411.650 530.984 362.829 530.984 362.822 C 530.994 362.818 593.700 351.667 631.356 315.860 C 674.402 274.927 689.721 203.443 689.728 203.432 C 689.719 203.441 646.768 254.150 597.636 283.459 C 563.836 303.622 519.485 314.048 519.476 314.052 C 519.477 314.051 515.650 308.414 515.650 308.414 C 515.656 308.408 561.686 291.328 585.551 259.079 C 615.840 218.149 617.829 155.410 617.834 155.400 C 617.826 155.408 587.966 210.210 545.531 241.485 C 514.492 264.362 470.209 274.455 470.202 274.459 C 470.193 274.458 400.467 273.202 383.395 273.707 C 357.774 274.465 295.641 269.419 220.798 296.314 C 135.729 326.883 75.238 383.519 62.435 394.992 C 45.362 412.675 21.826 441.188 21.822 441.193 C 21.828 441.193 83.605 442.781 83.611 442.781 C 83.613 442.785 101.241 488.994 101.242 488.998 C 101.244 488.994 119.593 443.662 119.595 443.658 C 119.599 443.658 159.645 446.734 159.648 446.734 C 159.650 446.739 176.335 486.106 176.337 486.111 C 176.339 486.106 193.598 449.630 193.600 449.627 C 193.603 449.627 230.054 450.658 230.058 450.658 C 230.059 450.660 242.471 481.838 242.471 481.841 C 242.473 481.838 255.002 452.305 255.003 452.302 C 255.013 452.302 363.042 452.486 363.052 452.486 M 466.818 256.670 C 466.809 256.669 415.307 251.240 384.521 253.074 C 352.621 254.974 307.883 258.465 307.875 258.466 C 307.872 258.455 283.775 146.834 283.773 146.823 C 283.779 146.828 349.845 201.167 349.851 201.173 C 349.855 201.165 387.070 121.433 387.074 121.425 C 387.078 121.433 422.790 200.886 422.793 200.894 C 422.800 200.889 487.189 141.263 487.196 141.257 C 487.193 141.269 466.819 256.657 466.818 256.670 M 251.032 372.298 C 251.043 372.300 310.108 406.663 365.932 399.734 C 416.342 393.478 462.451 350.574 462.460 350.569 C 462.450 350.565 410.513 305.109 357.881 308.978 C 299.798 313.249 251.042 372.291 251.032 372.298 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":372.232,\\\"y\\\":604.846,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.0006283510823917064,\\\"y\\\":-0.9999998025874391}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":387.465,\\\"y\\\":128.847,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.0006490227233302284,\\\"y\\\":-0.9999997893847302}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":469.529,\\\"y\\\":528.874,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6600118599085157,\\\"y\\\":0.7512551795362888}},{\\\"point\\\":{\\\"x\\\":222.875,\\\"y\\\":546.984,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7488895706277092,\\\"y\\\":0.6626948098522012}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":535.169,\\\"y\\\":434.433,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9932108048895631,\\\"y\\\":0.11632840173674819}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"head_phrenology\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":90.08014679433343,\\\"max\\\":633.1120516481801},\\\"y\\\":{\\\"min\\\":20.75086622749458,\\\"max\\\":624.5964794610848}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"head_phrenology\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"phrenology_head\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#47064A7C-F8C8-4D53-8E51-F3120895B1FF_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 152.265 287.543 C 155.893 302.166 87.915 385.875 92.282 401.334 C 96.921 417.753 135.455 410.377 140.798 418.976 C 144.362 424.715 139.034 453.375 139.034 453.378 C 139.035 453.379 153.146 465.727 153.147 465.728 C 153.146 465.729 141.681 478.075 141.679 478.077 C 141.684 478.080 158.832 483.132 160.204 493.073 C 162.534 509.965 149.623 520.947 148.736 536.296 C 148.319 543.529 163.214 562.842 169.025 567.169 C 183.531 577.974 244.304 576.911 258.999 587.458 C 273.936 598.178 276.592 618.351 278.406 619.566 C 289.176 626.781 539.451 619.793 535.979 612.359 C 481.604 495.930 502.726 461.460 523.630 433.090 C 538.959 412.285 609.363 393.622 627.718 275.194 C 644.924 164.179 601.982 17.207 376.319 22.912 C 160.850 28.360 134.975 217.857 152.265 287.543 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 187.549 288.425 C 186.165 294.785 188.581 303.261 191.757 310.244 C 215.504 308.320 250.174 300.775 250.178 300.775 C 250.172 300.772 212.134 285.760 191.703 276.999 C 189.442 281.398 188.604 283.578 187.549 288.425 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 187.549 288.425 C 186.165 294.785 188.581 303.261 191.757 310.244 C 183.888 310.882 181.522 313.090 176.817 314.693 M 191.703 276.999 C 189.442 281.398 188.604 283.578 187.549 288.425 M 250.178 300.775 C 250.174 300.775 215.504 308.320 191.757 310.244 M 191.703 276.999 C 212.134 285.760 250.172 300.772 250.178 300.775 M 176.964 268.137 C 176.966 268.138 186.457 274.749 191.703 276.999 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 173.436 254.906 C 173.440 254.906 200.328 258.230 216.658 263.726 C 240.317 271.689 254.883 282.544 273.995 291.954 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 210.826 571.140 C 210.835 571.138 270.885 565.798 305.702 547.077 C 359.560 518.117 412.474 433.983 412.485 433.972 M 148.544 404.985 C 141.175 404.470 136.508 405.983 130.187 405.849 C 127.083 405.784 121.132 404.093 120.509 403.098 C 118.769 400.320 124.342 397.411 148.544 404.985 C 157.412 407.760 152.009 415.417 160.204 416.330 C 165.865 416.961 172.511 411.188 173.436 409.273 C 176.701 402.512 169.215 386.583 165.496 383.692 C 162.547 381.399 144.328 381.928 144.326 381.928 C 144.328 381.928 162.754 381.022 164.711 381.823 C 173.580 385.459 183.839 395.835 187.549 400.452 C 192.615 406.756 199.310 424.563 205.191 436.618 M 153.147 465.728 C 169.613 466.022 202.540 466.610 202.545 466.610 C 202.541 466.608 170.886 454.057 163.732 453.378 C 157.606 452.797 147.333 450.059 139.034 453.378 C 139.035 453.379 153.146 465.727 153.147 465.728 C 153.146 465.729 141.681 478.075 141.679 478.077 C 148.651 480.732 155.870 480.091 169.025 478.077 C 177.375 476.799 191.372 470.432 202.545 466.610 M 196.370 452.496 C 196.372 452.499 207.455 471.744 214.012 478.077 C 220.208 484.061 230.478 488.662 238.711 493.955 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 422.681 328.021 C 422.680 328.019 408.960 312.141 415.900 301.128 C 423.751 288.670 437.838 290.887 445.895 294.462 C 453.239 297.722 459.060 310.653 460.059 318.625 C 462.016 334.228 454.757 361.478 441.729 370.284 C 428.936 378.931 410.070 394.445 410.067 394.447 M 408.401 337.789 C 408.400 337.785 389.327 315.260 399.236 299.462 C 407.585 286.150 421.619 269.930 448.395 275.299 C 461.242 277.875 474.444 298.224 476.724 311.126 C 480.902 334.773 467.679 376.720 445.062 388.615 C 413.734 405.090 410.783 427.893 393.403 423.609 C 376.214 419.372 376.741 396.116 376.739 396.113 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":259.214,\\\"max\\\":528.877},\\\"y\\\":{\\\"min\\\":59.496,\\\"max\\\":270.072}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":403.552,\\\"y\\\":698.633,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":391.455,\\\"y\\\":26.625,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":484.927,\\\"y\\\":619.45,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128916688429446,\\\"y\\\":0.7012741749803149}},{\\\"point\\\":{\\\"x\\\":309.892,\\\"y\\\":619.497,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986838585667321,\\\"y\\\":0.7154305457403275}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":624.426,\\\"y\\\":291.209,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875593437125,\\\"y\\\":0.004988101623372358}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":595.415,\\\"y\\\":111.519,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314452246876364,\\\"y\\\":-0.7754204847817604}},{\\\"point\\\":{\\\"x\\\":188.186,\\\"y\\\":111.588,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6816824025046411,\\\"y\\\":-0.7316482092614597}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":400.966,\\\"y\\\":617.719,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"47064A7C-F8C8-4D53-8E51-F3120895B1FF_0\\\",\\\"cx\\\":\\\"56.00%\\\",\\\"cy\\\":\\\"33.14%\\\",\\\"r\\\":\\\"159.23%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"20.39%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"arm\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"heart\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":84.30632860953916,\\\"max\\\":636.5351384914495},\\\"y\\\":{\\\"min\\\":49.24692767805864,\\\"max\\\":573.59}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"heart\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"heart\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#A91A6A45-F0CD-4DA2-A9A7-335902EE6E2C_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 571.590 C 359.986 571.576 264.512 485.308 215.135 437.833 C 156.142 381.114 87.829 317.946 86.339 229.389 C 85.161 159.389 115.841 76.768 177.971 58.756 C 316.105 18.712 359.982 151.870 360.000 151.879 C 360.018 151.870 403.810 19.007 542.029 58.756 C 604.326 76.672 635.647 159.244 634.505 229.389 C 633.060 318.108 567.079 384.439 504.865 437.833 C 449.824 485.072 360.014 571.576 360.000 571.590 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":228.244,\\\"max\\\":491.756},\\\"y\\\":{\\\"min\\\":171.389,\\\"max\\\":422.633}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":691.105,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":51.737,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":86.84,\\\"y\\\":251.081,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873742953272,\\\"y\\\":0.005025062182389534}},{\\\"point\\\":{\\\"x\\\":634.96,\\\"y\\\":251.081,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.99998737224848,\\\"y\\\":0.0050254694884832325}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":209.002,\\\"y\\\":430.723,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987086530327686,\\\"y\\\":0.7154063308198594}},{\\\"point\\\":{\\\"x\\\":511.528,\\\"y\\\":430.723,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6987086530327686,\\\"y\\\":0.7154063308198594}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":136.18,\\\"y\\\":83.621,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7106239558628789,\\\"y\\\":-0.7035720242830816}},{\\\"point\\\":{\\\"x\\\":582.768,\\\"y\\\":83.621,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7106640765571198,\\\"y\\\":-0.703531499146425}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.961,\\\"y\\\":563.538,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"A91A6A45-F0CD-4DA2-A9A7-335902EE6E2C_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"39.94%\\\",\\\"r\\\":\\\"98.68%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"34.51%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"heart_break\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":80.58662406967167,\\\"max\\\":637.4587347220004},\\\"y\\\":{\\\"min\\\":47.74809444495841,\\\"max\\\":569.238}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"heart_break\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"heart\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#C1C6C282-B53D-4AF3-ADE3-08F50DF0404D_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 380.815 206.593 C 380.813 206.587 363.533 148.545 363.531 148.540 C 363.549 148.530 408.019 16.993 544.903 57.492 C 606.598 75.745 637.059 157.936 635.394 227.548 C 633.289 315.592 567.300 380.927 505.147 433.451 C 450.159 479.919 360.367 565.096 360.353 565.109 C 360.355 565.101 379.736 479.187 379.738 479.178 C 379.733 479.170 336.276 396.676 336.271 396.668 C 336.277 396.660 396.958 322.977 396.965 322.969 C 396.958 322.963 336.277 265.387 336.271 265.381 C 336.275 265.376 380.810 206.598 380.815 206.593 M 353.634 150.670 C 353.635 150.676 366.285 208.481 366.286 208.486 C 366.282 208.492 322.687 267.971 322.682 267.977 C 322.689 267.982 384.278 324.586 384.285 324.592 C 384.279 324.599 324.777 399.239 324.771 399.246 C 324.776 399.254 369.540 481.047 369.544 481.055 C 369.543 481.064 357.083 567.229 357.082 567.238 C 357.068 567.224 261.600 482.386 212.203 435.673 C 153.186 379.863 84.866 317.729 82.659 229.848 C 80.915 160.382 110.687 78.126 172.203 59.740 C 308.974 18.860 353.616 150.661 353.634 150.670 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":691.105,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":51.737,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":79.748,\\\"y\\\":250.932,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875319188488,\\\"y\\\":0.004993596584567539}},{\\\"point\\\":{\\\"x\\\":640.252,\\\"y\\\":250.932,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875319188488,\\\"y\\\":0.0049935965845675}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":204.671,\\\"y\\\":434.632,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986951857902244,\\\"y\\\":0.7154194834875297}},{\\\"point\\\":{\\\"x\\\":514.031,\\\"y\\\":434.632,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6986951857902266,\\\"y\\\":0.7154194834875274}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":130.203,\\\"y\\\":79.689,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7106253481797422,\\\"y\\\":-0.7035706180081854}},{\\\"point\\\":{\\\"x\\\":586.881,\\\"y\\\":79.689,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.710664582767649,\\\"y\\\":-0.7035309878034396}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.961,\\\"y\\\":568.597,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"C1C6C282-B53D-4AF3-ADE3-08F50DF0404D_0\\\",\\\"cx\\\":\\\"50.34%\\\",\\\"cy\\\":\\\"41.52%\\\",\\\"r\\\":\\\"97.05%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"33.33%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"hermit\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":119.5,\\\"max\\\":714.811},\\\"y\\\":{\\\"min\\\":60.517,\\\"max\\\":659.483}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hermit\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hermit_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 239.673 66.940 C 325.998 51.095 334.627 120.386 369.178 166.742 C 384.896 187.836 403.151 206.818 431.788 218.778 C 446.176 224.792 464.493 229.534 486.850 230.729 C 491.608 308.930 485.403 557.958 478.811 621.328 C 99.912 609.180 290.407 80.327 239.673 66.940 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 243.519 102.545 C 248.411 102.841 260.121 104.007 264.489 96.247 C 271.375 84.014 264.539 71.155 254.449 69.515 C 244.874 67.959 233.924 69.379 223.569 71.360 C 225.278 86.775 237.346 99.106 243.519 102.545 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S27\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 227.716 103.060 C 232.846 102.977 237.182 103.266 243.519 102.545 C 249.325 101.884 247.386 94.834 240.601 95.004 C 234.400 95.160 230.110 95.509 223.981 95.479 C 220.038 95.459 221.636 103.159 227.716 103.060 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 223.981 95.479 C 230.110 95.509 234.400 95.160 240.601 95.004 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S26\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 241.457 87.168 C 232.922 87.036 223.601 87.308 218.703 87.133 C 214.530 89.919 217.832 96.008 223.981 95.479 C 230.110 95.509 234.400 95.160 240.601 95.004 C 248.241 94.983 246.687 87.249 241.457 87.168 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 219.143 70.605 C 216.768 70.288 215.235 70.289 212.485 70.687 C 208.211 72.303 210.344 78.549 216.276 78.751 C 217.591 78.761 218.710 78.729 219.810 78.696 C 227.446 79.080 224.355 71.300 219.143 70.605 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 240.713 78.804 C 232.322 78.531 216.039 78.817 216.037 78.817 C 211.769 79.021 212.328 87.032 218.506 86.929 C 226.517 87.076 233.341 86.954 240.043 86.826 C 251.280 87.095 245.453 78.958 240.713 78.804 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S31\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 261.982 85.424 C 267.144 82.309 268.802 74.704 263.891 68.553 C 258.341 61.600 235.403 70.628 223.226 70.092 C 221.565 79.733 237.661 79.743 243.430 77.270 C 242.360 86.543 254.450 89.969 261.982 85.424 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 261.882 63.457 C 332.213 61.747 347.522 115.206 378.848 158.254 C 393.052 177.779 436.305 206.008 436.313 206.014 C 436.318 206.015 466.337 215.768 486.850 216.983 C 489.990 273.994 485.695 455.313 483.378 501.688 C 181.694 485.364 319.349 84.624 261.882 63.457 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 367.714 157.810 C 377.422 102.055 446.010 97.861 461.944 102.634 C 444.036 161.098 492.301 156.925 495.597 219.816 C 498.548 276.111 530.485 493.010 713.811 658.483 C 677.073 658.430 566.871 658.483 566.856 658.483 C 566.845 658.483 456.640 658.483 456.640 658.483 C 456.640 658.483 364.794 658.483 364.794 658.483 C 364.794 364.573 363.597 181.451 367.714 157.810 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 228.768 323.979 C 228.769 323.974 234.626 271.612 234.627 271.607 C 234.628 271.612 250.826 321.759 250.827 321.764 C 250.827 321.759 245.801 269.342 245.800 269.336 C 245.803 269.341 271.353 315.406 271.356 315.411 C 271.354 315.405 256.061 265.018 256.059 265.013 C 256.062 265.017 289.915 305.348 289.919 305.352 C 289.916 305.348 265.177 258.869 265.175 258.864 C 265.179 258.867 306.078 292.021 306.082 292.024 C 306.078 292.020 272.925 251.122 272.921 251.118 C 272.926 251.120 319.405 275.859 319.410 275.862 C 319.406 275.858 279.074 242.005 279.070 242.002 C 279.075 242.004 329.462 257.297 329.467 257.298 C 329.463 257.296 283.398 231.746 283.393 231.743 C 283.399 231.744 335.816 236.769 335.822 236.770 C 335.817 236.768 285.669 220.571 285.664 220.569 C 285.669 220.569 338.031 214.711 338.036 214.711 C 338.031 214.710 285.669 208.852 285.664 208.852 C 285.669 208.850 335.817 192.653 335.822 192.651 C 335.816 192.652 283.399 197.678 283.393 197.678 C 283.398 197.676 329.463 172.125 329.467 172.123 C 329.462 172.124 279.075 187.418 279.070 187.420 C 279.074 187.416 319.406 153.563 319.410 153.560 C 319.405 153.562 272.926 178.301 272.921 178.303 C 272.925 178.299 306.078 137.401 306.082 137.397 C 306.078 137.400 265.179 170.554 265.175 170.557 C 265.178 170.553 289.916 124.074 289.919 124.069 C 289.915 124.073 256.062 164.405 256.059 164.409 C 256.061 164.404 271.354 114.016 271.356 114.011 C 271.353 114.016 245.803 160.081 245.800 160.085 C 245.801 160.080 250.827 107.662 250.827 107.657 C 250.826 107.662 234.628 157.809 234.627 157.814 C 234.626 157.809 228.769 105.448 228.768 105.443 C 228.767 105.448 222.910 157.809 222.909 157.814 C 222.908 157.809 206.710 107.662 206.709 107.657 C 206.709 107.662 211.735 160.080 211.735 160.085 C 211.733 160.081 186.183 114.016 186.180 114.011 C 186.182 114.016 201.475 164.404 201.477 164.409 C 201.473 164.405 167.620 124.073 167.617 124.069 C 167.619 124.074 192.358 170.553 192.361 170.557 C 192.356 170.554 151.458 137.400 151.454 137.397 C 151.457 137.401 184.611 178.299 184.614 178.303 C 184.609 178.301 138.131 153.562 138.126 153.560 C 138.130 153.563 178.462 187.416 178.466 187.420 C 178.461 187.418 128.073 172.124 128.068 172.123 C 128.073 172.125 174.138 197.676 174.142 197.678 C 174.137 197.678 121.720 192.652 121.714 192.651 C 121.719 192.653 171.867 208.850 171.872 208.852 C 171.866 208.852 119.505 214.710 119.500 214.711 C 119.505 214.711 171.866 220.569 171.872 220.569 C 171.867 220.571 121.719 236.768 121.714 236.770 C 121.720 236.769 174.137 231.744 174.142 231.743 C 174.138 231.746 128.073 257.296 128.068 257.298 C 128.073 257.297 178.461 242.004 178.466 242.002 C 178.462 242.005 138.130 275.858 138.126 275.862 C 138.131 275.859 184.609 251.120 184.614 251.118 C 184.611 251.122 151.457 292.020 151.454 292.024 C 151.458 292.021 192.356 258.867 192.360 258.864 C 192.358 258.869 167.619 305.348 167.617 305.352 C 167.620 305.348 201.473 265.017 201.477 265.013 C 201.475 265.018 186.182 315.405 186.180 315.411 C 186.183 315.406 211.733 269.341 211.735 269.336 C 211.735 269.342 206.709 321.759 206.709 321.764 C 206.710 321.759 222.908 271.612 222.909 271.607 C 222.910 271.612 228.767 323.974 228.768 323.979 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 354.386 258.712 C 353.938 250.521 359.520 244.940 360.778 252.791 C 363.551 270.094 373.565 265.460 376.782 276.905 C 379.837 287.770 355.469 278.548 354.386 258.712 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.429 61.517 C 346.430 61.517 355.715 61.517 355.716 61.517 C 355.716 61.577 355.716 657.748 355.716 657.808 C 355.715 657.808 346.430 657.808 346.429 657.808 C 346.429 657.748 346.429 61.577 346.429 61.517 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 338.427 265.177 C 339.830 265.056 358.326 265.133 360.645 265.177 C 378.027 265.509 375.166 277.714 390.820 286.505 C 390.724 288.710 389.923 325.806 389.925 325.806 C 389.926 325.797 368.709 301.365 355.258 300.343 C 354.548 300.289 346.392 300.343 346.391 300.343 C 342.457 300.198 340.334 294.755 344.400 291.552 C 340.688 291.282 337.978 285.362 342.409 282.760 C 338.318 282.831 336.008 275.653 340.418 273.968 C 335.667 273.140 334.147 267.336 338.427 265.177 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 351.080 273.970 C 347.526 273.970 343.972 273.969 340.418 273.968 C 335.667 273.140 334.147 267.336 338.427 265.177 C 339.830 265.056 358.326 265.133 360.645 265.177 C 378.027 265.509 375.166 277.714 390.820 286.505 C 390.724 288.710 389.923 325.806 389.925 325.806 C 389.926 325.797 368.709 301.365 355.258 300.343 C 354.548 300.289 346.392 300.343 346.391 300.343 C 342.457 300.198 340.334 294.755 344.400 291.552 C 347.408 291.479 350.415 291.406 353.423 291.333 M 352.017 282.434 C 348.814 282.543 345.612 282.651 342.409 282.760 C 338.318 282.831 336.008 275.653 340.418 273.968 M 344.400 291.552 C 340.688 291.282 337.978 285.362 342.409 282.760 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 436.313 206.014 C 436.305 206.008 393.052 177.779 378.848 158.254 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S14\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 401.717 207.485 C 401.718 207.485 411.905 210.663 417.513 210.663 C 424.242 210.663 436.313 206.014 436.313 206.014 C 436.305 206.008 393.052 177.779 378.848 158.254 C 377.571 162.200 376.985 166.097 376.985 170.135 C 376.985 175.743 378.548 180.919 380.163 185.931 C 383.634 196.705 394.245 216.194 394.246 216.197 C 394.247 216.196 401.716 207.486 401.717 207.485 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 389.925 325.806 C 388.754 560.110 425.813 619.967 456.640 658.483 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S16\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 378.848 158.254 C 377.571 162.200 376.985 166.097 376.985 170.135 C 376.985 175.743 378.548 180.919 380.163 185.931 C 383.634 196.705 394.245 216.194 394.246 216.197 C 394.247 216.196 401.716 207.486 401.717 207.485 C 401.718 207.485 411.905 210.663 417.513 210.663 C 424.242 210.663 436.313 206.014 436.313 206.014 C 436.225 488.316 512.896 595.844 566.856 658.483 M 378.848 158.254 C 393.052 177.779 436.305 206.008 436.313 206.014 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 387.814 193.478 C 390.729 190.563 396.557 184.735 396.558 184.734 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 390.820 286.505 C 390.724 288.710 389.923 325.806 389.925 325.806 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 390.820 286.505 C 390.923 275.761 391.052 269.174 391.168 260.509 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":180.852,\\\"max\\\":276.087},\\\"y\\\":{\\\"min\\\":166.674,\\\"max\\\":261.91}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":415.668,\\\"y\\\":679.834,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":351.283,\\\"y\\\":48.037,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":13.264,\\\"y\\\":656.805,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005086322062696438,\\\"y\\\":-0.9999870645802748}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"hierophant\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":137.527,\\\"max\\\":639.503},\\\"y\\\":{\\\"min\\\":17.89,\\\"max\\\":676.172}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hierophant\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hierophant_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 219.675 424.293 C 219.704 424.293 504.233 424.294 504.260 424.293 C 506.562 496.330 529.864 675.147 529.867 675.172 C 529.833 675.172 194.102 675.172 194.068 675.172 C 194.070 675.147 219.673 424.318 219.675 424.293 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S28\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 138.527 240.029 C 138.635 240.006 361.946 202.793 361.967 202.789 C 361.990 202.793 585.385 240.031 585.408 240.029 C 584.443 394.528 499.302 500.710 361.967 500.710 C 241.800 500.710 139.599 411.694 138.527 240.029 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S14\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 210.343 220.077 C 210.908 219.959 361.952 194.809 361.967 194.806 C 361.983 194.809 513.576 220.078 513.592 220.077 C 512.937 324.918 455.161 396.972 361.967 396.972 C 280.423 396.972 211.071 336.567 210.343 220.077 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 238.656 215.614 C 239.116 215.518 361.955 195.064 361.967 195.061 C 361.980 195.064 485.266 215.615 485.279 215.614 C 484.746 300.877 437.759 359.476 361.967 359.476 C 295.650 359.476 239.249 310.351 238.656 215.614 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S23\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 351.216 236.568 C 351.218 236.568 372.661 236.568 372.663 236.568 C 372.663 236.609 378.041 642.830 378.041 642.871 C 378.038 642.871 345.813 642.871 345.810 642.871 C 345.810 642.830 351.216 236.609 351.216 236.568 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S24\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 638.503 156.175 C 638.497 156.175 604.293 156.175 586.651 156.175 C 586.667 257.314 586.669 428.272 586.669 428.299 C 586.668 428.299 573.712 428.299 573.711 428.299 C 573.711 428.272 573.713 247.824 573.726 156.175 C 553.795 156.175 521.883 156.175 521.878 156.175 C 521.878 156.174 521.878 143.218 521.878 143.217 C 521.883 143.217 553.795 143.217 573.725 143.217 C 573.723 138.954 573.721 134.499 573.693 130.258 C 558.325 130.258 534.840 130.258 534.836 130.258 C 534.836 130.257 534.836 117.301 534.836 117.300 C 534.840 117.300 558.325 117.300 573.692 117.300 C 573.696 112.929 573.699 108.532 573.691 104.342 C 563.215 104.342 547.797 104.342 547.794 104.342 C 547.794 104.340 547.794 91.385 547.794 91.383 C 547.797 91.383 563.215 91.383 573.691 91.383 C 573.711 79.362 573.711 65.469 573.711 65.467 C 573.712 65.467 586.668 65.467 586.669 65.467 C 586.669 65.469 586.669 83.090 586.662 91.383 C 595.308 91.383 612.583 91.383 612.586 91.383 C 612.586 91.385 612.586 104.340 612.586 104.342 C 612.583 104.342 595.308 104.342 586.662 104.342 C 586.662 108.479 586.663 112.670 586.700 117.300 C 599.541 117.300 625.540 117.300 625.544 117.300 C 625.544 117.301 625.544 130.257 625.544 130.258 C 625.540 130.258 599.541 130.258 586.701 130.258 C 586.700 134.308 586.699 138.398 586.650 143.217 C 604.293 143.217 638.497 143.217 638.503 143.217 C 638.503 143.218 638.503 156.174 638.503 156.175 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 548.603 231.141 C 548.606 231.141 579.199 231.141 579.202 231.141 C 579.202 231.145 579.202 271.936 579.202 271.940 C 579.199 271.940 548.606 271.940 548.603 271.940 C 548.603 271.936 548.603 231.145 548.603 231.141 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 579.202 231.141 C 579.204 231.141 599.599 231.141 599.602 231.141 C 599.602 231.142 599.602 241.339 599.602 241.340 C 599.599 241.340 579.204 241.340 579.202 241.340 C 579.202 241.339 579.202 231.142 579.202 231.141 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 579.202 241.340 C 579.204 241.340 599.599 241.340 599.602 241.340 C 599.602 241.341 599.602 251.539 599.602 251.540 C 599.599 251.540 579.204 251.540 579.202 251.540 C 579.202 251.539 579.202 241.341 579.202 241.340 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 579.202 251.540 C 579.204 251.540 599.599 251.540 599.602 251.540 C 599.602 251.541 599.602 261.739 599.602 261.740 C 599.599 261.740 579.204 261.740 579.202 261.740 C 579.202 261.739 579.202 251.541 579.202 251.540 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 579.202 261.740 C 579.204 261.740 599.599 261.740 599.602 261.740 C 599.602 261.741 599.602 271.939 599.602 271.940 C 599.599 271.940 579.204 271.940 579.202 271.940 C 579.202 271.939 579.202 261.741 579.202 261.740 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 569.003 241.340 C 569.003 241.343 569.003 261.738 569.003 261.740 C 569.003 261.738 569.003 241.343 569.003 241.340 C 569.003 241.340 569.003 241.340 569.003 241.340 M 569.003 261.740 C 569.003 261.740 569.003 261.740 569.003 261.740 C 569.004 261.740 579.201 261.740 579.202 261.740 C 579.202 261.740 579.202 261.740 579.202 261.740 C 579.201 261.740 569.004 261.740 569.003 261.740 C 569.003 261.740 569.003 261.740 569.003 261.740 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S16\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.967 143.341 C 402.775 143.341 410.542 174.497 410.983 192.628 C 411.446 211.705 404.398 246.712 361.464 246.448 C 318.927 246.187 312.414 211.526 312.952 192.628 C 313.468 174.499 321.160 143.341 361.967 143.341 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S16_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.967 126.031 C 402.775 126.031 410.607 157.185 410.983 175.318 C 411.372 194.114 404.267 228.130 361.967 228.130 C 319.667 228.130 312.563 194.114 312.952 175.318 C 313.328 157.185 321.160 126.031 361.967 126.031 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 409.727 138.409 C 411.724 206.288 361.953 225.100 361.949 225.109 C 361.944 225.100 312.174 206.288 314.170 138.409 C 314.170 138.409 409.727 138.409 409.727 138.409 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 402.324 158.220 C 402.321 158.220 374.076 151.000 366.486 158.616 C 366.483 158.618 366.486 195.878 366.486 195.882 C 366.485 195.882 357.413 195.882 357.412 195.882 C 357.412 195.878 357.415 158.618 357.412 158.616 C 349.932 151.430 322.852 159.471 322.848 159.471 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 368.000 169.478 C 368.001 169.477 375.944 162.076 382.218 162.076 C 388.491 162.076 396.434 169.477 396.435 169.478 C 396.434 169.479 388.491 176.879 382.218 176.879 C 375.944 176.879 368.001 169.479 368.000 169.478 M 327.461 169.478 C 327.463 169.477 335.405 162.077 341.678 162.077 C 347.952 162.077 355.895 169.477 355.896 169.478 C 355.895 169.479 347.952 176.879 341.678 176.879 C 335.405 176.879 327.463 169.479 327.461 169.478 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 425.653 310.958 C 425.652 310.943 409.729 154.351 409.727 154.335 C 409.726 154.332 393.803 122.486 393.801 122.482 C 393.801 122.503 393.801 326.864 393.801 326.885 C 393.804 326.883 425.650 310.960 425.653 310.958 M 298.244 310.958 C 298.246 310.943 314.169 154.351 314.170 154.335 C 314.172 154.332 330.095 122.486 330.097 122.482 C 330.097 122.503 330.097 326.864 330.097 326.885 C 330.093 326.883 298.247 310.960 298.244 310.958 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 409.455 155.390 C 380.491 143.425 338.868 145.239 314.403 155.390 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6_2_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.890 37.482 C 361.897 37.488 422.228 44.501 423.887 103.991 C 423.875 103.995 333.285 113.959 299.971 104.111 C 301.565 44.471 361.884 37.488 361.890 37.482 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 325.201 37.921 C 325.203 37.922 341.271 50.798 341.273 50.799 C 342.290 60.781 355.402 57.869 349.980 45.935 C 350.480 45.244 361.900 18.892 361.901 18.890 C 361.902 18.892 373.807 45.932 373.808 45.935 C 368.365 57.876 381.486 60.810 382.508 50.837 C 387.835 47.176 398.582 38.000 398.584 37.999 C 398.584 38.000 387.228 94.380 384.767 97.946 C 372.747 88.874 349.221 90.380 339.091 98.087 C 336.560 93.792 325.202 37.923 325.201 37.921 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 290.623 75.845 C 290.625 75.846 302.255 85.564 302.257 85.565 C 302.918 108.918 327.349 93.505 317.198 77.752 C 318.381 71.833 320.506 60.221 320.506 60.220 C 320.508 60.221 332.141 73.068 332.142 73.069 C 328.431 94.099 360.969 94.826 352.793 68.153 C 355.626 62.382 361.808 50.390 361.809 50.389 C 361.809 50.390 370.897 68.106 370.898 68.108 C 362.850 94.819 395.381 93.925 391.564 72.959 C 395.011 68.753 403.140 60.093 403.141 60.092 C 403.142 60.093 406.531 77.564 406.531 77.566 C 396.462 93.327 420.967 108.612 421.488 85.336 C 424.775 82.251 433.052 75.632 433.053 75.631 C 433.052 75.637 417.313 125.683 415.550 130.494 C 382.962 116.953 335.973 119.253 308.515 130.902 C 306.868 125.247 290.625 75.851 290.623 75.845 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_3\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.630 103.858 C 298.631 103.859 308.938 113.606 308.939 113.607 C 309.417 134.932 331.906 119.940 322.225 105.832 C 323.232 99.903 325.201 88.309 325.201 88.307 C 325.202 88.309 335.505 101.185 335.506 101.186 C 331.906 119.940 361.890 119.940 353.856 96.322 C 356.452 90.596 361.900 78.581 361.901 78.579 C 361.902 78.581 369.932 96.319 369.933 96.321 C 361.890 119.939 391.875 119.939 388.275 101.224 C 391.514 97.190 398.583 88.386 398.584 88.385 C 398.584 88.387 401.555 105.866 401.556 105.868 C 391.875 119.940 414.364 134.932 414.820 113.675 C 417.893 110.786 425.112 104.000 425.113 103.999 C 425.112 104.003 416.600 132.469 412.722 145.040 C 411.150 150.204 409.929 154.087 409.455 155.390 C 380.491 143.425 338.868 145.239 314.403 155.390 C 313.971 153.860 312.763 149.856 311.235 144.868 C 307.300 131.938 298.631 103.863 298.630 103.858 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 311.235 144.868 C 312.763 149.856 313.971 153.860 314.403 155.390 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.403 155.390 C 338.868 145.239 380.491 143.425 409.455 155.390 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 409.455 155.390 C 409.929 154.087 411.150 150.204 412.722 145.040 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S30\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 412.722 145.040 C 381.829 132.188 337.386 134.102 311.235 144.868 C 312.763 149.856 313.971 153.860 314.403 155.390 C 338.868 145.239 380.491 143.425 409.455 155.390 C 409.929 154.087 411.150 150.204 412.722 145.040 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S25\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 180.000 163.748 C 179.999 163.747 169.801 163.748 169.800 163.748 C 169.800 162.225 169.800 159.180 169.800 159.179 C 169.800 159.178 159.602 159.179 159.601 159.179 C 159.601 159.182 159.601 189.142 159.601 189.145 C 159.601 189.148 159.638 209.375 159.601 219.523 C 159.600 219.523 149.646 220.133 149.645 220.134 C 149.644 220.134 139.202 220.377 139.201 220.378 C 139.178 224.426 139.150 240.607 139.150 240.607 C 139.155 240.607 180.160 240.607 180.164 240.607 C 180.164 240.732 180.000 163.755 180.000 163.748 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S25\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 169.800 163.748 C 169.800 163.751 169.800 191.386 169.800 198.498 M 180.000 163.748 C 179.999 163.747 169.801 163.748 169.800 163.748 C 169.800 162.225 169.800 159.180 169.800 159.179 C 169.800 159.178 159.602 159.179 159.601 159.179 C 159.601 159.182 159.601 189.142 159.601 189.145 C 159.601 189.148 159.638 209.375 159.601 219.523 C 159.600 219.523 149.646 220.133 149.645 220.134 C 149.644 220.134 139.202 220.377 139.201 220.378 C 139.178 224.426 139.150 240.607 139.150 240.607 C 139.155 240.607 180.160 240.607 180.164 240.607 C 180.164 240.732 180.000 163.755 180.000 163.748 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 159.601 219.523 C 159.638 209.375 159.601 189.148 159.601 189.145 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 149.645 220.134 C 149.646 220.133 159.600 219.523 159.601 219.523 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S26\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 159.601 219.523 C 159.638 209.375 159.601 189.148 159.601 189.145 C 156.160 189.275 149.280 189.535 149.278 189.535 C 149.278 189.536 149.645 220.131 149.645 220.134 C 149.646 220.133 159.600 219.523 159.601 219.523 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 139.201 220.378 C 139.202 220.377 149.644 220.134 149.645 220.134 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 149.645 220.134 C 149.645 220.131 149.278 189.536 149.278 189.535 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S27\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 139.201 189.779 C 139.201 189.782 139.201 220.374 139.201 220.378 C 139.202 220.377 149.644 220.134 149.645 220.134 C 149.645 220.131 149.278 189.536 149.278 189.535 C 149.277 189.535 139.202 189.779 139.201 189.779 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S31\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 153.855 241.161 C 165.750 240.820 182.599 241.143 182.602 241.143 C 182.602 241.138 186.992 185.022 186.992 185.016 C 186.991 185.017 178.310 184.499 176.888 190.457 C 175.274 197.221 174.544 204.096 173.777 209.710 C 165.136 212.127 150.866 206.787 153.855 241.161 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":234.2,\\\"max\\\":485.8},\\\"y\\\":{\\\"min\\\":230.214,\\\"max\\\":655.731}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":685.547,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":580.05,\\\"y\\\":76.484,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":11.884,\\\"y\\\":645.105,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.005077866686207373,\\\"y\\\":-0.9999871075518508}},{\\\"point\\\":{\\\"x\\\":708.116,\\\"y\\\":645.105,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005077866686207499,\\\"y\\\":-0.9999871075518508}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"horse\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":27.950825890703815,\\\"max\\\":683.489},\\\"y\\\":{\\\"min\\\":102.05258167121329,\\\"max\\\":658.9796007087407}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"horse\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"horse\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#E57794F6-24ED-4944-A682-C0151A6EF128_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 42.183 248.617 C 42.234 250.215 43.115 252.151 41.600 252.661 C 39.343 253.421 38.506 249.964 38.225 247.600 C 37.923 245.061 37.970 241.290 40.520 241.483 C 45.351 241.848 42.091 245.751 42.183 248.617 M 30.909 106.283 C 30.910 106.285 45.881 129.793 45.883 129.795 C 45.882 129.798 38.230 153.343 38.229 153.346 C 38.230 153.346 42.961 157.441 42.962 157.441 C 42.961 157.449 33.260 234.916 33.259 234.924 C 33.259 234.924 30.042 239.059 29.965 241.731 C 29.321 264.101 50.832 265.611 51.682 263.712 C 52.070 262.843 57.754 242.975 57.754 242.975 C 57.754 242.978 55.815 266.310 55.815 266.312 C 55.816 266.312 62.709 264.635 64.183 263.786 C 67.425 261.920 76.954 252.120 77.716 250.140 C 78.508 248.084 76.727 230.214 76.726 230.212 C 76.728 230.211 88.446 216.575 88.447 216.573 C 88.449 216.573 97.936 220.890 106.548 211.967 C 120.322 197.696 113.609 167.549 113.610 167.545 C 113.610 167.548 120.840 191.446 115.399 202.989 C 112.359 209.439 135.479 218.848 145.766 263.502 C 146.473 266.569 141.021 280.457 144.093 296.746 C 147.102 312.696 157.450 320.809 158.088 325.400 C 158.622 329.238 152.991 341.507 153.668 351.692 C 154.832 369.202 168.344 395.113 168.345 395.118 C 168.341 395.121 140.445 416.836 129.082 426.445 C 122.035 432.405 107.138 441.813 105.825 447.172 C 103.940 454.862 112.987 470.773 123.813 488.093 C 127.155 493.440 130.955 526.307 135.404 533.872 C 138.181 538.594 151.048 551.325 156.329 554.622 C 162.849 558.694 190.802 566.255 190.805 566.256 C 190.805 566.253 193.420 548.411 190.699 540.889 C 187.800 532.874 173.400 520.125 173.398 520.123 C 173.397 520.124 160.860 524.793 159.828 524.710 C 153.867 524.229 158.258 514.183 157.053 511.132 C 154.410 504.438 145.293 496.464 140.412 485.683 C 136.210 476.402 133.286 460.498 133.285 460.496 C 133.291 460.492 195.647 425.811 195.653 425.807 C 195.654 425.808 205.629 428.483 205.630 428.483 C 205.632 428.486 210.284 440.699 216.601 451.993 C 221.068 459.979 226.630 467.352 226.631 467.353 C 226.632 467.356 234.923 499.908 234.921 499.934 C 234.920 499.941 232.194 504.632 232.237 508.099 C 232.373 518.899 243.210 532.513 243.211 532.515 C 243.212 532.520 251.588 585.928 251.589 585.933 C 251.588 585.935 246.561 590.561 245.292 596.832 C 244.375 601.368 246.236 605.887 246.236 605.888 C 246.234 605.889 231.635 614.341 228.166 617.741 C 222.922 622.881 210.162 644.993 210.160 644.996 C 210.163 644.997 222.196 649.050 233.731 648.521 C 248.194 647.858 262.689 641.153 262.692 641.152 C 262.692 641.151 268.107 629.178 268.063 625.728 C 268.026 622.883 263.272 617.844 263.480 613.063 C 263.962 601.966 268.162 613.682 273.446 613.021 C 279.470 612.268 279.753 604.842 279.753 604.841 C 279.752 604.837 268.689 558.687 268.688 558.682 C 268.688 558.679 264.023 526.090 264.022 526.086 C 264.023 526.085 266.617 514.050 266.679 511.579 C 266.888 503.269 259.256 466.882 258.321 462.691 C 257.691 459.866 249.533 430.437 249.532 430.434 C 249.529 430.434 220.171 424.336 220.168 424.336 C 220.171 424.336 249.118 429.207 249.121 429.208 C 249.129 429.207 289.221 434.915 329.749 427.964 C 380.722 419.221 422.107 395.735 425.646 394.948 C 426.869 394.675 460.420 390.524 460.423 390.523 C 460.420 390.524 425.860 395.998 425.857 395.999 C 425.857 396.002 423.020 412.422 427.958 424.307 C 435.721 442.994 463.532 460.463 463.709 469.684 C 463.881 478.690 430.683 515.418 430.680 515.423 C 430.676 515.426 405.979 538.585 396.391 548.634 C 391.436 553.827 390.730 575.977 390.172 578.106 C 389.891 579.179 385.704 588.483 385.703 592.620 C 385.701 602.068 397.616 625.183 397.617 625.186 C 397.619 625.185 408.001 620.186 413.934 613.590 C 419.884 606.973 423.768 596.087 423.769 596.085 C 423.768 596.082 412.409 581.380 414.599 569.849 C 416.533 559.673 425.046 561.883 427.234 558.019 C 429.346 554.290 428.238 544.541 430.790 541.696 C 445.212 525.617 482.597 487.915 502.375 485.248 C 505.031 484.890 509.696 472.168 498.968 463.409 C 481.492 449.140 491.416 426.919 491.416 426.915 C 491.413 426.912 464.156 391.559 464.153 391.556 C 464.156 391.559 490.906 425.968 490.909 425.971 C 490.912 425.973 523.184 442.527 526.421 445.261 C 528.744 447.223 537.155 462.374 544.635 467.835 C 553.821 474.541 568.728 478.038 570.293 482.979 C 573.921 494.427 594.981 528.744 597.474 537.375 C 600.418 547.574 607.106 603.336 604.114 608.920 C 603.340 610.366 591.915 616.523 589.060 619.858 C 583.817 625.981 574.393 650.717 574.392 650.720 C 574.394 650.721 586.815 656.799 595.256 656.975 C 605.049 657.179 619.688 650.531 619.691 650.531 C 619.691 650.529 621.442 636.029 621.442 636.027 C 621.442 636.027 626.296 632.688 626.855 630.569 C 628.055 626.018 620.494 618.929 621.053 615.115 C 623.067 601.392 635.063 615.741 634.761 607.282 C 633.445 570.434 624.956 580.855 614.615 520.090 C 612.842 509.668 613.222 475.873 609.877 470.280 C 607.797 466.802 591.531 460.447 584.733 451.962 C 571.958 436.016 560.364 422.889 563.367 397.541 C 565.152 382.470 577.305 389.835 586.724 349.880 C 591.756 328.532 586.420 277.410 586.420 277.403 C 586.422 277.404 606.890 289.428 610.584 296.630 C 625.786 326.264 589.075 342.051 600.395 423.285 C 606.595 467.770 650.034 512.313 681.489 516.722 C 652.223 480.859 658.863 447.571 652.803 408.720 C 646.353 367.366 662.868 327.309 636.994 293.046 C 620.651 271.406 570.953 260.256 570.946 260.253 C 570.940 260.251 537.750 236.699 505.610 235.159 C 480.181 233.941 458.565 242.222 405.127 254.605 C 365.293 263.835 328.682 255.219 312.683 246.838 C 298.860 239.597 263.828 179.607 246.187 161.047 C 224.267 137.985 178.668 103.799 130.558 104.054 C 90.877 104.265 58.148 118.851 58.141 118.853 C 58.139 118.852 50.196 112.112 43.941 109.416 C 39.023 107.296 30.910 106.284 30.909 106.283 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 56.046 164.173 C 60.201 164.156 63.567 167.493 63.584 171.648 C 63.602 175.802 60.264 179.168 56.110 179.186 C 51.955 179.203 48.589 175.866 48.572 171.711 C 48.554 167.556 51.892 164.190 56.046 164.173 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":173.557,\\\"max\\\":561.307},\\\"y\\\":{\\\"min\\\":262.696,\\\"max\\\":394.202}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":682.761,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":61.437,\\\"y\\\":117.295,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.0002962304543059183,\\\"y\\\":-0.999999956123758}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":363.04,\\\"y\\\":258.492,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.12456336788446981,\\\"y\\\":-0.9922116545280438}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":39.848,\\\"y\\\":149.141,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9699024360631261,\\\"y\\\":-0.24349386957131725}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"E57794F6-24ED-4944-A682-C0151A6EF128_0\\\",\\\"cx\\\":\\\"48.12%\\\",\\\"cy\\\":\\\"40.26%\\\",\\\"r\\\":\\\"154.53%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"15.69%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"horse_bottom\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":103.89147398780625,\\\"max\\\":636.4262378890821},\\\"y\\\":{\\\"min\\\":361.474,\\\"max\\\":692.2176509469035}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"horse_bottom\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"horse_bottom\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 155.722 363.474 C 300.003 363.474 444.284 363.474 588.564 363.474 C 587.856 371.307 588.258 380.069 586.441 386.974 C 576.013 426.625 564.897 419.524 563.114 434.576 C 560.114 459.893 571.694 473.003 584.454 488.929 C 591.243 497.404 607.488 503.751 609.566 507.225 C 612.907 512.811 612.480 546.572 614.298 556.972 C 624.501 615.320 632.976 605.179 634.419 640.582 C 634.763 649.029 622.740 634.700 620.729 648.406 C 620.170 652.215 627.721 659.294 626.523 663.840 C 625.965 665.957 621.117 669.291 621.117 669.292 C 621.117 669.293 619.368 683.776 619.368 683.777 C 619.365 683.778 604.744 690.418 594.963 690.213 C 586.533 690.037 574.127 683.967 574.125 683.966 C 574.127 683.963 583.539 659.258 588.775 653.142 C 591.626 649.812 603.042 643.666 603.811 642.218 C 606.634 636.899 599.991 583.927 597.178 574.236 C 594.677 565.620 573.655 531.342 570.032 519.908 C 568.468 514.973 553.579 511.480 544.405 504.782 C 536.934 499.328 528.534 484.197 526.214 482.237 C 522.981 479.507 490.749 462.973 490.746 462.971 C 490.743 462.968 464.026 428.602 464.023 428.598 C 464.026 428.602 491.249 463.910 491.252 463.914 C 491.253 463.917 481.164 487.343 499.664 499.494 C 513.654 508.682 511.450 524.127 508.278 524.780 C 488.039 528.946 446.050 562.285 430.702 578.552 C 428.082 581.328 429.259 591.998 427.150 594.854 C 424.515 598.422 416.462 596.506 414.531 606.670 C 412.343 618.186 423.689 632.871 423.690 632.873 C 423.689 632.875 419.507 643.487 413.866 650.356 C 406.915 658.822 394.967 666.279 394.965 666.281 C 394.964 666.277 385.154 639.758 385.671 629.413 C 385.877 625.286 389.902 616.000 390.135 614.916 C 390.641 612.551 389.301 588.528 393.740 582.007 C 401.994 569.883 428.851 549.709 428.855 549.706 C 428.859 549.702 468.079 520.598 468.791 511.840 C 469.631 501.494 437.396 481.998 427.873 461.309 C 422.627 449.912 424.038 433.907 424.038 433.904 C 424.042 433.904 460.295 427.568 460.299 427.567 C 460.295 427.568 425.112 433.413 423.827 433.723 C 420.384 434.554 379.632 456.667 329.786 464.961 C 289.275 471.702 249.267 466.203 249.259 466.203 C 249.256 466.203 220.345 461.338 220.342 461.337 C 220.345 461.338 249.667 467.428 249.670 467.428 C 249.671 467.432 257.818 496.823 258.448 499.645 C 259.382 503.830 267.003 540.173 266.795 548.472 C 266.733 550.940 264.142 562.960 264.142 562.962 C 264.142 562.965 268.801 595.513 268.802 595.517 C 268.803 595.521 279.852 641.614 279.853 641.619 C 279.853 641.620 279.570 649.036 273.554 649.789 C 268.276 650.449 264.081 638.747 263.600 649.830 C 263.393 654.605 268.087 659.639 268.177 662.479 C 268.297 666.272 262.813 679.620 262.813 679.621 C 262.810 679.622 248.334 686.319 233.888 686.981 C 222.367 687.509 210.349 683.461 210.347 683.460 C 210.348 683.457 222.926 659.934 228.330 654.502 C 231.752 651.063 246.376 642.665 246.378 642.663 C 246.377 642.662 244.519 638.150 245.435 633.619 C 246.702 627.356 251.723 622.735 251.724 622.734 C 251.723 622.729 243.358 569.387 243.357 569.382 C 243.356 569.380 232.532 555.784 232.396 544.997 C 232.353 541.534 235.076 536.849 235.076 536.842 C 235.078 536.815 226.798 504.305 226.797 504.301 C 226.796 504.300 221.241 496.937 216.779 488.961 C 210.470 477.680 205.824 465.482 205.822 465.480 C 205.821 465.480 195.859 462.808 195.858 462.807 C 195.851 462.811 133.573 497.449 133.567 497.452 C 133.568 497.455 136.488 513.339 140.685 522.608 C 145.560 533.376 154.666 541.340 157.306 548.026 C 158.509 551.073 154.124 561.107 160.077 561.587 C 161.107 561.670 173.629 557.006 173.630 557.006 C 173.632 557.008 188.014 569.741 190.910 577.746 C 193.628 585.258 191.016 603.079 191.016 603.081 C 191.012 603.080 163.095 595.529 156.582 591.462 C 151.308 588.168 138.457 575.453 135.684 570.738 C 131.240 563.182 127.444 530.356 124.106 525.015 C 113.294 507.717 104.259 491.826 106.141 484.145 C 107.453 478.793 122.331 469.397 129.369 463.445 C 140.718 453.847 168.580 432.159 168.584 432.156 C 168.582 432.152 155.953 406.194 153.924 388.784 C 152.800 379.135 155.722 363.477 155.722 363.474 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":363.681,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":363.55,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\"]}},{\\\"name\\\":\\\"horse_fore\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":28.360895568642515,\\\"max\\\":362.057},\\\"y\\\":{\\\"min\\\":134.2415909796156,\\\"max\\\":682.0804999787528}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"horse_fore\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"horse_fore\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.986 290.269 C 359.993 339.304 359.996 398.194 360.057 452.727 C 350.746 455.434 340.477 457.917 329.786 459.750 C 289.309 466.693 249.267 460.992 249.259 460.992 C 249.256 460.992 220.345 456.127 220.342 456.126 C 220.345 456.127 249.667 462.217 249.670 462.217 C 249.671 462.221 257.818 491.612 258.448 494.434 C 259.382 498.619 267.003 534.962 266.795 543.261 C 266.733 545.729 264.142 557.749 264.142 557.750 C 264.142 557.754 268.801 590.302 268.802 590.306 C 268.803 590.310 279.852 636.403 279.853 636.408 C 279.853 636.409 279.570 643.825 273.554 644.578 C 268.276 645.238 264.081 633.536 263.600 644.619 C 263.393 649.394 268.141 654.426 268.177 657.268 C 268.222 660.714 262.813 672.672 262.813 672.673 C 262.810 672.674 248.334 679.371 233.888 680.033 C 222.367 680.561 210.349 676.513 210.347 676.512 C 210.348 676.510 223.093 654.425 228.330 649.291 C 231.795 645.895 246.376 637.454 246.378 637.452 C 246.377 637.452 244.519 632.939 245.435 628.408 C 246.702 622.145 251.723 617.524 251.724 617.523 C 251.723 617.518 243.358 564.176 243.357 564.171 C 243.356 564.169 232.532 550.573 232.396 539.786 C 232.353 536.323 235.076 531.638 235.076 531.631 C 235.078 531.604 226.798 499.094 226.797 499.090 C 226.796 499.089 221.241 491.726 216.779 483.750 C 210.470 472.469 205.824 460.271 205.822 460.269 C 205.821 460.269 195.859 457.597 195.858 457.596 C 195.851 457.600 133.573 492.238 133.567 492.241 C 133.568 492.244 136.488 508.128 140.685 517.397 C 145.560 528.165 154.666 536.129 157.306 542.815 C 158.509 545.862 154.124 555.896 160.077 556.376 C 161.107 556.459 173.629 551.795 173.630 551.795 C 173.632 551.797 188.014 564.530 190.910 572.535 C 193.628 580.047 191.016 597.867 191.016 597.870 C 191.012 597.869 163.095 590.318 156.582 586.251 C 151.308 582.957 138.457 570.242 135.684 565.527 C 131.240 557.971 127.444 525.145 124.106 519.804 C 113.294 502.506 104.259 486.615 106.141 478.934 C 107.453 473.582 122.331 464.186 129.369 458.234 C 140.718 448.636 168.580 426.948 168.584 426.945 C 168.582 426.941 155.087 401.062 153.924 383.573 C 153.248 373.401 158.872 361.147 158.339 357.313 C 157.702 352.728 147.366 344.625 144.362 328.695 C 141.293 312.427 146.738 298.556 146.033 295.493 C 135.758 250.894 112.667 241.497 115.703 235.055 C 121.137 223.526 113.917 199.658 113.917 199.655 C 113.916 199.659 120.620 229.769 106.863 244.022 C 98.262 252.934 88.787 248.622 88.785 248.622 C 88.784 248.624 77.080 262.243 77.079 262.244 C 77.079 262.246 78.858 280.094 78.067 282.147 C 77.306 284.125 67.788 293.913 64.551 295.777 C 63.079 296.624 56.194 298.299 56.193 298.299 C 56.194 298.297 58.130 274.994 58.130 274.992 C 58.130 274.992 52.453 294.835 52.065 295.702 C 51.217 297.600 29.733 296.091 30.375 273.749 C 30.452 271.081 33.665 266.951 33.665 266.950 C 33.666 266.942 43.355 189.572 43.356 189.564 C 43.356 189.563 38.630 185.474 38.629 185.473 C 38.630 185.471 46.273 161.955 46.274 161.952 C 46.272 161.950 31.320 138.472 31.318 138.470 C 31.319 138.470 39.423 139.481 44.334 141.598 C 50.582 144.291 58.515 151.023 58.516 151.024 C 58.523 151.022 91.212 136.454 130.843 136.243 C 178.893 135.989 224.436 170.132 246.329 193.166 C 263.948 211.702 298.936 271.617 312.742 278.850 C 322.329 283.872 339.328 288.979 359.986 290.269 M 38.625 279.611 C 38.324 277.075 38.371 273.308 40.918 273.501 C 45.742 273.866 42.486 277.764 42.578 280.626 C 42.630 282.223 43.510 284.156 41.996 284.666 C 39.742 285.424 38.906 281.972 38.625 279.611 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 56.425 196.287 C 60.574 196.270 63.935 199.603 63.953 203.753 C 63.970 207.902 60.637 211.264 56.488 211.281 C 52.338 211.299 48.976 207.965 48.959 203.816 C 48.942 199.666 52.275 196.305 56.425 196.287 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":187.951,\\\"max\\\":333.104},\\\"y\\\":{\\\"min\\\":296.539,\\\"max\\\":441.692}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":359.947,\\\"y\\\":367.484,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":127.778,\\\"y\\\":135.69,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":347.401,\\\"y\\\":288.96,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005061688548150921,\\\"y\\\":-0.9999871895724672}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.71,\\\"y\\\":367.266,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"arm\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"horse_hind\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":357.986,\\\"max\\\":683.089},\\\"y\\\":{\\\"min\\\":265.06664476806264,\\\"max\\\":685.995045988136}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"horse_hind\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"horse_hind\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.986 290.269 C 359.993 339.304 359.996 398.194 360.057 452.727 C 396.390 442.166 422.772 427.397 425.564 426.775 C 426.786 426.503 460.295 422.356 460.299 422.356 C 460.295 422.357 425.778 427.824 425.775 427.825 C 425.775 427.828 422.942 444.227 427.873 456.098 C 435.627 474.761 463.403 492.209 463.580 501.418 C 463.752 510.413 430.595 547.096 430.592 547.100 C 430.588 547.104 405.922 570.233 396.346 580.270 C 391.397 585.457 390.692 607.579 390.135 609.705 C 389.854 610.778 385.672 620.070 385.671 624.202 C 385.669 633.637 397.569 656.724 397.570 656.727 C 397.572 656.726 407.941 651.733 413.866 645.145 C 419.810 638.537 423.689 627.664 423.690 627.662 C 423.689 627.660 412.343 612.975 414.531 601.459 C 416.462 591.295 424.965 593.503 427.150 589.643 C 429.259 585.919 428.153 576.182 430.702 573.341 C 445.107 557.281 482.444 519.626 502.198 516.963 C 504.850 516.605 509.509 503.900 498.795 495.152 C 481.341 480.900 491.253 458.706 491.252 458.703 C 491.249 458.699 464.026 423.391 464.023 423.387 C 464.026 423.391 490.743 457.757 490.746 457.760 C 490.749 457.762 522.981 474.296 526.214 477.026 C 528.534 478.986 536.934 494.117 544.405 499.571 C 553.579 506.269 568.468 509.762 570.032 514.697 C 573.655 526.131 594.689 560.405 597.178 569.025 C 600.119 579.211 606.799 634.904 603.811 640.481 C 603.037 641.926 591.626 648.075 588.775 651.405 C 583.539 657.521 574.127 682.226 574.125 682.229 C 574.127 682.229 587.201 683.986 595.524 683.995 C 604.797 684.006 619.365 682.040 619.368 682.040 C 619.368 682.039 621.117 667.556 621.117 667.555 C 621.117 667.554 625.965 664.220 626.523 662.103 C 627.721 657.557 620.170 650.478 620.729 646.669 C 622.740 632.963 634.721 647.293 634.419 638.845 C 633.105 602.043 624.626 612.451 614.298 551.761 C 612.527 541.353 612.907 507.600 609.566 502.014 C 607.488 498.540 591.243 492.193 584.454 483.718 C 571.694 467.792 560.114 454.682 563.114 429.365 C 564.897 414.313 577.035 421.668 586.441 381.763 C 591.467 360.442 586.138 309.383 586.138 309.376 C 586.141 309.378 606.583 321.387 610.273 328.580 C 625.456 358.176 588.790 373.944 600.096 455.077 C 606.288 499.507 649.673 543.994 681.089 548.398 C 651.859 512.579 658.491 479.332 652.439 440.531 C 645.997 399.228 662.491 359.221 636.649 325.000 C 620.327 303.387 570.690 292.251 570.684 292.248 C 570.677 292.246 537.529 268.723 505.429 267.185 C 480.032 265.969 458.443 274.240 405.071 286.607 C 389.157 290.294 373.758 291.130 359.986 290.269 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":429.779,\\\"max\\\":555.621},\\\"y\\\":{\\\"min\\\":287.321,\\\"max\\\":413.163}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.399,\\\"y\\\":369.228,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.168,\\\"y\\\":368.999,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":378.616,\\\"y\\\":291.336,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.0051377182719439885,\\\"y\\\":-0.9999868018383833}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":498.201,\\\"y\\\":267.736,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\"]}},{\\\"name\\\":\\\"hourglass\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":189.5579603512383,\\\"max\\\":530.3095733740247},\\\"y\\\":{\\\"min\\\":21.274,\\\"max\\\":639.819}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hourglass\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hourglass\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 523.280 196.453 C 511.439 257.961 443.739 297.043 421.031 315.531 C 406.106 326.851 405.824 337.073 420.569 345.621 C 441.836 362.135 507.623 387.013 523.280 464.639 C 533.552 515.568 523.119 637.801 523.118 637.819 C 523.102 637.819 358.814 637.242 358.798 637.242 C 358.781 637.242 194.424 636.665 194.407 636.665 C 194.408 636.647 186.657 515.261 196.720 464.639 C 209.610 399.799 269.704 366.815 294.813 349.119 C 314.229 335.436 313.715 328.598 293.633 311.973 C 267.517 290.353 210.053 259.409 196.720 196.453 C 185.956 145.627 196.881 23.291 196.882 23.274 C 198.242 24.638 361.186 23.851 361.202 23.851 C 361.219 23.851 525.576 24.428 525.593 24.428 C 525.593 24.445 533.037 145.772 523.280 196.453 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 216.892 187.438 C 276.285 189.705 298.750 256.642 361.129 256.411 C 422.715 256.183 446.158 188.560 503.108 187.438 C 510.678 145.549 503.108 44.344 503.108 44.330 C 503.094 44.330 360.014 44.330 360.000 44.330 C 359.986 44.330 218.085 45.509 216.892 44.330 C 216.892 44.344 210.412 151.096 216.892 187.438 C 225.589 236.217 292.009 287.369 360.000 330.546 C 428.945 285.134 493.849 238.674 503.108 187.438 M 216.892 473.654 C 229.680 413.088 296.768 372.196 360.000 330.546 C 423.326 370.761 489.206 410.900 503.108 473.654 C 506.807 490.351 506.875 526.597 506.929 530.529 C 507.010 536.484 503.108 616.754 503.108 616.763 C 503.094 616.763 360.014 616.763 360.000 616.763 C 359.986 616.763 216.906 616.763 216.892 616.763 C 216.892 616.755 213.310 532.878 213.310 532.870 C 213.310 532.864 213.215 491.068 216.892 473.654 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 489.225 C 418.700 488.785 440.874 530.525 506.929 530.529 C 507.010 536.484 503.108 616.754 503.108 616.763 C 503.094 616.763 360.014 616.763 360.000 616.763 C 359.986 616.763 216.906 616.763 216.892 616.763 C 216.892 616.755 213.310 532.878 213.310 532.870 C 284.082 531.686 301.138 489.666 360.000 489.225 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 216.892 187.438 C 276.285 189.705 298.750 256.642 361.129 256.411 C 422.715 256.183 446.158 188.560 503.108 187.438 C 493.849 238.674 428.945 285.134 360.000 330.546 C 292.009 287.369 225.589 236.217 216.892 187.438 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 339.659 C 360.000 339.659 360.000 344.580 360.000 344.580 M 360.000 359.345 C 360.000 359.345 360.000 364.266 360.000 364.266 M 360.000 379.031 C 360.000 379.031 360.000 383.952 360.000 383.952 M 360.000 398.717 C 360.000 398.717 360.000 403.638 360.000 403.638 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 418.582 C 360.000 418.582 360.000 423.503 360.000 423.504 M 360.000 438.268 C 360.000 438.269 360.000 443.189 360.000 443.190 M 360.000 457.954 C 360.000 457.954 360.000 462.875 360.000 462.875 M 360.000 477.640 C 360.000 477.640 360.000 482.561 360.000 482.562 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":688.229,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":25.095,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":232.438,\\\"y\\\":331.396,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987215219683,\\\"y\\\":0.00505661914555356}},{\\\"point\\\":{\\\"x\\\":487.562,\\\"y\\\":331.396,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999987215219683,\\\"y\\\":0.005056619145553571}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":521.426,\\\"y\\\":634.965,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128475518456736,\\\"y\\\":0.701319020009888}},{\\\"point\\\":{\\\"x\\\":198.441,\\\"y\\\":634.999,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986772677634046,\\\"y\\\":0.7154369822078418}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":523.168,\\\"y\\\":24.877,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314517658655274,\\\"y\\\":-0.7754151580832729}},{\\\"point\\\":{\\\"x\\\":197.41,\\\"y\\\":24.933,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817795944708411,\\\"y\\\":-0.7315576426797655}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":635.6,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":305.686,\\\"max\\\":414.314},\\\"y\\\":{\\\"min\\\":504.969,\\\"max\\\":613.597}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"house\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":176.434,\\\"max\\\":695.316},\\\"y\\\":{\\\"min\\\":29.945,\\\"max\\\":610.586}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"house\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"house_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 307.155 58.728 C 307.168 58.750 392.968 207.905 435.875 282.494 C 435.875 282.527 435.875 608.554 435.875 608.586 C 412.454 600.235 365.618 583.535 365.611 583.532 C 365.598 583.527 236.735 537.579 236.722 537.574 C 236.716 537.572 178.440 516.793 178.434 516.791 C 178.434 516.758 178.434 190.731 178.434 190.698 C 178.447 190.685 307.142 58.741 307.155 58.728 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 435.875 282.494 C 435.875 282.527 435.875 608.554 435.875 608.586 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 435.875 282.494 C 435.875 282.527 435.875 608.554 435.875 608.586 C 435.901 608.578 693.290 522.523 693.316 522.514 C 693.316 522.484 693.316 226.096 693.316 226.067 C 693.290 226.072 435.901 282.489 435.875 282.494 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 693.316 226.067 C 693.290 226.072 435.901 282.489 435.875 282.494 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 435.875 282.494 C 392.968 207.905 307.168 58.750 307.155 58.728 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 564.595 31.945 C 564.608 31.964 650.409 161.360 693.316 226.067 C 693.290 226.072 435.901 282.489 435.875 282.494 C 392.968 207.905 307.168 58.750 307.155 58.728 C 392.968 49.800 564.570 31.948 564.595 31.945 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 365.611 583.532 C 365.598 583.527 236.735 537.579 236.722 537.574 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 365.498 291.109 C 365.498 291.138 365.573 486.058 365.611 583.532 C 365.598 583.527 236.735 537.579 236.722 537.574 C 236.740 440.120 236.778 245.240 236.778 245.211 C 236.790 245.216 365.486 291.104 365.498 291.109 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 638.519 445.989 C 638.513 445.991 574.885 467.275 574.879 467.277 C 574.872 467.279 511.244 488.564 511.238 488.566 C 511.238 488.558 511.238 415.290 511.238 415.282 C 511.238 415.275 511.238 342.006 511.238 341.999 C 511.245 341.997 574.872 325.608 574.879 325.607 C 574.885 325.605 638.513 309.216 638.519 309.214 C 638.519 309.221 638.519 377.590 638.519 377.597 C 638.519 377.604 638.519 445.982 638.519 445.989 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 574.879 325.607 C 574.879 372.830 574.879 420.054 574.879 467.277 M 511.238 415.282 C 553.665 402.721 596.092 390.159 638.519 377.597 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":202.981,\\\"max\\\":365.233},\\\"y\\\":{\\\"min\\\":291.567,\\\"max\\\":579.099}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":434.652,\\\"y\\\":689.367,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":434.652,\\\"y\\\":44.638,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":174.904,\\\"y\\\":312.863,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872416708515,\\\"y\\\":0.005051385505163669}},{\\\"point\\\":{\\\"x\\\":694.4,\\\"y\\\":312.863,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872416708515,\\\"y\\\":0.005051385505163642}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":590.332,\\\"y\\\":556.837,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.3662072799759847,\\\"y\\\":0.9305333030540018}},{\\\"point\\\":{\\\"x\\\":288.223,\\\"y\\\":557.435,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.38611017392132174,\\\"y\\\":0.9224526728209133}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":620.208,\\\"y\\\":116.114,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8106385202018457,\\\"y\\\":-0.5855469149137084}},{\\\"point\\\":{\\\"x\\\":242.808,\\\"y\\\":124.186,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817267728855348,\\\"y\\\":-0.7316068665144377}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"infinity\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":30.975087328840694,\\\"max\\\":689.0249126711592},\\\"y\\\":{\\\"min\\\":231.10882135209928,\\\"max\\\":488.8392069437084}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"infinity\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"infinity\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 550.966 437.261 C 488.765 429.238 401.658 359.640 401.643 359.632 C 403.289 358.599 510.985 281.541 558.741 282.739 C 586.994 283.448 635.935 310.453 636.488 357.571 C 637.186 416.974 581.208 441.162 550.966 437.261 M 569.431 486.825 C 497.012 487.774 427.117 441.006 360.031 390.953 C 294.176 440.136 223.658 487.783 150.569 486.825 C 77.519 485.867 32.742 407.261 32.976 362.429 C 33.271 305.989 78.050 230.560 161.259 233.175 C 227.550 235.259 296.906 281.948 360.151 328.636 C 424.364 281.096 493.057 235.240 558.741 233.175 C 641.950 230.560 686.729 305.989 687.024 362.429 C 687.258 407.261 642.481 485.867 569.431 486.825 M 169.034 437.261 C 210.666 431.090 262.229 401.148 318.302 359.592 C 262.329 317.688 209.474 281.529 161.259 282.739 C 133.006 283.448 84.065 310.453 83.512 357.571 C 82.814 416.974 142.924 441.131 169.034 437.261 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.031 390.953 C 374.472 380.168 401.153 359.940 401.643 359.632 M 318.302 359.592 C 331.939 349.466 345.861 338.971 360.151 328.636 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":111.276,\\\"max\\\":230.324},\\\"y\\\":{\\\"min\\\":300.476,\\\"max\\\":419.524}},{\\\"x\\\":{\\\"min\\\":489.676,\\\"max\\\":608.724},\\\"y\\\":{\\\"min\\\":300.476,\\\"max\\\":419.524}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":517.689,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":238.309,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":31.9,\\\"y\\\":360.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088752079}},{\\\"point\\\":{\\\"x\\\":688.1,\\\"y\\\":360.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.005035854088752106}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":592.672,\\\"y\\\":481.368,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129335762692828,\\\"y\\\":0.7012315707581133}},{\\\"point\\\":{\\\"x\\\":127.136,\\\"y\\\":481.416,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987254201015092,\\\"y\\\":0.7153899547127913}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":592.835,\\\"y\\\":237.519,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314091670147428,\\\"y\\\":-0.775449846095638}},{\\\"point\\\":{\\\"x\\\":127.956,\\\"y\\\":237.598,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817481203990742,\\\"y\\\":-0.731586973867311}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":387.704,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"key\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":102.625,\\\"max\\\":695.481},\\\"y\\\":{\\\"min\\\":272.089,\\\"max\\\":558.087}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"key\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"key\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 671.833 490.988 C 671.820 476.530 671.795 447.620 671.795 447.615 C 671.790 447.615 642.880 447.615 628.422 447.615 C 628.422 440.387 628.422 433.158 628.422 425.929 C 642.880 425.929 671.790 425.929 671.795 425.929 C 671.797 425.927 693.481 425.929 693.481 404.243 C 693.481 382.556 671.797 382.559 671.795 382.556 C 671.753 382.556 256.182 382.556 256.182 382.556 C 257.342 377.606 260.937 362.782 260.810 352.181 C 260.292 308.961 225.942 274.089 182.718 274.089 C 139.494 274.089 104.625 308.958 104.625 352.181 C 104.625 372.064 112.004 390.179 124.419 404.271 C 112.004 418.306 104.625 436.421 104.625 456.304 C 104.625 499.528 139.494 534.397 182.718 534.397 C 225.942 534.397 260.240 499.524 260.810 456.304 C 260.950 445.738 259.313 435.575 256.022 425.932 C 358.093 425.931 460.916 425.930 563.363 425.929 C 563.363 433.158 563.363 440.387 563.363 447.615 C 548.906 447.615 519.995 447.615 519.991 447.615 C 519.991 447.620 519.953 490.984 519.953 490.988 C 519.955 490.988 541.675 490.988 541.677 490.988 C 541.677 490.990 541.677 512.672 541.677 512.674 C 541.675 512.674 519.954 512.674 519.952 512.674 C 519.952 512.679 519.991 556.043 519.991 556.047 C 519.997 556.047 563.363 556.073 585.050 556.085 C 585.050 534.386 585.050 490.995 585.050 490.988 C 585.052 490.988 606.734 490.988 606.736 490.988 C 606.736 490.995 606.736 534.387 606.736 556.087 C 628.422 556.074 671.788 556.047 671.795 556.047 C 671.795 556.043 671.833 512.679 671.833 512.674 C 671.830 512.674 650.111 512.674 650.109 512.674 C 650.109 512.672 650.109 490.990 650.109 490.988 C 650.111 490.988 664.591 490.988 671.833 490.988 M 156.687 456.304 C 156.687 470.712 168.310 482.335 182.718 482.335 C 197.126 482.335 208.748 470.712 208.749 456.304 C 208.749 441.896 197.126 430.273 182.718 430.273 C 168.310 430.273 156.687 441.896 156.687 456.304 M 182.718 326.150 C 168.310 326.150 156.687 337.773 156.687 352.181 C 156.687 366.589 168.310 378.212 182.718 378.212 C 197.126 378.212 208.748 366.589 208.749 352.181 C 208.749 337.773 197.126 326.150 182.718 326.150 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":320.59,\\\"max\\\":492.177},\\\"y\\\":{\\\"min\\\":318.449,\\\"max\\\":490.036}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":22.297,\\\"y\\\":404.243,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":122.098,\\\"y\\\":404.243,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":179.599,\\\"y\\\":272.464,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005052523670873037,\\\"y\\\":-0.9999872359208166}},{\\\"point\\\":{\\\"x\\\":179.599,\\\"y\\\":536.021,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.0050525236708729784,\\\"y\\\":0.9999872359208168}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":691.806,\\\"y\\\":404.243,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"knife\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":325.86875000000003,\\\"max\\\":460.435},\\\"y\\\":{\\\"min\\\":13.766,\\\"max\\\":630.2977500000001}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"knife\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"knife\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#D56D70FF-A326-4D73-B9C1-614A89964DC8_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 344.344 626.341 C 322.377 609.940 322.377 428.024 344.344 411.624 C 347.839 409.015 375.009 409.015 378.504 411.624 C 400.472 428.024 400.472 609.940 378.504 626.341 C 375.009 628.950 347.839 628.950 344.344 626.341 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#D56D70FF-A326-4D73-B9C1-614A89964DC8_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 333.346 442.770 C 333.346 442.727 333.346 15.809 333.346 15.766 C 333.359 15.804 435.495 35.627 458.435 395.839 C 436.954 396.004 391.234 391.312 390.447 441.808 C 390.415 443.871 333.352 442.770 333.346 442.770 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.041,\\\"y\\\":696.393,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":338.03,\\\"y\\\":23.778,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":325.51,\\\"y\\\":515.877,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875844803596,\\\"y\\\":0.004983059816572423}},{\\\"point\\\":{\\\"x\\\":394.49,\\\"y\\\":515.877,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875844803596,\\\"y\\\":0.004983059816572423}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":449.681,\\\"y\\\":311.579,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6313997604156121,\\\"y\\\":-0.7754575053135456}},{\\\"point\\\":{\\\"x\\\":333.178,\\\"y\\\":311.688,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817496149305948,\\\"y\\\":-0.7315855811468579}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"D56D70FF-A326-4D73-B9C1-614A89964DC8_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"125.97%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"15.29%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"D56D70FF-A326-4D73-B9C1-614A89964DC8_1\\\",\\\"x1\\\":\\\"151.31%\\\",\\\"y1\\\":\\\"89.55%\\\",\\\"x2\\\":\\\"-133.70%\\\",\\\"y2\\\":\\\"9.96%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"33.73%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"knight\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":13.204,\\\"max\\\":574.803993001964},\\\"y\\\":{\\\"min\\\":35.01,\\\"max\\\":640.32}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"knight\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sword\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 296.788 117.722 C 296.788 117.721 300.080 109.901 300.080 109.900 C 300.081 109.900 303.373 102.079 303.373 102.079 C 303.358 102.072 148.704 37.512 148.688 37.505 C 148.686 37.505 126.942 37.010 126.940 37.010 C 126.942 37.012 142.492 52.217 142.494 52.219 C 142.509 52.225 296.772 117.716 296.788 117.722 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 291.437 130.431 C 291.439 130.427 308.722 89.374 308.723 89.370 C 308.724 89.370 313.747 91.485 313.748 91.485 C 313.746 91.490 296.464 132.542 296.462 132.546 C 296.461 132.546 291.438 130.431 291.437 130.431 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.119 123.602 C 321.957 122.239 322.133 120.800 322.710 119.427 C 323.288 118.055 324.195 116.923 325.283 116.087 C 319.151 113.492 306.703 108.225 306.701 108.225 C 306.701 108.225 303.509 115.806 303.509 115.807 C 303.511 115.808 315.978 121.030 322.119 123.602 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.710 119.427 C 323.288 118.055 324.195 116.923 325.283 116.087 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.119 123.602 C 321.957 122.239 322.133 120.800 322.710 119.427 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.710 119.427 C 323.288 118.055 324.195 116.923 325.283 116.087 C 327.543 114.388 330.603 113.903 333.390 115.076 C 337.550 116.827 339.493 121.596 337.742 125.755 C 335.991 129.915 331.222 131.858 327.062 130.107 C 324.275 128.934 322.483 126.406 322.119 123.602 C 321.957 122.239 322.133 120.800 322.710 119.427 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 300.080 109.900 C 246.132 87.189 192.183 64.477 138.234 41.765 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"knight\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 463.170 196.056 C 482.474 195.714 487.015 210.707 494.374 230.234 C 500.693 220.273 511.489 208.105 501.396 188.973 C 495.667 178.112 479.402 172.571 471.727 176.112 C 472.970 185.518 469.036 191.292 463.170 196.056 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 471.727 176.112 C 472.970 185.518 469.036 191.292 463.170 196.056 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 471.727 176.112 C 472.970 185.518 469.036 191.292 463.170 196.056 C 460.788 196.098 458.369 194.940 455.535 194.587 C 457.409 187.298 461.116 179.659 450.860 163.246 C 460.243 163.669 468.271 171.660 471.727 176.112 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 450.860 163.246 C 461.116 179.659 457.409 187.298 455.535 194.587 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 450.860 163.246 C 461.116 179.659 457.409 187.298 455.535 194.587 C 450.017 193.898 444.569 193.665 438.587 193.855 C 435.639 177.318 426.728 166.206 410.548 162.423 C 424.273 155.679 438.929 155.879 450.860 163.246 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 410.548 162.423 C 426.728 166.206 435.639 177.318 438.587 193.855 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 410.548 162.423 C 426.728 166.206 435.639 177.318 438.587 193.855 C 432.559 194.048 426.486 194.793 420.091 196.445 C 411.071 184.767 398.630 172.733 373.760 175.215 C 380.658 166.633 401.149 160.385 410.548 162.423 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.760 175.215 C 398.630 172.733 411.071 184.767 420.091 196.445 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.760 175.215 C 398.630 172.733 411.071 184.767 420.091 196.445 C 411.854 198.574 403.201 201.347 394.907 206.992 C 384.751 196.131 366.193 191.531 346.331 196.483 C 349.838 189.319 362.174 177.485 373.760 175.215 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.331 196.483 C 366.193 191.531 384.751 196.131 394.907 206.992 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.331 196.483 C 366.193 191.531 384.751 196.131 394.907 206.992 C 388.690 211.224 382.647 215.894 377.824 222.464 C 365.024 219.718 347.691 215.981 321.662 235.226 C 323.824 215.573 336.765 201.533 346.331 196.483 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 321.662 235.226 C 347.691 215.981 365.024 219.718 377.824 222.464 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 321.662 235.226 C 347.691 215.981 365.024 219.718 377.824 222.464 C 370.604 232.298 365.900 242.908 363.536 253.024 C 342.837 253.021 325.888 256.041 310.052 272.980 C 308.914 265.782 311.779 244.236 321.662 235.226 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 310.052 272.980 C 325.888 256.041 342.837 253.021 363.536 253.024 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 310.052 272.980 C 325.888 256.041 342.837 253.021 363.536 253.024 C 359.578 269.957 356.040 282.981 356.100 296.049 C 340.682 292.997 312.296 308.410 300.436 331.306 C 298.878 323.749 292.363 299.707 310.052 272.980 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 300.436 331.306 C 312.296 308.410 340.682 292.997 356.100 296.049 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 300.436 331.306 C 312.296 308.410 340.682 292.997 356.100 296.049 C 356.161 309.213 356.941 355.746 356.941 355.752 C 356.936 355.754 318.333 371.222 307.181 376.524 C 299.496 365.819 290.788 352.275 300.436 331.306 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 184.675 401.443 C 151.004 397.481 168.459 420.360 138.470 424.323 C 133.490 396.071 147.813 385.261 164.694 381.566 C 177.468 382.527 181.197 397.951 184.675 401.443 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 197.736 451.086 C 196.158 417.760 286.543 386.207 307.242 450.719 C 309.045 456.341 306.538 475.887 298.798 498.005 C 286.899 532.007 239.583 541.709 239.692 556.401 C 239.777 567.808 276.345 599.028 284.004 603.291 C 292.360 607.941 311.405 632.253 311.408 632.256 C 311.404 632.256 271.695 631.838 271.691 631.838 C 271.691 631.836 269.675 619.497 264.609 614.421 C 261.666 611.473 254.257 616.278 252.017 610.554 C 241.730 584.265 209.127 562.380 211.536 552.905 C 213.274 546.068 231.301 525.009 230.298 506.089 C 229.561 492.188 198.947 476.656 197.736 451.086 M 435.313 400.191 C 435.313 400.188 438.102 370.096 438.102 370.093 C 438.109 370.090 477.069 361.549 506.831 342.382 C 515.807 336.601 520.926 347.552 523.539 349.961 C 528.734 354.749 555.983 386.106 565.639 396.270 C 568.604 399.391 568.487 412.088 572.383 423.427 C 574.779 430.398 566.166 451.800 566.166 451.803 C 566.164 451.801 548.660 430.650 548.658 430.648 C 548.659 430.646 558.233 417.953 556.406 412.801 C 553.891 405.707 544.445 410.963 543.807 406.364 C 541.584 390.334 516.507 362.138 512.529 361.378 C 507.795 360.473 459.508 399.291 459.503 399.295 C 459.501 399.295 435.315 400.191 435.313 400.191 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 514.559 385.909 C 499.316 387.436 479.351 388.200 462.036 388.920 C 462.026 365.417 450.437 341.702 436.640 327.466 C 430.698 304.057 423.095 254.856 446.348 245.151 C 455.949 258.454 471.074 264.175 471.077 264.177 C 471.077 264.179 475.845 274.622 479.894 285.889 C 480.329 287.100 487.849 287.902 487.850 287.902 C 487.850 287.901 488.180 276.445 488.180 276.444 C 488.181 276.445 496.721 288.264 496.721 288.265 C 496.722 288.264 504.167 283.563 504.873 279.994 C 505.736 275.630 493.948 218.040 491.065 209.504 C 487.304 198.366 479.303 194.102 479.302 194.100 C 479.301 194.098 471.752 169.113 471.751 169.111 C 471.751 169.113 465.307 190.522 465.306 190.524 C 465.297 190.527 410.699 174.883 373.524 216.035 C 347.953 244.342 354.797 300.108 341.869 340.172 C 331.004 373.847 280.684 369.920 235.460 375.309 C 165.957 383.590 163.824 413.456 164.973 450.890 C 166.193 490.601 197.495 491.371 193.359 516.578 C 191.726 526.527 163.620 538.670 157.516 546.763 C 148.453 558.779 181.288 571.687 183.911 608.514 C 184.438 615.904 190.863 612.046 195.570 615.971 C 203.568 622.640 204.793 638.318 204.794 638.320 C 204.798 638.320 247.007 638.097 247.011 638.097 C 247.008 638.094 228.098 612.051 219.391 608.120 C 198.189 598.550 182.573 561.460 183.082 558.817 C 188.652 529.896 237.968 551.347 259.994 495.696 C 271.048 467.764 266.512 433.919 266.513 433.913 C 266.513 433.917 268.992 463.869 267.583 469.644 C 275.104 465.409 284.561 469.314 314.461 473.253 C 382.452 482.209 423.140 458.355 453.660 420.842 C 449.260 423.232 440.168 426.026 437.813 425.881 C 431.210 425.474 420.861 417.033 420.860 417.032 C 420.861 417.033 430.987 425.658 438.336 425.692 C 446.637 425.730 502.373 399.667 506.106 404.125 C 510.013 408.790 490.876 443.775 489.818 450.463 C 489.592 451.888 493.169 456.475 489.631 460.928 C 488.581 462.251 473.116 465.262 473.115 465.263 C 473.114 465.265 465.335 489.306 465.334 489.309 C 465.336 489.308 485.493 486.742 489.075 482.678 C 498.422 472.071 508.967 466.447 508.694 459.364 C 508.069 443.134 518.522 407.855 524.861 399.163 C 526.674 396.677 522.408 385.122 514.559 385.909 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 462.036 388.920 C 447.829 389.455 435.527 389.903 429.148 389.785 M 514.559 385.909 C 499.316 387.436 479.351 388.200 462.036 388.920 C 462.026 365.417 450.437 341.702 436.640 327.466 C 430.698 304.057 423.095 254.856 446.348 245.151 C 455.949 258.454 471.074 264.175 471.077 264.177 C 471.077 264.179 475.845 274.622 479.894 285.889 C 480.329 287.100 487.849 287.902 487.850 287.902 C 487.850 287.901 488.180 276.445 488.180 276.444 C 488.181 276.445 496.721 288.264 496.721 288.265 C 496.722 288.264 504.167 283.563 504.873 279.994 C 505.736 275.630 493.948 218.040 491.065 209.504 C 487.304 198.366 479.303 194.102 479.302 194.100 C 479.301 194.098 471.752 169.113 471.751 169.111 C 471.751 169.113 465.307 190.522 465.306 190.524 C 465.297 190.527 410.699 174.883 373.524 216.035 C 347.953 244.342 354.797 300.108 341.869 340.172 C 331.004 373.847 280.684 369.920 235.460 375.309 C 165.957 383.590 163.824 413.456 164.973 450.890 C 166.193 490.601 197.495 491.371 193.359 516.578 C 191.726 526.527 163.620 538.670 157.516 546.763 C 148.453 558.779 181.288 571.687 183.911 608.514 C 184.438 615.904 190.863 612.046 195.570 615.971 C 203.568 622.640 204.793 638.318 204.794 638.320 C 204.798 638.320 247.007 638.097 247.011 638.097 C 247.008 638.094 228.098 612.051 219.391 608.120 C 198.189 598.550 182.573 561.460 183.082 558.817 C 188.652 529.896 237.968 551.347 259.994 495.696 C 271.048 467.764 266.512 433.919 266.513 433.913 C 266.513 433.917 268.992 463.869 267.583 469.644 C 275.104 465.409 284.561 469.314 314.461 473.253 C 382.452 482.209 423.140 458.355 453.660 420.842 C 449.260 423.232 440.168 426.026 437.813 425.881 C 431.210 425.474 420.861 417.033 420.860 417.032 C 420.861 417.033 430.987 425.658 438.336 425.692 C 446.637 425.730 502.373 399.667 506.106 404.125 C 510.013 408.790 490.876 443.775 489.818 450.463 C 489.592 451.888 493.169 456.475 489.631 460.928 C 488.581 462.251 473.116 465.262 473.115 465.263 C 473.114 465.265 465.335 489.306 465.334 489.309 C 465.336 489.308 485.493 486.742 489.075 482.678 C 498.422 472.071 508.967 466.447 508.694 459.364 C 508.069 443.134 518.522 407.855 524.861 399.163 C 526.674 396.677 522.408 385.122 514.559 385.909 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 124.408 246.807 C 124.415 246.805 168.101 285.563 197.678 230.331 C 204.006 239.198 208.306 244.953 215.610 250.950 C 214.092 252.233 212.604 253.466 210.708 254.993 C 163.997 292.936 147.555 280.279 118.684 256.934 C 92.575 264.072 73.794 251.390 73.068 247.551 C 86.865 247.490 124.403 246.807 124.408 246.807 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 313.509 141.604 C 327.823 161.569 316.291 192.096 299.131 209.349 C 299.290 212.369 299.866 217.485 298.818 223.495 C 301.199 226.702 302.344 230.048 305.045 234.844 C 328.772 215.374 357.546 167.878 325.969 135.025 C 323.399 132.350 321.773 131.060 321.773 131.060 C 321.774 131.058 330.822 114.703 330.823 114.701 C 330.821 114.700 309.369 103.497 309.367 103.496 C 309.367 103.497 306.381 112.464 306.381 112.465 C 306.380 112.467 300.834 127.635 300.834 127.636 C 300.835 127.637 308.361 134.424 313.509 141.604 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 306.381 112.465 C 316.771 118.799 327.118 118.914 323.634 122.912 C 319.745 127.375 314.196 122.521 314.195 122.521 C 314.195 122.522 315.128 126.520 310.154 128.920 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 210.708 254.993 C 212.604 253.466 214.092 252.233 215.610 250.950 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.818 223.495 C 301.199 226.702 302.344 230.048 305.045 234.844 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 240.613 343.871 C 235.908 294.821 224.679 287.281 210.708 254.993 C 212.604 253.466 214.092 252.233 215.610 250.950 C 218.846 253.607 247.497 267.915 269.299 259.990 C 289.029 252.818 296.591 236.266 298.818 223.495 C 301.199 226.702 302.344 230.048 305.045 234.844 C 315.034 252.582 324.266 283.030 309.048 339.998 C 297.867 347.169 262.599 353.746 240.613 343.871 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 142.690 512.074 C 194.030 526.886 254.540 519.670 306.750 505.740 C 313.061 447.209 301.474 420.060 278.030 395.185 C 258.321 395.144 239.665 391.643 225.706 386.817 C 225.377 386.255 227.679 379.330 230.696 371.112 C 212.162 372.807 203.697 375.453 183.650 384.336 C 187.345 387.967 187.906 397.879 182.621 403.012 C 175.766 409.669 167.607 408.043 164.473 406.885 C 150.914 441.324 166.290 452.668 142.690 512.074 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 326.988 493.554 C 326.989 493.544 345.889 430.161 331.380 384.984 C 339.380 381.510 347.075 377.025 354.225 371.344 C 346.495 361.986 339.113 355.429 332.390 351.243 C 334.636 349.519 336.986 347.555 339.387 345.367 C 347.142 353.322 361.269 355.146 389.266 356.909 C 418.955 358.779 452.385 339.350 452.392 339.348 C 452.395 339.353 457.397 357.396 483.470 385.418 C 411.004 385.279 423.613 464.202 355.138 490.342 C 349.688 492.423 344.034 494.373 338.256 496.300 C 334.389 495.374 326.989 493.554 326.988 493.554 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 448.816 231.090 C 453.119 243.821 466.385 256.955 474.766 264.373 C 472.004 265.161 467.918 266.349 467.917 266.349 C 467.918 266.350 470.261 275.698 470.261 275.699 C 470.261 275.699 471.724 275.297 472.903 274.925 C 462.782 284.129 439.424 303.333 415.113 309.134 C 391.646 314.733 360.165 306.564 346.451 303.551 C 342.414 325.423 337.292 343.138 337.291 343.142 C 337.300 343.142 386.875 357.682 424.006 339.423 C 481.698 311.054 479.708 279.862 478.635 272.883 C 482.683 278.839 494.229 275.646 494.369 268.923 C 498.792 267.873 507.801 265.402 507.802 265.402 C 507.802 265.401 504.073 255.840 504.073 255.839 C 504.071 255.839 497.747 257.815 490.218 260.171 C 486.145 257.147 482.628 259.747 482.628 259.747 C 476.054 252.994 463.345 236.529 458.792 219.285 C 455.898 208.323 462.622 187.610 462.623 187.607 C 462.622 187.607 455.703 186.687 450.678 185.200 C 448.478 191.000 441.613 209.778 448.816 231.090 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 278.030 395.185 C 301.474 420.060 313.061 447.209 306.750 505.740 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 338.256 496.300 C 334.389 495.374 326.989 493.554 326.988 493.554 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 326.988 493.554 C 326.989 493.544 345.889 430.161 331.380 384.984 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 331.380 384.984 C 314.249 392.422 295.718 395.223 278.030 395.185 C 301.474 420.060 313.061 447.209 306.750 505.740 C 306.412 508.182 306.030 511.316 305.598 514.539 C 328.398 513.761 375.249 505.424 375.256 505.423 C 375.253 505.422 350.479 499.330 338.256 496.300 C 334.389 495.374 326.989 493.554 326.988 493.554 C 326.989 493.544 345.889 430.161 331.380 384.984 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 299.131 209.349 C 299.290 212.369 299.866 217.485 298.818 223.495 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.818 223.495 C 296.591 236.266 289.029 252.818 269.299 259.990 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 269.299 259.990 C 247.497 267.915 218.846 253.607 215.610 250.950 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 215.610 250.950 C 208.306 244.953 204.006 239.198 197.678 230.331 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.224 205.875 C 299.567 205.351 299.010 207.048 299.131 209.349 C 299.290 212.369 299.866 217.485 298.818 223.495 C 296.591 236.266 289.029 252.818 269.299 259.990 C 247.497 267.915 218.846 253.607 215.610 250.950 C 208.306 244.953 204.006 239.198 197.678 230.331 C 195.678 227.530 193.851 223.591 193.850 223.591 C 193.854 223.590 236.496 220.451 236.500 220.450 C 236.502 220.447 218.119 202.966 213.641 189.258 C 216.040 174.615 233.191 155.821 233.193 155.817 C 233.196 155.819 262.926 162.179 268.190 173.255 C 268.188 173.258 269.385 187.497 266.587 215.324 C 276.641 212.580 288.741 209.577 298.224 205.875 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 228.376 187.884 C 228.381 187.883 275.523 174.140 275.528 174.138 C 275.528 174.142 277.773 205.004 277.774 205.007 C 277.769 205.006 232.540 199.475 230.854 197.773 C 230.607 197.524 228.376 187.885 228.376 187.884 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 239.240 192.061 C 251.665 190.809 264.090 189.557 276.514 188.306 M 230.854 197.773 C 230.607 197.524 228.376 187.885 228.376 187.884 C 228.381 187.883 275.523 174.140 275.528 174.138 C 275.528 174.142 277.773 205.004 277.774 205.007 C 277.769 205.006 232.540 199.475 230.854 197.773 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 309.048 339.998 C 297.867 347.169 262.599 353.746 240.613 343.871 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 230.696 371.112 C 227.679 379.330 225.377 386.255 225.706 386.817 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 225.706 386.817 C 239.665 391.643 258.321 395.144 278.030 395.185 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 278.030 395.185 C 295.718 395.223 314.249 392.422 331.380 384.984 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 331.380 384.984 C 339.380 381.510 347.075 377.025 354.225 371.344 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 354.225 371.344 C 346.495 361.986 339.113 355.429 332.390 351.243 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 309.048 339.998 C 297.867 347.169 262.599 353.746 240.613 343.871 C 240.612 343.874 234.118 361.220 230.696 371.112 C 227.679 379.330 225.377 386.255 225.706 386.817 C 239.665 391.643 258.321 395.144 278.030 395.185 C 295.718 395.223 314.249 392.422 331.380 384.984 C 339.380 381.510 347.075 377.025 354.225 371.344 C 346.495 361.986 339.113 355.429 332.390 351.243 C 322.504 343.561 309.901 339.959 309.048 339.998 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 498.294 274.626 C 496.796 274.395 495.402 275.418 495.171 276.915 C 494.940 278.413 495.962 279.808 497.460 280.039 C 498.958 280.270 500.353 279.248 500.583 277.750 C 500.814 276.252 499.792 274.857 498.294 274.626 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 323.634 122.912 C 319.745 127.375 314.196 122.521 314.195 122.521 C 314.195 122.522 315.128 126.520 310.154 128.920 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 164.694 381.566 C 147.813 385.261 133.490 396.071 138.470 424.323 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 132.243 375.803 C 140.454 370.761 156.372 369.671 164.694 381.566 C 147.813 385.261 133.490 396.071 138.470 424.323 C 140.540 436.068 139.982 460.393 120.886 465.664 C 112.856 428.837 105.382 394.119 132.243 375.803 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 120.886 465.664 C 112.856 428.837 105.382 394.119 132.243 375.803 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 98.092 385.627 C 74.193 415.776 103.837 475.436 98.858 532.188 C 118.608 518.943 126.487 491.349 120.886 465.664 C 112.856 428.837 105.382 394.119 132.243 375.803 C 114.034 371.659 102.904 380.669 98.092 385.627 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 98.092 385.627 C 74.193 415.776 103.837 475.436 98.858 532.188 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 98.858 532.188 C 95.542 569.988 74.002 579.537 62.961 577.678 C 81.993 513.406 54.682 445.510 73.202 407.721 C 78.007 397.913 85.670 385.258 98.092 385.627 C 74.193 415.776 103.837 475.436 98.858 532.188 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 73.202 407.721 C 54.682 445.510 81.993 513.406 62.961 577.678 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 62.961 577.678 C 50.734 601.143 31.447 609.323 15.204 593.997 C 54.950 552.865 35.305 493.417 42.786 455.036 C 46.499 435.991 55.653 418.406 73.202 407.721 C 54.682 445.510 81.993 513.406 62.961 577.678 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 15.204 593.997 C 54.950 552.865 35.305 493.417 42.786 455.036 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 478.657 226.913 C 482.246 224.282 483.020 219.265 480.390 215.676 C 477.759 212.087 472.742 211.313 469.153 213.944 C 465.564 216.574 464.790 221.591 467.421 225.180 C 470.051 228.769 475.068 229.543 478.657 226.913 M 486.504 237.374 C 486.504 237.371 492.549 225.870 483.526 213.558 C 474.504 201.246 461.716 203.547 461.714 203.546 C 461.714 203.549 455.669 215.049 464.692 227.361 C 473.715 239.673 486.502 237.373 486.504 237.374 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 148.005 503.979 C 197.816 517.838 256.297 510.298 306.684 496.339 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 330.148 489.194 C 335.926 487.266 341.521 485.156 347.030 483.236 C 414.591 459.691 409.207 376.241 476.255 377.858 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 339.473 335.068 C 343.901 335.893 389.889 348.506 424.842 330.911 C 470.709 307.823 479.210 279.768 478.638 273.331 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":181.099,\\\"max\\\":284.154},\\\"y\\\":{\\\"min\\\":397.945,\\\"max\\\":501}},{\\\"x\\\":{\\\"min\\\":241.997,\\\"max\\\":310.934},\\\"y\\\":{\\\"min\\\":262.233,\\\"max\\\":331.17}},{\\\"x\\\":{\\\"min\\\":37.739,\\\"max\\\":155.903},\\\"y\\\":{\\\"min\\\":128.091,\\\"max\\\":246.255}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":261.157,\\\"y\\\":659.822,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":705.158,\\\"y\\\":650.232,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.00507239851241023,\\\"y\\\":-0.9999871353039154}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":482.562,\\\"y\\\":538.656,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005072398512410183,\\\"y\\\":0.9999871353039154}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"knot_3pt\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":50.91776523223947,\\\"max\\\":669.0579908121013},\\\"y\\\":{\\\"min\\\":25.384241628995266,\\\"max\\\":608.757}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"knot_3pt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"knot_3pt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#82C6C1FE-43D5-4352-9E03-49E7A24C1028_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 457.480 270.352 C 442.893 215.912 409.765 166.440 360.481 131.825 C 354.761 127.806 348.469 123.787 341.940 120.017 C 328.882 112.478 315.433 106.259 302.676 101.655 C 253.215 83.795 201.688 82.340 153.977 95.124 C 140.030 98.861 126.410 103.814 113.088 110.031 C 114.339 124.394 116.871 138.795 120.640 152.864 C 133.424 200.576 160.449 244.471 200.648 278.377 C 196.306 301.094 194.601 324.512 195.451 347.880 C 161.921 326.601 125.220 291.278 97.457 244.876 C 69.694 198.474 50.871 140.994 53.096 75.399 C 100.492 38.698 159.680 26.181 215.821 27.474 C 271.962 28.766 325.057 43.868 360.268 62.403 C 364.218 64.481 367.924 66.516 371.603 68.639 C 388.525 78.409 404.164 89.532 418.463 101.791 C 466.333 142.831 499.178 196.604 514.822 254.987 C 516.853 262.569 518.595 270.229 520.025 277.846 C 503.113 292.220 484.530 304.070 465.012 313.228 C 463.738 298.571 461.217 284.298 457.480 270.352 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.268 62.403 C 364.218 64.481 367.924 66.516 371.603 68.639 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.603 68.639 C 388.525 78.409 404.164 89.532 418.463 101.791 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 520.025 277.846 C 503.113 292.220 484.530 304.070 465.012 313.228 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#82C6C1FE-43D5-4352-9E03-49E7A24C1028_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 255.495 313.268 C 253.633 334.692 254.607 356.886 258.427 378.501 C 318.134 399.519 381.125 401.077 439.508 385.434 C 447.091 383.402 454.595 381.080 461.947 378.595 C 484.192 370.678 505.649 360.684 525.003 347.853 C 553.073 329.242 589.643 295.547 618.649 249.311 C 647.654 203.076 669.095 144.301 666.904 75.534 C 626.000 49.910 579.623 36.651 536.174 31.753 C 492.725 26.854 452.205 30.317 423.014 38.139 C 412.239 41.026 401.622 44.499 391.164 48.547 C 380.705 52.594 370.406 57.217 360.268 62.403 C 364.218 64.481 367.924 66.516 371.603 68.639 C 388.525 78.409 404.164 89.532 418.463 101.791 C 425.239 99.294 431.830 97.455 438.378 95.481 C 495.309 78.318 562.997 92.977 606.885 110.176 C 604.937 136.147 593.388 179.800 574.478 212.552 C 559.743 238.074 541.193 259.980 520.025 277.846 C 503.113 292.220 484.530 304.070 465.012 313.228 C 451.711 319.401 438.091 324.355 424.144 328.092 C 369.704 342.679 310.296 338.727 255.495 313.268 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 302.676 101.655 C 315.433 106.259 328.882 112.478 341.940 120.017 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 341.940 120.017 C 348.469 123.787 354.761 127.806 360.481 131.825 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 255.495 313.268 C 253.633 334.692 254.607 356.886 258.427 378.501 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 461.947 378.595 C 484.192 370.678 505.649 360.684 525.003 347.853 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 195.451 347.880 C 194.601 324.512 196.306 301.094 200.648 278.377 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#82C6C1FE-43D5-4352-9E03-49E7A24C1028_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 200.648 278.377 C 207.006 244.757 218.872 212.178 236.666 181.358 C 254.506 150.457 276.858 123.833 302.676 101.655 C 315.433 106.259 328.882 112.478 341.940 120.017 C 348.469 123.787 354.761 127.806 360.481 131.825 C 331.979 151.648 306.892 178.376 288.044 211.021 C 269.440 243.245 258.868 277.852 255.495 313.268 C 253.633 334.692 254.607 356.886 258.427 378.501 C 259.828 385.452 261.526 392.211 263.151 398.985 C 273.501 442.139 312.641 505.803 360.172 537.553 C 415.546 503.043 451.890 430.858 461.947 378.595 C 484.192 370.678 505.649 360.684 525.003 347.853 C 521.803 385.367 507.858 438.339 481.103 487.809 C 454.349 537.280 413.053 576.320 360.349 606.757 C 309.531 573.948 274.807 540.442 250.832 507.840 C 226.856 475.239 213.630 443.541 205.808 414.350 C 202.863 403.355 200.527 392.198 198.801 381.059 C 197.074 369.920 195.958 358.800 195.451 347.880 C 194.601 324.512 196.306 301.094 200.648 278.377 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":230.455,\\\"max\\\":489.545},\\\"y\\\":{\\\"min\\\":112.166,\\\"max\\\":371.256}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":695.199,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":63.414,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}},{\\\"point\\\":{\\\"x\\\":195.364,\\\"y\\\":348.475,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8685346856331806,\\\"y\\\":0.4956283888681845}},{\\\"point\\\":{\\\"x\\\":525.112,\\\"y\\\":348.475,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8685528772243292,\\\"y\\\":0.495596508729974}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":54.386,\\\"y\\\":77.091,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8660425293174796,\\\"y\\\":-0.49997033653346123}},{\\\"point\\\":{\\\"x\\\":665.062,\\\"y\\\":77.091,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8660425293174787,\\\"y\\\":-0.4999703365334625}},{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":605.155,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"82C6C1FE-43D5-4352-9E03-49E7A24C1028_0\\\",\\\"x1\\\":\\\"65.39%\\\",\\\"y1\\\":\\\"156.88%\\\",\\\"x2\\\":\\\"44.19%\\\",\\\"y2\\\":\\\"-36.88%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"52.16%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"82C6C1FE-43D5-4352-9E03-49E7A24C1028_1\\\",\\\"x1\\\":\\\"-33.35%\\\",\\\"y1\\\":\\\"22.94%\\\",\\\"x2\\\":\\\"102.82%\\\",\\\"y2\\\":\\\"88.73%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"52.16%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"82C6C1FE-43D5-4352-9E03-49E7A24C1028_2\\\",\\\"x1\\\":\\\"122.05%\\\",\\\"y1\\\":\\\"1.71%\\\",\\\"x2\\\":\\\"-21.85%\\\",\\\"y2\\\":\\\"78.75%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"52.16%\\\",\\\"color\\\":\\\"#ffffff\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"],\\\"never_flip_attachments\\\":true}},{\\\"name\\\":\\\"knot_4pt\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":66.29127446827715,\\\"max\\\":652.2502543572593},\\\"y\\\":{\\\"min\\\":68.58349811385999,\\\"max\\\":653.3307728928319}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"knot_4pt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"knot_4pt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6E61F7F6-5693-47EC-81D6-F50DFC04B17B_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 309.863 238.116 C 290.502 240.764 270.639 244.865 250.335 250.793 C 262.587 208.655 282.675 167.289 312.316 135.967 C 322.407 125.300 334.394 115.354 347.708 107.271 C 351.462 104.991 360.172 100.185 360.173 100.184 C 360.201 100.180 507.786 22.068 603.457 119.640 C 664.031 181.418 658.899 287.100 619.805 360.276 C 617.283 355.515 615.056 351.562 612.746 347.697 C 606.038 336.471 598.387 325.796 589.043 316.981 C 611.590 261.931 601.255 190.320 565.856 155.892 C 531.161 122.151 462.013 111.809 407.767 135.875 C 400.686 139.017 393.472 142.032 386.784 145.841 C 377.214 151.293 359.994 165.266 359.991 165.268 C 359.985 165.276 321.663 210.412 309.863 238.116 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 619.805 360.276 C 617.283 355.515 615.056 351.562 612.746 347.697 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 612.746 347.697 C 606.038 336.471 598.387 325.796 589.043 316.981 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6E61F7F6-5693-47EC-81D6-F50DFC04B17B_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 565.856 567.960 C 531.438 601.917 461.762 605.953 407.287 584.246 C 396.967 595.079 385.269 604.784 372.320 612.736 C 368.567 615.040 364.721 617.264 360.034 619.798 C 431.885 657.930 546.137 655.980 595.553 609.607 C 668.282 541.357 660.027 436.163 619.805 360.276 C 617.283 355.515 615.056 351.562 612.746 347.697 C 606.038 336.471 598.387 325.796 589.043 316.981 C 542.399 272.978 485.373 254.553 469.619 250.486 C 475.492 270.659 479.513 290.742 481.983 310.061 C 511.655 322.902 538.680 340.835 558.448 364.517 C 564.533 371.702 569.674 378.982 574.176 386.773 C 578.069 393.513 581.068 400.854 584.083 407.456 C 609.402 462.892 600.696 533.587 565.856 567.960 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.034 619.798 C 364.721 617.264 368.567 615.040 372.320 612.736 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 372.320 612.736 C 385.269 604.784 396.967 595.079 407.287 584.246 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6E61F7F6-5693-47EC-81D6-F50DFC04B17B_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 153.789 567.960 C 118.994 533.548 111.710 462.851 135.916 407.187 C 125.053 396.885 115.302 385.215 107.281 372.309 C 105.013 368.660 102.823 364.921 100.113 360.077 C 60.036 433.224 50.200 536.857 115.749 602.832 C 181.679 669.191 286.158 660.005 360.034 619.798 C 364.721 617.264 368.567 615.040 372.320 612.736 C 385.269 604.784 396.967 595.079 407.287 584.246 C 436.767 553.303 456.974 511.999 469.249 469.551 C 449.216 475.394 429.183 479.446 409.900 481.938 C 397.841 509.593 381.355 535.017 359.947 554.328 C 351.547 562.065 342.777 568.590 333.244 574.165 C 327.146 577.730 320.618 580.736 313.119 584.158 C 259.692 608.539 188.630 602.418 153.789 567.960 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 312.316 135.967 C 322.407 125.300 334.394 115.354 347.708 107.271 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 347.708 107.271 C 351.462 104.991 360.172 100.185 360.173 100.184 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 100.113 360.077 C 102.823 364.921 105.013 368.660 107.281 372.309 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 107.281 372.309 C 115.302 385.215 125.053 396.885 135.916 407.187 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6E61F7F6-5693-47EC-81D6-F50DFC04B17B_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 153.789 155.892 C 188.187 121.702 258.976 109.230 312.316 135.967 C 322.407 125.300 334.394 115.354 347.708 107.271 C 351.462 104.991 360.172 100.185 360.173 100.184 C 320.619 67.416 183.474 49.204 113.490 121.898 C 50.835 186.981 60.687 288.536 100.113 360.077 C 102.823 364.921 105.013 368.660 107.281 372.309 C 115.302 385.215 125.053 396.885 135.916 407.187 C 166.851 436.526 207.953 456.728 250.803 469.390 C 245.014 449.922 240.829 429.848 238.217 410.471 C 210.599 398.922 184.691 382.840 164.326 361.277 C 156.143 352.616 148.491 342.399 142.184 331.106 C 139.123 325.623 137.021 319.593 134.294 314.261 C 107.894 262.650 119.419 190.055 153.789 155.892 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 407.767 135.875 C 400.686 139.017 393.472 142.032 386.784 145.841 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 386.784 145.841 C 377.214 151.293 359.994 165.266 359.991 165.268 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 481.983 310.061 C 479.513 290.742 475.492 270.659 469.619 250.486 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6E61F7F6-5693-47EC-81D6-F50DFC04B17B_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 469.619 250.486 C 457.504 208.513 437.437 167.140 407.767 135.875 C 400.686 139.017 393.472 142.032 386.784 145.841 C 377.214 151.293 359.994 165.266 359.991 165.268 C 369.606 176.596 398.450 210.580 409.984 238.019 C 417.580 255.757 423.246 274.283 427.140 292.791 C 432.256 316.016 434.544 339.121 434.544 360.003 C 434.544 381.070 432.176 404.333 426.759 428.594 C 445.123 425.143 463.612 420.172 481.466 413.385 C 484.045 395.583 485.350 377.118 485.350 360.003 C 485.350 344.722 484.324 328.342 481.983 310.061 C 479.513 290.742 475.492 270.659 469.619 250.486 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 574.176 386.773 C 578.069 393.513 581.068 400.854 584.083 407.456 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 469.249 469.551 C 449.216 475.394 429.183 479.446 409.900 481.938 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 426.759 428.594 C 445.123 425.143 463.612 420.172 481.466 413.385 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 558.448 364.517 C 564.533 371.702 569.674 378.982 574.176 386.773 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6E61F7F6-5693-47EC-81D6-F50DFC04B17B_5)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 574.176 386.773 C 578.069 393.513 581.068 400.854 584.083 407.456 C 552.574 437.158 511.238 457.304 469.249 469.551 C 449.216 475.394 429.183 479.446 409.900 481.938 C 391.653 484.299 375.295 485.339 360.014 485.339 C 344.326 485.340 327.516 484.234 310.217 481.921 C 302.598 464.119 296.896 445.599 292.914 427.125 C 316.339 432.058 339.274 434.352 360.014 434.534 C 380.845 434.716 404.017 432.870 426.759 428.594 C 445.123 425.143 463.612 420.172 481.466 413.385 C 510.303 402.334 537.264 386.461 558.448 364.517 C 564.533 371.702 569.674 378.982 574.176 386.773 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 333.244 574.165 C 327.146 577.730 320.618 580.736 313.119 584.158 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 250.803 469.390 C 245.014 449.922 240.829 429.848 238.217 410.471 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 292.914 427.125 C 296.896 445.599 302.598 464.119 310.217 481.921 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.947 554.328 C 351.547 562.065 342.777 568.590 333.244 574.165 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6E61F7F6-5693-47EC-81D6-F50DFC04B17B_6)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 333.244 574.165 C 327.146 577.730 320.618 580.736 313.119 584.158 C 283.730 553.028 263.450 511.922 250.803 469.390 C 245.014 449.922 240.829 429.848 238.217 410.471 C 235.792 392.485 234.677 375.691 234.678 360.003 C 234.678 344.722 235.710 328.351 238.022 310.362 C 255.822 302.656 274.357 296.912 292.703 292.999 C 287.766 316.070 285.483 339.147 285.483 360.003 C 285.483 380.885 287.810 403.925 292.914 427.125 C 296.896 445.599 302.598 464.119 310.217 481.921 C 321.715 508.991 338.155 534.586 359.947 554.328 C 351.547 562.065 342.777 568.590 333.244 574.165 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 134.294 314.261 C 137.021 319.593 139.123 325.623 142.184 331.106 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 142.184 331.106 C 148.491 342.399 156.143 352.616 164.326 361.277 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 238.022 310.362 C 255.822 302.656 274.357 296.912 292.703 292.999 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 427.140 292.791 C 423.246 274.283 417.580 255.757 409.984 238.019 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 309.863 238.116 C 290.502 240.764 270.639 244.865 250.335 250.793 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6E61F7F6-5693-47EC-81D6-F50DFC04B17B_7)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 250.335 250.793 C 207.584 263.274 165.645 283.935 134.294 314.261 C 137.021 319.593 139.123 325.623 142.184 331.106 C 148.491 342.399 156.143 352.616 164.326 361.277 C 184.536 338.883 210.446 322.109 238.022 310.362 C 255.822 302.656 274.357 296.912 292.703 292.999 C 316.068 287.785 339.132 285.473 360.014 285.473 C 381.081 285.473 404.376 287.823 427.140 292.791 C 423.246 274.283 417.580 255.757 409.984 238.019 C 393.509 235.804 376.144 234.667 360.014 234.667 C 343.884 234.667 326.561 235.830 309.863 238.116 C 290.502 240.764 270.639 244.865 250.335 250.793 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":183.076,\\\"max\\\":535.831},\\\"y\\\":{\\\"min\\\":183.739,\\\"max\\\":536.495}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":359.454,\\\"y\\\":700.713,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":359.454,\\\"y\\\":100.663,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":102.224,\\\"y\\\":361.095,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873384758834,\\\"y\\\":0.005032185203186421}},{\\\"point\\\":{\\\"x\\\":619.826,\\\"y\\\":361.095,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873384758833,\\\"y\\\":0.00503218520318645}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":601.221,\\\"y\\\":604.414,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128949235519685,\\\"y\\\":0.7012708663375606}},{\\\"point\\\":{\\\"x\\\":116.821,\\\"y\\\":604.464,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987294009752026,\\\"y\\\":0.7153860665492686}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":602.749,\\\"y\\\":117.888,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314567850888928,\\\"y\\\":-0.775411070700696}},{\\\"point\\\":{\\\"x\\\":116.984,\\\"y\\\":117.971,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817169768754568,\\\"y\\\":-0.7316159945215712}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.454,\\\"y\\\":618.561,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6E61F7F6-5693-47EC-81D6-F50DFC04B17B_0\\\",\\\"x1\\\":\\\"1.50%\\\",\\\"y1\\\":\\\"135.31%\\\",\\\"x2\\\":\\\"38.74%\\\",\\\"y2\\\":\\\"9.01%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"82.35%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6E61F7F6-5693-47EC-81D6-F50DFC04B17B_1\\\",\\\"x1\\\":\\\"-35.47%\\\",\\\"y1\\\":\\\"1.63%\\\",\\\"x2\\\":\\\"92.01%\\\",\\\"y2\\\":\\\"33.23%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"82.35%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6E61F7F6-5693-47EC-81D6-F50DFC04B17B_2\\\",\\\"x1\\\":\\\"99.03%\\\",\\\"y1\\\":\\\"-35.60%\\\",\\\"x2\\\":\\\"67.19%\\\",\\\"y2\\\":\\\"91.75%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"82.35%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6E61F7F6-5693-47EC-81D6-F50DFC04B17B_3\\\",\\\"x1\\\":\\\"135.51%\\\",\\\"y1\\\":\\\"97.98%\\\",\\\"x2\\\":\\\"13.13%\\\",\\\"y2\\\":\\\"63.90%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"82.35%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6E61F7F6-5693-47EC-81D6-F50DFC04B17B_4\\\",\\\"x1\\\":\\\"-0.55%\\\",\\\"y1\\\":\\\"-28.83%\\\",\\\"x2\\\":\\\"109.87%\\\",\\\"y2\\\":\\\"126.92%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"35.69%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"67.84%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6E61F7F6-5693-47EC-81D6-F50DFC04B17B_5\\\",\\\"x1\\\":\\\"-41.16%\\\",\\\"y1\\\":\\\"103.44%\\\",\\\"x2\\\":\\\"131.39%\\\",\\\"y2\\\":\\\"-33.98%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"35.69%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"67.84%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6E61F7F6-5693-47EC-81D6-F50DFC04B17B_6\\\",\\\"x1\\\":\\\"121.58%\\\",\\\"y1\\\":\\\"130.48%\\\",\\\"x2\\\":\\\"0.01%\\\",\\\"y2\\\":\\\"-35.00%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"35.69%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"67.84%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6E61F7F6-5693-47EC-81D6-F50DFC04B17B_7\\\",\\\"x1\\\":\\\"-35.33%\\\",\\\"y1\\\":\\\"114.21%\\\",\\\"x2\\\":\\\"126.05%\\\",\\\"y2\\\":\\\"-10.69%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"35.69%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"67.84%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"ladder\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":128.27175093820705,\\\"max\\\":591.7282490617929},\\\"y\\\":{\\\"min\\\":18.152295309283048,\\\"max\\\":701.8477009135637}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"ladder\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"ladder\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 344.778 31.587 C 344.775 31.586 334.291 15.545 318.021 21.463 C 303.134 26.878 304.871 44.093 304.869 44.095 C 304.894 44.154 549.734 633.651 549.758 633.710 C 549.761 633.711 560.245 649.752 576.515 643.835 C 591.402 638.420 589.665 621.204 589.667 621.202 C 589.642 621.143 344.802 31.646 344.778 31.587 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 549.305 578.321 C 543.412 561.837 526.682 566.904 526.680 566.902 C 526.664 566.907 368.464 616.490 368.449 616.495 C 368.450 616.498 382.052 649.248 382.053 649.251 C 382.069 649.246 540.269 599.664 540.284 599.659 C 540.285 599.657 554.691 593.390 549.305 578.321 M 508.490 480.052 C 502.597 463.567 485.867 468.635 485.865 468.633 C 485.849 468.638 327.649 518.220 327.634 518.225 C 327.635 518.229 341.237 550.979 341.238 550.982 C 341.254 550.977 499.454 501.395 499.469 501.390 C 499.470 501.388 513.877 495.121 508.490 480.052 M 467.675 381.783 C 461.782 365.298 445.052 370.365 445.050 370.364 C 445.034 370.369 286.834 419.952 286.819 419.957 C 286.820 419.960 300.422 452.709 300.424 452.713 C 300.439 452.708 458.639 403.125 458.655 403.120 C 458.656 403.118 473.062 396.852 467.675 381.783 M 426.860 283.514 C 420.967 267.029 404.238 272.096 404.235 272.095 C 404.220 272.100 246.020 321.682 246.004 321.687 C 246.005 321.691 259.607 354.440 259.609 354.443 C 259.624 354.438 417.824 304.856 417.840 304.851 C 417.841 304.849 432.247 298.582 426.860 283.514 M 386.046 185.245 C 380.153 168.760 363.423 173.827 363.420 173.826 C 363.404 173.831 205.205 223.413 205.189 223.418 C 205.190 223.421 218.792 256.171 218.794 256.175 C 218.809 256.170 377.009 206.587 377.025 206.582 C 377.026 206.580 391.432 200.314 386.046 185.245 M 345.231 86.976 C 339.338 70.491 322.608 75.558 322.605 75.557 C 322.589 75.562 164.390 125.144 164.374 125.149 C 164.375 125.152 177.977 157.902 177.979 157.905 C 177.994 157.900 336.194 108.318 336.210 108.313 C 336.211 108.311 350.617 102.045 345.231 86.976 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 170.242 86.290 C 170.239 86.289 159.755 70.247 143.485 76.165 C 128.598 81.580 130.335 98.795 130.333 98.797 C 130.358 98.856 375.198 688.354 375.222 688.412 C 375.225 688.414 385.709 704.455 401.979 698.537 C 416.866 693.122 415.129 675.907 415.131 675.905 C 415.106 675.846 170.266 86.348 170.242 86.290 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":694.407,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":255.525,\\\"y\\\":99.968,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.27007212891184773,\\\"y\\\":-0.9628400932579732}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":467.37,\\\"y\\\":332.825,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9266472453667365,\\\"y\\\":-0.37593201866060755}},{\\\"point\\\":{\\\"x\\\":257.942,\\\"y\\\":395.531,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9228049882200857,\\\"y\\\":0.3852673795121092}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":577.799,\\\"y\\\":633.04,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9261709284207758,\\\"y\\\":0.37710397949133106}},{\\\"point\\\":{\\\"x\\\":393.572,\\\"y\\\":687.685,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.37384093164704446,\\\"y\\\":0.9274928343794737}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":327.19,\\\"y\\\":29.345,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.28876765724251,\\\"y\\\":-0.9573992062513276}},{\\\"point\\\":{\\\"x\\\":142.524,\\\"y\\\":89.054,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.908887076806783,\\\"y\\\":-0.41704230194744124}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":470.501,\\\"y\\\":622.032,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.38064377930345644,\\\"y\\\":0.9247217491102833}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"lamb_head\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":1.9986348114116232,\\\"max\\\":718.0013651885882},\\\"y\\\":{\\\"min\\\":131.56683394383313,\\\"max\\\":589.357}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lamb_head2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lamb_head2_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.301 587.357 C 368.386 587.357 392.221 585.924 403.327 575.477 C 411.675 567.625 415.206 543.334 415.207 543.331 C 415.218 543.317 499.924 499.084 517.935 408.457 C 534.633 324.437 506.649 277.960 503.983 263.112 C 509.961 257.100 515.982 253.841 523.525 251.920 C 545.233 250.793 571.805 260.007 592.710 255.414 C 634.562 246.220 693.999 218.477 712.907 186.231 C 735.969 146.901 624.013 129.099 579.431 134.518 C 545.808 138.604 489.292 193.912 489.283 193.918 C 489.277 193.915 432.703 146.874 361.398 147.096 C 292.908 147.311 230.723 193.915 230.718 193.918 C 230.709 193.912 174.193 138.604 140.569 134.518 C 95.987 129.099 -15.969 146.901 7.093 186.231 C 26.001 218.478 85.438 246.220 127.291 255.414 C 148.196 260.007 174.767 250.793 196.475 251.920 C 204.018 253.841 210.040 257.100 216.017 263.112 C 213.352 277.960 185.368 324.437 202.066 408.457 C 220.077 499.084 304.783 543.317 304.793 543.331 C 304.794 543.334 305.465 565.757 316.673 575.477 C 327.701 585.040 346.718 587.357 359.301 587.357 M 244.090 322.502 C 258.606 330.330 302.241 326.002 302.242 325.996 C 302.239 325.991 297.969 290.250 268.184 279.174 C 240.322 268.815 215.348 291.053 215.343 291.055 C 215.346 291.058 232.712 316.366 244.090 322.502 M 475.910 322.502 C 461.394 330.330 417.759 326.002 417.758 325.996 C 417.761 325.991 422.031 290.250 451.816 279.174 C 479.678 268.814 504.652 291.053 504.657 291.055 C 504.654 291.058 487.288 316.366 475.910 322.502 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 224.973 247.316 C 225.755 239.415 227.922 228.162 227.922 228.160 C 227.913 228.154 197.519 174.682 140.569 159.675 C 86.212 145.352 56.156 161.527 35.745 175.049 M 500.618 247.316 C 499.836 239.415 497.669 228.162 497.669 228.160 C 497.678 228.154 528.072 174.682 585.022 159.675 C 639.379 145.352 669.435 161.527 689.846 175.049 M 347.393 478.286 C 347.392 478.286 342.115 479.905 337.321 477.816 C 333.128 475.989 330.961 471.709 330.960 471.708 C 330.962 471.708 343.053 473.432 346.333 474.997 C 350.047 476.769 351.444 486.273 360.115 486.273 C 368.785 486.273 370.182 476.769 373.896 474.997 C 377.176 473.432 389.267 471.708 389.269 471.708 C 389.268 471.709 384.913 476.903 381.318 478.286 C 378.174 479.495 375.310 478.599 372.306 478.755 M 303.727 328.290 C 303.728 328.304 309.875 352.308 322.479 474.751 C 324.027 489.787 358.701 497.301 358.705 497.303 C 358.705 497.307 360.303 533.529 358.603 534.945 C 355.927 537.174 320.308 537.837 301.998 517.474 C 295.232 509.950 295.709 496.512 295.708 496.509 M 416.274 328.290 C 416.273 328.304 415.698 351.042 398.220 475.221 C 396.057 490.587 360.118 497.301 360.115 497.303 C 360.115 497.307 360.185 533.971 361.398 534.945 C 363.305 536.478 399.692 537.837 418.003 517.474 C 424.768 509.950 424.292 496.512 424.292 496.509 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 244.090 322.502 C 258.606 330.330 302.241 326.002 302.242 325.996 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 302.242 325.996 C 302.239 325.991 297.969 290.250 268.184 279.174 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 268.184 279.174 C 240.322 268.815 215.348 291.053 215.343 291.055 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 215.343 291.055 C 215.346 291.058 232.712 316.366 244.090 322.502 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 475.910 322.502 C 461.394 330.330 417.759 326.002 417.758 325.996 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 417.758 325.996 C 417.761 325.991 422.031 290.250 451.816 279.174 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 451.816 279.174 C 479.678 268.814 504.652 291.053 504.657 291.055 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 504.657 291.055 C 504.654 291.058 487.288 316.366 475.910 322.502 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 244.090 322.502 C 258.606 330.330 302.241 326.002 302.242 325.996 C 302.239 325.991 297.969 290.250 268.184 279.174 C 240.322 268.815 215.348 291.053 215.343 291.055 C 215.346 291.058 232.712 316.366 244.090 322.502 M 475.910 322.502 C 461.394 330.330 417.759 326.002 417.758 325.996 C 417.761 325.991 422.031 290.250 451.816 279.174 C 479.678 268.814 504.652 291.053 504.657 291.055 C 504.654 291.058 487.288 316.366 475.910 322.502 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":299.158,\\\"max\\\":420.842},\\\"y\\\":{\\\"min\\\":166.06,\\\"max\\\":287.743}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":647.785,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":147.736,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":198.796,\\\"y\\\":360.936,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869423966429,\\\"y\\\":0.00511028729265185}},{\\\"point\\\":{\\\"x\\\":523.229,\\\"y\\\":360.936,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869423966429,\\\"y\\\":0.005110287292651861}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":455.342,\\\"y\\\":513.543,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064748,\\\"y\\\":0.7012692123096449}},{\\\"point\\\":{\\\"x\\\":264.812,\\\"y\\\":513.591,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986883991125071,\\\"y\\\":0.7154261114507926}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":463.651,\\\"y\\\":175.162,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631445428603132,\\\"y\\\":-0.7754203187279831}},{\\\"point\\\":{\\\"x\\\":260.076,\\\"y\\\":175.241,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817454199674203,\\\"y\\\":-0.7315894903246256}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":586.755,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"leg\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":127.57730249524988,\\\"max\\\":555.6833939019136},\\\"y\\\":{\\\"min\\\":35.68740384101428,\\\"max\\\":702.2798977868451}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#87F3D298-D77C-4EE5-AA95-CFD1D9C3DCCC_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 229.165 693.310 C 232.557 692.550 233.710 696.971 248.325 697.707 C 261.906 698.391 311.189 689.867 324.783 689.536 C 335.650 689.271 377.453 699.366 386.162 692.861 C 390.967 689.272 397.545 666.652 396.886 660.692 C 396.099 653.579 378.506 632.843 375.439 626.378 C 356.433 586.308 340.314 468.549 314.346 417.602 C 300.327 390.096 247.824 364.414 248.800 353.270 C 250.547 333.341 450.913 264.419 491.568 240.113 C 524.011 220.716 571.664 165.500 546.723 107.810 C 527.773 63.977 470.724 15.419 398.908 48.738 C 360.701 66.464 244.626 170.755 217.241 202.757 C 198.305 224.885 134.960 313.673 129.846 342.345 C 128.594 349.370 131.973 375.808 134.702 382.401 C 159.783 443.016 324.762 590.827 319.014 627.084 C 317.439 637.022 275.806 645.391 266.064 647.907 C 257.749 650.054 226.517 653.939 217.943 654.424 C 211.058 653.690 195.944 651.099 180.988 641.488 C 176.095 638.344 162.775 645.259 171.013 658.113 C 175.154 664.575 196.280 662.103 196.283 662.103 C 196.281 662.104 172.434 663.341 174.338 670.083 C 177.654 681.829 201.600 672.078 201.603 672.078 C 201.601 672.079 175.691 674.036 181.653 683.383 C 188.242 693.712 210.245 678.729 210.248 678.728 C 210.246 678.729 188.395 685.049 193.623 692.028 C 199.224 699.505 219.791 687.154 219.794 687.154 C 219.792 687.154 202.251 694.475 204.938 697.234 C 213.213 705.733 226.974 693.800 229.165 693.310 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":438.229,\\\"y\\\":146.803,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6753245261508284,\\\"y\\\":0.7375207009834768}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":450.818,\\\"y\\\":35.093,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":385.86,\\\"y\\\":694.922,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5860410322104739,\\\"y\\\":0.8102813761686013}},{\\\"point\\\":{\\\"x\\\":209.8,\\\"y\\\":696.107,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5860410322104739,\\\"y\\\":0.8102813761686013}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":350.426,\\\"y\\\":76.84,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7727781591759261,\\\"y\\\":-0.6346762298216841}},{\\\"point\\\":{\\\"x\\\":537.421,\\\"y\\\":90.714,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7932497595550108,\\\"y\\\":-0.608896394278959}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":530.651,\\\"y\\\":204.717,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7071363455967201,\\\"y\\\":0.7070772155402237}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"87F3D298-D77C-4EE5-AA95-CFD1D9C3DCCC_0\\\",\\\"x1\\\":\\\"28.89%\\\",\\\"y1\\\":\\\"57.57%\\\",\\\"x2\\\":\\\"155.73%\\\",\\\"y2\\\":\\\"-63.42%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"8.24%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"leg_crouch\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":52.872875535464225,\\\"max\\\":644.9842474442651},\\\"y\\\":{\\\"min\\\":19.11614221691698,\\\"max\\\":699.6569816743961}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg_crouch\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg_crouch\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#217DEAF3-DC06-4FF5-B2C0-6093B29B552B_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 639.278 121.061 C 614.492 21.801 518.840 10.915 448.522 27.429 C 192.334 87.593 184.034 182.684 80.130 236.325 C 41.838 256.093 51.788 335.818 78.824 350.105 C 122.533 373.203 161.228 425.859 225.459 474.945 C 286.166 521.338 365.786 563.781 375.644 577.774 C 390.578 598.970 310.036 607.438 295.716 608.526 C 287.256 609.169 233.450 620.340 222.795 619.420 C 175.005 615.297 175.914 601.846 161.099 610.558 C 148.295 618.088 172.442 645.983 182.600 642.797 C 204.563 635.908 224.095 640.942 224.099 640.942 C 224.095 640.942 185.490 636.982 184.177 647.974 C 182.963 658.138 200.583 661.684 206.308 659.818 C 220.033 655.346 226.292 655.683 226.294 655.683 C 226.291 655.684 193.637 661.711 196.134 667.619 C 201.231 679.677 219.795 676.963 224.249 673.857 C 232.964 667.781 244.550 667.236 244.552 667.235 C 244.550 667.237 216.326 676.516 220.528 682.088 C 227.691 691.589 236.401 689.450 242.041 685.728 C 254.716 677.362 261.504 678.788 261.506 678.788 C 261.504 678.789 232.270 688.092 239.789 694.456 C 243.919 697.952 252.671 698.250 254.985 696.942 C 262.306 692.803 277.157 690.990 292.282 693.093 C 342.274 700.044 364.753 691.028 394.961 691.277 C 422.383 691.503 453.795 697.937 488.131 694.413 C 525.643 690.564 520.590 646.811 512.364 631.315 C 507.102 621.402 482.595 597.976 475.190 580.717 C 442.957 505.600 438.517 466.260 370.074 374.599 C 342.393 337.529 254.312 321.627 254.301 321.622 C 254.320 321.616 360.677 317.636 450.434 265.069 C 583.103 323.141 661.352 209.456 639.278 121.061 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":516.314,\\\"y\\\":137.046,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7071282911194924,\\\"y\\\":0.7070852705992585}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":514.88,\\\"y\\\":19.644,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":245.19,\\\"y\\\":692.397,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698688399112506,\\\"y\\\":0.7154261114507937}},{\\\"point\\\":{\\\"x\\\":486.662,\\\"y\\\":692.397,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6986883991125071,\\\"y\\\":0.7154261114507926}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":640.804,\\\"y\\\":144.12,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":584.572,\\\"y\\\":261.507,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.566369966012621,\\\"y\\\":0.8241511157541817}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"217DEAF3-DC06-4FF5-B2C0-6093B29B552B_0\\\",\\\"x1\\\":\\\"-2.28%\\\",\\\"y1\\\":\\\"83.77%\\\",\\\"x2\\\":\\\"144.94%\\\",\\\"y2\\\":\\\"-45.92%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"39.61%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"leg_hoof\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":179.522,\\\"max\\\":542.8386173936267},\\\"y\\\":{\\\"min\\\":24.711216587980402,\\\"max\\\":702.517}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg_hoof\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg_hoof\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#4888DE4E-3CEC-45A9-B248-0F6A242AD72D_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 262.448 76.190 C 169.494 168.080 193.768 278.851 211.734 323.283 C 241.223 396.212 358.661 413.649 369.270 448.448 C 375.479 468.815 355.227 546.789 341.215 562.822 C 330.342 575.264 270.288 588.538 257.053 598.429 C 249.890 603.782 224.628 635.767 224.625 635.770 C 224.620 635.777 181.527 697.692 181.522 697.698 C 181.526 697.699 223.554 700.517 223.558 700.517 C 223.567 700.517 309.916 697.699 309.924 697.698 C 309.926 697.693 324.225 643.236 324.227 643.231 C 324.227 643.229 325.669 626.664 328.267 624.326 C 334.214 618.973 366.985 619.613 372.507 625.405 C 401.658 655.982 405.975 530.160 416.746 486.213 C 422.126 464.260 437.431 415.166 466.380 398.813 C 482.836 389.518 404.583 391.842 393.008 324.361 C 373.609 211.278 536.845 251.600 540.832 109.639 C 541.429 88.374 501.552 39.689 453.433 30.871 C 395.511 20.256 311.094 28.100 262.448 76.190 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 255.128 640.832 C 244.605 660.727 234.081 680.622 223.558 700.517 M 224.625 635.770 C 234.792 637.458 255.125 640.831 255.128 640.832 C 255.135 640.832 301.194 642.431 324.227 643.231 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":393.066,\\\"y\\\":27.348,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":217.095,\\\"y\\\":139.956,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9961707577355445,\\\"y\\\":-0.08742895076913014}},{\\\"point\\\":{\\\"x\\\":538.036,\\\"y\\\":139.956,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9961707577355445,\\\"y\\\":-0.08742895076913001}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":383.28,\\\"y\\\":131.897,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987250814725346,\\\"y\\\":0.7153902854534718}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"4888DE4E-3CEC-45A9-B248-0F6A242AD72D_0\\\",\\\"x1\\\":\\\"50.32%\\\",\\\"y1\\\":\\\"54.28%\\\",\\\"x2\\\":\\\"66.22%\\\",\\\"y2\\\":\\\"-59.20%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"6.27%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\"]}},{\\\"name\\\":\\\"leg_stand\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":243.2623615072874,\\\"max\\\":465.38953899282956},\\\"y\\\":{\\\"min\\\":13.002510549420778,\\\"max\\\":693.0738781287013}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg_stand\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"leg_stand\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#04F60170-4A3E-4AB4-AF06-6B92E458080F_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 420.848 180.332 C 427.473 176.319 474.052 164.103 461.139 88.009 C 448.829 15.471 376.960 -4.363 322.946 34.582 C 281.169 64.704 277.858 126.194 277.839 148.422 C 277.702 312.789 332.254 355.998 332.833 379.911 C 333.286 398.624 338.529 421.178 349.348 437.199 C 356.553 447.867 363.752 537.610 361.096 618.430 C 360.404 639.470 319.381 640.875 309.424 645.962 C 305.700 647.865 280.642 657.987 275.441 658.852 C 253.021 662.582 251.779 657.159 246.216 663.107 C 241.409 668.247 256.126 677.681 260.314 674.870 C 269.369 668.792 278.921 668.457 278.923 668.457 C 278.921 668.457 260.847 671.840 261.726 677.011 C 262.538 681.793 271.021 681.039 273.372 679.423 C 279.008 675.548 281.898 674.861 281.899 674.860 C 281.898 674.861 267.868 681.983 269.796 684.333 C 273.731 689.128 281.802 685.403 283.409 683.393 C 286.553 679.462 291.745 677.659 291.746 677.659 C 291.745 677.660 280.166 685.665 282.823 687.633 C 287.353 690.989 291.024 688.847 293.087 686.399 C 297.724 680.896 301.000 680.633 301.001 680.633 C 301.000 680.634 288.965 688.785 293.236 690.668 C 295.582 691.702 299.475 690.524 300.474 689.757 C 302.190 688.441 306.187 688.628 310.089 689.062 C 334.519 691.782 345.053 683.627 359.760 683.230 C 373.306 682.864 388.823 688.245 405.738 686.057 C 423.293 683.785 417.788 663.509 415.076 655.733 C 413.641 651.617 411.841 643.350 408.950 632.129 C 400.956 601.105 429.059 555.099 431.967 479.504 C 434.267 419.693 404.753 385.400 404.743 375.510 C 404.731 364.031 430.034 335.974 430.348 253.286 C 430.532 204.594 419.991 180.851 420.848 180.332 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":377.131,\\\"y\\\":102.965,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7071282911194926,\\\"y\\\":0.7070852705992582}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":374.133,\\\"y\\\":18.151,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":327.556,\\\"y\\\":378.017,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869443305632,\\\"y\\\":0.005109908846835945}},{\\\"point\\\":{\\\"x\\\":410.856,\\\"y\\\":378.017,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869443305632,\\\"y\\\":0.005109908846835945}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":680.359,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"04F60170-4A3E-4AB4-AF06-6B92E458080F_0\\\",\\\"x1\\\":\\\"51.56%\\\",\\\"y1\\\":\\\"48.62%\\\",\\\"x2\\\":\\\"51.56%\\\",\\\"y2\\\":\\\"-98.81%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"8.24%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"lightning\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":162.964,\\\"max\\\":557.036},\\\"y\\\":{\\\"min\\\":41.558,\\\"max\\\":714.668}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lightning\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lightning\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 367.454 43.558 C 367.437 43.593 192.844 396.860 192.826 396.895 C 192.838 396.895 313.552 396.895 313.564 396.895 C 313.549 396.927 164.979 712.637 164.964 712.668 C 164.996 712.628 477.610 313.350 477.641 313.310 C 477.628 313.309 344.535 307.119 344.521 307.118 C 344.542 307.092 555.011 43.996 555.036 43.973 C 555.018 43.973 367.473 43.558 367.454 43.558 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":455.392,\\\"y\\\":40.245,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":234.935,\\\"y\\\":312.002,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8841281581425817,\\\"y\\\":-0.4672444756007352}},{\\\"point\\\":{\\\"x\\\":465.308,\\\"y\\\":317.673,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9378211029235229,\\\"y\\\":-0.3471189693913416}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":369.341,\\\"y\\\":45.177,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6816688372882462,\\\"y\\\":-0.7316608478455647}},{\\\"point\\\":{\\\"x\\\":542.079,\\\"y\\\":51.949,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7961265155756119,\\\"y\\\":-0.6051302101179836}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":455.568,\\\"y\\\":15.993,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"lion\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":97.16,\\\"max\\\":643.6598303016139},\\\"y\\\":{\\\"min\\\":95.311,\\\"max\\\":624.7946404680408}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lion\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lion\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 418.455 510.423 C 410.965 567.298 442.936 585.834 442.938 585.841 C 442.930 585.842 388.676 577.592 365.303 590.693 C 353.053 597.560 340.075 622.715 340.072 622.718 C 340.095 622.718 568.751 623.689 568.774 623.689 C 568.773 623.663 654.155 486.415 562.301 369.381 C 560.100 372.411 430.737 417.161 418.455 510.423 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 244.273 360.980 C 244.271 360.977 222.010 332.650 222.008 332.648 C 222.011 332.648 258.010 334.085 258.014 334.085 C 258.012 334.088 244.275 360.977 244.273 360.980 M 213.814 389.704 C 213.813 389.700 204.291 354.955 204.290 354.951 C 204.293 354.953 236.912 370.249 236.915 370.250 C 236.913 370.252 213.816 389.702 213.814 389.704 M 177.262 406.427 C 177.262 406.424 178.774 370.429 178.774 370.425 C 178.777 370.428 205.187 394.932 205.190 394.934 C 205.187 394.935 177.264 406.426 177.262 406.427 M 138.169 416.667 C 138.170 416.663 144.748 381.241 144.749 381.238 C 144.751 381.240 167.438 409.228 167.440 409.231 C 167.437 409.231 138.172 416.666 138.169 416.667 M 224.068 205.615 C 224.066 205.619 209.464 238.554 209.463 238.557 C 209.466 238.556 244.003 228.300 244.006 228.299 C 244.004 228.297 224.070 205.618 224.068 205.615 M 187.474 185.275 C 187.474 185.279 186.800 221.300 186.799 221.303 C 186.802 221.301 214.651 198.445 214.653 198.442 C 214.651 198.441 187.477 185.276 187.474 185.275 M 147.929 178.066 C 147.930 178.069 158.258 212.585 158.259 212.588 C 158.261 212.585 177.826 182.333 177.827 182.330 C 177.825 182.329 147.932 178.066 147.929 178.066 M 107.519 177.768 C 107.521 177.771 122.617 210.482 122.619 210.485 C 122.620 210.482 137.718 177.771 137.720 177.768 C 137.717 177.768 107.522 177.768 107.519 177.768 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 242.062 419.844 C 266.795 518.800 235.269 589.706 235.269 589.723 C 235.265 589.723 209.344 581.628 198.392 587.783 C 186.676 594.367 179.956 622.714 179.954 622.718 C 179.962 622.718 265.344 621.748 265.352 621.748 C 265.357 621.734 304.551 555.248 311.933 477.771 C 313.883 479.140 275.086 431.601 242.062 419.844 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 600.088 369.381 C 527.267 276.598 492.553 348.004 364.273 183.058 C 351.543 247.006 339.587 359.662 267.229 419.844 C 289.638 537.208 260.437 589.706 260.436 589.723 C 260.432 589.723 234.512 581.628 223.560 587.783 C 211.844 594.366 205.123 622.714 205.121 622.718 C 205.130 622.718 290.511 621.748 290.520 621.748 C 290.524 621.734 337.938 555.595 337.100 477.771 C 389.746 497.443 412.447 471.256 456.242 510.423 C 444.863 568.422 480.722 585.834 480.725 585.841 C 480.717 585.842 426.463 577.592 403.090 590.693 C 390.840 597.560 377.862 622.715 377.859 622.718 C 377.882 622.718 606.538 623.689 606.561 623.689 C 606.560 623.663 691.941 486.415 600.088 369.381 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 273.249 533.785 C 248.321 515.832 224.631 490.345 235.890 444.798 C 249.018 393.897 325.803 365.071 329.478 275.265 C 333.116 186.369 252.185 139.352 220.117 133.870 C 307.492 31.510 416.062 184.774 477.762 153.980 C 477.921 173.606 457.758 189.139 433.038 190.597 C 472.188 198.672 466.127 242.059 505.039 242.468 C 491.593 256.732 486.383 261.445 458.738 252.347 C 499.423 300.524 445.611 321.897 465.625 366.958 C 445.376 360.237 437.949 355.282 435.477 327.339 C 438.256 400.659 386.907 406.129 392.442 453.113 C 378.484 439.389 363.379 428.345 371.439 399.079 C 325.019 486.878 275.177 455.875 273.249 533.785 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 621.840 593.404 C 593.268 600.386 510.951 602.983 510.809 538.237 C 510.710 493.092 565.588 476.165 540.662 426.006 C 535.644 432.012 527.992 433.377 520.577 434.400 C 546.984 471.374 487.609 485.637 488.488 543.089 C 489.250 592.885 511.191 625.911 607.318 623.689 C 613.158 613.117 616.102 606.065 621.840 593.404 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 337.210 96.311 C 299.312 96.709 273.635 130.064 273.629 130.067 C 273.633 130.071 295.948 139.077 313.597 162.733 C 325.962 151.949 358.084 142.058 337.210 96.311 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.980 130.502 C 307.574 115.283 318.854 109.195 329.597 105.793 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 235.890 444.798 C 249.018 393.897 325.803 365.071 329.478 275.265 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 329.478 275.265 C 333.116 186.369 252.185 139.352 220.117 133.870 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 220.117 133.870 C 190.411 128.791 128.551 139.840 128.542 139.841 C 119.255 141.556 98.163 145.453 98.160 145.454 C 98.160 145.456 101.266 171.534 101.267 171.537 C 101.267 171.539 103.622 191.310 103.622 191.312 C 103.637 191.321 229.092 161.574 252.153 281.892 C 272.854 389.903 131.758 408.915 131.745 408.927 C 131.746 408.931 137.268 445.377 137.269 445.380 C 137.279 445.380 173.469 443.631 235.890 444.798 C 249.018 393.897 325.803 365.071 329.478 275.265 C 333.116 186.369 252.185 139.352 220.117 133.870 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 227.898 149.788 C 244.821 153.762 255.011 173.740 255.014 173.743 C 255.011 173.744 236.994 187.099 220.070 183.126 C 203.147 179.152 192.956 159.174 192.954 159.171 C 192.957 159.170 210.974 145.815 227.898 149.788 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 223.603 155.117 C 229.698 155.117 234.614 160.033 234.614 166.128 C 234.614 172.222 229.697 177.139 223.603 177.139 C 217.509 177.139 212.592 172.222 212.592 166.128 C 212.592 160.033 217.509 155.117 223.603 155.117 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 101.267 171.537 C 121.639 164.194 127.508 154.166 128.542 139.841 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 506.690 433.342 C 481.889 419.097 502.605 403.339 474.902 384.908 C 486.090 380.915 501.244 379.431 506.369 401.876 C 510.697 377.495 486.194 376.464 497.222 345.121 C 504.218 368.674 527.032 354.166 528.012 394.612 C 534.040 382.000 519.263 374.289 543.803 357.736 C 539.895 395.634 561.430 389.722 547.244 423.107 C 543.240 432.533 517.901 439.780 506.690 433.342 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":410.513,\\\"y\\\":640.154,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":289.256,\\\"y\\\":80.56,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":506.746,\\\"y\\\":305.546,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.46585200675252153,\\\"y\\\":-0.8848626491182959}}],\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":30.261,\\\"max\\\":205.281},\\\"y\\\":{\\\"min\\\":209.016,\\\"max\\\":381.982}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"lion_leg\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":149.972,\\\"max\\\":662.201506272974},\\\"y\\\":{\\\"min\\\":26.97386473974875,\\\"max\\\":690.296}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lion_leg\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lion_leg\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 151.972 669.964 C 151.976 669.959 165.005 633.294 188.410 618.173 C 221.922 596.523 260.136 606.992 260.144 606.991 C 260.145 606.995 270.542 651.825 270.543 651.830 C 270.536 651.830 230.857 651.552 200.325 655.715 C 164.811 660.558 151.977 669.963 151.972 669.964 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 382.985 645.308 C 366.701 588.152 311.226 550.952 261.644 563.500 C 195.987 580.117 196.059 628.205 199.272 656.177 C 226.426 657.841 223.491 657.029 269.623 657.785 C 275.083 657.576 388.141 663.406 382.985 645.308 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 197.701 678.560 C 197.705 678.554 210.988 641.165 234.410 624.463 C 270.467 598.750 305.990 612.380 305.997 612.379 C 305.998 612.383 317.966 654.279 317.967 654.283 C 317.959 654.284 274.783 656.848 242.205 664.687 C 208.895 672.701 197.706 678.558 197.701 678.560 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 455.421 615.560 C 377.107 585.244 356.837 534.528 300.939 558.285 C 244.168 582.413 242.731 644.496 250.701 662.758 C 279.045 660.565 283.268 644.505 348.784 665.198 C 409.103 684.248 496.486 631.457 455.421 615.560 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 253.801 688.296 C 253.805 688.290 265.237 648.919 288.597 630.760 C 324.038 603.208 359.937 617.334 359.944 617.333 C 359.945 617.337 367.319 660.833 367.320 660.837 C 367.313 660.838 334.638 663.129 297.146 670.830 C 273.473 675.693 253.805 688.294 253.801 688.296 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#3D337F47-120C-4F31-9C9C-05E635192296_5)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 517.438 50.691 C 537.333 62.128 590.503 115.156 581.295 194.137 C 573.765 258.733 475.904 290.251 485.973 309.820 C 503.873 344.612 681.344 384.906 658.108 402.366 C 552.409 481.797 601.135 596.666 515.309 660.570 C 506.066 667.453 482.979 667.046 482.977 667.048 C 482.967 667.053 309.677 670.668 309.573 670.529 C 299.885 657.523 297.425 538.475 426.480 586.549 C 449.964 595.297 486.069 506.515 480.170 464.622 C 474.352 423.306 274.743 404.041 221.291 341.286 C 158.305 267.338 157.497 154.225 262.937 82.156 C 326.450 38.744 438.291 5.186 517.438 50.691 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 423.747 623.552 C 423.745 623.556 420.533 667.320 398.803 667.676 C 380.148 667.981 374.891 668.005 374.889 668.005 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 365.602 296.951 C 380.648 324.524 382.206 333.380 452.762 368.579 C 496.903 390.601 599.541 405.778 598.606 415.764 C 597.359 429.098 561.244 474.842 551.422 504.772 C 538.400 544.450 538.066 597.570 506.381 619.518 C 485.111 634.252 423.815 624.879 423.807 624.880 M 534.263 149.812 C 537.428 190.117 477.212 284.603 365.602 296.951 C 307.099 303.424 268.321 273.139 268.311 273.137 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":427.531,\\\"y\\\":123.471,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7071067811865469,\\\"y\\\":0.7071067811865481}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":432.587,\\\"y\\\":28.97,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":179.157,\\\"y\\\":229.648,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088754179}},{\\\"point\\\":{\\\"x\\\":657.732,\\\"y\\\":398.263,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869443305632,\\\"y\\\":0.005109908846835923}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":507.877,\\\"y\\\":662.43,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064706,\\\"y\\\":0.7012692123096492}},{\\\"point\\\":{\\\"x\\\":214.821,\\\"y\\\":662.478,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986883991125018,\\\"y\\\":0.7154261114507978}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":578.014,\\\"y\\\":147.901,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9990062436235876,\\\"y\\\":0.04457045210774893}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"3D337F47-120C-4F31-9C9C-05E635192296_5\\\",\\\"x1\\\":\\\"49.83%\\\",\\\"y1\\\":\\\"59.23%\\\",\\\"x2\\\":\\\"49.83%\\\",\\\"y2\\\":\\\"-170.17%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\"]}},{\\\"name\\\":\\\"lion_tail\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":88.00412143712728,\\\"max\\\":640.6413449865353},\\\"y\\\":{\\\"min\\\":68.75320000425721,\\\"max\\\":682.399}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lion_tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lion_tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 99.676 139.726 C 299.925 99.676 339.975 177.840 339.975 239.851 C 339.975 343.202 219.826 377.981 219.826 480.149 C 219.826 605.447 319.950 680.399 440.100 680.399 C 580.274 680.399 660.374 500.174 600.299 400.050 C 596.122 393.088 666.849 355.975 625.762 282.050 C 604.416 243.645 595.113 211.525 595.110 211.518 C 595.109 211.526 570.276 268.418 587.821 295.400 C 592.192 302.121 579.665 323.496 579.664 323.498 C 579.663 323.490 553.135 291.184 566.645 240.208 C 576.939 201.370 510.164 169.049 510.159 169.042 C 510.160 169.050 546.195 210.187 524.509 249.845 C 507.697 280.590 521.743 328.640 521.743 328.647 C 521.741 328.644 503.482 322.533 501.921 297.273 C 499.670 260.852 463.825 237.266 463.821 237.260 C 463.822 237.268 480.874 275.063 465.318 320.944 C 439.146 398.134 553.726 410.849 560.249 420.075 C 605.192 483.633 548.453 620.324 440.100 620.324 C 339.975 620.324 279.805 549.546 279.900 480.149 C 280.015 396.779 400.050 357.110 400.050 239.851 C 400.050 142.134 339.975 39.601 99.676 79.651 C 84.088 82.249 89.783 141.705 99.676 139.726 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 535.901 385.281 C 535.896 385.279 503.168 381.239 486.743 360.810 C 475.926 347.357 476.694 326.076 476.693 326.073 M 534.614 363.400 C 534.611 363.398 512.882 359.232 501.162 345.393 C 486.966 328.632 490.758 323.256 486.990 301.617 C 484.564 287.682 485.703 272.016 485.703 272.013 M 546.198 349.241 C 546.197 349.236 536.807 324.367 533.559 300.594 C 529.036 267.490 541.097 270.371 546.198 242.409 C 548.523 229.667 543.624 207.660 543.624 207.656 M 569.367 342.806 C 569.365 342.803 555.523 329.231 550.151 313.306 C 544.034 295.170 547.486 273.304 547.485 273.300 M 587.387 350.529 C 587.389 350.525 604.216 336.432 607.820 318.769 C 613.254 292.144 599.803 289.962 596.397 263.003 C 595.162 253.231 595.110 242.411 595.110 242.409 M 596.396 376.271 C 596.398 376.270 608.655 369.685 615.181 359.644 C 625.319 344.049 626.725 340.798 626.001 322.212 C 625.495 309.202 616.992 296.471 616.991 296.469 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":107.301,\\\"y\\\":108.624,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":95.809,\\\"y\\\":108.427,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"lizard\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":197.49292123575054,\\\"max\\\":537.6109161268009},\\\"y\\\":{\\\"min\\\":58.795,\\\"max\\\":672.9731169582258}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lizard\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lizard_4\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#D5CBD748-2455-4D22-A94C-D94760DBEF2F_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 431.251 566.708 C 440.266 585.302 430.392 662.660 411.155 670.206 C 407.277 651.690 356.878 530.762 341.538 482.995 C 299.090 350.812 389.881 315.470 394.757 240.459 C 400.798 147.512 347.606 60.813 347.602 60.795 C 347.609 60.813 419.606 138.633 419.193 244.158 C 419.116 263.972 411.350 284.437 401.475 305.687 C 414.906 313.694 434.854 329.442 439.976 328.551 C 446.953 327.337 476.902 287.347 476.902 287.347 C 476.902 287.347 455.775 251.594 460.420 248.941 C 464.224 246.768 481.095 271.980 485.467 272.263 C 490.229 272.571 511.818 247.103 515.490 250.151 C 518.902 252.985 500.474 277.982 502.099 282.108 C 503.815 286.464 534.945 291.507 535.605 296.779 C 536.140 301.057 500.223 294.099 495.591 296.284 C 486.467 300.588 460.234 358.007 450.598 360.991 C 442.915 363.370 384.889 340.013 384.889 340.013 C 379.298 352.761 362.075 391.033 363.927 416.988 C 364.888 430.448 368.608 452.096 370.822 459.036 C 370.822 459.036 427.536 437.054 434.940 439.077 C 445.172 441.871 475.752 499.573 484.618 505.394 C 488.900 508.205 524.817 512.540 523.069 516.480 C 520.914 521.337 489.655 517.172 486.754 520.846 C 484.005 524.327 494.426 553.582 490.341 555.308 C 485.945 557.166 472.635 526.547 467.986 525.466 C 463.720 524.473 440.284 543.737 437.270 540.558 C 433.590 536.675 464.145 508.551 464.145 508.551 C 464.145 508.551 430.406 471.966 423.370 471.190 C 417.634 470.558 381.849 497.849 381.849 497.849 C 386.058 508.322 393.067 541.583 393.068 541.588 C 393.071 541.590 427.342 558.648 431.251 566.708 M 397.087 600.873 C 397.087 594.199 402.471 588.814 409.145 588.814 C 415.819 588.815 421.203 594.199 421.203 600.873 C 421.203 607.547 415.819 612.930 409.145 612.930 C 402.471 612.930 397.087 607.547 397.087 600.873 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.155 670.206 C 407.277 651.690 356.878 530.762 341.538 482.995 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 341.538 482.995 C 299.090 350.812 389.881 315.470 394.757 240.459 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 394.757 240.459 C 400.798 147.512 347.606 60.813 347.602 60.795 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#D5CBD748-2455-4D22-A94C-D94760DBEF2F_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 347.602 60.795 C 347.604 60.813 383.343 145.543 367.947 238.128 C 364.793 257.096 352.403 274.223 338.088 293.888 C 323.116 294.283 293.215 300.917 288.565 297.414 C 282.805 293.074 274.600 242.831 274.600 242.831 C 274.600 242.831 305.938 215.580 302.369 211.595 C 299.446 208.332 275.476 226.927 271.239 225.814 C 266.622 224.602 254.182 193.619 249.735 195.352 C 245.603 196.962 255.194 226.500 252.348 229.902 C 249.344 233.493 218.215 228.446 215.924 233.240 C 214.065 237.130 250.575 241.641 254.046 245.408 C 260.808 252.748 258.119 315.767 265.454 322.535 C 269.719 326.470 313.160 330.943 313.160 330.943 C 307.619 342.562 290.505 377.402 289.570 409.955 C 288.880 433.972 299.873 480.036 299.873 480.036 C 286.511 481.153 246.930 488.607 241.985 493.454 C 234.411 500.878 233.854 565.975 228.694 575.241 C 226.202 579.716 196.383 600.201 199.759 602.883 C 203.919 606.189 229.689 588.012 233.962 589.924 C 238.011 591.734 242.333 622.487 246.753 622.124 C 251.510 621.734 249.116 588.432 252.735 585.320 C 256.056 582.464 285.749 588.674 286.947 584.461 C 288.409 579.315 248.299 568.551 248.299 568.551 C 248.299 568.551 261.357 520.660 267.120 516.550 C 271.530 513.406 298.487 517.726 313.778 517.748 C 323.445 539.068 341.818 562.684 341.821 562.689 C 341.820 562.694 324.292 599.704 326.749 608.911 C 332.021 628.665 392.121 677.672 411.155 670.206 C 407.277 651.690 356.878 530.762 341.538 482.995 C 299.090 350.812 389.881 315.470 394.757 240.459 C 400.798 147.512 347.606 60.813 347.602 60.795 M 364.933 629.008 C 358.259 629.008 352.875 623.624 352.875 616.950 C 352.875 610.276 358.259 604.892 364.933 604.892 C 371.606 604.892 376.990 610.276 376.990 616.950 C 376.990 623.624 371.606 629.008 364.933 629.008 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 397.087 600.873 C 397.087 594.199 402.471 588.814 409.145 588.814 C 415.819 588.815 421.203 594.199 421.203 600.873 C 421.203 607.547 415.819 612.930 409.145 612.930 C 402.471 612.930 397.087 607.547 397.087 600.873 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 352.875 616.950 C 352.875 610.276 358.259 604.892 364.933 604.892 C 371.606 604.892 376.990 610.276 376.990 616.950 C 376.990 623.624 371.606 629.008 364.933 629.008 C 358.259 629.008 352.875 623.624 352.875 616.950 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":32.561,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":228.776,\\\"y\\\":398.367,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872474118777,\\\"y\\\":0.005050248866746195}},{\\\"point\\\":{\\\"x\\\":491.224,\\\"y\\\":398.367,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872474118777,\\\"y\\\":0.005050248866746201}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":410.927,\\\"y\\\":672.016,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.33898920417246386,\\\"y\\\":0.940790263265155}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"D5CBD748-2455-4D22-A94C-D94760DBEF2F_0\\\",\\\"x1\\\":\\\"48.12%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"-129.33%\\\",\\\"y2\\\":\\\"49.06%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"D5CBD748-2455-4D22-A94C-D94760DBEF2F_1\\\",\\\"x1\\\":\\\"61.17%\\\",\\\"y1\\\":\\\"53.37%\\\",\\\"x2\\\":\\\"-130.90%\\\",\\\"y2\\\":\\\"54.01%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"lotus\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":41.753,\\\"max\\\":678.247},\\\"y\\\":{\\\"min\\\":122.178,\\\"max\\\":571.373174370392}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lotus\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lotus_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 611.104 531.764 C 611.098 531.761 530.989 470.356 489.753 468.423 C 438.128 466.004 431.011 464.400 360.187 515.583 C 360.187 515.583 403.802 544.986 443.175 559.698 C 470.394 569.869 510.050 573.300 537.101 562.986 C 571.121 550.015 611.096 531.768 611.104 531.764 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 108.713 531.890 C 108.719 531.887 172.103 474.032 230.064 468.549 C 281.517 463.681 289.189 464.000 359.630 515.708 C 359.630 515.708 323.351 542.225 290.252 556.177 C 259.551 569.118 213.864 574.587 182.716 563.112 C 148.552 550.526 108.721 531.893 108.713 531.890 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 607.110 531.483 C 573.724 531.980 525.259 525.672 491.064 507.437 C 459.220 490.456 433.144 486.353 368.487 514.708 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 114.367 532.568 C 147.754 533.065 196.218 526.757 230.413 508.522 C 262.257 491.541 288.334 487.438 352.991 515.792 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 266.519 138.994 C 266.517 139.003 263.174 189.923 248.346 236.404 C 232.160 287.144 215.973 337.884 236.328 408.882 C 260.753 494.079 315.564 524.465 372.362 508.181 C 429.160 491.898 459.546 437.087 435.121 351.890 C 414.767 280.892 374.155 246.435 333.543 211.978 C 299.292 182.918 266.526 139.001 266.519 138.994 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 268.526 145.994 C 302.676 265.111 336.826 384.229 370.976 503.346 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 456.799 138.994 C 456.801 139.003 460.144 189.923 474.972 236.404 C 491.158 287.144 507.345 337.884 486.990 408.882 C 462.565 494.079 407.754 524.465 350.956 508.181 C 294.158 491.898 263.772 437.087 288.197 351.890 C 308.551 280.892 349.163 246.435 389.775 211.978 C 424.026 182.918 456.792 139.001 456.799 138.994 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 454.792 145.994 C 420.642 265.111 386.492 384.229 352.342 503.346 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 103.540 229.743 C 103.543 229.752 123.625 273.939 132.086 319.567 C 141.323 369.377 150.559 419.187 199.531 469.554 C 258.297 529.995 317.901 530.833 358.195 491.655 C 398.489 452.478 399.327 392.874 340.560 332.432 C 291.588 282.064 242.058 271.432 192.527 260.801 C 150.755 251.834 103.549 229.746 103.540 229.743 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 271.823 419.661 C 184.721 353.322 176.505 295.862 107.774 233.857 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 619.463 229.743 C 619.460 229.752 599.378 273.939 590.917 319.567 C 581.681 369.377 572.445 419.187 523.472 469.554 C 464.706 529.995 405.102 530.833 364.808 491.655 C 324.514 452.478 323.676 392.874 382.443 332.432 C 431.415 282.064 480.945 271.432 530.476 260.801 C 572.249 251.834 619.454 229.746 619.463 229.743 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 451.180 419.661 C 538.283 353.322 546.498 295.862 615.230 233.857 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 164.228 169.356 C 164.228 169.366 172.210 217.242 168.593 263.507 C 164.644 314.011 160.694 364.515 194.987 425.827 C 236.139 499.402 293.502 515.613 342.551 488.179 C 391.601 460.744 407.813 403.381 366.661 329.807 C 332.368 268.495 287.268 245.425 242.167 222.355 C 204.130 202.898 164.236 169.362 164.228 169.356 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 278.030 396.310 C 211.029 309.717 217.941 252.085 167.567 174.425 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 555.772 169.356 C 555.772 169.366 547.790 217.242 551.408 263.507 C 555.357 314.011 559.306 364.516 525.013 425.828 C 483.861 499.402 426.498 515.613 377.449 488.179 C 328.399 460.745 312.187 403.382 353.339 329.807 C 387.632 268.495 432.732 245.425 477.833 222.355 C 515.870 202.898 555.764 169.362 555.772 169.356 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 442.283 396.310 C 509.284 309.717 502.372 252.085 552.745 174.425 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 124.178 C 360.005 124.187 377.588 173.149 405.178 214.535 C 435.297 259.713 465.416 304.891 465.416 380.188 C 465.416 470.544 420.237 515.722 360.000 515.722 C 299.763 515.722 254.584 470.544 254.584 380.188 C 254.584 304.891 284.703 259.713 314.822 214.535 C 340.223 176.432 359.995 124.187 360.000 124.178 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 676.247 304.891 C 676.241 304.901 633.405 350.701 616.010 410.306 C 604.982 448.093 567.116 486.457 525.653 500.663 C 466.672 520.871 464.980 525.297 360.000 515.722 C 360.000 515.722 394.874 444.265 435.297 395.247 C 463.243 361.360 512.563 326.894 555.772 319.950 C 610.112 311.217 676.235 304.892 676.247 304.891 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 43.753 304.891 C 43.759 304.901 86.595 350.701 103.990 410.306 C 115.018 448.093 152.884 486.457 194.347 500.663 C 253.328 520.871 255.104 526.180 360.000 515.722 C 360.000 515.722 332.548 453.588 299.763 410.306 C 269.353 370.162 213.677 328.470 164.228 319.950 C 109.990 310.606 43.765 304.892 43.753 304.891 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 131.602 C 360.000 257.933 360.000 384.263 360.000 510.594 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 671.233 308.277 C 627.150 332.861 568.473 377.749 537.490 427.466 C 508.637 473.764 477.601 498.845 371.526 510.594 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 47.260 306.074 C 92.689 330.994 153.406 376.551 185.409 427.466 C 214.440 473.652 245.298 498.845 351.372 510.594 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":219.266,\\\"max\\\":500.734},\\\"y\\\":{\\\"min\\\":301.606,\\\"max\\\":577.466}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":641.162,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.075,\\\"y\\\":135.296,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":560.045,\\\"y\\\":553.305,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129156690803032,\\\"y\\\":0.7012497763135354}},{\\\"point\\\":{\\\"x\\\":161.076,\\\"y\\\":553.346,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986747268208849,\\\"y\\\":0.7154394636178254}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":548.525,\\\"y\\\":254.066,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631447522161517,\\\"y\\\":-0.7754186138829017}},{\\\"point\\\":{\\\"x\\\":172.292,\\\"y\\\":254.133,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817502335870009,\\\"y\\\":-0.7315850046331387}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":513.324,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":111.823,\\\"y\\\":431.519,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9967378755667042,\\\"y\\\":-0.08070692294204491}},{\\\"point\\\":{\\\"x\\\":606.692,\\\"y\\\":431.519,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9967378755667042,\\\"y\\\":-0.0807069229420451}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"lute\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":230.39463528459757,\\\"max\\\":526.0253694596597},\\\"y\\\":{\\\"min\\\":20.334352767023564,\\\"max\\\":631.535753023988}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lute\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"lute\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 524.022 524.196 C 523.567 634.487 411.765 633.464 360.000 627.306 C 404.143 627.306 487.489 617.590 487.604 524.196 C 487.810 358.022 401.543 297.354 360.000 297.354 C 404.393 292.288 524.759 345.471 524.022 524.196 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 403.950 23.258 C 403.959 23.258 493.931 23.258 493.940 23.258 C 493.930 23.267 386.990 118.680 386.980 118.689 C 386.981 118.711 396.545 333.879 396.546 333.901 C 396.539 333.901 323.461 333.901 323.454 333.901 C 323.455 333.879 333.019 118.711 333.020 118.689 C 333.027 118.680 403.943 23.267 403.950 23.258 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 297.354 C 401.543 297.354 487.810 358.022 487.604 524.196 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 487.604 524.196 C 487.489 617.590 404.143 627.306 360.000 627.306 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 297.354 C 401.543 297.354 487.810 358.022 487.604 524.196 C 487.489 617.590 404.143 627.306 360.000 627.306 C 315.857 627.306 232.511 617.590 232.395 524.196 C 232.190 358.022 318.457 297.354 360.000 297.354 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 411.693 C 391.585 411.693 417.065 437.173 417.065 468.757 C 417.065 500.342 391.585 525.822 360.000 525.822 C 328.415 525.822 302.935 500.342 302.935 468.757 C 302.935 437.173 328.415 411.693 360.000 411.693 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 414.846 47.387 C 395.734 71.147 357.516 118.660 357.510 118.667 C 357.510 118.714 357.510 432.705 357.510 589.724 M 408.821 35.745 C 388.001 63.386 346.367 118.659 346.361 118.667 C 346.360 118.714 340.710 432.705 337.885 589.724 M 421.089 59.450 C 403.715 79.189 368.973 118.661 368.968 118.667 C 368.968 118.714 374.413 432.705 377.136 589.724 M 426.409 69.749 C 410.530 86.142 378.777 118.924 378.772 118.929 C 378.773 118.976 394.055 589.682 394.057 589.724 C 394.049 589.724 320.972 589.724 320.964 589.724 C 320.966 589.682 336.760 118.980 336.762 118.933 C 336.768 118.924 381.346 56.810 403.638 25.749 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 427.966 89.804 C 432.965 89.804 436.997 93.837 436.997 98.835 C 436.997 103.834 432.965 107.866 427.966 107.866 C 422.967 107.866 418.935 103.834 418.935 98.835 C 418.935 93.837 422.967 89.804 427.966 89.804 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 459.985 60.248 C 464.984 60.248 469.016 64.280 469.016 69.279 C 469.016 74.278 464.984 78.310 459.985 78.310 C 454.987 78.310 450.954 74.278 450.954 69.279 C 450.954 64.280 454.987 60.248 459.985 60.248 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 492.826 31.513 C 497.824 31.513 501.857 35.545 501.857 40.544 C 501.857 45.543 497.824 49.575 492.826 49.575 C 487.827 49.575 483.794 45.543 483.794 40.544 C 483.794 35.545 487.827 31.513 492.826 31.513 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 335.630 83.562 C 340.534 82.594 345.271 85.770 346.238 90.674 C 347.206 95.578 344.030 100.314 339.126 101.282 C 334.222 102.249 329.485 99.074 328.517 94.170 C 327.550 89.266 330.726 84.529 335.630 83.562 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 357.931 52.383 C 362.835 51.416 367.572 54.591 368.539 59.495 C 369.507 64.400 366.331 69.136 361.427 70.104 C 356.523 71.071 351.786 67.896 350.819 62.991 C 349.852 58.087 353.027 53.351 357.931 52.383 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 382.161 22.498 C 387.065 21.530 391.802 24.706 392.770 29.610 C 393.737 34.515 390.561 39.251 385.657 40.219 C 380.753 41.186 376.017 38.011 375.049 33.107 C 374.082 28.202 377.257 23.466 382.161 22.498 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 417.899 53.286 C 399.429 75.079 362.495 118.660 362.490 118.667 C 362.490 118.714 362.490 432.705 362.490 589.724 M 411.801 41.504 C 391.613 67.225 351.244 118.659 351.238 118.667 C 351.237 118.714 345.655 432.705 342.864 589.724 M 423.996 65.068 C 407.245 82.934 373.746 118.661 373.741 118.667 C 373.742 118.714 379.324 432.705 382.115 589.724 M 429.098 74.945 C 413.812 89.606 383.243 118.925 383.238 118.929 C 383.240 118.976 399.034 589.677 399.036 589.724 C 399.028 589.724 325.951 589.724 325.943 589.724 C 325.945 589.682 341.739 118.980 341.741 118.933 C 341.747 118.924 385.041 60.743 406.691 31.647 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 375.055 33.116 C 374.087 28.212 377.263 23.475 382.167 22.508 C 387.071 21.540 391.807 24.716 392.775 29.620 C 393.742 34.524 390.567 39.261 385.663 40.229 C 380.759 41.196 376.022 38.020 375.055 33.116 M 350.824 63.001 C 349.857 58.097 353.032 53.360 357.936 52.393 C 362.840 51.425 367.577 54.601 368.545 59.505 C 369.512 64.409 366.337 69.146 361.432 70.114 C 356.528 71.081 351.792 67.905 350.824 63.001 M 328.523 94.179 C 327.555 89.275 330.731 84.539 335.635 83.571 C 340.539 82.604 345.276 85.779 346.243 90.683 C 347.211 95.587 344.035 100.324 339.131 101.291 C 334.227 102.259 329.490 99.083 328.523 94.179 M 483.800 40.554 C 483.800 35.555 487.832 31.523 492.831 31.523 C 497.829 31.523 501.862 35.555 501.862 40.554 C 501.862 45.552 497.829 49.585 492.831 49.585 C 487.832 49.585 483.800 45.552 483.800 40.554 M 450.959 69.289 C 450.959 64.290 454.992 60.258 459.990 60.258 C 464.989 60.258 469.022 64.290 469.022 69.289 C 469.022 74.288 464.989 78.320 459.990 78.320 C 454.992 78.320 450.959 74.288 450.959 69.289 M 418.940 98.845 C 418.940 93.846 422.973 89.814 427.971 89.814 C 432.970 89.814 437.002 93.846 437.002 98.845 C 437.002 103.844 432.970 107.876 427.971 107.876 C 422.973 107.876 418.940 103.844 418.940 98.845 M 333.026 118.699 C 333.026 118.699 384.249 118.779 386.985 118.699 C 386.996 118.689 493.935 23.277 493.945 23.268 C 493.936 23.268 403.964 23.268 403.955 23.268 C 403.948 23.277 333.033 118.689 333.026 118.699 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":313.227,\\\"max\\\":406.773},\\\"y\\\":{\\\"min\\\":422.545,\\\"max\\\":516.092}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":676.663,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":442.071,\\\"y\\\":25.725,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":233.094,\\\"y\\\":477.583,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873031208202,\\\"y\\\":0.005039206003831711}},{\\\"point\\\":{\\\"x\\\":523.017,\\\"y\\\":477.583,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873031208202,\\\"y\\\":0.005039206003831724}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":477.497,\\\"y\\\":612.836,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128994139952081,\\\"y\\\":0.7012663014328357}},{\\\"point\\\":{\\\"x\\\":288.447,\\\"y\\\":612.893,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.69870417507476,\\\"y\\\":0.7154107042343573}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":471.271,\\\"y\\\":355.53,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314550643831317,\\\"y\\\":-0.7754124719559874}},{\\\"point\\\":{\\\"x\\\":274.178,\\\"y\\\":355.626,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817418690133722,\\\"y\\\":-0.73159279933181}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":624.362,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"magician\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":28.656,\\\"max\\\":670.426},\\\"y\\\":{\\\"min\\\":60.123858190061725,\\\"max\\\":682.27425756658}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"magician\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"magician\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S16\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 317.522 95.769 C 317.530 95.769 402.470 95.769 402.478 95.769 C 402.480 95.778 419.998 180.978 420.000 180.986 C 419.999 180.986 300.011 180.986 300.000 180.986 C 300.002 180.978 317.520 95.778 317.522 95.769 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 339.162 114.003 C 342.821 114.003 345.773 116.954 345.773 120.613 C 345.773 124.271 342.821 127.223 339.162 127.223 C 335.504 127.223 332.553 124.271 332.553 120.613 C 332.553 116.954 335.504 114.003 339.162 114.003 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 381.005 114.003 C 384.664 114.002 387.616 116.954 387.616 120.613 C 387.616 124.272 384.664 127.223 381.005 127.223 C 377.347 127.222 374.396 124.271 374.396 120.613 C 374.396 116.954 377.347 114.003 381.005 114.003 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 367.558 120.613 C 367.558 113.263 373.488 107.334 380.838 107.334 C 388.187 107.334 394.117 113.263 394.117 120.613 C 394.117 127.963 388.188 133.892 380.838 133.892 C 373.487 133.892 367.558 127.963 367.558 120.613 M 325.883 120.613 C 325.883 113.263 331.812 107.333 339.162 107.333 C 346.513 107.333 352.442 113.263 352.442 120.613 C 352.442 127.963 346.513 133.892 339.162 133.892 C 331.812 133.892 325.883 127.963 325.883 120.613 M 360.000 180.986 C 350.659 180.986 319.996 160.981 317.104 99.858 C 317.100 99.773 402.896 99.858 402.896 99.858 C 400.004 160.981 369.341 180.986 360.000 180.986 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 356.638 154.398 C 356.638 154.394 356.638 106.657 356.638 106.652 C 356.639 106.652 363.361 106.652 363.362 106.652 C 363.362 106.657 363.362 154.394 363.362 154.398 C 363.361 154.398 356.639 154.398 356.638 154.398 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 352.593 165.611 C 357.531 165.611 362.469 165.611 367.407 165.611 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 315.577 102.883 C 345.192 102.878 374.808 102.874 404.423 102.869 C 404.423 102.871 407.221 117.757 407.222 117.758 C 407.212 117.758 312.788 117.758 312.778 117.758 C 312.779 117.757 315.577 102.883 315.577 102.883 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 315.577 102.883 C 345.192 102.878 374.808 102.874 404.423 102.869 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S23\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 315.577 102.883 C 345.192 102.878 374.808 102.874 404.423 102.869 C 404.420 102.868 398.791 61.035 359.835 61.124 C 321.027 61.212 315.577 102.883 315.577 102.883 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 669.426 180.987 C 669.424 180.987 649.428 180.987 649.426 180.987 C 649.426 179.150 649.426 177.038 649.426 174.915 C 656.093 174.998 662.760 175.081 669.426 175.164 C 669.426 175.165 669.426 180.987 669.426 180.987 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 669.426 175.164 C 662.760 175.081 656.093 174.998 649.426 174.915 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 669.426 167.350 C 669.426 167.350 669.426 175.163 669.426 175.164 C 662.760 175.081 656.093 174.998 649.426 174.915 C 649.426 172.461 649.426 169.929 649.426 167.621 C 656.093 167.530 662.760 167.440 669.426 167.350 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 669.426 167.350 C 662.760 167.440 656.093 167.530 649.426 167.621 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 669.426 160.987 C 669.426 160.987 669.426 167.349 669.426 167.350 C 662.760 167.440 656.093 167.530 649.426 167.621 C 649.426 164.645 649.426 160.987 649.426 160.987 C 649.428 160.987 669.424 160.986 669.426 160.987 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 89.656 160.987 C 89.656 160.989 89.656 180.985 89.656 180.987 C 89.654 180.987 69.658 180.987 69.656 180.987 C 69.652 180.985 29.660 160.989 29.656 160.987 C 29.657 160.987 39.647 160.987 39.648 160.987 C 39.649 160.987 50.679 160.987 50.680 160.987 C 50.681 160.987 60.962 160.987 60.963 160.987 C 60.966 160.987 89.653 160.987 89.656 160.987 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 60.963 160.987 C 60.966 160.987 89.653 160.987 89.656 160.987 C 89.656 160.989 89.656 180.985 89.656 180.987 C 89.654 180.987 69.658 180.987 69.656 180.987 C 69.652 180.985 29.660 160.989 29.656 160.987 C 29.657 160.987 39.647 160.987 39.648 160.987 C 39.649 160.987 50.679 160.987 50.680 160.987 C 50.681 160.987 60.962 160.987 60.963 160.987 C 67.144 164.186 73.326 167.386 79.508 170.586 M 39.648 160.987 C 47.403 164.726 55.157 168.466 62.912 172.205 M 50.680 160.987 C 57.655 164.456 64.630 167.926 71.605 171.396 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 649.426 160.987 C 649.426 160.987 649.426 164.645 649.426 167.621 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 649.426 167.621 C 649.426 169.929 649.426 172.461 649.426 174.915 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 649.426 174.915 C 649.426 177.038 649.426 179.150 649.426 180.987 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S26\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 629.426 181.224 C 629.426 181.222 629.426 160.989 629.426 160.987 C 629.428 160.987 649.157 160.612 649.426 160.987 C 649.426 160.987 649.426 164.645 649.426 167.621 C 649.426 169.929 649.426 172.461 649.426 174.915 C 649.426 177.038 649.426 179.150 649.426 180.987 C 649.426 180.987 643.267 180.987 643.267 180.987 C 643.265 180.987 629.428 181.224 629.426 181.224 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S26\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 629.426 181.224 C 629.426 181.222 629.426 160.989 629.426 160.987 C 629.428 160.987 649.157 160.612 649.426 160.987 C 649.426 160.987 649.426 164.645 649.426 167.621 C 649.426 169.929 649.426 172.461 649.426 174.915 C 649.426 177.038 649.426 179.150 649.426 180.987 C 649.426 180.987 643.267 180.987 643.267 180.987 C 643.265 180.987 629.428 181.224 629.426 181.224 M 643.275 170.856 C 643.274 170.856 639.316 171.036 637.337 171.126 M 643.267 180.987 C 643.269 177.610 643.275 170.857 643.275 170.856 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S14\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 629.399 160.732 C 626.515 162.593 617.863 168.175 612.130 171.875 C 623.150 201.636 629.006 233.109 629.006 265.984 C 629.005 346.387 593.981 418.396 539.853 466.260 C 540.096 476.152 540.100 484.389 540.104 492.437 C 607.206 438.384 649.153 357.210 649.154 265.984 C 649.153 229.174 629.399 160.732 629.399 160.732 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 90.994 265.984 C 90.994 344.897 124.734 415.726 179.532 465.705 C 179.560 474.571 179.586 483.395 179.546 492.159 C 112.794 438.384 70.847 357.210 70.847 265.984 C 70.846 229.174 77.676 194.000 90.361 161.227 C 96.289 165.179 102.098 169.051 107.606 172.723 C 96.729 202.292 90.994 233.451 90.994 265.984 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 539.853 466.260 C 593.981 418.396 629.005 346.387 629.006 265.984 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 629.006 265.984 C 629.006 233.109 623.150 201.636 612.130 171.875 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 612.130 171.875 C 588.913 186.856 563.494 203.257 539.963 218.441 C 539.963 218.441 540.042 371.578 539.853 466.260 C 593.981 418.396 629.005 346.387 629.006 265.984 C 629.006 233.109 623.150 201.636 612.130 171.875 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 90.994 265.984 C 90.994 344.897 124.734 415.726 179.532 465.705 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 107.606 172.723 C 96.729 202.292 90.994 233.451 90.994 265.984 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S24\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 90.994 265.984 C 90.994 344.897 124.734 415.726 179.532 465.705 C 179.933 371.004 180.000 220.986 180.000 220.986 C 153.333 203.209 130.934 188.275 107.606 172.723 C 96.729 202.292 90.994 233.451 90.994 265.984 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S25\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 484.594 527.247 C 496.089 588.670 503.759 629.820 513.341 681.107 C 416.156 681.333 300.305 681.327 206.609 681.107 C 216.175 629.794 223.870 588.669 235.308 527.169 C 236.631 520.022 279.765 289.346 300.000 180.986 C 300.005 180.987 419.999 180.987 420.000 180.986 C 440.224 289.346 483.226 519.898 484.594 527.247 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 300.000 180.986 C 279.765 289.346 236.631 520.022 235.308 527.169 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 179.546 492.159 C 179.586 483.395 179.560 474.571 179.532 465.705 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 179.532 465.705 C 179.933 371.004 180.000 220.986 180.000 220.986 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S27\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 300.000 180.986 C 279.765 289.346 236.631 520.022 235.308 527.169 C 215.305 517.667 196.534 505.846 179.546 492.159 C 179.586 483.395 179.560 474.571 179.532 465.705 C 179.933 371.004 180.000 220.986 180.000 220.986 C 180.000 220.986 299.988 180.992 300.000 180.986 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 540.104 492.437 C 540.100 484.389 540.096 476.152 539.853 466.260 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 539.853 466.260 C 540.042 371.578 539.963 218.441 539.963 218.441 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 420.000 180.986 C 440.224 289.346 483.226 519.898 484.594 527.247 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S28\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 484.594 527.247 C 504.547 517.785 523.239 506.027 540.104 492.437 C 540.100 484.389 540.096 476.152 539.853 466.260 C 540.042 371.578 539.963 218.441 539.963 218.441 C 539.963 218.441 420.012 180.992 420.000 180.986 C 440.224 289.346 483.226 519.898 484.594 527.247 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 484.594 527.247 C 504.547 517.785 523.239 506.027 540.104 492.437 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 513.341 681.107 C 503.759 629.820 496.089 588.670 484.594 527.247 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S29\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 484.594 527.247 C 504.547 517.785 523.239 506.027 540.104 492.437 C 540.108 594.161 540.102 680.899 540.000 680.987 C 539.982 681.002 528.227 681.072 513.341 681.107 C 503.759 629.820 496.089 588.670 484.594 527.247 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 179.546 492.159 C 196.534 505.846 215.305 517.667 235.308 527.169 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 235.308 527.169 C 223.870 588.669 216.175 629.794 206.609 681.107 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S30\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 179.546 492.159 C 196.534 505.846 215.305 517.667 235.308 527.169 C 223.870 588.669 216.175 629.794 206.609 681.107 C 191.391 681.071 180.018 681.002 180.000 680.987 C 179.896 680.898 179.884 592.555 179.546 492.159 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":278.304,\\\"max\\\":441.696},\\\"y\\\":{\\\"min\\\":221.905,\\\"max\\\":634.02}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":699.922,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":58.377,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":56.624,\\\"y\\\":153.801,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.005042575858886558,\\\"y\\\":-0.9999872861335325}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":658.242,\\\"y\\\":168.175,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005042201956493396,\\\"y\\\":-0.9999872880189178}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"man\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":219.72983938969313,\\\"max\\\":499.5718581678688},\\\"y\\\":{\\\"min\\\":72.95782215958452,\\\"max\\\":681.8251273774526}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"man\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hair\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.703 74.297 C 365.656 74.190 371.862 71.553 377.201 73.984 C 381.637 76.004 383.360 81.495 386.964 85.025 C 391.204 89.177 398.538 90.874 400.967 96.750 C 403.587 103.089 398.643 110.513 398.643 118.211 C 398.643 125.909 403.587 133.333 400.967 139.673 C 398.538 145.548 390.852 146.914 386.964 151.398 C 382.694 156.323 382.677 165.048 376.903 167.568 C 371.618 169.875 365.853 164.370 360.000 164.370 C 354.147 164.370 348.382 169.875 343.097 167.568 C 337.323 165.048 337.306 156.323 333.036 151.398 C 329.148 146.914 321.462 145.549 319.033 139.673 C 316.413 133.333 321.357 125.909 321.357 118.211 C 321.357 110.513 316.413 103.090 319.033 96.750 C 321.462 90.874 328.912 89.292 333.036 85.025 C 336.197 81.753 337.411 76.648 341.314 74.625 C 346.787 71.788 353.446 74.408 359.703 74.297 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"man\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 344.965 404.515 C 342.615 424.084 357.913 420.875 357.915 423.684 C 357.959 499.637 346.744 503.063 347.304 514.104 C 347.543 518.818 354.288 542.404 354.758 552.251 C 357.795 615.866 338.014 619.956 344.611 637.019 C 351.931 655.953 342.996 657.437 345.783 663.251 C 348.584 669.094 354.471 679.617 342.700 680.105 C 321.392 680.988 336.929 667.411 334.209 667.279 C 331.359 667.142 334.019 678.775 329.384 679.396 C 319.143 680.770 328.546 668.013 327.540 668.114 C 326.112 668.258 327.637 679.724 323.685 679.802 C 314.497 679.983 323.314 668.729 322.112 669.191 C 320.322 669.879 321.598 678.613 317.966 679.054 C 307.990 680.267 318.042 668.936 316.704 669.314 C 313.651 670.177 316.896 678.751 310.470 679.209 C 303.327 679.718 308.660 671.411 314.313 666.247 C 315.740 664.945 315.891 662.627 318.380 657.854 C 321.656 651.571 322.947 641.708 323.128 639.402 C 323.879 629.786 315.696 606.312 311.644 560.812 C 309.931 541.575 317.022 533.602 314.186 513.712 C 308.958 477.043 295.136 462.722 297.874 394.155 C 299.231 360.156 314.814 335.942 315.408 327.606 C 315.886 320.895 310.316 280.405 309.471 272.520 C 308.583 264.229 309.894 242.458 309.720 244.807 C 305.599 300.459 298.822 304.428 299.028 313.493 C 299.163 319.389 290.811 340.178 283.901 353.132 C 277.444 365.235 261.407 380.206 261.064 385.538 C 260.880 388.403 257.377 406.752 256.431 409.150 C 255.453 411.629 245.845 431.623 243.248 430.241 C 241.117 429.108 248.122 410.698 247.339 410.241 C 246.319 409.645 238.257 435.199 235.364 433.972 C 232.575 432.788 242.679 409.532 242.032 409.235 C 241.355 408.925 231.333 433.815 228.502 432.386 C 225.737 430.992 238.250 408.143 237.535 407.806 C 236.847 407.481 224.337 431.581 223.464 428.730 C 221.361 421.871 237.714 398.766 235.078 398.492 C 231.110 398.079 227.649 408.774 224.485 410.888 C 222.463 412.238 220.273 411.185 220.813 410.068 C 233.440 383.908 238.773 388.623 243.082 380.477 C 248.613 370.020 249.586 340.705 271.203 305.535 C 275.414 298.686 266.728 281.735 274.990 236.867 C 277.865 221.254 270.620 214.771 281.841 198.223 C 293.933 180.391 307.207 184.066 341.667 172.106 C 347.001 170.255 345.834 154.486 345.191 150.129 C 344.845 147.781 332.406 138.490 331.436 136.332 C 329.811 132.714 328.974 107.203 330.786 103.674 C 332.734 99.879 342.005 84.619 359.891 83.997 C 377.855 85.131 386.588 99.898 388.453 103.674 C 390.278 107.372 388.680 133.910 386.827 137.593 C 385.882 139.470 374.935 147.204 374.047 149.260 C 372.305 153.293 372.035 170.174 377.571 172.106 C 412.010 184.127 425.305 180.391 437.397 198.223 C 448.619 214.771 441.393 221.250 444.248 236.867 C 453.107 285.318 443.032 299.241 448.035 305.535 C 470.180 333.399 471.290 370.598 476.753 379.879 C 481.445 387.849 491.476 386.896 498.425 410.068 C 499.342 413.124 495.678 411.579 495.347 411.542 C 493.594 411.347 489.807 398.768 483.863 397.600 C 481.716 397.179 498.099 421.724 495.775 428.730 C 494.836 431.560 482.391 407.481 481.703 407.806 C 480.988 408.143 493.501 430.992 490.737 432.386 C 487.905 433.815 477.883 408.925 477.206 409.235 C 476.560 409.532 486.663 432.788 483.874 433.972 C 480.981 435.199 472.919 409.645 471.899 410.241 C 471.116 410.698 478.121 429.108 475.990 430.241 C 473.393 431.623 463.785 411.629 462.807 409.150 C 461.862 406.752 458.358 388.403 458.174 385.538 C 457.831 380.206 441.795 365.235 435.338 353.132 C 428.427 340.178 420.376 319.388 420.210 313.493 C 419.819 299.651 414.236 296.876 409.518 244.807 C 409.305 242.461 410.655 264.229 409.767 272.520 C 408.922 280.405 403.352 320.895 403.830 327.606 C 404.424 335.942 420.007 360.156 421.365 394.155 C 424.102 462.722 410.280 477.043 405.052 513.712 C 402.216 533.602 409.353 541.579 407.594 560.812 C 403.542 605.117 395.341 629.788 396.111 639.402 C 396.240 641.022 396.924 651.292 399.398 652.376 C 418.693 660.833 420.421 668.639 430.219 669.706 C 435.094 670.237 443.366 678.418 435.543 677.359 C 434.328 677.195 430.913 671.706 428.742 672.409 C 427.768 672.724 438.844 678.931 432.783 678.401 C 428.657 678.040 424.272 671.356 422.316 672.300 C 421.513 672.688 432.769 678.944 425.868 678.825 C 421.880 678.756 416.749 671.157 415.530 671.940 C 414.902 672.344 426.684 681.348 418.392 679.880 C 416.783 679.596 414.649 675.307 414.649 675.307 C 414.648 675.306 408.861 671.804 406.848 671.551 C 405.635 671.399 412.770 675.103 412.771 675.103 C 412.771 675.104 419.531 681.042 412.065 680.819 C 406.419 680.651 405.412 681.048 401.686 679.388 C 398.765 678.086 394.104 679.150 392.938 679.107 C 390.342 679.013 379.814 679.980 373.476 678.303 C 365.283 676.135 370.221 666.314 373.691 661.130 C 376.833 656.434 367.949 654.437 374.627 637.019 C 381.177 619.938 360.846 610.492 364.480 552.251 C 365.094 542.412 371.695 518.818 371.934 514.104 C 372.494 503.063 361.289 500.682 361.323 423.684 C 361.324 420.875 377.760 423.369 374.273 404.515 C 373.684 401.331 379.868 422.429 359.857 422.337 C 340.263 422.247 345.354 401.281 344.965 404.515 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 306.356 243.639 C 307.788 243.639 310.651 243.639 310.651 243.639 C 310.652 243.640 313.319 250.929 316.096 253.054 C 323.611 258.806 345.089 258.156 345.092 258.157 M 403.977 253.054 C 396.462 258.806 374.984 258.156 374.981 258.157 M 409.421 243.639 C 409.421 243.640 406.753 250.929 403.977 253.054 M 413.716 243.639 C 412.284 243.639 409.422 243.639 409.421 243.639 M 359.857 422.337 C 340.263 422.247 345.354 401.281 344.965 404.515 C 342.615 424.084 357.913 420.875 357.915 423.684 C 357.959 499.637 346.744 503.063 347.304 514.104 C 347.543 518.818 354.288 542.404 354.758 552.251 C 357.795 615.866 338.014 619.956 344.611 637.019 C 351.931 655.953 342.996 657.437 345.783 663.251 C 348.584 669.094 354.471 679.617 342.700 680.105 C 321.392 680.988 336.929 667.411 334.209 667.279 C 331.359 667.142 334.019 678.775 329.384 679.396 C 319.143 680.770 328.546 668.013 327.540 668.114 C 326.112 668.258 327.637 679.724 323.685 679.802 C 314.497 679.983 323.314 668.729 322.112 669.191 C 320.322 669.879 321.598 678.613 317.966 679.054 C 307.990 680.267 318.042 668.936 316.704 669.314 C 313.651 670.177 316.896 678.751 310.470 679.209 C 303.327 679.718 308.660 671.411 314.313 666.247 C 315.740 664.945 315.891 662.627 318.380 657.854 C 321.656 651.571 322.947 641.708 323.128 639.402 C 323.879 629.786 315.696 606.312 311.644 560.812 C 309.931 541.575 317.022 533.602 314.186 513.712 C 308.958 477.043 295.136 462.722 297.874 394.155 C 299.231 360.156 314.814 335.942 315.408 327.606 C 315.886 320.895 310.316 280.405 309.471 272.520 C 308.583 264.229 309.894 242.458 309.720 244.807 C 305.599 300.459 298.822 304.428 299.028 313.493 C 299.163 319.389 290.811 340.178 283.901 353.132 C 277.444 365.235 261.407 380.206 261.064 385.538 C 260.880 388.403 257.377 406.752 256.431 409.150 C 255.453 411.629 245.845 431.623 243.248 430.241 C 241.117 429.108 248.122 410.698 247.339 410.241 C 246.319 409.645 238.257 435.199 235.364 433.972 C 232.575 432.788 242.679 409.532 242.032 409.235 C 241.355 408.925 231.333 433.815 228.502 432.386 C 225.737 430.992 238.250 408.143 237.535 407.806 C 236.847 407.481 224.337 431.581 223.464 428.730 C 221.361 421.871 237.714 398.766 235.078 398.492 C 231.110 398.079 227.649 408.774 224.485 410.888 C 222.463 412.238 220.273 411.185 220.813 410.068 C 233.440 383.908 238.773 388.623 243.082 380.477 C 248.613 370.020 249.586 340.705 271.203 305.535 C 275.414 298.686 266.728 281.735 274.990 236.867 C 277.865 221.254 270.620 214.771 281.841 198.223 C 293.933 180.391 307.207 184.066 341.667 172.106 C 347.001 170.255 345.834 154.486 345.191 150.129 C 344.845 147.781 332.406 138.490 331.436 136.332 C 329.811 132.714 328.974 107.203 330.786 103.674 C 332.734 99.879 342.005 84.619 359.891 83.997 C 377.855 85.131 386.588 99.898 388.453 103.674 C 390.278 107.372 388.680 133.910 386.827 137.593 C 385.882 139.470 374.935 147.204 374.047 149.260 C 372.305 153.293 372.035 170.174 377.571 172.106 C 412.010 184.127 425.305 180.391 437.397 198.223 C 448.619 214.771 441.393 221.250 444.248 236.867 C 453.107 285.318 443.032 299.241 448.035 305.535 C 470.180 333.399 471.290 370.598 476.753 379.879 C 481.445 387.849 491.476 386.896 498.425 410.068 C 499.342 413.124 495.678 411.579 495.347 411.542 C 493.594 411.347 489.807 398.768 483.863 397.600 C 481.716 397.179 498.099 421.724 495.775 428.730 C 494.836 431.560 482.391 407.481 481.703 407.806 C 480.988 408.143 493.501 430.992 490.737 432.386 C 487.905 433.815 477.883 408.925 477.206 409.235 C 476.560 409.532 486.663 432.788 483.874 433.972 C 480.981 435.199 472.919 409.645 471.899 410.241 C 471.116 410.698 478.121 429.108 475.990 430.241 C 473.393 431.623 463.785 411.629 462.807 409.150 C 461.862 406.752 458.358 388.403 458.174 385.538 C 457.831 380.206 441.795 365.235 435.338 353.132 C 428.427 340.178 420.376 319.388 420.210 313.493 C 419.819 299.651 414.236 296.876 409.518 244.807 C 409.305 242.461 410.655 264.229 409.767 272.520 C 408.922 280.405 403.352 320.895 403.830 327.606 C 404.424 335.942 420.007 360.156 421.365 394.155 C 424.102 462.722 410.280 477.043 405.052 513.712 C 402.216 533.602 409.353 541.579 407.594 560.812 C 403.542 605.117 395.341 629.788 396.111 639.402 C 396.240 641.022 396.924 651.292 399.398 652.376 C 418.693 660.833 420.421 668.639 430.219 669.706 C 435.094 670.237 443.366 678.418 435.543 677.359 C 434.328 677.195 430.913 671.706 428.742 672.409 C 427.768 672.724 438.844 678.931 432.783 678.401 C 428.657 678.040 424.272 671.356 422.316 672.300 C 421.513 672.688 432.769 678.944 425.868 678.825 C 421.880 678.756 416.749 671.157 415.530 671.940 C 414.902 672.344 426.684 681.348 418.392 679.880 C 416.783 679.596 414.649 675.307 414.649 675.307 C 414.648 675.306 408.861 671.804 406.848 671.551 C 405.635 671.399 412.770 675.103 412.771 675.103 C 412.771 675.104 419.531 681.042 412.065 680.819 C 406.419 680.651 405.412 681.048 401.686 679.388 C 398.765 678.086 394.104 679.150 392.938 679.107 C 390.342 679.013 379.814 679.980 373.476 678.303 C 365.283 676.135 370.221 666.314 373.691 661.130 C 376.833 656.434 367.949 654.437 374.627 637.019 C 381.177 619.938 360.846 610.492 364.480 552.251 C 365.094 542.412 371.695 518.818 371.934 514.104 C 372.494 503.063 361.289 500.682 361.323 423.684 C 361.324 420.875 377.760 423.369 374.273 404.515 C 373.684 401.331 379.868 422.429 359.857 422.337 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 341.076 C 360.539 341.076 360.824 341.919 360.824 343.846 C 360.824 345.773 360.539 346.616 360.000 346.616 C 359.461 346.616 359.176 345.773 359.176 343.846 C 359.176 341.919 359.461 341.076 360.000 341.076 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 353.403 393.670 C 353.403 393.672 351.550 412.800 359.735 413.458 C 367.840 414.110 366.066 393.409 366.067 393.406 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":704.426,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":21.2,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":273.425,\\\"y\\\":236.028,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872424786936,\\\"y\\\":0.005051225579819151}},{\\\"point\\\":{\\\"x\\\":446.795,\\\"y\\\":236.028,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872404956716,\\\"y\\\":0.005051618141930253}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":492.072,\\\"y\\\":428.503,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129167296652735,\\\"y\\\":0.7012486980831916}},{\\\"point\\\":{\\\"x\\\":230.077,\\\"y\\\":428.546,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987226599068788,\\\"y\\\":0.7153926506001136}}],\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":267.476,\\\"max\\\":452.524},\\\"y\\\":{\\\"min\\\":20.259,\\\"max\\\":207.18}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"man_bottom\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":285.6930765219867,\\\"max\\\":453.41077212046815},\\\"y\\\":{\\\"min\\\":361.177,\\\"max\\\":706.8531552921432}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"man_bottom\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"man_bottom\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 431.510 362.177 C 431.731 364.579 431.896 367.027 431.996 369.520 C 435.209 449.965 418.990 466.767 412.857 509.789 C 409.530 533.124 417.903 542.484 415.840 565.048 C 411.085 617.030 401.464 645.974 402.367 657.253 C 402.519 659.154 403.321 671.204 406.223 672.476 C 428.862 682.397 430.888 691.556 442.384 692.808 C 448.104 693.431 457.809 703.029 448.631 701.787 C 447.205 701.594 443.198 695.155 440.651 695.979 C 439.509 696.349 452.503 703.631 445.393 703.009 C 440.551 702.586 435.407 694.744 433.112 695.851 C 432.170 696.306 445.376 703.646 437.280 703.506 C 432.600 703.426 426.581 694.510 425.150 695.429 C 424.413 695.903 438.237 706.467 428.508 704.745 C 426.620 704.411 424.117 699.379 424.117 699.379 C 424.116 699.378 417.326 695.270 414.964 694.973 C 413.541 694.794 421.912 699.140 421.913 699.140 C 421.913 699.141 429.845 706.107 421.086 705.846 C 414.461 705.649 413.279 706.114 408.908 704.167 C 405.480 702.640 400.012 703.888 398.644 703.838 C 395.599 703.728 383.246 704.862 375.810 702.894 C 366.198 700.350 371.992 688.828 376.062 682.746 C 379.750 677.237 369.326 674.893 377.162 654.458 C 384.846 634.418 360.992 623.335 365.256 555.005 C 365.976 543.461 373.734 515.780 374.002 510.249 C 374.607 497.728 361.740 495.079 361.552 407.771 C 361.545 404.475 379.053 405.303 376.745 385.282 C 376.310 381.508 380.565 406.016 359.833 406.191 C 338.268 406.373 342.853 381.492 342.361 385.282 C 339.679 405.945 357.560 404.475 357.554 407.771 C 357.380 493.895 344.499 497.728 345.104 510.249 C 345.372 515.780 353.299 543.452 353.850 555.005 C 357.413 629.640 334.205 634.439 341.945 654.458 C 350.533 676.672 340.050 678.413 343.320 685.234 C 346.607 692.090 353.513 704.436 339.703 705.009 C 314.703 706.045 332.932 690.115 329.741 689.961 C 326.397 689.799 329.518 703.448 324.080 704.177 C 312.064 705.789 323.097 690.822 321.917 690.940 C 320.241 691.109 322.030 704.562 317.393 704.653 C 306.614 704.865 316.959 691.661 315.548 692.203 C 313.448 693.011 314.945 703.258 310.684 703.776 C 298.979 705.198 310.773 691.905 309.203 692.348 C 305.621 693.360 309.429 703.420 301.889 703.957 C 293.509 704.554 299.765 694.809 306.399 688.750 C 308.072 687.222 308.249 684.502 311.169 678.902 C 315.013 671.531 316.528 659.960 316.740 657.253 C 317.622 645.973 308.021 618.431 303.267 565.048 C 301.256 542.479 309.576 533.124 306.250 509.789 C 300.116 466.767 283.897 449.965 287.110 369.520 C 287.210 367.027 287.596 362.177 287.596 362.177 C 335.567 362.177 431.495 362.177 431.510 362.177 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 431.510 362.177 C 383.539 362.177 287.611 362.177 287.596 362.177 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":362.37,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":362.022,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":286.767,\\\"y\\\":375.869,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872880189178,\\\"y\\\":0.0050422019564934075}},{\\\"point\\\":{\\\"x\\\":432.586,\\\"y\\\":375.869,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872880189178,\\\"y\\\":0.0050422019564934075}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"man_stand\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":174.40640993601835,\\\"max\\\":517.8870266443971},\\\"y\\\":{\\\"min\\\":14.17044217840838,\\\"max\\\":711.4409671728753}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"man_stand\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"man_stand\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 353.618 92.181 C 360.892 94.549 372.942 102.741 380.495 101.530 C 385.616 100.709 394.574 95.328 396.272 90.428 C 397.382 87.224 393.156 81.543 393.350 78.158 C 393.581 74.138 398.827 68.155 398.609 64.134 C 398.400 60.276 393.145 55.021 392.182 51.280 C 391.240 47.626 393.524 40.500 391.597 37.256 C 389.547 33.805 382.098 31.863 378.743 29.660 C 375.171 27.315 370.046 21.294 365.888 20.312 C 363.423 19.729 359.033 21.923 356.539 21.480 C 353.564 20.952 349.603 16.602 346.606 16.221 C 341.918 15.625 334.369 20.487 329.661 20.896 C 326.048 21.209 319.460 18.095 316.222 19.727 C 311.576 22.068 310.705 33.153 306.873 36.672 C 305.062 38.335 300.029 38.698 298.693 40.762 C 296.215 44.588 300.525 53.323 299.277 57.707 C 298.621 60.013 294.400 62.914 294.602 65.303 C 295.092 71.075 310.963 79.326 310.963 79.326 C 310.963 79.326 342.229 88.475 353.618 92.181 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.806 40.944 C 314.624 41.051 306.627 50.810 305.342 53.409 C 303.556 57.024 303.099 71.531 303.541 75.604 C 304.211 81.768 308.202 103.420 313.939 107.664 C 316.610 109.640 326.727 109.696 329.536 109.397 C 334.276 108.892 354.440 100.406 354.443 100.405 C 354.440 100.406 329.983 110.455 329.981 110.456 C 329.981 110.457 328.347 125.259 328.347 125.261 C 328.348 125.262 335.056 137.808 335.057 137.809 C 335.056 137.808 327.774 125.735 327.773 125.734 C 327.770 125.735 310.693 131.794 293.326 134.184 C 271.106 137.241 260.573 155.014 262.856 175.940 C 265.615 201.233 255.321 207.335 256.750 261.054 C 256.787 262.446 237.638 292.916 233.944 299.843 C 231.170 305.043 223.375 329.402 219.228 330.250 C 211.776 331.774 202.929 333.502 199.541 336.718 C 192.422 343.475 171.648 363.776 177.401 368.396 C 179.440 370.033 195.103 351.080 196.962 352.026 C 199.719 353.429 178.696 384.017 183.466 387.385 C 186.674 389.650 201.661 362.259 201.663 362.257 C 201.662 362.260 185.730 391.163 189.164 393.608 C 192.562 396.027 211.690 364.150 211.692 364.147 C 211.691 364.150 193.431 393.498 196.095 395.341 C 200.322 398.263 220.355 369.349 220.358 369.346 C 220.356 369.348 202.638 390.708 205.443 392.899 C 209.297 395.909 226.289 373.732 228.497 370.213 C 230.005 367.809 235.355 349.887 235.954 349.426 C 259.632 331.204 282.416 300.372 283.471 298.110 C 284.492 295.922 284.216 214.816 284.216 214.807 C 284.215 214.806 276.177 201.855 275.813 196.047 C 275.245 186.988 286.210 165.722 286.211 165.719 C 286.210 165.722 273.941 188.216 276.021 195.730 C 279.424 208.027 281.697 215.180 285.454 214.243 C 288.821 213.403 292.689 210.821 299.557 208.176 C 306.764 205.401 314.804 202.979 314.806 202.979 C 314.804 202.979 306.751 205.537 299.521 208.391 C 292.337 211.227 284.757 214.837 284.755 214.837 C 284.755 214.846 284.374 297.431 283.563 304.417 C 283.067 308.679 273.130 348.345 272.247 357.881 C 271.091 370.369 273.117 407.881 274.425 429.405 C 277.791 484.792 302.672 538.402 302.675 538.413 C 302.675 538.419 302.734 572.288 310.172 591.607 C 325.392 631.136 329.276 655.460 327.803 658.656 C 326.870 660.679 289.681 680.416 289.677 680.419 C 289.676 680.420 268.603 693.881 273.214 697.748 C 275.708 699.841 288.809 687.352 288.810 687.351 C 288.809 687.352 276.080 698.178 277.546 700.348 C 279.282 702.915 294.949 689.802 294.951 689.801 C 294.949 689.803 280.927 701.205 281.879 702.947 C 283.051 705.095 301.603 691.406 301.605 691.405 C 301.603 691.407 285.550 703.477 287.077 705.547 C 287.936 706.710 297.231 704.317 298.342 703.814 C 299.225 703.414 303.348 698.252 305.348 698.080 C 321.186 696.719 326.679 689.248 339.934 684.751 C 345.370 682.906 364.210 684.987 367.662 677.819 C 371.639 669.558 355.066 660.903 352.931 648.358 C 349.609 628.836 362.066 603.957 358.997 580.771 C 355.304 552.870 342.288 544.445 340.597 533.114 C 338.414 518.476 351.517 471.806 348.599 446.464 C 348.276 443.657 342.525 404.489 342.524 404.485 C 342.522 404.485 327.920 404.390 323.710 399.525 C 318.629 393.652 321.665 376.133 321.665 376.130 C 321.662 376.127 304.847 366.318 293.143 345.951 C 292.602 345.008 301.216 358.705 305.693 363.318 C 310.013 367.770 322.068 375.945 322.069 375.946 C 322.069 375.949 319.143 394.100 323.471 398.807 C 328.419 404.189 344.471 405.671 349.466 402.016 C 355.694 397.457 354.064 369.684 354.064 369.681 C 354.066 369.679 370.510 354.518 373.587 350.532 C 376.764 346.418 388.275 324.522 387.591 326.021 C 373.623 356.639 354.886 366.659 354.876 370.298 C 354.852 378.795 356.438 401.065 344.915 404.062 C 340.593 405.186 350.773 443.284 354.664 459.462 C 358.741 476.409 359.880 494.490 371.994 515.784 C 373.211 517.922 388.456 537.444 388.458 537.447 C 388.456 537.445 374.264 519.068 374.262 519.067 C 374.263 519.072 375.700 554.576 384.125 577.305 C 392.851 600.846 413.413 619.353 417.072 632.761 C 420.137 643.993 409.671 651.797 415.319 660.489 C 417.443 663.757 429.274 673.009 430.482 674.894 C 434.556 681.246 433.914 688.342 437.848 695.148 C 439.699 698.351 444.734 698.166 445.652 700.165 C 451.345 712.573 457.370 709.789 460.377 707.280 C 462.641 705.390 451.253 690.967 451.252 690.965 C 451.253 690.966 462.041 705.824 463.843 703.814 C 465.424 702.050 456.045 684.753 456.044 684.751 C 456.046 684.752 465.355 700.371 467.309 699.482 C 469.391 698.534 462.111 680.420 462.110 680.419 C 462.111 680.420 468.679 693.017 469.908 692.549 C 473.440 691.207 467.055 676.335 464.912 672.085 C 462.963 668.219 446.002 648.623 441.314 635.361 C 439.457 630.106 436.423 588.619 434.382 578.172 C 428.006 545.534 413.757 523.399 412.720 516.651 C 410.801 504.168 424.063 456.987 419.652 396.207 C 418.863 385.339 408.224 336.543 407.852 327.016 C 407.685 322.715 408.373 314.165 408.056 310.959 C 407.439 304.721 401.158 283.270 401.084 280.503 C 400.965 276.068 410.986 227.246 410.987 227.240 C 410.986 227.238 408.645 204.788 408.645 204.786 C 408.642 204.786 398.231 209.718 379.666 208.558 C 373.167 208.152 361.267 202.370 361.265 202.369 C 361.267 202.370 373.621 207.760 379.889 208.221 C 402.577 209.892 409.508 204.088 409.511 204.088 C 409.512 204.086 421.384 183.918 421.385 183.916 C 421.384 183.918 410.814 202.215 410.195 203.182 C 408.166 206.346 412.900 245.122 415.260 256.824 C 418.655 273.665 425.706 282.391 425.707 282.394 C 425.707 282.395 425.878 293.057 426.584 296.016 C 431.922 318.377 436.155 332.853 439.681 340.551 C 443.305 348.461 465.573 380.606 465.576 380.610 C 465.579 380.614 490.497 413.550 495.351 412.958 C 500.178 412.369 485.507 391.877 485.506 391.875 C 485.507 391.877 501.967 413.906 503.615 413.278 C 508.484 411.422 491.572 389.278 491.571 389.276 C 491.573 389.278 507.326 412.796 509.740 411.279 C 514.637 408.202 496.771 384.946 496.770 384.943 C 496.772 384.945 513.301 408.717 514.966 407.472 C 519.988 403.716 502.836 383.212 502.835 383.210 C 502.834 383.209 494.279 372.488 494.279 372.487 C 494.280 372.488 510.847 389.698 513.233 388.225 C 517.317 385.701 500.084 360.688 495.037 358.082 C 489.487 355.216 481.417 354.898 475.026 345.371 C 468.950 336.313 472.036 316.133 466.968 297.952 C 465.158 291.459 454.901 265.393 454.311 263.633 C 449.407 249.003 457.301 218.609 449.103 178.648 C 447.986 173.204 451.916 146.404 430.381 137.808 C 414.060 131.293 388.915 127.581 383.259 123.261 C 381.410 121.849 374.214 111.306 373.727 110.263 C 373.029 108.768 369.602 89.718 368.529 87.735 C 367.703 86.209 357.226 76.575 356.397 74.737 C 355.506 72.758 355.504 57.510 354.664 55.674 C 353.589 53.324 350.809 39.018 337.335 38.344 C 325.646 37.760 315.069 40.788 314.806 40.944 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 391.721 196.107 C 392.726 195.510 393.639 196.087 393.880 196.698 C 394.122 197.309 393.839 198.312 392.708 198.606 C 391.875 198.822 391.430 198.318 391.228 197.878 C 391.003 197.388 390.896 196.596 391.721 196.107 M 288.939 198.395 C 288.939 197.328 289.829 196.884 290.512 196.884 C 291.196 196.884 292.086 197.328 292.086 198.395 C 292.086 199.463 291.195 199.907 290.512 199.907 C 289.829 199.907 288.939 199.463 288.939 198.395 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 391.721 196.107 C 392.726 195.510 393.639 196.087 393.880 196.698 C 394.122 197.309 393.839 198.312 392.708 198.606 C 391.875 198.822 391.430 198.318 391.228 197.878 C 391.003 197.388 390.896 196.596 391.721 196.107 M 288.939 198.395 C 288.939 197.328 289.829 196.884 290.512 196.884 C 291.196 196.884 292.086 197.328 292.086 198.395 C 292.086 199.463 291.195 199.907 290.512 199.907 C 289.829 199.907 288.939 199.463 288.939 198.395 M 317.390 86.338 C 317.391 86.338 324.012 85.948 327.324 85.754 M 318.559 60.044 C 318.559 60.047 317.390 86.335 317.390 86.338 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 329.834 375.049 C 329.835 375.052 326.959 396.950 336.405 396.857 C 346.966 396.753 343.778 373.977 343.778 373.975 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 326.004 62.079 C 326.005 62.078 332.516 55.856 337.841 56.538 C 342.749 57.167 347.189 64.133 347.190 64.134 C 347.189 64.135 339.621 68.569 336.088 68.225 C 332.562 67.881 326.005 62.080 326.004 62.079 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":289.352,\\\"max\\\":398.848},\\\"y\\\":{\\\"min\\\":210.384,\\\"max\\\":344.732}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":386.217,\\\"y\\\":702.636,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":342.125,\\\"y\\\":16.974,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":273.782,\\\"y\\\":149.233,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7710363912137971,\\\"y\\\":-0.6367910830280243}},{\\\"point\\\":{\\\"x\\\":434.789,\\\"y\\\":149.656,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7533506880150292,\\\"y\\\":-0.6576189936941313}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":189.25,\\\"y\\\":389.822,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7312670363409584,\\\"y\\\":0.6820912853578409}},{\\\"point\\\":{\\\"x\\\":510.184,\\\"y\\\":407.977,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6794916409883454,\\\"y\\\":0.7336832489753092}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"man_top\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":195.60185633396395,\\\"max\\\":523.5790365633949},\\\"y\\\":{\\\"min\\\":60.99467191201711,\\\"max\\\":478.5312693526769}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"man_top\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"man_top\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.651 63.496 C 366.636 63.380 373.869 60.410 380.181 63.156 C 385.214 65.346 387.432 71.342 391.636 75.162 C 396.637 79.707 405.216 81.256 408.064 87.912 C 411.001 94.778 405.338 102.872 405.338 111.251 C 405.338 119.630 411.001 127.724 408.064 134.589 C 405.216 141.245 396.241 142.394 391.636 147.340 C 386.695 152.645 386.271 162.167 379.832 164.925 C 373.628 167.582 366.850 161.447 360.000 161.447 C 353.150 161.447 346.373 167.582 340.168 164.925 C 333.729 162.167 333.305 152.645 328.364 147.340 C 323.759 142.394 314.784 141.245 311.936 134.589 C 308.999 127.724 314.662 119.630 314.662 111.251 C 314.662 102.872 308.999 94.778 311.936 87.912 C 314.784 81.256 323.492 79.844 328.364 75.162 C 332.044 71.626 333.659 66.043 338.076 63.853 C 344.557 60.640 352.311 63.617 359.651 63.496 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 287.596 423.424 C 287.597 423.423 288.096 418.667 288.423 416.360 C 289.077 411.747 289.924 407.327 290.899 403.114 C 292.848 394.688 295.304 387.092 297.733 380.436 C 302.589 367.125 307.541 357.588 307.683 352.688 C 307.910 344.813 296.224 298.272 294.844 289.088 C 293.391 279.413 295.276 253.812 295.166 256.573 C 292.695 318.695 287.877 325.733 288.465 336.130 C 288.857 343.038 278.824 367.438 270.717 382.636 C 263.141 396.836 244.326 414.400 243.924 420.657 C 243.708 424.017 239.598 445.545 238.488 448.359 C 237.341 451.268 226.068 474.725 223.022 473.104 C 220.521 471.774 228.740 450.175 227.821 449.639 C 226.624 448.940 217.166 478.921 213.771 477.481 C 210.499 476.092 222.353 448.807 221.594 448.459 C 220.800 448.094 209.042 477.297 205.720 475.621 C 202.476 473.984 217.157 447.177 216.319 446.782 C 215.512 446.401 200.835 474.676 199.809 471.331 C 197.343 463.284 216.529 436.176 213.436 435.855 C 208.781 435.370 204.720 447.918 201.007 450.398 C 198.636 451.982 196.067 450.747 196.699 449.436 C 211.515 418.744 217.771 424.276 222.826 414.718 C 229.316 402.449 230.457 368.056 255.820 326.793 C 260.759 318.757 250.569 298.869 260.262 246.229 C 263.635 227.911 255.135 220.305 268.300 200.890 C 282.487 179.969 298.061 184.281 338.491 170.248 C 344.748 168.076 343.020 149.616 342.626 144.464 C 342.455 142.232 332.576 131.700 331.828 129.598 C 330.480 125.807 329.371 100.061 331.188 96.472 C 333.102 92.690 342.052 77.129 359.821 76.512 C 377.672 77.640 386.085 92.709 387.918 96.472 C 389.750 100.232 387.868 126.992 386.319 130.877 C 385.602 132.674 377.153 141.463 376.480 143.412 C 374.798 148.291 374.113 167.978 380.615 170.248 C 421.020 184.354 436.619 179.969 450.806 200.890 C 463.971 220.305 455.494 227.907 458.844 246.229 C 469.237 303.073 457.417 319.409 463.286 326.793 C 489.268 359.485 490.570 403.128 496.980 414.017 C 502.485 423.367 514.253 422.249 522.407 449.436 C 523.482 453.022 519.183 451.209 518.795 451.166 C 516.739 450.936 512.296 436.178 505.322 434.808 C 502.803 434.314 522.023 463.111 519.297 471.331 C 518.195 474.652 503.594 446.401 502.787 446.782 C 501.949 447.177 516.630 473.984 513.386 475.621 C 510.064 477.297 498.306 448.094 497.512 448.459 C 496.753 448.807 508.607 476.092 505.335 477.481 C 501.940 478.921 492.482 448.940 491.285 449.639 C 490.366 450.175 498.585 471.774 496.084 473.104 C 493.038 474.725 481.765 451.268 480.618 448.359 C 479.508 445.545 475.398 424.017 475.182 420.657 C 474.780 414.400 455.965 396.836 448.389 382.636 C 440.282 367.438 430.606 343.049 430.641 336.130 C 430.720 320.224 425.645 317.517 423.843 256.573 C 423.762 253.811 425.612 279.412 424.165 289.088 C 422.792 298.270 411.191 344.815 411.423 352.688 C 411.568 357.588 416.517 367.125 421.374 380.436 C 423.802 387.092 426.258 394.688 428.207 403.114 C 429.182 407.327 430.030 411.747 430.683 416.360 C 431.010 418.667 431.510 423.424 431.510 423.424 C 383.539 423.424 287.611 423.424 287.596 423.424 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 429.257 255.203 C 427.411 255.203 423.720 255.203 423.719 255.203 C 423.719 255.204 420.114 263.792 416.699 266.250 C 406.375 273.682 377.580 272.235 377.576 272.236 M 290.828 255.203 C 292.674 255.203 296.365 255.203 296.366 255.203 C 296.366 255.204 299.975 263.786 303.386 266.250 C 313.252 273.375 340.769 272.235 340.773 272.236 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 431.510 423.424 C 383.539 423.424 287.611 423.424 287.596 423.424 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":324.069,\\\"max\\\":395.915},\\\"y\\\":{\\\"min\\\":74.372,\\\"max\\\":155.8}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":359.992,\\\"y\\\":423.361,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":359.992,\\\"y\\\":64.91,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":268.741,\\\"y\\\":202.914,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874337967075,\\\"y\\\":0.005013207423930123}},{\\\"point\\\":{\\\"x\\\":451.502,\\\"y\\\":202.914,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874337967075,\\\"y\\\":0.0050132074239301345}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.992,\\\"y\\\":423.415,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"mask_half\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":114.205,\\\"max\\\":485.767},\\\"y\\\":{\\\"min\\\":35.90496910211239,\\\"max\\\":683.8585774358978}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"mask_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"head_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 484.267 37.693 C 484.267 252.564 484.267 682.243 484.267 682.307 C 395.413 683.275 341.558 670.551 307.362 649.745 C 246.239 612.556 224.356 564.263 224.348 564.254 C 224.361 564.249 352.244 513.537 352.257 513.532 C 352.242 513.532 207.201 519.573 207.186 519.574 C 207.186 519.566 205.939 446.561 205.939 446.553 C 205.930 446.552 115.714 429.741 115.705 429.739 C 115.714 429.723 205.900 268.857 205.911 268.842 C 205.911 268.839 223.680 135.533 300.635 89.379 C 398.999 30.386 484.267 37.693 484.267 37.693 M 247.426 307.976 C 247.426 278.694 271.048 255.072 300.330 255.073 C 329.612 255.073 353.233 278.695 353.233 307.976 C 353.233 337.258 329.612 360.880 300.330 360.881 C 271.048 360.881 247.426 337.258 247.426 307.976 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":484.087,\\\"y\\\":360,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":484.267,\\\"y\\\":37.487,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":305.322,\\\"y\\\":646.188,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987288651222999,\\\"y\\\":0.7153865899252675}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":267.866,\\\"y\\\":112.228,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817261439293559,\\\"y\\\":-0.7316074525886207}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":484.269,\\\"y\\\":360,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":119.584,\\\"y\\\":307.872,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"menorah\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":97.85,\\\"max\\\":619.995},\\\"y\\\":{\\\"min\\\":117.891,\\\"max\\\":648.7399646735092}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"menorah\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"menorah2.svg\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.712 138.774 C 359.714 138.774 380.255 140.895 380.257 140.895 C 380.257 140.906 380.258 253.156 380.257 253.167 C 380.260 253.166 404.113 249.185 412.873 237.199 C 421.234 225.759 418.597 212.275 419.904 198.165 C 421.791 177.791 419.904 140.901 419.904 140.895 C 419.908 140.895 458.081 140.895 458.084 140.895 C 458.084 140.902 461.402 186.583 458.084 217.255 C 455.762 238.731 447.971 257.993 430.943 271.284 C 398.125 296.898 380.262 293.613 380.257 293.615 C 380.257 293.620 380.257 342.850 380.257 342.855 C 380.266 342.851 416.565 353.744 471.161 299.858 C 493.113 278.191 491.787 247.772 496.265 217.255 C 500.226 190.263 496.265 140.902 496.265 140.895 C 496.269 140.895 534.441 140.895 534.445 140.895 C 534.445 140.904 540.544 202.793 534.445 236.345 C 527.924 272.222 522.940 304.920 498.293 331.795 C 451.660 382.644 380.269 389.060 380.257 389.065 C 380.257 389.070 380.257 437.012 380.257 437.017 C 380.271 437.009 456.307 441.575 525.424 360.250 C 556.102 324.155 564.331 282.983 572.625 236.345 C 578.595 202.770 572.625 140.904 572.625 140.895 C 572.628 140.895 610.802 140.895 610.805 140.895 C 610.805 140.907 618.957 215.334 610.805 255.435 C 600.431 306.472 586.677 349.720 552.556 389.065 C 490.807 460.268 380.275 479.305 380.257 479.314 C 380.257 479.322 380.256 560.869 380.257 560.877 C 380.264 560.878 531.517 597.696 531.524 597.698 C 531.524 597.701 531.523 631.033 531.524 631.036 C 531.520 631.037 483.075 646.943 359.712 646.738 C 236.967 646.533 187.906 631.037 187.902 631.036 C 187.902 631.033 187.902 597.701 187.902 597.698 C 187.909 597.696 339.161 560.878 339.168 560.877 C 339.169 560.869 339.168 479.322 339.168 479.314 C 339.151 479.305 224.131 463.508 165.896 389.065 C 133.806 348.046 118.020 306.472 107.646 255.435 C 99.495 215.334 107.646 140.907 107.646 140.895 C 107.650 140.895 145.823 140.895 145.827 140.895 C 145.827 140.904 139.856 202.770 145.827 236.345 C 154.120 282.983 162.659 323.894 193.027 360.250 C 259.689 440.056 339.154 437.009 339.168 437.017 C 339.168 437.012 339.168 389.070 339.168 389.065 C 339.156 389.060 270.105 384.943 220.159 331.795 C 195.187 305.222 190.528 272.222 184.007 236.345 C 177.909 202.793 184.007 140.904 184.007 140.895 C 184.011 140.895 222.183 140.895 222.187 140.895 C 222.187 140.902 218.226 190.263 222.187 217.255 C 226.665 247.772 226.171 277.379 247.291 299.858 C 295.534 351.205 339.159 342.851 339.168 342.855 C 339.168 342.850 339.168 293.620 339.168 293.615 C 339.163 293.613 321.766 297.977 289.456 274.206 C 265.560 256.625 262.571 239.995 260.367 217.255 C 256.994 182.434 260.367 140.902 260.367 140.895 C 260.371 140.895 298.543 140.895 298.547 140.895 C 298.547 140.901 296.277 177.830 298.547 198.165 C 300.210 213.061 298.007 227.569 307.527 239.147 C 316.413 249.955 339.165 252.192 339.168 252.193 C 339.168 252.182 339.168 140.906 339.168 140.895 C 339.170 140.895 359.710 138.774 359.712 138.774 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 564.673 141.915 C 564.673 141.913 564.673 119.893 564.673 119.891 C 564.679 119.891 617.990 119.891 617.995 119.891 C 617.995 119.893 617.995 141.913 617.995 141.915 C 617.990 141.915 564.679 141.915 564.673 141.915 M 488.169 141.915 C 488.169 141.913 488.169 119.893 488.169 119.891 C 488.174 119.891 541.485 119.891 541.490 119.891 C 541.490 119.893 541.490 141.913 541.490 141.915 C 541.485 141.915 488.174 141.915 488.169 141.915 M 411.664 141.915 C 411.664 141.913 411.664 119.893 411.664 119.891 C 411.670 119.891 464.980 119.891 464.986 119.891 C 464.986 119.893 464.986 141.913 464.986 141.915 C 464.980 141.915 411.670 141.915 411.664 141.915 M 333.339 141.929 C 333.339 141.926 333.339 119.907 333.339 119.905 C 333.345 119.905 386.655 119.905 386.661 119.905 C 386.661 119.907 386.661 141.926 386.661 141.929 C 386.655 141.929 333.345 141.929 333.339 141.929 M 252.280 141.915 C 252.280 141.913 252.280 119.893 252.280 119.891 C 252.285 119.891 305.596 119.891 305.601 119.891 C 305.601 119.893 305.601 141.913 305.601 141.915 C 305.596 141.915 252.285 141.915 252.280 141.915 M 177.514 141.915 C 177.514 141.913 177.514 119.893 177.514 119.891 C 177.519 119.891 230.830 119.891 230.835 119.891 C 230.835 119.893 230.835 141.913 230.835 141.915 C 230.830 141.915 177.519 141.915 177.514 141.915 M 99.850 141.915 C 99.850 141.913 99.850 119.893 99.850 119.891 C 99.855 119.891 153.166 119.891 153.171 119.891 C 153.171 119.893 153.171 141.913 153.171 141.915 C 153.166 141.915 99.855 141.915 99.850 141.915 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 192.908 600.956 C 192.925 600.957 280.155 613.216 360.000 613.216 C 439.845 613.216 471.395 605.042 527.092 600.956 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 192.908 600.956 C 192.925 600.957 280.155 613.216 360.000 613.216 C 439.845 613.216 471.395 605.042 527.092 600.956 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":218.519,\\\"max\\\":501.481},\\\"y\\\":{\\\"min\\\":339.418,\\\"max\\\":598.767}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":697.048,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":120.923,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":120.676,\\\"y\\\":300.037,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872899646819,\\\"y\\\":0.00504181605089226}},{\\\"point\\\":{\\\"x\\\":599.394,\\\"y\\\":300.037,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872899646819,\\\"y\\\":0.005041816050892248}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":524.77,\\\"y\\\":628.832,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128672065637021,\\\"y\\\":0.7012990416406288}},{\\\"point\\\":{\\\"x\\\":192.71,\\\"y\\\":628.875,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987165766289302,\\\"y\\\":0.7153985920757383}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"moon\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":41.34599999449275,\\\"max\\\":678.6540000053045},\\\"y\\\":{\\\"min\\\":27.221681803787877,\\\"max\\\":664.5353181875051}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"moon\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"moon\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 662.535 C 535.267 662.535 676.655 521.143 676.654 345.876 C 676.653 170.610 535.265 29.222 360.000 29.222 C 184.735 29.222 43.347 170.610 43.346 345.876 C 43.345 521.143 184.733 662.535 360.000 662.535 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 662.535 C 443.695 662.784 544.718 516.856 544.717 345.876 C 544.716 174.897 443.697 28.973 360.000 29.222 C 179.528 29.759 43.347 170.610 43.346 345.876 C 43.345 521.143 179.528 661.998 360.000 662.535 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":106.584,\\\"max\\\":495.737},\\\"y\\\":{\\\"min\\\":151.302,\\\"max\\\":540.455}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":694.184,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":29.966,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":45.191,\\\"y\\\":346.779,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874539541367,\\\"y\\\":0.005009184995916817}},{\\\"point\\\":{\\\"x\\\":675.814,\\\"y\\\":346.779,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874539541367,\\\"y\\\":0.005009184995916817}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":584.24,\\\"y\\\":570.559,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.712863129036721,\\\"y\\\":0.7013031864036948}},{\\\"point\\\":{\\\"x\\\":136.85,\\\"y\\\":570.606,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698734938016125,\\\"y\\\":0.7153806583879677}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":583.76,\\\"y\\\":123.1,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314567935596902,\\\"y\\\":-0.7754110638024936}},{\\\"point\\\":{\\\"x\\\":137,\\\"y\\\":123.176,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817359117130555,\\\"y\\\":-0.7315983506547625}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":660.934,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"moon_halves\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":60.409,\\\"max\\\":659.591},\\\"y\\\":{\\\"min\\\":21.75,\\\"max\\\":620.932}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"moon_halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"moon_half_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 23.750 C 277.643 23.750 203.245 56.969 149.436 110.777 C 95.628 164.586 62.409 238.983 62.409 321.341 C 62.409 403.698 96.035 477.692 149.436 531.905 C 200.083 583.321 262.432 612.711 347.505 618.293 C 352.108 618.595 359.999 618.932 360.000 618.932 C 360.000 618.872 360.000 23.809 360.000 23.750 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"moon_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 23.750 C 442.357 23.750 516.755 56.969 570.564 110.777 C 624.372 164.586 657.591 238.983 657.591 321.341 C 657.591 403.698 623.965 477.692 570.564 531.905 C 519.917 583.321 457.568 612.711 372.495 618.293 C 367.892 618.595 360.001 618.932 360.000 618.932 C 360.000 618.872 360.000 23.809 360.000 23.750 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":201.784,\\\"max\\\":518.216},\\\"y\\\":{\\\"min\\\":163.125,\\\"max\\\":479.557}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":699.841,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":22.469,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":61.696,\\\"y\\\":322.191,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872464433514,\\\"y\\\":0.0050504406386037495}},{\\\"point\\\":{\\\"x\\\":658.304,\\\"y\\\":322.191,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872464433514,\\\"y\\\":0.00505044063860372}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":571.542,\\\"y\\\":533.9,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128668713378294,\\\"y\\\":0.7012993823960024}},{\\\"point\\\":{\\\"x\\\":148.284,\\\"y\\\":533.944,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987075287412373,\\\"y\\\":0.7154074288685526}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":571.69,\\\"y\\\":110.579,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314662269468523,\\\"y\\\":-0.7754033816185653}},{\\\"point\\\":{\\\"x\\\":149.029,\\\"y\\\":110.651,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817404632686703,\\\"y\\\":-0.7315941092861662}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":617.661,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"moons_triple\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":24.929,\\\"max\\\":695.072},\\\"y\\\":{\\\"min\\\":215.319,\\\"max\\\":504.68100001177214}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"moons_triple\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"moons_triple\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#DD427ED9-D42A-45CA-849C-1A07C009C6BF_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 502.681 C 438.973 502.681 502.681 438.973 502.681 360.000 C 502.681 281.027 438.973 217.319 360.000 217.319 C 281.027 217.319 217.319 281.027 217.319 360.000 C 217.319 438.973 281.027 502.681 360.000 502.681 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#DD427ED9-D42A-45CA-849C-1A07C009C6BF_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 692.859 494.627 C 677.977 500.199 661.947 502.681 645.363 502.681 C 566.390 502.682 502.682 438.973 502.682 360.000 C 502.682 281.027 566.390 217.319 645.363 217.319 C 661.948 217.319 678.190 219.987 693.072 225.448 C 621.583 241.099 574.016 288.858 574.022 360.000 C 574.028 431.135 621.583 478.901 692.859 494.627 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#DD427ED9-D42A-45CA-849C-1A07C009C6BF_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 27.141 494.627 C 42.023 500.199 58.053 502.681 74.637 502.681 C 153.611 502.682 217.319 438.973 217.319 360.000 C 217.319 281.027 153.611 217.319 74.637 217.319 C 58.053 217.319 41.811 219.987 26.929 225.448 C 98.417 241.099 145.984 288.858 145.978 360.000 C 145.971 431.135 98.417 478.901 27.141 494.627 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":249.542,\\\"max\\\":470.458},\\\"y\\\":{\\\"min\\\":249.542,\\\"max\\\":470.458}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":623.105,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":214.982,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":64.512,\\\"y\\\":360.932,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874178653692,\\\"y\\\":0.005016384250803136}},{\\\"point\\\":{\\\"x\\\":655.488,\\\"y\\\":360.932,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874199345048,\\\"y\\\":0.00501597176350495}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":505.74,\\\"y\\\":506.668,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128768686214463,\\\"y\\\":0.7012892200686398}},{\\\"point\\\":{\\\"x\\\":214.14,\\\"y\\\":506.698,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986621241641112,\\\"y\\\":0.7154517707424394}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":505.842,\\\"y\\\":215.024,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314913417637686,\\\"y\\\":-0.7753829281570462}},{\\\"point\\\":{\\\"x\\\":214.653,\\\"y\\\":215.074,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817198461948044,\\\"y\\\":-0.7316133208902995}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":506.127,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"DD427ED9-D42A-45CA-849C-1A07C009C6BF_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"159.03%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"20.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"DD427ED9-D42A-45CA-849C-1A07C009C6BF_1\\\",\\\"cx\\\":\\\"59.63%\\\",\\\"cy\\\":\\\"48.39%\\\",\\\"r\\\":\\\"184.95%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"20.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"DD427ED9-D42A-45CA-849C-1A07C009C6BF_2\\\",\\\"cx\\\":\\\"38.57%\\\",\\\"cy\\\":\\\"49.20%\\\",\\\"r\\\":\\\"175.72%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"20.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"mosque\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":34.566,\\\"max\\\":685.434},\\\"y\\\":{\\\"min\\\":25.323314252278315,\\\"max\\\":681.886}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"mosque\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"mosque\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 649.194 178.256 C 658.365 178.519 667.960 172.137 668.562 163.441 C 665.441 168.860 659.716 172.678 653.075 172.678 C 643.759 172.678 636.244 165.163 636.244 155.847 C 636.244 146.531 645.311 139.367 653.075 139.014 C 653.720 138.985 650.495 139.083 649.194 139.083 C 638.353 139.083 629.607 147.829 629.608 158.670 C 629.608 169.511 639.586 177.981 649.194 178.256 M 621.597 251.007 C 631.092 251.157 665.384 251.466 674.117 251.007 C 674.667 251.227 683.199 234.180 683.248 223.826 C 683.346 202.797 647.833 183.426 647.829 183.422 C 647.826 183.426 612.313 202.797 612.410 223.826 C 612.457 234.178 621.597 251.007 621.597 251.007 M 625.258 679.720 C 625.258 679.678 625.258 254.695 625.258 254.653 C 625.262 254.653 668.357 254.653 668.361 254.653 C 668.361 254.695 668.361 679.678 668.361 679.720 C 668.357 679.720 625.262 679.720 625.258 679.720 M 96.320 679.886 C 96.320 679.885 96.320 661.963 96.320 661.961 C 96.372 661.961 623.468 661.961 623.521 661.961 C 623.521 661.963 623.521 679.885 623.521 679.886 C 623.468 679.886 96.372 679.886 96.320 679.886 M 239.566 442.493 C 239.566 442.490 239.566 411.768 239.566 411.765 C 239.590 411.765 480.251 411.765 480.275 411.765 C 480.275 411.768 480.275 442.490 480.275 442.493 C 480.251 442.493 239.590 442.493 239.566 442.493 M 100.278 464.254 C 100.278 464.252 100.278 446.330 100.278 446.329 C 100.330 446.329 619.511 446.329 619.563 446.329 C 619.563 446.330 619.563 464.252 619.563 464.254 C 619.511 464.254 100.330 464.254 100.278 464.254 M 99.937 656.705 C 99.937 656.686 99.937 468.264 99.937 468.245 C 99.989 468.245 619.852 468.245 619.904 468.245 C 619.904 468.264 619.904 656.686 619.904 656.705 C 619.852 656.705 99.989 656.705 99.937 656.705 M 74.215 178.256 C 83.386 178.519 92.983 172.137 93.584 163.441 C 90.464 168.860 84.738 172.678 78.097 172.678 C 68.781 172.678 61.266 165.163 61.265 155.847 C 61.265 146.530 70.333 139.367 78.097 139.014 C 78.742 138.985 75.516 139.083 74.215 139.083 C 63.374 139.083 54.629 147.829 54.629 158.670 C 54.629 169.511 64.607 177.981 74.215 178.256 M 46.618 251.007 C 56.113 251.157 90.405 251.466 99.137 251.007 C 99.688 251.227 108.221 234.180 108.270 223.826 C 108.369 202.797 72.854 183.426 72.850 183.422 C 72.847 183.426 37.335 202.797 37.431 223.826 C 37.479 234.178 46.618 251.007 46.618 251.007 M 50.280 679.720 C 50.280 679.678 50.280 254.695 50.280 254.653 C 50.284 254.653 93.379 254.653 93.383 254.653 C 93.383 254.695 93.383 679.678 93.383 679.720 C 93.379 679.720 50.284 679.720 50.280 679.720 M 360.293 161.160 C 391.567 162.054 424.292 140.291 426.340 110.636 C 415.702 129.117 396.176 142.138 373.531 142.138 C 341.762 142.138 316.133 116.510 316.132 84.741 C 316.132 52.971 347.055 28.544 373.531 27.342 C 375.730 27.242 364.729 27.576 360.293 27.575 C 323.324 27.574 293.501 57.399 293.501 94.368 C 293.502 131.337 327.529 160.222 360.293 161.160 M 261.875 407.484 C 297.368 407.484 425.508 408.687 458.169 407.484 C 459.988 408.244 492.300 352.866 492.301 318.429 C 492.301 245.157 359.934 186.061 359.921 186.048 C 359.907 186.061 227.541 245.157 227.541 318.429 C 227.541 352.866 261.875 407.484 261.875 407.484 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 354.199 191.615 C 348.278 185.689 359.920 164.285 359.921 164.282 C 359.921 164.285 371.564 185.688 365.643 191.615 C 363.217 194.044 356.625 194.044 354.199 191.615 M 611.545 354.526 C 611.545 354.524 611.545 330.947 611.545 330.944 C 611.552 330.944 683.426 330.944 683.434 330.944 C 683.434 330.947 683.434 354.524 683.434 354.526 C 683.432 354.528 666.040 367.619 666.038 367.621 C 666.034 367.621 628.944 367.621 628.940 367.621 C 628.938 367.619 611.546 354.528 611.545 354.526 M 36.566 354.526 C 36.566 354.524 36.566 330.947 36.566 330.944 C 36.574 330.944 108.448 330.944 108.455 330.944 C 108.455 330.947 108.455 354.524 108.455 354.526 C 108.454 354.528 91.061 367.619 91.059 367.621 C 91.056 367.621 53.966 367.621 53.962 367.621 C 53.961 367.619 36.568 354.528 36.566 354.526 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 193.925 549.666 C 196.641 524.802 165.805 496.848 165.802 496.843 C 165.799 496.848 135.363 521.599 137.679 549.666 C 139.403 570.555 138.266 648.235 138.266 648.245 C 138.271 648.245 193.368 648.485 193.373 648.485 C 193.374 648.475 191.551 571.397 193.925 549.666 M 291.233 549.666 C 293.949 524.802 263.113 496.848 263.110 496.843 C 263.107 496.848 232.670 521.598 234.986 549.666 C 236.710 570.555 235.574 648.235 235.575 648.245 C 235.580 648.245 290.676 648.485 290.681 648.485 C 290.681 648.475 288.859 571.397 291.233 549.666 M 487.129 549.666 C 489.845 524.802 459.009 496.848 459.006 496.843 C 459.003 496.848 428.567 521.599 430.884 549.666 C 432.607 570.555 431.471 648.235 431.471 648.245 C 431.476 648.245 486.573 648.485 486.579 648.485 C 486.579 648.475 484.755 571.397 487.129 549.666 M 584.437 549.666 C 587.153 524.803 556.317 496.848 556.314 496.843 C 556.311 496.848 525.875 521.599 528.191 549.666 C 529.915 570.555 528.779 648.235 528.779 648.245 C 528.784 648.245 583.879 648.485 583.885 648.485 C 583.885 648.475 582.063 571.397 584.437 549.666 M 332.296 549.666 C 329.579 524.803 360.415 496.848 360.418 496.843 C 360.421 496.848 390.857 521.599 388.541 549.666 C 386.817 570.555 387.953 648.235 387.953 648.245 C 387.948 648.245 332.853 648.485 332.847 648.485 C 332.847 648.475 334.670 571.397 332.296 549.666 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":281.18,\\\"max\\\":438.82},\\\"y\\\":{\\\"min\\\":240.908,\\\"max\\\":398.547}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":704.459,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":16.94,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":49.715,\\\"y\\\":453.909,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088752079}},{\\\"point\\\":{\\\"x\\\":669.129,\\\"y\\\":453.909,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873181281341,\\\"y\\\":0.005036227050266405}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":593.334,\\\"y\\\":676.855,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129329685826651,\\\"y\\\":0.7012321885851422}},{\\\"point\\\":{\\\"x\\\":127.799,\\\"y\\\":676.903,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986883991125066,\\\"y\\\":0.7154261114507933}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":674.905,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":71.808,\\\"y\\\":159.66,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.005036227050268488,\\\"y\\\":-0.9999873181281341}},{\\\"point\\\":{\\\"x\\\":648.191,\\\"y\\\":159.66,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005110287292647629,\\\"y\\\":-0.9999869423966429}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"arm\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"mouth_open\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":63.745000000000005,\\\"max\\\":656.255},\\\"y\\\":{\\\"min\\\":131.60921256044657,\\\"max\\\":600.078}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"mouth_open\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"mouth_open\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 204.837 C 382.445 204.837 403.226 205.660 421.595 206.981 C 442.888 208.631 462.142 211.066 478.593 213.802 C 496.048 216.846 511.445 220.427 524.560 224.214 C 572.240 238.076 594.244 255.631 592.463 266.433 C 590.779 276.643 568.409 275.291 524.560 271.754 C 511.044 270.786 495.642 269.618 478.593 268.494 C 461.346 267.412 442.292 266.382 421.595 265.647 C 402.720 265.006 382.613 264.586 360.000 264.425 C 360.920 264.594 360.919 264.594 360.919 264.594 C 360.919 264.594 360.919 264.594 360.000 264.425 C 341.439 264.446 324.029 264.763 305.760 265.501 C 284.638 266.137 265.431 267.118 248.761 268.015 C 231.270 269.142 215.714 270.362 202.795 271.246 C 153.668 275.236 129.239 277.170 127.537 266.433 C 125.730 255.032 150.287 236.135 202.795 222.242 C 216.309 218.640 231.740 215.375 248.761 212.685 C 265.918 210.035 284.816 207.927 305.760 206.523 C 322.459 205.451 340.607 204.837 360.000 204.837 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 457.972 C 382.357 457.974 402.841 457.570 421.595 457.122 C 443.117 456.382 462.200 455.376 478.593 454.458 C 496.455 453.413 511.597 452.416 524.560 451.733 C 553.281 450.476 568.099 451.377 569.587 459.192 C 571.228 467.805 556.909 483.949 524.560 498.784 C 512.163 504.499 496.887 509.997 478.593 514.706 C 461.905 518.989 442.716 522.587 421.595 524.939 C 402.505 527.103 382.175 528.339 360.000 528.426 C 360.000 528.441 360.000 528.441 360.000 528.441 C 360.000 528.441 360.000 528.441 360.000 528.426 C 340.416 528.518 322.230 527.727 305.760 526.184 C 284.318 524.304 265.110 521.298 248.761 517.834 C 231.174 513.933 215.908 509.272 202.795 504.263 C 161.685 488.400 143.067 469.039 144.897 459.192 C 146.555 450.265 165.171 450.123 202.795 452.151 C 215.621 452.856 230.858 453.835 248.761 454.842 C 265.474 455.723 284.470 456.598 305.760 457.212 C 322.426 457.669 340.522 457.971 360.000 457.972 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 524.560 271.754 C 524.560 254.037 524.560 238.216 524.560 224.214 C 572.240 238.076 594.244 255.631 592.463 266.433 C 590.779 276.643 568.409 275.291 524.560 271.754 C 511.044 270.786 495.642 269.618 478.593 268.494 C 478.593 249.595 478.593 230.443 478.593 213.802 C 496.048 216.846 511.445 220.427 524.560 224.214 M 421.595 265.647 C 421.595 243.446 421.595 223.927 421.595 206.981 C 442.888 208.631 462.142 211.066 478.593 213.802 M 360.000 264.425 C 360.000 248.138 360.000 222.165 360.000 204.837 C 340.607 204.837 322.459 205.451 305.760 206.523 C 305.760 224.270 305.760 250.289 305.760 265.501 C 284.638 266.137 265.431 267.118 248.761 268.015 C 248.761 252.867 248.761 229.692 248.761 212.685 C 265.918 210.035 284.816 207.927 305.760 206.523 M 202.795 271.246 C 202.795 258.139 202.795 239.034 202.795 222.242 C 216.309 218.640 231.740 215.375 248.761 212.685 M 202.795 504.263 C 202.795 489.464 202.795 471.517 202.795 452.151 C 215.621 452.856 230.858 453.835 248.761 454.842 C 248.761 480.215 248.761 501.968 248.761 517.834 C 231.174 513.933 215.908 509.272 202.795 504.263 C 161.685 488.400 143.067 469.039 144.897 459.192 C 146.555 450.265 165.171 450.123 202.795 452.151 M 305.760 526.184 C 305.760 510.222 305.760 485.576 305.760 457.212 C 322.426 457.669 340.522 457.971 360.000 457.972 C 360.000 487.622 360.000 512.579 360.000 528.426 C 340.416 528.518 322.230 527.727 305.760 526.184 C 284.318 524.304 265.110 521.298 248.761 517.834 M 524.560 498.784 C 524.560 485.382 524.560 469.277 524.560 451.733 C 553.281 450.476 568.099 451.377 569.587 459.192 C 571.228 467.805 556.909 483.949 524.560 498.784 C 512.163 504.499 496.887 509.997 478.593 514.706 C 478.593 499.170 478.593 478.327 478.593 454.458 C 496.455 453.413 511.597 452.416 524.560 451.733 M 421.595 524.939 C 421.595 508.540 421.595 484.866 421.595 457.122 C 443.117 456.382 462.200 455.376 478.593 454.458 M 248.761 454.842 C 265.474 455.723 284.470 456.598 305.760 457.212 M 360.000 528.441 C 360.000 528.441 360.000 528.441 360.000 528.426 C 360.000 528.441 360.000 528.441 360.000 528.441 C 382.175 528.339 402.505 527.103 421.595 524.939 C 442.716 522.587 461.905 518.989 478.593 514.706 M 360.000 457.972 C 382.357 457.974 402.841 457.570 421.595 457.122 M 127.537 266.433 C 125.730 255.032 150.287 236.135 202.795 222.242 M 202.795 271.246 C 153.668 275.236 129.239 277.170 127.537 266.433 M 248.761 268.015 C 231.270 269.142 215.714 270.362 202.795 271.246 M 360.000 264.425 C 341.439 264.446 324.029 264.763 305.760 265.501 M 360.919 264.594 C 360.919 264.594 360.919 264.594 360.000 264.425 C 360.920 264.594 360.919 264.594 360.919 264.594 M 421.595 265.647 C 402.720 265.006 382.613 264.586 360.000 264.425 M 478.593 268.494 C 461.346 267.412 442.292 266.382 421.595 265.647 M 360.000 204.837 C 382.445 204.837 403.226 205.660 421.595 206.981 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 238.429 140.858 C 305.404 117.459 359.988 158.195 360.000 158.196 C 360.012 158.195 414.596 117.459 481.571 140.858 C 633.731 194.018 654.238 359.960 654.255 359.982 C 654.226 359.968 578.030 217.255 360.000 217.255 C 141.970 217.255 65.774 359.968 65.745 359.982 C 65.762 359.960 86.269 194.018 238.429 140.858 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 598.078 C 107.654 598.078 65.774 360.006 65.745 359.982 C 65.774 359.996 143.025 499.047 360.000 499.047 C 576.975 499.047 654.226 359.996 654.255 359.982 C 654.226 360.006 612.346 598.078 360.000 598.078 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":262.539,\\\"max\\\":457.461},\\\"y\\\":{\\\"min\\\":263.458,\\\"max\\\":458.381}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":689.91,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":135.109,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":47.253,\\\"y\\\":360.933,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872484249872,\\\"y\\\":0.00505004825946872}},{\\\"point\\\":{\\\"x\\\":672.747,\\\"y\\\":360.933,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872484249872,\\\"y\\\":0.005050048259468683}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":556.215,\\\"y\\\":534.405,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129226936877423,\\\"y\\\":0.7012426347741655}},{\\\"point\\\":{\\\"x\\\":163.623,\\\"y\\\":534.446,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987144382969347,\\\"y\\\":0.7154006805388146}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":561.176,\\\"y\\\":181.639,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631434442037233,\\\"y\\\":-0.7754292652519172}},{\\\"point\\\":{\\\"x\\\":159.507,\\\"y\\\":181.707,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817224709697205,\\\"y\\\":-0.731610875107074}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":595.263,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"muscle_arm\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":15.767522580951432,\\\"max\\\":708.3127636367219},\\\"y\\\":{\\\"min\\\":11.112318469537335,\\\"max\\\":673.1323555909461}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"muscle_arm\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"muscle_arm\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 460.879 191.928 C 460.872 191.928 416.812 213.571 391.859 196.608 C 386.155 192.729 384.642 182.537 384.641 182.535 C 384.641 182.538 392.903 207.938 382.103 210.854 C 349.290 219.715 298.861 219.939 287.275 206.170 C 283.300 201.448 285.526 173.655 285.526 173.652 C 285.521 173.648 247.019 146.324 244.099 134.469 C 238.521 111.834 274.429 45.788 288.343 34.989 C 306.776 20.683 405.321 7.784 431.233 15.349 C 451.125 21.155 493.768 59.557 517.197 85.130 C 555.757 127.217 600.346 203.120 616.938 237.633 C 642.242 290.267 694.783 462.294 700.551 502.654 C 702.283 514.775 712.071 573.543 701.409 586.109 C 696.368 592.050 663.323 596.402 663.319 596.403 C 663.293 596.410 514.280 654.281 398.095 667.033 C 332.586 674.223 295.137 671.357 243.393 663.077 C 212.771 658.177 155.353 637.881 155.344 637.878 C 155.335 637.881 126.601 680.468 61.500 668.808 C 3.256 658.375 18.555 537.104 22.624 404.062 C 25.112 322.708 95.718 313.579 155.498 324.358 C 220.576 336.093 231.142 390.061 231.149 390.068 C 231.149 390.068 231.388 390.023 231.424 389.989 C 251.928 370.504 324.557 348.760 362.274 347.695 C 417.768 346.128 453.590 383.561 452.303 380.623 C 445.979 366.176 436.425 337.699 438.606 303.354 C 442.043 249.207 460.876 191.939 460.879 191.928 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 231.424 389.989 C 235.736 405.531 240.048 421.072 244.360 436.614 M 232.487 520.200 C 232.503 520.207 306.430 582.948 390.193 586.481 C 454.415 589.189 473.867 561.100 515.704 548.409 M 155.344 637.878 C 155.352 637.866 181.231 571.197 232.487 520.200 C 255.875 496.932 263.374 497.248 278.817 485.772 M 663.319 596.403 C 618.730 595.036 588.780 581.753 529.553 592.301 M 338.564 70.688 C 338.562 70.694 315.529 100.843 320.451 130.854 C 323.071 146.827 359.089 174.306 359.093 174.310 C 359.096 174.311 376.125 179.794 384.641 182.535 M 318.024 172.847 C 318.021 172.843 286.439 149.134 283.704 134.061 C 279.070 108.524 298.636 73.085 298.638 73.078 M 402.128 167.136 C 402.124 167.132 360.938 136.424 358.599 126.218 C 350.898 92.618 376.082 68.171 376.084 68.165 M 285.526 173.652 C 285.529 173.652 308.127 171.816 318.024 172.847 C 332.032 174.306 359.089 174.310 359.093 174.310 C 359.096 174.310 379.496 174.877 387.934 172.919 C 392.413 171.880 402.127 167.137 402.128 167.136 C 402.131 167.135 426.721 165.155 433.872 155.151 C 446.547 137.417 441.545 102.238 430.875 95.079 C 410.302 81.276 385.044 102.578 408.346 123.408 M 452.303 380.623 C 479.793 404.490 488.154 411.827 517.805 477.656 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":272.576,\\\"max\\\":447.979},\\\"y\\\":{\\\"min\\\":380.787,\\\"max\\\":556.189}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":97.68,\\\"y\\\":489.823,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}},{\\\"point\\\":{\\\"x\\\":363.18,\\\"y\\\":705.349,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.014809671969189996,\\\"y\\\":-0.9998903307944151}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":366.111,\\\"y\\\":17.106,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":244.22,\\\"y\\\":125.126,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9830343154140954,\\\"y\\\":-0.1834217400373818}},{\\\"point\\\":{\\\"x\\\":543.586,\\\"y\\\":125.126,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9830417954833437,\\\"y\\\":-0.18338164666313783}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":512.683,\\\"y\\\":643.115,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5860442215265754,\\\"y\\\":0.8102790694663847}},{\\\"point\\\":{\\\"x\\\":248.935,\\\"y\\\":661.414,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5860442215265728,\\\"y\\\":0.8102790694663866}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":21.709,\\\"y\\\":486.949,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"mushroom_cloud\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":11.1,\\\"max\\\":708.9},\\\"y\\\":{\\\"min\\\":54.89818127051779,\\\"max\\\":609.2571754342788}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"mushroom_cloud\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Layer_159\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6EF6AC7E-7085-4953-B4BF-0EA7D76E9523_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.052 366.617 C 352.663 361.986 338.498 359.930 329.440 362.208 C 329.440 315.563 329.439 257.205 329.440 257.194 C 329.446 257.195 390.658 257.195 390.664 257.194 C 390.664 257.205 390.733 325.179 390.664 362.272 C 380.924 360.813 368.785 362.627 360.052 366.617 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6EF6AC7E-7085-4953-B4BF-0EA7D76E9523_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 390.664 426.557 C 390.471 420.332 390.664 413.894 390.664 407.506 C 381.341 408.485 369.980 405.690 360.052 401.114 C 350.055 407.379 339.636 411.132 329.440 412.149 C 329.440 415.764 329.260 420.541 329.440 424.894 C 333.507 523.414 325.666 587.137 291.348 601.594 C 324.201 609.745 395.945 608.520 428.652 601.594 C 393.325 587.066 386.883 518.843 390.664 426.557 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 329.440 424.894 C 329.260 420.541 329.440 415.764 329.440 412.149 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 329.440 412.149 C 339.636 411.132 350.055 407.379 360.052 401.114 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.052 401.114 C 369.980 405.690 381.341 408.485 390.664 407.506 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 390.664 407.506 C 390.664 413.894 390.471 420.332 390.664 426.557 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 390.664 362.272 C 380.924 360.813 368.785 362.627 360.052 366.617 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.052 366.617 C 352.663 361.986 338.498 359.930 329.440 362.208 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6EF6AC7E-7085-4953-B4BF-0EA7D76E9523_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 294.148 414.442 C 298.672 427.463 314.213 429.871 329.440 424.894 C 329.260 420.541 329.440 415.764 329.440 412.149 C 339.636 411.132 350.055 407.379 360.052 401.114 C 369.980 405.690 381.341 408.485 390.664 407.506 C 390.664 413.894 390.471 420.332 390.664 426.557 C 394.096 425.521 397.181 423.924 399.923 421.615 C 408.759 429.133 421.979 422.184 425.956 414.442 C 440.503 419.896 448.581 413.921 449.575 403.295 C 462.113 396.195 457.995 377.614 437.083 380.608 C 437.823 370.507 416.778 364.044 404.045 369.314 C 401.832 365.319 396.579 363.184 390.664 362.272 C 380.924 360.813 368.785 362.627 360.052 366.617 C 352.663 361.986 338.498 359.930 329.440 362.208 C 326.172 362.958 323.551 364.359 322.241 366.429 C 313.329 359.365 294.769 366.076 294.148 372.778 C 275.147 369.451 248.538 381.030 265.994 399.174 C 256.179 409.274 281.431 417.508 294.148 414.442 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 294.148 414.442 C 298.672 427.463 314.213 429.871 329.440 424.894 C 329.260 420.541 329.440 415.764 329.440 412.149 C 322.777 412.842 316.093 412.217 309.936 410.188 M 265.994 399.174 C 256.179 409.274 281.431 417.508 294.148 414.442 M 294.148 372.778 C 275.147 369.451 248.538 381.030 265.994 399.174 M 322.241 366.429 C 313.329 359.365 294.769 366.076 294.148 372.778 M 329.440 362.208 C 326.172 362.958 323.551 364.359 322.241 366.429 M 360.052 366.617 C 352.663 361.986 338.498 359.930 329.440 362.208 M 390.664 362.272 C 380.924 360.813 368.785 362.627 360.052 366.617 M 404.045 369.314 C 401.832 365.319 396.579 363.184 390.664 362.272 M 437.083 380.608 C 437.823 370.507 416.778 364.044 404.045 369.314 M 449.575 403.295 C 462.113 396.195 457.995 377.614 437.083 380.608 M 425.956 414.442 C 440.503 419.896 448.581 413.921 449.575 403.295 M 399.923 421.615 C 408.759 429.133 421.979 422.184 425.956 414.442 M 390.664 426.557 C 394.096 425.521 397.181 423.924 399.923 421.615 M 390.664 426.557 C 390.471 420.332 390.664 413.894 390.664 407.506 C 381.341 408.485 369.980 405.690 360.052 401.114 C 350.055 407.379 339.636 411.132 329.440 412.149 M 402.386 402.772 C 399.340 405.532 395.210 407.029 390.664 407.506 M 410.167 406.037 C 407.717 405.119 405.030 404.015 402.386 402.772 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 194.879 155.401 C 127.765 149.906 94.090 140.925 94.090 132.334 C 94.090 122.635 137.016 112.439 222.924 107.409 C 261.180 104.946 306.508 103.608 360.000 103.608 C 417.058 103.608 464.828 105.130 502.863 107.609 C 585.402 113.021 625.910 122.912 625.910 132.334 C 625.910 140.787 593.312 149.616 528.338 155.103 C 527.381 161.591 525.097 167.774 521.450 173.020 C 646.355 163.951 706.900 145.568 706.900 132.334 C 706.900 117.831 634.186 97.145 483.985 89.336 C 448.527 87.527 406.657 86.416 360.000 86.416 C 315.676 86.416 275.672 87.419 240.428 89.137 C 87.643 96.627 13.100 117.650 13.100 132.334 C 13.100 145.387 71.998 163.448 189.746 172.365 C 190.662 166.488 192.430 160.699 194.879 155.401 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 86.416 C 406.657 86.416 448.527 87.527 483.985 89.336 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 240.428 89.137 C 275.672 87.419 315.676 86.416 360.000 86.416 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6EF6AC7E-7085-4953-B4BF-0EA7D76E9523_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 86.416 C 406.657 86.416 448.527 87.527 483.985 89.336 C 477.782 70.137 444.644 51.054 418.178 71.007 C 409.005 53.900 377.281 50.110 357.422 72.270 C 350.799 57.683 330.392 56.895 322.736 72.742 C 293.900 45.591 250.491 66.363 240.428 89.137 C 275.672 87.419 315.676 86.416 360.000 86.416 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 502.863 107.609 C 464.828 105.130 417.058 103.608 360.000 103.608 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 103.608 C 306.508 103.608 261.180 104.946 222.924 107.409 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 194.879 155.401 C 192.430 160.699 190.662 166.488 189.746 172.365 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 521.450 173.020 C 525.097 167.774 527.381 161.591 528.338 155.103 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#6EF6AC7E-7085-4953-B4BF-0EA7D76E9523_5)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 500.712 115.289 C 502.022 112.639 502.712 109.970 502.863 107.609 C 464.828 105.130 417.058 103.608 360.000 103.608 C 306.508 103.608 261.180 104.946 222.924 107.409 C 215.794 114.136 211.754 124.505 214.332 132.138 C 206.060 137.423 199.348 145.733 194.879 155.401 C 192.430 160.699 190.662 166.488 189.746 172.365 C 186.828 191.074 192.976 210.643 212.745 219.679 C 204.718 232.327 216.876 253.273 232.776 249.615 C 231.421 279.596 263.992 304.269 297.469 280.892 C 309.693 295.697 336.972 288.532 335.133 271.877 C 348.069 280.124 372.116 284.097 381.677 266.420 C 386.779 278.390 399.590 290.154 416.418 279.816 C 435.298 300.337 461.373 282.410 467.525 260.907 C 486.067 271.167 491.875 253.850 493.355 245.323 C 534.301 246.457 533.599 194.922 518.017 177.152 C 519.346 175.786 520.553 174.313 521.450 173.020 C 525.097 167.774 527.381 161.591 528.338 155.103 C 531.122 136.250 521.790 115.873 500.712 115.289 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":244.404,\\\"max\\\":475.596},\\\"y\\\":{\\\"min\\\":80.633,\\\"max\\\":264.45}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":568.587,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":60.292,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":254.814,\\\"y\\\":392.892,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987479801957,\\\"y\\\":0.005004022315183217}},{\\\"point\\\":{\\\"x\\\":465.186,\\\"y\\\":392.892,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874798019568,\\\"y\\\":0.005004022315183201}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":422.846,\\\"y\\\":600.652,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128409016835823,\\\"y\\\":0.7013257794256086}},{\\\"point\\\":{\\\"x\\\":297.103,\\\"y\\\":600.665,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6988341420825213,\\\"y\\\":0.7152837491931341}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":546.077,\\\"y\\\":77.661,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314749018422071,\\\"y\\\":-0.7753963169524182}},{\\\"point\\\":{\\\"x\\\":174.577,\\\"y\\\":77.725,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6816906513254144,\\\"y\\\":-0.7316405236832719}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":607.44,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6EF6AC7E-7085-4953-B4BF-0EA7D76E9523_0\\\",\\\"x1\\\":\\\"51.90%\\\",\\\"y1\\\":\\\"86.65%\\\",\\\"x2\\\":\\\"49.41%\\\",\\\"y2\\\":\\\"-17.83%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"34.12%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"6EF6AC7E-7085-4953-B4BF-0EA7D76E9523_1\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.60%\\\",\\\"x2\\\":\\\"49.84%\\\",\\\"y2\\\":\\\"-40.89%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"34.12%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"6EF6AC7E-7085-4953-B4BF-0EA7D76E9523_2\\\",\\\"cx\\\":\\\"48.39%\\\",\\\"cy\\\":\\\"50.50%\\\",\\\"r\\\":\\\"93.78%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"43.53%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"6EF6AC7E-7085-4953-B4BF-0EA7D76E9523_4\\\",\\\"cx\\\":\\\"47.65%\\\",\\\"cy\\\":\\\"354.01%\\\",\\\"r\\\":\\\"598.03%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"43.53%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"6EF6AC7E-7085-4953-B4BF-0EA7D76E9523_5\\\",\\\"cx\\\":\\\"49.80%\\\",\\\"cy\\\":\\\"35.97%\\\",\\\"r\\\":\\\"103.45%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"43.53%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":false,\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"nestboxes_triple\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":357.43,\\\"max\\\":362.57},\\\"y\\\":{\\\"min\\\":137.019,\\\"max\\\":142.159}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"nestboxes_triple\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"triple_nest\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 142.159 C 361.422 142.159 362.570 141.012 362.570 139.589 C 362.570 138.167 361.422 137.019 360.000 137.019 C 358.578 137.019 357.430 138.167 357.430 139.589 C 357.430 141.012 358.578 142.159 360.000 142.159 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":276.113,\\\"max\\\":443.887},\\\"y\\\":{\\\"min\\\":23.193,\\\"max\\\":190.967}},{\\\"x\\\":{\\\"min\\\":234.169,\\\"max\\\":485.831},\\\"y\\\":{\\\"min\\\":138.2,\\\"max\\\":389.862}},{\\\"x\\\":{\\\"min\\\":171.253,\\\"max\\\":548.747},\\\"y\\\":{\\\"min\\\":310.71,\\\"max\\\":688.203}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.383,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":24.013,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":159.523,\\\"y\\\":356.615,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872021058309,\\\"y\\\":0.005059211850872006}},{\\\"point\\\":{\\\"x\\\":560.477,\\\"y\\\":356.615,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872021058309,\\\"y\\\":0.005059211850871984}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":588.197,\\\"y\\\":683.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128600680266917,\\\"y\\\":0.7013062978563508}},{\\\"point\\\":{\\\"x\\\":131.615,\\\"y\\\":683.982,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986748108596845,\\\"y\\\":0.715439381548279}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":491.51,\\\"y\\\":132.642,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314308837378318,\\\"y\\\":-0.7754321627725153}},{\\\"point\\\":{\\\"x\\\":229.156,\\\"y\\\":132.719,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817476458193734,\\\"y\\\":-0.7315874161163123}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":686.511,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":false}},{\\\"name\\\":\\\"nestboxes_triple_2\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":574.404,\\\"max\\\":580.976},\\\"y\\\":{\\\"min\\\":352.412,\\\"max\\\":358.984}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"nestboxes_triple_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"triple_nest\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 574.404 355.698 C 574.404 357.517 575.872 358.984 577.690 358.984 C 579.509 358.984 580.976 357.517 580.976 355.698 C 580.976 353.879 579.509 352.412 577.690 352.412 C 575.872 352.412 574.404 353.879 574.404 355.698 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":524.731,\\\"max\\\":692.505},\\\"y\\\":{\\\"min\\\":271.81,\\\"max\\\":439.586}},{\\\"x\\\":{\\\"min\\\":325.836,\\\"max\\\":577.498},\\\"y\\\":{\\\"min\\\":229.867,\\\"max\\\":481.529}},{\\\"x\\\":{\\\"min\\\":27.495,\\\"max\\\":404.988},\\\"y\\\":{\\\"min\\\":166.952,\\\"max\\\":544.445}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":13.315,\\\"y\\\":355.698,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":691.685,\\\"y\\\":355.698,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":359.083,\\\"y\\\":155.221,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.005059211850872006,\\\"y\\\":-0.9999872021058309}},{\\\"point\\\":{\\\"x\\\":359.083,\\\"y\\\":556.175,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.005059211850871984,\\\"y\\\":0.9999872021058309}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":31.716,\\\"y\\\":127.313,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7154393815482779,\\\"y\\\":-0.6986748108596859}},{\\\"point\\\":{\\\"x\\\":31.763,\\\"y\\\":583.895,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7012685465265663,\\\"y\\\":0.7128972055300239}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":582.979,\\\"y\\\":224.854,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7315874161163123,\\\"y\\\":-0.6817476458193734}},{\\\"point\\\":{\\\"x\\\":583.056,\\\"y\\\":487.208,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7754321627725177,\\\"y\\\":0.6314308837378287}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":29.187,\\\"y\\\":355.698,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":false}},{\\\"name\\\":\\\"oroboros\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":64.98738744248472,\\\"max\\\":655.0507988184054},\\\"y\\\":{\\\"min\\\":13.838513484342027,\\\"max\\\":664.711}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"oroboros\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"oroborus\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 336.602 54.839 C 336.602 41.888 347.049 31.441 360.000 31.441 C 372.951 31.441 383.398 41.888 383.398 54.839 C 383.398 67.789 372.951 78.236 360.000 78.236 C 347.049 78.236 336.602 67.789 336.602 54.839 M 403.062 100.617 C 403.045 100.617 342.313 83.241 236.908 104.218 C 234.453 104.707 259.584 26.052 359.127 16.564 C 454.931 7.433 484.351 87.510 484.363 87.517 C 484.372 87.525 657.049 154.367 652.980 369.731 C 649.917 531.864 522.163 662.711 360.000 662.711 C 197.837 662.711 64.594 531.875 67.020 369.731 C 68.248 287.641 103.546 213.298 159.820 162.430 C 246.737 83.861 376.120 102.018 376.132 102.017 C 376.121 102.021 265.339 116.641 187.883 197.614 C 145.136 242.303 119.076 302.803 119.622 369.731 C 120.706 502.774 226.952 610.109 360.000 610.109 C 493.048 610.109 600.307 502.779 600.378 369.731 C 600.475 189.947 439.455 142.104 439.446 142.098 C 439.440 142.100 395.777 158.253 369.871 159.656 C 299.158 163.488 265.773 150.052 266.409 149.698 C 329.509 114.662 403.048 100.622 403.062 100.617 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":201.132,\\\"max\\\":518.868},\\\"y\\\":{\\\"min\\\":210.862,\\\"max\\\":528.599}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.059,\\\"y\\\":706.895,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.059,\\\"y\\\":18.869,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":69.842,\\\"y\\\":370.292,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987422795968,\\\"y\\\":0.005015401267889354}},{\\\"point\\\":{\\\"x\\\":651.204,\\\"y\\\":370.292,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999987422795968,\\\"y\\\":0.005015401267889322}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":566.783,\\\"y\\\":576.592,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128927213698124,\\\"y\\\":0.7012731050154021}},{\\\"point\\\":{\\\"x\\\":154.34,\\\"y\\\":576.635,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986977361102832,\\\"y\\\":0.715416992777195}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":566.341,\\\"y\\\":164.086,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314105448370049,\\\"y\\\":-0.7754487242033716}},{\\\"point\\\":{\\\"x\\\":154.479,\\\"y\\\":164.156,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.681713396229111,\\\"y\\\":-0.7316193309377296}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360.059,\\\"y\\\":658.926,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"palm\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":105.24657507715534,\\\"max\\\":616.8758522677604},\\\"y\\\":{\\\"min\\\":33.95146578872045,\\\"max\\\":659.447}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"palm\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"palm\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"palm_leaf_6\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 321.455 226.204 C 319.292 247.647 328.029 252.826 331.799 252.299 C 358.234 204.618 349.998 147.983 316.887 115.662 C 273.001 72.824 213.862 46.859 168.307 73.414 C 168.308 73.410 176.232 74.138 210.655 79.815 C 244.560 85.406 331.977 121.901 321.455 226.204 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 168.307 73.414 C 213.862 46.859 273.001 72.824 316.887 115.662 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 316.887 115.662 C 349.998 147.983 358.234 204.618 331.799 252.299 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 289.780 48.512 C 211.440 9.638 168.319 73.412 168.307 73.414 C 213.862 46.859 273.001 72.824 316.887 115.662 C 349.998 147.983 358.234 204.618 331.799 252.299 C 345.783 250.342 364.541 230.602 369.605 206.075 C 378.222 164.336 374.746 90.674 289.780 48.512 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"palm_leaf_5\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 324.565 233.506 C 338.198 250.198 348.038 247.683 350.331 244.643 C 335.308 192.236 289.437 158.012 243.170 158.571 C 181.847 159.312 121.669 182.770 108.234 233.760 C 108.232 233.756 114.350 228.667 142.705 208.341 C 170.633 188.320 258.252 152.313 324.565 233.506 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 108.234 233.760 C 121.669 182.770 181.847 159.312 243.170 158.571 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 243.170 158.571 C 289.437 158.012 335.308 192.236 350.331 244.643 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 176.520 130.256 C 93.637 158.163 108.241 233.749 108.234 233.760 C 121.669 182.770 181.847 159.312 243.170 158.571 C 289.437 158.012 335.308 192.236 350.331 244.643 C 358.836 233.372 358.141 206.149 344.379 185.225 C 320.958 149.618 266.413 99.989 176.520 130.256 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"palm_leaf_4\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 328.534 239.864 C 349.977 242.027 355.156 233.291 354.628 229.520 C 306.948 203.086 250.312 211.321 217.992 244.432 C 175.154 288.318 149.189 347.457 175.744 393.012 C 175.740 393.011 176.468 385.087 182.144 350.664 C 187.736 316.759 224.231 229.343 328.534 239.864 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 175.744 393.012 C 149.189 347.457 175.154 288.318 217.992 244.432 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 217.992 244.432 C 250.312 211.321 306.948 203.086 354.628 229.520 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 150.841 271.539 C 111.967 349.879 175.741 393.000 175.744 393.012 C 149.189 347.457 175.154 288.318 217.992 244.432 C 250.312 211.321 306.948 203.086 354.628 229.520 C 352.672 215.536 332.931 196.778 308.404 191.714 C 266.665 183.097 193.004 186.573 150.841 271.539 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"palm_leaf_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 401.201 226.204 C 403.364 247.647 394.628 252.826 390.857 252.299 C 364.422 204.618 372.658 147.983 405.769 115.662 C 449.655 72.824 508.794 46.859 554.349 73.414 C 554.348 73.410 546.424 74.138 512.001 79.815 C 478.096 85.406 390.679 121.901 401.201 226.204 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 554.349 73.414 C 508.794 46.859 449.655 72.824 405.769 115.662 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 405.769 115.662 C 372.658 147.983 364.422 204.618 390.857 252.299 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 432.876 48.512 C 511.216 9.637 554.337 73.412 554.349 73.414 C 508.794 46.859 449.655 72.824 405.769 115.662 C 372.658 147.983 364.422 204.618 390.857 252.299 C 376.873 250.342 358.115 230.602 353.051 206.075 C 344.434 164.336 347.910 90.674 432.876 48.512 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"palm_leaf_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 397.557 233.506 C 383.924 250.198 374.084 247.683 371.791 244.643 C 386.814 192.236 432.685 158.012 478.952 158.571 C 540.275 159.312 600.453 182.770 613.888 233.760 C 613.890 233.756 607.773 228.667 579.417 208.341 C 551.490 188.320 463.871 152.313 397.557 233.506 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 613.888 233.760 C 600.453 182.770 540.275 159.312 478.952 158.571 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 478.952 158.571 C 432.685 158.012 386.814 192.236 371.791 244.643 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 545.602 130.256 C 628.485 158.163 613.882 233.749 613.888 233.760 C 600.453 182.770 540.275 159.312 478.952 158.571 C 432.685 158.012 386.814 192.236 371.791 244.643 C 363.287 233.372 363.981 206.149 377.744 185.225 C 401.164 149.618 455.709 99.989 545.602 130.256 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"palm_leaf\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 393.589 239.864 C 372.146 242.027 366.966 233.291 367.494 229.520 C 415.174 203.086 471.810 211.321 504.131 244.432 C 546.969 288.318 572.934 347.457 546.379 393.012 C 546.383 393.011 545.655 385.087 539.978 350.664 C 534.387 316.759 497.892 229.343 393.589 239.864 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 546.379 393.012 C 572.934 347.457 546.969 288.318 504.131 244.432 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 504.131 244.432 C 471.810 211.321 415.174 203.086 367.494 229.520 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 571.281 271.539 C 610.155 349.879 546.381 393.000 546.379 393.012 C 572.934 347.457 546.969 288.318 504.131 244.432 C 471.810 211.321 415.174 203.086 367.494 229.520 C 369.451 215.536 389.191 196.778 413.718 191.714 C 455.457 183.097 529.119 186.573 571.281 271.539 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Layer_63\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 327.637 241.105 C 327.639 241.104 360.873 230.601 360.875 230.601 C 360.877 230.601 394.111 241.104 394.113 241.105 C 394.113 241.110 396.014 293.142 396.014 293.148 C 396.014 293.153 397.914 345.185 397.915 345.190 C 397.915 345.196 399.816 397.228 399.816 397.233 C 399.816 397.239 401.717 449.271 401.717 449.276 C 401.717 449.281 403.618 501.314 403.618 501.319 C 403.618 501.324 405.519 553.357 405.519 553.362 C 405.519 553.367 407.420 605.399 407.420 605.404 C 407.420 605.410 409.321 657.442 409.321 657.447 C 409.319 657.447 312.431 657.447 312.428 657.447 C 312.429 657.442 314.329 605.410 314.330 605.404 C 314.330 605.399 316.231 553.367 316.231 553.362 C 316.231 553.357 318.131 501.324 318.132 501.319 C 318.132 501.314 320.033 449.281 320.033 449.276 C 320.033 449.271 321.934 397.239 321.934 397.233 C 321.934 397.228 323.835 345.196 323.835 345.191 C 323.835 345.185 325.736 293.153 325.736 293.148 C 325.736 293.142 327.637 241.110 327.637 241.105 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.875 177.995 C 390.590 177.995 407.773 211.853 402.975 241.179 C 399.213 264.175 322.537 264.175 318.775 241.179 C 313.977 211.853 331.159 177.995 360.875 177.995 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.330 605.404 C 345.360 605.404 376.390 605.404 407.420 605.404 C 407.420 605.399 405.519 553.367 405.519 553.362 C 375.756 553.362 345.994 553.362 316.231 553.362 C 316.231 553.357 318.131 501.324 318.132 501.319 C 346.627 501.319 375.123 501.319 403.618 501.319 C 403.618 501.324 405.519 553.357 405.519 553.362 M 323.835 345.191 C 348.528 345.191 373.221 345.190 397.915 345.190 C 397.915 345.196 399.816 397.228 399.816 397.233 C 373.855 397.233 347.895 397.233 321.934 397.233 C 321.934 397.228 323.835 345.196 323.835 345.191 C 323.835 345.185 325.736 293.153 325.736 293.148 C 349.162 293.148 372.588 293.148 396.014 293.148 C 396.014 293.153 397.914 345.185 397.915 345.190 M 320.033 449.276 C 347.261 449.276 374.489 449.276 401.717 449.276 C 401.717 449.281 403.618 501.314 403.618 501.319 M 320.033 449.276 C 320.033 449.271 321.934 397.239 321.934 397.233 M 318.132 501.319 C 318.132 501.314 320.033 449.281 320.033 449.276 M 314.330 605.404 C 314.330 605.399 316.231 553.367 316.231 553.362 M 399.816 397.233 C 399.816 397.239 401.717 449.271 401.717 449.276 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":696.665,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":61.97,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":311.88,\\\"y\\\":515.892,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987505440881,\\\"y\\\":0.004998896090519083}},{\\\"point\\\":{\\\"x\\\":408.12,\\\"y\\\":515.892,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999987505440881,\\\"y\\\":0.004998896090519083}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":408.442,\\\"y\\\":655.159,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129148909156562,\\\"y\\\":0.7012505674227422}},{\\\"point\\\":{\\\"x\\\":311.425,\\\"y\\\":655.192,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987102292835594,\\\"y\\\":0.7154047913555766}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":655.975,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"pear\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":161.17467074781206,\\\"max\\\":558.8477442963457},\\\"y\\\":{\\\"min\\\":50.511,\\\"max\\\":659.9038854104746}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pear\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pear\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#AD382CC9-E48B-4987-8376-DE8CFBEE6BC8_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 351.247 194.917 C 469.384 152.272 437.708 290.124 529.800 411.042 C 612.231 519.275 492.066 694.041 360.000 651.306 C 227.934 694.041 107.824 519.317 190.200 411.042 C 281.770 290.681 231.255 153.015 351.247 194.917 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#AD382CC9-E48B-4987-8376-DE8CFBEE6BC8_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.491 200.040 C 346.234 148.585 358.749 95.256 426.633 52.511 C 433.675 54.991 435.820 59.713 441.098 67.646 C 370.676 109.056 362.515 148.469 355.152 203.752 C 354.784 206.513 346.027 202.048 346.491 200.040 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#AD382CC9-E48B-4987-8376-DE8CFBEE6BC8_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 240.913 76.944 C 282.502 151.798 312.030 112.830 351.735 147.207 C 354.651 64.820 283.929 71.171 240.913 76.944 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":250.436,\\\"max\\\":462.587},\\\"y\\\":{\\\"min\\\":277.204,\\\"max\\\":629.54}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":42.035,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":76.556,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":225.127,\\\"y\\\":341.678,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872764486153,\\\"y\\\":0.005044496097773597}},{\\\"point\\\":{\\\"x\\\":494.873,\\\"y\\\":341.678,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872764486153,\\\"y\\\":0.005044496097773597}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":512.911,\\\"y\\\":609.286,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128533452498903,\\\"y\\\":0.701313131322978}},{\\\"point\\\":{\\\"x\\\":206.901,\\\"y\\\":609.334,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987224665002328,\\\"y\\\":0.7153928394999709}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":653.255,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"AD382CC9-E48B-4987-8376-DE8CFBEE6BC8_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.15%\\\",\\\"r\\\":\\\"74.19%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"AD382CC9-E48B-4987-8376-DE8CFBEE6BC8_1\\\",\\\"x1\\\":\\\"12.95%\\\",\\\"y1\\\":\\\"72.84%\\\",\\\"x2\\\":\\\"108.10%\\\",\\\"y2\\\":\\\"-28.65%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"14.51%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"AD382CC9-E48B-4987-8376-DE8CFBEE6BC8_2\\\",\\\"x1\\\":\\\"73.44%\\\",\\\"y1\\\":\\\"25.98%\\\",\\\"x2\\\":\\\"42.90%\\\",\\\"y2\\\":\\\"110.47%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"14.51%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\"]}},{\\\"name\\\":\\\"pentacle\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":58.415,\\\"max\\\":661.585},\\\"y\\\":{\\\"min\\\":23.47,\\\"max\\\":626.641}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pentacle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pentacle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#E86B9AB0-DD66-48C0-B30E-F0F61BEE8D2B_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 25.470 C 525.818 25.470 659.585 159.237 659.585 325.055 C 659.585 490.874 525.818 624.641 360.000 624.641 C 194.182 624.641 60.415 490.874 60.415 325.055 C 60.415 159.237 194.182 25.470 360.000 25.470 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#E86B9AB0-DD66-48C0-B30E-F0F61BEE8D2B_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 62.291 C 505.438 62.291 622.764 179.617 622.764 325.055 C 622.764 470.494 505.438 587.820 360.000 587.820 C 214.562 587.820 97.236 470.494 97.236 325.055 C 97.236 179.617 214.562 62.291 360.000 62.291 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"star_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 338.540 402.401 C 338.535 402.398 293.453 369.657 293.448 369.654 C 293.446 369.652 279.300 359.379 272.226 354.241 C 272.220 354.258 218.004 521.232 217.999 521.248 C 218.013 521.238 360.019 418.021 360.033 418.010 C 360.036 418.009 381.477 402.424 381.479 402.422 C 381.484 402.419 426.585 369.637 426.590 369.634 C 426.589 369.632 421.121 352.783 418.386 344.358 C 418.380 344.362 360.028 386.775 360.022 386.779 C 360.020 386.781 338.542 402.399 338.540 402.401 C 338.532 402.406 265.595 455.413 265.588 455.419 C 265.591 455.410 284.162 398.242 293.448 369.654 M 426.590 369.634 C 426.593 369.643 454.481 455.372 454.484 455.381 C 454.477 455.375 381.487 402.428 381.479 402.422 M 388.031 251.009 C 378.680 222.246 359.981 164.728 359.978 164.720 C 359.975 164.728 331.911 251.012 331.908 251.020 C 331.907 251.023 326.586 267.511 323.924 275.757 C 323.931 275.757 396.069 275.742 396.076 275.742 C 404.826 275.765 422.324 275.811 422.326 275.812 C 428.084 293.518 439.596 328.925 439.598 328.931 C 439.599 328.933 445.077 345.781 447.816 354.206 C 447.830 354.196 589.836 250.979 589.851 250.968 C 589.833 250.968 414.278 251.003 414.260 251.003 C 405.517 251.005 388.034 251.009 388.031 251.009 C 388.026 251.009 350.616 251.016 331.908 251.020 M 439.598 328.931 C 464.005 311.193 512.812 275.724 512.820 275.719 C 512.811 275.719 422.335 275.811 422.326 275.812 M 280.433 328.963 C 286.183 311.255 297.682 275.843 297.683 275.837 C 297.684 275.835 303.054 259.296 305.740 251.026 C 305.722 251.026 130.167 251.061 130.149 251.061 C 130.164 251.071 272.212 354.231 272.226 354.241 M 502.110 521.191 C 502.104 521.175 447.822 354.223 447.816 354.206 M 360.033 418.010 C 360.048 418.021 502.096 521.181 502.110 521.191 M 359.967 84.018 C 359.961 84.035 305.745 251.009 305.740 251.026 M 414.260 251.003 C 414.255 250.987 359.972 84.035 359.967 84.018 M 360.022 386.779 C 360.016 386.775 301.648 344.385 301.642 344.381 C 301.644 344.374 323.922 275.764 323.924 275.757 M 396.076 275.742 C 396.078 275.749 418.384 344.351 418.386 344.358 M 297.683 275.837 C 267.516 275.818 207.189 275.780 207.180 275.780 C 207.188 275.785 280.426 328.958 280.433 328.963 C 280.436 328.965 294.572 339.242 301.642 344.381 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 589.851 250.968 C 589.833 250.968 414.278 251.003 414.260 251.003 C 414.255 250.987 359.972 84.035 359.967 84.018 C 359.961 84.035 305.745 251.009 305.740 251.026 C 305.722 251.026 130.167 251.061 130.149 251.061 C 130.164 251.071 272.212 354.231 272.226 354.241 C 272.220 354.258 218.004 521.232 217.999 521.248 C 218.013 521.238 360.019 418.021 360.033 418.010 C 360.048 418.021 502.096 521.181 502.110 521.191 C 502.104 521.175 447.822 354.223 447.816 354.206 C 447.830 354.196 589.836 250.979 589.851 250.968 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 338.540 402.401 C 338.535 402.398 293.453 369.657 293.448 369.654 C 293.446 369.652 279.300 359.379 272.226 354.241 C 272.220 354.258 218.004 521.232 217.999 521.248 C 218.013 521.238 360.019 418.021 360.033 418.010 C 360.036 418.009 381.477 402.424 381.479 402.422 C 381.484 402.419 426.585 369.637 426.590 369.634 C 426.589 369.632 421.121 352.783 418.386 344.358 C 418.380 344.362 360.028 386.775 360.022 386.779 C 360.020 386.781 338.542 402.399 338.540 402.401 C 338.532 402.406 265.595 455.413 265.588 455.419 C 265.591 455.410 284.162 398.242 293.448 369.654 M 426.590 369.634 C 426.593 369.643 454.481 455.372 454.484 455.381 C 454.477 455.375 381.487 402.428 381.479 402.422 M 388.031 251.009 C 378.680 222.246 359.981 164.728 359.978 164.720 C 359.975 164.728 331.911 251.012 331.908 251.020 C 331.907 251.023 326.586 267.511 323.924 275.757 C 323.931 275.757 396.069 275.742 396.076 275.742 C 404.826 275.765 422.324 275.811 422.326 275.812 C 428.084 293.518 439.596 328.925 439.598 328.931 C 439.599 328.933 445.077 345.781 447.816 354.206 C 447.830 354.196 589.836 250.979 589.851 250.968 C 589.833 250.968 414.278 251.003 414.260 251.003 C 405.517 251.005 388.034 251.009 388.031 251.009 C 388.026 251.009 350.616 251.016 331.908 251.020 M 439.598 328.931 C 464.005 311.193 512.812 275.724 512.820 275.719 C 512.811 275.719 422.335 275.811 422.326 275.812 M 280.433 328.963 C 286.183 311.255 297.682 275.843 297.683 275.837 C 297.684 275.835 303.054 259.296 305.740 251.026 C 305.722 251.026 130.167 251.061 130.149 251.061 C 130.164 251.071 272.212 354.231 272.226 354.241 M 502.110 521.191 C 502.104 521.175 447.822 354.223 447.816 354.206 M 360.033 418.010 C 360.048 418.021 502.096 521.181 502.110 521.191 M 359.967 84.018 C 359.961 84.035 305.745 251.009 305.740 251.026 M 414.260 251.003 C 414.255 250.987 359.972 84.035 359.967 84.018 M 360.022 386.779 C 360.016 386.775 301.648 344.385 301.642 344.381 C 301.644 344.374 323.922 275.764 323.924 275.757 M 396.076 275.742 C 396.078 275.749 418.384 344.351 418.386 344.358 M 297.683 275.837 C 267.516 275.818 207.189 275.780 207.180 275.780 C 207.188 275.785 280.426 328.958 280.433 328.963 C 280.436 328.965 294.572 339.242 301.642 344.381 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":165.301,\\\"max\\\":554.762},\\\"y\\\":{\\\"min\\\":129.856,\\\"max\\\":519.317}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.055,\\\"y\\\":700.217,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.032,\\\"y\\\":15.773,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":52.297,\\\"y\\\":325.466,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872705630871,\\\"y\\\":0.005045662670766487}},{\\\"point\\\":{\\\"x\\\":668.749,\\\"y\\\":325.466,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872705630871,\\\"y\\\":0.005045662670766498}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":579.232,\\\"y\\\":544.218,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129166006545214,\\\"y\\\":0.701248829240521}},{\\\"point\\\":{\\\"x\\\":141.896,\\\"y\\\":544.263,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987001125955182,\\\"y\\\":0.7154146718225801}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":578.763,\\\"y\\\":106.814,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314588474546606,\\\"y\\\":-0.7754093912064979}},{\\\"point\\\":{\\\"x\\\":142.043,\\\"y\\\":106.888,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.681714090553063,\\\"y\\\":-0.7316186839750678}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360.032,\\\"y\\\":633.669,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"E86B9AB0-DD66-48C0-B30E-F0F61BEE8D2B_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"70.10%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"63.92%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"E86B9AB0-DD66-48C0-B30E-F0F61BEE8D2B_1\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"88.71%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"39.61%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"pillar\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":243.84223947801854,\\\"max\\\":476.08446547794364},\\\"y\\\":{\\\"min\\\":195.85403936990687,\\\"max\\\":663.128}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pillar\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pillar\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 447.528 629.399 C 436.589 629.591 283.407 629.039 272.472 629.399 C 257.855 629.881 259.969 661.625 259.968 661.628 C 259.988 661.628 460.012 661.628 460.032 661.628 C 460.031 661.625 462.145 629.143 447.528 629.399 C 447.527 629.396 448.486 602.261 435.024 602.012 C 426.027 601.846 293.000 601.864 284.976 602.012 C 271.514 602.261 272.473 629.396 272.472 629.399 C 272.490 629.399 447.510 629.399 447.528 629.399 M 291.531 602.012 C 291.531 601.978 291.531 259.704 291.531 259.669 C 291.545 259.669 428.455 259.669 428.469 259.669 C 428.469 259.704 428.469 601.978 428.469 602.012 C 428.455 602.012 291.545 602.012 291.531 602.012 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.105 259.669 C 411.105 373.783 411.105 487.898 411.105 602.012 M 308.895 259.669 C 308.895 373.783 308.895 487.898 308.895 602.012 M 333.402 259.393 C 333.139 373.599 332.876 487.806 332.613 602.012 M 387.387 259.669 C 387.387 373.783 387.387 487.898 387.387 602.012 M 360.000 259.669 C 360.000 373.783 360.000 487.898 360.000 602.012 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 291.531 218.589 C 291.538 218.589 359.993 218.589 360.000 218.589 C 360.007 218.589 428.462 218.589 428.469 218.589 C 428.469 218.592 428.469 252.505 428.469 252.509 C 428.469 252.512 428.469 280.260 428.469 280.262 C 428.462 280.262 360.007 280.262 360.000 280.262 C 359.993 280.262 291.538 280.262 291.531 280.262 C 291.531 280.260 291.531 252.512 291.531 252.509 C 291.531 252.505 291.531 218.592 291.531 218.589 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 291.531 252.509 C 337.177 252.509 382.823 252.509 428.469 252.509 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 323.687 225.211 C 348.480 225.240 373.273 225.270 398.066 225.299 C 392.837 229.421 383.400 244.189 387.811 259.677 C 394.994 284.902 418.474 293.159 427.679 293.149 C 441.228 293.133 472.083 285.610 474.502 247.221 C 476.268 219.206 449.307 196.775 428.469 197.367 C 420.481 197.594 299.519 197.594 291.531 197.367 C 270.693 196.775 243.017 216.509 245.498 247.221 C 248.594 285.561 278.772 293.133 292.321 293.149 C 301.526 293.159 324.387 284.717 332.189 259.677 C 336.930 244.463 327.767 228.848 323.687 225.211 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 323.687 225.211 C 319.744 221.696 304.851 214.548 289.682 220.704 C 262.132 231.885 263.850 266.403 288.820 265.206 C 311.508 264.119 301.795 237.122 292.492 243.307 M 323.687 225.211 C 348.480 225.240 373.273 225.270 398.066 225.299 C 392.837 229.421 383.400 244.189 387.811 259.677 C 394.994 284.902 418.474 293.159 427.679 293.149 C 441.228 293.133 472.083 285.610 474.502 247.221 C 476.268 219.206 449.307 196.775 428.469 197.367 C 420.481 197.594 299.519 197.594 291.531 197.367 C 270.693 196.775 243.017 216.509 245.498 247.221 C 248.594 285.561 278.772 293.133 292.321 293.149 C 301.526 293.159 324.387 284.717 332.189 259.677 C 336.930 244.463 327.767 228.848 323.687 225.211 M 438.335 223.787 C 419.644 211.840 403.939 220.670 398.066 225.299 M 431.180 265.206 C 454.787 265.255 460.634 238.041 438.335 223.787 M 427.508 241.458 C 412.076 238.871 407.745 265.157 431.180 265.206 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":269.882,\\\"max\\\":450.118},\\\"y\\\":{\\\"min\\\":17.369,\\\"max\\\":197.605}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":669.209,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":290.919,\\\"y\\\":437.711,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999870439800247,\\\"y\\\":0.005090370526051095}},{\\\"point\\\":{\\\"x\\\":429.081,\\\"y\\\":437.711,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999870439800247,\\\"y\\\":0.005090370526051095}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":454.542,\\\"y\\\":656.594,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129324127250674,\\\"y\\\":0.7012327537173475}},{\\\"point\\\":{\\\"x\\\":265.287,\\\"y\\\":656.636,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986773121190923,\\\"y\\\":0.715436938891221}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"pillar_priestess\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":255.404,\\\"max\\\":464.596},\\\"y\\\":{\\\"min\\\":18.345,\\\"max\\\":701.655}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pillar\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pillar_white_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 260.000 30.646 C 320.000 30.646 400.000 30.646 460.000 30.646 C 429.600 45.846 430.832 96.005 417.761 119.246 C 413.834 126.230 408.344 130.772 400.000 130.646 C 394.484 130.563 380.002 130.646 380.000 130.646 C 379.998 130.646 360.002 131.069 360.000 131.069 C 359.998 131.069 340.002 130.646 340.000 130.646 C 339.998 130.646 325.516 130.563 320.000 130.646 C 312.699 130.756 307.583 127.292 303.519 121.318 C 289.021 100.020 291.600 46.446 260.000 30.646 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 417.761 119.246 C 423.930 104.719 415.329 80.113 415.328 80.109 C 415.325 80.114 384.112 105.356 380.000 130.646 C 383.054 108.985 360.002 80.114 360.000 80.109 C 359.998 80.114 336.938 108.986 340.000 130.646 C 336.912 105.775 304.675 80.537 304.672 80.532 C 304.672 80.536 296.592 106.428 303.519 121.318 C 307.583 127.292 312.699 130.756 320.000 130.646 C 315.314 110.438 332.039 80.537 332.040 80.532 C 332.043 80.537 360.000 107.823 360.000 131.069 C 360.000 107.823 387.957 80.537 387.960 80.532 C 387.961 80.537 404.686 110.438 400.000 130.646 C 394.484 130.563 380.002 130.646 380.000 130.646 C 379.998 130.646 360.002 131.069 360.000 131.069 C 359.998 131.069 340.002 130.646 340.000 130.646 C 339.998 130.646 325.516 130.563 320.000 130.646 M 417.761 119.246 C 413.834 126.230 408.344 130.772 400.000 130.646 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 320.000 134.435 C 320.008 134.435 399.992 134.435 400.000 134.435 C 400.002 134.487 420.000 494.435 418.909 654.451 C 420.000 654.435 301.102 654.451 301.091 654.451 C 300.000 494.435 319.998 134.487 320.000 134.435 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 295.332 644.473 C 295.345 644.473 424.655 644.473 424.668 644.473 C 424.668 644.474 424.668 660.935 424.668 660.937 C 424.655 660.937 295.345 660.937 295.332 660.937 C 295.332 660.935 295.332 644.474 295.332 644.473 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_2_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 317.121 130.567 C 317.129 130.567 402.871 130.567 402.879 130.567 C 402.879 130.568 402.879 147.029 402.879 147.031 C 402.871 147.031 317.129 147.031 317.121 147.031 C 317.121 147.029 317.121 130.568 317.121 130.567 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_2_2_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 256.404 19.345 C 256.424 19.345 463.576 19.345 463.596 19.345 C 463.596 19.346 463.596 32.911 463.596 32.912 C 463.576 32.912 256.424 32.912 256.404 32.912 C 256.404 32.911 256.404 19.346 256.404 19.345 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 280.000 660.655 C 280.016 660.655 439.984 660.655 440.000 660.655 C 440.000 660.659 440.000 700.651 440.000 700.655 C 439.984 700.655 280.016 700.655 280.000 700.655 C 280.000 700.651 280.000 660.659 280.000 660.655 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":313.145,\\\"max\\\":406.855},\\\"y\\\":{\\\"min\\\":295.748,\\\"max\\\":453.888}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":704.924,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":31.683,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":273.383,\\\"y\\\":360.034,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872861335325,\\\"y\\\":0.005042575858884988}},{\\\"point\\\":{\\\"x\\\":446.617,\\\"y\\\":360.034,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872861335325,\\\"y\\\":0.005042575858884988}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"pills\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":65.98347930965214,\\\"max\\\":673.2337131033279},\\\"y\\\":{\\\"min\\\":30.8365,\\\"max\\\":613.7074246673221}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pills_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pill2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2\\\",\\\"fill\\\":\\\"url(#ABA4227A-82FF-49A6-9581-F139443457B3_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 239.631 508.139 C 244.779 500.674 251.427 490.479 256.824 478.660 C 246.393 497.871 192.283 487.864 139.259 456.201 C 87.909 425.537 77.853 406.047 83.897 394.793 C 76.409 408.187 71.860 417.080 67.640 426.643 C 63.630 438.645 77.474 462.302 123.444 489.680 C 176.939 521.541 227.244 526.104 239.631 508.139 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 139.259 456.201 C 87.909 425.537 77.853 406.047 83.897 394.793 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 197.822 419.628 C 182.309 420.379 158.843 433.263 139.259 456.201 C 87.909 425.537 77.853 406.047 83.897 394.793 C 93.334 379.613 135.660 386.071 197.822 419.628 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 197.822 419.628 C 182.309 420.379 158.843 433.263 139.259 456.201 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 139.259 456.201 C 192.283 487.864 246.393 497.871 256.824 478.660 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 197.822 419.628 C 182.309 420.379 158.843 433.263 139.259 456.201 C 192.283 487.864 246.393 497.871 256.824 478.660 C 264.658 464.231 210.075 426.243 197.822 419.628 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2\\\",\\\"fill\\\":\\\"url(#ABA4227A-82FF-49A6-9581-F139443457B3_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 514.439 489.540 C 522.734 485.877 533.738 480.675 544.526 473.434 C 525.577 484.335 484.728 447.467 456.147 392.720 C 428.469 339.701 430.112 317.831 441.157 311.410 C 427.761 318.897 419.228 324.090 410.624 330.025 C 400.921 338.148 400.321 365.551 425.138 412.954 C 454.017 468.115 494.477 498.353 514.439 489.540 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 456.147 392.720 C 428.469 339.701 430.112 317.831 441.157 311.410 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2_2_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 525.191 392.243 C 511.583 384.756 484.845 383.439 456.147 392.720 C 428.469 339.701 430.112 317.831 441.157 311.410 C 457.147 303.423 489.818 331.096 525.191 392.243 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 525.191 392.243 C 511.583 384.756 484.845 383.439 456.147 392.720 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 456.147 392.720 C 484.728 447.467 525.577 484.335 544.526 473.434 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3_2_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 525.191 392.243 C 511.583 384.756 484.845 383.439 456.147 392.720 C 484.728 447.467 525.577 484.335 544.526 473.434 C 558.758 465.247 532.163 404.296 525.191 392.243 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_3\\\",\\\"fill\\\":\\\"url(#ABA4227A-82FF-49A6-9581-F139443457B3_6)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 466.031 173.359 C 463.791 164.572 460.480 152.860 455.124 141.022 C 462.740 161.513 419.623 195.702 360.903 214.833 C 304.036 233.361 282.739 228.123 278.234 216.169 C 283.402 230.618 287.112 239.892 291.542 249.360 C 297.949 260.273 324.874 265.397 375.729 248.763 C 434.908 229.405 471.421 194.504 466.031 173.359 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.903 214.833 C 304.036 233.361 282.739 228.123 278.234 216.169 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2_2_3\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.853 146.662 C 362.219 158.844 356.497 184.996 360.903 214.833 C 304.036 233.361 282.739 228.123 278.234 216.169 C 273.002 199.077 305.697 171.434 371.853 146.662 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.853 146.662 C 362.219 158.844 356.497 184.996 360.903 214.833 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.903 214.833 C 419.623 195.702 462.740 161.513 455.124 141.022 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3_2_3\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.853 146.662 C 362.219 158.844 356.497 184.996 360.903 214.833 C 419.623 195.702 462.740 161.513 455.124 141.022 C 449.404 125.633 384.893 141.779 371.853 146.662 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pill1\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_2\\\",\\\"fill\\\":\\\"url(#BA92B9FD-D5C2-48E4-9A42-F65BCC433B6A_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 337.791 520.001 C 337.792 520.008 343.738 567.303 346.712 590.954 C 347.237 595.128 347.761 599.301 348.286 603.475 C 348.293 603.474 410.892 595.604 410.892 595.604 C 473.961 593.716 461.973 498.348 400.397 512.130 C 400.397 512.130 337.797 520.000 337.791 520.001 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 337.791 520.001 C 337.792 520.008 343.738 567.303 346.712 590.954 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.712 590.954 C 347.237 595.128 347.761 599.301 348.286 603.475 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 285.681 611.346 C 224.105 625.129 212.114 529.761 275.185 527.872 C 275.185 527.872 337.785 520.002 337.791 520.001 C 337.792 520.008 343.738 567.303 346.712 590.954 C 347.237 595.128 347.761 599.301 348.286 603.475 C 348.280 603.476 285.681 611.346 285.681 611.346 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.712 590.954 C 317.543 594.649 288.807 598.262 288.807 598.262 C 263.696 603.869 248.700 587.247 246.408 569.016 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 413.529 582.580 C 413.529 582.580 379.804 586.821 346.712 590.954 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_4\\\",\\\"fill\\\":\\\"url(#BA92B9FD-D5C2-48E4-9A42-F65BCC433B6A_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 149.120 261.090 C 149.126 261.087 192.258 240.795 213.827 230.647 C 217.634 228.856 221.440 227.066 225.247 225.275 C 225.249 225.280 252.109 282.370 252.109 282.370 C 284.272 336.655 197.299 377.575 175.982 318.186 C 175.982 318.186 149.122 261.096 149.120 261.090 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 149.120 261.090 C 149.126 261.087 192.258 240.795 213.827 230.647 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 213.827 230.647 C 217.634 228.856 221.440 227.066 225.247 225.275 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5_4\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 198.385 168.179 C 177.068 108.790 90.094 149.709 122.258 203.995 C 122.258 203.995 149.117 261.084 149.120 261.090 C 149.126 261.087 192.258 240.795 213.827 230.647 C 217.634 228.856 221.440 227.066 225.247 225.275 C 225.244 225.269 198.385 168.179 198.385 168.179 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6_4\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 213.827 230.647 C 201.335 204.031 189.006 177.824 189.006 177.824 C 180.301 153.612 158.234 149.841 141.607 157.664 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7_4\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 242.519 291.569 C 242.519 291.569 228.049 260.812 213.827 230.647 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_6\\\",\\\"fill\\\":\\\"url(#BA92B9FD-D5C2-48E4-9A42-F65BCC433B6A_8)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 549.846 187.675 C 549.850 187.681 579.841 224.731 594.839 243.258 C 597.486 246.528 600.132 249.798 602.779 253.068 C 602.774 253.072 553.735 292.767 553.735 292.767 C 508.684 336.946 448.208 262.238 500.801 227.375 C 500.801 227.375 549.841 187.679 549.846 187.675 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 549.846 187.675 C 549.850 187.681 579.841 224.731 594.839 243.258 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 594.839 243.258 C 597.486 246.528 600.132 249.798 602.779 253.068 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5_6\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 651.824 213.368 C 704.418 178.505 643.942 103.796 598.890 147.975 C 598.890 147.975 549.851 187.671 549.846 187.675 C 549.850 187.681 579.841 224.731 594.839 243.258 C 597.486 246.528 600.132 249.798 602.779 253.068 C 602.784 253.064 651.824 213.368 651.824 213.368 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6_6\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 594.839 243.258 C 617.709 224.781 640.220 206.559 640.220 206.559 C 661.659 192.332 660.059 170.003 648.498 155.720 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7_6\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 542.515 285.648 C 542.515 285.648 568.935 264.262 594.839 243.258 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pill3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_3_3\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 548.891 544.959 C 562.108 558.176 562.108 579.501 548.891 592.719 C 535.673 605.936 514.348 605.936 501.131 592.719 C 487.913 579.501 487.913 558.176 501.131 544.959 C 514.348 531.742 535.673 531.742 548.891 544.959 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2_3\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 542.112 586.498 C 532.492 596.118 516.971 596.118 507.351 586.498 C 497.732 576.879 497.732 561.358 507.351 551.738 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_3_4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 353.673 388.337 C 366.890 401.554 366.890 422.879 353.673 436.097 C 340.455 449.314 319.130 449.314 305.912 436.097 C 292.695 422.879 292.695 401.554 305.912 388.337 C 319.130 375.119 340.455 375.119 353.673 388.337 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2_4\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.893 429.876 C 337.274 439.496 321.753 439.496 312.133 429.876 C 302.513 420.256 302.513 404.735 312.133 395.116 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_3_6\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 638.899 331.178 C 652.116 344.395 652.116 365.720 638.899 378.938 C 625.681 392.155 604.356 392.155 591.139 378.938 C 577.921 365.720 577.921 344.395 591.139 331.178 C 604.356 317.960 625.681 317.960 638.899 331.178 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2_6\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 632.120 372.717 C 622.500 382.337 606.979 382.337 597.359 372.717 C 587.740 363.097 587.740 347.576 597.359 337.957 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_3_7\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 535.270 78.277 C 548.487 91.494 548.487 112.819 535.270 126.037 C 522.052 139.254 500.727 139.254 487.510 126.037 C 474.292 112.819 474.292 91.494 487.510 78.277 C 500.727 65.059 522.052 65.059 535.270 78.277 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2_7\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 528.491 119.816 C 518.871 129.436 503.350 129.436 493.730 119.816 C 484.111 110.196 484.111 94.676 493.730 85.056 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_3_3_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 296.612 41.750 C 309.829 54.967 309.829 76.292 296.612 89.509 C 283.394 102.727 262.069 102.727 248.852 89.509 C 235.634 76.292 235.634 54.967 248.852 41.750 C 262.069 28.532 283.394 28.532 296.612 41.750 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2_3_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 289.833 83.289 C 280.213 92.909 264.692 92.909 255.072 83.289 C 245.452 73.669 245.452 58.149 255.072 48.529 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":686.591,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":15.272,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":41.017,\\\"y\\\":335.771,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999986974927357,\\\"y\\\":0.005103917675031628}},{\\\"point\\\":{\\\"x\\\":678.983,\\\"y\\\":335.771,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999986974927357,\\\"y\\\":0.005103917675031603}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":586.206,\\\"y\\\":562.157,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.712910683286032,\\\"y\\\":0.7012548450147371}},{\\\"point\\\":{\\\"x\\\":133.607,\\\"y\\\":562.204,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987150414229386,\\\"y\\\":0.7154000914798243}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":586.365,\\\"y\\\":109.49,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314440111597693,\\\"y\\\":-0.7754214729877301}},{\\\"point\\\":{\\\"x\\\":134.404,\\\"y\\\":109.567,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817181856741779,\\\"y\\\":-0.7316148681656951}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":631.146,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"ABA4227A-82FF-49A6-9581-F139443457B3_0\\\",\\\"cx\\\":\\\"38.75%\\\",\\\"cy\\\":\\\"83.66%\\\",\\\"r\\\":\\\"140.24%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"24.31%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"ABA4227A-82FF-49A6-9581-F139443457B3_3\\\",\\\"cx\\\":\\\"32.78%\\\",\\\"cy\\\":\\\"59.77%\\\",\\\"r\\\":\\\"110.44%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"24.31%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"ABA4227A-82FF-49A6-9581-F139443457B3_6\\\",\\\"cx\\\":\\\"58.06%\\\",\\\"cy\\\":\\\"74.39%\\\",\\\"r\\\":\\\"120.32%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"24.31%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"BA92B9FD-D5C2-48E4-9A42-F65BCC433B6A_0\\\",\\\"cx\\\":\\\"32.64%\\\",\\\"cy\\\":\\\"54.60%\\\",\\\"r\\\":\\\"76.25%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"BA92B9FD-D5C2-48E4-9A42-F65BCC433B6A_4\\\",\\\"cx\\\":\\\"47.13%\\\",\\\"cy\\\":\\\"39.48%\\\",\\\"r\\\":\\\"77.39%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"BA92B9FD-D5C2-48E4-9A42-F65BCC433B6A_8\\\",\\\"cx\\\":\\\"43.98%\\\",\\\"cy\\\":\\\"43.76%\\\",\\\"r\\\":\\\"91.48%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"pipe\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":76.47002036209344,\\\"max\\\":651.1409493597304},\\\"y\\\":{\\\"min\\\":385.36309429059713,\\\"max\\\":688.6809297297697}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pipe\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pipe\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 174.775 443.709 C 233.055 443.709 259.183 458.450 259.183 466.458 C 259.183 474.465 233.055 489.207 174.775 489.207 C 116.495 489.207 90.367 474.465 90.367 466.458 C 90.367 458.450 116.495 443.709 174.775 443.709 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 174.775 489.207 C 116.495 489.207 90.367 474.465 90.367 466.458 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 259.183 466.458 C 259.183 474.465 233.055 489.207 174.775 489.207 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 174.775 489.207 C 116.495 489.207 90.367 474.465 90.367 466.458 C 78.552 480.459 53.206 642.528 151.582 680.725 C 180.038 691.773 221.897 685.340 238.111 678.391 C 320.303 643.168 344.330 502.803 484.591 438.694 C 532.162 416.951 599.890 421.331 599.900 421.336 C 599.900 421.336 612.297 429.533 627.953 428.559 C 652.927 427.007 658.667 392.606 629.633 388.076 C 608.646 384.801 599.712 393.872 599.709 393.873 C 599.693 393.874 499.922 387.173 447.395 405.218 C 333.286 444.416 269.040 550.415 269.086 547.326 C 269.419 524.503 264.774 474.860 259.183 466.458 C 259.183 474.465 233.055 489.207 174.775 489.207 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 258.372 617.703 C 267.518 587.533 268.840 564.282 269.086 547.326 C 269.419 524.503 264.774 474.860 259.183 466.458 C 259.183 474.465 233.055 489.207 174.775 489.207 C 116.495 489.207 90.367 474.465 90.367 466.458 C 78.552 480.459 53.206 642.528 151.582 680.725 C 180.038 691.773 221.897 685.340 238.111 678.391 C 320.303 643.168 344.330 502.803 484.591 438.694 C 532.162 416.951 599.890 421.331 599.900 421.336 C 599.900 421.336 612.297 429.533 627.953 428.559 C 652.927 427.007 658.667 392.606 629.633 388.076 C 608.646 384.801 599.712 393.872 599.709 393.873 C 599.693 393.874 499.922 387.173 447.395 405.218 C 333.286 444.416 269.040 550.415 269.086 547.326 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 175.475 455.674 C 210.028 455.674 226.350 463.191 226.350 465.571 C 226.350 467.951 210.028 475.468 175.475 475.468 C 140.923 475.468 124.601 467.951 124.601 465.571 C 124.601 463.191 140.923 455.674 175.475 455.674 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 603.033 412.008 C 603.033 412.009 605.966 417.140 605.966 417.141 C 605.968 417.141 612.002 422.458 625.397 422.640 C 638.954 422.825 644.094 413.475 644.096 413.474 C 644.096 413.474 643.363 409.075 643.363 409.075 C 643.361 409.076 638.893 417.365 626.131 418.241 C 609.070 419.411 603.035 412.009 603.033 412.008 M 249.180 646.797 C 247.405 651.276 238.372 668.350 238.371 668.352 C 238.379 668.345 268.541 652.940 313.601 592.357 C 332.386 567.099 390.767 470.060 472.734 437.117 C 552.005 405.258 600.092 415.402 600.105 415.400 C 600.105 415.400 598.084 412.262 598.084 412.262 C 598.071 412.264 554.344 400.079 470.168 430.703 C 356.841 471.933 301.772 607.502 253.845 631.552 C 253.143 631.905 250.354 643.836 249.180 646.797 M 131.251 499.983 C 120.503 533.871 115.762 566.157 125.966 601.245 C 147.662 675.854 178.703 677.484 178.708 677.492 C 178.700 677.484 121.057 676.106 100.387 601.250 C 81.524 532.934 99.821 488.289 99.821 488.278 C 99.824 488.279 115.126 495.812 131.251 499.983 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":96.328,\\\"max\\\":251.645},\\\"y\\\":{\\\"min\\\":321.296,\\\"max\\\":476.614}},{\\\"x\\\":{\\\"min\\\":150.592,\\\"max\\\":338.353},\\\"y\\\":{\\\"min\\\":175.85,\\\"max\\\":363.611}},{\\\"x\\\":{\\\"min\\\":38.005,\\\"max\\\":261.069},\\\"y\\\":{\\\"min\\\":9.102,\\\"max\\\":232.166}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":675.759,\\\"y\\\":409.444,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":509.516,\\\"y\\\":391.502,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":79.453,\\\"y\\\":583.394,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873260936966,\\\"y\\\":0.005034645169136841}},{\\\"point\\\":{\\\"x\\\":330.835,\\\"y\\\":583.394,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873280270576,\\\"y\\\":0.005034261147964657}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":190.278,\\\"y\\\":683.993,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.011776088797460943,\\\"y\\\":0.9999306594622621}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":652.125,\\\"y\\\":408.693,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"pitchfork\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":253.297,\\\"max\\\":466.703},\\\"y\\\":{\\\"min\\\":48.437,\\\"max\\\":669.289}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pitchfork\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pitchfork\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#16C51C82-5250-4984-AF04-6D0F4B33E19D_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 440.076 234.310 C 427.989 255.260 408.904 273.426 374.178 280.760 C 374.281 281.685 384.914 667.250 384.915 667.289 C 384.910 667.289 335.091 667.289 335.086 667.289 C 335.087 667.250 344.783 281.658 345.840 280.761 C 310.648 273.890 291.961 255.285 279.863 234.321 C 260.638 201.006 274.144 106.247 274.143 106.235 C 274.141 106.236 255.298 117.363 255.297 117.365 C 255.299 117.358 283.487 50.443 283.490 50.437 C 283.493 50.443 311.681 117.358 311.684 117.365 C 311.682 117.363 291.365 106.237 291.363 106.236 C 291.364 106.248 283.875 197.316 305.162 226.879 C 313.365 238.271 329.414 248.603 345.638 250.359 C 347.122 199.476 349.875 106.252 349.874 106.238 C 349.872 106.239 331.808 117.366 331.806 117.367 C 331.809 117.361 359.997 50.446 360.000 50.440 C 360.003 50.446 388.191 117.361 388.194 117.367 C 388.192 117.366 370.125 106.240 370.123 106.239 C 370.122 106.253 372.965 202.140 374.395 250.361 C 390.371 248.632 406.680 238.283 414.884 226.889 C 436.170 197.324 428.630 106.247 428.631 106.235 C 428.629 106.236 408.318 117.363 408.316 117.365 C 408.319 117.358 436.507 50.443 436.510 50.437 C 436.513 50.443 464.701 117.358 464.703 117.365 C 464.702 117.363 445.853 106.237 445.851 106.236 C 445.851 106.248 459.296 200.995 440.076 234.310 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":656.069,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":42.912,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":330.901,\\\"y\\\":359.843,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088752084}},{\\\"point\\\":{\\\"x\\\":389.099,\\\"y\\\":359.843,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.005035854088752084}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":668.596,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"16C51C82-5250-4984-AF04-6D0F4B33E19D_0\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"70.06%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"-132.45%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"11.37%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"pomegranate\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":99.011,\\\"max\\\":620.989},\\\"y\\\":{\\\"min\\\":6.3829999795977574,\\\"max\\\":640.575}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pomegranate\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"circles2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.955 149.662 C 489.563 149.662 593.311 253.411 593.311 382.019 C 593.311 510.627 489.563 614.376 360.955 614.376 C 232.347 614.376 128.599 510.627 128.599 382.019 C 128.599 253.411 232.347 149.663 360.955 149.662 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#CE9D9BF3-5584-47B6-AD92-B4CC9E3550D3_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 349.459 202.309 C 349.460 186.862 336.999 174.402 321.553 174.402 C 306.107 174.401 293.646 186.862 293.646 202.309 C 293.646 217.755 306.107 230.215 321.553 230.215 C 336.999 230.215 349.459 217.755 349.459 202.309 M 277.367 229.053 C 277.367 213.606 264.906 201.146 249.460 201.146 C 234.014 201.146 221.553 213.606 221.553 229.053 C 221.553 244.499 234.014 256.959 249.460 256.959 C 264.906 256.959 277.367 244.499 277.367 229.053 M 336.669 286.029 C 336.669 270.583 324.209 258.122 308.762 258.122 C 293.316 258.122 280.855 270.583 280.855 286.029 C 280.855 301.475 293.316 313.936 308.762 313.936 C 324.208 313.936 336.669 301.475 336.669 286.029 M 220.390 281.378 C 220.390 265.932 207.930 253.471 192.484 253.471 C 177.037 253.471 164.577 265.932 164.577 281.378 C 164.577 296.824 177.038 309.285 192.484 309.285 C 207.930 309.285 220.390 296.824 220.390 281.378 M 206.437 366.261 C 206.437 350.815 193.976 338.354 178.530 338.354 C 163.084 338.354 150.623 350.815 150.623 366.261 C 150.623 381.707 163.084 394.168 178.530 394.168 C 193.976 394.168 206.437 381.707 206.437 366.261 M 277.367 329.052 C 277.367 313.606 264.907 301.145 249.460 301.145 C 234.014 301.145 221.553 313.606 221.553 329.052 C 221.553 344.498 234.014 356.959 249.460 356.959 C 264.906 356.958 277.367 344.498 277.367 329.052 M 334.343 380.214 C 334.343 364.768 321.883 352.307 306.437 352.307 C 290.990 352.307 278.530 364.768 278.530 380.214 C 278.530 395.661 290.990 408.121 306.437 408.121 C 321.883 408.121 334.343 395.660 334.343 380.214 M 207.600 447.656 C 207.600 432.210 195.139 419.749 179.693 419.749 C 164.247 419.749 151.786 432.210 151.786 447.656 C 151.786 463.102 164.247 475.563 179.693 475.563 C 195.139 475.563 207.600 463.102 207.600 447.656 M 275.041 420.912 C 275.041 405.466 262.581 393.005 247.135 393.005 C 231.688 393.005 219.228 405.465 219.228 420.912 C 219.228 436.358 231.688 448.819 247.135 448.818 C 262.581 448.818 275.041 436.358 275.041 420.912 M 336.669 470.911 C 336.669 455.465 324.209 443.004 308.762 443.004 C 293.316 443.004 280.855 455.465 280.855 470.911 C 280.855 486.358 293.316 498.818 308.762 498.818 C 324.208 498.818 336.669 486.358 336.669 470.911 M 265.739 509.283 C 265.739 493.837 253.279 481.376 237.833 481.376 C 222.386 481.376 209.925 493.837 209.926 509.283 C 209.926 524.730 222.386 537.190 237.833 537.190 C 253.279 537.190 265.739 524.729 265.739 509.283 M 342.483 553.470 C 342.483 538.023 330.022 525.562 314.576 525.562 C 299.129 525.562 286.669 538.023 286.669 553.470 C 286.669 568.916 299.130 581.376 314.576 581.376 C 330.022 581.376 342.482 568.916 342.483 553.470 M 371.552 202.309 C 371.552 186.862 384.012 174.402 399.458 174.402 C 414.905 174.401 427.365 186.862 427.365 202.309 C 427.365 217.755 414.905 230.215 399.458 230.215 C 384.012 230.215 371.552 217.755 371.552 202.309 M 443.645 229.053 C 443.645 213.606 456.105 201.146 471.551 201.146 C 486.998 201.146 499.458 213.606 499.458 229.053 C 499.458 244.499 486.997 256.959 471.551 256.959 C 456.105 256.959 443.645 244.499 443.645 229.053 M 384.343 286.029 C 384.342 270.583 396.803 258.122 412.249 258.122 C 427.696 258.122 440.156 270.583 440.156 286.029 C 440.156 301.475 427.695 313.936 412.249 313.936 C 396.803 313.936 384.343 301.475 384.343 286.029 M 506.435 283.704 C 506.435 268.257 518.895 255.797 534.341 255.797 C 549.788 255.796 562.248 268.257 562.248 283.704 C 562.248 299.150 549.788 311.610 534.341 311.610 C 518.895 311.610 506.435 299.150 506.435 283.704 M 508.760 372.075 C 508.760 356.629 521.221 344.168 536.667 344.168 C 552.113 344.168 564.574 356.629 564.574 372.075 C 564.574 387.521 552.113 399.982 536.667 399.982 C 521.221 399.982 508.760 387.521 508.760 372.075 M 443.644 326.726 C 443.644 311.280 456.105 298.819 471.551 298.819 C 486.997 298.819 499.458 311.280 499.458 326.726 C 499.458 342.173 486.997 354.633 471.551 354.633 C 456.105 354.633 443.644 342.172 443.644 326.726 M 386.668 380.214 C 386.668 364.768 399.129 352.307 414.575 352.307 C 430.021 352.307 442.482 364.768 442.482 380.214 C 442.482 395.661 430.021 408.121 414.575 408.121 C 399.129 408.121 386.668 395.660 386.668 380.214 M 516.900 451.144 C 516.900 435.698 529.360 423.237 544.806 423.237 C 560.253 423.237 572.713 435.698 572.713 451.144 C 572.713 466.591 560.252 479.051 544.806 479.051 C 529.360 479.051 516.900 466.591 516.900 451.144 M 447.133 424.400 C 447.133 408.954 459.593 396.493 475.039 396.493 C 490.486 396.493 502.946 408.954 502.946 424.400 C 502.946 439.846 490.486 452.307 475.039 452.307 C 459.593 452.307 447.133 439.846 447.133 424.400 M 384.343 470.911 C 384.342 455.465 396.803 443.004 412.249 443.004 C 427.696 443.004 440.156 455.465 440.156 470.911 C 440.156 486.358 427.695 498.818 412.249 498.818 C 396.803 498.818 384.343 486.358 384.343 470.911 M 452.947 513.935 C 452.947 498.488 465.407 486.028 480.853 486.028 C 496.300 486.027 508.760 498.488 508.760 513.935 C 508.760 529.381 496.300 541.841 480.853 541.841 C 465.407 541.841 452.947 529.381 452.947 513.935 M 378.529 553.470 C 378.529 538.023 390.989 525.562 406.435 525.562 C 421.882 525.562 434.343 538.023 434.342 553.470 C 434.342 568.916 421.882 581.376 406.435 581.376 C 390.989 581.376 378.529 568.916 378.529 553.470 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"pomegranate\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#5DAD796B-F5DE-456E-B924-6455049CDFAF_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 336.073 361.450 C 336.073 237.922 358.376 179.665 336.073 166.732 C 321.759 158.431 247.994 188.752 220.479 214.217 C 179.022 252.586 140.257 328.453 141.047 384.935 C 141.800 438.735 180.651 509.561 220.479 545.737 C 248.230 570.944 321.563 601.176 336.073 593.223 C 362.984 578.472 336.073 508.485 336.073 361.450 M 386.021 361.450 C 386.021 237.922 363.718 179.665 386.021 166.732 C 400.335 158.431 474.100 188.752 501.615 214.217 C 543.072 252.586 581.837 328.453 581.047 384.935 C 580.294 438.735 541.443 509.561 501.615 545.737 C 473.863 570.944 400.531 601.176 386.021 593.223 C 359.110 578.472 386.021 508.485 386.021 361.450 M 345.567 46.417 C 345.599 46.412 359.968 8.383 360.000 8.383 C 360.032 8.382 376.035 45.142 376.067 45.147 C 376.091 45.150 396.999 23.156 397.022 23.163 C 397.052 23.173 398.866 62.563 398.866 62.567 C 398.869 62.565 428.074 41.444 428.101 41.455 C 428.148 41.476 409.836 84.892 417.762 106.266 C 436.118 155.772 507.744 155.787 543.026 192.380 C 589.186 240.255 618.989 304.820 618.989 377.403 C 618.989 449.987 589.929 515.280 543.026 562.427 C 496.123 609.574 431.375 638.575 360.000 638.575 C 288.625 638.575 223.877 609.574 176.974 562.427 C 130.071 515.280 101.011 449.987 101.011 377.403 C 101.011 304.820 130.611 240.059 176.974 192.380 C 212.884 155.451 288.387 157.225 304.690 106.266 C 310.630 87.700 291.863 51.646 291.899 51.621 C 291.920 51.607 321.026 63.656 321.029 63.657 C 321.029 63.653 320.495 20.634 320.527 20.622 C 320.554 20.612 345.539 46.423 345.567 46.417 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":667.718,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":13.04,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":99.812,\\\"y\\\":377.801,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873342537683,\\\"y\\\":0.005033024144816289}},{\\\"point\\\":{\\\"x\\\":621.234,\\\"y\\\":377.801,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873342537683,\\\"y\\\":0.005033024144816322}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":545.517,\\\"y\\\":562.831,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129079596758853,\\\"y\\\":0.7012576138843458}},{\\\"point\\\":{\\\"x\\\":175.599,\\\"y\\\":562.869,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987628184698997,\\\"y\\\":0.7153534256044364}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":545.12,\\\"y\\\":192.856,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314343491213488,\\\"y\\\":-0.7754293409135993}},{\\\"point\\\":{\\\"x\\\":175.723,\\\"y\\\":192.918,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817335362911943,\\\"y\\\":-0.7316005641713946}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":636.275,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"CE9D9BF3-5584-47B6-AD92-B4CC9E3550D3_1\\\",\\\"cx\\\":\\\"49.79%\\\",\\\"cy\\\":\\\"51.82%\\\",\\\"r\\\":\\\"133.33%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"5DAD796B-F5DE-456E-B924-6455049CDFAF_0\\\",\\\"cx\\\":\\\"50.22%\\\",\\\"cy\\\":\\\"59.27%\\\",\\\"r\\\":\\\"105.54%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"31.37%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"poot\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":13.876078965278195,\\\"max\\\":644.465},\\\"y\\\":{\\\"min\\\":125.71497567714724,\\\"max\\\":607.0478352249859}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"poot\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"poot_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 371.743 366.023 C 325.636 358.520 300.494 336.550 281.761 309.680 C 263.033 316.616 237.323 320.836 216.022 310.107 C 186.805 295.392 165.240 261.425 163.404 230.700 C 160.820 187.481 195.122 150.299 222.627 138.274 C 281.297 112.621 318.109 139.603 337.467 156.982 C 371.510 187.545 372.503 221.807 373.581 243.797 C 375.796 288.974 378.639 317.187 392.706 337.382 C 401.441 349.922 424.432 367.015 424.435 367.018 C 424.430 367.018 388.283 368.715 371.743 366.023 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.743 366.023 C 325.636 358.520 300.494 336.550 281.761 309.680 C 263.033 316.616 237.323 320.836 216.022 310.107 C 186.805 295.392 165.240 261.425 163.404 230.700 C 160.820 187.481 195.122 150.299 222.627 138.274 C 281.297 112.621 318.109 139.603 337.467 156.982 C 371.510 187.545 372.503 221.807 373.581 243.797 C 375.796 288.974 378.639 317.187 392.706 337.382 C 401.441 349.922 424.432 367.015 424.435 367.018 C 424.430 367.018 388.283 368.715 371.743 366.023 M 293.041 183.583 C 345.710 211.980 345.813 285.959 281.761 309.680 M 215.282 241.709 C 200.935 198.966 256.243 163.743 293.041 183.583 M 273.073 260.363 C 252.925 280.441 223.091 264.975 215.282 241.709 M 262.235 221.565 C 279.475 220.758 291.219 242.282 273.073 260.363 M 258.015 237.161 C 249.053 236.684 250.528 222.114 262.235 221.565 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 312.823 404.395 C 267.147 428.774 230.221 426.313 195.652 415.225 C 185.945 436.465 166.412 461.745 139.074 467.272 C 102.300 474.708 60.397 452.675 38.259 425.178 C 8.165 387.799 12.169 333.003 28.324 303.917 C 62.786 241.874 113.363 240.909 142.105 243.212 C 192.650 247.263 216.555 276.791 232.285 295.445 C 264.604 333.769 282.258 353.671 312.045 365.063 C 327.866 371.114 359.923 369.853 359.928 369.853 C 359.923 369.857 329.208 395.649 312.823 404.395 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 312.823 404.395 C 267.147 428.774 230.221 426.313 195.652 415.225 C 185.945 436.465 166.412 461.745 139.074 467.272 C 102.300 474.708 60.397 452.675 38.259 425.178 C 8.165 387.799 12.169 333.003 28.324 303.917 C 62.786 241.874 113.363 240.909 142.105 243.212 C 192.650 247.263 216.555 276.791 232.285 295.445 C 264.604 333.769 282.258 353.671 312.045 365.063 C 327.866 371.114 359.923 369.853 359.928 369.853 C 359.923 369.857 329.208 395.649 312.823 404.395 M 120.834 296.517 C 186.338 286.140 227.162 346.275 195.652 415.225 M 91.378 400.009 C 50.004 371.984 75.069 303.766 120.834 296.517 M 154.847 377.602 C 150.586 408.839 113.898 415.263 91.378 400.009 M 119.216 350.697 C 133.867 338.397 158.684 349.471 154.847 377.602 M 125.981 367.277 C 117.762 372.881 109.268 359.049 119.216 350.697 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 415.625 501.518 C 377.613 535.792 341.601 542.230 305.792 539.830 C 300.659 561.101 284.876 585.465 261.107 596.323 C 228.505 611.216 184.688 606.374 157.162 586.887 C 118.444 559.477 110.166 504.672 118.734 472.917 C 137.012 405.181 185.305 392.201 213.428 387.562 C 262.886 379.404 292.857 402.036 312.394 416.184 C 352.534 445.250 374.213 460.138 405.506 463.969 C 422.127 466.003 452.582 457.154 452.587 457.153 C 452.583 457.158 429.261 489.223 415.625 501.518 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 415.625 501.518 C 377.613 535.792 341.601 542.230 305.792 539.830 C 300.659 561.101 284.876 585.465 261.107 596.323 C 228.505 611.216 184.688 606.374 157.162 586.887 C 118.444 559.477 110.166 504.672 118.734 472.917 C 137.012 405.181 185.305 392.201 213.428 387.562 C 262.886 379.404 292.857 402.036 312.394 416.184 C 352.534 445.250 374.213 460.138 405.506 463.969 C 422.127 466.003 452.582 457.154 452.587 457.153 C 452.583 457.158 429.261 489.223 415.625 501.518 M 205.724 443.772 C 266.095 418.207 323.373 466.981 305.792 539.830 M 202.127 550.082 C 155.755 533.055 163.545 461.634 205.724 443.772 M 257.679 513.460 C 261.035 544.444 227.368 559.350 202.127 550.082 M 217.083 496.137 C 228.208 480.845 254.656 485.556 257.679 513.460 M 227.524 510.433 C 220.974 517.768 209.528 506.521 217.083 496.137 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 426.443 404.981 C 387.255 432.883 352.936 435.010 319.760 428.907 C 312.673 448.214 295.309 469.260 271.944 476.834 C 239.897 487.223 199.508 477.977 175.909 456.813 C 142.715 427.045 140.896 374.981 152.321 346.256 C 176.693 284.982 223.184 278.072 249.943 276.773 C 297.002 274.490 322.544 298.854 339.260 314.171 C 373.604 345.640 392.240 361.878 421.045 368.830 C 436.344 372.522 465.734 367.544 465.739 367.544 C 465.735 367.548 440.501 394.972 426.443 404.981 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 426.443 404.981 C 387.255 432.883 352.936 435.010 319.760 428.907 C 312.673 448.214 295.309 469.260 271.944 476.834 C 239.897 487.223 199.508 477.977 175.909 456.813 C 142.715 427.045 140.896 374.981 152.321 346.256 C 176.693 284.982 223.184 278.072 249.943 276.773 C 297.002 274.490 322.544 298.854 339.260 314.171 C 373.604 345.640 392.240 361.878 421.045 368.830 C 436.344 372.522 465.734 367.544 465.739 367.544 C 465.735 367.548 440.501 394.972 426.443 404.981 M 236.687 328.424 C 295.813 311.065 344.033 362.784 319.760 428.907 M 221.863 427.298 C 180.401 406.398 195.378 340.552 236.687 328.424 M 277.681 399.096 C 277.473 428.388 244.431 438.674 221.863 427.298 M 241.646 378.543 C 253.681 365.465 277.868 372.716 277.681 399.096 M 249.853 393.017 C 242.946 399.159 233.472 387.424 241.646 378.543 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 521.448 403.699 C 479.931 407.550 479.530 410.897 427.583 390.697 C 411.943 405.375 383.759 411.241 358.670 406.069 C 328.060 399.760 298.918 377.243 286.547 350.564 C 269.280 313.327 282.812 268.763 301.874 247.631 C 340.545 204.760 380.165 213.691 402.915 219.402 C 458.276 233.301 485.904 269.790 544.341 322.120 C 588.350 361.529 641.987 371.774 641.992 371.775 C 641.980 371.780 593.852 396.983 521.448 403.699 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 505.449 348.074 C 474.927 337.221 456.478 325.706 456.474 325.704 M 642.064 371.372 C 642.050 371.370 575.463 372.970 505.449 348.074 M 521.448 403.699 C 479.931 407.550 479.530 410.897 427.583 390.697 C 411.943 405.375 383.759 411.241 358.670 406.069 C 328.060 399.760 298.918 377.243 286.547 350.564 C 269.280 313.327 282.812 268.763 301.874 247.631 C 340.545 204.760 380.165 213.691 402.915 219.402 C 458.276 233.301 485.904 269.790 544.341 322.120 C 588.350 361.529 641.987 371.774 641.992 371.775 C 641.980 371.780 593.852 396.983 521.448 403.699 M 388.089 259.326 C 452.288 268.401 478.796 342.637 427.583 390.697 M 331.502 338.056 C 302.626 295.898 346.749 253.482 388.089 259.326 M 394.856 343.459 C 379.806 369.159 346.022 359.256 331.502 338.056 M 368.783 304.257 C 388.032 298.225 409.985 317.624 394.856 343.459 M 369.792 326.074 C 358.169 323.319 359.467 307.176 368.783 304.257 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 579.781 439.110 C 536.482 472.923 505.232 484.740 461.647 495.874 C 462.471 514.936 455.117 539.156 437.815 553.984 C 414.083 574.321 376.409 580.199 348.436 571.128 C 308.796 558.273 287.964 515.705 284.490 487.021 C 277.682 430.814 303.780 404.304 322.958 391.604 C 370.378 360.202 410.834 376.658 437.378 381.046 C 480.834 388.229 506.075 392.078 538.991 390.759 C 592.486 388.614 642.454 371.552 642.465 371.550 C 642.458 371.557 631.366 398.826 579.781 439.110 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.595 425.045 C 476.946 444.203 431.986 437.113 431.975 437.115 M 640.865 372.772 C 640.855 372.777 606.106 404.064 538.595 425.045 M 579.781 439.110 C 536.482 472.923 505.232 484.740 461.647 495.874 C 462.471 514.936 455.117 539.156 437.815 553.984 C 414.083 574.321 376.409 580.199 348.436 571.128 C 308.796 558.273 287.964 515.705 284.490 487.021 C 277.682 430.814 303.780 404.304 322.958 391.604 C 370.378 360.202 410.834 376.658 437.378 381.046 C 480.834 388.229 506.075 392.078 538.991 390.759 C 592.486 388.614 642.454 371.552 642.465 371.550 C 642.458 371.557 631.366 398.826 579.781 439.110 M 354.638 439.495 C 399.068 403.521 458.822 430.589 461.647 495.874 M 377.246 529.449 C 334.282 526.357 323.597 464.628 354.638 439.495 M 414.972 485.371 C 425.252 510.527 400.631 531.132 377.246 529.449 M 376.778 480.639 C 382.414 465.143 405.714 462.716 414.972 485.371 M 388.973 490.101 C 385.252 497.826 372.950 491.161 376.778 480.639 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":702.775,\\\"y\\\":373.815,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":16.843,\\\"y\\\":350.5,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":267.696,\\\"y\\\":127.863,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005042800226934896,\\\"y\\\":-0.9999872850021001}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":78.886,\\\"y\\\":255.138,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6966929980643289,\\\"y\\\":-0.7173694072429748}},{\\\"point\\\":{\\\"x\\\":470.72,\\\"y\\\":255.138,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6966929980643268,\\\"y\\\":-0.7173694072429767}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":132.089,\\\"y\\\":559.685,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7315638158183975,\\\"y\\\":0.6817729705592807}},{\\\"point\\\":{\\\"x\\\":429.455,\\\"y\\\":559.685,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7315638158183994,\\\"y\\\":0.6817729705592788}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":639.777,\\\"y\\\":375.19,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"priestess\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":90.723,\\\"max\\\":648.44},\\\"y\\\":{\\\"min\\\":30.206,\\\"max\\\":683.735}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"priestess\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"details\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.086 153.643 C 301.097 153.643 418.903 153.643 418.914 153.643 C 418.921 153.669 482.753 415.187 482.759 415.213 C 482.735 415.214 241.310 421.097 241.286 421.097 C 241.292 421.070 301.080 153.669 301.086 153.643 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 198.214 C 360.004 198.205 398.325 198.215 398.325 102.401 C 398.325 102.401 383.592 79.614 360.000 79.614 C 336.408 79.614 321.678 102.399 321.675 102.401 C 321.675 198.214 359.996 198.205 360.000 198.214 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 304.708 184.775 C 329.470 229.242 387.170 228.607 415.292 184.775 C 440.282 225.223 463.632 326.207 463.637 326.221 C 463.615 326.230 241.308 421.088 241.286 421.097 C 241.292 421.073 251.101 243.741 304.708 184.775 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 312.742 344.042 C 312.738 344.044 283.796 356.717 269.322 363.054 C 266.478 353.601 266.471 342.597 272.309 333.649 C 288.149 309.374 346.250 329.570 346.258 329.569 C 342.283 331.299 334.334 334.759 334.333 334.760 C 334.332 334.760 324.019 339.248 324.018 339.249 C 324.017 339.249 312.743 344.041 312.742 344.042 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 334.333 334.760 C 327.381 331.937 319.897 329.949 311.748 328.733 M 324.018 339.249 C 315.793 335.714 306.635 333.734 298.490 332.129 M 312.742 344.042 C 305.871 341.323 297.646 339.512 289.959 338.736 M 312.742 344.042 C 312.738 344.044 283.796 356.717 269.322 363.054 C 266.478 353.601 266.471 342.597 272.309 333.649 C 288.149 309.374 346.250 329.570 346.258 329.569 C 342.283 331.299 334.334 334.759 334.333 334.760 C 334.332 334.760 324.019 339.248 324.018 339.249 C 324.017 339.249 312.743 344.041 312.742 344.042 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 365.968 140.523 C 365.969 140.523 371.571 134.412 376.253 134.412 C 380.935 134.412 386.536 140.523 386.537 140.523 C 386.536 140.524 380.935 146.634 376.253 146.634 C 371.571 146.635 365.969 140.524 365.968 140.523 M 333.332 140.523 C 333.333 140.523 338.934 134.412 343.617 134.412 C 348.299 134.412 353.900 140.523 353.901 140.523 C 353.900 140.524 348.299 146.634 343.617 146.634 C 338.934 146.635 333.333 140.524 333.332 140.523 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 351.158 177.684 C 357.009 177.684 362.860 177.684 368.711 177.684 M 389.353 127.049 C 389.351 127.049 377.522 120.015 364.697 127.049 M 328.488 127.049 C 328.490 127.049 342.838 120.762 353.144 127.049 C 363.399 133.305 359.835 165.272 360.000 165.374 C 360.016 165.384 362.516 165.353 363.774 165.343 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"priestess_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 583.914 274.247 C 583.914 274.247 583.914 274.247 583.914 274.247 C 598.747 335.169 591.036 401.019 556.728 458.608 C 522.420 516.198 468.199 554.383 408.158 569.594 C 348.116 584.805 282.254 577.042 224.664 542.734 C 167.074 508.426 128.888 454.205 113.677 394.163 C 98.466 334.121 106.230 268.259 140.538 210.670 C 174.503 153.656 227.985 115.661 286.848 100.847 C 262.554 116.419 240.853 136.179 224.066 161.483 C 192.311 209.349 180.770 264.662 192.943 317.315 C 204.364 366.714 237.819 416.059 284.078 443.607 C 332.204 472.268 389.637 477.439 438.214 459.579 C 487.901 441.312 524.446 411.591 556.738 359.313 C 573.294 332.510 579.371 302.703 583.914 274.247 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 334.631 117.725 C 327.925 197.895 217.484 301.456 304.612 380.211 C 285.807 390.196 256.522 418.291 245.024 452.784 C 131.581 325.161 280.475 208.031 303.258 117.666 C 313.904 117.652 324.532 117.642 334.631 117.725 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 385.890 117.654 C 400.392 117.624 410.566 117.618 416.742 117.666 C 439.525 208.031 588.419 325.161 474.976 452.784 C 463.440 418.176 441.487 393.985 415.408 380.200 C 502.179 301.075 393.372 199.277 385.890 117.654 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 245.024 452.784 C 256.522 418.291 285.807 390.196 304.612 380.211 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 91.723 682.735 C 91.738 682.712 175.932 660.059 245.024 452.784 C 256.522 418.291 285.807 390.196 304.612 380.211 C 430.684 469.898 268.440 603.581 420.669 682.735 C 310.063 682.735 91.756 682.735 91.723 682.735 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 45.359 C 377.296 45.359 391.249 59.312 391.249 76.608 C 391.249 93.904 377.296 107.856 360.000 107.856 C 342.704 107.856 328.751 93.904 328.751 76.608 C 328.751 59.312 342.704 45.359 360.000 45.359 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 285.499 356.925 C 344.225 328.818 484.133 274.752 484.153 274.744 C 484.155 274.748 501.768 318.520 501.769 318.524 C 501.751 318.532 318.813 392.188 317.640 392.839 C 305.889 381.282 292.237 368.562 285.499 356.925 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 398.137 326.108 C 421.822 335.375 437.235 353.344 436.812 354.022 C 431.090 363.187 422.067 376.703 407.526 385.984 C 402.783 378.364 404.190 366.440 374.843 348.699 C 376.047 346.329 378.624 341.648 378.624 341.647 C 378.625 341.647 383.054 336.277 383.055 336.277 C 383.055 336.276 389.683 330.866 389.684 330.865 C 389.685 330.865 395.038 327.147 398.137 326.108 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 378.624 341.647 C 394.122 348.950 402.070 356.385 411.877 367.398 M 383.055 336.277 C 399.292 342.587 409.311 350.087 419.364 360.332 M 389.684 330.865 C 405.146 337.266 414.934 343.150 426.791 353.846 M 389.684 330.865 C 389.685 330.865 395.038 327.147 398.137 326.108 C 421.822 335.375 437.235 353.344 436.812 354.022 C 431.090 363.187 422.067 376.703 407.526 385.984 C 402.783 378.364 404.190 366.440 374.843 348.699 C 376.047 346.329 378.624 341.648 378.624 341.647 C 378.625 341.647 383.054 336.277 383.055 336.277 C 383.055 336.276 389.683 330.866 389.684 330.865 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 304.612 380.211 C 430.684 469.898 268.440 603.581 420.669 682.735 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 474.976 452.784 C 463.440 418.176 441.487 393.985 415.408 380.200 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 304.612 380.211 C 430.684 469.898 268.440 603.581 420.669 682.735 C 495.444 682.735 647.417 682.735 647.440 682.735 C 647.422 682.712 544.068 660.059 474.976 452.784 C 463.440 418.176 441.487 393.985 415.408 380.200 C 380.840 361.928 329.268 367.120 304.612 380.211 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 484.523 274.612 C 486.202 273.954 491.492 279.994 497.320 294.862 C 503.149 309.729 503.373 317.755 501.694 318.413 C 500.016 319.071 494.726 313.031 488.897 298.164 C 483.069 283.296 482.845 275.270 484.523 274.612 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 370.929 539.914 C 370.929 539.914 370.929 539.914 370.929 539.914 C 364.615 565.845 367.898 593.873 382.501 618.385 C 397.104 642.898 420.182 659.151 445.738 665.625 C 471.294 672.100 499.328 668.795 523.841 654.193 C 548.353 639.590 564.607 616.511 571.081 590.955 C 577.556 565.398 574.251 537.365 559.648 512.852 C 545.191 488.585 522.427 472.413 497.373 466.107 C 507.713 472.735 516.950 481.146 524.095 491.917 C 537.611 512.290 542.524 535.834 537.342 558.245 C 532.481 579.271 518.241 600.274 498.552 612.000 C 478.067 624.199 453.621 626.400 432.945 618.799 C 411.796 611.023 396.241 598.373 382.496 576.121 C 375.449 564.713 372.863 552.026 370.929 539.914 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 385.890 117.654 C 400.392 117.624 410.566 117.618 416.742 117.666 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 385.890 117.654 C 400.392 117.624 410.566 117.618 416.742 117.666 C 408.481 84.915 415.955 56.117 455.813 31.206 C 398.325 54.201 382.850 84.635 385.890 117.654 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 303.258 117.666 C 313.904 117.652 324.532 117.642 334.631 117.725 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 303.258 117.666 C 313.904 117.652 324.532 117.642 334.631 117.725 C 337.428 84.339 321.675 54.201 264.187 31.206 C 304.045 56.117 311.519 84.915 303.258 117.666 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 302.660 108.769 C 302.672 108.769 417.328 108.769 417.340 108.769 C 417.340 108.770 417.340 118.487 417.340 118.488 C 417.328 118.488 302.672 118.488 302.660 118.488 C 302.660 118.487 302.660 108.770 302.660 108.769 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":308.29,\\\"max\\\":411.71},\\\"y\\\":{\\\"min\\\":223.784,\\\"max\\\":311.433}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":703.835,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":42.4,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":46.028,\\\"y\\\":357.866,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873469209338,\\\"y\\\":0.005030506737083696}},{\\\"point\\\":{\\\"x\\\":673.972,\\\"y\\\":357.866,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873469209338,\\\"y\\\":0.005030506737083676}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":582.653,\\\"y\\\":580.695,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128875989637359,\\\"y\\\":0.7012783122582072}},{\\\"point\\\":{\\\"x\\\":137.163,\\\"y\\\":580.741,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986593808820681,\\\"y\\\":0.7154544496370717}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":582.809,\\\"y\\\":135.138,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314575890139169,\\\"y\\\":-0.7754104160228512}},{\\\"point\\\":{\\\"x\\\":137.947,\\\"y\\\":135.214,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817058273199624,\\\"y\\\":-0.731626383475887}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"rabbit\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":26.768156271079942,\\\"max\\\":664.5046121518643},\\\"y\\\":{\\\"min\\\":143.80626137975585,\\\"max\\\":563.7479279601147}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"rabbit\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"rabbit\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#3772D716-79FA-438D-BDA5-F276A6ABBF5A_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 114.753 311.350 C 115.090 302.624 122.400 295.856 131.126 296.193 C 139.852 296.529 146.620 303.839 146.284 312.565 C 145.948 321.291 138.637 328.059 129.911 327.723 C 121.185 327.387 114.417 320.076 114.753 311.350 M 517.203 365.082 C 521.654 361.424 532.181 367.463 541.137 356.393 C 561.452 331.280 550.300 298.586 542.540 297.712 C 527.224 295.989 508.253 333.664 500.472 336.826 C 489.434 341.310 420.042 334.599 378.702 336.254 C 292.520 339.706 253.606 370.159 226.620 353.787 C 214.904 346.678 191.925 307.668 196.253 294.666 C 199.765 284.115 242.703 255.487 255.330 246.026 C 281.546 226.384 320.427 173.019 312.706 165.643 C 302.148 155.557 249.547 196.674 235.401 208.101 C 216.057 223.727 174.313 295.075 169.871 277.168 C 168.897 273.243 204.399 229.663 212.472 216.730 C 221.042 203.001 261.661 159.331 250.204 147.901 C 236.805 134.533 189.280 188.956 177.157 203.491 C 166.446 216.332 146.200 272.974 140.016 275.589 C 129.850 279.887 97.853 284.479 88.606 290.506 C 77.533 297.722 43.417 327.659 47.958 340.072 C 60.171 373.457 126.796 356.538 138.767 372.403 C 145.983 381.965 133.763 414.116 146.017 430.048 C 154.686 441.318 95.732 452.550 84.597 461.391 C 70.893 472.270 18.837 513.632 30.442 526.728 C 44.428 542.510 85.457 492.423 98.673 485.554 C 120.928 473.988 171.728 470.110 164.681 472.122 C 148.893 476.632 124.287 482.695 115.185 488.402 C 98.582 498.812 38.079 544.232 51.261 558.731 C 65.256 574.125 116.193 519.702 134.526 512.732 C 155.702 504.681 235.116 506.829 241.805 488.998 C 247.537 473.721 305.536 487.498 338.196 484.447 C 361.164 482.301 403.593 469.772 420.144 473.816 C 431.450 476.578 456.619 500.257 467.349 504.766 C 483.179 511.417 533.204 514.523 548.960 521.348 C 560.197 526.216 585.346 547.699 597.863 555.052 C 615.389 565.349 628.161 562.253 628.832 555.901 C 631.092 534.503 564.391 485.829 552.502 488.992 C 537.973 492.856 504.250 468.107 512.162 472.387 C 528.725 481.347 544.227 482.824 554.418 482.027 C 573.715 480.517 602.901 510.609 613.796 520.271 C 626.247 531.312 646.747 543.264 660.128 534.701 C 676.209 524.409 605.903 474.400 592.547 458.118 C 566.585 426.466 538.720 453.612 517.949 411.683 C 510.911 397.477 512.844 368.664 517.203 365.082 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":700.419,\\\"y\\\":386.547,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":46.836,\\\"y\\\":338.443,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":53.561,\\\"y\\\":558.075,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987749121542526,\\\"y\\\":0.7153416121992462}},{\\\"point\\\":{\\\"x\\\":625.795,\\\"y\\\":558.075,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6987749121542549,\\\"y\\\":0.7153416121992439}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":363.914,\\\"y\\\":336.675,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.03525593465184053,\\\"y\\\":-0.9993783162905953}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":515.386,\\\"y\\\":387.182,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"3772D716-79FA-438D-BDA5-F276A6ABBF5A_0\\\",\\\"cx\\\":\\\"47.75%\\\",\\\"cy\\\":\\\"67.61%\\\",\\\"r\\\":\\\"238.86%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"4.31%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"rain\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":181.39001882748295,\\\"max\\\":538.609981172517},\\\"y\\\":{\\\"min\\\":44.69,\\\"max\\\":693.4194243204383}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"rain_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"rain\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 330.343 608.274 C 354.256 552.651 359.996 510.904 359.999 510.895 C 360.002 510.904 364.679 552.553 389.657 608.274 C 413.446 661.343 389.797 691.550 359.999 691.419 C 333.413 691.302 306.643 663.398 330.343 608.274 M 330.343 376.172 C 354.257 320.548 359.997 278.802 360.000 278.792 C 360.003 278.802 364.680 320.451 389.657 376.172 C 413.446 429.241 389.798 459.447 360.000 459.316 C 333.414 459.199 306.644 431.296 330.343 376.172 M 330.343 144.069 C 354.257 88.446 359.997 46.699 360.000 46.690 C 360.003 46.699 364.680 88.348 389.657 144.069 C 413.446 197.138 389.798 227.345 360.000 227.214 C 333.414 227.097 306.644 199.193 330.343 144.069 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 200.602 520.404 C 234.352 470.137 247.684 430.163 247.688 430.154 C 247.689 430.164 244.614 471.961 258.901 531.330 C 272.507 587.873 243.700 613.207 214.436 607.589 C 188.326 602.577 167.154 570.219 200.602 520.404 M 243.355 292.273 C 277.105 242.007 290.437 202.032 290.441 202.023 C 290.442 202.033 287.367 243.831 301.654 303.199 C 315.261 359.742 286.453 385.076 257.189 379.458 C 231.080 374.446 209.907 342.089 243.355 292.273 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 519.398 520.404 C 485.648 470.137 472.316 430.163 472.312 430.154 C 472.311 430.164 475.386 471.961 461.099 531.330 C 447.493 587.873 476.300 613.207 505.564 607.589 C 531.674 602.577 552.846 570.219 519.398 520.404 M 476.645 292.273 C 442.895 242.007 429.563 202.032 429.559 202.023 C 429.558 202.033 432.633 243.830 418.346 303.199 C 404.740 359.742 433.547 385.075 462.811 379.458 C 488.921 374.446 510.093 342.088 476.645 292.273 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":15.772,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":198.432,\\\"y\\\":403.008,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999870363369868,\\\"y\\\":0.005091871755042698}},{\\\"point\\\":{\\\"x\\\":521.568,\\\"y\\\":403.008,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999870363369868,\\\"y\\\":0.005091871755042684}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":690.851,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"rainbow_half\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":17.593,\\\"max\\\":702.407},\\\"y\\\":{\\\"min\\\":118.54587499964998,\\\"max\\\":461.454}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"rainbow_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"rainbow_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ff00ff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 131.759 460.922 C 131.759 461.041 118.129 460.952 112.706 460.952 C 112.706 397.758 136.887 334.564 185.249 286.202 C 281.973 189.478 438.027 189.478 534.751 286.202 C 583.113 334.564 607.294 397.758 607.294 460.954 C 601.324 461.080 594.767 461.087 588.118 461.094 C 588.261 402.956 566.012 344.428 521.309 299.644 C 432.107 210.279 287.974 210.360 198.691 299.644 C 154.049 344.286 131.876 403.922 131.759 460.922 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#0000ff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 112.706 460.952 C 112.706 397.758 136.887 334.564 185.249 286.202 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#0000ff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 185.249 286.202 C 281.973 189.478 438.027 189.478 534.751 286.202 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#0000ff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 534.751 286.202 C 583.113 334.564 607.294 397.758 607.294 460.954 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#0000ff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 607.294 460.954 C 613.452 460.954 619.518 460.954 626.317 460.954 C 626.317 392.897 600.275 324.842 548.193 272.760 C 444.030 168.596 275.971 168.596 171.807 272.760 C 119.725 324.842 93.684 392.897 93.683 460.952 C 99.129 460.952 104.647 460.952 112.706 460.952 C 112.706 397.758 136.887 334.564 185.249 286.202 C 281.973 189.478 438.027 189.478 534.751 286.202 C 583.113 334.564 607.294 397.758 607.294 460.954 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#00ffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 93.683 460.952 C 93.684 392.897 119.725 324.842 171.807 272.760 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#00ffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 171.807 272.760 C 275.971 168.596 444.030 168.596 548.193 272.760 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#00ffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 548.193 272.760 C 600.275 324.842 626.317 392.897 626.317 460.954 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#00ffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 626.317 460.954 C 633.071 460.954 639.701 460.954 645.339 460.954 C 645.339 388.036 617.438 315.119 561.636 259.317 C 450.032 147.713 269.969 147.714 158.364 259.317 C 102.562 315.119 74.661 388.036 74.661 460.952 C 80.116 460.952 85.649 460.952 93.683 460.952 C 93.684 392.897 119.725 324.842 171.807 272.760 C 275.971 168.596 444.030 168.596 548.193 272.760 C 600.275 324.842 626.317 392.897 626.317 460.954 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#00ff00\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 74.661 460.952 C 74.661 388.036 102.562 315.119 158.364 259.317 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#00ff00\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 158.364 259.317 C 269.969 147.714 450.032 147.713 561.636 259.317 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#00ff00\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 561.636 259.317 C 617.438 315.119 645.339 388.036 645.339 460.954 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#00ff00\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 664.362 460.954 C 664.362 383.175 634.600 305.397 575.078 245.875 C 456.034 126.830 263.966 126.831 144.922 245.875 C 85.400 305.397 55.639 383.175 55.638 460.952 C 61.086 460.952 66.621 460.951 74.661 460.952 C 74.661 388.036 102.562 315.119 158.364 259.317 C 269.969 147.714 450.032 147.713 561.636 259.317 C 617.438 315.119 645.339 388.036 645.339 460.954 C 651.497 460.954 657.534 460.954 664.362 460.954 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffff00\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 55.638 460.952 C 55.639 383.175 85.400 305.397 144.922 245.875 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffff00\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 144.922 245.875 C 263.966 126.831 456.034 126.830 575.078 245.875 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffff00\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 575.078 245.875 C 634.600 305.397 664.362 383.175 664.362 460.954 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffff00\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 683.384 460.954 C 683.384 378.314 651.763 295.675 588.521 232.432 C 462.036 105.947 257.964 105.948 131.479 232.432 C 68.237 295.675 36.616 378.314 36.616 460.952 C 42.041 460.952 47.561 460.952 55.638 460.952 C 55.639 383.175 85.400 305.397 144.922 245.875 C 263.966 126.831 456.034 126.830 575.078 245.875 C 634.600 305.397 664.362 383.175 664.362 460.954 C 670.777 460.954 677.041 460.954 683.384 460.954 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ff0000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 36.616 460.952 C 36.616 378.314 68.237 295.675 131.479 232.432 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ff0000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 131.479 232.432 C 257.964 105.948 462.036 105.947 588.521 232.432 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ff0000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 588.521 232.432 C 651.763 295.675 683.384 378.314 683.384 460.954 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ff0000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 683.384 460.954 C 689.852 460.954 696.141 460.954 702.407 460.954 C 702.407 373.453 668.926 285.952 601.963 218.990 C 468.038 85.064 251.962 85.065 118.037 218.990 C 51.074 285.952 19.675 373.510 17.593 460.952 C 20.312 460.952 28.469 460.952 36.616 460.952 C 36.616 378.314 68.237 295.675 131.479 232.432 C 257.964 105.948 462.036 105.947 588.521 232.432 C 651.763 295.675 683.384 378.314 683.384 460.954 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":246.172,\\\"max\\\":473.828},\\\"y\\\":{\\\"min\\\":236.259,\\\"max\\\":463.915}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":458.476,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":109.629,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":647.341,\\\"y\\\":461.801,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.008212659897430715,\\\"y\\\":0.9999662755400349}},{\\\"point\\\":{\\\"x\\\":72.688,\\\"y\\\":461.982,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.01180902004706364,\\\"y\\\":0.9999302710917037}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":623.443,\\\"y\\\":227.629,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7090347829861843,\\\"y\\\":-0.7051735080926783}},{\\\"point\\\":{\\\"x\\\":97.396,\\\"y\\\":227.682,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7544223380099029,\\\"y\\\":-0.6563893173351252}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"arm\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"ring\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":37.125,\\\"max\\\":682.875},\\\"y\\\":{\\\"min\\\":30.195,\\\"max\\\":675.945}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"ring\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"ring\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 81.548 353.070 C 81.548 198.949 205.879 74.618 360.000 74.618 C 514.121 74.618 638.452 198.949 638.452 353.070 C 638.452 507.191 514.121 631.522 360.000 631.522 C 205.879 631.522 81.548 507.191 81.548 353.070 M 39.125 353.070 C 39.125 175.468 182.398 32.195 360.000 32.195 C 537.602 32.195 680.875 175.468 680.875 353.070 C 680.875 530.672 537.602 673.945 360.000 673.945 C 182.398 673.945 39.125 530.672 39.125 353.070 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":141.733,\\\"max\\\":578.908},\\\"y\\\":{\\\"min\\\":132.862,\\\"max\\\":570.036}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.321,\\\"y\\\":700.241,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.321,\\\"y\\\":29.363,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":39.36,\\\"y\\\":352.366,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871769431458,\\\"y\\\":0.0050641829822523085}},{\\\"point\\\":{\\\"x\\\":682.307,\\\"y\\\":352.366,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871750044815,\\\"y\\\":0.005064565781639421}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":588.942,\\\"y\\\":580.52,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129027528249815,\\\"y\\\":0.7012629071999769}},{\\\"point\\\":{\\\"x\\\":132.81,\\\"y\\\":580.567,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987053394445427,\\\"y\\\":0.7154095670535071}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":588.453,\\\"y\\\":124.317,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314373808424275,\\\"y\\\":-0.7754268721645227}},{\\\"point\\\":{\\\"x\\\":132.963,\\\"y\\\":124.394,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817228407133816,\\\"y\\\":-0.7316105305759871}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360.833,\\\"y\\\":674.044,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"saturn\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":11.880679482103867,\\\"max\\\":708.1265968457276},\\\"y\\\":{\\\"min\\\":180.346,\\\"max\\\":539.654}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"saturn\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"saturn\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#5BCCA136-E53D-4579-98B5-1F63F19C24AE_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 182.346 C 447.809 182.346 520.461 245.603 535.041 329.638 C 535.972 335.005 536.666 340.454 537.112 345.976 C 537.456 350.214 537.654 355.083 537.654 360.000 C 537.654 364.917 537.456 369.786 537.090 374.311 C 536.645 379.816 535.952 385.248 535.160 389.794 C 520.460 474.397 447.809 537.654 360.000 537.654 C 261.670 537.654 182.346 458.330 182.346 360.000 C 182.346 261.670 261.670 182.346 360.000 182.346 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 535.160 389.794 C 535.952 385.248 537.090 374.311 537.090 374.311 C 550.830 371.958 592.145 366.721 592.052 360.000 C 591.939 351.788 571.369 351.362 537.112 345.976 C 529.803 344.939 522.360 343.942 514.725 343.114 C 468.357 338.086 407.510 334.530 360.000 334.530 C 312.490 334.530 251.643 338.086 205.274 343.114 C 160.362 347.983 127.878 351.497 127.948 360.000 C 128.017 368.524 168.751 374.596 182.699 376.886 C 182.699 376.886 184.053 387.181 184.971 392.072 C 94.367 384.702 14.539 372.935 13.885 360.000 C 13.154 345.548 105.291 335.207 208.006 327.896 C 258.828 324.278 313.666 322.010 360.000 322.010 C 406.334 322.010 461.171 324.278 512.452 327.928 C 519.610 328.438 526.715 328.973 535.041 329.638 C 627.058 336.958 704.679 345.215 706.115 360.000 C 707.434 373.574 595.918 383.297 535.160 389.794 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":260.795,\\\"max\\\":459.205},\\\"y\\\":{\\\"min\\\":345.026,\\\"max\\\":504.125}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360.308,\\\"y\\\":559.631,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.308,\\\"y\\\":182.815,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":19.442,\\\"y\\\":360.938,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872082557207,\\\"y\\\":0.005057996137791732}},{\\\"point\\\":{\\\"x\\\":701.604,\\\"y\\\":360.938,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872082557207,\\\"y\\\":0.005057996137791761}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":485.3,\\\"y\\\":484.146,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129580169531665,\\\"y\\\":0.7012067213469992}},{\\\"point\\\":{\\\"x\\\":235.923,\\\"y\\\":484.171,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698693453301482,\\\"y\\\":0.7154211754719382}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":485.033,\\\"y\\\":234.729,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631399028242315,\\\"y\\\":-0.7754581014694865}},{\\\"point\\\":{\\\"x\\\":236.006,\\\"y\\\":234.771,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817121448435952,\\\"y\\\":-0.7316204969605109}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":537.587,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"5BCCA136-E53D-4579-98B5-1F63F19C24AE_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"72.87%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"49.41%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"scales\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":18.94,\\\"max\\\":700.871},\\\"y\\\":{\\\"min\\\":107.727,\\\"max\\\":630.213}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"scales\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"scales\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.988 113.933 C 359.990 113.979 384.851 570.253 384.853 570.298 C 384.848 570.298 335.127 570.298 335.122 570.298 C 335.124 570.253 359.985 113.979 359.988 113.933 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 269.135 412.926 C 202.317 412.927 88.483 412.927 20.940 412.926 C 54.519 440.815 97.780 457.598 145.062 457.598 C 192.344 457.598 241.645 435.835 269.135 412.926 M 450.676 412.926 C 517.493 412.927 631.328 412.927 698.871 412.926 C 665.291 440.815 622.031 457.598 574.749 457.598 C 527.467 457.598 478.166 435.835 450.676 412.926 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 156.814 151.363 C 153.811 148.360 149.659 146.506 145.062 146.506 C 140.466 146.506 136.314 148.360 133.311 151.363 C 130.308 154.366 128.453 158.518 128.453 163.115 C 128.453 167.711 133.310 174.865 133.310 174.866 C 133.312 174.867 140.466 179.723 145.062 179.723 C 149.659 179.723 156.813 174.867 156.814 174.866 C 156.815 174.865 161.671 167.711 161.671 163.115 C 161.671 158.519 159.817 154.366 156.814 151.363 M 562.997 151.363 C 566.000 148.360 570.152 146.506 574.749 146.506 C 579.345 146.506 583.497 148.360 586.500 151.363 C 589.503 154.366 591.357 158.518 591.357 163.115 C 591.358 167.711 586.501 174.865 586.500 174.866 C 586.499 174.867 579.345 179.723 574.749 179.723 C 570.152 179.723 562.998 174.867 562.997 174.866 C 562.996 174.865 558.140 167.711 558.140 163.115 C 558.140 158.518 559.994 154.366 562.997 151.363 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.988 137.342 C 360.009 137.343 577.612 142.469 577.612 142.468 C 577.590 142.465 360.010 109.728 359.988 109.727 C 359.800 109.728 142.220 142.465 142.199 142.468 C 142.199 142.469 360.047 137.343 359.988 137.342 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 562.997 174.866 C 525.557 254.220 488.116 333.573 450.676 412.926 C 517.493 412.927 631.328 412.927 698.871 412.926 C 661.414 333.573 623.957 254.220 586.500 174.866 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 156.814 174.866 C 194.254 254.220 231.694 333.573 269.135 412.926 C 202.317 412.927 88.483 412.927 20.940 412.926 C 58.397 333.573 95.854 254.220 133.310 174.866 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 224.170 560.161 C 224.197 560.161 495.778 560.161 495.805 560.161 C 495.805 560.163 495.805 584.212 495.805 584.214 C 495.778 584.214 224.197 584.214 224.170 584.214 C 224.170 584.212 224.170 560.163 224.170 560.161 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 196.411 581.924 C 196.444 581.924 523.532 581.924 523.565 581.924 C 523.565 581.926 523.565 605.975 523.565 605.977 C 523.532 605.977 196.444 605.977 196.411 605.977 C 196.411 605.975 196.411 581.926 196.411 581.924 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 172.662 604.159 C 172.699 604.159 547.276 604.159 547.314 604.159 C 547.314 604.161 547.314 628.210 547.314 628.213 C 547.276 628.213 172.699 628.213 172.662 628.213 C 172.662 628.210 172.662 604.161 172.662 604.159 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":61.374,\\\"max\\\":223.521},\\\"y\\\":{\\\"min\\\":248.18,\\\"max\\\":410.327}},{\\\"x\\\":{\\\"min\\\":496.479,\\\"max\\\":658.626},\\\"y\\\":{\\\"min\\\":248.18,\\\"max\\\":410.327}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.073,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":108.38,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":133.736,\\\"y\\\":144.161,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872628727384,\\\"y\\\":0.0050471865716297075}},{\\\"point\\\":{\\\"x\\\":586.264,\\\"y\\\":144.161,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872628727384,\\\"y\\\":0.005047186571629692}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":628.711,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"scroll_double\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":40.27804735135408,\\\"max\\\":679.7489696955089},\\\"y\\\":{\\\"min\\\":3.9320000000000004,\\\"max\\\":633.86725}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"scroll_double\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"double_scroll\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#03BCD2A7-5DF6-44C3-B668-EEF60DF2B849_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 120.883 117.896 C 120.931 117.896 599.069 117.896 599.117 117.896 C 599.117 117.935 599.117 498.086 599.117 498.124 C 599.069 498.124 120.931 498.124 120.883 498.124 C 120.883 498.086 120.883 117.935 120.883 117.896 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 104.466 629.825 C 107.992 632.548 129.238 632.548 132.764 629.825 C 148.915 617.347 130.462 553.201 132.764 500.180 C 132.768 500.076 122.116 497.097 118.615 497.097 C 115.114 497.097 104.464 500.145 104.466 500.180 C 108.000 553.537 88.315 617.347 104.466 629.825 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#03BCD2A7-5DF6-44C3-B668-EEF60DF2B849_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 42.286 499.633 C 42.286 378.780 42.286 137.108 42.286 137.072 C 41.772 145.778 66.163 156.155 118.615 156.155 C 171.067 156.155 194.055 144.522 194.944 137.072 C 194.944 257.926 194.944 378.780 194.944 499.633 C 194.944 507.331 171.067 518.716 118.615 518.716 C 66.163 518.716 42.286 508.708 42.286 499.633 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 194.944 137.072 C 194.055 144.522 171.067 156.155 118.615 156.155 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 118.615 156.155 C 66.163 156.155 41.772 145.778 42.286 137.072 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 118.615 117.990 C 171.067 117.990 196.047 127.828 194.944 137.072 C 194.055 144.522 171.067 156.155 118.615 156.155 C 66.163 156.155 41.772 145.778 42.286 137.072 C 42.848 127.568 66.163 117.990 118.615 117.990 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 104.466 7.975 C 107.991 5.251 129.238 5.251 132.764 7.975 C 148.915 20.452 130.462 84.598 132.764 137.619 C 132.768 137.724 122.116 140.702 118.615 140.702 C 115.114 140.702 104.464 137.654 104.466 137.619 C 108.000 84.263 88.314 20.452 104.466 7.975 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 587.236 629.825 C 590.762 632.548 612.008 632.548 615.534 629.825 C 631.685 617.347 613.232 553.201 615.534 500.180 C 615.538 500.076 604.886 497.097 601.385 497.097 C 597.884 497.097 587.234 500.145 587.236 500.180 C 590.770 553.537 571.085 617.347 587.236 629.825 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#03BCD2A7-5DF6-44C3-B668-EEF60DF2B849_6)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 525.056 499.633 C 525.056 378.780 525.056 137.108 525.056 137.072 C 524.542 145.778 548.933 156.155 601.385 156.155 C 653.837 156.155 676.825 144.522 677.714 137.072 C 677.714 257.926 677.714 378.780 677.714 499.633 C 677.714 507.331 653.837 518.716 601.385 518.716 C 548.933 518.716 525.056 508.708 525.056 499.633 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 677.714 137.072 C 676.825 144.522 653.837 156.155 601.385 156.155 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 601.385 156.155 C 548.933 156.155 524.542 145.778 525.056 137.072 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 601.385 117.990 C 653.837 117.990 678.817 127.828 677.714 137.072 C 676.825 144.522 653.837 156.155 601.385 156.155 C 548.933 156.155 524.542 145.778 525.056 137.072 C 525.618 127.568 548.933 117.990 601.385 117.990 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 587.236 7.975 C 590.762 5.251 612.008 5.251 615.534 7.975 C 631.685 20.452 613.232 84.598 615.534 137.619 C 615.538 137.724 604.886 140.702 601.385 140.702 C 597.884 140.702 587.234 137.654 587.236 137.619 C 590.770 84.263 571.085 20.452 587.236 7.975 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":206.203,\\\"max\\\":513.797},\\\"y\\\":{\\\"min\\\":151.491,\\\"max\\\":459.085}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.452,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":83.692,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":42.745,\\\"y\\\":319.792,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999876072307998,\\\"y\\\":0.004978492223503108}},{\\\"point\\\":{\\\"x\\\":677.255,\\\"y\\\":319.792,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999876072307998,\\\"y\\\":0.004978492223503091}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":543.373,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"03BCD2A7-5DF6-44C3-B668-EEF60DF2B849_0\\\",\\\"x1\\\":\\\"-50.17%\\\",\\\"y1\\\":\\\"46.46%\\\",\\\"x2\\\":\\\"148.47%\\\",\\\"y2\\\":\\\"46.46%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"03BCD2A7-5DF6-44C3-B668-EEF60DF2B849_2\\\",\\\"x1\\\":\\\"-33.53%\\\",\\\"y1\\\":\\\"50.54%\\\",\\\"x2\\\":\\\"131.96%\\\",\\\"y2\\\":\\\"50.54%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"03BCD2A7-5DF6-44C3-B668-EEF60DF2B849_6\\\",\\\"x1\\\":\\\"-34.88%\\\",\\\"y1\\\":\\\"50.81%\\\",\\\"x2\\\":\\\"135.29%\\\",\\\"y2\\\":\\\"50.81%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"skeleton\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":172.918,\\\"max\\\":547.082},\\\"y\\\":{\\\"min\\\":40.522,\\\"max\\\":639.389}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"skeleton\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"skeleton\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 279.527 192.765 C 280.711 194.112 281.291 195.778 281.291 197.474 C 282.968 197.684 284.547 198.471 285.731 199.817 C 288.306 202.744 288.022 207.182 285.095 209.757 C 282.782 211.791 279.527 212.041 277.011 210.624 C 259.567 225.954 235.898 246.772 221.762 259.210 C 222.851 261.896 222.188 265.092 219.876 267.126 C 216.949 269.701 212.511 269.417 209.936 266.490 C 208.752 265.144 208.321 262.626 208.177 261.787 C 208.177 261.787 204.917 260.783 203.733 259.437 C 201.158 256.510 201.442 252.072 204.369 249.498 C 206.681 247.464 210.586 247.681 212.452 248.631 C 212.422 248.646 256.018 210.314 267.702 200.045 C 266.613 197.359 267.275 194.162 269.587 192.128 C 272.514 189.554 276.953 189.838 279.527 192.765 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 212.452 248.631 C 212.927 248.889 213.554 249.254 214.065 249.768 M 277.011 210.624 C 276.318 210.234 275.696 209.735 275.155 209.121 M 279.527 192.765 C 280.711 194.112 281.291 195.778 281.291 197.474 C 282.968 197.684 284.547 198.471 285.731 199.817 C 288.306 202.744 288.022 207.182 285.095 209.757 C 282.782 211.791 279.527 212.041 277.011 210.624 C 259.567 225.954 235.898 246.772 221.762 259.210 C 221.468 258.483 221.053 257.802 220.512 257.187 M 269.587 192.128 C 272.514 189.554 276.953 189.838 279.527 192.765 M 267.702 200.045 C 266.613 197.359 267.275 194.162 269.587 192.128 M 268.951 202.068 C 268.411 201.453 267.996 200.772 267.702 200.045 C 256.018 210.314 212.422 248.646 212.452 248.631 C 210.586 247.681 206.681 247.464 204.369 249.498 C 201.442 252.072 201.158 256.510 203.733 259.437 C 204.917 260.783 208.177 261.787 208.177 261.787 C 208.321 262.626 208.752 265.144 209.936 266.490 C 212.511 269.417 216.949 269.701 219.876 267.126 C 222.188 265.092 222.851 261.896 221.762 259.210 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 317.927 89.711 C 317.927 79.372 326.268 71.031 336.608 71.031 C 346.948 71.031 355.289 79.372 355.289 89.711 C 355.289 100.051 346.948 108.393 336.608 108.393 C 326.268 108.393 317.927 100.051 317.927 89.711 M 350.081 118.580 C 350.082 118.578 359.951 100.682 359.952 100.680 C 359.953 100.682 369.823 118.578 369.824 118.580 C 369.822 118.580 350.083 118.580 350.081 118.580 M 364.319 89.382 C 364.319 79.119 372.598 70.841 382.861 70.840 C 393.124 70.840 401.403 79.119 401.403 89.382 C 401.403 99.645 393.124 107.924 382.861 107.924 C 372.598 107.924 364.319 99.645 364.319 89.382 M 333.103 154.377 C 333.104 154.374 333.366 135.451 333.434 130.512 C 320.281 121.802 309.659 107.128 309.253 89.663 C 308.624 62.575 332.857 42.522 359.952 42.522 C 387.047 42.522 411.280 62.576 410.651 89.663 C 410.245 107.128 399.623 121.802 386.470 130.512 C 386.539 135.451 386.801 154.374 386.801 154.377 C 386.800 154.377 378.264 154.377 378.264 154.377 C 378.264 154.375 378.264 142.153 378.264 142.152 C 378.263 142.152 375.447 142.152 375.447 142.152 C 375.447 142.153 375.447 154.375 375.447 154.377 C 375.446 154.377 366.996 154.377 366.995 154.377 C 366.995 154.375 366.995 142.153 366.995 142.152 C 366.995 142.152 364.178 142.152 364.178 142.152 C 364.178 142.153 364.178 154.375 364.178 154.377 C 364.177 154.377 355.727 154.377 355.726 154.377 C 355.726 154.375 355.726 142.153 355.726 142.152 C 355.726 142.152 352.910 142.152 352.909 142.152 C 352.909 142.153 352.909 154.375 352.909 154.377 C 352.908 154.377 344.458 154.377 344.457 154.377 C 344.457 154.375 344.458 142.153 344.458 142.152 C 344.458 142.152 341.641 142.152 341.641 142.152 C 341.641 142.153 341.641 154.375 341.641 154.377 C 341.640 154.377 333.104 154.377 333.103 154.377 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 198.067 274.357 C 199.859 274.399 201.477 275.102 202.724 276.251 C 204.016 275.161 205.664 274.534 207.457 274.576 C 211.354 274.666 214.424 277.884 214.334 281.781 C 214.262 284.859 212.239 287.422 209.493 288.311 C 208.940 311.529 208.204 343.041 207.768 361.865 C 210.481 362.885 212.382 365.539 212.310 368.617 C 212.219 372.514 209.002 375.585 205.105 375.494 C 203.312 375.452 201.169 374.063 200.455 373.600 C 200.455 373.600 197.507 375.317 195.715 375.275 C 191.818 375.185 188.747 371.967 188.838 368.070 C 188.910 364.992 191.716 362.268 193.679 361.540 C 193.669 361.572 195.036 303.537 195.404 287.987 C 192.691 286.967 190.790 284.313 190.862 281.234 C 190.952 277.337 194.170 274.267 198.067 274.357 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 193.679 361.540 C 194.191 361.366 194.884 361.152 195.609 361.124 M 209.493 288.311 C 208.736 288.557 207.947 288.677 207.129 288.658 M 198.067 274.357 C 199.859 274.399 201.477 275.102 202.724 276.251 C 204.016 275.161 205.664 274.534 207.457 274.576 C 211.354 274.666 214.424 277.884 214.334 281.781 C 214.262 284.859 212.239 287.422 209.493 288.311 C 208.940 311.529 208.204 343.041 207.768 361.865 C 207.034 361.589 206.252 361.432 205.433 361.413 M 190.862 281.234 C 190.952 277.337 194.170 274.267 198.067 274.357 M 195.404 287.987 C 192.691 286.967 190.790 284.313 190.862 281.234 M 197.738 288.439 C 196.920 288.420 196.138 288.263 195.404 287.987 C 195.036 303.537 193.669 361.572 193.679 361.540 C 191.716 362.268 188.910 364.992 188.838 368.070 C 188.747 371.967 191.818 375.185 195.715 375.275 C 197.507 375.317 200.455 373.600 200.455 373.600 C 201.169 374.063 203.312 375.452 205.105 375.494 C 209.002 375.585 212.219 372.514 212.310 368.617 C 212.382 365.539 210.481 362.885 207.768 361.865 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 290.317 614.079 C 296.630 614.079 301.722 619.171 301.722 625.484 C 301.722 631.796 296.630 636.888 290.317 636.888 C 284.005 636.888 278.914 631.796 278.914 625.484 C 278.914 619.172 284.005 614.080 290.317 614.079 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 350.681 161.834 C 350.683 161.834 369.222 161.834 369.224 161.834 C 369.224 161.836 369.224 180.375 369.224 180.376 C 369.222 180.376 350.683 180.376 350.681 180.376 C 350.681 180.375 350.681 161.836 350.681 161.834 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 350.681 190.331 C 350.683 190.331 369.222 190.331 369.224 190.331 C 369.224 190.333 369.224 208.872 369.224 208.874 C 369.222 208.874 350.683 208.874 350.681 208.874 C 350.681 208.872 350.681 190.333 350.681 190.331 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 350.681 218.828 C 350.683 218.828 369.222 218.828 369.224 218.828 C 369.224 218.830 369.224 237.369 369.224 237.371 C 369.222 237.371 350.683 237.371 350.681 237.371 C 350.681 237.369 350.681 218.830 350.681 218.828 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 350.681 248.362 C 350.683 248.362 369.222 248.362 369.224 248.362 C 369.224 248.364 369.224 266.903 369.224 266.905 C 369.222 266.905 350.683 266.905 350.681 266.905 C 350.681 266.903 350.681 248.364 350.681 248.362 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 350.681 277.896 C 350.683 277.896 369.222 277.896 369.224 277.896 C 369.224 277.898 369.224 296.437 369.224 296.439 C 369.222 296.439 350.683 296.439 350.681 296.439 C 350.681 296.437 350.681 277.898 350.681 277.896 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 350.681 306.911 C 350.683 306.911 369.222 306.911 369.224 306.911 C 369.224 306.913 369.224 325.452 369.224 325.454 C 369.222 325.454 350.683 325.454 350.681 325.454 C 350.681 325.452 350.681 306.913 350.681 306.911 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 333.837 330.683 C 345.001 330.701 354.741 336.628 359.954 345.331 C 365.460 337.005 375.073 330.684 386.068 330.684 C 402.983 330.684 416.628 344.329 416.628 361.244 C 416.628 378.159 402.983 391.805 386.068 391.805 C 372.850 391.805 359.954 377.158 359.954 377.158 C 356.215 380.820 345.001 391.805 333.837 391.805 C 316.922 391.805 303.276 378.159 303.276 361.244 C 303.276 344.329 319.528 330.661 333.837 330.683 M 374.143 361.244 C 374.143 354.644 379.467 349.320 386.068 349.320 C 392.668 349.320 397.992 354.644 397.992 361.244 C 397.992 367.845 392.668 373.169 386.068 373.169 C 379.467 373.169 374.143 367.844 374.143 361.244 M 321.912 361.244 C 321.912 354.644 327.237 349.320 333.837 349.320 C 340.437 349.320 345.761 354.644 345.761 361.244 C 345.761 367.844 340.437 373.169 333.837 373.169 C 327.237 373.169 321.912 367.844 321.912 361.244 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 380.336 188.928 C 388.433 192.213 415.815 191.859 423.920 188.928 C 425.435 188.380 429.184 194.498 423.920 200.846 C 420.159 205.382 385.413 205.510 380.336 200.846 C 375.651 196.542 378.843 188.323 380.336 188.928 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 380.336 215.872 C 388.433 219.157 415.815 218.802 423.920 215.872 C 425.435 215.324 429.184 221.441 423.920 227.788 C 420.159 232.325 385.413 232.453 380.336 227.788 C 375.652 223.485 378.843 215.266 380.336 215.872 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 380.336 243.333 C 388.433 246.618 415.815 246.263 423.920 243.333 C 425.435 242.785 429.184 248.902 423.920 255.250 C 420.159 259.786 385.413 259.914 380.336 255.250 C 375.651 250.946 378.843 242.727 380.336 243.333 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 339.691 188.928 C 331.594 192.213 304.212 191.859 296.107 188.928 C 294.591 188.380 290.843 194.498 296.107 200.846 C 299.868 205.382 334.614 205.510 339.691 200.846 C 344.375 196.542 341.184 188.323 339.691 188.928 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 339.691 215.872 C 331.594 219.157 304.212 218.802 296.107 215.872 C 294.592 215.324 290.843 221.441 296.107 227.788 C 299.868 232.325 334.614 232.453 339.691 227.788 C 344.375 223.485 341.184 215.266 339.691 215.872 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 339.691 243.333 C 331.594 246.618 304.212 246.263 296.107 243.333 C 294.591 242.785 290.843 248.902 296.107 255.250 C 299.868 259.786 334.614 259.914 339.691 255.250 C 344.375 250.946 341.184 242.727 339.691 243.333 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 310.611 391.340 C 312.270 392.364 313.402 393.913 313.941 395.676 C 315.751 395.363 317.642 395.681 319.301 396.705 C 322.908 398.932 324.021 403.638 321.794 407.245 C 320.035 410.094 316.729 411.387 313.663 410.711 C 300.386 432.191 282.378 461.354 271.624 478.776 C 273.608 481.224 273.934 484.758 272.175 487.608 C 269.948 491.214 265.242 492.327 261.635 490.100 C 259.976 489.076 258.729 486.595 258.314 485.768 C 258.314 485.768 254.604 485.759 252.945 484.735 C 249.338 482.508 248.225 477.802 250.452 474.196 C 252.211 471.346 256.341 470.333 258.584 470.729 C 258.557 470.753 291.732 417.052 300.623 402.664 C 298.638 400.217 298.312 396.681 300.072 393.832 C 302.299 390.225 307.004 389.113 310.611 391.340 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 258.584 470.729 C 259.159 470.846 259.927 471.027 260.622 471.399 M 313.663 410.711 C 312.818 410.525 312.013 410.205 311.255 409.737 M 310.611 391.340 C 312.270 392.364 313.402 393.913 313.941 395.676 C 315.751 395.363 317.642 395.681 319.301 396.705 C 322.908 398.932 324.021 403.638 321.794 407.245 C 320.035 410.094 316.729 411.387 313.663 410.711 C 300.386 432.191 282.378 461.354 271.624 478.776 C 271.087 478.113 270.439 477.536 269.682 477.069 M 300.072 393.832 C 302.299 390.225 307.004 389.113 310.611 391.340 M 300.623 402.664 C 298.638 400.217 298.312 396.681 300.072 393.832 M 302.565 404.371 C 301.808 403.904 301.160 403.327 300.623 402.664 C 291.732 417.052 258.557 470.753 258.584 470.729 C 256.341 470.333 252.211 471.346 250.452 474.196 C 248.225 477.802 249.338 482.508 252.945 484.735 C 254.604 485.759 258.314 485.768 258.314 485.768 C 258.729 486.595 259.976 489.076 261.635 490.100 C 265.242 492.327 269.948 491.214 272.175 487.608 C 273.934 484.758 273.608 481.224 271.624 478.776 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 264.625 497.293 C 262.692 497.553 261.028 498.507 259.818 499.898 C 258.292 498.875 256.435 498.395 254.503 498.655 C 250.302 499.220 247.369 503.064 247.934 507.265 C 248.380 510.584 250.873 513.111 253.949 513.743 C 257.327 538.768 261.898 572.736 264.625 593.028 C 261.816 594.455 260.080 597.551 260.526 600.869 C 261.091 605.070 264.935 608.003 269.136 607.438 C 271.069 607.178 273.218 605.420 273.934 604.834 C 273.934 604.834 277.326 606.336 279.258 606.076 C 283.459 605.511 286.392 601.667 285.827 597.466 C 285.381 594.147 282.021 591.540 279.812 590.988 C 279.827 591.022 271.397 528.465 269.136 511.704 C 271.945 510.277 273.682 507.180 273.235 503.861 C 272.670 499.661 268.825 496.728 264.625 497.293 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 279.812 590.988 C 279.239 590.861 278.464 590.714 277.677 590.771 M 253.949 513.743 C 254.796 513.917 255.662 513.952 256.544 513.834 M 264.625 497.293 C 262.692 497.553 261.028 498.507 259.818 499.898 C 258.292 498.875 256.435 498.395 254.503 498.655 C 250.302 499.220 247.369 503.064 247.934 507.265 C 248.380 510.584 250.873 513.111 253.949 513.743 C 257.327 538.768 261.898 572.736 264.625 593.028 C 265.386 592.641 266.212 592.378 267.094 592.259 M 273.235 503.861 C 272.670 499.661 268.825 496.728 264.625 497.293 M 269.136 511.704 C 271.945 510.277 273.682 507.180 273.235 503.861 M 266.667 512.472 C 267.549 512.353 268.375 512.090 269.136 511.704 C 271.397 528.465 279.827 591.022 279.812 590.988 C 282.021 591.540 285.381 594.147 285.827 597.466 C 286.392 601.667 283.459 605.511 279.258 606.076 C 277.326 606.336 273.934 604.834 273.934 604.834 C 273.218 605.420 271.069 607.178 269.136 607.438 C 264.935 608.003 261.091 605.070 260.526 600.869 C 260.080 597.551 261.816 594.455 264.625 593.028 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 199.498 382.164 C 205.810 382.164 210.902 387.256 210.902 393.568 C 210.902 399.880 205.810 404.972 199.498 404.972 C 193.186 404.972 188.094 399.880 188.094 393.568 C 188.094 387.256 193.186 382.164 199.498 382.164 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 196.977 412.807 C 196.977 412.807 203.581 412.807 203.582 412.807 C 203.582 412.810 203.582 443.077 203.582 443.080 C 203.581 443.080 196.977 443.080 196.977 443.080 C 196.977 443.077 196.977 412.810 196.977 412.807 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 184.122 407.565 C 184.123 407.566 190.414 409.574 190.414 409.574 C 190.413 409.577 181.211 438.411 181.210 438.414 C 181.209 438.414 174.918 436.406 174.918 436.406 C 174.919 436.403 184.121 407.568 184.122 407.565 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 209.460 409.652 C 209.461 409.652 215.732 407.581 215.732 407.581 C 215.733 407.584 225.224 436.324 225.225 436.327 C 225.224 436.328 218.953 438.398 218.952 438.398 C 218.952 438.396 209.461 409.655 209.460 409.652 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 440.473 192.765 C 439.289 194.112 438.709 195.778 438.709 197.474 C 437.032 197.684 435.453 198.471 434.269 199.818 C 431.694 202.745 431.979 207.183 434.905 209.757 C 437.218 211.791 440.473 212.041 442.989 210.624 C 460.433 225.954 484.102 246.772 498.238 259.210 C 497.149 261.896 497.812 265.092 500.124 267.126 C 503.051 269.701 507.489 269.417 510.064 266.490 C 511.248 265.144 511.679 262.627 511.823 261.788 C 511.823 261.788 515.083 260.783 516.267 259.437 C 518.842 256.510 518.558 252.072 515.631 249.498 C 513.319 247.464 509.414 247.681 507.548 248.631 C 507.579 248.646 463.982 210.314 452.298 200.045 C 453.387 197.360 452.725 194.162 450.413 192.128 C 447.486 189.554 443.047 189.838 440.473 192.765 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 507.548 248.631 C 507.074 248.889 506.446 249.254 505.935 249.768 M 442.989 210.624 C 443.682 210.234 444.304 209.736 444.845 209.121 M 440.473 192.765 C 439.289 194.112 438.709 195.778 438.709 197.474 C 437.032 197.684 435.453 198.471 434.269 199.818 C 431.694 202.745 431.979 207.183 434.905 209.757 C 437.218 211.791 440.473 212.041 442.989 210.624 C 460.433 225.954 484.102 246.772 498.238 259.210 C 498.532 258.483 498.947 257.802 499.488 257.187 M 450.413 192.128 C 447.486 189.554 443.047 189.838 440.473 192.765 M 452.298 200.045 C 453.387 197.360 452.725 194.162 450.413 192.128 M 451.049 202.068 C 451.589 201.454 452.004 200.772 452.298 200.045 C 463.982 210.314 507.579 248.646 507.548 248.631 C 509.414 247.681 513.319 247.464 515.631 249.498 C 518.558 252.072 518.842 256.510 516.267 259.437 C 515.083 260.783 511.823 261.788 511.823 261.788 C 511.679 262.627 511.248 265.144 510.064 266.490 C 507.489 269.417 503.051 269.701 500.124 267.126 C 497.812 265.092 497.149 261.896 498.238 259.210 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 521.933 274.357 C 520.141 274.399 518.523 275.102 517.276 276.251 C 515.984 275.161 514.336 274.534 512.543 274.576 C 508.646 274.667 505.576 277.884 505.666 281.781 C 505.738 284.859 507.761 287.422 510.507 288.311 C 511.060 311.529 511.796 343.041 512.232 361.865 C 509.519 362.885 507.618 365.539 507.690 368.617 C 507.781 372.514 510.998 375.585 514.895 375.494 C 516.687 375.452 518.830 374.063 519.544 373.600 C 519.544 373.600 522.492 375.317 524.285 375.275 C 528.182 375.185 531.253 371.968 531.162 368.070 C 531.090 364.992 528.284 362.268 526.321 361.540 C 526.331 361.572 524.964 303.537 524.596 287.987 C 527.309 286.967 529.210 284.313 529.138 281.234 C 529.048 277.337 525.830 274.267 521.933 274.357 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 526.321 361.540 C 525.809 361.366 525.116 361.152 524.391 361.124 M 510.507 288.311 C 511.264 288.557 512.053 288.677 512.871 288.658 M 521.933 274.357 C 520.141 274.399 518.523 275.102 517.276 276.251 C 515.984 275.161 514.336 274.534 512.543 274.576 C 508.646 274.667 505.576 277.884 505.666 281.781 C 505.738 284.859 507.761 287.422 510.507 288.311 C 511.060 311.529 511.796 343.041 512.232 361.865 C 512.966 361.589 513.748 361.432 514.567 361.413 M 529.138 281.234 C 529.048 277.337 525.830 274.267 521.933 274.357 M 524.596 287.987 C 527.309 286.967 529.210 284.313 529.138 281.234 M 522.261 288.439 C 523.080 288.420 523.862 288.263 524.596 287.987 C 524.964 303.537 526.331 361.572 526.321 361.540 C 528.284 362.268 531.090 364.992 531.162 368.070 C 531.253 371.968 528.182 375.185 524.285 375.275 C 522.492 375.317 519.544 373.600 519.544 373.600 C 518.830 374.063 516.687 375.452 514.895 375.494 C 510.998 375.585 507.781 372.514 507.690 368.617 C 507.618 365.539 509.519 362.885 512.232 361.865 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 429.683 614.079 C 423.370 614.079 418.278 619.171 418.278 625.484 C 418.278 631.796 423.370 636.888 429.683 636.888 C 435.995 636.888 441.086 631.796 441.086 625.484 C 441.086 619.172 435.995 614.080 429.683 614.079 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 409.389 391.340 C 407.730 392.364 406.598 393.913 406.059 395.676 C 404.249 395.363 402.358 395.681 400.699 396.705 C 397.092 398.932 395.979 403.638 398.206 407.245 C 399.965 410.094 403.271 411.387 406.337 410.711 C 419.614 432.191 437.622 461.354 448.376 478.776 C 446.392 481.224 446.066 484.758 447.825 487.608 C 450.052 491.214 454.758 492.327 458.365 490.100 C 460.024 489.076 461.271 486.595 461.686 485.768 C 461.686 485.768 465.396 485.759 467.055 484.735 C 470.662 482.508 471.775 477.802 469.548 474.196 C 467.789 471.346 463.659 470.333 461.417 470.729 C 461.443 470.753 428.268 417.052 419.377 402.664 C 421.362 400.217 421.688 396.681 419.928 393.832 C 417.701 390.225 412.996 389.113 409.389 391.340 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 461.417 470.729 C 460.841 470.846 460.073 471.027 459.378 471.399 M 406.337 410.711 C 407.182 410.525 407.987 410.205 408.745 409.737 M 409.389 391.340 C 407.730 392.364 406.598 393.913 406.059 395.676 C 404.249 395.363 402.358 395.681 400.699 396.705 C 397.092 398.932 395.979 403.638 398.206 407.245 C 399.965 410.094 403.271 411.387 406.337 410.711 C 419.614 432.191 437.622 461.354 448.376 478.776 C 448.913 478.113 449.561 477.536 450.318 477.069 M 419.928 393.832 C 417.701 390.225 412.996 389.113 409.389 391.340 M 419.377 402.664 C 421.362 400.217 421.688 396.681 419.928 393.832 M 417.435 404.371 C 418.192 403.904 418.840 403.327 419.377 402.664 C 428.268 417.052 461.443 470.753 461.417 470.729 C 463.659 470.333 467.789 471.346 469.548 474.196 C 471.775 477.802 470.662 482.508 467.055 484.735 C 465.396 485.759 461.686 485.768 461.686 485.768 C 461.271 486.595 460.024 489.076 458.365 490.100 C 454.758 492.327 450.052 491.214 447.825 487.608 C 446.066 484.758 446.392 481.224 448.376 478.776 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 455.375 497.293 C 457.308 497.553 458.972 498.507 460.182 499.898 C 461.708 498.875 463.565 498.395 465.497 498.655 C 469.698 499.220 472.631 503.064 472.066 507.265 C 471.620 510.584 469.127 513.111 466.052 513.743 C 462.673 538.768 458.102 572.736 455.375 593.028 C 458.184 594.455 459.920 597.551 459.474 600.869 C 458.909 605.070 455.065 608.003 450.864 607.438 C 448.932 607.178 446.782 605.420 446.066 604.834 C 446.066 604.834 442.674 606.336 440.742 606.076 C 436.541 605.511 433.608 601.667 434.173 597.466 C 434.619 594.147 437.979 591.540 440.188 590.988 C 440.173 591.022 448.603 528.465 450.865 511.704 C 448.055 510.277 446.318 507.180 446.765 503.861 C 447.330 499.661 451.175 496.728 455.375 497.293 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 440.188 590.988 C 440.761 590.861 441.536 590.714 442.323 590.771 M 466.052 513.743 C 465.204 513.917 464.338 513.952 463.456 513.834 M 455.375 497.293 C 457.308 497.553 458.972 498.507 460.182 499.898 C 461.708 498.875 463.565 498.395 465.497 498.655 C 469.698 499.220 472.631 503.064 472.066 507.265 C 471.620 510.584 469.127 513.111 466.052 513.743 C 462.673 538.768 458.102 572.736 455.375 593.028 C 454.614 592.641 453.788 592.378 452.906 592.259 M 446.765 503.861 C 447.330 499.661 451.175 496.728 455.375 497.293 M 450.865 511.704 C 448.055 510.277 446.318 507.180 446.765 503.861 M 453.333 512.472 C 452.451 512.353 451.625 512.090 450.865 511.704 C 448.603 528.465 440.173 591.022 440.188 590.988 C 437.979 591.540 434.619 594.147 434.173 597.466 C 433.608 601.667 436.541 605.511 440.742 606.076 C 442.674 606.336 446.066 604.834 446.066 604.834 C 446.782 605.420 448.932 607.178 450.864 607.438 C 455.065 608.003 458.909 605.070 459.474 600.869 C 459.920 597.551 458.184 594.455 455.375 593.028 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 488.027 625.672 C 488.027 625.673 488.027 637.388 488.027 637.389 C 488.030 637.389 515.350 637.389 515.353 637.389 C 515.350 637.388 488.030 625.672 488.027 625.672 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 520.502 382.164 C 514.190 382.164 509.098 387.256 509.098 393.568 C 509.098 399.880 514.190 404.972 520.502 404.972 C 526.814 404.972 531.906 399.880 531.906 393.568 C 531.906 387.256 526.814 382.164 520.502 382.164 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 523.023 412.807 C 523.023 412.807 516.419 412.807 516.418 412.807 C 516.418 412.810 516.418 443.077 516.418 443.080 C 516.419 443.080 523.023 443.080 523.023 443.080 C 523.023 443.077 523.023 412.810 523.023 412.807 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 535.878 407.566 C 535.878 407.566 529.586 409.574 529.586 409.574 C 529.587 409.577 538.789 438.411 538.790 438.414 C 538.791 438.414 545.082 436.406 545.082 436.406 C 545.081 436.403 535.879 407.569 535.878 407.566 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 510.540 409.652 C 510.539 409.652 504.269 407.581 504.268 407.581 C 504.267 407.584 494.776 436.324 494.776 436.327 C 494.776 436.328 501.047 438.398 501.048 438.398 C 501.048 438.396 510.539 409.655 510.540 409.652 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 448.202 615.263 C 448.205 615.264 479.256 624.360 479.259 624.361 C 479.259 624.362 479.865 637.097 479.865 637.098 C 479.862 637.098 448.206 637.098 448.202 637.098 C 448.202 637.096 448.202 615.266 448.202 615.263 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 231.973 625.672 C 231.973 625.673 231.973 637.388 231.973 637.389 C 231.970 637.389 204.650 637.389 204.647 637.389 C 204.650 637.388 231.970 625.672 231.973 625.672 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 271.798 615.263 C 271.795 615.264 240.744 624.360 240.741 624.361 C 240.741 624.362 240.135 637.097 240.135 637.098 C 240.138 637.098 271.794 637.098 271.798 637.098 C 271.798 637.096 271.798 615.266 271.798 615.263 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":284.077,\\\"max\\\":435.923},\\\"y\\\":{\\\"min\\\":201.182,\\\"max\\\":353.028}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":692.162,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":37.055,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":456.347,\\\"y\\\":179.632,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314617148382543,\\\"y\\\":-0.7754070561282836}},{\\\"point\\\":{\\\"x\\\":264.037,\\\"y\\\":179.665,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6816929332035128,\\\"y\\\":-0.731638397584757}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":17.888,\\\"y\\\":632.071,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}},{\\\"point\\\":{\\\"x\\\":702.112,\\\"y\\\":632.071,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"skull\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":96.73146699484867,\\\"max\\\":621.0865330051513},\\\"y\\\":{\\\"min\\\":64.598,\\\"max\\\":642.476}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"skull\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"skull\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#8859FB87-4A9D-4FE2-8D90-AE05B69E0E32_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 143.297 308.706 C 143.297 255.657 186.092 212.862 239.141 212.862 C 292.191 212.862 334.986 255.657 334.986 308.706 C 334.986 361.756 292.191 404.552 239.141 404.551 C 186.092 404.551 143.297 361.756 143.297 308.706 M 308.262 456.816 C 308.267 456.807 358.904 364.992 358.909 364.983 C 358.914 364.992 409.552 456.807 409.557 456.816 C 409.547 456.816 308.272 456.816 308.262 456.816 M 381.314 307.017 C 381.314 254.363 423.791 211.886 476.445 211.886 C 529.100 211.886 571.577 254.362 571.577 307.017 C 571.577 359.672 529.100 402.148 476.445 402.148 C 423.791 402.148 381.314 359.671 381.314 307.017 M 221.160 640.476 C 221.160 640.464 222.505 543.376 222.856 518.039 C 155.372 473.349 100.875 398.064 98.793 308.457 C 95.564 169.482 219.897 66.598 358.909 66.598 C 497.921 66.598 622.254 169.482 619.025 308.457 C 616.944 398.064 562.447 473.350 494.963 518.039 C 495.314 543.377 496.659 640.464 496.659 640.476 C 496.655 640.476 452.862 640.476 452.858 640.476 C 452.858 640.470 452.858 577.761 452.858 577.755 C 452.857 577.755 438.406 577.755 438.404 577.755 C 438.404 577.761 438.404 640.470 438.404 640.476 C 438.400 640.476 395.048 640.476 395.043 640.476 C 395.043 640.470 395.043 577.761 395.043 577.755 C 395.042 577.755 380.591 577.755 380.590 577.755 C 380.590 577.761 380.590 640.470 380.590 640.476 C 380.586 640.476 337.233 640.476 337.229 640.476 C 337.229 640.470 337.229 577.761 337.229 577.755 C 337.227 577.755 322.777 577.755 322.775 577.755 C 322.775 577.761 322.775 640.470 322.775 640.476 C 322.771 640.476 279.416 640.476 279.412 640.476 C 279.412 640.470 279.415 577.761 279.415 577.755 C 279.413 577.755 264.963 577.755 264.961 577.755 C 264.961 577.761 264.961 640.470 264.961 640.476 C 264.957 640.476 221.164 640.476 221.160 640.476 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 143.297 308.706 C 143.297 255.657 186.092 212.862 239.141 212.862 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 239.141 212.862 C 292.191 212.862 334.986 255.657 334.986 308.706 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 334.986 308.706 C 334.986 361.756 292.191 404.552 239.141 404.551 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 239.141 404.551 C 186.092 404.551 143.297 361.756 143.297 308.706 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 308.262 456.816 C 308.267 456.807 358.904 364.992 358.909 364.983 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 358.909 364.983 C 358.914 364.992 409.552 456.807 409.557 456.816 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 409.557 456.816 C 409.547 456.816 308.272 456.816 308.262 456.816 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 381.314 307.017 C 381.314 254.363 423.791 211.886 476.445 211.886 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 476.445 211.886 C 529.100 211.886 571.577 254.362 571.577 307.017 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 571.577 307.017 C 571.577 359.672 529.100 402.148 476.445 402.148 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 476.445 402.148 C 423.791 402.148 381.314 359.671 381.314 307.017 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 143.297 308.706 C 143.297 255.657 186.092 212.862 239.141 212.862 C 292.191 212.862 334.986 255.657 334.986 308.706 C 334.986 361.756 292.191 404.552 239.141 404.551 C 186.092 404.551 143.297 361.756 143.297 308.706 M 308.262 456.816 C 308.267 456.807 358.904 364.992 358.909 364.983 C 358.914 364.992 409.552 456.807 409.557 456.816 C 409.547 456.816 308.272 456.816 308.262 456.816 M 381.314 307.017 C 381.314 254.363 423.791 211.886 476.445 211.886 C 529.100 211.886 571.577 254.362 571.577 307.017 C 571.577 359.672 529.100 402.148 476.445 402.148 C 423.791 402.148 381.314 359.671 381.314 307.017 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":683.814,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":66.905,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":97.393,\\\"y\\\":299.269,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869423966428,\\\"y\\\":0.0051102872926518435}},{\\\"point\\\":{\\\"x\\\":620.349,\\\"y\\\":299.269,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869423966429,\\\"y\\\":0.005110287292651861}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":540.477,\\\"y\\\":482.573,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064706,\\\"y\\\":0.7012692123096491}},{\\\"point\\\":{\\\"x\\\":178.454,\\\"y\\\":482.621,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987254201015092,\\\"y\\\":0.7153899547127913}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":543.281,\\\"y\\\":134.793,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631445428603134,\\\"y\\\":-0.7754203187279815}},{\\\"point\\\":{\\\"x\\\":175.307,\\\"y\\\":134.872,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817084818456925,\\\"y\\\":-0.7316239100655754}}],\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":170.334,\\\"max\\\":305.879},\\\"y\\\":{\\\"min\\\":240.524,\\\"max\\\":376.069}},{\\\"x\\\":{\\\"min\\\":409.433,\\\"max\\\":544.978},\\\"y\\\":{\\\"min\\\":240.524,\\\"max\\\":376.069}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":636.646,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"8859FB87-4A9D-4FE2-8D90-AE05B69E0E32_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"45.96%\\\",\\\"r\\\":\\\"74.04%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"snake\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":52.350582556162024,\\\"max\\\":691.136},\\\"y\\\":{\\\"min\\\":289.18272752558164,\\\"max\\\":423.86417158979236}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"snake\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"snake_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 644.601 303.981 C 644.601 300.747 647.209 298.138 650.443 298.138 C 653.678 298.138 656.287 300.747 656.287 303.981 C 656.287 307.215 653.677 309.824 650.443 309.824 C 647.210 309.824 644.601 307.215 644.601 303.981 M 139.071 390.929 C 103.145 391.333 57.801 333.828 54.570 336.836 C 50.809 340.336 96.065 415.926 139.071 417.408 C 187.181 419.066 209.438 333.727 236.215 334.019 C 265.568 334.339 286.942 421.862 333.358 421.862 C 379.774 421.862 399.092 334.424 430.501 334.019 C 464.410 333.581 481.022 422.370 527.645 421.862 C 572.943 421.369 583.722 344.800 620.610 334.971 C 628.237 332.939 635.985 336.118 646.762 337.863 C 661.373 340.228 681.721 335.165 681.724 335.164 C 681.721 335.163 652.303 319.115 652.300 319.114 C 652.304 319.113 689.132 313.209 689.136 313.208 C 689.128 313.207 666.664 275.564 615.433 298.703 C 571.235 318.666 557.602 385.507 527.645 386.475 C 496.188 387.493 484.391 299.510 430.501 299.561 C 387.307 299.602 360.309 386.963 333.358 386.475 C 306.983 385.998 284.806 299.058 236.215 299.561 C 186.501 300.076 172.678 390.552 139.071 390.929 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":22.436,\\\"y\\\":360,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":649.426,\\\"y\\\":283.777,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":142.618,\\\"y\\\":422.545,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.008255891465398336,\\\"y\\\":0.9999659195473172}},{\\\"point\\\":{\\\"x\\\":333.658,\\\"y\\\":422.545,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.008178738786805088,\\\"y\\\":0.9999665535565964}},{\\\"point\\\":{\\\"x\\\":528.718,\\\"y\\\":422.545,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.008255891465404912,\\\"y\\\":0.9999659195473171}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":236.645,\\\"y\\\":297.742,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005092526556957669,\\\"y\\\":-0.9999870330025618}},{\\\"point\\\":{\\\"x\\\":432.712,\\\"y\\\":297.742,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005014982070703675,\\\"y\\\":-0.9999874248983487}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":55.682,\\\"y\\\":338.664,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817847308704319,\\\"y\\\":-0.7315528557472337}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":693.224,\\\"y\\\":326.814,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"snake_eye\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":245.261,\\\"max\\\":497.9732722324462},\\\"y\\\":{\\\"min\\\":34.10629838302682,\\\"max\\\":652.849}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"snake_eye\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"snake_eye\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 286.931 97.363 C 286.939 97.359 318.487 63.656 357.620 62.754 C 399.000 61.801 433.795 96.260 433.803 96.264 C 433.795 96.267 399.009 130.221 357.620 129.774 C 318.947 129.356 286.939 97.366 286.931 97.363 M 358.614 36.113 C 470.055 35.118 528.697 145.117 476.976 234.518 C 435.398 306.387 314.833 281.140 320.647 347.910 C 323.768 383.744 435.757 380.678 429.054 457.647 C 425.193 501.987 345.717 496.739 352.639 532.768 C 357.480 557.968 406.837 548.460 400.926 586.902 C 396.775 613.892 360.315 613.280 360.799 631.658 C 361.015 639.855 371.012 650.847 371.013 650.849 C 371.011 650.847 350.798 644.615 348.985 634.406 C 343.777 605.084 377.922 613.394 384.620 584.009 C 390.400 558.653 334.254 573.848 327.631 533.790 C 319.372 483.840 395.826 481.704 397.581 455.613 C 400.973 405.194 285.828 415.010 276.916 354.561 C 262.321 255.560 410.238 255.417 434.238 212.811 C 456.618 173.079 444.732 146.191 436.170 134.195 C 433.312 130.191 406.726 159.213 360.743 158.264 C 288.771 156.780 247.272 97.593 247.261 97.587 C 247.272 97.581 290.356 36.723 358.614 36.113 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.006 72.662 C 373.776 72.662 384.078 82.964 384.078 95.734 C 384.078 108.504 373.776 118.806 361.006 118.806 C 348.235 118.806 337.933 108.505 337.933 95.734 C 337.933 82.964 348.235 72.662 361.006 72.662 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":693.928,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":34.574,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":372.631,\\\"y\\\":504.577,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129437012444086,\\\"y\\\":0.7012212766708689}},{\\\"point\\\":{\\\"x\\\":338.359,\\\"y\\\":504.622,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987179873928581,\\\"y\\\":0.715397214205978}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":448.192,\\\"y\\\":65.346,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314067454578781,\\\"y\\\":-0.7754518178393098}},{\\\"point\\\":{\\\"x\\\":276.216,\\\"y\\\":65.42,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817265563043132,\\\"y\\\":-0.7316070683293472}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":640.899,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":283.447,\\\"y\\\":403.21,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871147345399,\\\"y\\\":0.005076451998209233}},{\\\"point\\\":{\\\"x\\\":436.553,\\\"y\\\":403.21,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871147345399,\\\"y\\\":0.005076451998209233}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"snake_helix\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":197.85448842834535,\\\"max\\\":522.2499280009629},\\\"y\\\":{\\\"min\\\":12.20453795157672,\\\"max\\\":683.21}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"snake_helix\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"snake_helix_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#89938C7A-6FDF-4AC1-81A2-209EC12AC956_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.070 524.609 C 367.714 520.318 376.880 516.314 385.740 511.524 C 396.722 521.981 404.099 535.687 401.680 557.301 C 399.158 579.849 385.884 592.090 372.966 602.080 C 368.528 605.533 364.121 608.752 359.899 612.160 C 350.296 620.078 342.866 628.514 343.221 641.741 C 343.657 657.970 360.381 681.206 360.382 681.210 C 360.379 681.207 331.336 663.091 327.951 645.097 C 323.786 622.952 334.024 612.466 346.927 602.115 C 351.191 598.685 355.770 595.275 359.986 591.587 C 369.463 583.238 377.883 573.057 380.494 556.440 C 382.971 540.677 373.270 532.030 360.070 524.609 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#89938C7A-6FDF-4AC1-81A2-209EC12AC956_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 403.225 317.075 C 406.290 285.762 387.682 263.249 360.031 242.954 C 372.023 234.278 385.475 226.595 398.986 218.354 C 430.217 243.052 452.067 274.775 447.936 322.262 C 444.658 359.943 420.066 377.818 394.406 391.340 C 382.530 397.653 370.413 403.093 359.970 409.050 C 341.947 419.389 328.607 431.366 328.871 452.280 C 329.123 472.234 343.950 482.563 360.027 492.819 C 351.103 498.531 341.796 504.240 334.259 511.461 C 313.819 500.440 295.255 485.669 295.271 454.125 C 295.288 423.814 308.526 405.294 325.541 391.381 C 336.319 382.569 348.611 375.499 359.987 368.505 C 381.714 355.199 400.797 341.885 403.225 317.075 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#89938C7A-6FDF-4AC1-81A2-209EC12AC956_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 298.951 39.944 C 297.762 33.387 291.514 29.056 284.957 30.244 C 278.399 31.433 274.068 37.681 275.256 44.239 C 276.445 50.796 282.694 55.127 289.251 53.939 C 295.809 52.750 300.139 46.501 298.951 39.944 M 213.170 44.645 C 247.270 -13.961 343.943 23.558 341.668 61.222 C 309.317 92.448 265.953 46.686 253.580 69.921 C 228.039 117.885 303.251 152.141 359.853 192.077 C 346.395 200.608 332.705 208.679 320.816 218.200 C 255.493 175.524 165.688 126.253 213.170 44.645 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.951 39.944 C 297.762 33.387 291.514 29.056 284.957 30.244 C 278.399 31.433 274.068 37.681 275.256 44.239 C 276.445 50.796 282.694 55.127 289.251 53.939 C 295.809 52.750 300.139 46.501 298.951 39.944 M 341.668 61.222 C 309.317 92.448 265.953 46.686 253.580 69.921 C 228.039 117.885 303.251 152.141 359.853 192.077 C 346.395 200.608 332.705 208.679 320.816 218.200 C 255.493 175.524 165.688 126.253 213.170 44.645 C 247.270 -13.961 343.943 23.558 341.668 61.222 C 309.317 92.448 265.953 46.686 253.580 69.921 M 213.170 44.645 C 247.270 -13.961 343.943 23.558 341.668 61.222 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 372.966 602.080 C 368.528 605.533 364.121 608.752 359.899 612.160 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#89938C7A-6FDF-4AC1-81A2-209EC12AC956_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 392.049 645.097 C 396.083 622.927 385.840 612.441 372.966 602.080 C 368.528 605.533 364.121 608.752 359.899 612.160 C 369.412 619.909 377.020 628.381 376.779 641.741 C 376.487 657.860 360.384 681.206 360.382 681.210 C 360.386 681.207 388.805 662.922 392.049 645.097 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 394.406 391.340 C 382.530 397.653 370.413 403.093 359.970 409.050 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.027 492.819 C 351.103 498.531 341.796 504.240 334.259 511.461 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.927 602.115 C 351.191 598.685 355.770 595.275 359.986 591.587 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.070 524.609 C 367.714 520.318 376.880 516.314 385.740 511.524 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#89938C7A-6FDF-4AC1-81A2-209EC12AC956_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 424.729 454.125 C 424.713 423.814 411.474 405.294 394.406 391.340 C 382.530 397.653 370.413 403.093 359.970 409.050 C 377.782 419.148 391.395 431.155 391.129 452.280 C 390.877 472.234 376.050 482.563 360.027 492.819 C 351.103 498.531 341.796 504.240 334.259 511.461 C 323.278 521.981 315.901 535.687 318.320 557.301 C 320.816 579.609 333.768 591.827 346.927 602.115 C 351.191 598.685 355.770 595.275 359.986 591.587 C 350.750 583.530 342.156 573.301 339.506 556.440 C 337.054 540.835 346.538 532.204 360.070 524.609 C 367.714 520.318 376.880 516.314 385.740 511.524 C 406.057 500.538 424.745 485.775 424.729 454.125 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 325.541 391.381 C 336.319 382.569 348.611 375.499 359.987 368.505 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.031 242.954 C 372.023 234.278 385.475 226.595 398.986 218.354 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.853 192.077 C 346.395 200.608 332.705 208.679 320.816 218.200 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#89938C7A-6FDF-4AC1-81A2-209EC12AC956_5)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 429.232 30.244 C 422.674 31.433 418.343 37.681 419.531 44.239 C 420.720 50.796 426.969 55.127 433.526 53.939 C 440.083 52.750 444.414 46.501 443.226 39.944 C 442.037 33.387 435.789 29.056 429.232 30.244 M 325.541 391.381 C 336.319 382.569 348.611 375.499 359.987 368.505 C 338.285 355.199 319.203 341.885 316.775 317.075 C 313.668 285.330 332.836 262.629 360.031 242.954 C 372.023 234.278 385.475 226.595 398.986 218.354 C 466.385 177.245 554.131 125.932 506.830 44.645 C 472.728 -13.960 376.057 23.558 378.332 61.222 C 410.683 92.448 454.044 46.687 466.420 69.921 C 491.962 117.870 418.580 154.846 359.853 192.077 C 346.395 200.608 332.705 208.679 320.816 218.200 C 289.783 243.052 267.933 274.775 272.064 322.262 C 275.331 359.818 299.771 377.698 325.541 391.381 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":705.414,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":15.705,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":270.828,\\\"y\\\":315.202,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088752084}},{\\\"point\\\":{\\\"x\\\":449.245,\\\"y\\\":315.202,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.005035854088752084}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":479.902,\\\"y\\\":25.025,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631445428603132,\\\"y\\\":-0.7754203187279831}},{\\\"point\\\":{\\\"x\\\":240.777,\\\"y\\\":25.104,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817084818456932,\\\"y\\\":-0.7316239100655747}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":683.141,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"89938C7A-6FDF-4AC1-81A2-209EC12AC956_0\\\",\\\"cx\\\":\\\"49.16%\\\",\\\"cy\\\":\\\"56.25%\\\",\\\"r\\\":\\\"89.39%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"89938C7A-6FDF-4AC1-81A2-209EC12AC956_1\\\",\\\"cx\\\":\\\"45.64%\\\",\\\"cy\\\":\\\"50.72%\\\",\\\"r\\\":\\\"84.02%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"89938C7A-6FDF-4AC1-81A2-209EC12AC956_2\\\",\\\"cx\\\":\\\"26.06%\\\",\\\"cy\\\":\\\"33.22%\\\",\\\"r\\\":\\\"125.75%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"89938C7A-6FDF-4AC1-81A2-209EC12AC956_3\\\",\\\"cx\\\":\\\"16.23%\\\",\\\"cy\\\":\\\"90.22%\\\",\\\"r\\\":\\\"156.32%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"89938C7A-6FDF-4AC1-81A2-209EC12AC956_4\\\",\\\"cx\\\":\\\"43.14%\\\",\\\"cy\\\":\\\"49.50%\\\",\\\"r\\\":\\\"81.71%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"89938C7A-6FDF-4AC1-81A2-209EC12AC956_5\\\",\\\"cx\\\":\\\"36.46%\\\",\\\"cy\\\":\\\"42.33%\\\",\\\"r\\\":\\\"99.07%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"snake_helix_mix\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":197.85448842834535,\\\"max\\\":522.2499280009629},\\\"y\\\":{\\\"min\\\":12.20453795157672,\\\"max\\\":683.21}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"snake_helix_mix\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"snake_helix_3\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.070 524.609 C 367.714 520.318 376.880 516.314 385.740 511.524 C 396.722 521.981 404.099 535.687 401.680 557.301 C 399.158 579.849 385.884 592.090 372.966 602.080 C 368.528 605.533 364.121 608.752 359.899 612.160 C 350.296 620.078 342.866 628.514 343.221 641.741 C 343.657 657.970 360.381 681.206 360.382 681.210 C 360.379 681.207 331.336 663.091 327.951 645.097 C 323.786 622.952 334.024 612.466 346.927 602.115 C 351.191 598.685 355.770 595.275 359.986 591.587 C 369.463 583.238 377.883 573.057 380.494 556.440 C 382.971 540.677 373.270 532.030 360.070 524.609 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 403.225 317.075 C 406.290 285.762 387.682 263.249 360.031 242.954 C 372.023 234.278 385.475 226.595 398.986 218.354 C 430.217 243.052 452.067 274.775 447.936 322.262 C 444.658 359.943 420.066 377.818 394.406 391.340 C 382.530 397.653 370.413 403.093 359.970 409.050 C 341.947 419.389 328.607 431.366 328.871 452.280 C 329.123 472.234 343.950 482.563 360.027 492.819 C 351.103 498.531 341.796 504.240 334.259 511.461 C 313.819 500.440 295.255 485.669 295.271 454.125 C 295.288 423.814 308.526 405.294 325.541 391.381 C 336.319 382.569 348.611 375.499 359.987 368.505 C 381.714 355.199 400.797 341.885 403.225 317.075 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 298.951 39.944 C 297.762 33.387 291.514 29.056 284.957 30.244 C 278.399 31.433 274.068 37.681 275.256 44.239 C 276.445 50.796 282.694 55.127 289.251 53.939 C 295.809 52.750 300.139 46.501 298.951 39.944 M 213.170 44.645 C 247.270 -13.961 343.943 23.558 341.668 61.222 C 309.317 92.448 265.953 46.686 253.580 69.921 C 228.039 117.885 303.251 152.141 359.853 192.077 C 346.395 200.608 332.705 208.679 320.816 218.200 C 255.493 175.524 165.688 126.253 213.170 44.645 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 298.951 39.944 C 297.762 33.387 291.514 29.056 284.957 30.244 C 278.399 31.433 274.068 37.681 275.256 44.239 C 276.445 50.796 282.694 55.127 289.251 53.939 C 295.809 52.750 300.139 46.501 298.951 39.944 M 341.668 61.222 C 309.317 92.448 265.953 46.686 253.580 69.921 C 228.039 117.885 303.251 152.141 359.853 192.077 C 346.395 200.608 332.705 208.679 320.816 218.200 C 255.493 175.524 165.688 126.253 213.170 44.645 C 247.270 -13.961 343.943 23.558 341.668 61.222 C 309.317 92.448 265.953 46.686 253.580 69.921 M 213.170 44.645 C 247.270 -13.961 343.943 23.558 341.668 61.222 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 372.966 602.080 C 368.528 605.533 364.121 608.752 359.899 612.160 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 392.049 645.097 C 396.083 622.927 385.840 612.441 372.966 602.080 C 368.528 605.533 364.121 608.752 359.899 612.160 C 369.412 619.909 377.020 628.381 376.779 641.741 C 376.487 657.860 360.384 681.206 360.382 681.210 C 360.386 681.207 388.805 662.922 392.049 645.097 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 394.406 391.340 C 382.530 397.653 370.413 403.093 359.970 409.050 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.027 492.819 C 351.103 498.531 341.796 504.240 334.259 511.461 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 346.927 602.115 C 351.191 598.685 355.770 595.275 359.986 591.587 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.070 524.609 C 367.714 520.318 376.880 516.314 385.740 511.524 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 424.729 454.125 C 424.713 423.814 411.474 405.294 394.406 391.340 C 382.530 397.653 370.413 403.093 359.970 409.050 C 377.782 419.148 391.395 431.155 391.129 452.280 C 390.877 472.234 376.050 482.563 360.027 492.819 C 351.103 498.531 341.796 504.240 334.259 511.461 C 323.278 521.981 315.901 535.687 318.320 557.301 C 320.816 579.609 333.768 591.827 346.927 602.115 C 351.191 598.685 355.770 595.275 359.986 591.587 C 350.750 583.530 342.156 573.301 339.506 556.440 C 337.054 540.835 346.538 532.204 360.070 524.609 C 367.714 520.318 376.880 516.314 385.740 511.524 C 406.057 500.538 424.745 485.775 424.729 454.125 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 325.541 391.381 C 336.319 382.569 348.611 375.499 359.987 368.505 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.031 242.954 C 372.023 234.278 385.475 226.595 398.986 218.354 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.853 192.077 C 346.395 200.608 332.705 208.679 320.816 218.200 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 429.232 30.244 C 422.674 31.433 418.343 37.681 419.531 44.239 C 420.720 50.796 426.969 55.127 433.526 53.939 C 440.083 52.750 444.414 46.501 443.226 39.944 C 442.037 33.387 435.789 29.056 429.232 30.244 M 325.541 391.381 C 336.319 382.569 348.611 375.499 359.987 368.505 C 338.285 355.199 319.203 341.885 316.775 317.075 C 313.668 285.330 332.836 262.629 360.031 242.954 C 372.023 234.278 385.475 226.595 398.986 218.354 C 466.385 177.245 554.131 125.932 506.830 44.645 C 472.728 -13.960 376.057 23.558 378.332 61.222 C 410.683 92.448 454.044 46.687 466.420 69.921 C 491.962 117.870 418.580 154.846 359.853 192.077 C 346.395 200.608 332.705 208.679 320.816 218.200 C 289.783 243.052 267.933 274.775 272.064 322.262 C 275.331 359.818 299.771 377.698 325.541 391.381 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":705.414,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":15.705,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":270.828,\\\"y\\\":315.202,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088752084}},{\\\"point\\\":{\\\"x\\\":449.245,\\\"y\\\":315.202,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.005035854088752084}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":479.902,\\\"y\\\":25.025,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631445428603132,\\\"y\\\":-0.7754203187279831}},{\\\"point\\\":{\\\"x\\\":240.777,\\\"y\\\":25.104,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817084818456932,\\\"y\\\":-0.7316239100655747}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":683.141,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"snake_spiral\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":92.85493381541751,\\\"max\\\":619.7516204124639},\\\"y\\\":{\\\"min\\\":45.75163809442195,\\\"max\\\":648.1925133096618}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"snake_spiral\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"snake_spiral\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 365.085 94.279 C 374.360 93.801 383.141 87.987 382.984 78.701 C 382.820 68.954 373.207 62.695 363.472 63.217 C 353.746 63.738 344.878 70.977 345.738 80.678 C 346.557 89.898 355.842 94.756 365.085 94.279 M 393.836 237.740 C 462.921 234.656 531.883 284.900 552.580 367.149 C 560.785 399.754 556.568 429.715 544.649 461.929 C 504.583 570.222 368.293 611.109 270.297 555.846 C 194.068 512.857 149.897 424.784 160.999 338.207 C 166.394 296.137 183.739 256.026 209.289 222.320 C 235.074 188.304 266.751 162.328 305.923 146.647 C 356.852 156.748 401.090 160.354 438.665 119.672 C 407.160 117.901 345.108 109.850 345.099 109.849 C 345.109 109.847 411.651 101.500 444.632 95.516 C 432.006 76.508 420.025 67.424 404.495 59.156 C 392.525 52.783 354.729 37.588 320.170 58.149 C 302.907 68.419 291.055 76.010 283.549 87.595 C 182.345 132.416 111.681 219.061 97.162 329.738 C 73.453 510.484 236.091 678.748 418.987 640.791 C 502.851 623.387 575.309 565.111 604.487 483.177 C 651.571 350.965 568.837 200.556 427.056 186.260 C 367.202 180.225 306.735 203.168 266.718 248.309 C 207.668 314.919 207.124 424.209 279.502 481.924 C 348.851 537.224 478.223 509.010 479.939 407.329 C 480.147 395.021 477.639 381.708 472.945 370.317 C 468.218 358.845 461.847 349.502 452.605 341.211 C 427.650 318.823 383.309 313.854 361.861 343.977 C 347.331 364.385 354.233 392.728 381.784 391.941 C 344.032 388.763 356.931 344.827 383.787 334.526 C 444.254 311.333 479.215 391.234 454.055 437.353 C 409.470 519.082 290.521 484.877 267.177 403.032 C 243.682 320.661 311.519 241.415 393.836 237.740 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":358.232,\\\"y\\\":685.068,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":358.232,\\\"y\\\":46.115,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":96.184,\\\"y\\\":381.268,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088756288}},{\\\"point\\\":{\\\"x\\\":615.155,\\\"y\\\":381.268,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873181281341,\\\"y\\\":0.0050362270502705715}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":543.831,\\\"y\\\":576.114,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129335762692849,\\\"y\\\":0.7012315707581112}},{\\\"point\\\":{\\\"x\\\":190.563,\\\"y\\\":576.162,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987633221457824,\\\"y\\\":0.7153529336095501}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"sperm_tail\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":277.244,\\\"max\\\":442.7608821467311},\\\"y\\\":{\\\"min\\\":358.96658206426093,\\\"max\\\":661.738}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sperm_tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sperm_tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 441.756 360.000 C 442.072 411.059 426.993 424.650 412.532 437.406 C 391.928 455.581 377.886 470.397 380.091 492.465 C 381.433 505.906 409.125 516.331 404.538 544.978 C 400.223 571.928 359.607 573.761 363.110 595.985 C 365.165 609.019 387.463 608.512 382.460 627.875 C 378.647 642.633 357.372 640.111 357.190 650.479 C 357.113 654.862 362.649 660.737 362.650 660.738 C 362.649 660.737 351.888 657.397 350.874 651.948 C 348.229 637.724 364.173 641.150 367.263 626.839 C 370.435 612.153 340.556 620.808 333.919 598.309 C 325.946 571.278 361.344 561.037 360.841 546.489 C 360.012 522.480 311.965 522.077 308.249 493.268 C 306.022 475.997 317.992 464.976 317.680 454.585 C 316.890 428.224 278.670 420.366 278.244 360.000 C 359.334 360.148 361.096 359.876 441.756 360.000 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 278.244 360.000 C 332.748 360.000 387.252 360.000 441.756 360.000 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":360.006,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":359.977,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":440.11,\\\"y\\\":362.147,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6313376160156364,\\\"y\\\":-0.7755081009271876}},{\\\"point\\\":{\\\"x\\\":280.124,\\\"y\\\":362.174,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6818119912592983,\\\"y\\\":-0.7315274489552874}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"spiderweb\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":39.501,\\\"max\\\":705.381},\\\"y\\\":{\\\"min\\\":197.635,\\\"max\\\":520.533}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"spiderweb_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"spiderweb_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 362.823 360.482 C 362.830 360.480 438.142 340.668 438.149 340.666 C 438.155 340.660 498.959 284.149 498.965 284.143 C 498.967 284.135 512.615 229.906 519.440 202.787 C 519.436 202.787 479.955 202.833 479.951 202.833 C 474.894 223.357 464.782 264.400 464.781 264.406 C 464.776 264.411 418.431 306.423 418.426 306.427 C 418.421 306.429 362.799 320.967 362.794 320.969 C 362.794 320.965 362.832 281.460 362.832 281.456 C 362.836 281.455 398.700 272.190 398.703 272.189 C 398.706 272.186 430.593 244.673 430.596 244.670 C 430.597 244.666 437.174 216.809 440.463 202.878 C 440.459 202.878 400.978 202.924 400.974 202.924 C 399.453 209.766 396.412 223.447 396.411 223.449 C 396.410 223.450 378.982 238.691 378.980 238.693 C 378.979 238.693 362.873 242.686 362.871 242.686 C 362.871 242.682 361.485 202.974 361.485 202.970 C 361.486 202.973 378.979 238.689 378.980 238.693 C 378.982 238.696 398.701 272.186 398.703 272.189 C 398.705 272.192 418.424 306.424 418.426 306.427 C 418.428 306.431 438.147 340.662 438.149 340.666 C 438.151 340.669 457.870 374.900 457.872 374.904 C 457.863 374.906 362.871 399.992 362.861 399.994 C 362.861 399.990 362.823 360.486 362.823 360.482 C 362.823 360.478 362.794 320.973 362.794 320.969 M 362.900 439.507 C 362.911 439.504 477.584 409.145 477.595 409.142 C 477.604 409.134 567.326 323.624 567.335 323.616 C 567.338 323.604 588.057 243.003 598.418 202.696 C 598.414 202.696 558.933 202.742 558.929 202.742 C 550.336 236.454 533.153 303.869 533.150 303.879 C 533.142 303.886 457.880 374.897 457.872 374.904 C 457.874 374.907 477.593 409.139 477.595 409.142 C 477.597 409.146 497.316 443.377 497.318 443.380 C 497.305 443.384 362.952 479.017 362.938 479.020 C 362.938 479.016 362.900 439.511 362.900 439.507 C 362.900 439.503 362.861 399.998 362.861 399.994 M 497.318 443.380 C 497.328 443.370 601.509 343.363 601.519 343.353 C 601.523 343.338 625.778 249.551 637.907 202.651 C 637.903 202.651 598.422 202.696 598.418 202.696 M 517.041 477.619 C 510.467 466.206 497.320 443.384 497.318 443.380 M 362.871 242.686 C 362.871 242.690 362.832 281.452 362.832 281.456 M 362.938 479.020 C 362.938 479.024 362.713 505.362 362.601 518.533 M 635.704 363.089 C 635.700 363.087 601.523 343.355 601.519 343.353 C 601.516 343.351 567.338 323.618 567.335 323.616 C 567.331 323.614 533.153 303.881 533.150 303.879 C 533.146 303.877 498.969 284.145 498.965 284.143 C 498.962 284.141 464.784 264.408 464.781 264.406 C 464.777 264.404 430.600 244.672 430.596 244.670 C 430.593 244.668 396.415 223.451 396.411 223.449 C 396.408 223.447 361.488 202.972 361.485 202.970 C 361.489 202.970 400.970 202.924 400.974 202.924 M 440.463 202.878 C 440.466 202.878 479.947 202.833 479.951 202.833 M 519.440 202.787 C 519.444 202.787 558.925 202.742 558.929 202.742 M 637.907 202.651 C 637.911 202.651 677.392 202.605 677.396 202.605 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 362.832 281.456 C 362.828 281.455 320.940 272.932 320.936 272.931 C 320.933 272.928 289.788 243.930 289.785 243.927 C 289.784 243.923 282.218 217.056 278.434 203.621 C 278.438 203.621 317.919 203.666 317.923 203.666 C 319.939 210.013 323.970 222.704 323.970 222.706 C 323.972 222.708 341.400 238.691 341.401 238.693 C 341.403 238.693 362.869 242.686 362.871 242.686 M 202.598 478.361 C 209.173 466.949 222.319 444.126 222.321 444.123 C 222.323 444.119 242.042 409.888 242.044 409.885 C 242.046 409.881 261.765 375.650 261.767 375.646 C 261.760 375.639 187.239 303.144 187.232 303.137 C 187.229 303.127 169.056 236.702 159.968 203.484 C 159.972 203.484 199.453 203.530 199.457 203.530 C 206.777 230.153 221.414 283.392 221.416 283.400 C 221.422 283.406 281.484 341.402 281.490 341.408 C 281.498 341.410 362.815 360.480 362.823 360.482 M 120.479 203.439 C 131.335 243.250 153.044 322.861 153.047 322.873 C 153.056 322.882 242.035 409.876 242.044 409.885 C 242.056 409.888 362.888 439.504 362.900 439.507 M 261.767 375.646 C 261.777 375.649 362.851 399.992 362.861 399.994 M 362.794 320.969 C 362.787 320.968 301.219 307.171 301.213 307.169 C 301.208 307.165 255.605 263.668 255.601 263.664 C 255.599 263.658 244.497 223.605 238.946 203.575 C 238.950 203.575 278.431 203.621 278.434 203.621 M 261.767 375.646 C 261.769 375.643 281.488 341.411 281.490 341.408 C 281.492 341.405 301.211 307.173 301.213 307.169 C 301.215 307.166 320.934 272.935 320.936 272.931 C 320.938 272.928 341.399 238.696 341.401 238.693 C 341.403 238.689 354.550 214.878 361.124 202.970 C 361.120 202.972 323.974 222.704 323.970 222.706 C 323.967 222.708 289.789 243.925 289.785 243.927 C 289.782 243.929 255.604 263.662 255.601 263.664 C 255.597 263.666 221.420 283.398 221.416 283.400 C 221.413 283.402 187.235 303.135 187.232 303.137 C 187.228 303.139 153.051 322.871 153.047 322.873 C 153.044 322.875 118.866 342.608 118.862 342.610 C 118.859 342.596 93.614 249.799 80.990 203.393 C 80.994 203.393 120.475 203.439 120.479 203.439 C 120.483 203.439 159.964 203.484 159.968 203.484 M 118.862 342.610 C 118.873 342.620 222.311 444.113 222.321 444.123 C 222.335 444.126 362.924 479.017 362.938 479.020 M 84.678 362.346 C 84.681 362.344 118.859 342.612 118.862 342.610 M 361.124 202.970 C 361.120 202.970 317.928 203.666 317.923 203.666 M 238.946 203.575 C 238.942 203.575 199.461 203.530 199.457 203.530 M 80.990 203.393 C 80.986 203.393 41.505 203.347 41.501 203.347 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"spiderweb\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.853 358.255 C 359.861 358.253 438.884 336.956 438.892 336.954 C 438.898 336.948 496.733 278.952 496.738 278.946 C 496.741 278.938 510.883 226.194 517.956 199.818 C 517.952 199.818 478.471 199.863 478.467 199.863 C 473.162 219.645 462.556 259.203 462.554 259.209 C 462.550 259.214 419.173 302.711 419.169 302.715 C 419.163 302.717 359.830 318.740 359.824 318.742 C 359.824 318.738 359.863 279.233 359.863 279.229 C 359.867 279.228 399.442 268.478 399.446 268.477 C 399.449 268.474 428.367 239.476 428.369 239.473 C 428.370 239.469 435.442 213.097 438.978 199.909 C 438.974 199.909 399.493 199.954 399.489 199.954 C 397.721 206.548 394.185 219.734 394.185 219.736 C 394.183 219.738 379.724 234.237 379.723 234.238 C 379.721 234.239 359.904 239.716 359.902 239.716 C 359.902 239.712 360.000 200.004 360.000 200.000 C 360.002 200.004 379.721 234.235 379.723 234.238 C 379.725 234.242 399.444 268.473 399.446 268.477 C 399.448 268.480 419.167 302.712 419.169 302.715 C 419.171 302.718 438.890 336.950 438.892 336.954 C 438.894 336.957 458.613 371.188 458.615 371.192 C 458.605 371.194 359.902 397.765 359.892 397.767 C 359.892 397.763 359.854 358.259 359.853 358.255 C 359.853 358.251 359.824 318.746 359.824 318.742 M 359.931 437.280 C 359.942 437.277 478.326 405.433 478.338 405.430 C 478.346 405.422 565.099 318.428 565.108 318.419 C 565.111 318.407 586.325 239.291 596.934 199.727 C 596.930 199.727 557.448 199.772 557.445 199.772 C 548.604 232.742 530.926 298.672 530.923 298.682 C 530.916 298.690 458.622 371.184 458.615 371.192 C 458.617 371.195 478.336 405.427 478.338 405.430 C 478.340 405.434 498.059 439.665 498.061 439.668 C 498.047 439.672 359.983 476.789 359.969 476.793 C 359.969 476.789 359.931 437.284 359.931 437.280 C 359.931 437.276 359.892 397.771 359.892 397.767 M 498.061 439.668 C 498.071 439.658 599.282 338.166 599.292 338.156 C 599.296 338.142 624.046 245.839 636.422 199.681 C 636.418 199.681 596.938 199.727 596.934 199.727 M 517.784 473.907 C 511.209 462.494 498.063 439.672 498.061 439.668 M 359.902 239.716 C 359.902 239.720 359.863 279.225 359.863 279.229 M 359.969 476.793 C 359.969 476.797 359.744 503.135 359.632 516.306 M 633.477 357.892 C 633.474 357.890 599.296 338.158 599.292 338.156 C 599.289 338.154 565.111 318.421 565.108 318.419 C 565.104 318.417 530.926 298.684 530.923 298.682 C 530.920 298.680 496.742 278.948 496.738 278.946 C 496.735 278.944 462.557 259.211 462.554 259.209 C 462.551 259.207 428.373 239.475 428.369 239.473 C 428.366 239.471 394.188 219.738 394.185 219.736 C 394.181 219.734 360.003 200.002 360.000 200.000 C 360.004 200.000 399.485 199.954 399.489 199.954 M 438.978 199.909 C 438.982 199.909 478.463 199.863 478.467 199.863 M 517.956 199.818 C 517.960 199.818 557.441 199.772 557.445 199.772 M 636.422 199.681 C 636.426 199.681 675.907 199.635 675.911 199.635 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 678.371 297.203 C 678.371 298.588 677.255 299.704 675.870 299.704 C 674.486 299.704 673.369 298.588 673.369 297.203 C 673.369 295.819 674.486 294.702 675.870 294.702 C 677.255 294.702 678.371 295.819 678.371 297.203 M 673.149 300.350 C 674.025 299.922 674.953 299.704 675.870 299.704 C 676.788 299.704 677.716 299.922 678.591 300.350 C 679.466 300.778 680.998 302.259 680.998 302.260 C 680.998 302.260 682.717 305.392 682.717 305.393 C 682.717 305.393 683.373 309.708 683.373 309.709 C 683.373 309.709 682.717 314.024 682.717 314.025 C 682.717 314.025 681.706 316.315 680.998 317.158 C 680.289 318.000 679.466 318.639 678.591 319.067 C 677.716 319.495 676.788 319.713 675.870 319.713 C 674.953 319.713 674.025 319.495 673.149 319.067 C 672.274 318.639 671.450 318.001 670.742 317.158 C 670.033 316.315 669.023 314.025 669.023 314.025 C 669.023 314.024 668.367 309.709 668.367 309.709 C 668.367 309.708 669.023 305.393 669.023 305.393 C 669.023 305.392 670.742 302.260 670.742 302.260 C 670.742 302.259 672.274 300.778 673.149 300.350 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 658.363 319.713 C 658.363 319.714 661.697 326.382 663.365 329.717 M 669.023 314.025 C 665.469 315.921 658.364 319.712 658.363 319.713 M 658.363 309.709 C 658.362 309.710 651.693 316.378 648.359 319.713 M 668.367 309.709 C 665.032 309.709 658.364 309.709 658.363 309.709 M 658.363 299.704 C 658.362 299.705 651.693 303.039 648.359 304.707 M 669.023 305.393 C 665.469 303.497 658.364 299.705 658.363 299.704 M 663.365 294.702 C 663.366 294.702 670.034 291.368 673.369 289.700 M 670.742 302.260 C 668.283 299.740 663.366 294.703 663.365 294.702 M 693.377 319.713 C 693.377 319.714 690.043 326.382 688.375 329.717 M 682.717 314.025 C 686.270 315.921 693.376 319.712 693.377 319.713 M 693.377 309.709 C 693.378 309.710 700.047 316.378 703.381 319.713 M 683.373 309.709 C 686.708 309.709 693.376 309.709 693.377 309.709 M 693.377 299.704 C 693.378 299.705 700.047 303.039 703.381 304.707 M 682.717 305.393 C 686.270 303.497 693.376 299.705 693.377 299.704 M 688.375 294.702 C 688.374 294.702 681.706 291.368 678.371 289.700 M 680.998 302.260 C 683.457 299.740 688.375 294.703 688.375 294.702 M 678.371 297.203 C 678.371 298.588 677.255 299.704 675.870 299.704 C 674.486 299.704 673.369 298.588 673.369 297.203 C 673.369 295.819 674.486 294.702 675.870 294.702 C 677.255 294.702 678.371 295.819 678.371 297.203 M 673.149 300.350 C 674.025 299.922 674.953 299.704 675.870 299.704 C 676.788 299.704 677.716 299.922 678.591 300.350 C 679.466 300.778 680.998 302.259 680.998 302.260 C 680.998 302.260 682.717 305.392 682.717 305.393 C 682.717 305.393 683.373 309.708 683.373 309.709 C 683.373 309.709 682.717 314.024 682.717 314.025 C 682.717 314.025 681.706 316.315 680.998 317.158 C 680.289 318.000 679.466 318.639 678.591 319.067 C 677.716 319.495 676.788 319.713 675.870 319.713 C 674.953 319.713 674.025 319.495 673.149 319.067 C 672.274 318.639 671.450 318.001 670.742 317.158 C 670.033 316.315 669.023 314.025 669.023 314.025 C 669.023 314.024 668.367 309.709 668.367 309.709 C 668.367 309.708 669.023 305.393 669.023 305.393 C 669.023 305.392 670.742 302.260 670.742 302.260 C 670.742 302.259 672.274 300.778 673.149 300.350 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 675.911 199.635 C 675.911 199.645 675.813 263.041 675.763 294.744 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.863 279.229 C 359.859 279.228 320.197 268.478 320.193 268.477 C 320.190 268.474 291.273 239.476 291.270 239.473 C 291.269 239.469 284.198 213.097 280.661 199.909 C 280.665 199.909 320.146 199.954 320.150 199.954 C 321.918 206.548 325.454 219.734 325.455 219.736 C 325.456 219.738 339.915 234.237 339.916 234.238 C 339.918 234.239 359.900 239.716 359.902 239.716 M 201.856 473.907 C 208.430 462.494 221.577 439.672 221.579 439.668 C 221.581 439.665 241.300 405.434 241.302 405.430 C 241.304 405.427 261.023 371.195 261.024 371.192 C 261.017 371.184 188.724 298.690 188.716 298.682 C 188.714 298.672 171.035 232.742 162.195 199.772 C 162.199 199.772 201.680 199.818 201.684 199.818 C 208.756 226.194 222.899 278.938 222.901 278.946 C 222.907 278.952 280.742 336.948 280.747 336.954 C 280.755 336.956 359.846 358.253 359.853 358.255 M 122.706 199.727 C 133.315 239.291 154.529 318.407 154.532 318.419 C 154.540 318.428 241.293 405.422 241.302 405.430 C 241.313 405.433 359.919 437.277 359.931 437.280 M 261.024 371.192 C 261.034 371.194 359.882 397.765 359.892 397.767 M 359.824 318.742 C 359.818 318.740 300.476 302.717 300.470 302.715 C 300.466 302.711 257.090 259.214 257.085 259.209 C 257.084 259.203 246.477 219.645 241.173 199.863 C 241.177 199.863 280.657 199.909 280.661 199.909 M 261.024 371.192 C 261.026 371.188 280.745 336.957 280.747 336.954 C 280.749 336.950 300.468 302.718 300.470 302.715 C 300.472 302.712 320.191 268.480 320.193 268.477 C 320.195 268.473 339.914 234.242 339.916 234.238 C 339.918 234.235 353.065 211.413 359.639 200.000 C 359.636 200.002 325.458 219.734 325.455 219.736 C 325.451 219.738 291.273 239.471 291.270 239.473 C 291.266 239.475 257.089 259.207 257.085 259.209 C 257.082 259.211 222.904 278.944 222.901 278.946 C 222.897 278.948 188.720 298.680 188.716 298.682 C 188.713 298.684 154.535 318.417 154.532 318.419 C 154.528 318.421 120.350 338.154 120.347 338.156 C 120.343 338.142 95.594 245.839 83.217 199.681 C 83.221 199.681 122.702 199.727 122.706 199.727 C 122.710 199.727 162.191 199.772 162.195 199.772 M 120.347 338.156 C 120.357 338.166 221.568 439.658 221.579 439.668 C 221.592 439.672 359.955 476.789 359.969 476.793 M 86.162 357.892 C 86.166 357.890 120.344 338.158 120.347 338.156 M 359.639 200.000 C 359.635 200.000 320.154 199.954 320.150 199.954 M 241.173 199.863 C 241.169 199.863 201.688 199.818 201.684 199.818 M 83.217 199.681 C 83.213 199.681 43.732 199.635 43.728 199.635 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":275.106,\\\"max\\\":444.894},\\\"y\\\":{\\\"min\\\":218.8,\\\"max\\\":388.588}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":198.745,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":168.99,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":41.149,\\\"y\\\":200.908,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872880189177,\\\"y\\\":0.00504220195649551}},{\\\"point\\\":{\\\"x\\\":677.814,\\\"y\\\":200.908,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872880189178,\\\"y\\\":0.005042201956495514}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":520.196,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":198.655,\\\"y\\\":477.783,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5000070188126982,\\\"y\\\":0.8660213514331147}},{\\\"point\\\":{\\\"x\\\":520.308,\\\"y\\\":477.783,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5000626292085538,\\\"y\\\":0.8659892417744163}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":81.861,\\\"y\\\":360.657,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8660213514331152,\\\"y\\\":0.5000070188126972}},{\\\"point\\\":{\\\"x\\\":637.102,\\\"y\\\":360.657,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8660398881710507,\\\"y\\\":0.4999749114672396}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"spiral_squirt\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":145.00233979035545,\\\"max\\\":564.4589382706015},\\\"y\\\":{\\\"min\\\":20.868,\\\"max\\\":678.6230562041044}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"spiral_squirt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"spiral_squirt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 426.280 106.063 C 479.314 189.060 480.141 259.456 464.258 326.668 C 503.010 343.141 544.264 380.809 557.355 429.364 C 575.309 495.961 552.256 577.601 506.558 623.685 C 442.279 688.506 335.630 686.883 278.065 660.573 C 155.269 604.449 145.911 508.672 146.003 453.821 C 146.163 357.358 198.606 307.628 231.641 275.019 C 299.514 208.022 334.632 171.580 351.804 113.392 C 360.924 82.486 353.762 21.878 353.762 21.868 C 353.769 21.877 407.256 76.290 426.280 106.063 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 398.533 179.135 C 395.608 262.695 358.802 312.290 358.798 312.304 M 355.482 24.464 C 355.486 24.479 401.477 95.055 398.533 179.135 M 426.280 106.063 C 479.314 189.060 480.141 259.456 464.258 326.668 C 503.010 343.141 544.264 380.809 557.355 429.364 C 575.309 495.961 552.256 577.601 506.558 623.685 C 442.279 688.506 335.630 686.883 278.065 660.573 C 155.269 604.449 145.911 508.672 146.003 453.821 C 146.163 357.358 198.606 307.628 231.641 275.019 C 299.514 208.022 334.632 171.580 351.804 113.392 C 360.924 82.486 353.762 21.878 353.762 21.868 C 353.769 21.877 407.256 76.290 426.280 106.063 M 250.261 486.228 C 220.833 363.543 331.538 270.248 464.258 326.668 M 450.921 526.688 C 403.929 609.326 270.821 571.943 250.261 486.228 M 398.980 409.655 C 458.856 413.087 476.498 481.708 450.921 526.688 M 353.254 481.233 C 327.747 455.278 345.057 406.564 398.980 409.655 M 383.693 465.936 C 395.544 480.689 370.576 498.858 353.254 481.233 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":222.888,\\\"max\\\":497.112},\\\"y\\\":{\\\"min\\\":348.155,\\\"max\\\":622.378}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":763.047,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":31.274,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":147.641,\\\"y\\\":455.257,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873181281341,\\\"y\\\":0.005036227050266393}},{\\\"point\\\":{\\\"x\\\":561.544,\\\"y\\\":455.257,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873181281341,\\\"y\\\":0.005036227050266362}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":502.684,\\\"y\\\":625.987,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064665,\\\"y\\\":0.7012692123096534}},{\\\"point\\\":{\\\"x\\\":224.38,\\\"y\\\":626.035,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987263029800311,\\\"y\\\":0.7153890923992746}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":672.658,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"spiral_squirt_2\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":198.07210926415473,\\\"max\\\":520.8865093908771},\\\"y\\\":{\\\"min\\\":26.232,\\\"max\\\":621.225}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"spiral_squirt_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"spiral_squirt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 249.509 289.487 C 258.080 208.010 341.581 181.001 390.265 188.327 C 395.879 175.790 409.844 156.292 402.452 117.101 C 395.357 79.480 358.735 28.241 358.730 28.232 C 358.727 28.243 378.423 112.463 324.195 143.702 C 276.410 171.230 216.249 216.149 203.641 276.416 C 193.020 327.184 207.031 373.017 233.397 412.725 C 261.385 454.875 317.356 459.296 328.413 459.213 C 356.264 459.002 456.543 438.937 465.373 359.297 C 475.006 272.418 396.112 204.734 327.205 249.246 C 291.187 272.512 276.064 329.784 318.878 355.023 C 352.898 375.079 380.211 343.803 373.248 325.010 C 367.528 309.575 339.881 334.750 334.375 308.985 C 331.179 294.035 362.249 263.809 394.868 288.132 C 435.369 318.333 422.464 372.195 385.694 395.603 C 318.057 438.660 238.689 392.348 249.509 289.487 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 328.413 459.213 C 356.264 459.002 456.543 438.937 465.373 359.297 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 465.373 359.297 C 475.006 272.418 396.112 204.734 327.205 249.246 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 327.205 249.246 C 291.187 272.512 276.064 329.784 318.878 355.023 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 318.878 355.023 C 352.898 375.079 380.211 343.803 373.248 325.010 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.248 325.010 C 367.528 309.575 339.881 334.750 334.375 308.985 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 334.375 308.985 C 331.179 294.035 362.249 263.809 394.868 288.132 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 394.868 288.132 C 435.369 318.333 422.464 372.195 385.694 395.603 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 385.694 395.603 C 318.057 438.660 238.689 392.348 249.509 289.487 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 249.509 289.487 C 258.080 208.010 341.581 181.001 390.265 188.327 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 319.876 538.146 C 313.087 503.876 320.916 473.480 328.413 459.213 C 356.264 459.002 456.543 438.937 465.373 359.297 C 475.006 272.418 396.112 204.734 327.205 249.246 C 291.187 272.512 276.064 329.784 318.878 355.023 C 352.898 375.079 380.211 343.803 373.248 325.010 C 367.528 309.575 339.881 334.750 334.375 308.985 C 331.179 294.035 362.249 263.809 394.868 288.132 C 435.369 318.333 422.464 372.195 385.694 395.603 C 318.057 438.660 238.689 392.348 249.509 289.487 C 258.080 208.010 341.581 181.001 390.265 188.327 C 397.373 189.396 444.937 198.809 472.148 226.885 C 507.682 263.550 525.934 314.163 516.359 366.383 C 505.856 423.662 472.499 467.658 408.166 496.956 C 355.759 520.824 358.735 619.213 358.730 619.225 C 358.726 619.217 324.478 561.373 319.876 538.146 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":690.039,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":34.34,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":199.031,\\\"y\\\":326.029,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999868271844882,\\\"y\\\":0.00513278262745538}},{\\\"point\\\":{\\\"x\\\":520.969,\\\"y\\\":326.029,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999868271844882,\\\"y\\\":0.005132782627455446}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":599.65,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"stairs_smaller\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":73.033,\\\"max\\\":646.967},\\\"y\\\":{\\\"min\\\":60.743,\\\"max\\\":647.306}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"stairs_smaller\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"stairs\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 387.019 645.306 C 387.019 645.297 387.019 559.916 387.019 559.907 C 283.024 499.585 179.028 439.262 75.033 378.939 C 75.033 378.948 75.033 464.330 75.033 464.338 C 75.064 464.357 283.024 584.983 387.019 645.306 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 472.418 511.442 C 472.418 511.433 472.418 426.051 472.418 426.043 C 368.422 365.720 264.427 305.398 160.431 245.075 C 160.431 245.084 160.431 330.466 160.431 330.474 C 264.427 390.797 368.422 451.119 472.418 511.442 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 557.815 377.576 C 557.815 377.567 557.815 292.186 557.815 292.177 C 453.820 231.855 349.825 171.532 245.829 111.210 C 245.829 111.218 245.829 196.600 245.829 196.608 C 349.825 256.931 453.820 317.253 557.815 377.576 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 245.829 111.210 C 349.825 171.532 453.820 231.855 557.815 292.177 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 643.214 243.708 C 643.183 243.690 435.223 123.064 331.227 62.743 C 302.761 78.898 245.838 111.205 245.829 111.210 C 349.825 171.532 453.820 231.855 557.815 292.177 C 557.824 292.172 643.206 243.713 643.214 243.708 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 557.815 377.576 C 453.820 317.253 349.825 256.931 245.829 196.608 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 160.431 245.075 C 264.427 305.398 368.422 365.720 472.418 426.043 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 472.418 426.043 C 472.426 426.038 557.807 377.581 557.815 377.576 C 453.820 317.253 349.825 256.931 245.829 196.608 C 245.821 196.613 160.440 245.070 160.431 245.075 C 264.427 305.398 368.422 365.720 472.418 426.043 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 472.418 511.442 C 368.422 451.119 264.427 390.797 160.431 330.474 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 75.033 378.939 C 179.028 439.262 283.024 499.585 387.019 559.907 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 387.019 559.907 C 387.028 559.902 472.409 511.447 472.418 511.442 C 368.422 451.119 264.427 390.797 160.431 330.474 C 160.423 330.479 75.042 378.935 75.033 378.939 C 179.028 439.262 283.024 499.585 387.019 559.907 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 557.815 292.177 C 557.824 292.172 643.206 243.713 643.214 243.708 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 387.019 645.306 C 387.019 645.297 387.019 559.916 387.019 559.907 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 387.019 559.907 C 387.028 559.902 472.409 511.447 472.418 511.442 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 472.418 511.442 C 472.418 511.433 472.418 426.051 472.418 426.043 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 472.418 426.043 C 472.426 426.038 557.807 377.581 557.815 377.576 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 557.815 377.576 C 557.815 377.567 557.815 292.186 557.815 292.177 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 557.815 292.177 C 557.824 292.172 643.206 243.713 643.214 243.708 C 643.799 328.809 644.967 498.986 644.967 499.011 C 644.941 499.026 387.045 645.291 387.019 645.306 C 387.019 645.297 387.019 559.916 387.019 559.907 C 387.028 559.902 472.409 511.447 472.418 511.442 C 472.418 511.433 472.418 426.051 472.418 426.043 C 472.426 426.038 557.807 377.581 557.815 377.576 C 557.815 377.567 557.815 292.186 557.815 292.177 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":222.951,\\\"max\\\":497.049},\\\"y\\\":{\\\"min\\\":15.479,\\\"max\\\":353.19}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":388.079,\\\"y\\\":693.553,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":331.576,\\\"y\\\":18.904,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":641.743,\\\"y\\\":385.491,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999980424484906,\\\"y\\\":0.0019786609580471452}},{\\\"point\\\":{\\\"x\\\":76.879,\\\"y\\\":387.209,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999672984805416,\\\"y\\\":0.008087148417548392}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":215.902,\\\"y\\\":545.231,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.48979456924850867,\\\"y\\\":0.871837874799362}},{\\\"point\\\":{\\\"x\\\":539.965,\\\"y\\\":559.116,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5071207191800545,\\\"y\\\":0.8618750351288197}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":388.108,\\\"y\\\":644.192,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"star_6pt\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":71.853,\\\"max\\\":648.147},\\\"y\\\":{\\\"min\\\":9.136,\\\"max\\\":666.09}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"star_6pt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"star_6pt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#2ED77EB3-CCAB-49AE-BD3F-C030696B61AE_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 73.853 168.473 C 73.862 168.490 130.513 266.613 171.629 337.827 C 138.711 394.411 73.862 506.733 73.853 506.750 C 73.872 506.750 185.994 506.751 269.457 507.261 C 298.956 558.358 359.990 664.074 359.999 664.090 C 360.008 664.074 412.349 573.416 450.928 506.593 C 516.425 506.752 646.128 506.750 646.147 506.750 C 646.138 506.733 591.408 411.941 548.701 337.249 C 581.286 280.812 646.138 168.490 646.147 168.473 C 646.128 168.473 516.425 168.473 450.440 168.473 C 421.042 116.867 360.008 11.152 359.999 11.136 C 359.990 11.152 308.757 99.892 268.972 168.473 C 186.526 168.473 73.872 168.473 73.853 168.473 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":220.522,\\\"max\\\":499.478},\\\"y\\\":{\\\"min\\\":197.214,\\\"max\\\":476.171}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.623,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":269.579,\\\"y\\\":507.387,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.49998423275989384,\\\"y\\\":0.8660345068133835}},{\\\"point\\\":{\\\"x\\\":449.081,\\\"y\\\":507.387,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.49998423275989384,\\\"y\\\":0.8660345068133835}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":172.441,\\\"y\\\":337.594,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871245626964,\\\"y\\\":0.005074515625185982}},{\\\"point\\\":{\\\"x\\\":547.647,\\\"y\\\":337.594,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871225825836,\\\"y\\\":0.005074905812416875}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":269.579,\\\"y\\\":169.682,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5000175261606971,\\\"y\\\":-0.8660152848143828}},{\\\"point\\\":{\\\"x\\\":450.922,\\\"y\\\":169.682,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.5000175261606971,\\\"y\\\":-0.8660152848143828}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":18.23,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.959,\\\"y\\\":656.488,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"2ED77EB3-CCAB-49AE-BD3F-C030696B61AE_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"77.19%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"star_7pt\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":33.255,\\\"max\\\":686.745},\\\"y\\\":{\\\"min\\\":23.059,\\\"max\\\":660.453}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"star_7pt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"7-pointed_star.svg\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 266.698 432.624 C 266.674 432.624 35.278 432.548 35.255 432.548 C 35.276 432.538 244.390 331.832 244.411 331.822 C 244.397 331.804 100.035 151.037 100.021 151.019 C 100.042 151.029 308.358 251.403 308.379 251.413 C 308.384 251.390 360.089 25.082 360.094 25.059 C 360.100 25.082 411.460 251.349 411.465 251.371 C 411.486 251.361 620.652 150.630 620.673 150.620 C 620.659 150.638 475.761 331.859 475.747 331.877 C 475.768 331.887 684.724 432.748 684.745 432.758 C 684.722 432.758 452.584 432.684 452.561 432.684 C 452.566 432.706 504.331 658.431 504.337 658.453 C 504.322 658.435 359.695 477.057 359.681 477.039 C 359.666 477.057 214.879 658.141 214.864 658.159 C 214.870 658.136 266.692 432.646 266.698 432.624 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 620.673 150.620 C 502.681 244.621 384.689 338.622 266.698 432.624 C 266.692 432.646 214.870 658.136 214.864 658.159 C 280.398 522.563 345.931 386.967 411.465 251.371 C 411.486 251.361 620.652 150.630 620.673 150.620 C 620.659 150.638 475.761 331.859 475.747 331.877 C 328.916 365.434 182.086 398.991 35.255 432.548 C 35.276 432.538 244.390 331.832 244.411 331.822 C 391.189 365.467 537.967 399.113 684.745 432.758 C 684.722 432.758 452.584 432.684 452.561 432.684 C 335.048 338.796 217.534 244.907 100.021 151.019 C 100.042 151.029 308.358 251.403 308.379 251.413 C 373.698 387.093 439.017 522.773 504.337 658.453 C 504.322 658.435 359.695 477.057 359.681 477.039 C 359.819 326.379 359.957 175.719 360.094 25.059 C 360.100 25.082 411.460 251.349 411.465 251.371 M 359.681 477.039 C 359.666 477.057 214.879 658.141 214.864 658.159 M 452.561 432.684 C 452.566 432.706 504.331 658.431 504.337 658.453 M 475.747 331.877 C 475.768 331.887 684.724 432.748 684.745 432.758 M 308.379 251.413 C 308.384 251.390 360.089 25.082 360.094 25.059 M 244.411 331.822 C 244.397 331.804 100.035 151.037 100.021 151.019 M 266.698 432.624 C 266.674 432.624 35.278 432.548 35.255 432.548 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":236.145,\\\"max\\\":483.855},\\\"y\\\":{\\\"min\\\":232.697,\\\"max\\\":480.407}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":703.512,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":32.303,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":109.181,\\\"y\\\":158.062,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7826094038835485,\\\"y\\\":-0.6225130689013982}},{\\\"point\\\":{\\\"x\\\":610.819,\\\"y\\\":158.062,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7826094038835497,\\\"y\\\":-0.6225130689013967}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":47.566,\\\"y\\\":429.559,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9743624804261366,\\\"y\\\":0.2249839032860498}},{\\\"point\\\":{\\\"x\\\":672.434,\\\"y\\\":429.559,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9743624804261367,\\\"y\\\":0.22498390328604922}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":221.113,\\\"y\\\":646.062,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.4320423847905757,\\\"y\\\":0.9018533016763159}},{\\\"point\\\":{\\\"x\\\":498.887,\\\"y\\\":646.062,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.432071241570124,\\\"y\\\":0.9018394769625311}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"star_7pt_bw\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":33.255,\\\"max\\\":686.745},\\\"y\\\":{\\\"min\\\":23.059,\\\"max\\\":660.453}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"star_7pt_BW\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"7-pointed_star.svg\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.959 358.150 360.049 136.101 360.094 25.059 C 360.100 25.082 411.460 251.349 411.465 251.371 C 394.296 286.975 359.964 358.173 359.959 358.183 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.933 358.163 186.667 220.074 100.021 151.019 C 100.042 151.029 308.358 251.403 308.379 251.413 C 325.572 287.003 359.954 358.173 359.959 358.183 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.947 358.181 282.927 340.609 244.411 331.822 C 244.390 331.832 35.276 432.538 35.255 432.548 C 143.490 407.760 359.926 358.191 359.959 358.183 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.944 358.213 263.229 558.167 214.864 658.159 C 214.870 658.136 266.692 432.646 266.698 432.624 C 297.785 407.810 359.950 358.191 359.959 358.183 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.973 358.213 456.211 558.363 504.337 658.453 C 504.322 658.435 359.695 477.057 359.681 477.039 C 359.773 437.421 359.959 358.195 359.959 358.183 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 684.745 432.758 C 576.483 407.900 359.991 358.191 359.959 358.183 C 359.968 358.191 421.694 407.850 452.561 432.684 C 452.584 432.684 684.722 432.758 684.745 432.758 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.971 358.181 437.151 340.646 475.747 331.877 C 475.761 331.859 620.659 150.638 620.673 150.620 C 533.768 219.808 359.985 358.163 359.959 358.183 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 452.561 432.684 C 421.694 407.850 359.968 358.191 359.959 358.183 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.973 358.213 456.211 558.363 504.337 658.453 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 452.561 432.684 C 421.694 407.850 359.968 358.191 359.959 358.183 C 359.973 358.213 456.211 558.363 504.337 658.453 C 504.331 658.431 452.566 432.706 452.561 432.684 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.971 358.181 437.151 340.646 475.747 331.877 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 684.745 432.758 C 576.483 407.900 359.991 358.191 359.959 358.183 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.971 358.181 437.151 340.646 475.747 331.877 C 475.768 331.887 684.724 432.748 684.745 432.758 C 576.483 407.900 359.991 358.191 359.959 358.183 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.465 251.371 C 394.296 286.975 359.964 358.173 359.959 358.183 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.985 358.163 533.768 219.808 620.673 150.620 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 411.465 251.371 C 394.296 286.975 359.964 358.173 359.959 358.183 C 359.985 358.163 533.768 219.808 620.673 150.620 C 620.652 150.630 411.486 251.361 411.465 251.371 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.944 358.213 263.229 558.167 214.864 658.159 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.681 477.039 C 359.773 437.421 359.959 358.195 359.959 358.183 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.944 358.213 263.229 558.167 214.864 658.159 C 214.879 658.141 359.666 477.057 359.681 477.039 C 359.773 437.421 359.959 358.195 359.959 358.183 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 266.698 432.624 C 297.785 407.810 359.950 358.191 359.959 358.183 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.926 358.191 143.490 407.760 35.255 432.548 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 266.698 432.624 C 297.785 407.810 359.950 358.191 359.959 358.183 C 359.926 358.191 143.490 407.760 35.255 432.548 C 35.278 432.548 266.674 432.624 266.698 432.624 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.933 358.163 186.667 220.074 100.021 151.019 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 244.411 331.822 C 282.927 340.609 359.947 358.181 359.959 358.183 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.933 358.163 186.667 220.074 100.021 151.019 C 100.035 151.037 244.397 331.804 244.411 331.822 C 282.927 340.609 359.947 358.181 359.959 358.183 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 308.379 251.413 C 325.572 287.003 359.954 358.173 359.959 358.183 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.959 358.183 C 359.959 358.150 360.049 136.101 360.094 25.059 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 308.379 251.413 C 325.572 287.003 359.954 358.173 359.959 358.183 C 359.959 358.150 360.049 136.101 360.094 25.059 C 360.089 25.082 308.384 251.390 308.379 251.413 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.094 25.059 C 360.100 25.082 411.460 251.349 411.465 251.371 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 620.673 150.620 C 620.659 150.638 475.761 331.859 475.747 331.877 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 684.745 432.758 C 684.722 432.758 452.584 432.684 452.561 432.684 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 504.337 658.453 C 504.322 658.435 359.695 477.057 359.681 477.039 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 214.864 658.159 C 214.870 658.136 266.692 432.646 266.698 432.624 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 35.255 432.548 C 35.276 432.538 244.390 331.832 244.411 331.822 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 100.021 151.019 C 100.042 151.029 308.358 251.403 308.379 251.413 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 308.379 251.413 C 308.384 251.390 360.089 25.082 360.094 25.059 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 244.411 331.822 C 244.397 331.804 100.035 151.037 100.021 151.019 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 266.698 432.624 C 266.674 432.624 35.278 432.548 35.255 432.548 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.681 477.039 C 359.666 477.057 214.879 658.141 214.864 658.159 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 452.561 432.684 C 452.566 432.706 504.331 658.431 504.337 658.453 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 475.747 331.877 C 475.768 331.887 684.724 432.748 684.745 432.758 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.465 251.371 C 411.486 251.361 620.652 150.630 620.673 150.620 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":236.145,\\\"max\\\":483.855},\\\"y\\\":{\\\"min\\\":232.697,\\\"max\\\":480.407}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":699.302,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":32.303,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":109.181,\\\"y\\\":158.062,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7826094038835485,\\\"y\\\":-0.6225130689013982}},{\\\"point\\\":{\\\"x\\\":610.819,\\\"y\\\":158.062,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7826094038835497,\\\"y\\\":-0.6225130689013967}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":47.566,\\\"y\\\":429.559,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9743624804261366,\\\"y\\\":0.2249839032860498}},{\\\"point\\\":{\\\"x\\\":672.434,\\\"y\\\":429.559,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9743624804261367,\\\"y\\\":0.22498390328604922}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":221.113,\\\"y\\\":646.062,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.4320423847905757,\\\"y\\\":0.9018533016763159}},{\\\"point\\\":{\\\"x\\\":498.887,\\\"y\\\":646.062,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.432071241570124,\\\"y\\\":0.9018394769625311}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":474.914,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"starburst\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":43.913,\\\"max\\\":676.087},\\\"y\\\":{\\\"min\\\":38.784,\\\"max\\\":670.958}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"starburst\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"starburst\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.000 670.958 C 360.002 670.943 376.946 519.474 376.948 519.459 C 376.953 519.473 423.807 664.538 423.812 664.552 C 423.811 664.537 409.272 512.905 409.271 512.890 C 409.278 512.903 483.189 646.159 483.197 646.172 C 483.192 646.157 438.951 500.398 438.947 500.383 C 438.957 500.395 536.885 617.065 536.895 617.076 C 536.888 617.063 465.325 482.610 465.318 482.597 C 465.330 482.607 583.639 578.512 583.651 578.522 C 583.641 578.510 487.735 460.201 487.726 460.189 C 487.739 460.196 622.192 531.759 622.205 531.767 C 622.193 531.757 505.523 433.828 505.512 433.818 C 505.526 433.823 651.286 478.063 651.301 478.068 C 651.287 478.060 518.032 404.150 518.019 404.142 C 518.034 404.144 669.666 418.682 669.681 418.683 C 669.667 418.679 524.602 371.824 524.588 371.819 C 524.603 371.818 676.072 354.873 676.087 354.871 C 676.072 354.870 524.603 337.925 524.588 337.923 C 524.602 337.918 669.667 291.064 669.681 291.059 C 669.666 291.061 518.034 305.599 518.019 305.600 C 518.032 305.593 651.287 231.682 651.301 231.675 C 651.286 231.679 505.526 275.920 505.512 275.924 C 505.523 275.915 622.193 177.986 622.205 177.976 C 622.192 177.983 487.739 249.546 487.726 249.554 C 487.735 249.542 583.641 131.232 583.651 131.221 C 583.639 131.230 465.330 227.136 465.318 227.145 C 465.325 227.132 536.888 92.680 536.895 92.666 C 536.886 92.678 438.957 209.348 438.947 209.359 C 438.951 209.345 483.192 63.585 483.197 63.570 C 483.189 63.584 409.278 196.839 409.271 196.852 C 409.272 196.837 423.811 45.205 423.812 45.190 C 423.807 45.205 376.953 190.269 376.948 190.284 C 376.946 190.269 360.002 38.799 360.000 38.784 C 359.998 38.799 343.054 190.269 343.052 190.284 C 343.047 190.269 296.193 45.205 296.188 45.190 C 296.189 45.205 310.728 196.837 310.729 196.852 C 310.722 196.839 236.811 63.584 236.804 63.570 C 236.808 63.585 281.049 209.345 281.053 209.359 C 281.043 209.348 183.115 92.678 183.105 92.666 C 183.112 92.680 254.675 227.132 254.682 227.145 C 254.671 227.136 136.361 131.230 136.349 131.221 C 136.359 131.232 232.265 249.541 232.274 249.553 C 232.261 249.546 97.808 177.983 97.795 177.976 C 97.807 177.986 214.477 275.915 214.488 275.924 C 214.474 275.920 68.714 231.679 68.699 231.675 C 68.713 231.682 201.968 305.593 201.981 305.600 C 201.966 305.599 50.334 291.061 50.319 291.059 C 50.334 291.064 195.398 337.918 195.413 337.923 C 195.397 337.925 43.928 354.870 43.913 354.871 C 43.928 354.873 195.397 371.818 195.413 371.819 C 195.398 371.824 50.334 418.679 50.319 418.683 C 50.334 418.682 201.966 404.144 201.981 404.142 C 201.968 404.150 68.713 478.060 68.699 478.068 C 68.714 478.063 214.474 433.823 214.488 433.818 C 214.477 433.828 97.807 531.756 97.795 531.766 C 97.808 531.759 232.261 460.196 232.274 460.189 C 232.265 460.201 136.359 578.510 136.349 578.522 C 136.361 578.512 254.670 482.607 254.682 482.597 C 254.675 482.610 183.112 617.063 183.105 617.076 C 183.114 617.065 281.043 500.395 281.053 500.383 C 281.049 500.398 236.808 646.157 236.804 646.172 C 236.811 646.159 310.722 512.903 310.729 512.890 C 310.728 512.905 296.189 664.537 296.188 664.552 C 296.193 664.538 343.047 519.473 343.052 519.459 C 343.054 519.474 359.998 670.943 360.000 670.958 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":223.405,\\\"max\\\":496.595},\\\"y\\\":{\\\"min\\\":217.25,\\\"max\\\":490.441}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":698.262,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":25.12,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":32.423,\\\"y\\\":354.782,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088756288}},{\\\"point\\\":{\\\"x\\\":688.623,\\\"y\\\":354.782,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.005035854088756315}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":593.334,\\\"y\\\":587.639,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129329685826651,\\\"y\\\":0.7012321885851422}},{\\\"point\\\":{\\\"x\\\":127.799,\\\"y\\\":587.687,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986883991125066,\\\"y\\\":0.7154261114507933}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":592.835,\\\"y\\\":122.031,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314454286031296,\\\"y\\\":-0.7754203187279851}},{\\\"point\\\":{\\\"x\\\":127.956,\\\"y\\\":122.11,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817850569385171,\\\"y\\\":-0.7315525518616848}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":685.863,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"stars_7\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":50.782,\\\"max\\\":667.055},\\\"y\\\":{\\\"min\\\":19.14,\\\"max\\\":633.091}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"stars_7\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"stars\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 171.807 172.578 C 171.800 172.579 95.690 182.852 95.682 182.853 C 95.689 182.849 159.984 140.419 159.991 140.415 C 159.985 140.410 104.459 87.381 104.454 87.376 C 104.461 87.378 177.444 111.119 177.451 111.122 C 177.452 111.114 184.385 34.380 184.386 34.372 C 184.389 34.380 211.351 106.513 211.354 106.520 C 211.360 106.516 275.672 64.076 275.679 64.072 C 275.675 64.078 236.084 130.131 236.080 130.138 C 236.087 130.140 309.302 154.014 309.309 154.016 C 309.302 154.017 232.948 164.324 232.941 164.325 C 232.943 164.332 260.015 236.269 260.018 236.276 C 260.012 236.271 204.372 183.053 204.366 183.047 C 204.362 183.054 164.801 249.057 164.797 249.063 C 164.798 249.056 171.807 172.585 171.807 172.578 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 364.701 376.437 C 364.692 376.435 270.623 360.488 270.614 360.486 C 270.623 360.483 362.565 333.925 362.574 333.922 C 362.570 333.914 316.313 250.494 316.309 250.486 C 316.317 250.491 394.103 305.627 394.111 305.632 C 394.115 305.623 430.702 217.175 430.705 217.166 C 430.706 217.175 436.022 312.697 436.023 312.706 C 436.032 312.704 527.998 286.139 528.007 286.136 C 528.000 286.142 456.626 349.851 456.619 349.857 C 456.627 349.863 534.641 405.241 534.649 405.247 C 534.639 405.245 440.269 389.247 440.260 389.246 C 440.260 389.255 445.779 484.583 445.779 484.593 C 445.774 484.585 399.452 400.898 399.448 400.889 C 399.441 400.896 328.122 464.556 328.115 464.563 C 328.118 464.554 364.697 376.446 364.701 376.437 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 442.057 100.775 C 442.052 100.775 396.839 100.760 396.835 100.760 C 396.839 100.758 437.698 81.081 437.702 81.079 C 437.699 81.075 409.492 45.755 409.489 45.752 C 409.493 45.753 450.197 65.366 450.201 65.368 C 450.202 65.363 460.305 21.144 460.306 21.140 C 460.307 21.144 470.342 65.355 470.343 65.360 C 470.347 65.358 511.217 45.675 511.221 45.673 C 511.218 45.677 482.906 81.086 482.903 81.090 C 482.907 81.092 523.736 100.799 523.740 100.801 C 523.736 100.801 478.378 100.787 478.373 100.787 C 478.374 100.791 488.489 144.896 488.490 144.900 C 488.487 144.897 460.228 109.457 460.225 109.454 C 460.222 109.457 431.932 144.840 431.929 144.843 C 431.930 144.839 442.056 100.780 442.057 100.775 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 589.975 227.446 C 589.971 227.446 548.413 224.530 548.409 224.530 C 548.413 224.528 587.233 209.064 587.237 209.063 C 587.234 209.059 563.574 174.783 563.572 174.780 C 563.576 174.782 599.730 195.421 599.734 195.423 C 599.735 195.419 611.860 155.423 611.861 155.419 C 611.862 155.423 618.248 196.705 618.248 196.709 C 618.252 196.708 657.082 181.240 657.086 181.238 C 657.083 181.241 628.787 211.971 628.784 211.974 C 628.787 211.976 665.051 232.712 665.055 232.714 C 665.050 232.714 623.360 229.789 623.355 229.788 C 623.356 229.792 629.822 270.981 629.822 270.986 C 629.820 270.982 606.120 236.593 606.118 236.589 C 606.115 236.593 577.840 267.299 577.837 267.302 C 577.838 267.298 589.974 227.450 589.975 227.446 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 536.262 572.824 C 536.257 572.824 491.044 572.809 491.040 572.809 C 491.044 572.807 531.903 553.130 531.907 553.128 C 531.904 553.124 503.697 517.804 503.694 517.801 C 503.699 517.803 544.402 537.415 544.406 537.417 C 544.407 537.412 554.510 493.193 554.511 493.189 C 554.512 493.193 564.547 537.404 564.548 537.409 C 564.552 537.407 605.422 517.724 605.426 517.722 C 605.423 517.726 577.111 553.135 577.109 553.139 C 577.113 553.141 617.941 572.849 617.945 572.851 C 617.941 572.851 572.583 572.836 572.578 572.836 C 572.579 572.840 582.694 616.945 582.695 616.949 C 582.692 616.946 554.433 581.506 554.430 581.503 C 554.427 581.506 526.137 616.889 526.134 616.892 C 526.135 616.888 536.261 572.829 536.262 572.824 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 92.087 373.994 C 92.083 373.994 52.785 373.981 52.782 373.981 C 52.785 373.980 88.298 356.877 88.302 356.875 C 88.299 356.872 63.783 326.173 63.780 326.170 C 63.784 326.172 99.162 343.218 99.165 343.220 C 99.166 343.216 107.947 304.783 107.948 304.779 C 107.949 304.783 116.671 343.209 116.672 343.213 C 116.675 343.211 152.198 326.104 152.201 326.102 C 152.199 326.105 127.591 356.882 127.589 356.885 C 127.592 356.886 163.079 374.015 163.082 374.017 C 163.078 374.017 123.655 374.004 123.651 374.004 C 123.652 374.008 132.443 412.342 132.444 412.346 C 132.441 412.343 107.880 381.540 107.877 381.537 C 107.875 381.540 83.286 412.293 83.284 412.296 C 83.285 412.292 92.086 373.998 92.087 373.994 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 201.013 577.509 C 201.008 577.509 147.505 583.902 147.500 583.903 C 147.504 583.900 193.063 554.823 193.068 554.820 C 193.064 554.816 154.678 517.021 154.675 517.017 C 154.680 517.019 205.625 534.454 205.630 534.456 C 205.631 534.451 211.316 480.694 211.316 480.689 C 211.318 480.694 229.461 531.586 229.463 531.591 C 229.467 531.588 275.038 502.503 275.043 502.500 C 275.040 502.505 246.559 548.419 246.556 548.424 C 246.561 548.425 297.668 565.957 297.673 565.958 C 297.668 565.959 243.994 572.373 243.988 572.373 C 243.990 572.379 262.212 623.134 262.214 623.139 C 262.210 623.135 223.746 585.206 223.742 585.202 C 223.739 585.207 195.280 631.086 195.277 631.091 C 195.278 631.085 201.013 577.514 201.013 577.509 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":688.247,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":341.569,\\\"y\\\":33.894,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":95.105,\\\"y\\\":505.563,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987246277952555,\\\"y\\\":0.7153907285619387}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":601.703,\\\"y\\\":356.909,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872484878887,\\\"y\\\":0.0050500358039859755}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":582.291,\\\"y\\\":102.954,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314463125054729,\\\"y\\\":-0.7754195989419154}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":387.647,\\\"y\\\":566.847,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"],\\\"creature_frequency_multiplier\\\":3}},{\\\"name\\\":\\\"stars_circle\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":64.355,\\\"max\\\":655.645},\\\"y\\\":{\\\"min\\\":29.782,\\\"max\\\":621.073}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"stars_circle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"stars_circle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 470.726 134.081 C 470.722 134.082 432.809 138.297 432.805 138.298 C 432.808 138.295 461.003 112.600 461.005 112.598 C 461.004 112.594 445.279 77.840 445.277 77.836 C 445.280 77.838 478.430 96.712 478.434 96.714 C 478.437 96.711 506.631 71.017 506.634 71.014 C 506.633 71.018 498.926 108.377 498.925 108.381 C 498.929 108.383 532.079 127.257 532.082 127.259 C 532.078 127.259 494.166 131.475 494.162 131.475 C 494.161 131.479 486.455 168.839 486.454 168.843 C 486.452 168.840 470.727 134.085 470.726 134.081 M 249.652 516.992 C 249.651 516.988 234.345 482.047 234.343 482.043 C 234.343 482.047 226.187 519.312 226.187 519.315 C 226.183 519.316 188.222 523.075 188.218 523.075 C 188.222 523.077 221.142 542.349 221.145 542.351 C 221.145 542.355 212.989 579.619 212.988 579.623 C 212.991 579.620 241.492 554.266 241.495 554.264 C 241.498 554.266 274.419 573.537 274.422 573.539 C 274.421 573.536 259.115 538.595 259.114 538.591 C 259.117 538.589 287.618 513.234 287.621 513.232 C 287.617 513.232 249.656 516.991 249.652 516.992 M 551.564 215.080 C 551.561 215.078 516.620 199.772 516.616 199.771 C 516.620 199.770 553.884 191.615 553.888 191.614 C 553.888 191.610 557.648 153.649 557.648 153.646 C 557.650 153.649 576.922 186.569 576.923 186.573 C 576.927 186.572 614.191 178.416 614.195 178.416 C 614.193 178.419 588.839 206.920 588.836 206.923 C 588.838 206.926 608.110 239.846 608.112 239.850 C 608.108 239.848 573.167 224.543 573.164 224.541 C 573.161 224.544 547.807 253.045 547.804 253.048 C 547.805 253.044 551.564 215.083 551.564 215.080 M 168.654 436.153 C 168.654 436.149 172.870 398.236 172.870 398.233 C 172.868 398.235 147.173 426.430 147.170 426.433 C 147.167 426.431 112.412 410.706 112.409 410.705 C 112.411 410.708 131.285 443.858 131.287 443.861 C 131.284 443.864 105.589 472.058 105.587 472.061 C 105.590 472.060 142.950 464.354 142.954 464.353 C 142.956 464.356 161.830 497.506 161.832 497.509 C 161.832 497.506 166.048 459.593 166.048 459.589 C 166.052 459.589 203.412 451.882 203.416 451.881 C 203.412 451.880 168.658 436.155 168.654 436.153 M 581.073 325.646 C 581.071 325.643 558.464 294.917 558.462 294.914 C 558.466 294.915 594.815 306.485 594.819 306.486 C 594.821 306.483 617.057 275.487 617.059 275.484 C 617.059 275.488 617.288 313.634 617.288 313.638 C 617.292 313.639 653.642 325.208 653.645 325.209 C 653.642 325.210 617.434 337.216 617.430 337.217 C 617.430 337.221 617.660 375.367 617.660 375.371 C 617.658 375.368 595.051 344.642 595.048 344.639 C 595.045 344.640 558.837 356.646 558.833 356.647 C 558.835 356.644 581.071 325.649 581.073 325.646 M 138.927 325.646 C 138.929 325.643 161.536 294.917 161.538 294.914 C 161.534 294.915 125.185 306.485 125.181 306.486 C 125.179 306.483 102.943 275.487 102.941 275.484 C 102.941 275.488 102.712 313.634 102.712 313.638 C 102.708 313.639 66.358 325.208 66.355 325.209 C 66.358 325.210 102.566 337.216 102.570 337.217 C 102.570 337.221 102.340 375.367 102.340 375.371 C 102.342 375.368 124.950 344.642 124.952 344.639 C 124.955 344.640 161.163 356.646 161.167 356.647 C 161.165 356.644 138.929 325.649 138.927 325.646 M 551.346 436.153 C 551.346 436.149 547.130 398.236 547.130 398.233 C 547.132 398.235 572.827 426.430 572.830 426.433 C 572.833 426.431 607.588 410.706 607.591 410.705 C 607.589 410.708 588.715 443.858 588.713 443.861 C 588.716 443.864 614.411 472.058 614.413 472.061 C 614.410 472.060 577.050 464.354 577.046 464.353 C 577.044 464.356 558.170 497.506 558.168 497.509 C 558.168 497.506 553.953 459.593 553.952 459.589 C 553.948 459.589 516.588 451.882 516.584 451.881 C 516.588 451.880 551.343 436.155 551.346 436.153 M 168.436 215.080 C 168.439 215.078 203.380 199.772 203.384 199.771 C 203.380 199.770 166.116 191.615 166.112 191.614 C 166.112 191.610 162.352 153.649 162.352 153.646 C 162.350 153.649 143.078 186.569 143.077 186.573 C 143.073 186.572 105.809 178.416 105.805 178.416 C 105.807 178.419 131.161 206.920 131.164 206.923 C 131.162 206.926 111.890 239.846 111.888 239.850 C 111.892 239.848 146.833 224.543 146.836 224.541 C 146.839 224.544 172.193 253.045 172.196 253.048 C 172.195 253.044 168.436 215.083 168.436 215.080 M 470.348 516.992 C 470.349 516.988 485.655 482.047 485.657 482.043 C 485.658 482.047 493.813 519.312 493.813 519.315 C 493.817 519.316 531.778 523.075 531.782 523.075 C 531.778 523.077 498.858 542.349 498.855 542.351 C 498.855 542.355 507.011 579.619 507.012 579.623 C 507.009 579.620 478.508 554.266 478.505 554.264 C 478.502 554.266 445.581 573.537 445.578 573.539 C 445.579 573.536 460.885 538.595 460.886 538.591 C 460.884 538.589 432.382 513.234 432.379 513.232 C 432.383 513.232 470.344 516.991 470.348 516.992 M 249.274 134.081 C 249.278 134.082 287.191 138.297 287.195 138.298 C 287.192 138.295 258.998 112.600 258.995 112.598 C 258.996 112.594 274.721 77.840 274.723 77.836 C 274.720 77.838 241.570 96.712 241.566 96.714 C 241.563 96.711 213.369 71.017 213.366 71.014 C 213.367 71.018 221.074 108.377 221.075 108.381 C 221.071 108.383 187.921 127.257 187.918 127.259 C 187.922 127.259 225.834 131.475 225.838 131.475 C 225.839 131.479 233.545 168.839 233.546 168.843 C 233.548 168.840 249.273 134.085 249.274 134.081 M 359.782 546.501 C 359.785 546.499 390.511 523.892 390.514 523.889 C 390.513 523.893 378.943 560.242 378.942 560.246 C 378.945 560.248 409.940 582.484 409.943 582.486 C 409.940 582.486 371.794 582.716 371.790 582.716 C 371.789 582.719 360.219 619.069 360.218 619.073 C 360.217 619.069 348.211 582.861 348.210 582.858 C 348.206 582.858 310.060 583.087 310.057 583.087 C 310.060 583.085 340.785 560.478 340.788 560.476 C 340.787 560.472 328.781 524.264 328.780 524.260 C 328.783 524.263 359.779 546.499 359.782 546.501 M 359.782 104.354 C 359.785 104.356 390.511 126.963 390.514 126.966 C 390.513 126.962 378.943 90.612 378.942 90.609 C 378.945 90.606 409.940 68.371 409.943 68.368 C 409.940 68.368 371.794 68.139 371.790 68.139 C 371.789 68.135 360.219 31.786 360.218 31.782 C 360.217 31.786 348.211 67.993 348.210 67.997 C 348.206 67.997 310.060 67.768 310.057 67.768 C 310.060 67.770 340.785 90.377 340.788 90.379 C 340.787 90.383 328.781 126.591 328.780 126.594 C 328.783 126.592 359.779 104.356 359.782 104.354 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":218.334,\\\"max\\\":501.666},\\\"y\\\":{\\\"min\\\":183.762,\\\"max\\\":467.093}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":697.501,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":30.619,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":65.752,\\\"y\\\":326.266,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873116587557,\\\"y\\\":0.005037511438695412}},{\\\"point\\\":{\\\"x\\\":654.248,\\\"y\\\":326.266,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873116587554,\\\"y\\\":0.005037511438695441}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":568.666,\\\"y\\\":535.097,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128640217154969,\\\"y\\\":0.7013022790092783}},{\\\"point\\\":{\\\"x\\\":151.163,\\\"y\\\":535.14,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698716918350251,\\\"y\\\":0.7153982583226832}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":568.812,\\\"y\\\":117.531,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314192494108103,\\\"y\\\":-0.7754416364069503}},{\\\"point\\\":{\\\"x\\\":151.897,\\\"y\\\":117.602,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817266038392232,\\\"y\\\":-0.7316070240353347}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":622.186,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_be_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"strength\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":94.991,\\\"max\\\":639.0572011138785},\\\"y\\\":{\\\"min\\\":194.15091549469076,\\\"max\\\":606.3369380062552}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"strength\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"strength\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 489.640 530.288 C 484.682 567.938 505.845 580.208 505.847 580.213 C 505.842 580.213 469.927 574.752 454.455 583.424 C 446.345 587.970 437.754 604.622 437.752 604.624 C 437.768 604.624 589.132 605.266 589.147 605.267 C 589.146 605.250 645.667 514.395 584.862 436.922 C 583.405 438.928 497.770 468.550 489.640 530.288 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 374.336 431.360 C 374.335 431.358 359.598 412.607 359.597 412.605 C 359.599 412.605 383.429 413.557 383.432 413.557 C 383.431 413.559 374.337 431.359 374.336 431.360 M 354.173 450.375 C 354.172 450.372 347.869 427.372 347.868 427.370 C 347.870 427.371 369.463 437.496 369.465 437.497 C 369.463 437.498 354.174 450.373 354.173 450.375 M 329.976 461.445 C 329.976 461.443 330.977 437.615 330.977 437.613 C 330.979 437.614 348.462 453.836 348.464 453.837 C 348.462 453.838 329.978 461.445 329.976 461.445 M 304.098 468.224 C 304.098 468.221 308.453 444.773 308.453 444.770 C 308.455 444.772 323.473 463.299 323.474 463.301 C 323.472 463.302 304.099 468.223 304.098 468.224 M 360.960 328.513 C 360.960 328.515 351.293 350.318 351.292 350.320 C 351.295 350.319 374.157 343.530 374.159 343.529 C 374.158 343.528 360.962 328.514 360.960 328.513 M 336.736 315.048 C 336.736 315.051 336.290 338.896 336.290 338.898 C 336.292 338.896 354.727 323.766 354.728 323.765 C 354.727 323.764 336.738 315.049 336.736 315.048 M 310.559 310.276 C 310.559 310.278 317.396 333.126 317.397 333.129 C 317.398 333.127 330.349 313.101 330.351 313.099 C 330.349 313.098 310.561 310.276 310.559 310.276 M 283.808 310.078 C 283.809 310.081 293.803 331.735 293.804 331.737 C 293.805 331.735 303.799 310.081 303.800 310.078 C 303.798 310.078 283.810 310.078 283.808 310.078 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 372.872 470.326 C 389.245 535.833 368.375 582.771 368.375 582.782 C 368.373 582.782 351.213 577.424 343.964 581.498 C 336.208 585.856 331.759 604.622 331.758 604.624 C 331.764 604.624 388.284 603.982 388.290 603.982 C 388.293 603.972 414.238 559.961 419.125 508.673 C 420.416 509.579 394.733 478.110 372.872 470.326 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 609.876 436.922 C 561.670 375.501 538.691 422.770 453.772 313.581 C 445.346 355.912 437.431 430.488 389.532 470.326 C 404.366 548.019 385.036 582.771 385.035 582.782 C 385.033 582.782 367.874 577.424 360.624 581.498 C 352.869 585.856 348.419 604.622 348.418 604.624 C 348.424 604.624 404.944 603.982 404.950 603.982 C 404.953 603.972 436.339 560.190 435.785 508.673 C 470.635 521.695 485.663 504.360 514.654 530.288 C 507.121 568.682 530.859 580.208 530.861 580.213 C 530.855 580.213 494.941 574.752 479.468 583.424 C 471.359 587.970 462.768 604.622 462.766 604.624 C 462.781 604.624 614.145 605.266 614.160 605.267 C 614.160 605.250 670.680 514.395 609.876 436.922 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 393.517 545.753 C 377.015 533.868 361.333 516.997 368.786 486.846 C 377.476 453.150 428.306 434.069 430.739 374.619 C 433.147 315.772 379.573 284.649 358.345 281.019 C 416.185 213.260 488.056 314.716 528.899 294.332 C 529.004 307.324 515.657 317.606 499.293 318.571 C 525.209 323.917 521.197 352.637 546.956 352.908 C 538.055 362.351 534.606 365.471 516.306 359.448 C 543.238 391.340 507.616 405.488 520.865 435.317 C 507.460 430.869 502.544 427.588 500.908 409.091 C 502.747 457.627 468.756 461.248 472.420 492.350 C 463.180 483.265 453.181 475.954 458.516 456.581 C 427.787 514.702 394.793 494.178 393.517 545.753 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 624.275 585.219 C 605.361 589.841 550.870 591.560 550.775 548.700 C 550.710 518.815 587.038 507.610 570.537 474.406 C 567.216 478.381 562.150 479.286 557.241 479.963 C 574.722 504.438 535.418 513.880 536.000 551.912 C 536.504 584.875 551.028 606.738 614.662 605.267 C 618.528 598.268 620.477 593.600 624.275 585.219 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 435.858 256.157 C 410.770 256.420 393.773 278.500 393.769 278.502 C 393.771 278.504 408.543 284.466 420.226 300.126 C 428.412 292.987 449.676 286.440 435.858 256.157 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 410.550 278.790 C 416.239 268.715 423.706 264.685 430.818 262.433 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 242.646 407.224 C 219.512 407.136 243.901 342.386 267.398 349.625 C 281.055 353.832 280.259 335.089 295.221 341.395 C 308.970 347.191 313.556 333.255 323.736 343.550 C 330.340 350.230 339.984 343.056 342.495 352.286 C 345.549 363.512 353.203 361.842 348.987 373.022 C 344.834 384.032 355.594 402.168 329.857 396.256 C 308.463 391.342 264.372 407.306 242.646 407.224 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 287.205 405.598 C 291.426 411.739 301.015 418.126 313.934 415.883 C 321.842 414.509 329.105 410.107 329.107 410.106 C 329.107 410.107 336.672 414.435 336.673 414.435 C 336.673 414.432 341.157 392.971 340.358 382.167 C 339.013 363.984 328.404 355.265 312.116 355.885 C 291.266 356.679 284.514 373.039 279.239 387.248 C 274.680 388.964 266.001 393.825 265.679 391.925 C 259.049 352.859 240.494 344.250 240.974 289.926 C 265.250 293.666 306.675 283.131 306.678 283.131 C 306.679 283.131 323.103 281.602 323.105 281.602 C 323.100 281.601 304.530 266.301 278.286 276.645 C 259.876 269.530 243.621 266.653 220.911 268.671 C 210.560 304.222 208.878 336.851 218.956 385.789 C 177.693 469.344 123.038 431.548 103.174 482.772 C 80.479 541.292 142.018 566.012 210.035 568.136 C 142.066 567.708 107.254 598.343 95.991 604.832 C 119.845 602.393 272.860 604.145 272.877 604.145 C 272.879 604.145 287.155 604.640 290.307 604.345 C 289.925 559.038 251.443 508.279 196.451 499.033 C 212.895 497.738 235.308 492.491 249.354 475.326 C 253.338 517.406 270.105 536.399 279.041 547.813 C 294.900 534.258 304.289 511.666 308.025 498.842 C 342.695 503.309 350.566 486.545 350.570 486.544 C 350.568 486.544 332.587 487.178 332.585 487.178 C 332.582 487.178 304.569 487.533 304.566 487.533 C 304.564 487.535 287.590 496.087 283.290 511.872 C 277.933 476.023 295.258 452.867 273.373 417.572 C 271.448 414.467 282.448 409.239 287.205 405.598 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 272.877 604.145 C 271.253 560.904 226.645 513.399 169.070 506.482 M 313.834 385.419 C 321.133 392.030 329.673 390.377 335.733 385.419 M 308.876 406.078 C 310.471 410.925 311.986 413.786 313.934 415.883 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 233.404 466.952 C 233.712 459.562 239.922 453.849 247.312 454.157 C 254.702 454.465 260.415 460.675 260.107 468.065 C 259.799 475.455 253.589 481.168 246.199 480.860 C 238.809 480.552 233.096 474.342 233.404 466.952 M 211.192 438.322 C 211.500 430.933 217.710 425.220 225.099 425.528 C 232.489 425.836 238.202 432.045 237.894 439.435 C 237.586 446.825 231.377 452.538 223.987 452.230 C 216.597 451.922 210.884 445.712 211.192 438.322 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S14\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 306.086 350.454 C 331.535 350.586 345.046 363.185 340.955 365.988 C 310.580 386.802 305.886 348.724 278.984 382.844 C 270.600 393.479 263.276 372.593 263.285 369.954 C 263.305 363.844 274.730 350.292 306.086 350.454 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 332.585 487.178 C 331.495 491.038 323.503 492.845 318.435 492.724 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S16\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 306.678 283.131 C 304.180 279.355 296.399 279.598 288.814 280.727 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 368.786 486.846 C 377.476 453.150 428.306 434.069 430.739 374.619 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 430.739 374.619 C 433.147 315.772 379.573 284.649 358.345 281.019 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 358.345 281.019 C 338.681 277.657 297.731 284.972 297.725 284.972 C 291.577 286.108 277.615 288.687 277.612 288.688 C 277.613 288.689 279.669 305.952 279.669 305.954 C 279.669 305.955 281.228 319.043 281.229 319.044 C 281.238 319.050 364.286 299.359 379.552 379.006 C 393.255 450.506 299.853 463.092 299.845 463.100 C 299.846 463.103 303.501 487.229 303.502 487.231 C 303.508 487.231 327.465 486.073 368.786 486.846 C 377.476 453.150 428.306 434.069 430.739 374.619 C 433.147 315.772 379.573 284.649 358.345 281.019 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 363.496 291.557 C 374.698 294.187 381.444 307.413 381.446 307.414 C 381.444 307.415 369.517 316.256 358.314 313.625 C 347.111 310.995 340.365 297.770 340.364 297.768 C 340.366 297.768 352.293 288.927 363.496 291.557 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 360.653 295.084 C 364.687 295.084 367.942 298.339 367.942 302.373 C 367.942 306.408 364.687 309.662 360.653 309.662 C 356.618 309.662 353.364 306.408 353.364 302.373 C 353.364 298.339 356.618 295.084 360.653 295.084 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 279.669 305.954 C 293.155 301.093 297.040 294.455 297.725 284.972 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.982 235.512 C 347.685 233.926 330.464 220.166 330.461 220.164 C 330.786 219.960 352.078 204.726 361.519 204.963 C 367.105 205.103 376.781 210.441 376.890 219.757 C 377.028 231.501 365.961 236.283 359.982 235.512 M 363.633 245.310 C 349.315 245.498 335.497 236.252 322.234 226.357 C 309.214 236.080 295.272 245.500 280.822 245.310 C 266.380 245.121 257.528 229.581 257.574 220.718 C 257.632 209.559 266.485 194.647 282.935 195.164 C 296.041 195.575 309.753 204.806 322.257 214.036 C 334.952 204.637 348.533 195.572 361.519 195.164 C 377.970 194.647 386.823 209.559 386.881 220.718 C 386.927 229.581 378.075 245.121 363.633 245.310 M 284.473 235.512 C 292.704 234.292 302.898 228.372 313.983 220.156 C 302.917 211.872 292.468 204.723 282.935 204.963 C 277.350 205.103 267.674 210.441 267.565 219.757 C 267.427 231.501 279.311 236.277 284.473 235.512 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.234 226.357 C 325.089 224.224 330.364 220.225 330.461 220.164 M 313.983 220.156 C 316.679 218.154 319.432 216.080 322.257 214.036 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 548.049 479.262 C 531.631 469.833 545.345 459.401 527.006 447.200 C 534.412 444.557 544.444 443.575 547.836 458.433 C 550.701 442.293 534.481 441.611 541.781 420.862 C 546.412 436.453 561.515 426.850 562.164 453.624 C 566.154 445.275 556.372 440.171 572.617 429.213 C 570.030 454.301 584.285 450.387 574.895 472.487 C 572.244 478.726 555.470 483.524 548.049 479.262 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S23_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 331.733 365.704 C 337.605 361.696 328.296 353.961 328.296 353.959 C 328.297 353.959 340.400 353.884 338.403 347.061 C 336.405 340.238 326.172 346.701 326.171 346.701 C 326.171 346.700 329.840 335.166 322.733 334.957 C 315.627 334.748 318.612 346.477 318.611 346.478 C 318.610 346.478 308.774 339.424 306.379 346.119 C 303.984 352.813 316.063 353.599 316.064 353.600 C 316.063 353.601 306.315 360.775 311.941 365.121 C 317.568 369.468 322.048 358.223 322.049 358.223 C 322.050 358.224 325.861 369.712 331.733 365.704 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S24_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 322.238 347.155 C 324.805 347.155 326.875 349.226 326.875 351.792 C 326.875 354.359 324.805 356.429 322.238 356.429 C 319.672 356.429 317.601 354.359 317.601 351.792 C 317.601 349.226 319.672 347.155 322.238 347.155 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":639.482,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":326.242,\\\"y\\\":175.474,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":13.948,\\\"y\\\":592.238,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.00506719125610081,\\\"y\\\":-0.9999871617039762}},{\\\"point\\\":{\\\"x\\\":706.052,\\\"y\\\":592.238,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005067191256096228,\\\"y\\\":-0.9999871617039762}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":600.531,\\\"y\\\":353.827,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314672998451968,\\\"y\\\":-0.7754025078797567}},{\\\"point\\\":{\\\"x\\\":138.404,\\\"y\\\":353.905,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817074726391847,\\\"y\\\":-0.731624850417135}}]},\\\"meta\\\":{\\\"attach_to\\\":[],\\\"never_be_nested\\\":true,\\\"rotate_clockwise\\\":true}},{\\\"name\\\":\\\"sun\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":8.311,\\\"max\\\":711.689},\\\"y\\\":{\\\"min\\\":3.173,\\\"max\\\":706.552}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sun\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sun\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#BD4A545D-D341-487F-9EF7-119C2041145E_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.861 543.067 C 359.862 543.071 358.083 562.836 364.592 578.435 C 374.517 602.221 390.617 603.492 398.849 620.711 C 404.597 632.734 400.169 643.926 407.411 657.727 C 418.132 678.156 446.165 698.474 446.169 698.478 C 446.168 698.473 431.850 672.248 432.797 652.711 C 433.757 632.889 452.228 624.735 450.835 607.824 C 449.507 591.711 431.184 589.771 427.067 568.328 C 423.456 549.518 433.225 528.367 433.226 528.363 C 433.227 528.366 438.852 547.410 450.713 559.430 C 468.710 577.668 484.155 572.639 498.116 585.486 C 507.915 594.503 507.798 606.635 519.622 616.771 C 537.034 631.696 570.488 639.950 570.493 639.952 C 570.490 639.948 547.081 621.324 540.385 602.929 C 533.633 584.378 547.405 569.815 539.672 554.813 C 532.255 540.425 514.592 545.608 502.597 527.334 C 492.110 511.356 493.069 488.131 493.068 488.127 C 493.070 488.129 505.367 503.721 520.848 510.452 C 544.313 520.655 556.755 510.216 574.479 516.914 C 586.936 521.621 591.353 532.926 606.107 537.912 C 627.822 545.251 661.922 540.397 661.928 540.397 C 661.924 540.395 633.255 531.861 620.171 517.300 C 606.968 502.605 614.299 483.944 601.515 472.904 C 589.269 462.328 574.822 473.705 556.886 461.224 C 541.175 450.290 533.394 428.348 533.392 428.344 C 533.395 428.345 550.720 438.024 567.598 438.342 C 593.230 438.825 600.786 424.553 619.759 423.897 C 633.056 423.438 641.526 431.999 657.046 430.867 C 679.988 429.193 709.684 411.555 709.689 411.553 C 709.685 411.553 679.899 414.196 662.335 405.537 C 644.466 396.726 644.306 376.513 628.186 371.005 C 612.911 365.786 603.790 381.688 582.537 376.843 C 563.745 372.559 548.208 355.004 548.204 355.002 C 548.208 355.001 567.974 356.780 583.572 350.271 C 607.358 340.346 608.629 324.246 625.848 316.014 C 637.871 310.266 649.063 314.694 662.865 307.452 C 683.293 296.731 703.611 268.697 703.615 268.694 C 703.610 268.695 677.385 283.013 657.848 282.066 C 638.026 281.106 629.872 262.635 612.962 264.028 C 596.848 265.356 594.908 283.679 573.466 287.796 C 554.655 291.407 533.504 281.638 533.500 281.637 C 533.503 281.635 552.547 276.011 564.567 264.150 C 582.805 246.153 577.776 230.708 590.623 216.747 C 599.640 206.948 611.772 207.065 621.908 195.241 C 636.833 177.829 645.087 144.375 645.089 144.370 C 645.085 144.373 626.461 167.782 608.066 174.478 C 589.516 181.230 574.952 167.458 559.950 175.191 C 545.562 182.608 550.745 200.271 532.471 212.266 C 516.493 222.753 493.268 221.794 493.264 221.795 C 493.266 221.793 508.858 209.496 515.589 194.015 C 525.792 170.550 515.354 158.108 522.051 140.383 C 526.758 127.927 538.064 123.510 543.050 108.756 C 550.388 87.041 545.534 52.941 545.534 52.935 C 545.532 52.939 536.998 81.608 522.437 94.692 C 507.742 107.895 489.081 100.564 478.041 113.348 C 467.465 125.594 478.842 140.041 466.361 157.977 C 455.428 173.688 433.485 181.469 433.481 181.471 C 433.482 181.467 443.161 164.143 443.479 147.265 C 443.962 121.633 429.690 114.077 429.034 95.104 C 428.575 81.807 437.136 73.337 436.004 57.817 C 434.330 34.875 416.692 5.179 416.691 5.173 C 416.690 5.178 419.334 34.964 410.674 52.528 C 401.863 70.397 381.650 70.557 376.142 86.677 C 370.923 101.952 386.825 111.073 381.980 132.326 C 377.696 151.118 360.141 166.655 360.139 166.659 C 360.138 166.655 361.917 146.889 355.408 131.291 C 345.483 107.505 329.383 106.234 321.151 89.015 C 315.403 76.992 319.831 65.800 312.589 51.998 C 301.868 31.570 273.835 11.252 273.831 11.248 C 273.832 11.253 288.150 37.478 287.203 57.015 C 286.243 76.837 267.772 84.991 269.165 101.901 C 270.493 118.015 288.816 119.955 292.933 141.397 C 296.544 160.208 286.775 181.359 286.774 181.363 C 286.773 181.360 281.148 162.316 269.287 150.296 C 251.290 132.058 235.845 137.087 221.884 124.239 C 212.085 115.223 212.202 103.091 200.378 92.955 C 182.966 78.030 149.512 69.776 149.507 69.774 C 149.510 69.778 172.919 88.402 179.615 106.797 C 186.367 125.347 172.595 139.911 180.329 154.913 C 187.745 169.301 205.408 164.118 217.403 182.392 C 227.890 198.370 226.932 221.595 226.932 221.599 C 226.930 221.597 214.633 206.005 199.152 199.274 C 175.687 189.071 163.245 199.509 145.521 192.812 C 133.064 188.105 128.647 176.799 113.893 171.813 C 92.178 164.475 58.078 169.329 58.072 169.329 C 58.076 169.331 86.745 177.865 99.829 192.426 C 113.032 207.121 105.701 225.782 118.485 236.822 C 130.731 247.398 145.178 236.020 163.114 248.502 C 178.825 259.435 186.606 281.378 186.608 281.382 C 186.605 281.381 169.280 271.701 152.402 271.384 C 126.770 270.901 119.214 285.173 100.241 285.829 C 86.944 286.288 78.474 277.727 62.954 278.859 C 40.012 280.533 10.316 298.170 10.311 298.172 C 10.315 298.173 40.101 295.529 57.665 304.189 C 75.534 313.000 75.694 333.213 91.814 338.721 C 107.089 343.940 116.210 328.038 137.463 332.883 C 156.255 337.167 171.792 354.722 171.796 354.724 C 171.792 354.725 152.026 352.946 136.428 359.455 C 112.642 369.380 111.371 385.480 94.152 393.712 C 82.129 399.460 70.937 395.032 57.135 402.274 C 36.707 412.994 16.389 441.028 16.385 441.032 C 16.390 441.031 42.615 426.713 62.152 427.660 C 81.974 428.620 90.128 447.091 107.038 445.697 C 123.152 444.370 125.092 426.047 146.535 421.930 C 165.345 418.319 186.496 428.088 186.500 428.089 C 186.497 428.090 167.453 433.715 155.433 445.576 C 137.195 463.573 142.224 479.018 129.377 492.979 C 120.360 502.777 108.228 502.661 98.092 514.485 C 83.167 531.897 74.913 565.351 74.911 565.356 C 74.915 565.353 93.539 541.944 111.934 535.248 C 130.484 528.496 145.048 542.268 160.050 534.534 C 174.438 527.118 169.255 509.455 187.529 497.460 C 203.507 486.973 226.732 487.931 226.736 487.930 C 226.734 487.933 211.142 500.230 204.411 515.711 C 194.208 539.176 204.646 551.618 197.949 569.342 C 193.242 581.798 181.936 586.216 176.950 600.970 C 169.612 622.685 174.466 656.785 174.466 656.791 C 174.468 656.786 183.002 628.118 197.563 615.034 C 212.258 601.831 230.919 609.162 241.959 596.378 C 252.535 584.132 241.158 569.685 253.639 551.749 C 264.572 536.038 286.515 528.257 286.519 528.255 C 286.518 528.258 276.839 545.583 276.521 562.461 C 276.038 588.093 290.310 595.649 290.966 614.622 C 291.425 627.919 282.864 636.389 283.996 651.909 C 285.670 674.851 303.308 704.547 303.309 704.552 C 303.310 704.548 300.666 674.762 309.326 657.198 C 318.137 639.329 338.350 639.169 343.858 623.049 C 349.077 607.774 333.175 598.653 338.020 577.400 C 342.304 558.608 359.859 543.071 359.861 543.067 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":232.075,\\\"max\\\":487.892},\\\"y\\\":{\\\"min\\\":226.012,\\\"max\\\":481.829}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":359.983,\\\"y\\\":706.492,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":359.983,\\\"y\\\":16.791,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":20.165,\\\"y\\\":354.892,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871534037348,\\\"y\\\":0.005068829006331945}},{\\\"point\\\":{\\\"x\\\":700.887,\\\"y\\\":354.892,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871534037348,\\\"y\\\":0.0050688290063319215}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":602.037,\\\"y\\\":596.451,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129368243532012,\\\"y\\\":0.7012282684555529}},{\\\"point\\\":{\\\"x\\\":119.105,\\\"y\\\":596.5,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986681454975611,\\\"y\\\":0.7154458906632974}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":601.519,\\\"y\\\":113.444,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314711106251402,\\\"y\\\":-0.7753994044657578}},{\\\"point\\\":{\\\"x\\\":119.268,\\\"y\\\":113.526,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817151776550651,\\\"y\\\":-0.7316176710240964}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":695.628,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"BD4A545D-D341-487F-9EF7-119C2041145E_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"127.84%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"24.31%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"sun_half\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":8.746,\\\"max\\\":705.187},\\\"y\\\":{\\\"min\\\":146.572,\\\"max\\\":500.1867603589071}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sun_half\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sun\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 547.970 497.965 C 547.974 497.965 567.715 499.741 583.294 493.241 C 607.051 483.328 608.320 467.248 625.517 459.026 C 637.525 453.285 648.703 457.708 662.488 450.474 C 682.891 439.768 703.183 411.768 703.187 411.765 C 703.183 411.766 676.990 426.066 657.477 425.121 C 637.680 424.161 629.536 405.714 612.647 407.105 C 596.553 408.431 594.616 426.731 573.200 430.843 C 554.413 434.450 533.288 424.693 533.284 424.692 C 533.287 424.690 552.308 419.072 564.313 407.226 C 582.528 389.252 577.505 373.826 590.337 359.882 C 599.342 350.096 611.459 350.212 621.582 338.403 C 636.489 321.013 644.732 287.600 644.734 287.595 C 644.731 287.598 626.130 310.979 607.757 317.666 C 589.230 324.410 574.685 310.655 559.701 318.379 C 545.332 325.786 550.507 343.427 532.256 355.407 C 516.298 365.881 493.102 364.924 493.098 364.925 C 493.100 364.922 508.673 352.641 515.396 337.179 C 525.586 313.743 515.160 301.316 521.850 283.614 C 526.551 271.173 537.842 266.762 542.822 252.026 C 550.151 230.338 545.303 196.280 545.303 196.275 C 545.301 196.279 536.778 224.912 522.235 237.979 C 507.558 251.166 488.921 243.844 477.894 256.612 C 467.331 268.843 478.695 283.272 466.229 301.185 C 455.309 316.878 433.393 324.648 433.390 324.650 C 433.391 324.647 443.058 307.344 443.375 290.487 C 443.857 264.887 429.603 257.340 428.948 238.391 C 428.489 225.111 437.040 216.651 435.909 201.150 C 434.238 178.236 416.622 148.578 416.620 148.572 C 416.619 148.577 419.260 178.326 410.611 195.867 C 401.811 213.714 381.623 213.875 376.122 229.974 C 370.910 245.230 386.792 254.340 381.952 275.567 C 377.674 294.336 360.141 309.853 360.139 309.857 C 360.138 309.853 361.914 290.112 355.414 274.533 C 345.501 250.776 329.421 249.507 321.199 232.310 C 315.459 220.301 319.881 209.123 312.648 195.339 C 301.941 174.936 273.942 154.643 273.938 154.639 C 273.939 154.644 288.239 180.837 287.294 200.349 C 286.335 220.146 267.887 228.291 269.278 245.180 C 270.604 261.273 288.904 263.211 293.016 284.627 C 296.623 303.414 286.866 324.539 286.865 324.543 C 286.864 324.539 281.246 305.519 269.400 293.514 C 251.426 275.299 235.999 280.322 222.055 267.490 C 212.269 258.485 212.386 246.368 200.577 236.245 C 183.186 221.338 149.774 213.095 149.769 213.092 C 149.772 213.096 173.152 231.697 179.839 250.070 C 186.583 268.597 172.828 283.142 180.552 298.126 C 187.959 312.495 205.601 307.319 217.580 325.571 C 228.054 341.528 227.097 364.725 227.098 364.729 C 227.095 364.726 214.814 349.154 199.352 342.431 C 175.916 332.241 163.489 342.666 145.787 335.977 C 133.347 331.276 128.935 319.985 114.199 315.005 C 92.511 307.675 58.453 312.524 58.448 312.523 C 58.452 312.526 87.085 321.049 100.152 335.592 C 113.339 350.269 106.018 368.906 118.785 379.932 C 131.016 390.495 145.445 379.132 163.359 391.598 C 179.051 402.518 186.821 424.434 186.824 424.437 C 186.820 424.436 169.517 414.769 152.661 414.451 C 127.060 413.969 119.514 428.224 100.564 428.878 C 87.284 429.337 78.824 420.787 63.324 421.918 C 40.410 423.589 10.751 441.205 10.746 441.207 C 10.750 441.207 40.499 438.567 58.041 447.216 C 75.888 456.015 76.048 476.204 92.148 481.705 C 107.404 486.917 116.513 471.035 137.740 475.874 C 156.509 480.153 172.030 497.688 172.030 497.688 C 297.343 497.781 547.933 497.965 547.970 497.965 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":248.719,\\\"max\\\":471.248},\\\"y\\\":{\\\"min\\\":332.202,\\\"max\\\":495.565}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":359.984,\\\"y\\\":497.998,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":497.204,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"sun_pointy\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":56.579,\\\"max\\\":663.421},\\\"y\\\":{\\\"min\\\":17.138,\\\"max\\\":623.979}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sun_pointy_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sun_pointy\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#649A0246-9BA6-4FA2-A542-2E15D57BCA34_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 225.925 320.562 C 225.925 394.771 285.791 454.637 360.000 454.637 C 434.210 454.637 494.075 394.771 494.075 320.562 C 494.075 246.352 434.210 186.487 360.000 186.487 C 285.791 186.487 225.925 246.352 225.925 320.562 M 374.502 186.403 C 369.801 185.982 349.622 186.014 345.630 186.568 C 317.570 151.527 260.434 80.173 260.425 80.163 C 260.427 80.176 270.354 169.897 275.393 215.442 C 267.767 221.540 260.814 228.488 254.884 235.951 C 209.339 230.912 119.617 220.985 119.604 220.983 C 119.614 220.992 190.077 277.414 225.844 306.055 C 225.419 310.763 225.451 330.942 226.011 334.928 C 190.969 362.988 119.615 420.125 119.604 420.133 C 119.618 420.132 209.339 410.205 254.883 405.166 C 260.979 412.793 267.927 419.746 275.393 425.675 C 270.354 471.220 260.427 560.941 260.425 560.954 C 260.434 560.944 316.856 490.482 345.497 454.714 C 350.199 455.145 370.378 455.113 374.370 454.547 C 402.430 489.589 459.566 560.943 459.575 560.954 C 459.573 560.940 449.521 470.083 444.584 425.464 C 452.034 419.423 458.803 412.669 464.906 405.142 C 509.525 410.079 600.383 420.132 600.396 420.133 C 600.386 420.125 529.923 363.702 494.155 335.061 C 494.581 330.365 494.549 310.186 493.990 306.188 C 529.031 278.129 600.385 220.992 600.396 220.983 C 600.382 220.985 509.525 231.037 464.905 235.974 C 458.863 228.526 452.107 221.758 444.584 215.652 C 449.521 171.033 459.573 80.176 459.575 80.162 C 459.566 80.173 403.144 150.635 374.502 186.403 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sun_pointy_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S16\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 235.258 269.274 C 236.837 270.585 146.872 107.438 146.863 107.422 C 146.879 107.430 308.654 195.966 308.670 195.975 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#046ED82E-DF85-4E56-8290-5024B5E29C1C_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 225.770 320.562 C 225.770 394.857 285.705 454.792 360.000 454.792 C 434.295 454.792 494.230 394.857 494.230 320.562 C 494.230 246.267 434.295 186.332 360.000 186.332 C 285.705 186.332 225.770 246.267 225.770 320.562 M 360.000 19.138 C 359.995 19.155 325.680 137.375 308.670 195.975 C 308.654 195.966 146.879 107.430 146.863 107.422 C 146.872 107.438 236.837 270.585 235.258 269.274 C 176.816 286.238 58.597 320.553 58.579 320.558 C 58.597 320.563 176.816 354.878 235.415 371.888 C 235.406 371.904 146.872 533.679 146.863 533.695 C 146.879 533.686 308.754 446.265 308.716 445.300 C 325.680 503.742 359.995 621.961 360.000 621.979 C 360.005 621.961 394.320 503.742 411.329 445.143 C 411.346 445.152 573.121 533.686 573.137 533.695 C 573.128 533.679 484.435 372.440 484.743 371.842 C 543.184 354.879 661.403 320.563 661.421 320.558 C 661.403 320.553 543.184 286.238 484.742 269.274 C 485.248 268.494 573.128 107.438 573.137 107.422 C 573.125 107.410 411.247 196.759 411.284 195.816 C 394.320 137.375 360.005 19.155 360.000 19.138 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":262.249,\\\"max\\\":457.751},\\\"y\\\":{\\\"min\\\":222.811,\\\"max\\\":418.313}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":703.114,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":19.945,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":59.955,\\\"y\\\":321.417,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869848438501,\\\"y\\\":0.0051019744124722695}},{\\\"point\\\":{\\\"x\\\":660.045,\\\"y\\\":321.417,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869848438501,\\\"y\\\":0.00510197441247224}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":572.776,\\\"y\\\":534.362,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129136815267303,\\\"y\\\":0.7012517969260427}},{\\\"point\\\":{\\\"x\\\":147.048,\\\"y\\\":534.406,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986749421246679,\\\"y\\\":0.7154392533591458}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":572.926,\\\"y\\\":108.57,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.63143677802907,\\\"y\\\":-0.7754273630407087}},{\\\"point\\\":{\\\"x\\\":147.797,\\\"y\\\":108.642,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817236289221867,\\\"y\\\":-0.7316097961134503}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":620.453,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"649A0246-9BA6-4FA2-A542-2E15D57BCA34_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"41.91%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"15.69%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"72.94%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"046ED82E-DF85-4E56-8290-5024B5E29C1C_1\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"46.77%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"72.94%\\\",\\\"color\\\":\\\"#ffffff\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"sun_ring\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":11.275,\\\"max\\\":708.725},\\\"y\\\":{\\\"min\\\":6.129,\\\"max\\\":703.579}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sun_ring\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sun_ring\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#7ABBA0AC-B882-4B5F-B184-2A9A0ED543CF_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 180.291 354.854 C 180.291 255.387 260.532 175.146 360.000 175.146 C 459.468 175.146 539.709 255.387 539.709 354.854 C 539.709 454.322 459.468 534.563 360.000 534.563 C 260.532 534.563 180.291 454.322 180.291 354.854 M 338.207 575.504 C 342.454 556.872 359.860 541.466 359.862 541.463 C 359.863 541.467 358.099 561.065 364.553 576.531 C 374.394 600.116 390.357 601.375 398.520 618.448 C 404.219 630.370 399.828 641.467 407.009 655.151 C 417.639 675.407 445.435 695.552 445.439 695.556 C 445.438 695.552 431.241 669.549 432.180 650.177 C 433.132 630.524 451.446 622.438 450.065 605.671 C 448.748 589.694 430.581 587.771 426.499 566.510 C 422.918 547.859 432.604 526.887 432.605 526.883 C 432.607 526.887 438.184 545.769 449.944 557.688 C 467.788 575.771 483.103 570.784 496.946 583.523 C 506.661 592.463 506.545 604.492 518.269 614.542 C 535.533 629.341 568.704 637.524 568.709 637.527 C 568.706 637.523 545.495 619.057 538.856 600.817 C 532.161 582.424 545.817 567.984 538.148 553.109 C 530.795 538.844 513.281 543.982 501.388 525.863 C 490.990 510.021 491.940 486.992 491.940 486.988 C 491.942 486.991 504.134 502.450 519.485 509.125 C 542.751 519.241 555.087 508.891 572.661 515.532 C 585.012 520.199 589.392 531.408 604.021 536.352 C 625.552 543.628 659.363 538.815 659.368 538.816 C 659.364 538.813 630.938 530.352 617.966 515.914 C 604.874 501.344 612.143 482.841 599.468 471.895 C 587.326 461.408 573.001 472.689 555.217 460.314 C 539.639 449.473 531.924 427.716 531.922 427.713 C 531.926 427.714 549.104 437.311 565.838 437.626 C 591.253 438.104 598.745 423.953 617.557 423.303 C 630.741 422.848 639.139 431.336 654.528 430.214 C 677.276 428.554 706.720 411.066 706.725 411.064 C 706.720 411.064 677.187 413.685 659.772 405.099 C 642.055 396.363 641.895 376.320 625.912 370.860 C 610.767 365.685 601.724 381.452 580.650 376.648 C 562.017 372.400 546.612 354.994 546.609 354.992 C 546.612 354.991 566.211 356.755 581.677 350.301 C 605.261 340.460 606.521 324.497 623.594 316.335 C 635.515 310.635 646.613 315.026 660.297 307.845 C 680.553 297.216 700.698 269.419 700.702 269.415 C 700.697 269.417 674.694 283.613 655.323 282.675 C 635.669 281.723 627.584 263.408 610.817 264.790 C 594.840 266.106 592.917 284.274 571.656 288.355 C 553.005 291.936 532.033 282.250 532.029 282.249 C 532.032 282.248 550.915 276.670 562.833 264.910 C 580.916 247.066 575.930 231.752 588.668 217.909 C 597.609 208.194 609.638 208.309 619.687 196.585 C 634.486 179.321 642.670 146.150 642.672 146.145 C 642.669 146.148 624.202 169.359 605.963 175.998 C 587.570 182.693 573.130 169.038 558.255 176.706 C 543.989 184.060 549.128 201.573 531.009 213.466 C 515.167 223.864 492.138 222.914 492.134 222.915 C 492.136 222.912 507.596 210.720 514.270 195.370 C 524.387 172.104 514.037 159.767 520.677 142.193 C 525.344 129.843 536.554 125.463 541.498 110.834 C 548.774 89.302 543.961 55.492 543.961 55.486 C 543.959 55.490 535.497 83.916 521.060 96.888 C 506.490 109.980 487.987 102.711 477.041 115.386 C 466.554 127.529 477.835 141.853 465.459 159.637 C 454.619 175.216 432.862 182.930 432.858 182.932 C 432.859 182.929 442.456 165.751 442.772 149.017 C 443.250 123.601 429.099 116.110 428.449 97.298 C 427.993 84.113 436.482 75.715 435.359 60.327 C 433.700 37.579 416.212 8.135 416.210 8.129 C 416.209 8.134 418.831 37.667 410.244 55.082 C 401.509 72.800 381.466 72.959 376.005 88.942 C 370.831 104.087 386.598 113.131 381.793 134.204 C 377.546 152.837 360.140 168.242 360.138 168.246 C 360.137 168.242 361.901 148.644 355.447 133.177 C 345.606 109.593 329.643 108.333 321.480 91.260 C 315.781 79.339 320.172 68.242 312.991 54.557 C 302.361 34.302 274.565 14.156 274.561 14.152 C 274.562 14.157 288.759 40.160 287.821 59.531 C 286.868 79.185 268.554 87.270 269.935 104.037 C 271.252 120.014 289.419 121.938 293.501 143.198 C 297.082 161.849 287.396 182.821 287.395 182.825 C 287.393 182.822 281.816 163.939 270.056 152.021 C 252.212 133.938 236.897 138.925 223.054 126.186 C 213.339 117.246 213.455 105.217 201.731 95.167 C 184.467 80.368 151.296 72.184 151.291 72.182 C 151.294 72.186 174.505 90.652 181.144 108.891 C 187.839 127.284 174.183 141.724 181.852 156.600 C 189.205 170.865 206.719 165.727 218.612 183.846 C 229.010 199.688 228.060 222.716 228.061 222.720 C 228.058 222.718 215.866 207.258 200.515 200.584 C 177.249 190.467 164.913 200.818 147.339 194.177 C 134.988 189.510 130.608 178.300 115.980 173.357 C 94.448 166.080 60.637 170.893 60.632 170.893 C 60.636 170.895 89.062 179.357 102.034 193.795 C 115.126 208.365 107.857 226.867 120.532 237.814 C 132.674 248.300 146.999 237.019 164.783 249.395 C 180.361 260.236 188.076 281.993 188.078 281.996 C 188.074 281.995 170.896 272.398 154.162 272.083 C 128.747 271.604 121.255 285.755 102.443 286.405 C 89.259 286.861 80.861 278.372 65.472 279.495 C 42.724 281.154 13.280 298.642 13.275 298.644 C 13.280 298.645 42.813 296.024 60.228 304.610 C 77.945 313.346 78.105 333.388 94.088 338.849 C 109.233 344.024 118.276 328.257 139.350 333.061 C 157.983 337.309 173.388 354.715 173.391 354.717 C 173.388 354.717 153.789 352.954 138.323 359.407 C 114.739 369.248 113.479 385.212 96.406 393.374 C 84.485 399.073 73.387 394.683 59.703 401.864 C 39.447 412.493 19.302 440.289 19.298 440.293 C 19.303 440.292 45.306 426.095 64.677 427.034 C 84.331 427.986 92.416 446.300 109.183 444.919 C 125.160 443.602 127.083 425.435 148.344 421.353 C 166.995 417.772 187.967 427.459 187.971 427.459 C 187.968 427.461 169.085 433.038 157.167 444.799 C 139.084 462.642 144.070 477.957 131.332 491.800 C 122.391 501.515 110.362 501.400 100.313 513.123 C 85.514 530.387 77.330 563.558 77.328 563.563 C 77.331 563.560 95.798 540.349 114.037 533.710 C 132.430 527.016 146.870 540.671 161.745 533.003 C 176.011 525.649 170.872 508.135 188.991 496.243 C 204.834 485.844 227.862 486.795 227.866 486.794 C 227.864 486.797 212.404 498.989 205.730 514.339 C 195.613 537.605 205.963 549.942 199.323 567.516 C 194.656 579.866 183.446 584.246 178.502 598.875 C 171.226 620.406 176.039 654.217 176.039 654.223 C 176.041 654.218 184.503 625.793 198.940 612.820 C 213.510 599.729 232.013 606.997 242.959 594.322 C 253.446 582.180 242.165 567.856 254.541 550.072 C 265.381 534.493 287.138 526.779 287.142 526.776 C 287.141 526.780 277.544 543.958 277.228 560.692 C 276.750 586.107 290.901 593.599 291.551 612.411 C 292.007 625.595 283.518 633.994 284.641 649.382 C 286.300 672.130 303.788 701.574 303.790 701.579 C 303.791 701.575 301.169 672.041 309.756 654.627 C 318.492 636.909 338.534 636.750 343.995 620.767 C 349.169 605.621 333.402 596.578 338.207 575.504 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":234.855,\\\"max\\\":485.112},\\\"y\\\":{\\\"min\\\":228.79,\\\"max\\\":479.047}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":359.976,\\\"y\\\":703.924,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":359.976,\\\"y\\\":21.987,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":22.513,\\\"y\\\":354.762,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873379630732,\\\"y\\\":0.0050322871069308625}},{\\\"point\\\":{\\\"x\\\":698.516,\\\"y\\\":354.762,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873361423453,\\\"y\\\":0.005032648898551829}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":600.351,\\\"y\\\":594.646,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129056715082938,\\\"y\\\":0.7012599400588264}},{\\\"point\\\":{\\\"x\\\":120.768,\\\"y\\\":594.695,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986821980403932,\\\"y\\\":0.7154321673935585}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":599.837,\\\"y\\\":114.988,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314312836514491,\\\"y\\\":-0.7754318371245039}},{\\\"point\\\":{\\\"x\\\":120.929,\\\"y\\\":115.07,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817212266635011,\\\"y\\\":-0.7316120345623159}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":692.896,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"7ABBA0AC-B882-4B5F-B184-2A9A0ED543CF_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"50.00%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"70.20%\\\",\\\"color\\\":\\\"#ffffff\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"sword\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":294.58,\\\"max\\\":425.42},\\\"y\\\":{\\\"min\\\":22.536,\\\"max\\\":685.995}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sword\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sword_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#09311219-F3C0-4CBB-B78A-B265544F9F44_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 295.580 566.820 C 295.593 566.820 424.407 566.820 424.420 566.820 C 424.420 566.822 424.420 582.585 424.420 582.586 C 424.407 582.586 295.593 582.586 295.580 582.586 C 295.580 582.585 295.580 566.822 295.580 566.820 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#09311219-F3C0-4CBB-B78A-B265544F9F44_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 348.209 640.937 C 351.660 638.976 355.693 637.829 360.000 637.829 C 364.307 637.829 368.340 638.976 371.791 640.937 C 371.826 621.683 371.896 582.592 371.895 582.586 C 371.893 582.586 348.107 582.586 348.104 582.586 C 348.104 582.592 348.174 621.683 348.209 640.937 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 637.829 C 364.307 637.829 368.340 638.976 371.791 640.937 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 348.209 640.937 C 351.660 638.976 355.693 637.829 360.000 637.829 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#09311219-F3C0-4CBB-B78A-B265544F9F44_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 637.829 C 364.307 637.829 368.340 638.976 371.791 640.937 C 378.856 645.054 383.582 652.667 383.582 661.412 C 383.583 674.465 373.053 684.995 360.000 684.995 C 346.947 684.995 336.417 674.465 336.417 661.412 C 336.417 652.667 341.144 645.054 348.209 640.937 C 351.660 638.976 355.693 637.829 360.000 637.829 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"url(#09311219-F3C0-4CBB-B78A-B265544F9F44_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 566.820 C 360.000 385.726 360.000 204.631 360.000 23.536 C 360.002 23.542 383.082 82.054 383.084 82.060 C 383.084 82.108 384.543 566.772 384.543 566.820 C 384.541 566.820 360.002 566.820 360.000 566.820 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 566.820 C 360.000 385.726 360.000 204.631 360.000 23.536 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"url(#09311219-F3C0-4CBB-B78A-B265544F9F44_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 336.916 82.060 C 336.916 82.108 335.457 566.772 335.457 566.820 C 335.459 566.820 359.998 566.820 360.000 566.820 C 360.000 385.726 360.000 204.631 360.000 23.536 C 359.998 23.542 336.918 82.054 336.916 82.060 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.239,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":31.601,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":333.614,\\\"y\\\":611.374,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873026164441,\\\"y\\\":0.005039306091922599}},{\\\"point\\\":{\\\"x\\\":385.298,\\\"y\\\":611.374,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873026164441,\\\"y\\\":0.005039306091922599}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":324.408,\\\"y\\\":532.009,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9442064452574865,\\\"y\\\":-0.3293541995090104}},{\\\"point\\\":{\\\"x\\\":395.592,\\\"y\\\":532.009,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9442064452574865,\\\"y\\\":-0.3293541995090104}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.96,\\\"y\\\":666.565,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"09311219-F3C0-4CBB-B78A-B265544F9F44_0\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"-358.60%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"09311219-F3C0-4CBB-B78A-B265544F9F44_1\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"-86.71%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"09311219-F3C0-4CBB-B78A-B265544F9F44_2\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"46.85%\\\",\\\"y2\\\":\\\"-60.22%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"09311219-F3C0-4CBB-B78A-B265544F9F44_3\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"-32.71%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"09311219-F3C0-4CBB-B78A-B265544F9F44_4\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"141.60%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"sycophant\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":183.19678646760363,\\\"max\\\":712.093},\\\"y\\\":{\\\"min\\\":125.343,\\\"max\\\":574.760790487745}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sycophant\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"sycophant\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 187.697 310.928 C 186.902 304.633 188.375 303.638 194.102 304.019 C 193.723 298.645 196.315 292.699 223.107 315.861 C 214.696 307.602 211.317 299.123 220.239 303.362 C 223.540 304.930 264.473 326.720 265.229 347.121 C 265.720 360.386 263.172 374.401 238.601 373.749 C 220.459 373.268 170.649 312.671 187.697 310.928 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 187.697 310.928 C 195.799 319.942 203.902 328.955 212.004 337.969 M 194.102 304.019 C 202.849 312.288 211.596 320.558 220.342 328.828 M 223.107 315.861 C 227.331 319.585 231.556 323.310 235.781 327.034 M 238.601 373.749 C 220.459 373.268 170.649 312.671 187.697 310.928 C 186.902 304.633 188.375 303.638 194.102 304.019 C 193.723 298.645 196.315 292.699 223.107 315.861 C 214.696 307.602 211.317 299.123 220.239 303.362 C 223.540 304.930 264.473 326.720 265.229 347.121 C 265.720 360.386 263.172 374.401 238.601 373.749 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 377.189 148.800 C 392.160 163.771 399.646 183.334 399.646 202.897 C 399.646 222.460 393.796 243.861 377.189 256.995 C 362.813 268.364 327.299 273.834 327.294 273.836 C 327.294 273.838 324.210 293.967 324.210 293.969 C 324.207 293.967 294.325 273.838 294.322 273.836 C 294.319 273.834 276.481 264.480 268.996 256.995 C 254.024 242.023 246.538 222.460 246.538 202.897 C 246.538 183.334 254.025 163.771 268.996 148.800 C 283.967 133.829 303.530 126.343 323.092 126.343 C 342.655 126.343 362.218 133.829 377.189 148.800 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 323.092 126.343 C 342.655 126.343 362.218 133.829 377.189 148.800 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 322.680 202.470 C 322.680 202.463 322.955 151.719 323.092 126.343 C 342.655 126.343 362.218 133.829 377.189 148.800 C 359.020 166.690 322.686 202.465 322.680 202.470 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.437 227.337 C 309.046 236.849 309.046 249.214 301.437 258.726 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 606.487 509.811 C 606.487 509.818 606.487 572.568 606.487 572.574 C 606.497 572.574 711.082 572.574 711.093 572.574 C 711.082 572.568 606.497 509.818 606.487 509.811 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 322.114 177.634 C 333.908 177.634 343.422 187.148 343.422 198.941 C 343.422 210.735 333.908 220.249 322.114 220.249 C 310.321 220.249 300.808 210.735 300.808 198.941 C 300.808 187.148 310.321 177.634 322.114 177.634 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 300.808 198.941 C 300.808 187.148 310.321 177.634 322.114 177.634 C 333.908 177.634 343.422 187.148 343.422 198.941 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 187.697 310.928 C 186.902 304.633 188.375 303.638 194.102 304.019 C 193.723 298.645 196.315 292.699 223.107 315.861 C 214.696 307.602 211.317 299.123 220.239 303.362 C 223.540 304.930 264.473 326.720 265.229 347.121 C 265.720 360.386 263.172 374.401 238.601 373.749 C 220.459 373.268 170.649 312.671 187.697 310.928 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 187.697 310.928 C 195.799 319.942 203.902 328.955 212.004 337.969 M 194.102 304.019 C 202.849 312.288 211.596 320.558 220.342 328.828 M 223.107 315.861 C 227.331 319.585 231.556 323.310 235.781 327.034 M 238.601 373.749 C 220.459 373.268 170.649 312.671 187.697 310.928 C 186.902 304.633 188.375 303.638 194.102 304.019 C 193.723 298.645 196.315 292.699 223.107 315.861 C 214.696 307.602 211.317 299.123 220.239 303.362 C 223.540 304.930 264.473 326.720 265.229 347.121 C 265.720 360.386 263.172 374.401 238.601 373.749 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 250.828 321.521 C 250.833 321.533 219.732 469.751 356.755 447.468 C 305.299 448.191 295.048 390.641 296.704 321.598 C 296.699 321.598 250.833 321.521 250.828 321.521 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 377.189 148.800 C 392.160 163.771 399.646 183.334 399.646 202.897 C 399.646 222.460 393.796 243.861 377.189 256.995 C 362.813 268.364 327.299 273.834 327.294 273.836 C 327.294 273.838 324.210 293.967 324.210 293.969 C 324.207 293.967 294.325 273.838 294.322 273.836 C 294.319 273.834 276.481 264.480 268.996 256.995 C 254.024 242.023 246.538 222.460 246.538 202.897 C 246.538 183.334 254.025 163.771 268.996 148.800 C 283.967 133.829 303.530 126.343 323.092 126.343 C 342.655 126.343 362.218 133.829 377.189 148.800 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 323.092 126.343 C 342.655 126.343 362.218 133.829 377.189 148.800 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2_2\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.680 202.470 C 322.680 202.463 322.955 151.719 323.092 126.343 C 342.655 126.343 362.218 133.829 377.189 148.800 C 359.020 166.690 322.686 202.465 322.680 202.470 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.437 227.337 C 309.046 236.849 309.046 249.214 301.437 258.726 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 606.487 509.811 C 606.487 509.818 606.487 572.568 606.487 572.574 C 606.497 572.574 711.082 572.574 711.093 572.574 C 711.082 572.568 606.497 509.818 606.487 509.811 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 322.114 177.634 C 333.908 177.634 343.422 187.148 343.422 198.941 C 343.422 210.735 333.908 220.249 322.114 220.249 C 310.321 220.249 300.808 210.735 300.808 198.941 C 300.808 187.148 310.321 177.634 322.114 177.634 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 300.808 198.941 C 300.808 187.148 310.321 177.634 322.114 177.634 C 333.908 177.634 343.422 187.148 343.422 198.941 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 296.704 321.598 C 295.048 390.641 305.299 448.191 356.755 447.468 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9_2\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 355.433 321.521 C 331.946 321.038 296.709 321.598 296.704 321.598 C 295.048 390.641 305.299 448.191 356.755 447.468 C 250.824 448.056 251.055 571.266 334.512 572.574 C 376.349 573.230 622.191 574.880 627.407 572.574 C 630.283 356.980 654.660 144.184 460.039 149.383 C 395.443 151.108 354.444 181.350 355.433 321.521 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13_2\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 356.755 447.468 C 360.278 446.895 460.028 447.047 460.039 447.047 C 460.039 447.030 460.140 333.194 460.190 276.267 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":373.34,\\\"max\\\":588.518},\\\"y\\\":{\\\"min\\\":207.85,\\\"max\\\":541.931}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":472.727,\\\"y\\\":580.634,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":322.229,\\\"y\\\":104.245,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":35.266,\\\"y\\\":539.72,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.005012688758650853,\\\"y\\\":-0.9999874363967823}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[]}},{\\\"name\\\":\\\"synagogue_blank\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":84.384,\\\"max\\\":635.646},\\\"y\\\":{\\\"min\\\":125.273,\\\"max\\\":687.476}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"synagogue_blank\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"synagogue\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 539.045 280.656 C 539.045 285.293 542.786 289.034 547.423 289.034 C 552.061 289.034 555.801 285.293 555.801 280.656 C 555.801 276.019 552.061 272.278 547.423 272.278 C 542.786 272.277 539.045 276.018 539.045 280.656 M 165.421 280.656 C 165.421 285.293 169.162 289.034 173.799 289.034 C 178.437 289.034 182.177 285.293 182.177 280.656 C 182.177 276.019 178.437 272.278 173.799 272.278 C 169.162 272.277 165.421 276.018 165.421 280.656 M 194.755 343.258 C 194.755 343.256 194.755 315.399 194.755 315.396 C 194.751 315.396 150.244 315.396 150.240 315.396 C 150.240 315.399 150.240 343.256 150.240 343.258 C 150.242 343.256 172.286 323.055 172.288 323.053 C 172.290 323.055 194.753 343.256 194.755 343.258 M 196.787 314.237 C 196.787 300.960 186.077 290.250 172.800 290.250 C 159.524 290.250 148.813 300.960 148.813 314.237 C 155.096 314.163 191.781 314.137 196.787 314.237 M 207.495 463.404 C 206.788 442.662 191.817 428.292 172.383 428.292 C 152.949 428.292 138.941 440.095 137.271 463.404 C 136.195 478.413 137.180 534.170 137.180 534.177 C 137.187 534.177 205.975 534.335 205.982 534.335 C 205.982 534.328 208.029 479.090 207.495 463.404 M 257.796 401.932 C 257.788 401.924 172.099 326.167 172.090 326.160 C 172.082 326.167 86.393 401.924 86.384 401.932 C 86.401 401.932 257.779 401.932 257.796 401.932 M 255.043 684.070 C 255.043 684.043 255.043 405.390 255.043 405.362 C 255.027 405.362 86.890 405.362 86.873 405.362 C 86.873 405.390 86.873 684.043 86.873 684.070 C 86.890 684.070 255.027 684.070 255.043 684.070 M 207.495 606.019 C 206.788 585.278 191.818 570.907 172.383 570.907 C 152.949 570.907 138.941 582.710 137.271 606.019 C 136.195 621.028 137.180 676.785 137.180 676.792 C 137.187 676.792 205.975 676.951 205.982 676.951 C 205.982 676.944 208.029 621.705 207.495 606.019 M 347.577 139.990 C 347.577 147.029 353.255 152.707 360.294 152.707 C 367.332 152.707 373.010 147.028 373.010 139.990 C 373.010 132.952 367.332 127.274 360.294 127.273 C 353.255 127.273 347.577 132.951 347.577 139.990 M 525.275 343.258 C 525.275 343.256 525.275 315.399 525.275 315.396 C 525.280 315.396 569.787 315.396 569.791 315.396 C 569.791 315.399 569.791 343.256 569.791 343.258 C 569.789 343.256 547.745 323.055 547.743 323.053 C 547.741 323.055 525.278 343.256 525.275 343.258 M 523.244 314.237 C 523.244 300.960 533.954 290.250 547.231 290.250 C 560.507 290.250 571.217 300.960 571.217 314.237 C 564.935 314.163 528.250 314.137 523.244 314.237 M 512.536 463.404 C 513.242 442.662 528.213 428.292 547.647 428.292 C 567.082 428.292 581.090 440.095 582.760 463.404 C 583.835 478.413 582.851 534.170 582.851 534.177 C 582.844 534.177 514.056 534.335 514.049 534.335 C 514.049 534.328 512.001 479.090 512.536 463.404 M 462.234 401.932 C 462.243 401.924 547.932 326.167 547.941 326.160 C 547.949 326.167 633.638 401.924 633.646 401.932 C 633.629 401.932 462.252 401.932 462.234 401.932 M 464.987 684.070 C 464.987 684.043 464.987 405.390 464.987 405.362 C 465.004 405.362 633.141 405.362 633.158 405.362 C 633.158 405.390 633.158 684.043 633.158 684.070 C 633.141 684.070 465.004 684.070 464.987 684.070 M 294.344 399.664 C 294.344 436.167 323.791 465.614 360.294 465.614 C 396.796 465.614 426.243 436.167 426.243 399.664 C 426.242 363.162 396.796 333.716 360.294 333.715 C 323.791 333.715 294.344 363.162 294.344 399.664 M 512.536 606.019 C 513.242 585.278 528.213 570.907 547.647 570.907 C 567.082 570.907 581.090 582.710 582.760 606.019 C 583.835 621.028 582.851 676.785 582.851 676.792 C 582.844 676.792 514.056 676.951 514.049 676.951 C 514.049 676.944 512.001 621.705 512.536 606.019 M 311.835 576.610 C 313.004 547.864 333.569 527.936 360.510 527.936 C 387.451 527.936 407.017 544.288 409.185 576.610 C 410.614 597.907 408.169 676.985 408.169 676.995 C 408.159 676.995 312.798 677.215 312.789 677.215 C 312.789 677.205 310.930 598.849 311.835 576.610 M 262.606 685.476 C 262.606 685.435 262.606 277.696 262.606 277.655 C 262.625 277.655 458.395 277.655 458.414 277.655 C 458.414 277.696 458.414 685.435 458.414 685.476 C 458.395 685.476 262.625 685.476 262.606 685.476 M 252.478 273.851 C 252.478 273.850 252.478 257.121 252.478 257.120 C 252.499 257.120 468.520 257.120 468.542 257.120 C 468.542 257.121 468.542 273.850 468.542 273.851 C 468.520 273.851 252.499 273.851 252.478 273.851 M 264.284 253.128 C 264.284 199.868 307.250 156.903 360.510 156.903 C 413.770 156.903 456.736 199.868 456.736 253.128 C 431.532 252.834 284.368 252.726 264.284 253.128 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 207.495 463.404 C 206.788 442.662 191.817 428.292 172.383 428.292 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 172.383 428.292 C 152.949 428.292 138.941 440.095 137.271 463.404 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 137.271 463.404 C 136.195 478.413 137.180 534.170 137.180 534.177 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 137.180 534.177 C 137.187 534.177 205.975 534.335 205.982 534.335 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 205.982 534.335 C 205.982 534.328 208.029 479.090 207.495 463.404 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 207.495 606.019 C 206.788 585.278 191.818 570.907 172.383 570.907 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 172.383 570.907 C 152.949 570.907 138.941 582.710 137.271 606.019 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 137.271 606.019 C 136.195 621.028 137.180 676.785 137.180 676.792 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 137.180 676.792 C 137.187 676.792 205.975 676.951 205.982 676.951 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 205.982 676.951 C 205.982 676.944 208.029 621.705 207.495 606.019 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 512.536 463.404 C 513.242 442.662 528.213 428.292 547.647 428.292 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 547.647 428.292 C 567.082 428.292 581.090 440.095 582.760 463.404 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 582.760 463.404 C 583.835 478.413 582.851 534.170 582.851 534.177 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 582.851 534.177 C 582.844 534.177 514.056 534.335 514.049 534.335 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 514.049 534.335 C 514.049 534.328 512.001 479.090 512.536 463.404 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 294.344 399.664 C 294.344 436.167 323.791 465.614 360.294 465.614 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.294 465.614 C 396.796 465.614 426.243 436.167 426.243 399.664 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 426.243 399.664 C 426.242 363.162 396.796 333.716 360.294 333.715 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.294 333.715 C 323.791 333.715 294.344 363.162 294.344 399.664 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 512.536 606.019 C 513.242 585.278 528.213 570.907 547.647 570.907 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 547.647 570.907 C 567.082 570.907 581.090 582.710 582.760 606.019 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 582.760 606.019 C 583.835 621.028 582.851 676.785 582.851 676.792 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 582.851 676.792 C 582.844 676.792 514.056 676.951 514.049 676.951 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 514.049 676.951 C 514.049 676.944 512.001 621.705 512.536 606.019 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 311.835 576.610 C 313.004 547.864 333.569 527.936 360.510 527.936 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.510 527.936 C 387.451 527.936 407.017 544.288 409.185 576.610 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 409.185 576.610 C 410.614 597.907 408.169 676.985 408.169 676.995 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 408.169 676.995 C 408.159 676.995 312.798 677.215 312.789 677.215 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 312.789 677.215 C 312.789 677.205 310.930 598.849 311.835 576.610 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 207.495 463.404 C 206.788 442.662 191.817 428.292 172.383 428.292 C 152.949 428.292 138.941 440.095 137.271 463.404 C 136.195 478.413 137.180 534.170 137.180 534.177 C 137.187 534.177 205.975 534.335 205.982 534.335 C 205.982 534.328 208.029 479.090 207.495 463.404 M 207.495 606.019 C 206.788 585.278 191.818 570.907 172.383 570.907 C 152.949 570.907 138.941 582.710 137.271 606.019 C 136.195 621.028 137.180 676.785 137.180 676.792 C 137.187 676.792 205.975 676.951 205.982 676.951 C 205.982 676.944 208.029 621.705 207.495 606.019 M 512.536 463.404 C 513.242 442.662 528.213 428.292 547.647 428.292 C 567.082 428.292 581.090 440.095 582.760 463.404 C 583.835 478.413 582.851 534.170 582.851 534.177 C 582.844 534.177 514.056 534.335 514.049 534.335 C 514.049 534.328 512.001 479.090 512.536 463.404 M 294.344 399.664 C 294.344 436.167 323.791 465.614 360.294 465.614 C 396.796 465.614 426.243 436.167 426.243 399.664 C 426.242 363.162 396.796 333.716 360.294 333.715 C 323.791 333.715 294.344 363.162 294.344 399.664 M 512.536 606.019 C 513.242 585.278 528.213 570.907 547.647 570.907 C 567.082 570.907 581.090 582.710 582.760 606.019 C 583.835 621.028 582.851 676.785 582.851 676.792 C 582.844 676.792 514.056 676.951 514.049 676.951 C 514.049 676.944 512.001 621.705 512.536 606.019 M 311.835 576.610 C 313.004 547.864 333.569 527.936 360.510 527.936 C 387.451 527.936 407.017 544.288 409.185 576.610 C 410.614 597.907 408.169 676.985 408.169 676.995 C 408.159 676.995 312.798 677.215 312.789 677.215 C 312.789 677.205 310.930 598.849 311.835 576.610 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":312.376,\\\"max\\\":407.624},\\\"y\\\":{\\\"min\\\":351.599,\\\"max\\\":446.848}},{\\\"x\\\":{\\\"min\\\":519.725,\\\"max\\\":575.288},\\\"y\\\":{\\\"min\\\":440.251,\\\"max\\\":495.814}},{\\\"x\\\":{\\\"min\\\":143.852,\\\"max\\\":199.415},\\\"y\\\":{\\\"min\\\":440.251,\\\"max\\\":495.814}},{\\\"x\\\":{\\\"min\\\":314.346,\\\"max\\\":405.654},\\\"y\\\":{\\\"min\\\":36.188,\\\"max\\\":127.496}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.446,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":35.264,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":88.093,\\\"y\\\":455.639,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873181281341,\\\"y\\\":0.005036227050266383}},{\\\"point\\\":{\\\"x\\\":632.953,\\\"y\\\":455.639,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.005035854088752063}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":620.864,\\\"y\\\":680.788,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.712932968582661,\\\"y\\\":0.7012321885851466}},{\\\"point\\\":{\\\"x\\\":101.37,\\\"y\\\":680.836,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698688399112506,\\\"y\\\":0.7154261114507937}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":285.121,\\\"y\\\":192.739,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.716705921146408,\\\"y\\\":-0.6973755248025835}},{\\\"point\\\":{\\\"x\\\":434.382,\\\"y\\\":192.739,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7167059211464101,\\\"y\\\":-0.6973755248025815}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":679.939,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"arm\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"table\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":70.601,\\\"max\\\":649.399},\\\"y\\\":{\\\"min\\\":248.044,\\\"max\\\":706.176}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"table\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"table\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 477.270 426.961 C 477.287 426.953 590.689 372.266 647.399 344.919 C 647.399 344.946 647.399 616.925 647.399 616.953 C 647.396 616.954 616.313 633.753 616.309 633.755 C 616.309 558.203 616.309 407.121 616.309 407.098 C 616.307 407.100 597.310 417.461 587.811 422.643 C 587.803 422.647 510.095 462.364 510.087 462.368 C 510.087 462.390 510.950 681.700 510.950 681.722 C 510.947 681.724 477.273 704.173 477.270 704.176 C 477.270 611.771 477.270 426.989 477.270 426.961 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 244.520 404.671 C 244.520 404.682 244.110 478.649 243.904 515.638 C 243.907 515.637 270.673 505.277 270.676 505.276 C 270.676 505.266 270.676 412.016 270.676 412.007 C 261.957 409.561 244.523 404.671 244.520 404.671 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 102.417 361.964 C 102.420 361.965 122.266 368.110 132.190 371.183 C 132.190 371.204 132.190 586.197 132.190 586.219 C 132.187 586.220 102.830 604.352 102.827 604.354 C 102.691 523.558 102.417 361.988 102.417 361.964 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 616.309 633.755 C 616.309 558.203 616.309 407.121 616.309 407.098 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 616.309 407.098 C 616.307 407.100 597.310 417.461 587.811 422.643 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 587.811 623.861 C 587.813 623.862 616.307 633.754 616.309 633.755 C 616.309 558.203 616.309 407.121 616.309 407.098 C 616.307 407.100 597.310 417.461 587.811 422.643 C 587.811 422.663 587.811 623.841 587.811 623.861 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 132.190 371.183 C 122.266 368.110 102.420 361.965 102.417 361.964 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 102.417 361.964 C 102.417 361.988 102.691 523.558 102.827 604.354 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 477.270 426.961 C 477.270 426.989 477.270 611.771 477.270 704.176 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 270.676 412.007 C 261.957 409.561 244.523 404.671 244.520 404.671 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 244.520 404.671 C 234.240 401.647 223.959 398.622 213.678 395.598 C 213.670 395.596 132.198 371.185 132.190 371.183 C 122.266 368.110 102.420 361.965 102.417 361.964 C 102.417 361.988 102.691 523.558 102.827 604.354 C 102.824 604.353 72.604 596.583 72.601 596.582 C 72.601 596.553 72.601 311.972 72.601 311.944 C 207.491 350.283 342.381 388.622 477.270 426.961 C 477.270 426.989 477.270 611.771 477.270 704.176 C 477.267 704.174 447.911 692.087 447.908 692.085 C 447.908 692.063 447.908 464.982 447.908 464.959 C 447.890 464.954 270.694 412.012 270.676 412.007 C 261.957 409.561 244.523 404.671 244.520 404.671 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 244.520 404.671 C 234.240 401.647 223.959 398.622 213.678 395.598 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 243.904 515.638 C 244.110 478.649 244.520 404.682 244.520 404.671 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 244.520 404.671 C 234.240 401.647 223.959 398.622 213.678 395.598 C 213.678 395.609 213.678 507.855 213.678 507.866 C 213.682 507.867 243.901 515.638 243.904 515.638 C 244.110 478.649 244.520 404.682 244.520 404.671 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 477.270 426.961 C 342.381 388.622 207.491 350.283 72.601 311.944 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 647.399 344.919 C 590.689 372.266 477.287 426.953 477.270 426.961 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 477.270 426.961 C 342.381 388.622 207.491 350.283 72.601 311.944 C 72.621 311.937 270.974 250.050 270.994 250.044 C 271.032 250.053 647.361 344.909 647.399 344.919 C 590.689 372.266 477.287 426.953 477.270 426.961 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":202.938,\\\"max\\\":545.246},\\\"y\\\":{\\\"min\\\":5.896,\\\"max\\\":346.915}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":700.62,\\\"y\\\":474.498,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":31.9,\\\"y\\\":360.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869443305633,\\\"y\\\":0.00510990884683594}},{\\\"point\\\":{\\\"x\\\":688.1,\\\"y\\\":360.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869443305632,\\\"y\\\":0.005109908846835966}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":316.485,\\\"y\\\":624.364,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"tail\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":311.489,\\\"max\\\":408.511},\\\"y\\\":{\\\"min\\\":19.195524513850966,\\\"max\\\":708.821}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tail\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#E231F4E7-9D65-4F98-BB08-7C7651A523D8_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 356.075 344.432 C 358.213 394.513 334.162 443.116 334.764 493.108 C 335.547 558.079 346.023 576.703 351.652 618.500 C 345.018 623.988 313.493 579.036 313.489 579.032 C 313.494 579.045 359.995 706.808 360.000 706.821 C 360.005 706.808 406.507 579.045 406.511 579.032 C 406.507 579.036 374.040 621.410 365.823 618.677 C 362.315 576.897 351.407 557.697 355.280 493.094 C 358.272 443.189 387.941 397.157 390.545 347.098 C 393.150 297.043 370.362 248.132 370.569 197.931 C 370.954 104.529 390.056 75.735 395.232 34.494 C 396.185 35.572 391.092 17.752 355.929 21.793 C 337.745 23.883 332.755 32.710 332.752 32.711 C 332.751 32.728 317.214 89.230 322.092 197.820 C 324.345 247.971 353.938 294.355 356.075 344.432 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":359.05,\\\"y\\\":60.958,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":359.05,\\\"y\\\":23.686,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.008,\\\"y\\\":699.798,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":332.37,\\\"y\\\":356.688,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}},{\\\"point\\\":{\\\"x\\\":409.942,\\\"y\\\":356.688,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"E231F4E7-9D65-4F98-BB08-7C7651A523D8_0\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"49.75%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"-93.76%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"teacup\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":21.423336305509697,\\\"max\\\":668.0799393722816},\\\"y\\\":{\\\"min\\\":145.4358158255598,\\\"max\\\":592.805}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"teacup\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"teacup\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#A4A26235-D509-4D4A-9D4F-2D4EE3944D1D_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 204.472 273.448 C 204.461 273.444 144.825 219.053 96.828 231.044 C 50.826 242.535 22.796 276.597 23.434 324.008 C 24.594 410.187 113.152 482.873 268.079 474.057 C 268.076 474.053 282.270 422.078 239.900 431.383 C 157.773 449.419 60.577 392.992 58.385 327.374 C 57.388 297.511 73.076 273.640 102.196 266.946 C 139.191 258.440 173.415 299.737 183.774 315.289 C 203.699 310.699 204.470 273.452 204.472 273.448 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#A4A26235-D509-4D4A-9D4F-2D4EE3944D1D_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 173.492 169.968 C 173.517 169.965 252.958 146.166 416.498 147.489 C 592.191 148.910 659.480 169.965 659.504 169.968 C 659.503 169.989 679.789 282.646 649.106 379.247 C 615.715 484.373 548.945 556.924 526.062 571.230 C 514.893 578.213 459.197 590.805 416.498 590.805 C 373.800 590.805 318.103 578.213 306.934 571.230 C 284.052 556.924 217.281 484.373 183.890 379.247 C 153.207 282.646 173.493 169.989 173.492 169.968 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 188.541 175.843 C 197.905 179.332 216.631 186.309 216.634 186.310 C 216.654 186.313 274.403 208.046 416.600 208.139 C 556.104 208.231 617.073 185.365 617.093 185.363 C 617.096 185.362 635.403 179.516 644.557 176.593 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 419.574 175.151 C 525.445 174.992 551.254 181.959 617.093 185.363 C 617.073 185.365 556.104 208.231 416.600 208.139 C 274.403 208.046 216.654 186.313 216.634 186.310 C 216.655 186.309 310.779 175.313 419.574 175.151 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":273.765,\\\"max\\\":559.232},\\\"y\\\":{\\\"min\\\":248.039,\\\"max\\\":511.951}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":416.498,\\\"y\\\":701.628,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":416.503,\\\"y\\\":151.02,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":24.547,\\\"y\\\":330.254,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872802762408,\\\"y\\\":0.005043737277738205}},{\\\"point\\\":{\\\"x\\\":661.524,\\\"y\\\":330.254,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872802762408,\\\"y\\\":0.005043737277738211}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":530.615,\\\"y\\\":571,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128590215862319,\\\"y\\\":0.701307361534955}},{\\\"point\\\":{\\\"x\\\":303.767,\\\"y\\\":571.024,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986979179091216,\\\"y\\\":0.7154168152269405}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"A4A26235-D509-4D4A-9D4F-2D4EE3944D1D_0\\\",\\\"cx\\\":\\\"48.93%\\\",\\\"cy\\\":\\\"47.63%\\\",\\\"r\\\":\\\"64.25%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"A4A26235-D509-4D4A-9D4F-2D4EE3944D1D_1\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"38.39%\\\",\\\"r\\\":\\\"74.03%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"teardrop\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":220.36295866473466,\\\"max\\\":501.68289994448804},\\\"y\\\":{\\\"min\\\":54.483,\\\"max\\\":698.6065087547835}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"teardrop\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"teardrop\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#CB8A8C54-6EDD-452A-9436-9147768C797E_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 56.483 C 360.011 56.518 376.847 204.487 465.432 402.672 C 549.385 590.491 465.408 697.069 360.000 696.605 C 265.953 696.192 170.941 597.759 254.568 402.672 C 339.372 204.838 359.989 56.518 360.000 56.483 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":247.113,\\\"max\\\":472.887},\\\"y\\\":{\\\"min\\\":414.022,\\\"max\\\":639.796}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":29.002,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":696.608,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":221.736,\\\"y\\\":544.648,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088752084}},{\\\"point\\\":{\\\"x\\\":500.431,\\\"y\\\":544.648,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873181281341,\\\"y\\\":0.005036227050266383}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":461.152,\\\"y\\\":654.284,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064706,\\\"y\\\":0.7012692123096492}},{\\\"point\\\":{\\\"x\\\":262.223,\\\"y\\\":654.332,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987263029800354,\\\"y\\\":0.7153890923992705}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":456.172,\\\"y\\\":382.47,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314454286031285,\\\"y\\\":-0.7754203187279859}},{\\\"point\\\":{\\\"x\\\":263.499,\\\"y\\\":382.549,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817454199674214,\\\"y\\\":-0.7315894903246247}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":76.257,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"CB8A8C54-6EDD-452A-9436-9147768C797E_0\\\",\\\"cx\\\":\\\"50.10%\\\",\\\"cy\\\":\\\"74.21%\\\",\\\"r\\\":\\\"85.80%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"26.67%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"throne\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":129.134,\\\"max\\\":590.8871305046268},\\\"y\\\":{\\\"min\\\":32.891,\\\"max\\\":612.484}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"throne\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"throne2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.852 356.189 C 232.878 356.189 402.383 356.189 487.148 356.189 C 487.148 356.185 487.148 314.716 487.148 314.712 C 487.148 314.684 487.148 34.919 487.148 34.891 C 487.122 34.891 232.878 34.891 232.852 34.891 C 232.852 34.919 232.852 314.687 232.852 314.715 C 232.852 314.719 232.852 342.364 232.852 356.189 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.007 610.484 C 419.336 610.484 300.664 610.484 181.993 610.484 C 181.993 610.461 181.993 381.778 181.993 381.594 C 181.904 381.865 537.971 381.596 538.007 381.596 C 538.007 381.619 538.007 610.461 538.007 610.484 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.007 610.484 C 538.007 610.461 538.007 381.619 538.007 381.596 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.007 330.759 C 538.012 330.759 588.861 330.759 588.866 330.759 C 588.866 330.787 588.866 610.456 588.866 610.484 C 588.861 610.484 538.012 610.484 538.007 610.484 C 538.007 610.461 538.007 381.619 538.007 381.596 C 538.007 381.591 538.007 330.764 538.007 330.759 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 181.993 381.594 C 181.993 381.778 181.993 610.461 181.993 610.484 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 131.134 330.759 C 131.139 330.759 181.988 330.759 181.993 330.759 C 181.993 330.764 181.993 381.553 181.993 381.594 C 181.993 381.778 181.993 610.461 181.993 610.484 C 181.988 610.484 131.139 610.484 131.134 610.484 C 131.134 610.456 131.134 330.787 131.134 330.759 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 181.993 330.759 C 181.988 330.759 131.139 330.759 131.134 330.759 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.007 330.759 C 538.012 330.759 588.861 330.759 588.866 330.759 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 131.134 330.759 C 151.060 325.277 190.907 314.313 190.913 314.312 C 190.917 314.312 218.872 314.580 232.852 314.715 C 215.899 320.063 198.946 325.411 181.993 330.759 C 181.988 330.759 131.139 330.759 131.134 330.759 M 487.148 314.712 C 504.101 320.061 521.054 325.410 538.007 330.759 C 538.012 330.759 588.861 330.759 588.866 330.759 C 568.939 325.277 529.092 314.313 529.086 314.312 C 529.082 314.312 501.127 314.578 487.148 314.712 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.852 356.189 C 232.878 356.189 402.383 356.189 487.148 356.189 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.007 381.596 C 537.971 381.596 181.904 381.865 181.993 381.594 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.852 356.189 C 232.878 356.189 402.383 356.189 487.148 356.189 C 487.153 356.192 538.002 381.594 538.007 381.596 C 537.971 381.596 181.904 381.865 181.993 381.594 C 182.008 381.551 232.847 356.192 232.852 356.189 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 487.148 356.189 C 487.153 356.192 538.002 381.594 538.007 381.596 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.007 381.596 C 538.007 381.591 538.007 330.764 538.007 330.759 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 538.007 330.759 C 521.054 325.410 504.101 320.061 487.148 314.712 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 487.148 314.712 C 487.148 314.716 487.148 356.185 487.148 356.189 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 487.148 356.189 C 487.153 356.192 538.002 381.594 538.007 381.596 C 538.007 381.591 538.007 330.764 538.007 330.759 C 521.054 325.410 504.101 320.061 487.148 314.712 C 487.148 314.716 487.148 356.185 487.148 356.189 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 181.993 330.759 C 198.946 325.411 215.899 320.063 232.852 314.715 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.852 314.715 C 232.852 314.719 232.852 342.364 232.852 356.189 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.852 356.189 C 232.847 356.192 182.008 381.551 181.993 381.594 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 181.993 381.594 C 181.993 381.553 181.993 330.764 181.993 330.759 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 181.993 330.759 C 198.946 325.411 215.899 320.063 232.852 314.715 C 232.852 314.719 232.852 342.364 232.852 356.189 C 232.847 356.192 182.008 381.551 181.993 381.594 C 181.993 381.553 181.993 330.764 181.993 330.759 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 490.545 610.484 C 490.545 549.768 490.545 428.356 490.545 428.337 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 229.455 428.336 C 229.455 489.052 229.455 610.466 229.455 610.484 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 490.545 610.484 C 490.545 549.768 490.545 428.356 490.545 428.337 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 490.545 428.337 C 403.515 428.337 229.481 428.336 229.455 428.336 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 258.073 355.925 C 258.073 258.165 258.073 62.674 258.073 62.644 C 258.094 62.644 461.906 62.644 461.927 62.644 C 461.927 62.674 461.927 258.163 461.927 355.922 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 180.563 332.755 C 178.800 351.327 166.949 358.650 156.304 358.650 C 145.659 358.650 131.415 349.933 132.044 332.755 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 156.304 358.650 C 156.304 358.663 156.297 609.309 156.296 609.321 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 540.348 332.755 C 542.112 351.327 553.962 358.650 564.607 358.650 C 575.253 358.650 589.496 349.933 588.867 332.755 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 564.607 358.650 C 564.607 358.663 564.612 525.764 564.615 609.321 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":201.99,\\\"max\\\":518.01},\\\"y\\\":{\\\"min\\\":56.148,\\\"max\\\":372.169}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":699.058,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":34.223,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":226.594,\\\"y\\\":205.162,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999870963200325,\\\"y\\\":0.005080078092892582}},{\\\"point\\\":{\\\"x\\\":493.407,\\\"y\\\":205.162,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999870940593466,\\\"y\\\":0.005080523077736059}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":585.763,\\\"y\\\":607.412,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128893977892741,\\\"y\\\":0.7012764836493849}},{\\\"point\\\":{\\\"x\\\":134.019,\\\"y\\\":607.467,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698673520772274,\\\"y\\\":0.7154406414033766}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":489.87,\\\"y\\\":31.495,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631411755769355,\\\"y\\\":-0.7754477381979138}},{\\\"point\\\":{\\\"x\\\":230.782,\\\"y\\\":31.57,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817349890681371,\\\"y\\\":-0.731599210415284}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":612.172,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":false,\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"throne_2\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":203.543,\\\"max\\\":516.457},\\\"y\\\":{\\\"min\\\":16.449,\\\"max\\\":628.619}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"throne_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"throne\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 273.840 403.229 C 268.125 397.511 262.411 391.793 256.696 386.076 C 256.696 386.083 256.696 454.976 256.696 454.983 C 256.697 454.983 273.911 454.945 273.913 454.945 C 273.913 454.940 273.840 403.234 273.840 403.229 M 446.087 454.945 C 446.089 454.945 463.303 454.985 463.304 454.985 C 463.304 454.978 463.304 386.083 463.304 386.076 C 457.565 391.815 451.826 397.554 446.087 403.293 C 446.087 403.298 446.087 454.940 446.087 454.945 C 446.070 454.945 273.930 454.945 273.913 454.945 C 273.930 454.945 446.070 454.945 446.087 454.945 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 273.913 454.945 C 273.930 454.945 446.070 454.945 446.087 454.945 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 446.087 454.945 C 446.087 454.940 446.087 403.298 446.087 403.293 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 273.840 403.229 C 273.840 403.234 273.913 454.940 273.913 454.945 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 273.913 454.945 C 273.930 454.945 446.070 454.945 446.087 454.945 C 446.087 454.940 446.087 403.298 446.087 403.293 C 446.087 403.260 446.087 76.195 446.087 76.162 C 446.085 76.164 428.871 93.378 428.870 93.380 C 428.863 93.372 360.007 17.956 360.000 17.949 C 359.993 17.956 291.137 93.372 291.130 93.380 C 291.129 93.378 273.915 76.164 273.913 76.162 C 273.913 76.195 273.840 403.196 273.840 403.229 C 273.840 403.234 273.913 454.940 273.913 454.945 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 463.304 454.985 C 463.304 454.978 463.304 386.083 463.304 386.076 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 463.304 386.076 C 463.309 386.076 514.951 386.076 514.957 386.076 C 514.957 386.100 514.957 627.095 514.957 627.119 C 514.951 627.119 463.309 627.119 463.304 627.119 C 463.304 627.102 463.304 455.002 463.304 454.985 C 463.304 454.978 463.304 386.083 463.304 386.076 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 256.696 386.076 C 256.696 386.083 256.696 454.976 256.696 454.983 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 205.043 386.076 C 205.049 386.076 256.691 386.076 256.696 386.076 C 256.696 386.083 256.696 454.976 256.696 454.983 C 256.696 455.000 256.696 627.102 256.696 627.119 C 256.691 627.119 205.049 627.119 205.043 627.119 C 205.043 627.095 205.043 386.100 205.043 386.076 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 291.130 117.979 C 291.137 117.971 359.993 41.735 360.000 41.728 C 360.007 41.735 428.863 117.971 428.870 117.979 C 428.870 118.013 428.870 454.911 428.870 454.945 C 428.856 454.945 291.144 454.945 291.130 454.945 C 291.130 454.911 291.130 118.013 291.130 117.979 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 256.696 454.983 C 256.697 454.983 273.911 454.945 273.913 454.945 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 273.913 454.945 C 273.930 454.945 446.070 454.945 446.087 454.945 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 446.087 454.945 C 446.089 454.945 463.303 454.985 463.304 454.985 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 256.696 454.983 C 256.697 454.983 273.911 454.945 273.913 454.945 C 273.930 454.945 446.070 454.945 446.087 454.945 C 446.089 454.945 463.303 454.985 463.304 454.985 C 463.304 455.002 463.304 627.102 463.304 627.119 C 463.284 627.119 256.716 627.119 256.696 627.119 C 256.696 627.102 256.696 455.000 256.696 454.983 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 273.913 609.902 C 273.913 609.888 273.913 472.176 273.913 472.163 C 273.930 472.163 446.070 472.163 446.087 472.163 C 446.087 472.176 446.087 609.888 446.087 609.902 C 446.070 609.902 273.930 609.902 273.913 609.902 M 480.522 609.902 C 480.522 609.881 480.522 403.314 480.522 403.293 C 480.524 403.293 497.737 403.293 497.739 403.293 C 497.739 403.314 497.739 609.881 497.739 609.902 C 497.737 609.902 480.524 609.902 480.522 609.902 M 222.261 609.902 C 222.261 609.881 222.261 403.314 222.261 403.293 C 222.263 403.293 239.476 403.293 239.478 403.293 C 239.478 403.314 239.478 609.881 239.478 609.902 C 239.476 609.902 222.263 609.902 222.261 609.902 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":259.174,\\\"max\\\":460.826},\\\"y\\\":{\\\"min\\\":165.304,\\\"max\\\":453.899}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":705.318,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":19.352,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":270.108,\\\"y\\\":318.01,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999870855477114,\\\"y\\\":0.005082198126224567}},{\\\"point\\\":{\\\"x\\\":449.892,\\\"y\\\":318.01,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999870855477114,\\\"y\\\":0.005082198126224567}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":513.361,\\\"y\\\":625.521,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128701131794732,\\\"y\\\":0.7012960870669998}},{\\\"point\\\":{\\\"x\\\":206.513,\\\"y\\\":625.553,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986860295533069,\\\"y\\\":0.7154284255654336}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":446.82,\\\"y\\\":77.846,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314677775352728,\\\"y\\\":-0.7754021188613447}},{\\\"point\\\":{\\\"x\\\":273.764,\\\"y\\\":77.914,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817748460805677,\\\"y\\\":-0.7315620679421659}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":626.671,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":false,\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"toilet\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":111.645,\\\"max\\\":583.641},\\\"y\\\":{\\\"min\\\":36.389,\\\"max\\\":639.5822001429644}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"toilet\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"toilet\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S11\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 280.603 309.585 C 355.484 309.585 388.078 328.871 388.078 342.219 C 388.078 355.567 355.484 374.853 280.603 374.853 C 205.722 374.853 173.127 355.567 173.127 342.219 C 173.127 328.871 205.722 309.585 280.603 309.585 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#C4C924AF-ED23-42D5-B946-A6060D679BA0_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 121.348 342.654 C 118.401 373.430 105.979 457.734 197.929 501.910 C 193.125 533.862 183.137 608.066 183.135 608.079 C 247.171 652.143 424.900 645.339 483.333 607.655 C 478.297 569.883 462.680 507.601 459.317 494.703 C 489.203 472.558 537.437 438.402 526.882 313.936 C 417.383 292.023 329.443 394.026 121.348 342.654 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#C4C924AF-ED23-42D5-B946-A6060D679BA0_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 306.585 77.229 C 306.604 77.233 493.144 119.867 493.163 119.871 C 493.162 119.893 485.241 338.655 485.240 338.677 C 485.224 338.670 324.002 270.056 323.985 270.050 C 323.984 270.030 306.587 77.248 306.585 77.229 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 485.240 338.677 C 485.241 338.655 493.162 119.893 493.163 119.871 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#C4C924AF-ED23-42D5-B946-A6060D679BA0_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 550.382 316.458 C 550.375 316.460 506.954 331.270 485.240 338.677 C 485.241 338.655 493.162 119.893 493.163 119.871 C 521.010 111.169 576.698 93.767 576.706 93.764 C 567.932 167.995 550.384 316.435 550.382 316.458 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 496.397 124.468 C 496.397 124.465 496.397 97.493 496.397 97.490 C 496.397 97.490 295.970 51.459 295.950 51.454 C 295.950 51.457 297.517 77.645 297.517 77.648 C 297.537 77.653 496.379 124.464 496.397 124.468 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 496.397 124.468 C 496.397 124.465 496.397 97.493 496.397 97.490 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 582.641 71.959 C 581.857 80.690 581.074 89.422 580.291 98.153 C 580.282 98.156 496.405 124.465 496.397 124.468 C 496.397 124.465 496.397 97.493 496.397 97.490 C 496.405 97.487 582.632 71.961 582.641 71.959 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 295.950 51.454 C 295.970 51.459 496.397 97.490 496.397 97.490 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 496.397 97.490 C 496.405 97.487 582.632 71.961 582.641 71.959 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S6\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.357 37.389 C 411.345 37.390 334.419 46.766 295.950 51.454 C 295.970 51.459 496.397 97.490 496.397 97.490 C 496.405 97.487 582.632 71.961 582.641 71.959 C 582.624 71.955 411.374 37.392 411.357 37.389 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 388.078 342.219 C 388.078 328.871 355.484 309.585 280.603 309.585 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 280.603 309.585 C 205.722 309.585 173.127 328.871 173.127 342.219 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S7\\\",\\\"fill\\\":\\\"url(#C4C924AF-ED23-42D5-B946-A6060D679BA0_7)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 173.127 311.761 C 173.127 299.967 205.722 279.126 280.603 279.126 C 355.484 279.126 388.078 301.973 388.078 311.761 C 388.078 321.913 388.078 332.066 388.078 342.219 C 388.078 328.871 355.484 309.585 280.603 309.585 C 205.722 309.585 173.127 328.871 173.127 342.219 C 173.127 332.066 173.127 321.913 173.127 311.761 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S8\\\",\\\"fill\\\":\\\"url(#C4C924AF-ED23-42D5-B946-A6060D679BA0_8)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 448.560 317.868 C 448.560 328.021 448.560 338.174 448.560 348.327 C 448.560 378.458 402.149 419.252 280.603 419.252 C 159.056 419.252 112.645 378.458 112.645 348.327 C 112.645 338.174 112.645 328.021 112.645 317.868 C 112.645 343.262 159.056 388.793 280.603 388.793 C 402.149 388.793 448.560 344.044 448.560 317.868 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 173.127 311.761 C 173.127 299.967 205.722 279.126 280.603 279.126 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 280.603 279.126 C 355.484 279.126 388.078 301.973 388.078 311.761 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 448.560 317.868 C 448.560 344.044 402.149 388.793 280.603 388.793 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 280.603 388.793 C 159.056 388.793 112.645 343.262 112.645 317.868 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S9\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 173.127 311.761 C 173.127 299.967 205.722 279.126 280.603 279.126 C 355.484 279.126 388.078 301.973 388.078 311.761 C 388.078 321.549 355.484 344.395 280.603 344.395 C 205.722 344.395 173.127 323.554 173.127 311.761 M 112.645 317.868 C 112.645 292.473 159.056 246.943 280.603 246.943 C 402.149 246.943 448.560 291.692 448.560 317.868 C 448.560 344.044 402.149 388.793 280.603 388.793 C 159.056 388.793 112.645 343.262 112.645 317.868 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 289.388 97.688 C 291.892 94.221 332.054 89.601 336.066 91.082 C 344.579 94.224 340.673 111.372 335.845 111.813 C 331.635 112.197 291.850 114.537 289.244 111.208 C 288.488 110.242 288.670 98.682 289.388 97.688 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 197.929 501.910 C 251.989 519.956 306.094 517.727 349.095 511.114 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":187.999,\\\"max\\\":372.722},\\\"y\\\":{\\\"min\\\":81.288,\\\"max\\\":327.112}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":340.599,\\\"y\\\":706.452,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":413.536,\\\"y\\\":35.083,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":119.152,\\\"y\\\":397.674,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872509621971,\\\"y\\\":0.005049545827858046}},{\\\"point\\\":{\\\"x\\\":520.752,\\\"y\\\":397.674,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872509621971,\\\"y\\\":0.00504954582785804}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":184.786,\\\"y\\\":610.429,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987503380398505,\\\"y\\\":0.7153656163733302}},{\\\"point\\\":{\\\"x\\\":481.306,\\\"y\\\":610.429,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6987835499792276,\\\"y\\\":0.715333174316995}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":340.599,\\\"y\\\":636.332,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"C4C924AF-ED23-42D5-B946-A6060D679BA0_1\\\",\\\"cx\\\":\\\"49.44%\\\",\\\"cy\\\":\\\"38.72%\\\",\\\"r\\\":\\\"88.38%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C4C924AF-ED23-42D5-B946-A6060D679BA0_2\\\",\\\"x1\\\":\\\"43.72%\\\",\\\"y1\\\":\\\"87.58%\\\",\\\"x2\\\":\\\"72.04%\\\",\\\"y2\\\":\\\"-30.88%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C4C924AF-ED23-42D5-B946-A6060D679BA0_3\\\",\\\"x1\\\":\\\"46.06%\\\",\\\"y1\\\":\\\"94.17%\\\",\\\"x2\\\":\\\"-17.48%\\\",\\\"y2\\\":\\\"-34.59%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C4C924AF-ED23-42D5-B946-A6060D679BA0_7\\\",\\\"x1\\\":\\\"-15.00%\\\",\\\"y1\\\":\\\"55.71%\\\",\\\"x2\\\":\\\"123.11%\\\",\\\"y2\\\":\\\"55.71%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"33.73%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"61.18%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"C4C924AF-ED23-42D5-B946-A6060D679BA0_8\\\",\\\"x1\\\":\\\"-27.28%\\\",\\\"y1\\\":\\\"30.44%\\\",\\\"x2\\\":\\\"140.44%\\\",\\\"y2\\\":\\\"30.44%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"33.73%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"61.18%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"crown\\\"]}},{\\\"name\\\":\\\"tower1\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":231.51,\\\"max\\\":488.49},\\\"y\\\":{\\\"min\\\":13.089,\\\"max\\\":670.665}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tower1\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tower1\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"url(#D15380BA-1FC5-4F5D-A3B8-0178DF6898E5_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 245.368 191.165 C 245.391 191.165 474.609 191.165 474.632 191.165 C 474.632 191.212 474.632 668.618 474.632 668.665 C 474.609 668.665 245.391 668.665 245.368 668.665 C 245.368 668.618 245.368 191.212 245.368 191.165 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 282.529 334.021 C 282.529 376.760 317.007 411.239 359.747 411.238 C 402.486 411.238 436.964 376.760 436.964 334.021 C 436.964 291.282 402.486 256.804 359.747 256.804 C 317.007 256.804 282.529 291.281 282.529 334.021 M 303.008 541.200 C 304.377 507.542 328.455 484.208 360.000 484.208 C 391.545 484.208 414.453 503.354 416.992 541.200 C 418.665 566.135 415.802 658.724 415.802 658.736 C 415.791 658.736 304.137 658.993 304.125 658.993 C 304.125 658.981 301.949 567.237 303.008 541.200 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#D15380BA-1FC5-4F5D-A3B8-0178DF6898E5_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 49.781 C 422.360 49.781 472.667 100.087 472.667 162.447 C 443.157 162.103 270.848 161.977 247.333 162.447 C 247.333 100.087 297.640 49.781 360.000 49.781 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#D15380BA-1FC5-4F5D-A3B8-0178DF6898E5_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.747 44.868 C 367.988 44.868 374.636 38.220 374.636 29.979 C 374.636 21.738 367.988 15.089 359.747 15.089 C 351.506 15.089 344.858 21.738 344.858 29.979 C 344.858 38.220 351.506 44.868 359.747 44.868 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"url(#D15380BA-1FC5-4F5D-A3B8-0178DF6898E5_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 233.510 167.121 C 233.535 167.121 486.465 167.121 486.490 167.121 C 486.490 167.123 486.490 186.709 486.490 186.711 C 486.465 186.711 233.535 186.711 233.510 186.711 C 233.510 186.709 233.510 167.123 233.510 167.121 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":301.505,\\\"max\\\":418.495},\\\"y\\\":{\\\"min\\\":275.055,\\\"max\\\":392.045}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":697.445,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":16.282,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":244.775,\\\"y\\\":330.323,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873181281341,\\\"y\\\":0.005036227050270593}},{\\\"point\\\":{\\\"x\\\":475.23,\\\"y\\\":330.323,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873181281341,\\\"y\\\":0.005036227050270593}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":468.421,\\\"y\\\":662.069,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128595268022678,\\\"y\\\":0.7013068479968286}},{\\\"point\\\":{\\\"x\\\":252.713,\\\"y\\\":662.117,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986883991125018,\\\"y\\\":0.7154261114507978}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":440.857,\\\"y\\\":81.958,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314454286031296,\\\"y\\\":-0.7754203187279851}},{\\\"point\\\":{\\\"x\\\":278.893,\\\"y\\\":82.037,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.681708481845693,\\\"y\\\":-0.7316239100655748}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":664.837,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"D15380BA-1FC5-4F5D-A3B8-0178DF6898E5_0\\\",\\\"x1\\\":\\\"-26.35%\\\",\\\"y1\\\":\\\"50.00%\\\",\\\"x2\\\":\\\"127.92%\\\",\\\"y2\\\":\\\"50.00%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"31.76%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"60.78%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"D15380BA-1FC5-4F5D-A3B8-0178DF6898E5_2\\\",\\\"cx\\\":\\\"50.52%\\\",\\\"cy\\\":\\\"165.47%\\\",\\\"r\\\":\\\"176.70%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"D15380BA-1FC5-4F5D-A3B8-0178DF6898E5_3\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"86.01%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"D15380BA-1FC5-4F5D-A3B8-0178DF6898E5_4\\\",\\\"x1\\\":\\\"-24.33%\\\",\\\"y1\\\":\\\"43.96%\\\",\\\"x2\\\":\\\"123.01%\\\",\\\"y2\\\":\\\"43.96%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"31.76%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"60.78%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"tower2\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":222.977,\\\"max\\\":497.023},\\\"y\\\":{\\\"min\\\":21.545,\\\"max\\\":674.291}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tower2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tower2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#2EC80C40-756F-42D8-8DDE-4B48254CDE2D_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 229.314 233.209 C 229.341 233.209 494.227 233.209 494.253 233.209 C 494.253 233.253 494.253 672.247 494.253 672.291 C 494.227 672.291 229.341 672.291 229.314 672.291 C 229.314 672.247 229.314 233.253 229.314 233.209 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 304.222 324.649 C 305.336 291.973 328.921 269.334 359.538 269.333 C 390.155 269.333 412.225 287.927 414.856 324.649 C 416.550 348.295 414.999 436.135 414.999 436.146 C 414.988 436.146 306.617 436.396 306.606 436.396 C 306.606 436.385 303.380 349.361 304.222 324.649 M 304.222 549.327 C 302.974 516.656 328.921 494.011 359.538 494.011 C 390.155 494.011 414.894 512.512 414.856 549.327 C 414.829 574.694 414.999 660.814 414.999 660.825 C 414.988 660.825 306.617 661.075 306.606 661.075 C 306.606 661.064 305.101 572.319 304.222 549.327 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#2EC80C40-756F-42D8-8DDE-4B48254CDE2D_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 108.432 C 360.014 108.443 495.009 227.793 495.023 227.805 C 494.996 227.805 225.004 227.805 224.977 227.805 C 224.991 227.793 359.987 108.443 360.000 108.432 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"url(#2EC80C40-756F-42D8-8DDE-4B48254CDE2D_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 324.293 135.369 C 324.293 135.365 324.293 91.479 324.293 91.475 C 324.300 91.475 394.416 91.475 394.423 91.475 C 394.423 91.479 394.423 135.365 394.423 135.369 C 394.420 135.366 359.692 103.541 359.689 103.537 C 359.685 103.541 324.296 135.366 324.293 135.369 M 321.092 89.649 C 321.092 68.732 337.965 51.858 358.882 51.858 C 379.798 51.858 396.671 68.732 396.671 89.649 C 386.773 89.533 328.979 89.491 321.092 89.649 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S5\\\",\\\"fill\\\":\\\"url(#2EC80C40-756F-42D8-8DDE-4B48254CDE2D_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.185 49.943 C 366.491 49.943 372.384 44.050 372.384 36.744 C 372.384 29.439 366.491 23.545 359.185 23.545 C 351.880 23.545 345.986 29.438 345.986 36.744 C 345.986 44.050 351.880 49.944 359.185 49.943 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":305.616,\\\"max\\\":414.384},\\\"y\\\":{\\\"min\\\":297.459,\\\"max\\\":406.228}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":703.383,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":23.26,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":227.08,\\\"y\\\":348.855,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873200064072,\\\"y\\\":0.005035854088752074}},{\\\"point\\\":{\\\"x\\\":496.048,\\\"y\\\":348.855,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873200064072,\\\"y\\\":0.005035854088752084}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":491.322,\\\"y\\\":668.11,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064727,\\\"y\\\":0.701269212309647}},{\\\"point\\\":{\\\"x\\\":231.894,\\\"y\\\":668.158,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987263029800354,\\\"y\\\":0.7153890923992705}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":438.775,\\\"y\\\":178.561,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314091670147453,\\\"y\\\":-0.7754498460956359}},{\\\"point\\\":{\\\"x\\\":280.975,\\\"y\\\":178.64,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817481203990758,\\\"y\\\":-0.7315869738673094}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":668.864,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"2EC80C40-756F-42D8-8DDE-4B48254CDE2D_0\\\",\\\"x1\\\":\\\"-18.75%\\\",\\\"y1\\\":\\\"50.81%\\\",\\\"x2\\\":\\\"116.53%\\\",\\\"y2\\\":\\\"50.81%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.39%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"30.20%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"67.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"2EC80C40-756F-42D8-8DDE-4B48254CDE2D_2\\\",\\\"x1\\\":\\\"50.44%\\\",\\\"y1\\\":\\\"-51.06%\\\",\\\"x2\\\":\\\"50.44%\\\",\\\"y2\\\":\\\"348.37%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.39%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"53.73%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"2EC80C40-756F-42D8-8DDE-4B48254CDE2D_3\\\",\\\"x1\\\":\\\"-18.85%\\\",\\\"y1\\\":\\\"55.66%\\\",\\\"x2\\\":\\\"118.20%\\\",\\\"y2\\\":\\\"55.66%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.39%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"30.20%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"67.06%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"2EC80C40-756F-42D8-8DDE-4B48254CDE2D_4\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"86.43%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"28.63%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"tree\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":113.489,\\\"max\\\":599.631},\\\"y\\\":{\\\"min\\\":12.102,\\\"max\\\":692.3922471273848}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tree\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tree\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"0\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 358.768 97.012 C 354.056 97.064 353.880 169.858 353.827 196.451 C 353.788 216.195 354.450 212.073 353.330 245.115 C 352.996 254.974 350.136 276.012 346.571 275.988 C 343.367 275.966 325.584 279.894 310.145 279.129 C 289.936 278.127 264.144 275.708 244.850 264.999 C 229.230 256.327 216.948 238.638 207.107 225.543 C 202.310 219.159 197.144 209.779 193.397 202.727 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"0\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 524.821 193.534 C 524.405 194.589 514.241 217.624 510.340 223.749 C 502.642 235.836 493.146 250.571 480.629 261.149 C 466.457 273.126 430.308 275.813 404.943 278.415 C 392.370 279.705 375.300 276.316 371.166 275.520 C 368.105 274.930 365.832 254.835 365.702 245.229 C 365.241 211.298 364.813 200.509 364.655 196.182 C 363.638 168.324 364.080 96.954 358.768 97.012 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 431.955 124.157 C 431.960 124.158 461.476 136.959 479.753 131.939 C 498.030 126.919 516.866 100.837 516.870 100.833 C 516.865 100.833 487.349 88.031 469.072 93.051 C 450.795 98.071 431.959 124.154 431.955 124.157 M 287.324 128.157 C 287.319 128.158 257.582 140.436 239.397 135.095 C 221.211 129.753 202.838 103.342 202.834 103.339 C 202.839 103.338 232.578 91.060 250.763 96.402 C 268.948 101.743 287.321 128.154 287.324 128.157 M 472.131 267.243 C 472.127 267.240 443.230 252.399 435.734 234.870 C 428.255 217.379 437.458 186.302 437.458 186.297 C 437.461 186.301 465.866 201.408 473.329 218.830 C 480.792 236.253 472.131 267.238 472.131 267.243 M 404.314 191.364 C 404.311 191.368 380.538 213.047 377.629 231.775 C 374.719 250.504 390.792 278.374 390.793 278.379 C 390.796 278.375 414.568 256.696 417.478 237.967 C 420.388 219.239 404.315 191.368 404.314 191.364 M 429.293 82.481 C 429.288 82.482 397.117 82.778 382.456 94.791 C 367.796 106.804 361.182 138.290 361.179 138.294 C 361.184 138.293 393.356 137.997 408.016 125.984 C 422.677 113.971 429.291 82.485 429.293 82.481 M 444.036 288.723 C 444.038 288.727 453.147 319.583 468.720 330.386 C 484.294 341.190 516.387 338.913 516.392 338.914 C 516.389 338.910 507.280 308.053 491.706 297.250 C 476.133 286.447 444.040 288.723 444.036 288.723 M 513.863 217.949 C 513.862 217.945 512.975 185.784 500.696 171.346 C 488.416 156.909 456.814 150.873 456.810 150.871 C 456.811 150.875 457.697 183.036 469.977 197.474 C 482.257 211.912 513.858 217.947 513.863 217.949 M 363.006 176.567 C 363.010 176.568 392.527 189.369 410.803 184.349 C 429.080 179.329 447.916 153.246 447.920 153.244 C 447.915 153.243 418.398 140.441 400.122 145.461 C 381.845 150.482 363.009 176.564 363.006 176.567 M 446.176 361.312 C 446.174 361.307 442.747 329.317 429.363 315.896 C 415.980 302.476 384.000 298.959 383.995 298.957 C 383.997 298.962 387.424 330.952 400.807 344.373 C 414.191 357.794 446.172 361.310 446.176 361.312 M 576.341 278.306 C 576.338 278.303 553.127 256.023 534.246 254.363 C 515.366 252.703 488.624 270.590 488.619 270.591 C 488.624 270.594 511.833 292.875 530.714 294.536 C 549.595 296.196 576.337 278.308 576.341 278.306 M 597.631 196.622 C 597.626 196.622 566.570 188.216 549.209 195.822 C 531.849 203.428 516.974 231.956 516.971 231.960 C 516.976 231.960 548.032 240.367 565.392 232.760 C 582.753 225.155 597.627 196.626 597.631 196.622 M 542.280 105.798 C 542.278 105.802 518.324 127.281 515.257 145.986 C 512.191 164.689 528.030 192.693 528.031 192.698 C 528.034 192.694 551.987 171.214 555.054 152.510 C 558.121 133.807 542.282 105.803 542.280 105.798 M 361.367 14.102 C 361.365 14.106 340.525 38.617 340.007 57.563 C 339.488 76.510 358.957 102.124 358.959 102.129 C 358.961 102.125 379.801 77.613 380.319 58.667 C 380.838 39.720 361.369 14.106 361.367 14.102 M 270.180 358.594 C 270.185 358.593 302.945 357.400 317.190 344.520 C 331.248 331.810 335.722 299.788 335.723 299.784 C 335.719 299.785 303.593 301.523 289.485 314.181 C 275.378 326.839 270.182 358.589 270.180 358.594 M 316.934 190.899 C 316.937 190.904 338.454 214.822 339.502 233.746 C 340.550 252.671 321.805 278.820 321.803 278.825 C 321.801 278.820 300.284 254.901 299.236 235.976 C 298.189 217.052 316.933 190.904 316.934 190.899 M 287.186 82.565 C 287.191 82.567 319.362 82.824 334.038 94.819 C 348.712 106.815 355.364 138.293 355.366 138.298 C 355.361 138.296 323.189 138.039 308.515 126.043 C 293.840 114.048 287.188 82.570 287.186 82.565 M 290.160 191.906 C 290.159 191.910 294.543 223.784 284.788 240.034 C 275.034 256.285 244.844 267.405 244.840 267.408 C 244.840 267.404 240.457 235.530 250.212 219.279 C 259.966 203.029 290.156 191.908 290.160 191.906 M 205.700 226.673 C 205.701 226.669 201.907 194.720 211.959 178.653 C 222.012 162.585 252.403 152.023 252.406 152.021 C 252.406 152.026 256.200 183.974 246.147 200.042 C 236.094 216.110 205.705 226.670 205.700 226.673 M 353.362 177.373 C 353.357 177.374 323.620 189.652 305.435 184.310 C 287.249 178.969 268.875 152.558 268.872 152.555 C 268.877 152.554 298.615 140.276 316.800 145.618 C 334.985 150.960 353.358 177.370 353.362 177.373 M 175.104 107.783 C 175.107 107.787 198.362 130.018 200.831 148.810 C 203.300 167.602 186.576 195.088 186.574 195.092 C 186.572 195.088 163.316 172.856 160.848 154.064 C 158.379 135.272 175.103 107.788 175.104 107.783 M 201.940 339.552 C 201.942 339.548 212.094 309.018 228.025 298.750 C 243.956 288.483 275.953 291.848 275.958 291.847 C 275.956 291.851 265.804 322.381 249.873 332.649 C 233.941 342.917 201.944 339.552 201.940 339.552 M 142.211 279.044 C 142.215 279.041 165.180 256.510 184.042 254.644 C 202.903 252.779 229.838 270.375 229.843 270.377 C 229.839 270.380 206.873 292.911 188.011 294.777 C 169.150 296.642 142.215 279.045 142.211 279.044 M 115.489 202.496 C 115.494 202.495 145.538 190.988 163.579 196.797 C 181.621 202.606 199.307 229.482 199.311 229.485 C 199.306 229.486 169.261 240.993 151.220 235.184 C 133.178 229.375 115.493 202.499 115.489 202.496 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 364.655 196.182 C 363.638 168.324 364.080 96.954 358.768 97.012 C 354.056 97.064 353.880 169.858 353.827 196.451 C 353.788 216.195 354.450 212.073 353.330 245.115 C 352.996 254.974 350.136 276.012 346.571 275.988 C 343.367 275.966 325.584 279.894 310.145 279.129 C 289.936 278.127 264.144 275.708 244.850 264.999 C 229.230 256.327 216.948 238.638 207.107 225.543 C 202.310 219.159 197.144 209.779 193.397 202.727 C 191.565 199.279 188.643 192.319 187.827 190.965 C 187.520 190.457 183.845 186.414 183.476 186.508 C 182.914 186.652 182.739 192.131 182.706 192.356 C 182.335 194.919 185.392 202.093 186.576 205.441 C 189.474 213.635 193.383 221.488 197.399 229.396 C 207.698 249.675 225.156 269.693 242.487 280.566 C 252.720 286.986 266.203 289.927 279.541 291.474 C 321.250 296.312 339.093 297.788 339.035 304.384 C 338.771 334.282 312.183 683.225 312.183 683.230 C 312.188 683.231 337.835 690.845 360.667 690.371 C 382.254 689.922 407.722 685.443 407.727 685.442 C 407.726 685.437 380.002 333.958 379.208 303.941 C 379.028 297.119 407.936 296.273 434.586 291.101 C 450.884 287.938 469.943 284.553 482.357 276.094 C 497.330 265.892 512.152 247.313 519.738 228.655 C 522.960 220.731 529.821 196.144 529.532 194.159 C 529.459 193.660 530.098 184.855 529.487 184.783 C 529.135 184.742 525.280 192.370 524.821 193.534 C 524.405 194.589 514.241 217.624 510.340 223.749 C 502.642 235.836 493.146 250.571 480.629 261.149 C 466.457 273.126 430.308 275.813 404.943 278.415 C 392.370 279.705 375.300 276.316 371.166 275.520 C 368.105 274.930 365.832 254.835 365.702 245.229 C 365.241 211.298 364.813 200.509 364.655 196.182 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":669.22,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":361.147,\\\"y\\\":17.601,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":320.976,\\\"y\\\":495.867,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872797200844,\\\"y\\\":0.0050438475419052236}},{\\\"point\\\":{\\\"x\\\":399.024,\\\"y\\\":495.867,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872797200844,\\\"y\\\":0.0050438475419052236}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":408.175,\\\"y\\\":681.813,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129113816460153,\\\"y\\\":0.7012541350463252}},{\\\"point\\\":{\\\"x\\\":311.614,\\\"y\\\":681.865,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987018305428366,\\\"y\\\":0.7154129940084184}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":580.842,\\\"y\\\":164.395,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314314630780419,\\\"y\\\":-0.7754316910180572}},{\\\"point\\\":{\\\"x\\\":136.673,\\\"y\\\":164.493,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817531514888451,\\\"y\\\":-0.7315822854847074}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":691.884,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"tree_bottom\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":84.09622907926148,\\\"max\\\":635.9037709207388},\\\"y\\\":{\\\"min\\\":343.06,\\\"max\\\":699.6175325881919}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tree_bottom\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tree-Bottom\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 406.046 344.060 C 406.047 344.067 411.395 395.303 418.447 410.728 C 426.794 428.984 449.742 423.912 450.722 424.217 C 453.457 425.069 505.344 419.145 546.615 442.461 C 585.620 464.496 592.161 488.373 592.165 488.377 C 592.160 488.374 568.767 468.925 536.603 455.932 C 505.887 443.525 468.901 447.608 468.894 447.607 C 468.903 447.617 538.166 477.675 554.566 545.270 C 570.817 612.252 496.208 648.081 496.204 648.084 C 496.207 648.080 550.572 597.789 531.723 550.215 C 519.421 519.166 506.611 502.906 487.758 489.495 C 474.580 480.121 446.292 464.184 446.288 464.181 C 446.289 464.186 461.059 489.767 458.533 515.048 C 452.950 570.949 411.987 575.244 411.983 575.250 C 411.985 575.245 438.529 555.903 438.926 517.012 C 439.155 494.626 424.270 468.099 412.607 462.316 C 404.458 458.276 385.122 449.016 380.247 451.489 C 366.650 458.385 378.531 506.218 374.036 546.465 C 371.885 565.729 360.017 643.425 360.016 643.435 C 359.993 643.672 348.119 565.729 345.964 546.465 C 341.462 506.219 353.350 458.385 339.753 451.489 C 334.878 449.016 315.542 458.276 307.393 462.316 C 295.730 468.099 280.845 494.626 281.074 517.012 C 281.472 555.903 308.015 575.245 308.017 575.250 C 308.013 575.244 267.050 570.949 261.467 515.048 C 258.941 489.767 273.711 464.186 273.712 464.181 C 273.708 464.184 245.420 480.121 232.242 489.495 C 213.389 502.906 200.579 519.166 188.277 550.215 C 169.428 597.789 223.793 648.080 223.796 648.084 C 223.792 648.081 149.183 612.252 165.434 545.270 C 181.834 477.675 251.097 447.617 251.106 447.607 C 251.099 447.608 214.114 443.525 183.397 455.932 C 151.233 468.925 127.840 488.374 127.835 488.377 C 127.839 488.373 134.380 464.496 173.385 442.461 C 214.656 419.145 266.543 425.069 269.278 424.217 C 270.258 423.912 289.671 426.907 301.553 410.728 C 311.036 397.815 313.953 344.067 313.954 344.060 C 313.963 344.060 406.037 344.060 406.046 344.060 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 313.954 344.060 C 313.963 344.060 406.037 344.060 406.046 344.060 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 420.571 598.959 C 422.803 598.397 422.599 601.823 421.748 602.910 C 418.377 607.219 412.270 603.317 412.053 597.990 C 411.683 588.916 421.749 584.370 428.371 588.224 C 440.888 595.510 436.210 613.712 423.789 617.211 C 398.280 624.395 384.709 590.177 412.005 575.244 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 405.318 490.684 C 403.962 488.823 401.927 491.587 401.885 492.967 C 401.719 498.436 408.908 499.345 412.484 495.390 C 418.575 488.653 413.748 478.719 406.193 477.444 C 391.912 475.033 383.860 492.015 391.167 502.651 C 406.173 524.495 438.497 506.882 427.076 477.940 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 399.128 543.283 C 399.975 541.142 402.638 543.306 403.025 544.632 C 404.557 549.884 397.825 552.567 393.372 549.636 C 385.787 544.642 387.967 533.814 394.961 530.685 C 408.181 524.770 420.235 539.189 415.829 551.318 C 406.781 576.228 371.073 567.284 374.871 536.403 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 470.018 562.115 C 471.374 560.254 473.409 563.018 473.451 564.397 C 473.618 569.866 466.428 570.775 462.852 566.821 C 456.762 560.084 461.589 550.149 469.144 548.874 C 483.425 546.464 491.476 563.445 484.170 574.082 C 469.163 595.925 436.839 578.312 448.261 549.371 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 483.037 517.093 C 481.681 515.232 479.646 517.996 479.604 519.376 C 479.437 524.845 486.627 525.754 490.202 521.799 C 496.293 515.062 491.467 505.128 483.911 503.853 C 469.631 501.442 461.578 518.424 468.885 529.060 C 483.891 550.904 516.216 533.291 504.794 504.350 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 510.492 563.995 C 509.136 562.135 507.101 564.898 507.059 566.278 C 506.892 571.747 514.082 572.656 517.657 568.701 C 523.748 561.965 518.922 552.030 511.367 550.755 C 497.086 548.344 489.034 565.326 496.340 575.962 C 511.347 597.806 543.671 580.193 532.249 551.252 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 494.303 612.841 C 495.894 611.177 492.813 609.664 491.448 609.867 C 486.036 610.672 486.416 617.909 490.942 620.727 C 498.651 625.528 507.573 619.017 507.489 611.355 C 507.330 596.873 489.190 591.958 480.017 601.035 C 461.179 619.674 484.242 648.365 510.701 631.995 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 508.505 670.010 C 510.619 669.099 510.965 672.514 510.299 673.723 C 507.658 678.515 501.007 675.638 499.942 670.414 C 498.128 661.515 507.340 655.421 514.492 658.168 C 528.011 663.362 526.299 682.078 514.595 687.514 C 490.560 698.679 471.701 667.065 496.264 647.967 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 559.619 627.135 C 561.357 625.625 562.722 628.774 562.454 630.128 C 561.392 635.496 554.181 634.772 551.582 630.118 C 547.153 622.188 554.082 613.586 561.730 614.035 C 576.189 614.882 580.235 633.235 570.733 641.966 C 551.218 659.897 523.656 635.495 541.266 609.845 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 581.786 565.928 C 582.314 563.688 585.262 565.445 585.836 566.700 C 588.112 571.676 581.838 575.303 577.008 573.046 C 568.781 569.200 569.375 558.171 575.844 554.064 C 588.071 546.302 602.081 558.830 599.473 571.468 C 594.116 597.422 557.491 593.730 556.790 562.624 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 565.248 503.681 C 564.417 501.534 567.842 501.317 569.025 502.028 C 573.715 504.846 570.591 511.385 565.331 512.253 C 556.371 513.733 550.625 504.300 553.639 497.256 C 559.335 483.940 577.973 486.352 582.968 498.250 C 593.225 522.687 560.928 540.349 542.762 515.089 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 615.611 479.237 C 615.011 477.014 618.440 477.160 619.542 477.992 C 623.908 481.290 620.110 487.462 614.788 487.770 C 605.721 488.294 601.005 478.307 604.745 471.621 C 611.817 458.981 630.096 463.349 633.806 475.709 C 641.424 501.092 607.441 515.243 592.046 488.205 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 535.823 473.999 C 537.193 474.729 535.539 476.348 534.622 476.506 C 530.987 477.132 529.703 472.418 532.006 469.659 C 535.930 464.958 543.017 467.245 544.580 472.169 C 547.534 481.476 536.955 488.450 529.166 484.574 C 513.170 476.613 521.884 453.375 542.281 458.274 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 400.335 640.513 C 398.112 639.915 398.261 643.344 399.094 644.445 C 402.395 648.808 408.564 645.005 408.868 639.682 C 409.384 630.615 399.393 625.907 392.709 629.654 C 380.076 636.736 384.460 655.012 396.823 658.710 C 422.213 666.306 436.334 632.311 409.283 616.939 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 299.429 598.959 C 297.197 598.397 297.401 601.823 298.252 602.910 C 301.623 607.219 307.730 603.317 307.947 597.990 C 308.317 588.916 298.251 584.370 291.629 588.224 C 279.112 595.510 283.790 613.712 296.211 617.211 C 321.720 624.395 335.291 590.177 307.995 575.244 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.681 490.684 C 316.038 488.823 318.073 491.587 318.115 492.967 C 318.281 498.436 311.092 499.345 307.516 495.390 C 301.425 488.653 306.252 478.719 313.807 477.444 C 328.088 475.033 336.140 492.015 328.833 502.651 C 313.827 524.495 281.503 506.882 292.924 477.940 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 320.872 543.283 C 320.025 541.142 317.362 543.306 316.975 544.632 C 315.443 549.884 322.175 552.567 326.628 549.636 C 334.213 544.642 332.033 533.814 325.039 530.685 C 311.819 524.770 299.765 539.189 304.171 551.318 C 313.219 576.227 348.927 567.284 345.129 536.403 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 249.982 562.115 C 248.626 560.254 246.591 563.018 246.549 564.397 C 246.383 569.866 253.572 570.775 257.148 566.821 C 263.238 560.084 258.411 550.149 250.856 548.874 C 236.575 546.464 228.524 563.445 235.830 574.082 C 250.837 595.925 283.161 578.312 271.739 549.371 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 236.963 517.093 C 238.319 515.232 240.354 517.996 240.396 519.376 C 240.563 524.845 233.373 525.754 229.798 521.799 C 223.707 515.062 228.534 505.128 236.089 503.853 C 250.369 501.442 258.422 518.424 251.115 529.060 C 236.109 550.904 203.784 533.291 215.206 504.350 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 209.508 563.995 C 210.864 562.135 212.899 564.898 212.941 566.278 C 213.108 571.747 205.918 572.656 202.343 568.701 C 196.252 561.965 201.078 552.030 208.634 550.755 C 222.914 548.344 230.966 565.326 223.660 575.962 C 208.653 597.806 176.329 580.193 187.751 551.252 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 225.697 612.841 C 224.106 611.177 227.187 609.664 228.552 609.867 C 233.964 610.672 233.584 617.909 229.058 620.727 C 221.349 625.528 212.428 619.017 212.511 611.355 C 212.670 596.873 230.810 591.958 239.983 601.035 C 258.821 619.675 235.758 648.366 209.299 631.995 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 211.495 670.010 C 209.381 669.099 209.035 672.514 209.701 673.723 C 212.342 678.515 218.993 675.638 220.058 670.414 C 221.872 661.515 212.660 655.421 205.508 658.168 C 191.989 663.362 193.701 682.078 205.405 687.514 C 229.440 698.679 248.299 667.065 223.736 647.967 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 160.381 627.135 C 158.643 625.625 157.278 628.774 157.546 630.128 C 158.608 635.496 165.819 634.772 168.418 630.118 C 172.847 622.188 165.918 613.586 158.270 614.035 C 143.812 614.882 139.765 633.235 149.267 641.966 C 168.782 659.897 196.344 635.495 178.734 609.845 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 138.214 565.928 C 137.686 563.688 134.738 565.445 134.164 566.700 C 131.888 571.676 138.162 575.303 142.992 573.046 C 151.219 569.200 150.625 558.171 144.156 554.064 C 131.929 546.302 117.919 558.830 120.527 571.468 C 125.884 597.422 162.509 593.730 163.210 562.624 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 154.752 503.681 C 155.584 501.534 152.158 501.317 150.975 502.028 C 146.285 504.846 149.409 511.385 154.669 512.253 C 163.629 513.733 169.375 504.300 166.361 497.256 C 160.665 483.940 142.027 486.352 137.032 498.250 C 126.775 522.687 159.072 540.349 177.238 515.089 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 104.389 479.237 C 104.989 477.014 101.560 477.160 100.458 477.992 C 96.092 481.290 99.890 487.462 105.212 487.770 C 114.279 488.294 118.995 478.307 115.255 471.621 C 108.183 458.981 89.904 463.349 86.194 475.709 C 78.576 501.092 112.559 515.243 127.954 488.205 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 184.177 473.999 C 182.807 474.729 184.461 476.348 185.378 476.506 C 189.013 477.132 190.297 472.418 187.994 469.659 C 184.070 464.958 176.983 467.245 175.420 472.169 C 172.466 481.476 183.045 488.450 190.834 484.574 C 206.830 476.613 198.116 453.375 177.719 458.274 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 319.665 640.513 C 321.888 639.915 321.739 643.344 320.906 644.445 C 317.605 648.808 311.436 645.005 311.133 639.682 C 310.616 630.615 320.607 625.907 327.291 629.654 C 339.924 636.736 335.540 655.012 323.177 658.710 C 297.787 666.306 283.666 632.311 310.717 616.939 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 366.036 678.729 C 368.108 677.724 368.606 681.120 367.994 682.358 C 365.571 687.263 358.798 684.687 357.500 679.517 C 355.289 670.708 364.218 664.207 371.486 666.631 C 385.225 671.214 384.353 689.987 372.905 695.943 C 349.394 708.174 333.319 675.521 352.819 657.257 C 361.197 649.410 359.971 643.427 359.972 643.426 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":344.043,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":343.585,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}]},\\\"meta\\\":{\\\"always_nest\\\":false,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"tree_rooted\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":94.27,\\\"max\\\":625.73},\\\"y\\\":{\\\"min\\\":26.988,\\\"max\\\":668.4744717460893}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tree_rooted\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tree_rooted\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 309.926 419.822 C 318.070 408.730 320.550 362.561 320.551 362.185 C 320.550 362.179 322.445 311.251 314.597 305.068 C 299.125 292.878 283.246 293.782 282.275 293.511 C 279.912 292.852 235.479 297.857 200.120 277.881 C 166.703 259.003 161.100 238.547 161.096 238.543 C 161.101 238.546 181.142 255.209 208.698 266.340 C 235.014 276.970 266.700 273.472 266.706 273.472 C 266.699 273.464 207.359 247.712 193.308 189.801 C 179.385 132.415 243.305 101.719 243.309 101.717 C 243.306 101.720 195.785 145.194 212.879 185.565 C 223.468 210.574 235.481 222.226 250.545 233.499 C 262.242 242.252 286.070 259.270 286.074 259.273 C 286.074 259.269 280.826 236.803 282.956 215.693 C 287.256 173.079 309.523 164.121 309.526 164.116 C 309.525 164.121 298.156 183.012 298.287 214.011 C 298.381 236.274 303.933 265.204 314.930 272.035 C 322.358 276.649 334.578 283.432 345.678 281.229 C 349.297 280.511 347.147 249.045 349.097 225.270 C 351.038 201.596 359.985 105.410 360.014 105.700 C 360.015 105.712 368.964 201.597 370.903 225.270 C 372.851 249.045 370.885 279.887 374.322 281.229 C 382.821 284.547 398.014 277.764 405.070 272.035 C 415.121 263.875 421.619 236.274 421.713 214.011 C 421.844 183.012 410.475 164.121 410.474 164.116 C 410.477 164.121 432.744 173.079 437.044 215.693 C 439.174 236.803 433.926 259.269 433.926 259.273 C 433.930 259.270 457.758 242.252 469.455 233.499 C 484.519 222.226 496.532 210.574 507.121 185.565 C 524.215 145.194 476.694 101.720 476.691 101.717 C 476.695 101.719 540.615 132.415 526.692 189.801 C 512.641 247.712 453.301 273.464 453.294 273.472 C 453.300 273.472 484.986 276.970 511.302 266.340 C 538.859 255.209 558.899 238.546 558.904 238.543 C 558.900 238.547 553.297 259.003 519.880 277.881 C 484.521 297.857 440.088 292.852 437.725 293.511 C 436.754 293.782 415.109 287.928 405.403 305.068 C 397.555 318.926 399.450 362.179 399.449 362.185 C 399.450 362.261 403.983 406.488 410.074 419.822 C 417.220 435.464 436.885 431.117 437.725 431.379 C 440.068 432.108 484.521 427.033 519.880 447.008 C 553.297 465.887 558.900 486.343 558.904 486.347 C 558.899 486.344 538.858 469.681 511.302 458.550 C 484.986 447.920 453.300 451.418 453.294 451.418 C 453.301 451.426 512.641 477.178 526.692 535.089 C 540.615 592.475 476.695 623.171 476.691 623.174 C 476.694 623.170 523.270 580.084 507.121 539.325 C 496.582 512.725 485.607 498.794 469.455 487.304 C 458.165 479.273 433.930 465.619 433.926 465.617 C 433.927 465.621 446.581 487.537 444.417 509.197 C 439.633 557.089 404.539 560.769 404.535 560.774 C 404.538 560.769 427.278 544.199 427.619 510.879 C 427.815 491.700 415.062 468.973 405.070 464.019 C 398.089 460.558 381.523 452.625 377.347 454.743 C 365.697 460.652 375.876 501.631 372.025 536.113 C 370.182 552.617 360.544 619.185 360.014 619.190 C 359.427 619.196 349.821 552.617 347.975 536.113 C 344.118 501.632 354.303 460.652 342.653 454.743 C 338.477 452.625 321.911 460.558 314.930 464.019 C 304.938 468.973 292.185 491.700 292.381 510.879 C 292.722 544.199 315.462 560.769 315.465 560.774 C 315.461 560.769 280.367 557.089 275.583 509.197 C 273.419 487.537 286.073 465.621 286.074 465.617 C 286.070 465.619 261.835 479.273 250.545 487.304 C 234.393 498.794 223.418 512.725 212.879 539.325 C 196.730 580.084 243.306 623.170 243.309 623.174 C 243.305 623.171 179.385 592.475 193.308 535.089 C 207.359 477.178 266.699 451.426 266.706 451.418 C 266.700 451.418 235.014 447.920 208.698 458.550 C 181.142 469.681 161.101 486.344 161.096 486.347 C 161.100 486.343 166.703 465.887 200.120 447.008 C 235.479 427.033 279.933 432.108 282.275 431.379 C 283.115 431.117 299.748 433.684 309.926 419.822 M 304.208 212.454 C 304.209 212.457 306.821 234.520 316.266 243.509 C 325.689 252.477 347.803 253.999 347.806 254.000 C 347.805 253.997 344.904 232.186 335.520 223.244 C 326.136 214.302 304.211 212.455 304.208 212.454 M 278.496 348.976 C 278.496 340.372 271.555 333.431 262.951 333.431 C 254.347 333.431 247.405 340.372 247.405 348.976 C 247.405 357.581 254.347 364.522 262.951 364.522 C 271.555 364.522 278.496 357.581 278.496 348.976 M 191.593 343.838 C 191.593 335.234 184.652 328.292 176.048 328.292 C 167.443 328.292 160.502 335.234 160.502 343.838 C 160.502 352.442 167.443 359.383 176.048 359.383 C 184.652 359.383 191.593 352.442 191.593 343.838 M 130.483 303.098 C 130.483 294.494 123.542 287.553 114.938 287.553 C 106.334 287.553 99.393 294.494 99.393 303.098 C 99.393 311.702 106.334 318.643 114.938 318.643 C 123.542 318.643 130.484 311.702 130.483 303.098 M 237.693 61.876 C 237.693 53.272 230.752 46.331 222.148 46.331 C 213.544 46.331 206.602 53.272 206.602 61.876 C 206.602 70.480 213.544 77.422 222.148 77.422 C 230.752 77.422 237.693 70.480 237.693 61.876 M 139.060 158.365 C 139.060 149.761 132.119 142.820 123.515 142.820 C 114.910 142.820 107.969 149.761 107.969 158.365 C 107.969 166.969 114.910 173.911 123.515 173.911 C 132.119 173.911 139.060 166.969 139.060 158.365 M 247.342 161.582 C 247.342 152.977 240.401 146.036 231.797 146.036 C 223.192 146.036 216.251 152.977 216.251 161.582 C 216.251 170.186 223.192 177.127 231.797 177.127 C 240.401 177.127 247.342 170.186 247.342 161.582 M 330.965 70.453 C 330.965 61.849 324.024 54.908 315.420 54.908 C 306.816 54.908 299.875 61.849 299.875 70.453 C 299.875 79.058 306.816 85.999 315.420 85.999 C 324.024 85.999 330.965 79.057 330.965 70.453 M 304.163 109.049 C 304.163 100.444 297.222 93.503 288.618 93.503 C 280.013 93.503 273.072 100.444 273.072 109.049 C 273.072 117.653 280.013 124.594 288.618 124.594 C 297.222 124.594 304.163 117.653 304.163 109.049 M 150.028 180.935 C 150.030 180.937 157.449 199.888 167.900 205.670 C 178.327 211.439 198.279 207.672 198.282 207.672 C 198.280 207.670 190.663 189.009 180.277 183.255 C 169.891 177.500 150.031 180.935 150.028 180.935 M 178.739 237.847 C 178.741 237.848 190.157 248.546 199.322 249.103 C 208.466 249.658 221.067 240.446 221.069 240.445 C 221.067 240.444 209.610 230.012 200.499 229.453 C 191.388 228.894 178.741 237.846 178.739 237.847 M 350.132 205.078 C 350.132 205.076 351.017 188.809 345.323 181.128 C 339.643 173.465 323.859 169.587 323.857 169.586 C 323.857 169.588 323.212 185.710 328.867 193.349 C 334.523 200.988 350.130 205.077 350.132 205.078 M 282.544 214.842 C 282.542 214.840 273.489 194.911 261.935 189.299 C 250.406 183.700 229.193 188.887 229.190 188.887 C 229.192 188.890 238.440 208.495 249.924 214.081 C 261.407 219.668 282.540 214.842 282.544 214.842 M 245.630 126.151 C 245.631 126.154 246.667 152.475 256.994 163.978 C 267.299 175.455 293.295 179.311 293.298 179.312 C 293.297 179.308 291.897 153.258 281.637 141.816 C 271.377 130.374 245.633 126.153 245.630 126.151 M 344.062 96.534 C 344.059 96.536 318.275 107.477 310.725 122.078 C 303.191 136.647 309.146 163.950 309.146 163.954 C 309.149 163.952 334.527 152.750 342.042 138.239 C 349.557 123.728 344.062 96.538 344.062 96.534 M 360.425 28.988 C 360.424 28.991 342.441 50.466 342.361 66.903 C 342.281 83.304 360.007 104.908 360.008 104.912 C 360.010 104.908 377.512 83.386 377.602 67.045 C 377.692 50.703 360.427 28.991 360.425 28.988 M 293.417 45.635 C 293.413 45.636 265.697 49.676 254.689 61.882 C 243.705 74.062 242.535 101.983 242.534 101.987 C 242.537 101.985 269.927 97.590 280.879 85.462 C 291.831 73.333 293.416 45.639 293.417 45.635 M 178.036 57.753 C 178.036 57.757 170.720 84.794 177.543 99.749 C 184.350 114.670 209.503 126.846 209.506 126.849 C 209.506 126.845 216.366 99.967 209.593 85.095 C 202.819 70.223 178.039 57.756 178.036 57.753 M 133.675 114.498 C 133.677 114.502 138.449 142.102 150.944 152.782 C 163.410 163.439 191.352 163.868 191.356 163.869 C 191.354 163.866 186.235 136.602 173.821 125.976 C 161.406 115.349 133.680 114.500 133.675 114.498 M 108.693 182.330 C 108.694 182.334 110.129 210.306 121.256 222.406 C 132.358 234.478 160.047 238.248 160.051 238.249 C 160.049 238.245 158.230 210.565 147.176 198.530 C 136.122 186.494 108.697 182.332 108.693 182.330 M 96.270 266.745 C 96.274 266.746 120.422 280.936 136.647 278.302 C 152.836 275.673 171.218 254.624 171.221 254.622 C 171.217 254.621 147.102 240.912 130.970 243.521 C 114.838 246.130 96.274 266.742 96.270 266.745 M 138.742 324.774 C 138.746 324.773 166.722 326.124 179.867 316.254 C 192.983 306.407 199.484 279.229 199.486 279.225 C 199.482 279.226 171.758 278.287 158.684 288.090 C 145.610 297.894 138.744 324.770 138.742 324.774 M 206.870 359.788 C 206.873 359.786 232.777 349.132 240.489 334.616 C 248.183 320.132 242.533 292.764 242.533 292.760 C 242.530 292.763 217.029 303.681 209.353 318.108 C 201.677 332.535 206.870 359.784 206.870 359.788 M 301.739 342.753 C 301.739 342.750 306.295 323.214 301.035 312.681 C 295.787 302.172 277.477 294.090 277.474 294.088 C 277.475 294.091 273.241 313.502 278.463 323.977 C 283.686 334.451 301.737 342.751 301.739 342.753 M 441.504 348.976 C 441.504 340.372 448.445 333.431 457.049 333.431 C 465.653 333.431 472.595 340.372 472.595 348.976 C 472.595 357.581 465.653 364.522 457.049 364.522 C 448.445 364.522 441.504 357.581 441.504 348.976 M 528.407 343.838 C 528.407 335.234 535.348 328.292 543.952 328.292 C 552.557 328.292 559.498 335.234 559.498 343.838 C 559.498 352.442 552.557 359.383 543.952 359.383 C 535.348 359.383 528.407 352.442 528.407 343.838 M 589.517 303.098 C 589.517 294.494 596.458 287.553 605.062 287.553 C 613.666 287.553 620.607 294.494 620.607 303.098 C 620.607 311.702 613.666 318.643 605.062 318.643 C 596.458 318.643 589.516 311.702 589.517 303.098 M 482.307 61.876 C 482.307 53.272 489.248 46.331 497.852 46.331 C 506.456 46.331 513.398 53.272 513.398 61.876 C 513.398 70.480 506.456 77.422 497.852 77.422 C 489.248 77.422 482.307 70.480 482.307 61.876 M 580.940 158.365 C 580.940 149.761 587.881 142.820 596.485 142.820 C 605.090 142.820 612.031 149.761 612.031 158.365 C 612.031 166.969 605.090 173.911 596.485 173.911 C 587.881 173.911 580.940 166.969 580.940 158.365 M 472.658 161.582 C 472.658 152.977 479.599 146.036 488.203 146.036 C 496.808 146.036 503.749 152.977 503.749 161.582 C 503.749 170.186 496.808 177.127 488.203 177.127 C 479.599 177.127 472.658 170.186 472.658 161.582 M 389.035 70.453 C 389.035 61.849 395.976 54.908 404.580 54.908 C 413.184 54.908 420.125 61.849 420.125 70.453 C 420.125 79.058 413.184 85.999 404.580 85.999 C 395.976 85.999 389.035 79.057 389.035 70.453 M 415.837 109.049 C 415.837 100.444 422.778 93.503 431.382 93.503 C 439.987 93.503 446.928 100.444 446.928 109.049 C 446.928 117.653 439.987 124.594 431.382 124.594 C 422.778 124.594 415.837 117.653 415.837 109.049 M 569.972 180.935 C 569.970 180.937 562.551 199.888 552.100 205.670 C 541.673 211.439 521.721 207.672 521.718 207.672 C 521.720 207.670 529.337 189.009 539.723 183.255 C 550.109 177.500 569.969 180.935 569.972 180.935 M 541.261 237.847 C 541.259 237.848 529.843 248.546 520.678 249.103 C 511.534 249.658 498.933 240.446 498.931 240.445 C 498.933 240.444 510.390 230.012 519.501 229.453 C 528.612 228.894 541.259 237.846 541.261 237.847 M 369.868 205.078 C 369.868 205.076 368.983 188.809 374.677 181.128 C 380.357 173.465 396.141 169.587 396.143 169.586 C 396.143 169.588 396.788 185.710 391.133 193.349 C 385.477 200.988 369.870 205.077 369.868 205.078 M 437.456 214.842 C 437.458 214.840 446.511 194.911 458.065 189.299 C 469.594 183.700 490.807 188.887 490.810 188.887 C 490.808 188.890 481.560 208.495 470.076 214.081 C 458.593 219.668 437.460 214.842 437.456 214.842 M 474.370 126.151 C 474.369 126.154 473.333 152.475 463.006 163.978 C 452.701 175.455 426.705 179.311 426.702 179.312 C 426.703 179.308 428.103 153.258 438.363 141.816 C 448.623 130.374 474.367 126.153 474.370 126.151 M 415.431 212.454 C 415.430 212.457 412.818 234.520 403.373 243.509 C 393.950 252.477 371.836 253.999 371.833 254.000 C 371.834 253.997 374.735 232.186 384.119 223.244 C 393.503 214.302 415.428 212.455 415.431 212.454 M 375.938 96.534 C 375.941 96.536 401.725 107.477 409.275 122.078 C 416.809 136.647 410.854 163.950 410.854 163.954 C 410.851 163.952 385.473 152.750 377.958 138.239 C 370.443 123.728 375.938 96.538 375.938 96.534 M 426.583 45.635 C 426.587 45.636 454.303 49.676 465.311 61.882 C 476.295 74.062 477.465 101.983 477.466 101.987 C 477.463 101.985 450.073 97.590 439.121 85.462 C 428.169 73.333 426.584 45.639 426.583 45.635 M 541.964 57.753 C 541.964 57.757 549.280 84.794 542.457 99.749 C 535.650 114.670 510.497 126.846 510.494 126.849 C 510.494 126.845 503.634 99.967 510.407 85.095 C 517.181 70.223 541.961 57.756 541.964 57.753 M 586.325 114.498 C 586.323 114.502 581.551 142.102 569.056 152.782 C 556.590 163.439 528.648 163.868 528.644 163.869 C 528.646 163.866 533.765 136.602 546.179 125.976 C 558.594 115.349 586.320 114.500 586.325 114.498 M 611.307 182.330 C 611.306 182.334 609.871 210.306 598.744 222.406 C 587.642 234.478 559.953 238.248 559.949 238.249 C 559.951 238.245 561.770 210.565 572.824 198.530 C 583.878 186.494 611.304 182.332 611.307 182.330 M 623.730 266.745 C 623.726 266.746 599.578 280.936 583.353 278.302 C 567.164 275.673 548.782 254.624 548.779 254.622 C 548.783 254.621 572.898 240.912 589.030 243.521 C 605.162 246.130 623.726 266.742 623.730 266.745 M 581.258 324.774 C 581.254 324.773 553.278 326.124 540.133 316.254 C 527.018 306.407 520.516 279.229 520.514 279.225 C 520.518 279.226 548.242 278.287 561.316 288.090 C 574.390 297.894 581.256 324.770 581.258 324.774 M 513.130 359.788 C 513.127 359.786 487.223 349.132 479.511 334.616 C 471.817 320.132 477.467 292.764 477.467 292.760 C 477.470 292.763 502.971 303.681 510.647 318.108 C 518.323 332.535 513.130 359.784 513.130 359.788 M 418.261 342.753 C 418.261 342.750 413.705 323.214 418.965 312.681 C 424.213 302.172 442.523 294.090 442.526 294.088 C 442.525 294.091 446.759 313.502 441.537 323.977 C 436.314 334.451 418.263 342.751 418.261 342.753 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 411.931 581.093 C 413.844 580.612 413.668 583.547 412.940 584.479 C 410.051 588.170 404.819 584.828 404.633 580.264 C 404.316 572.490 412.940 568.595 418.613 571.897 C 429.337 578.139 425.329 593.733 414.688 596.731 C 392.833 602.886 381.207 573.570 404.592 560.776 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 398.864 488.331 C 397.702 486.737 395.958 489.104 395.922 490.286 C 395.780 494.972 401.939 495.750 405.002 492.362 C 410.221 486.591 406.085 478.080 399.613 476.987 C 387.378 474.922 380.479 489.471 386.739 498.583 C 399.596 517.298 427.289 502.208 417.504 477.413 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 393.561 533.394 C 394.285 531.560 396.567 533.414 396.898 534.549 C 398.212 539.049 392.444 541.348 388.629 538.837 C 382.130 534.558 383.999 525.282 389.990 522.601 C 401.316 517.533 411.643 529.887 407.869 540.278 C 400.117 561.619 369.524 553.957 372.778 527.500 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 454.294 549.528 C 455.456 547.934 457.199 550.301 457.235 551.483 C 457.378 556.169 451.218 556.948 448.155 553.560 C 442.937 547.788 447.073 539.277 453.545 538.184 C 465.780 536.119 472.679 550.668 466.419 559.780 C 453.562 578.495 425.869 563.405 435.654 538.610 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 465.448 510.956 C 464.286 509.362 462.543 511.730 462.507 512.912 C 462.364 517.597 468.524 518.376 471.587 514.988 C 476.805 509.217 472.670 500.705 466.197 499.613 C 453.962 497.548 447.064 512.096 453.324 521.209 C 466.180 539.923 493.874 524.834 484.088 500.038 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 488.970 551.139 C 487.808 549.545 486.064 551.913 486.028 553.095 C 485.885 557.780 492.045 558.559 495.109 555.171 C 500.327 549.400 496.192 540.888 489.719 539.796 C 477.484 537.731 470.585 552.279 476.845 561.392 C 489.702 580.106 517.395 565.017 507.610 540.221 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 475.100 592.987 C 476.463 591.561 473.824 590.265 472.654 590.439 C 468.017 591.129 468.343 597.329 472.220 599.744 C 478.825 603.856 486.469 598.278 486.397 591.714 C 486.260 579.307 470.719 575.096 462.861 582.872 C 446.721 598.842 466.480 623.422 489.149 609.397 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 487.267 641.966 C 489.079 641.185 489.375 644.111 488.804 645.147 C 486.542 649.252 480.843 646.787 479.931 642.312 C 478.377 634.688 486.269 629.466 492.396 631.821 C 503.979 636.271 502.512 652.305 492.485 656.962 C 471.893 666.527 455.736 639.443 476.780 623.081 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 531.058 605.233 C 532.548 603.939 533.717 606.637 533.488 607.798 C 532.578 612.396 526.400 611.776 524.173 607.788 C 520.379 600.995 526.315 593.626 532.867 594.010 C 545.254 594.736 548.721 610.459 540.580 617.939 C 523.861 633.301 500.248 612.396 515.335 590.420 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 550.050 552.795 C 550.503 550.875 553.028 552.381 553.520 553.457 C 555.469 557.720 550.094 560.827 545.956 558.893 C 538.908 555.598 539.417 546.149 544.959 542.631 C 555.434 535.981 567.437 546.714 565.203 557.541 C 560.614 579.778 529.236 576.614 528.635 549.965 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 535.881 499.466 C 535.169 497.626 538.103 497.440 539.117 498.049 C 543.135 500.463 540.459 506.066 535.953 506.810 C 528.276 508.077 523.353 499.996 525.935 493.961 C 530.815 482.553 546.783 484.619 551.062 494.813 C 559.850 515.748 532.180 530.880 516.617 509.239 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 579.029 478.524 C 578.515 476.619 581.453 476.744 582.396 477.457 C 586.137 480.282 582.884 485.570 578.324 485.834 C 570.556 486.284 566.515 477.727 569.720 471.998 C 575.778 461.170 591.439 464.912 594.617 475.501 C 601.144 497.247 572.030 509.371 558.840 486.207 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 510.672 474.036 C 511.845 474.662 510.429 476.049 509.643 476.184 C 506.528 476.720 505.429 472.682 507.402 470.318 C 510.764 466.290 516.835 468.250 518.174 472.468 C 520.705 480.442 511.641 486.417 504.968 483.096 C 491.264 476.275 498.730 456.366 516.205 460.564 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 394.594 616.694 C 392.689 616.182 392.817 619.120 393.531 620.063 C 396.359 623.801 401.645 620.543 401.904 615.983 C 402.347 608.215 393.787 604.181 388.061 607.391 C 377.238 613.459 380.994 629.116 391.585 632.285 C 413.338 638.792 425.436 609.667 402.260 596.498 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 308.145 581.093 C 306.232 580.612 306.407 583.547 307.136 584.479 C 310.024 588.171 315.256 584.828 315.442 580.264 C 315.759 572.490 307.135 568.595 301.462 571.897 C 290.738 578.139 294.746 593.733 305.387 596.731 C 327.242 602.886 338.869 573.570 315.483 560.776 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 321.212 488.331 C 322.374 486.737 324.117 489.104 324.153 490.286 C 324.296 494.972 318.136 495.751 315.073 492.362 C 309.855 486.591 313.990 478.080 320.463 476.987 C 332.698 474.922 339.596 489.471 333.336 498.583 C 320.480 517.298 292.786 502.208 302.572 477.413 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 326.515 533.394 C 325.790 531.560 323.508 533.414 323.177 534.549 C 321.864 539.049 327.631 541.348 331.446 538.837 C 337.945 534.559 336.077 525.282 330.085 522.601 C 318.759 517.533 308.432 529.887 312.207 540.278 C 319.959 561.619 350.551 553.957 347.297 527.500 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 265.782 549.528 C 264.620 547.934 262.876 550.301 262.840 551.483 C 262.697 556.169 268.857 556.948 271.920 553.560 C 277.138 547.788 273.003 539.277 266.530 538.184 C 254.295 536.119 247.397 550.668 253.657 559.780 C 266.513 578.495 294.207 563.405 284.421 538.610 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 254.627 510.956 C 255.789 509.362 257.533 511.730 257.569 512.912 C 257.711 517.598 251.552 518.376 248.488 514.988 C 243.270 509.216 247.406 500.705 253.878 499.613 C 266.113 497.548 273.012 512.096 266.752 521.209 C 253.895 539.923 226.202 524.834 235.987 500.038 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 231.106 551.139 C 232.267 549.545 234.011 551.913 234.047 553.095 C 234.190 557.780 228.030 558.559 224.967 555.171 C 219.748 549.400 223.884 540.888 230.357 539.796 C 242.592 537.731 249.490 552.279 243.230 561.392 C 230.373 580.106 202.681 565.016 212.466 540.221 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 244.975 592.987 C 243.612 591.561 246.252 590.265 247.422 590.439 C 252.058 591.129 251.733 597.329 247.855 599.744 C 241.250 603.856 233.607 598.278 233.679 591.714 C 233.815 579.307 249.356 575.096 257.214 582.872 C 273.354 598.842 253.595 623.422 230.927 609.397 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 232.808 641.966 C 230.997 641.185 230.701 644.111 231.271 645.147 C 233.533 649.253 239.232 646.787 240.144 642.312 C 241.698 634.688 233.807 629.467 227.679 631.821 C 216.097 636.271 217.564 652.305 227.590 656.962 C 248.182 666.528 264.339 639.443 243.296 623.081 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 189.017 605.233 C 187.528 603.939 186.358 606.638 186.588 607.798 C 187.498 612.396 193.675 611.776 195.902 607.788 C 199.696 600.995 193.761 593.626 187.208 594.010 C 174.821 594.736 171.354 610.459 179.495 617.939 C 196.214 633.301 219.827 612.396 204.740 590.420 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 170.025 552.795 C 169.573 550.875 167.047 552.381 166.555 553.457 C 164.606 557.720 169.981 560.827 174.119 558.893 C 181.168 555.598 180.658 546.149 175.116 542.631 C 164.641 535.981 152.638 546.714 154.873 557.541 C 159.462 579.778 190.840 576.614 191.441 549.965 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 184.194 499.466 C 184.907 497.627 181.972 497.440 180.958 498.049 C 176.940 500.463 179.617 506.066 184.123 506.810 C 191.800 508.077 196.722 499.996 194.140 493.961 C 189.260 482.553 173.292 484.619 169.013 494.813 C 160.225 515.748 187.895 530.880 203.459 509.239 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 141.047 478.524 C 141.561 476.619 138.623 476.744 137.679 477.457 C 133.938 480.282 137.192 485.570 141.752 485.834 C 149.519 486.284 153.560 477.727 150.355 471.998 C 144.297 461.170 128.637 464.912 125.459 475.501 C 118.932 497.247 148.046 509.371 161.236 486.207 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 209.404 474.036 C 208.230 474.662 209.647 476.049 210.432 476.184 C 213.547 476.721 214.647 472.682 212.674 470.318 C 209.312 466.290 203.241 468.250 201.902 472.468 C 199.371 480.441 208.434 486.417 215.107 483.096 C 228.811 476.275 221.345 456.367 203.871 460.564 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 325.481 616.694 C 327.386 616.182 327.258 619.120 326.545 620.063 C 323.716 623.801 318.431 620.543 318.171 615.983 C 317.729 608.215 326.288 604.181 332.014 607.391 C 342.837 613.459 339.082 629.116 328.490 632.285 C 306.738 638.792 294.640 609.667 317.815 596.498 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 365.209 649.436 C 366.984 648.575 367.410 651.484 366.887 652.545 C 364.811 656.748 359.008 654.541 357.896 650.111 C 356.002 642.564 363.651 636.994 369.878 639.071 C 381.649 642.997 380.901 659.081 371.094 664.183 C 350.951 674.662 337.179 646.687 353.885 631.040 C 361.063 624.317 360.013 619.191 360.014 619.190 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":325.455,\\\"max\\\":394.545},\\\"y\\\":{\\\"min\\\":291.955,\\\"max\\\":439.695}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.248,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":25.81,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":150.088,\\\"y\\\":394.202,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999870300004793,\\\"y\\\":0.005093116022688263}},{\\\"point\\\":{\\\"x\\\":569.912,\\\"y\\\":394.202,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999870300004793,\\\"y\\\":0.005093116022688246}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":583.192,\\\"y\\\":577.868,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129281960130468,\\\"y\\\":0.7012370407569631}},{\\\"point\\\":{\\\"x\\\":137.892,\\\"y\\\":577.914,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987339946258879,\\\"y\\\":0.7153815798258644}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":598.395,\\\"y\\\":100.542,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314282071167722,\\\"y\\\":-0.7754343423251893}},{\\\"point\\\":{\\\"x\\\":122.407,\\\"y\\\":100.622,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817484770169053,\\\"y\\\":-0.7315866415436589}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":670.337,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"tree_top\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":51.169,\\\"max\\\":668.831},\\\"y\\\":{\\\"min\\\":80.297,\\\"max\\\":473.939}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tree_top\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"tree_top\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 313.954 470.212 C 313.963 470.212 406.037 470.212 406.046 470.212 C 406.047 470.205 403.835 419.719 412.995 403.544 C 424.325 383.538 449.590 390.371 450.722 390.055 C 453.481 389.285 505.344 395.127 546.615 371.811 C 585.620 349.776 592.161 325.899 592.165 325.895 C 592.160 325.898 568.767 345.348 536.603 358.340 C 505.887 370.747 468.901 366.664 468.894 366.665 C 468.903 366.655 538.166 336.597 554.566 269.002 C 570.817 202.020 496.208 166.191 496.204 166.188 C 496.207 166.192 551.675 216.935 531.723 264.057 C 519.363 293.248 505.340 306.848 487.758 320.006 C 474.105 330.223 446.292 350.088 446.288 350.091 C 446.288 350.086 452.414 323.864 449.927 299.224 C 444.909 249.484 418.917 239.028 418.914 239.022 C 418.916 239.027 432.185 261.077 432.033 297.260 C 431.923 323.246 424.338 355.463 412.607 364.987 C 404.370 371.674 386.637 379.591 376.717 375.718 C 372.705 374.152 375.000 338.152 372.727 310.402 C 370.463 282.770 360.017 170.852 360.016 170.838 C 359.983 170.498 349.540 282.770 347.273 310.402 C 344.997 338.152 347.508 374.880 343.283 375.718 C 330.327 378.290 316.063 370.373 307.393 364.987 C 294.557 357.013 288.077 323.246 287.967 297.260 C 287.815 261.077 301.084 239.027 301.086 239.022 C 301.083 239.028 275.091 249.484 270.073 299.224 C 267.586 323.864 273.712 350.086 273.712 350.091 C 273.708 350.088 245.895 330.223 232.242 320.006 C 214.660 306.848 200.637 293.248 188.277 264.057 C 168.325 216.935 223.793 166.192 223.796 166.188 C 223.792 166.191 149.183 202.020 165.434 269.002 C 181.834 336.597 251.097 366.655 251.106 366.665 C 251.099 366.664 214.114 370.747 183.397 358.340 C 151.233 345.348 127.840 325.898 127.835 325.895 C 127.839 325.899 134.380 349.776 173.385 371.811 C 214.656 395.127 266.519 389.285 269.278 390.055 C 270.411 390.371 288.945 389.316 307.005 403.544 C 316.166 410.761 313.953 470.205 313.954 470.212 M 114.917 258.653 C 114.919 258.656 123.579 280.775 135.777 287.524 C 147.947 294.258 171.235 289.861 171.239 289.862 C 171.237 289.859 162.346 268.078 150.224 261.361 C 138.102 254.643 114.921 258.653 114.917 258.653 M 148.428 325.083 C 148.431 325.084 161.756 337.571 172.454 338.220 C 183.127 338.868 197.835 328.115 197.837 328.114 C 197.835 328.113 184.461 315.937 173.827 315.285 C 163.192 314.632 148.431 325.082 148.428 325.083 M 348.482 286.834 C 348.482 286.831 349.515 267.844 342.869 258.879 C 336.238 249.935 317.815 245.408 317.813 245.406 C 317.813 245.409 317.060 264.226 323.661 273.143 C 330.263 282.059 348.480 286.832 348.482 286.834 M 269.592 298.230 C 269.589 298.227 259.023 274.967 245.536 268.417 C 232.080 261.881 207.320 267.935 207.316 267.935 C 207.318 267.938 218.113 290.822 231.517 297.342 C 244.921 303.863 269.588 298.230 269.592 298.230 M 226.505 194.708 C 226.506 194.712 227.716 225.434 239.770 238.861 C 251.797 252.257 282.140 256.757 282.144 256.759 C 282.143 256.755 280.508 226.349 268.533 212.993 C 256.557 199.637 226.509 194.710 226.505 194.708 M 341.397 160.139 C 341.393 160.141 311.298 172.912 302.485 189.955 C 293.692 206.959 300.642 238.828 300.642 238.833 C 300.646 238.830 330.267 225.755 339.039 208.818 C 347.811 191.880 341.396 160.144 341.397 160.139 M 360.496 81.297 C 360.494 81.301 339.505 106.367 339.412 125.553 C 339.319 144.696 360.008 169.913 360.010 169.917 C 360.012 169.913 380.441 144.792 380.545 125.718 C 380.650 106.644 360.498 81.302 360.496 81.297 M 282.283 100.728 C 282.279 100.729 249.927 105.444 237.078 119.692 C 224.258 133.909 222.893 166.498 222.891 166.503 C 222.896 166.501 254.865 161.372 267.648 147.215 C 280.432 133.058 282.281 100.733 282.283 100.728 M 147.608 114.873 C 147.608 114.877 139.069 146.435 147.032 163.891 C 154.978 181.307 184.337 195.520 184.340 195.523 C 184.340 195.518 192.347 164.145 184.442 146.787 C 176.536 129.428 147.612 114.876 147.608 114.873 M 95.829 181.107 C 95.831 181.111 101.402 213.326 115.986 225.793 C 130.537 238.232 163.151 238.733 163.155 238.734 C 163.153 238.730 157.178 206.907 142.688 194.504 C 128.197 182.101 95.834 181.108 95.829 181.107 M 66.669 260.282 C 66.670 260.287 68.346 292.936 81.333 307.059 C 94.291 321.150 126.611 325.550 126.615 325.552 C 126.614 325.547 124.490 293.238 111.588 279.190 C 98.685 265.142 66.673 260.284 66.669 260.282 M 52.169 358.812 C 52.174 358.813 80.360 375.377 99.298 372.302 C 118.194 369.233 139.650 344.665 139.654 344.662 C 139.649 344.661 111.501 328.660 92.671 331.705 C 73.841 334.750 52.174 358.809 52.169 358.812 M 101.743 426.545 C 101.747 426.544 134.402 428.120 149.745 416.601 C 165.054 405.106 172.643 373.384 172.645 373.379 C 172.640 373.381 140.280 372.284 125.020 383.727 C 109.759 395.170 101.745 426.541 101.743 426.545 M 181.263 467.414 C 181.267 467.411 211.503 454.976 220.504 438.033 C 229.485 421.127 222.890 389.183 222.890 389.178 C 222.886 389.181 193.122 401.925 184.162 418.764 C 175.202 435.604 181.264 467.409 181.263 467.414 M 291.997 447.531 C 291.997 447.527 297.314 424.724 291.175 412.430 C 285.049 400.164 263.677 390.730 263.674 390.727 C 263.675 390.731 258.733 413.388 264.829 425.614 C 270.924 437.841 291.994 447.528 291.997 447.531 M 605.083 258.653 C 605.081 258.656 596.421 280.775 584.223 287.524 C 572.053 294.258 548.765 289.861 548.761 289.862 C 548.763 289.859 557.654 268.078 569.776 261.361 C 581.898 254.643 605.079 258.653 605.083 258.653 M 371.518 286.834 C 371.518 286.831 370.485 267.844 377.131 258.879 C 383.762 249.935 402.185 245.408 402.187 245.406 C 402.187 245.409 402.940 264.226 396.339 273.143 C 389.737 282.059 371.520 286.832 371.518 286.834 M 450.408 298.230 C 450.411 298.227 460.977 274.967 474.464 268.417 C 487.920 261.881 512.680 267.935 512.684 267.935 C 512.682 267.938 501.887 290.822 488.483 297.342 C 475.079 303.863 450.412 298.230 450.408 298.230 M 493.495 194.708 C 493.494 194.712 492.284 225.434 480.230 238.861 C 468.203 252.257 437.860 256.757 437.856 256.759 C 437.857 256.755 439.492 226.349 451.467 212.993 C 463.443 199.637 493.491 194.710 493.495 194.708 M 424.701 295.443 C 424.699 295.447 421.650 321.199 410.626 331.690 C 399.627 342.159 373.815 343.935 373.812 343.936 C 373.813 343.933 377.199 318.474 388.152 308.037 C 399.105 297.600 424.697 295.445 424.701 295.443 M 378.603 160.139 C 378.607 160.141 408.702 172.912 417.515 189.955 C 426.308 206.959 419.358 238.828 419.358 238.833 C 419.354 238.830 389.733 225.755 380.961 208.818 C 372.189 191.880 378.604 160.144 378.603 160.139 M 437.717 100.728 C 437.721 100.729 470.073 105.444 482.922 119.692 C 495.742 133.909 497.107 166.498 497.109 166.503 C 497.104 166.501 465.135 161.372 452.352 147.215 C 439.568 133.058 437.719 100.733 437.717 100.728 M 572.392 114.873 C 572.392 114.877 580.931 146.435 572.968 163.891 C 565.022 181.307 535.663 195.520 535.660 195.523 C 535.660 195.518 527.653 164.145 535.559 146.787 C 543.464 129.428 572.388 114.876 572.392 114.873 M 624.171 181.107 C 624.169 181.111 618.598 213.326 604.015 225.793 C 589.463 238.232 556.849 238.733 556.845 238.734 C 556.847 238.730 562.822 206.907 577.312 194.504 C 591.803 182.101 624.166 181.108 624.171 181.107 M 653.331 260.282 C 653.330 260.287 651.654 292.936 638.667 307.059 C 625.709 321.150 593.389 325.550 593.385 325.552 C 593.386 325.547 595.510 293.238 608.412 279.190 C 621.315 265.142 653.327 260.284 653.331 260.282 M 667.831 358.812 C 667.826 358.813 639.640 375.377 620.702 372.302 C 601.806 369.233 580.350 344.665 580.346 344.662 C 580.351 344.661 608.499 328.660 627.329 331.705 C 646.159 334.750 667.826 358.809 667.831 358.812 M 618.257 426.545 C 618.253 426.544 585.598 428.120 570.255 416.601 C 554.946 405.106 547.357 373.384 547.355 373.379 C 547.360 373.381 579.720 372.284 594.980 383.727 C 610.241 395.170 618.255 426.541 618.257 426.545 M 538.737 467.414 C 538.733 467.411 508.497 454.976 499.496 438.033 C 490.515 421.127 497.110 389.183 497.110 389.178 C 497.114 389.181 526.878 401.925 535.838 418.764 C 544.798 435.604 538.736 467.409 538.737 467.414 M 428.003 447.531 C 428.003 447.527 422.686 424.724 428.825 412.430 C 434.951 400.164 456.323 390.730 456.326 390.727 C 456.325 390.731 461.267 413.388 455.171 425.614 C 449.076 437.841 428.006 447.528 428.003 447.531 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 547.547 338.220 C 536.873 338.868 522.165 328.115 522.163 328.114 C 522.165 328.113 535.539 315.937 546.173 315.285 C 556.808 314.632 571.569 325.082 571.572 325.083 C 571.569 325.084 558.244 337.571 547.547 338.220 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 264.867 454.794 C 264.867 444.751 256.765 436.650 246.722 436.650 C 236.679 436.650 228.578 444.751 228.578 454.794 C 228.577 464.838 236.679 472.939 246.722 472.939 C 256.765 472.939 264.867 464.838 264.867 454.794 M 163.432 448.797 C 163.432 438.754 155.330 430.652 145.287 430.652 C 135.244 430.652 127.142 438.754 127.142 448.797 C 127.142 458.840 135.244 466.942 145.287 466.942 C 155.330 466.942 163.432 458.840 163.432 448.797 M 92.104 401.245 C 92.104 391.201 84.002 383.100 73.959 383.100 C 63.916 383.100 55.814 391.201 55.814 401.245 C 55.814 411.288 63.916 419.389 73.959 419.389 C 84.002 419.389 92.104 411.288 92.104 401.245 M 217.241 119.686 C 217.241 109.643 209.139 101.541 199.096 101.541 C 189.053 101.541 180.951 109.643 180.951 119.686 C 180.951 129.729 189.053 137.830 199.096 137.830 C 209.139 137.830 217.241 129.729 217.241 119.686 M 102.115 232.309 C 102.115 222.266 94.013 214.164 83.970 214.164 C 73.927 214.164 65.825 222.266 65.825 232.309 C 65.825 242.352 73.927 250.454 83.970 250.454 C 94.013 250.454 102.115 242.352 102.115 232.309 M 228.503 236.063 C 228.503 226.020 220.401 217.918 210.358 217.918 C 200.315 217.918 192.213 226.020 192.213 236.063 C 192.213 246.106 200.315 254.208 210.358 254.208 C 220.401 254.208 228.503 246.106 228.503 236.063 M 326.110 129.697 C 326.110 119.654 318.008 111.552 307.965 111.552 C 297.922 111.552 289.821 119.654 289.821 129.697 C 289.821 139.740 297.922 147.842 307.965 147.842 C 318.009 147.842 326.110 139.740 326.110 129.697 M 294.826 174.746 C 294.826 164.703 286.724 156.601 276.681 156.601 C 266.638 156.601 258.536 164.703 258.536 174.746 C 258.536 184.789 266.638 192.891 276.681 192.891 C 286.724 192.891 294.826 184.789 294.826 174.746 M 455.133 454.794 C 455.133 444.751 463.235 436.650 473.278 436.650 C 483.321 436.650 491.422 444.751 491.423 454.794 C 491.423 464.838 483.321 472.939 473.278 472.939 C 463.235 472.939 455.133 464.838 455.133 454.794 M 556.568 448.797 C 556.568 438.754 564.670 430.652 574.713 430.652 C 584.756 430.652 592.858 438.754 592.858 448.797 C 592.858 458.840 584.756 466.942 574.713 466.942 C 564.670 466.942 556.568 458.840 556.568 448.797 M 627.896 401.245 C 627.896 391.201 635.998 383.100 646.041 383.100 C 656.084 383.100 664.186 391.201 664.186 401.245 C 664.186 411.288 656.084 419.389 646.041 419.389 C 635.998 419.389 627.896 411.288 627.896 401.245 M 502.759 119.686 C 502.759 109.643 510.861 101.541 520.904 101.541 C 530.947 101.541 539.049 109.643 539.049 119.686 C 539.049 129.729 530.947 137.830 520.904 137.830 C 510.861 137.830 502.759 129.729 502.759 119.686 M 617.885 232.309 C 617.885 222.266 625.987 214.164 636.030 214.164 C 646.073 214.164 654.175 222.266 654.175 232.309 C 654.175 242.352 646.073 250.454 636.030 250.454 C 625.987 250.454 617.885 242.352 617.885 232.309 M 491.497 236.063 C 491.497 226.020 499.599 217.918 509.642 217.918 C 519.685 217.918 527.787 226.020 527.787 236.063 C 527.787 246.106 519.685 254.208 509.642 254.208 C 499.599 254.208 491.497 246.106 491.497 236.063 M 393.890 129.697 C 393.890 119.654 401.992 111.552 412.035 111.552 C 422.078 111.552 430.179 119.654 430.179 129.697 C 430.180 139.740 422.078 147.842 412.035 147.842 C 401.991 147.842 393.890 139.740 393.890 129.697 M 425.174 174.746 C 425.174 164.703 433.276 156.601 443.319 156.601 C 453.362 156.601 461.464 164.703 461.464 174.746 C 461.464 184.789 453.362 192.891 443.319 192.891 C 433.276 192.891 425.174 184.789 425.174 174.746 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 308.953 331.690 C 319.952 342.159 345.763 343.935 345.767 343.936 C 345.765 343.933 342.379 318.474 331.426 308.037 C 320.473 297.600 294.882 295.445 294.878 295.443 C 294.879 295.447 297.929 321.199 308.953 331.690 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 313.954 470.212 C 313.963 470.212 406.037 470.212 406.046 470.212 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":470.272,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":405.616,\\\"y\\\":469.124,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129855973001704,\\\"y\\\":0.7011786776867356}},{\\\"point\\\":{\\\"x\\\":315.08,\\\"y\\\":469.133,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986806118523448,\\\"y\\\":0.715433716441735}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":470.16,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":false,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"triangle\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":27.638,\\\"max\\\":692.362},\\\"y\\\":{\\\"min\\\":71.898,\\\"max\\\":648.102}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"triangle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"triangle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#FF7D93F5-77F2-46FD-B596-1EF0381D61B0_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 73.898 C 360.033 73.955 690.329 646.045 690.362 646.102 C 690.296 646.102 29.704 646.102 29.638 646.102 C 29.671 646.045 359.967 73.955 360.000 73.898 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":230.023,\\\"max\\\":490.127},\\\"y\\\":{\\\"min\\\":300.37,\\\"max\\\":560.475}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":674.065,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.075,\\\"y\\\":77.793,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":194.43,\\\"y\\\":359.043,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.868514074398802,\\\"y\\\":-0.49566450606351903}},{\\\"point\\\":{\\\"x\\\":526.616,\\\"y\\\":360.954,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8685512541368067,\\\"y\\\":-0.4955993532455227}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":41.378,\\\"y\\\":639.913,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.860043090391753,\\\"y\\\":0.5102214055382261}},{\\\"point\\\":{\\\"x\\\":681.449,\\\"y\\\":640.279,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8701184940442231,\\\"y\\\":0.4928425776271906}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":359.957,\\\"y\\\":640.19,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"FF7D93F5-77F2-46FD-B596-1EF0381D61B0_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"63.23%\\\",\\\"r\\\":\\\"84.82%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"41.18%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"triskele\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":70.17292901118992,\\\"max\\\":652.5885794199888},\\\"y\\\":{\\\"min\\\":89.61549604274816,\\\"max\\\":638.1116237500617}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"triskele\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"triskele\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 416.405 550.655 C 441.868 581.030 487.814 596.872 526.781 589.619 C 565.975 582.324 604.079 551.023 616.213 513.046 C 625.774 483.123 616.217 446.759 596.346 422.428 C 578.304 400.337 547.905 383.587 519.663 387.576 C 488.715 391.946 457.315 417.929 450.208 448.365 C 444.303 473.655 456.095 505.604 477.747 519.944 C 494.130 530.794 519.970 531.866 535.777 520.192 C 551.331 508.705 560.523 483.165 552.471 465.585 C 548.205 456.268 536.362 450.432 526.119 450.711 C 520.669 450.859 513.773 453.284 511.991 458.437 C 506.658 473.862 521.184 471.063 525.043 477.615 C 530.399 486.708 524.003 494.881 517.317 498.034 C 505.572 503.573 489.244 492.690 482.741 481.450 C 476.181 470.111 478.875 454.077 485.666 442.874 C 493.364 430.176 508.404 421.499 523.195 420.192 C 540.504 418.662 559.388 426.260 570.794 439.370 C 585.087 455.799 589.583 480.860 584.866 502.119 C 580.610 521.303 567.015 538.829 549.850 548.394 C 527.455 560.872 498.238 562.903 474.325 553.663 C 450.727 544.547 431.823 523.323 422.586 499.772 C 412.769 474.739 413.325 444.896 424.381 420.384 C 436.275 394.013 459.986 371.771 487.488 362.796 C 522.077 351.509 563.207 357.398 594.029 376.732 C 621.956 394.250 641.814 425.312 648.140 457.666 C 655.197 493.764 646.830 534.071 625.236 563.847 C 602.657 594.982 565.168 616.699 526.918 620.717 C 477.189 625.941 433.968 608.275 400.814 577.670 C 357.025 537.246 361.563 480.011 329.454 435.354 C 296.509 389.534 246.581 374.064 199.803 382.095 C 160.739 388.801 124.074 420.828 110.872 458.201 C 97.593 495.792 105.648 544.442 132.470 573.938 C 153.604 597.180 189.874 607.086 220.881 602.042 C 249.034 597.463 278.739 579.511 289.406 553.058 C 301.094 524.072 294.293 483.887 271.488 462.515 C 252.539 444.756 218.974 438.993 195.730 450.574 C 178.141 459.337 164.293 481.179 166.499 500.705 C 168.670 519.919 186.193 540.649 205.443 542.467 C 215.645 543.430 226.621 536.092 231.501 527.082 C 234.097 522.288 235.445 515.104 231.873 510.984 C 221.182 498.653 216.343 512.632 208.739 512.698 C 198.186 512.790 194.306 503.165 194.918 495.797 C 195.994 482.857 213.583 474.158 226.568 474.146 C 239.669 474.134 252.208 484.485 258.514 495.967 C 265.662 508.982 265.657 526.346 259.393 539.809 C 252.064 555.565 236.041 568.120 218.985 571.442 C 197.611 575.606 173.659 566.969 157.607 552.255 C 143.121 538.977 134.740 518.440 135.040 498.792 C 135.430 473.158 148.280 446.841 168.239 430.750 C 187.933 414.873 215.765 409.113 240.779 412.890 C 267.367 416.904 292.934 432.307 308.634 454.137 C 325.525 477.624 332.932 509.279 326.953 537.584 C 319.433 573.183 293.768 605.857 261.613 622.883 C 232.479 638.310 195.650 639.977 164.468 629.278 C 129.677 617.341 98.954 589.941 83.964 556.352 C 68.289 521.230 68.227 477.906 83.872 442.771 C 104.212 397.092 141.132 368.528 184.203 355.086 C 233.830 339.598 277.816 362.999 325.831 365.744 C 376.805 368.659 436.531 328.811 456.295 279.725 C 471.099 242.957 460.616 194.774 434.851 164.655 C 408.936 134.359 362.776 117.010 323.821 125.490 C 293.126 132.172 266.412 158.631 255.276 188.005 C 245.166 214.675 245.860 249.376 263.435 271.841 C 282.694 296.457 320.896 310.659 350.808 301.595 C 375.662 294.064 397.435 267.878 399.028 241.957 C 400.233 222.344 388.241 199.430 370.228 191.577 C 352.503 183.850 325.788 188.660 314.589 204.423 C 308.654 212.776 309.521 225.950 314.884 234.681 C 317.737 239.328 323.285 244.087 328.639 243.054 C 344.663 239.961 334.977 228.780 338.722 222.162 C 343.919 212.977 354.194 214.429 360.268 218.643 C 370.937 226.045 369.676 245.627 363.194 256.878 C 356.655 268.230 341.420 273.913 328.323 273.633 C 313.478 273.316 298.444 264.629 289.916 252.474 C 279.936 238.248 277.074 218.095 282.725 201.662 C 289.806 181.070 309.262 164.645 330.031 158.101 C 348.773 152.195 370.749 155.206 387.615 165.289 C 409.619 178.444 425.985 202.731 429.941 228.060 C 433.844 253.055 424.916 280.039 409.138 299.813 C 392.368 320.831 366.245 335.272 339.490 337.953 C 310.704 340.838 279.586 331.425 258.063 312.094 C 230.994 287.783 215.529 249.219 216.861 212.860 C 218.069 179.915 235.040 147.187 259.896 125.532 C 287.630 101.370 326.720 88.463 363.304 92.276 C 401.558 96.262 439.109 117.870 461.714 148.987 C 491.103 189.441 499.280 236.167 487.486 279.719 C 469.174 347.336 422.023 358.787 396.844 404.695 C 374.269 445.856 384.350 512.417 416.405 550.655 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":370.462,\\\"y\\\":685.238,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":182.372,\\\"y\\\":307.72,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8535840270229896,\\\"y\\\":-0.5209551888706131}},{\\\"point\\\":{\\\"x\\\":534.825,\\\"y\\\":311.17,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8779462509064101,\\\"y\\\":-0.4787592093311406}},{\\\"point\\\":{\\\"x\\\":352.028,\\\"y\\\":604.705,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.024351561943891358,\\\"y\\\":0.9997034567464959}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":350.612,\\\"y\\\":57.035,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.024365509714555564,\\\"y\\\":-0.999703116898387}},{\\\"point\\\":{\\\"x\\\":51.125,\\\"y\\\":570.054,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8779503873573876,\\\"y\\\":0.47875162385000114}},{\\\"point\\\":{\\\"x\\\":652.026,\\\"y\\\":588.896,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.8535870262818154,\\\"y\\\":0.5209502745592592}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"],\\\"never_flip_attachments\\\":true}},{\\\"name\\\":\\\"trumpet\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":235.19276455771495,\\\"max\\\":701.97},\\\"y\\\":{\\\"min\\\":273.3269839645844,\\\"max\\\":471.4430148261214}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"trumpet\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"trumpet\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 701.470 372.385 C 701.470 386.115 697.485 391.822 694.661 391.822 C 691.836 391.822 687.851 386.115 687.851 372.385 C 687.851 358.654 691.836 352.947 694.661 352.947 C 697.485 352.947 701.470 358.654 701.470 372.385 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 254.539 468.227 C 254.553 468.220 310.633 400.232 389.677 393.465 C 527.308 381.681 694.766 386.255 694.796 386.254 C 694.797 386.253 697.058 382.133 697.058 372.385 C 697.058 362.637 694.797 358.517 694.796 358.516 C 694.766 358.515 527.308 362.266 389.677 351.305 C 310.594 345.006 254.553 276.549 254.539 276.542 C 254.539 276.561 254.539 468.208 254.539 468.227 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 254.697 273.827 C 263.513 273.801 274.056 305.392 274.234 372.359 C 274.411 439.291 264.044 470.917 255.232 470.943 C 246.416 470.968 235.873 439.377 235.695 372.410 C 235.518 305.478 245.886 273.852 254.697 273.827 M 254.551 286.970 C 257.557 286.970 266.577 307.400 266.577 372.385 C 266.577 437.369 257.557 457.800 254.551 457.800 C 251.546 457.800 242.525 437.369 242.525 372.385 C 242.525 307.400 251.546 286.970 254.551 286.970 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 266.577 372.385 C 266.577 437.369 257.557 457.800 254.551 457.800 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 254.551 457.800 C 251.546 457.800 242.525 437.369 242.525 372.385 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 242.525 372.385 C 242.525 307.400 251.546 286.970 254.551 286.970 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 254.551 286.970 C 257.557 286.970 266.577 307.400 266.577 372.385 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 266.577 372.385 C 266.577 437.369 257.557 457.800 254.551 457.800 C 251.546 457.800 242.525 437.369 242.525 372.385 C 242.525 307.400 251.546 286.970 254.551 286.970 C 257.557 286.970 266.577 307.400 266.577 372.385 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":7.731,\\\"max\\\":256.312},\\\"y\\\":{\\\"min\\\":290.217,\\\"max\\\":454.553}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":687.374,\\\"y\\\":372.385,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":523.325,\\\"y\\\":314.651,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.0050336008663716654,\\\"y\\\":-0.9999873313509117}},{\\\"point\\\":{\\\"x\\\":523.325,\\\"y\\\":430.119,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.0050336008663716654,\\\"y\\\":0.9999873313509117}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":698.149,\\\"y\\\":372.385,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"two_faced\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":34.519,\\\"max\\\":685.481},\\\"y\\\":{\\\"min\\\":109.636,\\\"max\\\":634.38}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"two_faced\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"two_faced\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.339 110.760 C 360.339 110.812 360.339 633.327 360.339 633.380 C 360.323 633.376 243.422 628.750 202.284 602.734 C 126.844 555.026 128.129 522.284 128.122 522.276 C 128.139 522.274 207.861 490.482 297.082 502.864 C 194.342 460.340 112.810 480.228 112.791 480.226 C 112.790 480.221 98.397 429.226 98.396 429.221 C 98.389 429.219 35.526 408.969 35.519 408.967 C 35.527 408.953 102.729 278.876 109.223 263.404 C 104.283 194.056 118.488 110.651 118.489 110.636 C 118.513 110.636 360.315 110.760 360.339 110.760 M 150.309 256.831 C 150.317 256.830 176.663 256.159 226.803 247.430 C 268.729 240.132 308.812 229.651 308.820 229.649 C 308.814 229.659 303.023 312.230 243.157 322.497 C 183.290 332.763 150.319 256.838 150.309 256.831 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 404.569 295.217 C 404.576 295.218 430.922 295.889 481.062 304.618 C 522.989 311.917 563.072 322.397 563.080 322.399 C 563.073 322.390 557.283 239.818 497.416 229.552 C 437.549 219.285 404.578 295.211 404.569 295.217 M 359.661 110.760 C 359.661 110.812 359.661 633.327 359.661 633.380 C 359.677 633.376 476.578 628.750 517.716 602.734 C 593.156 555.026 591.870 522.284 591.878 522.276 C 591.861 522.271 473.183 530.867 427.638 474.540 C 483.169 488.722 607.191 480.225 607.209 480.226 C 607.210 480.221 621.603 429.226 621.604 429.221 C 621.611 429.219 684.474 408.969 684.481 408.967 C 684.473 408.953 617.288 279.913 610.777 263.404 C 612.404 178.833 601.512 110.651 601.511 110.636 C 601.487 110.636 359.685 110.760 359.661 110.760 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":190.507,\\\"max\\\":275.538},\\\"y\\\":{\\\"min\\\":236.181,\\\"max\\\":321.212}},{\\\"x\\\":{\\\"min\\\":444.462,\\\"max\\\":529.493},\\\"y\\\":{\\\"min\\\":236.18,\\\"max\\\":321.211}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":699.379,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":109.308,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":108.692,\\\"y\\\":506.633,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873620856039,\\\"y\\\":0.005027491330220669}},{\\\"point\\\":{\\\"x\\\":611.308,\\\"y\\\":506.633,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873620856038,\\\"y\\\":0.005027491330220682}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":211.991,\\\"y\\\":608.545,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7129033945308432,\\\"y\\\":0.7012622548422246}},{\\\"point\\\":{\\\"x\\\":508.131,\\\"y\\\":608.576,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6987339817286651,\\\"y\\\":0.7153815924229567}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":121.376,\\\"y\\\":112.646,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6314219981031151,\\\"y\\\":-0.7754393982197899}},{\\\"point\\\":{\\\"x\\\":597.82,\\\"y\\\":112.727,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6817361480275335,\\\"y\\\":-0.7315981304463407}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":634.096,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"unihorn\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":297.3599801477942,\\\"max\\\":421.7055926413711},\\\"y\\\":{\\\"min\\\":15.885000000000002,\\\"max\\\":702.144}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"unihorn\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"unihorn\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.131 17.885 C 360.132 17.889 366.991 42.718 368.086 54.361 C 369.057 64.684 367.035 84.547 367.281 87.451 C 367.602 91.227 374.711 116.207 375.818 129.647 C 376.867 142.381 374.125 166.837 374.431 170.414 C 374.736 173.972 381.711 197.462 382.673 210.132 C 383.627 222.691 380.265 246.758 380.550 250.286 C 380.843 253.906 388.191 277.726 389.353 290.599 C 390.613 304.557 387.225 331.401 387.700 335.311 C 388.067 338.332 395.634 357.877 396.945 368.628 C 398.907 384.719 394.404 415.802 394.850 420.335 C 395.169 423.583 401.998 444.907 403.214 456.457 C 404.818 471.696 401.395 501.097 402.000 505.360 C 402.432 508.409 410.786 527.958 412.201 538.825 C 414.498 556.467 408.751 590.554 409.149 595.538 C 409.466 599.498 417.093 625.629 418.442 639.702 C 420.064 656.624 420.539 690.422 417.330 693.961 C 413.927 697.712 378.153 700.144 360.131 700.144 C 342.110 700.144 306.361 697.688 302.933 693.961 C 300.416 691.223 298.484 665.000 299.769 651.827 C 300.959 639.630 309.790 617.520 310.083 614.089 C 310.466 609.604 302.954 579.168 304.650 563.238 C 306.020 550.377 316.859 527.526 317.232 523.911 C 317.626 520.100 311.479 494.218 312.627 480.634 C 313.771 467.096 324.112 442.694 324.382 438.886 C 324.626 435.461 318.658 412.394 319.391 400.195 C 320.291 385.219 331.161 358.061 331.532 353.862 C 331.837 350.415 327.802 326.946 328.645 314.662 C 329.651 300.002 338.434 272.959 338.682 268.837 C 338.903 265.175 333.876 240.351 334.871 227.334 C 335.943 213.316 345.450 187.744 345.832 183.812 C 346.214 179.870 342.138 152.915 343.427 138.878 C 344.606 126.022 352.744 102.407 352.982 98.787 C 353.180 95.774 349.063 75.372 349.669 64.643 C 350.515 49.658 360.130 17.890 360.131 17.885 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 331.532 353.862 C 350.255 347.678 368.977 341.494 387.700 335.311 M 352.982 98.787 C 357.748 95.008 362.515 91.229 367.281 87.451 M 345.832 183.812 C 355.365 179.346 364.898 174.880 374.431 170.414 M 338.682 268.837 C 352.638 262.653 366.594 256.470 380.550 250.286 M 324.382 438.886 C 347.871 432.703 371.361 426.519 394.850 420.335 M 317.232 523.911 C 345.488 517.727 373.744 511.544 402.000 505.360 M 310.083 614.089 C 343.105 607.905 376.127 601.721 409.149 595.538 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":689.5,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":315.321,\\\"y\\\":389.351,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873632542563,\\\"y\\\":0.005027258875375741}},{\\\"point\\\":{\\\"x\\\":404.679,\\\"y\\\":389.351,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873632542563,\\\"y\\\":0.005027258875375741}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":699.132,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"urn\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":143.02466067076602,\\\"max\\\":577.3012086708661},\\\"y\\\":{\\\"min\\\":36.892,\\\"max\\\":636.63275}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"urn\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"urn\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#9329B78A-CAC2-4471-9F51-1D2335FE9695_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 178.839 162.931 C 187.525 181.450 221.998 194.472 233.944 247.094 C 258.886 222.459 290.427 186.150 276.745 132.874 C 269.428 104.382 228.476 90.515 199.305 102.146 C 175.988 111.444 170.069 144.236 178.839 162.931 M 443.256 132.873 C 429.040 194.245 461.479 222.188 486.055 247.093 C 498.188 194.514 529.268 184.246 541.162 162.931 C 550.082 146.944 544.012 111.444 520.695 102.146 C 491.525 90.515 450.215 98.758 443.256 132.873 M 480.149 38.892 C 480.147 38.896 462.113 53.474 454.874 83.220 C 479.610 67.807 507.825 62.583 535.670 75.949 C 577.791 96.168 581.033 146.401 569.662 172.146 C 556.455 202.048 516.032 219.257 512.716 276.126 C 538.116 307.671 560.249 350.607 560.249 419.365 C 560.249 559.539 495.339 602.007 460.125 619.614 C 420.075 639.639 299.925 639.639 259.875 619.614 C 224.661 602.007 159.751 559.539 159.751 419.365 C 159.751 350.607 181.884 307.672 207.283 276.127 C 203.968 219.257 160.231 197.078 150.338 172.146 C 139.957 145.986 141.646 94.949 184.330 75.949 C 213.135 63.127 245.768 69.965 266.231 88.192 C 258.315 64.154 239.853 38.897 239.851 38.892 C 239.875 38.894 480.125 38.893 480.149 38.892 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":222.623,\\\"max\\\":497.377},\\\"y\\\":{\\\"min\\\":288.283,\\\"max\\\":563.037}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":722.814,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":39.338,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":160.648,\\\"y\\\":420.837,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873521986961,\\\"y\\\":0.005029457489738821}},{\\\"point\\\":{\\\"x\\\":559.352,\\\"y\\\":420.837,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873521986961,\\\"y\\\":0.0050294574897388}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":471.883,\\\"y\\\":608.757,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129221308160933,\\\"y\\\":0.701243207020675}},{\\\"point\\\":{\\\"x\\\":247.949,\\\"y\\\":608.799,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698721393252034,\\\"y\\\":0.7153938877373335}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":548.806,\\\"y\\\":83.251,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314588659701251,\\\"y\\\":-0.7754093761283286}},{\\\"point\\\":{\\\"x\\\":171.858,\\\"y\\\":83.329,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817163878820501,\\\"y\\\":-0.7316165433429249}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":632.425,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"9329B78A-CAC2-4471-9F51-1D2335FE9695_0\\\",\\\"cx\\\":\\\"50.08%\\\",\\\"cy\\\":\\\"50.42%\\\",\\\"r\\\":\\\"68.47%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"48.63%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"venus\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":171.459,\\\"max\\\":548.541},\\\"y\\\":{\\\"min\\\":76.02,\\\"max\\\":643.98}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"venus\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"venus\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 250.100 511.835 C 250.109 511.835 309.901 511.835 339.802 511.835 C 339.812 491.234 339.819 460.154 339.833 450.031 C 253.070 445.692 173.459 360.582 173.459 264.560 C 173.459 161.311 256.751 78.020 360.000 78.020 C 463.249 78.020 546.541 161.311 546.541 264.560 C 546.541 360.582 467.272 440.789 380.165 450.031 C 380.188 468.726 380.333 511.829 380.333 511.835 C 410.189 511.835 469.891 511.835 469.900 511.835 C 469.900 511.839 469.900 552.322 469.900 552.326 C 469.891 552.326 410.190 552.326 380.335 552.326 C 380.305 582.210 380.245 641.971 380.245 641.980 C 380.241 641.980 339.759 641.980 339.755 641.980 C 339.755 641.971 339.788 582.210 339.804 552.326 C 309.903 552.326 250.109 552.326 250.100 552.326 C 250.100 552.322 250.100 511.839 250.100 511.835 M 214.813 264.560 C 214.813 344.921 279.640 409.748 360.000 409.748 C 440.360 409.748 505.187 344.921 505.187 264.560 C 505.187 184.200 440.360 119.374 360.000 119.374 C 279.640 119.374 214.813 184.200 214.813 264.560 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":255.74,\\\"max\\\":464.26},\\\"y\\\":{\\\"min\\\":159.465,\\\"max\\\":367.985}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":666.917,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":74.827,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":171.155,\\\"y\\\":262.353,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999873181281341,\\\"y\\\":0.005036227050266383}},{\\\"point\\\":{\\\"x\\\":548.845,\\\"y\\\":262.353,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999873181281341,\\\"y\\\":0.005036227050266405}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":642.555,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":248.309,\\\"y\\\":531.68,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999868180612457,\\\"y\\\":0.005134559742087015}},{\\\"point\\\":{\\\"x\\\":471.691,\\\"y\\\":531.68,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999868180612457,\\\"y\\\":0.005134559742086996}}]},\\\"meta\\\":{\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"virus\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":32.058,\\\"max\\\":687.942},\\\"y\\\":{\\\"min\\\":18.216,\\\"max\\\":674.1}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"virus\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"virus2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#B94FC4DA-00B1-4568-B59C-21056EC1401A_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 672.100 C 406.123 672.100 347.074 574.248 383.117 570.656 C 419.145 567.067 380.668 674.904 425.802 665.494 C 470.851 656.103 392.685 572.389 427.206 561.696 C 461.731 551.002 444.672 664.521 487.038 646.541 C 529.365 628.578 435.927 561.825 467.684 544.637 C 499.434 527.452 504.314 642.266 542.410 616.538 C 580.498 590.815 475.798 543.330 503.654 520.377 C 531.504 497.427 558.131 609.275 590.624 576.781 C 623.117 544.288 511.269 517.662 534.219 489.812 C 557.172 461.957 604.657 566.656 630.380 528.569 C 656.109 490.472 541.294 485.592 558.479 453.842 C 575.668 422.084 642.420 515.523 660.383 473.195 C 678.363 430.830 564.844 447.889 575.538 413.364 C 586.231 378.842 669.945 457.009 679.337 411.959 C 688.746 366.826 580.909 405.303 584.499 369.275 C 588.090 333.232 685.942 392.280 685.942 346.158 C 685.942 300.035 588.090 359.084 584.499 323.041 C 580.909 287.013 688.746 325.489 679.337 280.356 C 669.945 235.307 586.231 313.473 575.538 278.952 C 564.844 244.427 678.363 261.486 660.383 219.120 C 642.420 176.792 575.667 270.231 558.479 238.474 C 541.294 206.724 656.109 201.843 630.380 163.747 C 604.657 125.659 557.172 230.359 534.219 202.504 C 511.269 174.654 623.117 148.027 590.624 115.534 C 558.131 83.041 531.504 194.888 503.654 171.939 C 475.799 148.985 580.499 101.500 542.411 75.777 C 504.315 50.049 499.434 164.863 467.684 147.679 C 435.927 130.490 529.365 63.738 487.038 45.774 C 444.672 27.794 461.731 141.313 427.206 130.619 C 392.685 119.927 470.851 36.213 425.802 26.821 C 380.668 17.412 419.145 125.249 383.117 121.659 C 347.074 118.068 406.123 20.216 360.000 20.216 C 313.877 20.216 372.926 118.068 336.883 121.659 C 300.855 125.249 339.332 17.412 294.198 26.821 C 249.149 36.213 327.315 119.927 292.794 130.619 C 258.269 141.313 275.328 27.794 232.962 45.774 C 190.635 63.738 284.073 130.490 252.316 147.679 C 220.566 164.863 215.686 50.049 177.590 75.777 C 139.502 101.500 244.202 148.985 216.346 171.939 C 188.496 194.888 161.869 83.041 129.376 115.534 C 96.883 148.027 208.731 174.653 185.781 202.504 C 162.828 230.359 115.343 125.659 89.620 163.747 C 63.891 201.843 178.706 206.724 161.521 238.474 C 144.333 270.231 77.580 176.792 59.617 219.120 C 41.637 261.486 155.156 244.427 144.462 278.952 C 133.769 313.473 50.055 235.307 40.663 280.356 C 31.254 325.489 139.091 287.013 135.501 323.041 C 131.910 359.084 34.058 300.035 34.058 346.158 C 34.058 392.280 131.910 333.232 135.501 369.275 C 139.091 405.303 31.254 366.826 40.663 411.959 C 50.055 457.009 133.769 378.842 144.462 413.364 C 155.156 447.889 41.637 430.830 59.617 473.195 C 77.580 515.523 144.333 422.084 161.521 453.842 C 178.706 485.592 63.891 490.472 89.620 528.568 C 115.343 566.656 162.828 461.956 185.781 489.811 C 208.731 517.662 96.883 544.288 129.376 576.781 C 161.869 609.274 188.496 497.427 216.346 520.377 C 244.201 543.330 139.501 590.815 177.589 616.538 C 215.685 642.267 220.566 527.452 252.316 544.637 C 284.073 561.825 190.635 628.578 232.962 646.541 C 275.328 664.521 258.269 551.002 292.794 561.696 C 327.315 572.389 249.149 656.103 294.198 665.494 C 339.332 674.904 300.855 567.067 336.883 570.656 C 372.926 574.248 313.877 672.100 360.000 672.100 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":196.525,\\\"max\\\":523.475},\\\"y\\\":{\\\"min\\\":182.682,\\\"max\\\":509.633}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":702.836,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":15.235,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":24.413,\\\"y\\\":347.106,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871947582506,\\\"y\\\":0.005060663941083771}},{\\\"point\\\":{\\\"x\\\":696.64,\\\"y\\\":347.106,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871947582506,\\\"y\\\":0.005060663941083773}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":599.024,\\\"y\\\":585.651,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129025918842584,\\\"y\\\":0.7012630708120217}},{\\\"point\\\":{\\\"x\\\":122.119,\\\"y\\\":585.7,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987438260231833,\\\"y\\\":0.7153719770821916}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":598.513,\\\"y\\\":108.671,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314251011779329,\\\"y\\\":-0.7754368714488866}},{\\\"point\\\":{\\\"x\\\":122.279,\\\"y\\\":108.752,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817255992302469,\\\"y\\\":-0.7316079601495331}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":677.845,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"B94FC4DA-00B1-4568-B59C-21056EC1401A_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"68.63%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"37.25%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"water\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":137.52198456250272,\\\"max\\\":582.9383097088784},\\\"y\\\":{\\\"min\\\":15.494,\\\"max\\\":704.514}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"water\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"water\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#2E3BB2F1-D5FB-4B3D-A5D1-DD816AA8BC52_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 279.810 17.494 C 279.812 17.502 298.245 79.856 298.245 102.382 C 298.245 124.908 279.810 164.743 279.810 187.270 C 279.810 209.796 298.245 249.631 298.245 272.157 C 298.245 294.683 279.810 334.519 279.810 357.045 C 279.810 379.571 298.245 419.406 298.245 441.932 C 298.245 464.458 279.810 504.294 279.810 526.820 C 279.810 549.346 298.245 589.182 298.245 611.708 C 298.245 634.234 279.812 696.587 279.810 696.595 C 279.825 696.595 430.525 696.595 430.540 696.595 C 430.542 696.587 448.974 634.234 448.974 611.708 C 448.974 589.182 430.540 549.346 430.540 526.820 C 430.540 504.294 448.974 464.458 448.974 441.932 C 448.974 419.406 430.540 379.571 430.540 357.045 C 430.540 334.519 448.974 294.683 448.974 272.157 C 448.974 249.631 430.540 209.796 430.540 187.270 C 430.540 164.743 448.974 124.908 448.974 102.382 C 448.974 79.856 430.542 17.502 430.540 17.494 C 430.525 17.494 279.825 17.494 279.810 17.494 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 430.540 17.494 C 430.525 17.494 279.825 17.494 279.810 17.494 C 279.812 17.502 298.245 79.856 298.245 102.382 C 298.245 124.908 279.810 164.743 279.810 187.270 C 279.810 209.796 298.245 249.631 298.245 272.157 C 298.245 294.683 279.810 334.519 279.810 357.045 C 279.810 379.571 298.245 419.406 298.245 441.932 C 298.245 464.458 279.810 504.294 279.810 526.820 C 279.810 549.346 298.245 589.182 298.245 611.708 C 298.245 634.234 279.812 696.587 279.810 696.595 C 279.825 696.595 430.525 696.595 430.540 696.595 C 430.542 696.587 448.974 634.234 448.974 611.708 C 448.974 589.182 430.540 549.346 430.540 526.820 C 430.540 504.294 448.974 464.458 448.974 441.932 C 448.974 419.406 430.540 379.571 430.540 357.045 C 430.540 334.519 448.974 294.683 448.974 272.157 C 448.974 249.631 430.540 209.796 430.540 187.270 C 430.540 164.743 448.974 124.908 448.974 102.382 C 448.974 79.856 430.542 17.502 430.540 17.494 M 335.927 611.708 C 335.927 634.234 317.495 696.587 317.493 696.595 M 317.493 526.820 C 317.493 549.346 335.927 589.182 335.927 611.708 M 335.927 441.932 C 335.927 464.458 317.493 504.294 317.493 526.820 M 317.493 357.045 C 317.493 379.571 335.927 419.406 335.927 441.932 M 335.927 272.157 C 335.927 294.683 317.493 334.519 317.493 357.045 M 317.493 187.270 C 317.493 209.796 335.927 249.631 335.927 272.157 M 335.927 102.382 C 335.927 124.908 317.493 164.743 317.493 187.270 M 317.493 17.494 C 317.495 17.502 335.927 79.856 335.927 102.382 M 411.292 611.708 C 411.292 634.234 392.860 696.587 392.858 696.595 M 392.858 526.820 C 392.858 549.346 411.292 589.182 411.292 611.708 M 411.292 441.932 C 411.292 464.458 392.858 504.294 392.858 526.820 M 392.858 357.045 C 392.858 379.571 411.292 419.406 411.292 441.932 M 411.292 272.157 C 411.292 294.683 392.858 334.519 392.858 357.045 M 392.858 187.270 C 392.858 209.796 411.292 249.631 411.292 272.157 M 411.292 102.382 C 411.292 124.908 392.858 164.743 392.858 187.270 M 392.858 17.494 C 392.860 17.502 411.292 79.856 411.292 102.382 M 373.609 611.708 C 373.609 634.234 355.177 696.587 355.175 696.595 M 355.175 526.820 C 355.175 549.346 373.609 589.182 373.609 611.708 M 373.609 441.932 C 373.609 464.458 355.175 504.294 355.175 526.820 M 355.175 357.045 C 355.175 379.571 373.609 419.406 373.609 441.932 M 373.609 272.157 C 373.609 294.683 355.175 334.519 355.175 357.045 M 355.175 187.270 C 355.175 209.796 373.609 249.631 373.609 272.157 M 373.609 102.382 C 373.609 124.908 355.175 164.743 355.175 187.270 M 355.175 17.494 C 355.177 17.502 373.609 79.856 373.609 102.382 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 295.451 581.042 C 311.893 589.479 313.988 605.188 313.989 605.191 C 313.987 605.184 313.579 567.734 290.739 538.617 C 279.210 523.921 260.332 522.304 253.734 536.786 C 245.237 555.440 262.437 564.102 295.451 581.042 M 203.090 619.744 C 221.556 619.400 231.839 629.695 231.842 629.696 C 231.836 629.692 208.280 597.164 170.333 587.223 C 152.264 582.489 136.729 596.372 139.947 608.420 C 146.534 633.088 165.561 620.443 203.090 619.744 M 424.549 581.042 C 408.020 589.309 406.012 605.188 406.011 605.191 C 406.013 605.184 405.792 567.230 429.261 538.617 C 441.831 523.293 464.672 522.348 468.574 538.517 C 473.475 558.819 461.674 562.475 424.549 581.042 M 516.333 619.167 C 498.356 622.360 488.161 629.695 488.158 629.696 C 488.164 629.692 509.411 596.009 549.667 587.223 C 567.916 583.239 585.072 597.103 580.053 608.420 C 568.575 634.306 546.534 613.802 516.333 619.167 M 260.839 696.005 C 263.245 698.895 263.149 702.513 263.149 702.514 C 263.169 702.514 460.567 702.514 460.587 702.514 C 460.587 702.513 459.805 699.233 461.737 695.363 C 479.118 660.560 552.716 692.484 522.413 651.734 C 489.692 607.731 456.420 698.498 433.108 666.894 C 415.159 642.559 498.320 616.890 458.706 602.015 C 396.815 578.776 425.818 671.501 385.822 662.246 C 350.429 654.056 423.843 582.263 356.370 583.802 C 298.604 585.119 368.321 647.420 333.707 662.109 C 292.231 679.709 303.018 570.338 248.262 602.958 C 217.337 621.380 303.116 638.810 274.344 664.858 C 259.085 678.672 194.011 609.640 180.423 662.382 C 171.325 697.696 232.491 661.948 260.839 696.005 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":61.58,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":21.026,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":214.18,\\\"y\\\":360.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869443305632,\\\"y\\\":0.005109908846835934}},{\\\"point\\\":{\\\"x\\\":505.82,\\\"y\\\":360.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869443305632,\\\"y\\\":0.005109908846835945}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":700.978,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"2E3BB2F1-D5FB-4B3D-A5D1-DD816AA8BC52_0\\\",\\\"x1\\\":\\\"50.00%\\\",\\\"y1\\\":\\\"35.20%\\\",\\\"x2\\\":\\\"50.00%\\\",\\\"y2\\\":\\\"112.73%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"waterworks\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":18.77423614463172,\\\"max\\\":697.8805},\\\"y\\\":{\\\"min\\\":12.21023614463172,\\\"max\\\":688.7205000000001}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"waterworks_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"waterworks\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 554.181 246.879 C 554.181 246.868 545.758 209.542 545.758 134.142 C 545.758 58.741 554.181 21.416 554.181 21.405 C 554.191 21.407 672.737 -2.073 696.528 114.489 C 696.998 116.791 696.998 151.492 696.528 153.795 C 672.737 270.357 554.191 246.876 554.181 246.879 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 26.662 545.021 C 26.673 545.021 63.999 536.598 139.399 536.598 C 214.800 536.598 252.125 545.021 252.136 545.021 C 252.134 545.031 275.614 663.577 159.052 687.368 C 156.750 687.838 122.049 687.838 119.746 687.368 C 3.184 663.577 26.665 545.031 26.662 545.021 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 524.531 202.818 C 509.648 206.118 494.784 197.756 482.861 200.225 C 471.019 202.676 462.760 214.151 451.360 217.666 C 439.943 221.186 426.766 216.344 415.877 220.957 C 404.986 225.570 399.362 238.344 389.036 243.932 C 378.704 249.523 364.994 247.232 355.308 253.776 C 345.618 260.322 342.649 273.869 333.651 281.286 C 324.653 288.703 310.807 289.026 302.569 297.264 C 294.331 305.502 294.009 319.348 286.591 328.346 C 279.174 337.344 265.627 340.313 259.081 350.002 C 252.537 359.689 254.827 373.399 249.237 383.731 C 243.649 394.057 230.875 399.681 226.262 410.572 C 221.649 421.461 226.491 434.638 222.971 446.055 C 219.456 457.455 208.316 465.789 205.530 477.556 C 202.368 490.912 213.000 503.031 208.213 519.257 C 237.231 526.656 253.024 540.267 253.024 549.533 C 253.024 558.918 239.092 572.551 208.096 579.840 C 173.280 588.027 125.594 589.099 92.848 584.221 C 46.294 577.286 25.689 560.874 25.689 549.533 C 25.689 538.192 46.591 521.755 92.847 514.845 C 92.847 514.845 95.633 506.592 96.057 502.291 C 97.656 486.038 87.974 469.718 91.218 454.001 C 94.463 438.283 109.702 427.323 114.367 412.193 C 119.038 397.039 112.613 379.550 118.735 365.097 C 124.858 350.642 141.812 343.177 149.229 329.472 C 156.649 315.759 153.608 297.562 162.294 284.706 C 170.983 271.846 188.963 267.905 198.808 255.963 C 208.652 244.020 209.080 225.643 220.014 214.709 C 230.948 203.775 249.326 203.347 261.268 193.502 C 273.210 183.658 277.151 165.678 290.011 156.989 C 302.867 148.303 321.064 151.344 334.777 143.923 C 348.482 136.507 355.947 119.553 370.402 113.430 C 384.855 107.308 402.344 113.734 417.497 109.062 C 432.628 104.397 443.588 89.158 459.306 85.914 C 475.023 82.669 491.273 91.300 507.595 90.751 C 512.325 90.593 520.150 87.570 520.150 87.570 C 521.657 54.001 543.497 20.412 554.838 20.412 C 566.179 20.412 585.402 40.683 589.526 87.569 C 593.271 130.142 592.381 164.519 585.145 202.816 C 579.233 234.106 566.040 247.948 554.838 247.746 C 545.455 247.577 531.906 234.201 524.531 202.818 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 201.390 536.068 C 214.081 539.807 220.029 544.640 220.029 549.533 C 220.029 554.464 213.988 559.335 201.404 563.036 C 194.107 565.182 184.514 566.937 172.595 568.054 C 164.237 568.838 155.045 569.309 144.745 569.421 C 142.654 569.444 121.624 569.176 113.800 568.658 C 102.159 567.889 92.368 566.552 84.676 564.860 C 66.897 560.950 58.685 555.283 58.685 549.533 C 58.685 543.784 66.897 538.117 84.676 534.206 C 82.942 539.106 81.628 544.202 81.628 549.533 C 81.628 554.834 82.927 559.903 84.676 564.860 M 208.213 519.257 C 236.898 526.673 253.024 540.267 253.024 549.533 C 253.024 558.918 239.092 572.551 208.096 579.840 C 173.280 588.027 125.594 589.099 92.848 584.221 C 46.294 577.286 25.689 560.874 25.689 549.533 C 25.689 538.192 46.262 521.561 92.847 514.845 C 90.417 521.337 87.125 527.670 84.676 534.206 M 520.150 87.570 C 521.453 53.975 543.497 20.412 554.838 20.412 C 566.179 20.412 585.402 40.683 589.526 87.569 C 593.271 130.142 592.381 164.519 585.145 202.816 C 579.233 234.106 564.222 247.746 554.838 247.746 C 545.453 247.746 532.447 233.660 524.531 202.818 C 509.648 206.118 494.784 197.756 482.861 200.225 C 471.019 202.676 462.760 214.151 451.360 217.666 C 439.943 221.186 426.766 216.344 415.877 220.957 C 404.986 225.570 399.362 238.344 389.036 243.932 C 378.704 249.523 364.994 247.232 355.308 253.776 C 345.618 260.322 342.649 273.869 333.651 281.286 C 324.653 288.703 310.807 289.026 302.569 297.264 C 294.331 305.502 294.009 319.348 286.591 328.346 C 279.174 337.344 265.627 340.313 259.081 350.002 C 252.537 359.689 254.827 373.399 249.237 383.731 C 243.649 394.057 230.875 399.681 226.262 410.572 C 221.649 421.461 226.491 434.638 222.971 446.055 C 219.456 457.455 207.913 465.700 205.530 477.556 C 203.165 489.316 212.648 503.290 208.213 519.257 C 206.633 524.945 203.644 530.463 201.390 536.068 C 195.952 549.588 198.164 555.584 201.404 563.036 M 113.800 568.658 C 111.173 562.585 108.927 556.258 108.954 549.533 C 108.979 543.111 121.951 527.402 122.549 505.019 C 122.960 489.636 114.933 474.327 117.990 459.517 C 121.047 444.707 135.407 434.380 139.802 420.123 C 144.204 405.845 138.149 389.365 143.918 375.747 C 149.687 362.127 165.663 355.093 172.651 342.179 C 179.643 329.258 176.778 312.112 184.962 299.999 C 193.149 287.881 210.091 284.168 219.366 272.916 C 228.642 261.662 229.046 244.346 239.349 234.044 C 249.651 223.741 266.967 223.337 278.220 214.061 C 289.473 204.786 293.186 187.844 305.303 179.657 C 317.417 171.472 334.563 174.337 347.484 167.346 C 360.398 160.357 367.432 144.382 381.052 138.613 C 394.670 132.844 411.150 138.899 425.428 134.497 C 439.685 130.102 450.012 115.743 464.822 112.685 C 479.632 109.628 495.071 119.282 510.324 117.244 C 519.413 116.029 529.770 111.002 535.727 108.434 C 542.018 105.744 548.245 103.649 554.838 103.649 C 561.431 103.649 567.642 105.782 573.949 108.433 C 573.212 97.182 571.887 87.511 570.184 79.490 C 566.453 61.910 560.688 53.407 554.838 53.407 C 548.988 53.407 543.223 61.910 539.492 79.491 C 532.932 81.800 526.585 85.165 520.150 87.570 C 515.905 89.162 512.325 90.593 507.595 90.751 C 491.273 91.300 475.023 82.669 459.306 85.914 C 443.588 89.158 432.628 104.397 417.497 109.062 C 402.344 113.734 384.855 107.308 370.402 113.430 C 355.947 119.553 348.482 136.507 334.777 143.923 C 321.064 151.344 302.867 148.303 290.011 156.989 C 277.151 165.678 273.210 183.658 261.268 193.502 C 249.326 203.347 230.948 203.775 220.014 214.709 C 209.080 225.643 208.652 244.020 198.808 255.963 C 188.963 267.905 170.983 271.846 162.294 284.706 C 153.608 297.562 156.649 315.759 149.229 329.472 C 141.812 343.177 124.858 350.642 118.735 365.097 C 112.613 379.550 119.038 397.039 114.367 412.193 C 109.702 427.323 94.463 438.283 91.218 454.001 C 87.974 469.718 97.656 486.038 96.057 502.291 C 95.633 506.592 94.420 510.764 92.847 514.845 C 92.847 514.845 95.633 506.592 96.057 502.291 C 97.656 486.038 87.974 469.718 91.218 454.001 C 94.463 438.283 109.702 427.323 114.367 412.193 C 119.038 397.039 112.613 379.550 118.735 365.097 C 124.858 350.642 141.812 343.177 149.229 329.472 C 156.649 315.759 153.608 297.562 162.294 284.706 C 170.983 271.846 188.963 267.905 198.808 255.963 C 208.652 244.020 209.080 225.643 220.014 214.709 C 230.948 203.775 249.326 203.347 261.268 193.502 C 273.210 183.658 277.151 165.678 290.011 156.989 C 302.867 148.303 321.064 151.344 334.777 143.923 C 348.482 136.507 355.947 119.553 370.402 113.430 C 384.855 107.308 402.344 113.734 417.497 109.062 C 432.628 104.397 443.588 89.158 459.306 85.914 C 475.023 82.669 491.273 91.300 507.595 90.751 C 512.325 90.593 520.150 87.570 520.150 87.570 C 521.657 54.001 543.497 20.412 554.838 20.412 C 566.179 20.412 585.402 40.683 589.526 87.569 C 593.271 130.142 592.381 164.519 585.145 202.816 C 579.233 234.106 566.040 247.948 554.838 247.746 C 545.455 247.577 531.906 234.201 524.531 202.818 C 530.329 201.533 535.726 198.343 541.366 196.083 C 545.112 208.803 549.945 214.751 554.838 214.751 C 559.731 214.751 564.564 208.803 568.303 196.112 C 570.415 188.943 572.151 179.328 573.337 167.330 C 567.235 164.686 561.223 161.848 554.838 162.366 C 538.568 163.688 525.159 173.345 516.185 174.171 C 502.880 175.396 489.536 167.559 476.677 170.213 C 463.816 172.868 454.849 185.336 442.470 189.153 C 430.072 192.975 415.762 187.718 403.938 192.727 C 392.111 197.736 386.004 211.607 374.791 217.675 C 363.571 223.747 348.683 221.259 338.165 228.366 C 327.643 235.474 324.418 250.185 314.647 258.239 C 304.876 266.294 289.841 266.644 280.895 275.590 C 271.949 284.536 271.599 299.572 263.544 309.343 C 255.490 319.113 240.779 322.338 233.671 332.859 C 226.564 343.378 229.052 358.266 222.980 369.486 C 216.912 380.699 203.041 386.806 198.032 398.633 C 193.023 410.458 198.280 424.767 194.458 437.165 C 190.641 449.544 178.173 458.511 175.518 471.372 C 172.864 484.231 181.327 497.954 179.476 510.880 C 177.323 525.915 167.671 543.127 167.671 549.533 C 167.671 556.054 170.074 562.144 172.595 568.054 M 144.745 569.421 C 141.937 562.923 139.415 556.454 139.415 549.533 C 139.415 531.204 151.027 517.694 152.081 508.059 C 153.640 493.808 144.986 479.465 147.834 465.667 C 150.682 451.868 164.060 442.247 168.156 428.964 C 172.257 415.661 166.616 400.307 171.991 387.620 C 177.366 374.930 192.249 368.377 198.760 356.345 C 205.274 344.307 202.605 328.332 210.231 317.046 C 217.858 305.756 233.643 302.297 242.285 291.813 C 250.927 281.329 251.303 265.196 260.902 255.597 C 270.501 245.998 286.634 245.622 297.118 236.980 C 307.601 228.338 311.061 212.553 322.350 204.925 C 333.637 197.300 349.612 199.969 361.650 193.455 C 373.682 186.944 380.235 172.061 392.925 166.685 C 405.612 161.311 420.966 166.952 434.269 162.851 C 447.552 158.756 457.173 145.378 470.972 142.529 C 484.770 139.681 499.050 147.580 513.365 146.776 C 519.994 146.404 536.891 132.962 554.838 134.110 C 561.312 134.524 566.703 136.842 574.757 139.153 C 574.843 128.007 574.568 117.875 573.949 108.433 M 574.757 139.153 C 574.674 149.953 574.122 159.396 573.337 167.330 M 539.492 79.491 C 550.611 75.575 562.705 76.614 570.184 79.490 M 541.366 196.083 C 552.601 191.583 563.364 193.898 568.303 196.112 M 25.689 549.533 C 25.689 538.192 46.591 521.755 92.847 514.845 M 92.848 584.221 C 46.294 577.286 25.689 560.874 25.689 549.533 M 208.096 579.840 C 173.280 588.027 125.594 589.099 92.848 584.221 M 253.024 549.533 C 253.024 558.918 239.092 572.551 208.096 579.840 M 208.213 519.257 C 237.231 526.656 253.024 540.267 253.024 549.533 M 205.530 477.556 C 202.368 490.912 213.000 503.031 208.213 519.257 M 222.971 446.055 C 219.456 457.455 208.316 465.789 205.530 477.556 M 226.262 410.572 C 221.649 421.461 226.491 434.638 222.971 446.055 M 249.237 383.731 C 243.649 394.057 230.875 399.681 226.262 410.572 M 259.081 350.002 C 252.537 359.689 254.827 373.399 249.237 383.731 M 286.591 328.346 C 279.174 337.344 265.627 340.313 259.081 350.002 M 302.569 297.264 C 294.331 305.502 294.009 319.348 286.591 328.346 M 333.651 281.286 C 324.653 288.703 310.807 289.026 302.569 297.264 M 355.308 253.776 C 345.618 260.322 342.649 273.869 333.651 281.286 M 389.036 243.932 C 378.704 249.523 364.994 247.232 355.308 253.776 M 415.877 220.957 C 404.986 225.570 399.362 238.344 389.036 243.932 M 451.360 217.666 C 439.943 221.186 426.766 216.344 415.877 220.957 M 482.861 200.225 C 471.019 202.676 462.760 214.151 451.360 217.666 M 524.531 202.818 C 509.648 206.118 494.784 197.756 482.861 200.225 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 220.029 549.533 C 220.029 554.464 213.988 559.335 201.404 563.036 C 198.164 555.584 195.952 549.588 201.390 536.068 C 214.081 539.807 220.029 544.640 220.029 549.533 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 58.685 549.533 C 58.685 543.784 66.897 538.117 84.676 534.206 C 82.942 539.106 81.628 544.202 81.628 549.533 C 81.628 554.834 82.927 559.903 84.676 564.860 C 66.897 560.950 58.685 555.283 58.685 549.533 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 554.838 53.407 C 560.688 53.407 566.453 61.910 570.184 79.490 C 562.705 76.614 550.611 75.575 539.492 79.491 C 543.223 61.910 548.988 53.407 554.838 53.407 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 554.838 214.751 C 549.945 214.751 545.112 208.803 541.366 196.083 C 552.601 191.583 563.364 193.898 568.303 196.112 C 564.564 208.803 559.731 214.751 554.838 214.751 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 513.308 257.074 C 521.377 259.392 529.016 252.749 531.615 238.085 C 537.412 205.382 564.014 205.821 564.017 205.818 C 564.012 205.819 536.342 201.426 514.408 217.185 C 495.194 230.990 501.062 253.555 513.308 257.074 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 513.308 13.662 C 521.377 11.344 529.016 17.987 531.615 32.651 C 537.412 65.353 564.014 64.914 564.017 64.917 C 564.012 64.916 536.342 69.309 514.408 53.550 C 495.195 39.746 501.063 17.180 513.308 13.662 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 20.226 504.272 C 17.908 512.341 24.551 519.979 39.215 522.579 C 71.918 528.376 71.479 554.978 71.482 554.981 C 71.481 554.976 75.874 527.305 60.114 505.372 C 46.310 486.158 23.744 492.026 20.226 504.272 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 263.638 504.272 C 265.956 512.341 259.313 519.979 244.649 522.579 C 211.946 528.376 212.386 554.978 212.382 554.981 C 212.383 554.976 207.990 527.306 223.749 505.372 C 237.554 486.158 260.120 492.026 263.638 504.272 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":509.206,\\\"y\\\":504.173,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7070833488209456,\\\"y\\\":-0.7071302127756648}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":697.816,\\\"y\\\":139.815,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":181.621,\\\"y\\\":175.248,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.7106929355109912,\\\"y\\\":-0.7035023464173875}},{\\\"point\\\":{\\\"x\\\":348.914,\\\"y\\\":342.541,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7035023464173885,\\\"y\\\":0.7106929355109903}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":243.634,\\\"y\\\":627.542,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.712873763811751,\\\"y\\\":0.7012923761662232}},{\\\"point\\\":{\\\"x\\\":35.268,\\\"y\\\":627.605,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987087443167477,\\\"y\\\":0.7154062416664491}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":143.42,\\\"y\\\":688.994,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":635.543,\\\"y\\\":30.399,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7012356970404198,\\\"y\\\":-0.7129295176917818}},{\\\"point\\\":{\\\"x\\\":635.606,\\\"y\\\":238.765,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7154062416664484,\\\"y\\\":0.6987087443167483}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"wave\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":17.232901539241478,\\\"max\\\":677.234},\\\"y\\\":{\\\"min\\\":58.151757242838634,\\\"max\\\":583.1494785407912}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wave\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"Layer_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 46.599 319.536 C 89.157 50.190 410.686 38.718 499.854 140.403 C 524.050 167.997 550.007 223.835 507.356 227.340 C 460.387 231.199 386.275 281.623 385.337 356.280 C 384.278 440.605 522.830 502.199 522.843 502.214 C 522.837 502.214 457.479 500.270 457.473 500.270 C 457.449 500.275 328.431 546.924 219.637 556.838 C 133.964 564.646 24.325 460.513 46.599 319.536 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 103.011 316.457 C 103.016 316.473 95.189 398.422 152.592 468.067 C 218.734 548.315 327.634 546.154 327.651 546.161 M 176.775 183.897 C 176.773 183.914 137.003 285.820 151.475 349.079 C 165.022 408.297 193.233 438.964 239.363 478.488 C 286.638 518.993 362.593 540.427 362.606 540.433 M 241.260 187.737 C 241.257 187.752 206.501 276.406 215.574 332.948 C 225.286 393.469 246.619 429.316 290.981 471.615 C 325.023 504.073 399.130 526.131 399.141 526.136 M 317.769 181.222 C 317.764 181.237 269.916 267.956 274.581 326.703 C 279.039 382.840 298.777 416.162 336.819 457.685 C 365.559 489.056 430.348 514.726 430.357 514.732 M 453.727 170.256 C 453.715 170.273 338.055 222.555 331.124 343.155 C 328.140 395.077 362.209 434.468 393.757 461.532 C 420.821 484.750 475.503 503.337 475.511 503.341 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wave\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#B3357A75-C65C-4F5F-B1E6-6B33304CE96E_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 158.205 457.279 C 155.134 469.823 145.142 479.946 133.137 483.802 C 154.898 513.719 189.902 528.054 234.610 534.094 C 332.542 547.325 382.056 494.086 461.985 487.805 C 575.633 478.873 675.212 555.994 675.234 556.001 C 675.212 555.998 564.122 505.700 464.075 525.433 C 403.540 537.373 344.486 591.066 221.206 579.538 C 154.007 573.254 58.018 546.128 53.262 453.095 C 52.811 444.276 54.549 435.546 57.730 427.050 C 62.025 415.582 72.813 403.686 81.620 399.599 C 127.322 378.389 168.724 414.317 158.205 457.279 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 125.271 453.875 C 122.464 456.330 110.718 454.717 115.780 448.438 M 110.842 428.083 C 129.548 426.277 134.803 445.540 125.271 453.875 M 93.162 466.740 C 86.554 453.035 90.568 430.041 110.842 428.083 M 133.137 483.802 C 117.741 488.749 100.878 482.740 93.162 466.740 M 158.205 457.279 C 155.134 469.823 145.142 479.946 133.137 483.802 C 154.898 513.719 189.902 528.054 234.610 534.094 C 332.542 547.325 382.056 494.086 461.985 487.805 C 575.633 478.873 675.212 555.994 675.234 556.001 C 675.212 555.998 564.122 505.700 464.075 525.433 C 403.540 537.373 344.486 591.066 221.206 579.538 C 154.007 573.254 58.018 546.128 53.262 453.095 C 52.811 444.276 54.549 435.546 57.730 427.050 C 62.025 415.582 72.813 403.686 81.620 399.599 C 127.322 378.389 168.724 414.317 158.205 457.279 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 57.730 427.050 C 62.025 415.582 72.813 403.686 81.620 399.599 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 53.262 453.095 C 52.811 444.276 54.549 435.546 57.730 427.050 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#B3357A75-C65C-4F5F-B1E6-6B33304CE96E_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 57.730 427.050 C 62.025 415.582 72.813 403.686 81.620 399.599 C 75.358 387.785 76.211 371.927 74.847 361.708 C 92.548 372.373 117.250 372.850 133.923 360.100 C 169.105 333.194 162.466 285.029 122.039 264.290 C 117.145 261.777 111.075 259.466 104.377 257.792 C 90.628 254.356 56.746 254.157 33.667 289.527 C 33.789 290.458 22.472 308.585 19.789 335.633 C 16.564 368.151 27.320 415.946 53.262 453.095 C 52.811 444.276 54.549 435.546 57.730 427.050 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 57.730 427.050 C 62.025 415.582 72.813 403.686 81.620 399.599 C 75.358 387.785 76.211 371.927 74.847 361.708 C 92.548 372.373 117.250 372.850 133.923 360.100 C 169.105 333.194 162.466 285.029 122.039 264.290 C 117.145 261.777 111.075 259.466 104.377 257.792 C 90.628 254.356 56.746 254.157 33.667 289.527 C 33.789 290.458 22.472 308.585 19.789 335.633 C 16.564 368.151 27.320 415.946 53.262 453.095 C 52.811 444.276 54.549 435.546 57.730 427.050 M 60.392 324.581 C 56.878 340.320 62.539 354.088 74.847 361.708 M 105.116 299.907 C 85.258 286.562 64.889 304.435 60.392 324.581 M 102.392 333.681 C 116.756 331.582 122.999 311.925 105.116 299.907 M 96.406 321.480 C 89.082 323.312 92.637 335.106 102.392 333.681 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 33.667 289.527 C 56.746 254.157 90.628 254.356 104.377 257.792 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 104.377 257.792 C 111.075 259.466 117.145 261.777 122.039 264.290 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#B3357A75-C65C-4F5F-B1E6-6B33304CE96E_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 122.039 264.290 C 126.137 248.736 134.129 237.023 144.190 230.658 C 148.759 240.393 155.868 248.459 165.415 253.174 C 202.993 271.735 241.180 253.676 251.671 216.580 C 254.858 205.310 255.537 192.474 252.995 178.392 C 251.801 171.777 249.508 164.557 246.117 157.695 C 240.267 145.859 230.814 135.716 218.687 129.410 C 191.988 115.528 159.126 111.028 128.183 124.646 C 53.969 152.785 29.558 258.281 33.667 289.527 C 56.746 254.157 90.628 254.356 104.377 257.792 C 111.075 259.466 117.145 261.777 122.039 264.290 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 122.039 264.290 C 126.137 248.736 134.129 237.023 144.190 230.658 C 148.759 240.393 155.868 248.459 165.415 253.174 C 202.993 271.735 241.180 253.676 251.671 216.580 C 254.858 205.310 255.537 192.474 252.995 178.392 C 251.801 171.777 249.508 164.557 246.117 157.695 C 240.267 145.859 230.814 135.716 218.687 129.410 C 191.988 115.528 159.126 111.028 128.183 124.646 C 53.969 152.785 29.558 258.281 33.667 289.527 C 56.746 254.157 90.628 254.356 104.377 257.792 C 111.075 259.466 117.145 261.777 122.039 264.290 M 167.569 164.888 C 139.304 173.436 132.949 206.712 144.190 230.658 M 211.842 197.924 C 216.120 172.406 188.937 158.426 167.569 164.888 M 177.359 210.321 C 185.840 223.533 207.989 220.905 211.842 197.924 M 186.704 198.977 C 181.630 192.581 171.600 201.349 177.359 210.321 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 252.995 178.392 C 251.801 171.777 249.508 164.557 246.117 157.695 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 246.117 157.695 C 240.267 145.859 230.814 135.716 218.687 129.410 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 218.687 129.410 C 191.988 115.528 159.126 111.028 128.183 124.646 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 251.671 216.580 C 254.858 205.310 255.537 192.474 252.995 178.392 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#B3357A75-C65C-4F5F-B1E6-6B33304CE96E_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 252.995 178.392 C 251.801 171.777 249.508 164.557 246.117 157.695 C 240.267 145.859 230.814 135.716 218.687 129.410 C 191.988 115.528 159.126 111.028 128.183 124.646 C 130.084 123.925 165.710 97.104 207.131 78.410 C 305.127 34.182 362.358 84.250 363.216 83.937 C 390.854 106.917 400.605 132.595 399.536 152.620 C 398.060 180.276 387.756 207.984 366.551 227.213 C 325.264 264.652 273.630 253.767 251.671 216.580 C 254.858 205.310 255.537 192.474 252.995 178.392 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 252.995 178.392 C 251.801 171.777 249.508 164.557 246.117 157.695 C 240.267 145.859 230.814 135.716 218.687 129.410 C 191.988 115.528 159.126 111.028 128.183 124.646 C 130.084 123.925 165.710 97.104 207.131 78.410 C 305.127 34.182 362.358 84.250 363.216 83.937 C 390.854 106.917 400.605 132.595 399.536 152.620 C 398.060 180.276 387.756 207.984 366.551 227.213 C 325.264 264.652 273.630 253.767 251.671 216.580 C 254.858 205.310 255.537 192.474 252.995 178.392 M 330.248 132.007 C 301.976 107.040 260.374 126.415 246.117 157.695 M 324.640 196.068 C 352.526 184.683 349.727 149.209 330.248 132.007 M 291.255 169.513 C 283.364 185.998 299.526 206.322 324.640 196.068 M 308.208 171.822 C 311.435 162.883 296.613 158.318 291.255 169.513 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 366.551 227.213 C 387.756 207.984 398.060 180.276 399.536 152.620 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 399.536 152.620 C 400.605 132.595 390.854 106.917 363.216 83.937 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#B3357A75-C65C-4F5F-B1E6-6B33304CE96E_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 405.824 297.616 C 377.746 278.215 365.859 251.122 366.551 227.213 C 387.756 207.984 398.060 180.276 399.536 152.620 C 400.605 132.595 390.854 106.917 363.216 83.937 C 423.781 61.834 467.963 66.436 516.985 96.421 C 552.055 117.873 586.927 178.774 570.459 235.284 C 561.117 267.340 531.550 297.498 497.946 308.900 C 466.060 319.720 429.019 313.644 405.824 297.616 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 448.502 198.434 C 462.432 201.507 461.164 219.308 450.316 218.015 M 429.210 242.707 C 409.492 219.163 428.297 193.976 448.502 198.434 M 502.395 234.138 C 487.038 259.650 449.522 266.959 429.210 242.707 M 428.876 142.456 C 483.782 132.738 530.543 187.379 502.395 234.138 M 399.536 152.620 C 408.065 147.909 417.916 144.396 428.876 142.456 M 405.824 297.616 C 377.746 278.215 365.859 251.122 366.551 227.213 C 387.756 207.984 398.060 180.276 399.536 152.620 C 400.605 132.595 390.854 106.917 363.216 83.937 C 423.781 61.834 467.963 66.436 516.985 96.421 C 552.055 117.873 586.927 178.774 570.459 235.284 C 561.117 267.340 531.550 297.498 497.946 308.900 C 466.060 319.720 429.019 313.644 405.824 297.616 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":698.889,\\\"y\\\":572.297,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8445458300936202,\\\"y\\\":-0.5354832778635371}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":302.332,\\\"y\\\":51.916,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":18.112,\\\"y\\\":337.488,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872791315688,\\\"y\\\":0.005043964218926946}},{\\\"point\\\":{\\\"x\\\":586.552,\\\"y\\\":337.488,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872769562663,\\\"y\\\":0.005044395463444383}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":642.219,\\\"y\\\":539.202,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128968614402305,\\\"y\\\":0.7012688963219949}},{\\\"point\\\":{\\\"x\\\":100.611,\\\"y\\\":539.243,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986784692109597,\\\"y\\\":0.7154358089032378}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":532.933,\\\"y\\\":112.123,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6313969658740629,\\\"y\\\":-0.7754597807011188}},{\\\"point\\\":{\\\"x\\\":101.321,\\\"y\\\":135.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.681745359745414,\\\"y\\\":-0.73158954644363}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":302.332,\\\"y\\\":575.836,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"B3357A75-C65C-4F5F-B1E6-6B33304CE96E_0\\\",\\\"x1\\\":\\\"49.40%\\\",\\\"y1\\\":\\\"-6.12%\\\",\\\"x2\\\":\\\"24.68%\\\",\\\"y2\\\":\\\"140.20%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"B3357A75-C65C-4F5F-B1E6-6B33304CE96E_1\\\",\\\"cx\\\":\\\"56.96%\\\",\\\"cy\\\":\\\"45.84%\\\",\\\"r\\\":\\\"80.14%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"B3357A75-C65C-4F5F-B1E6-6B33304CE96E_2\\\",\\\"cx\\\":\\\"66.49%\\\",\\\"cy\\\":\\\"62.10%\\\",\\\"r\\\":\\\"88.46%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"B3357A75-C65C-4F5F-B1E6-6B33304CE96E_3\\\",\\\"cx\\\":\\\"58.03%\\\",\\\"cy\\\":\\\"50.64%\\\",\\\"r\\\":\\\"70.44%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"B3357A75-C65C-4F5F-B1E6-6B33304CE96E_4\\\",\\\"cx\\\":\\\"45.63%\\\",\\\"cy\\\":\\\"53.28%\\\",\\\"r\\\":\\\"77.11%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"wheel\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":41.183,\\\"max\\\":678.817},\\\"y\\\":{\\\"min\\\":22.119,\\\"max\\\":659.755}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wheel\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wheel\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 91.690 215.089 C 91.708 215.096 275.423 291.194 275.441 291.201 C 275.442 291.203 288.579 298.483 283.411 310.959 C 278.243 323.436 263.806 319.295 263.804 319.295 C 263.786 319.288 80.071 243.191 80.053 243.183 C 80.052 243.181 65.822 235.935 71.163 223.043 C 76.503 210.151 91.688 215.090 91.690 215.089 M 384.895 245.101 C 384.903 245.083 461.000 61.368 461.008 61.349 C 461.010 61.349 468.289 48.212 480.766 53.380 C 493.242 58.548 489.101 72.984 489.102 72.986 C 489.094 73.005 412.997 256.720 412.989 256.738 C 412.987 256.739 405.741 270.969 392.849 265.628 C 379.958 260.288 384.896 245.104 384.895 245.101 M 445.214 289.064 C 445.233 289.056 628.947 212.959 628.966 212.951 C 628.968 212.952 643.404 208.811 648.572 221.287 C 653.740 233.763 640.604 241.043 640.603 241.045 C 640.584 241.053 456.869 317.150 456.851 317.158 C 456.849 317.157 441.664 322.095 436.324 309.203 C 430.984 296.311 445.214 289.066 445.214 289.064 M 459.828 623.129 C 459.820 623.110 383.723 439.396 383.715 439.377 C 383.716 439.375 379.574 424.939 392.051 419.771 C 404.527 414.603 411.807 427.740 411.809 427.740 C 411.817 427.759 487.914 611.474 487.921 611.492 C 487.921 611.494 492.859 626.679 479.967 632.019 C 467.075 637.359 459.830 623.130 459.828 623.129 M 466.266 366.957 C 466.283 366.965 640.966 440.850 640.983 440.858 C 640.984 440.860 654.120 448.139 648.953 460.616 C 643.785 473.092 629.348 468.951 629.346 468.952 C 629.328 468.944 445.613 392.847 445.594 392.839 C 445.593 392.837 430.727 385.309 436.704 372.700 C 444.881 355.452 466.263 366.958 466.266 366.957 M 234.144 610.189 C 234.151 610.170 310.249 426.455 310.256 426.437 C 310.258 426.436 317.538 413.300 330.014 418.467 C 342.491 423.635 338.350 438.072 338.350 438.074 C 338.343 438.092 262.245 621.807 262.238 621.826 C 262.236 621.826 254.990 636.056 242.098 630.716 C 229.206 625.376 234.145 610.191 234.144 610.189 M 79.204 440.670 C 79.222 440.663 262.937 364.565 262.955 364.558 C 262.957 364.559 277.394 360.417 282.562 372.893 C 287.730 385.370 274.593 392.649 274.592 392.651 C 274.574 392.659 90.859 468.756 90.841 468.764 C 90.839 468.763 75.654 473.701 70.314 460.810 C 64.974 447.918 79.203 440.672 79.204 440.670 M 307.810 256.125 C 307.802 256.107 231.705 72.392 231.697 72.373 C 231.698 72.371 227.557 57.935 240.033 52.767 C 252.509 47.599 259.789 60.736 259.791 60.737 C 259.799 60.755 335.896 244.470 335.904 244.488 C 335.903 244.490 340.841 259.675 327.949 265.015 C 315.057 270.355 307.812 256.126 307.810 256.125 M 160.831 122.101 C 160.845 122.115 301.454 262.725 301.468 262.739 C 301.468 262.741 310.819 274.494 301.270 284.043 C 291.721 293.592 279.968 284.241 279.966 284.241 C 279.952 284.227 139.342 143.618 139.328 143.604 C 139.328 143.601 128.955 131.462 138.822 121.595 C 148.689 111.728 160.829 122.101 160.831 122.101 M 420.232 262.034 C 420.246 262.020 560.856 121.411 560.870 121.396 C 560.872 121.396 572.625 112.046 582.174 121.595 C 591.722 131.144 582.372 142.897 582.372 142.899 C 582.358 142.913 441.749 283.522 441.734 283.537 C 441.732 283.537 429.593 293.910 419.726 284.043 C 409.859 274.176 420.232 262.036 420.232 262.034 M 459.136 325.733 C 459.156 325.733 658.008 325.733 658.027 325.733 C 658.029 325.735 672.951 327.433 672.951 340.938 C 672.951 354.442 658.029 356.140 658.027 356.142 C 658.008 356.142 459.156 356.142 459.136 356.142 C 459.134 356.140 443.216 354.892 443.215 340.938 C 443.215 326.983 459.134 325.735 459.136 325.733 M 344.796 639.961 C 344.796 639.942 344.796 441.090 344.796 441.070 C 344.797 441.069 346.496 426.146 360.000 426.146 C 373.504 426.146 375.203 441.069 375.204 441.070 C 375.204 441.090 375.204 639.942 375.204 639.961 C 375.203 639.963 373.954 655.882 360.000 655.882 C 346.046 655.882 344.797 639.963 344.796 639.961 M 441.276 400.252 C 441.290 400.267 581.900 540.876 581.914 540.890 C 581.914 540.892 591.264 552.645 581.715 562.194 C 572.166 571.743 560.414 562.393 560.412 562.393 C 560.398 562.379 419.788 421.769 419.774 421.755 C 419.774 421.753 409.401 409.613 419.268 399.746 C 429.135 389.879 441.274 400.252 441.276 400.252 M 141.243 541.641 C 141.257 541.627 281.867 401.017 281.881 401.003 C 281.883 401.003 293.636 391.653 303.185 401.202 C 312.734 410.751 303.383 422.503 303.383 422.505 C 303.369 422.520 162.759 563.129 162.745 563.143 C 162.743 563.143 150.604 573.516 140.737 563.649 C 130.870 553.782 141.243 541.643 141.243 541.641 M 62.969 325.733 C 62.989 325.733 261.841 325.733 261.860 325.733 C 261.862 325.735 276.785 327.433 276.785 340.938 C 276.785 354.442 261.862 356.140 261.860 356.142 C 261.841 356.142 62.989 356.142 62.969 356.142 C 62.968 356.140 47.049 354.892 47.049 340.938 C 47.049 326.983 62.968 325.735 62.969 325.733 M 344.796 242.719 C 344.796 242.699 344.796 43.848 344.796 43.828 C 344.797 43.827 346.496 28.904 360.000 28.904 C 373.504 28.904 375.203 43.827 375.204 43.828 C 375.204 43.848 375.204 242.699 375.204 242.719 C 375.203 242.721 373.954 258.640 360.000 258.640 C 346.046 258.640 344.797 242.721 344.796 242.719 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 449.348 C 390.002 449.348 417.104 437.246 436.706 417.644 C 456.308 398.042 468.410 370.940 468.410 340.938 C 468.410 310.936 456.308 283.834 436.706 264.232 C 417.104 244.630 390.002 232.528 360.000 232.528 C 329.998 232.528 302.896 244.630 283.294 264.232 C 263.692 283.834 251.590 310.936 251.590 340.938 C 251.590 370.940 263.692 398.042 283.294 417.644 C 302.896 437.246 329.998 449.348 360.000 449.348 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 171.199 529.739 C 219.446 577.986 286.155 607.772 360.000 607.772 C 433.845 607.772 500.554 577.986 548.801 529.739 C 597.048 481.492 626.834 414.783 626.834 340.938 C 626.834 267.092 597.049 200.383 548.801 152.136 C 500.554 103.889 433.845 74.104 360.000 74.104 C 286.155 74.104 219.446 103.889 171.199 152.136 C 122.952 200.383 93.166 267.092 93.166 340.938 C 93.166 414.783 122.952 481.492 171.199 529.739 M 135.832 565.106 C 193.117 622.391 272.322 657.755 360.000 657.755 C 447.678 657.755 526.883 622.391 584.168 565.106 C 641.453 507.821 676.817 428.616 676.817 340.938 C 676.817 253.260 641.453 174.055 584.168 116.770 C 526.883 59.484 447.679 24.119 360.000 24.119 C 272.322 24.119 193.117 59.484 135.832 116.770 C 78.547 174.055 43.183 253.259 43.183 340.938 C 43.183 428.616 78.547 507.821 135.832 565.106 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":269.739,\\\"max\\\":450.261},\\\"y\\\":{\\\"min\\\":251.245,\\\"max\\\":431.766}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":703.981,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":19.895,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":39.512,\\\"y\\\":342.422,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875191515549,\\\"y\\\":0.004996152631640931}},{\\\"point\\\":{\\\"x\\\":681.511,\\\"y\\\":342.422,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875191515549,\\\"y\\\":0.004996152631640918}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":588.284,\\\"y\\\":570.239,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129114031071889,\\\"y\\\":0.7012541132283925}},{\\\"point\\\":{\\\"x\\\":132.825,\\\"y\\\":570.286,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986926746712067,\\\"y\\\":0.715421935895731}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":587.796,\\\"y\\\":114.709,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314471500328139,\\\"y\\\":-0.7754189169187434}},{\\\"point\\\":{\\\"x\\\":132.978,\\\"y\\\":114.786,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.681724678395931,\\\"y\\\":-0.7316088181986083}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":638.591,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\"]}},{\\\"name\\\":\\\"wheel_of_fortune\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":58,\\\"max\\\":662},\\\"y\\\":{\\\"min\\\":33.874,\\\"max\\\":637.874}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wheel_of_fortune\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wheel_of_fortune\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wheel_of_fortune\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#1241C0CD-E909-4A7C-8BA7-10D96A7D56BF_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 635.874 C 526.048 635.874 660.000 501.922 660.000 335.874 C 660.000 169.826 526.048 35.874 360.000 35.874 C 193.952 35.874 60.000 169.826 60.000 335.874 C 60.000 501.922 193.952 635.874 360.000 635.874 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S10\\\",\\\"fill\\\":\\\"url(#1241C0CD-E909-4A7C-8BA7-10D96A7D56BF_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 543.364 C 474.845 543.364 567.491 450.718 567.491 335.874 C 567.491 221.029 474.845 128.383 360.000 128.383 C 245.155 128.383 152.509 221.029 152.509 335.874 C 152.509 450.718 245.155 543.364 360.000 543.364 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 172.206 328.525 C 172.206 333.424 172.206 338.323 172.206 343.222 M 547.794 328.525 C 547.794 333.424 547.794 338.323 547.794 343.222 M 487.595 473.860 C 491.059 470.396 494.523 466.932 497.987 463.468 M 222.013 208.279 C 225.477 204.815 228.941 201.351 232.405 197.887 M 222.013 463.468 C 225.477 466.932 228.941 470.396 232.405 473.860 M 487.595 197.887 C 491.059 201.351 494.523 204.815 497.987 208.279 M 352.652 523.668 C 357.551 523.668 362.449 523.668 367.348 523.668 M 352.652 148.079 C 357.551 148.079 362.449 148.079 367.348 148.079 M 310.590 481.116 C 316.080 486.606 327.058 497.585 327.060 497.587 C 327.062 497.585 343.528 481.118 343.530 481.116 C 343.532 481.118 359.998 497.585 360.000 497.587 C 360.002 497.585 376.468 481.118 376.470 481.116 C 376.472 481.118 392.938 497.585 392.940 497.587 C 392.942 497.585 403.920 486.606 409.410 481.116 M 310.590 464.647 C 316.080 470.137 327.058 481.115 327.060 481.117 C 327.062 481.115 343.528 464.648 343.530 464.647 C 343.532 464.648 359.998 481.115 360.000 481.117 C 360.002 481.115 376.468 464.648 376.470 464.647 C 376.472 464.648 392.938 481.115 392.940 481.117 C 392.942 481.115 403.920 470.137 409.410 464.647 M 339.251 235.355 C 353.084 235.355 366.916 235.355 380.749 235.355 M 380.749 169.882 C 380.749 181.366 371.485 190.631 360.000 190.631 C 348.515 190.631 339.251 181.366 339.251 169.882 M 339.251 211.379 C 339.251 199.895 348.515 190.631 360.000 190.631 C 371.485 190.631 380.749 199.895 380.749 211.379 C 380.749 222.864 371.485 232.128 360.000 232.128 C 348.515 232.128 339.251 222.864 339.251 211.379 M 463.745 315.124 C 463.745 328.957 463.745 342.790 463.745 356.623 M 484.494 315.124 C 484.498 315.126 525.988 335.872 525.992 335.874 C 525.988 335.876 484.498 356.621 484.494 356.623 C 484.494 356.619 484.494 315.128 484.494 315.124 M 194.025 335.874 C 194.025 319.068 207.582 305.510 224.388 305.510 C 241.194 305.510 254.751 319.068 254.751 335.874 C 254.751 352.680 241.194 366.237 224.388 366.237 C 207.582 366.237 194.025 352.679 194.025 335.874 M 227.954 467.919 C 315.985 379.889 404.015 291.858 492.046 203.828 M 227.954 203.828 C 315.985 291.858 404.015 379.889 492.046 467.919 M 173.258 335.874 C 297.753 335.874 422.247 335.874 546.742 335.874 M 360.000 149.132 C 360.000 273.626 360.000 398.121 360.000 522.615 M 297.753 335.874 C 297.753 370.327 325.547 398.121 360.000 398.121 C 394.453 398.121 422.247 370.327 422.247 335.874 C 422.247 301.420 394.453 273.626 360.000 273.626 C 325.547 273.626 297.753 301.420 297.753 335.874 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 170.356 161.826 C 170.379 161.022 170.655 160.011 171.184 158.793 C 171.413 158.195 171.655 157.885 171.907 157.862 C 172.183 157.816 172.620 158.092 173.217 158.689 C 174.343 159.816 175.469 160.941 176.594 162.067 C 177.238 162.710 178.777 163.974 181.213 165.858 C 183.671 167.719 185.578 169.327 186.934 170.683 C 190.978 174.727 192.460 178.920 191.380 183.263 C 191.104 184.365 190.748 185.135 190.311 185.572 C 189.714 186.169 189.013 186.066 188.209 185.262 C 187.979 185.032 187.727 184.710 187.451 184.297 C 185.291 181.172 183.166 178.334 181.075 175.784 C 178.984 173.188 177.330 171.258 176.112 169.994 C 174.894 168.730 173.791 167.581 172.803 166.547 C 171.815 165.467 171.149 164.617 170.804 163.997 C 170.460 163.331 170.310 162.607 170.356 161.826 M 180.868 134.495 C 174.274 141.090 167.680 147.684 161.085 154.278 C 160.626 154.738 160.120 154.967 159.569 154.967 C 159.041 154.944 158.627 154.669 158.328 154.140 C 156.422 150.763 154.514 147.386 152.607 144.008 C 152.354 143.479 152.274 142.916 152.366 142.319 C 152.481 141.698 152.699 141.227 153.021 140.906 C 153.319 140.607 153.572 140.561 153.779 140.768 C 154.468 141.457 155.330 142.089 156.364 142.663 C 157.421 143.215 158.259 143.479 158.880 143.456 C 167.324 135.013 175.768 126.569 184.211 118.125 C 184.671 117.665 185.061 117.458 185.383 117.504 C 185.705 117.504 186.072 117.803 186.486 118.400 C 187.336 119.642 188.186 120.883 189.036 122.123 C 189.519 122.881 189.829 123.513 189.967 124.018 C 190.082 124.501 190.093 124.880 190.001 125.155 C 189.932 125.408 189.875 125.695 189.829 126.017 C 189.760 126.316 189.852 126.775 190.105 127.396 C 190.357 128.016 190.828 128.809 191.518 129.774 C 192.712 131.520 194.229 133.312 196.067 135.150 C 197.836 136.919 200.547 139.125 204.201 141.767 C 207.831 144.387 210.565 146.615 212.403 148.454 C 213.552 149.602 214.368 150.923 214.850 152.417 C 215.356 153.887 215.746 155.634 216.022 157.656 C 216.091 158.184 216.102 158.540 216.056 158.724 C 216.033 158.885 215.896 159.206 215.643 159.689 C 215.390 160.126 215.137 160.562 214.885 160.999 C 214.586 161.481 214.345 161.722 214.161 161.722 C 214.023 161.722 213.782 161.550 213.437 161.205 C 211.829 159.597 208.543 156.288 203.580 151.280 C 198.617 146.225 192.919 140.481 186.486 134.047 C 185.590 133.151 184.717 132.715 183.867 132.738 C 183.039 132.738 182.040 133.324 180.868 134.495 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 169.930 519.214 C 170.642 518.502 171.711 517.456 173.135 516.078 C 174.537 514.676 175.468 513.745 175.927 513.286 C 177.696 511.517 179.936 508.863 182.648 505.325 C 185.336 501.809 187.599 499.132 189.437 497.294 C 190.586 496.146 191.907 495.330 193.401 494.847 C 194.871 494.342 196.617 493.951 198.639 493.676 C 199.168 493.607 199.524 493.595 199.708 493.641 C 199.868 493.664 200.190 493.802 200.673 494.055 C 201.109 494.308 201.546 494.560 201.982 494.813 C 202.465 495.112 202.706 495.353 202.706 495.537 C 202.706 495.674 202.534 495.916 202.189 496.260 C 193.171 505.279 184.153 514.297 175.134 523.315 C 174.307 524.142 173.928 524.935 173.997 525.693 C 174.043 526.428 174.537 527.474 175.479 528.829 C 178.236 532.689 179.638 534.642 179.684 534.688 C 179.982 535.125 180.063 535.619 179.925 536.170 C 179.787 536.722 179.477 537.147 178.994 537.445 C 176.134 539.134 173.274 540.823 170.413 542.512 C 169.907 542.788 169.344 542.868 168.724 542.753 C 168.104 542.638 167.633 542.420 167.311 542.098 C 167.012 541.799 166.966 541.547 167.173 541.340 C 167.839 540.674 168.414 539.892 168.896 538.996 C 169.356 538.077 169.563 537.296 169.517 536.653 C 168.299 534.792 167.357 533.137 166.691 531.690 C 166.001 530.265 165.553 529.059 165.346 528.071 C 165.094 527.083 165.105 526.153 165.381 525.280 C 165.611 524.406 165.932 523.671 166.346 523.074 C 166.759 522.476 167.368 521.776 168.173 520.971 C 168.759 520.385 169.345 519.800 169.930 519.214 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 547.538 506.801 C 547.515 507.605 547.239 508.616 546.711 509.834 C 546.481 510.431 546.240 510.741 545.987 510.764 C 545.711 510.810 545.275 510.535 544.677 509.937 C 543.551 508.811 542.426 507.685 541.300 506.560 C 540.656 505.916 539.117 504.653 536.682 502.769 C 534.223 500.908 532.316 499.299 530.961 497.944 C 526.917 493.900 525.435 489.707 526.515 485.364 C 526.790 484.261 527.146 483.492 527.583 483.055 C 528.180 482.458 528.881 482.561 529.685 483.365 C 529.915 483.595 530.168 483.917 530.443 484.330 C 532.603 487.455 534.729 490.293 536.819 492.843 C 538.910 495.439 540.565 497.369 541.782 498.633 C 543.000 499.897 544.103 501.045 545.091 502.079 C 546.079 503.159 546.745 504.009 547.090 504.630 C 547.435 505.296 547.584 506.020 547.538 506.801 M 537.026 534.131 C 543.620 527.537 550.214 520.942 556.809 514.349 C 557.268 513.889 557.774 513.659 558.325 513.659 C 558.854 513.682 559.267 513.958 559.566 514.487 C 561.473 517.864 563.380 521.241 565.287 524.619 C 565.540 525.148 565.620 525.711 565.528 526.308 C 565.414 526.928 565.195 527.399 564.874 527.721 C 564.575 528.020 564.322 528.066 564.115 527.859 C 563.426 527.170 562.565 526.538 561.531 525.963 C 560.474 525.412 559.635 525.148 559.015 525.171 C 550.571 533.614 542.127 542.057 533.683 550.502 C 533.224 550.962 532.833 551.168 532.511 551.122 C 532.190 551.122 531.822 550.824 531.409 550.226 C 530.558 548.985 529.708 547.744 528.858 546.504 C 528.376 545.746 528.065 545.114 527.928 544.609 C 527.813 544.126 527.801 543.747 527.893 543.471 C 527.962 543.219 528.019 542.931 528.065 542.610 C 528.134 542.311 528.043 541.851 527.790 541.231 C 527.537 540.611 527.066 539.818 526.377 538.853 C 525.182 537.107 523.666 535.315 521.827 533.477 C 520.058 531.707 517.347 529.502 513.694 526.859 C 510.064 524.240 507.329 522.011 505.491 520.173 C 504.342 519.024 503.527 517.703 503.044 516.210 C 502.539 514.739 502.148 512.993 501.872 510.971 C 501.803 510.443 501.792 510.087 501.838 509.903 C 501.861 509.742 501.999 509.420 502.252 508.938 C 502.505 508.501 502.757 508.064 503.010 507.628 C 503.308 507.146 503.550 506.904 503.733 506.904 C 503.871 506.904 504.113 507.077 504.457 507.421 C 506.066 509.030 509.351 512.338 514.314 517.347 C 519.277 522.402 524.975 528.146 531.409 534.579 C 532.305 535.476 533.178 535.912 534.028 535.889 C 534.855 535.889 535.854 535.303 537.026 534.131 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 556.486 137.794 C 556.463 137.817 556.383 137.874 556.245 137.966 C 556.107 138.058 555.912 138.207 555.659 138.414 C 555.429 138.598 555.188 138.816 554.935 139.069 C 553.672 140.332 552.982 141.435 552.867 142.377 C 554.234 144.342 555.601 146.307 556.969 148.271 C 559.565 151.924 559.370 155.244 556.383 158.231 C 554.797 159.816 552.201 161.540 548.594 163.401 C 545.010 165.285 542.000 166.548 539.564 167.192 C 536.669 167.835 534.130 167.663 531.947 166.675 C 531.672 166.537 531.430 166.365 531.224 166.158 C 530.856 165.790 530.615 165.388 530.500 164.952 C 530.385 164.515 530.431 164.193 530.638 163.987 C 530.707 163.918 530.776 163.872 530.845 163.849 C 539.047 161.573 544.263 159.322 546.491 157.094 C 548.582 155.003 548.582 152.429 546.491 149.374 C 544.952 147.145 543.412 144.916 541.873 142.688 C 541.575 142.297 541.414 141.883 541.391 141.447 C 541.391 140.987 541.529 140.620 541.804 140.344 C 541.988 140.160 542.206 140.034 542.459 139.965 C 546.123 138.667 549.788 137.369 553.453 136.070 C 554.487 135.772 555.406 136.024 556.210 136.829 C 556.624 137.242 556.716 137.564 556.486 137.794 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 378.662 80.058 C 375.827 77.371 372.420 76.028 368.440 76.028 C 364.460 76.028 361.028 77.396 358.143 80.132 C 358.143 80.108 358.143 80.083 358.143 80.058 C 357.969 80.257 357.795 80.456 357.621 80.655 C 357.596 80.655 357.571 80.655 357.546 80.655 C 357.521 80.705 357.496 80.754 357.471 80.804 C 356.924 81.401 356.974 81.973 357.621 82.520 C 358.491 83.291 359.361 84.062 360.232 84.833 C 360.779 85.331 361.327 85.306 361.874 84.759 C 361.898 84.784 361.923 84.809 361.948 84.833 C 363.689 82.943 365.853 81.998 368.440 81.998 C 370.728 81.998 372.743 82.818 374.484 84.460 C 376.971 86.848 378.215 89.733 378.215 93.116 C 378.215 96.249 377.145 98.936 375.006 101.174 C 371.922 104.408 368.142 106.024 363.665 106.024 C 359.536 106.024 355.979 104.606 352.994 101.771 C 352.969 101.796 352.945 101.821 352.920 101.846 C 349.637 98.712 348.045 95.180 348.144 91.250 C 348.642 88.017 349.786 84.709 351.577 81.326 C 355.855 73.268 362.968 65.706 372.917 58.643 C 373.464 58.245 373.738 57.996 373.738 57.897 C 373.737 57.872 373.737 57.847 373.738 57.822 C 373.788 57.673 373.812 57.300 373.812 56.703 C 373.812 55.659 373.812 54.614 373.812 53.569 C 373.812 52.823 373.439 52.450 372.693 52.450 C 364.187 52.450 355.680 52.450 347.174 52.450 C 346.826 52.450 346.453 52.425 346.055 52.375 C 344.637 52.376 343.220 52.376 341.802 52.375 C 341.056 52.375 340.683 52.748 340.683 53.494 C 340.683 56.803 340.683 60.111 340.683 63.418 C 340.683 64.115 340.907 64.189 341.354 63.642 C 342.697 61.976 344.040 60.310 345.384 58.643 C 345.831 58.096 346.428 57.822 347.174 57.822 C 352.497 57.822 357.819 57.823 363.142 57.822 C 363.888 57.822 363.988 58.071 363.441 58.568 C 350.806 70.358 343.717 81.127 342.175 90.877 C 342.175 91.002 342.175 91.126 342.175 91.250 C 342.175 97.667 344.861 103.089 350.234 107.517 C 350.258 107.492 350.283 107.467 350.308 107.442 C 354.238 110.526 358.690 112.068 363.665 112.068 C 369.883 112.068 375.106 109.830 379.334 105.353 C 382.617 101.920 384.259 97.841 384.259 93.116 C 384.259 87.942 382.393 83.590 378.662 80.058 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 609.499 343.456 C 607.634 340.272 605.768 337.089 603.903 333.905 C 603.754 333.657 603.679 333.333 603.679 332.935 C 603.679 332.537 603.754 332.214 603.903 331.965 C 605.768 328.781 607.634 325.598 609.499 322.414 C 609.847 321.768 610.370 321.594 611.066 321.892 C 619.473 325.473 627.879 329.055 636.286 332.637 C 636.983 332.935 636.983 333.234 636.286 333.532 C 627.879 337.039 619.473 340.546 611.066 344.053 C 610.419 344.302 609.897 344.103 609.499 343.456 M 584.577 347.112 C 584.577 353.977 584.577 360.841 584.577 367.707 C 584.577 368.453 584.776 368.502 585.174 367.856 C 586.716 365.343 588.258 362.831 589.800 360.320 C 590.149 359.723 590.696 359.275 591.442 358.977 C 596.541 356.762 601.639 354.549 606.738 352.336 C 607.435 352.037 607.982 352.236 608.380 352.933 C 609.399 354.723 610.419 356.514 611.439 358.305 C 611.837 358.952 612.359 359.126 613.006 358.827 C 613.901 358.404 614.797 357.981 615.692 357.559 C 616.389 357.211 616.563 356.713 616.215 356.066 C 615.244 354.300 614.274 352.534 613.305 350.769 C 612.956 350.122 613.106 349.649 613.752 349.351 C 621.636 345.968 629.521 342.585 637.406 339.203 C 638.102 338.905 638.699 339.004 639.197 339.502 C 640.614 340.844 642.031 342.187 643.450 343.531 C 643.997 344.028 644.270 343.929 644.270 343.232 C 644.270 336.367 644.270 329.503 644.270 322.638 C 644.270 322.191 644.171 321.967 643.972 321.967 C 643.823 321.967 643.649 322.066 643.450 322.265 C 642.031 323.683 640.614 325.100 639.197 326.518 C 638.649 327.065 638.052 327.190 637.406 326.891 C 629.521 323.508 621.636 320.126 613.752 316.744 C 613.056 316.445 612.882 315.972 613.230 315.326 C 614.249 313.435 615.269 311.545 616.289 309.655 C 616.638 309.008 616.488 308.536 615.842 308.237 C 614.946 307.814 614.050 307.392 613.155 306.969 C 612.509 306.670 611.986 306.844 611.588 307.491 C 610.494 309.406 609.399 311.321 608.305 313.237 C 607.957 313.883 607.435 314.057 606.738 313.759 C 601.639 311.595 596.541 309.431 591.442 307.267 C 590.746 306.969 590.198 306.496 589.800 305.850 C 588.258 303.362 586.716 300.875 585.174 298.388 C 584.776 297.741 584.577 297.791 584.577 298.537 C 584.577 305.402 584.577 312.266 584.577 319.131 C 584.577 319.877 584.801 319.977 585.249 319.430 C 586.741 317.589 588.233 315.749 589.726 313.908 C 590.223 313.311 590.795 313.162 591.442 313.460 C 595.521 315.226 599.600 316.992 603.679 318.758 C 604.326 319.057 604.500 319.529 604.201 320.176 C 602.286 324.056 600.371 327.936 598.456 331.816 C 598.158 332.463 598.158 333.109 598.456 333.756 C 600.371 337.760 602.286 341.765 604.201 345.769 C 604.500 346.416 604.326 346.889 603.679 347.187 C 599.600 348.953 595.521 350.718 591.442 352.485 C 590.795 352.783 590.223 352.634 589.726 352.037 C 588.258 350.320 586.791 348.604 585.323 346.889 C 584.826 346.292 584.577 346.366 584.577 347.112 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 327.903 556.865 C 330.639 556.741 333.375 556.616 336.110 556.492 C 336.807 556.442 337.379 556.716 337.827 557.313 C 340.563 560.845 341.930 563.904 341.931 566.491 C 341.931 568.480 341.309 571.042 340.065 574.176 C 339.219 576.315 338.797 578.330 338.797 580.220 C 338.797 582.906 339.393 585.145 340.587 586.936 C 340.613 586.910 340.638 586.886 340.662 586.861 C 342.454 589.746 344.965 591.835 348.198 593.129 C 343.821 596.661 341.632 600.690 341.632 605.217 C 341.632 608.251 342.403 611.012 343.945 613.499 C 346.731 617.976 351.556 620.488 358.421 621.035 C 358.421 621.084 358.421 621.134 358.421 621.185 C 367.226 621.184 376.030 621.184 384.835 621.185 C 385.581 621.185 385.656 620.986 385.059 620.588 C 382.845 619.120 380.632 617.652 378.418 616.185 C 377.821 615.787 377.523 615.215 377.523 614.469 C 377.523 598.899 377.523 583.329 377.523 567.759 C 377.523 566.963 377.821 566.366 378.418 565.968 C 380.582 564.526 382.746 563.083 384.910 561.641 C 385.606 561.193 385.556 560.969 384.760 560.969 C 380.706 560.969 376.652 560.969 372.598 560.969 C 372.250 560.969 371.877 560.994 371.479 561.044 C 369.166 561.044 366.853 561.044 364.539 561.044 C 363.743 561.044 363.669 561.268 364.315 561.715 C 366.703 563.357 369.091 564.998 371.479 566.640 C 371.479 582.583 371.479 598.526 371.479 614.469 C 371.479 615.215 371.106 615.588 370.359 615.588 C 366.529 615.588 362.699 615.588 358.868 615.588 C 355.735 615.588 353.073 614.668 350.885 612.828 C 348.696 610.987 347.601 608.525 347.601 605.440 C 347.601 603.749 348.049 602.108 348.944 600.516 C 349.840 598.924 351.009 597.755 352.451 597.009 C 354.690 595.865 357.923 595.293 362.152 595.293 C 362.997 595.292 363.843 595.292 364.689 595.293 C 365.236 595.143 365.509 594.770 365.509 594.173 C 365.510 593.128 365.510 592.084 365.509 591.039 C 365.509 590.492 365.236 590.144 364.689 589.995 C 364.689 589.970 364.689 589.945 364.689 589.920 C 364.092 589.920 363.495 589.920 362.898 589.920 C 358.421 589.920 355.187 589.672 353.198 589.174 C 349.815 588.328 347.303 586.488 345.661 583.652 C 345.114 582.707 344.841 581.638 344.841 580.444 C 344.841 579.300 345.139 577.982 345.736 576.489 C 347.278 572.709 348.049 569.326 348.049 566.341 C 348.049 562.561 346.283 558.382 342.751 553.806 C 342.552 553.458 342.154 552.910 341.557 552.164 C 340.936 551.393 340.314 550.622 339.692 549.851 C 339.244 549.254 338.722 549.155 338.125 549.553 C 334.643 551.791 331.161 554.030 327.679 556.268 C 327.430 556.467 327.331 556.616 327.380 556.716 C 327.430 556.815 327.604 556.865 327.903 556.865 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 104.708 338.784 C 103.961 338.037 103.588 337.117 103.588 336.023 C 103.588 334.978 103.961 334.083 104.708 333.337 C 105.454 332.590 106.349 332.217 107.394 332.217 C 108.438 332.217 109.334 332.590 110.080 333.337 C 110.826 334.083 111.199 334.978 111.199 336.023 C 111.199 337.117 110.851 338.037 110.155 338.784 C 109.408 339.530 108.488 339.903 107.394 339.903 C 106.299 339.903 105.404 339.530 104.708 338.784 M 125.003 353.483 C 129.679 348.658 132.017 342.813 132.017 335.948 C 132.017 328.984 129.679 323.114 125.003 318.339 C 120.278 313.563 114.433 311.176 107.468 311.176 C 100.504 311.176 94.659 313.563 89.933 318.339 C 85.158 323.114 82.770 328.984 82.770 335.948 C 82.770 342.962 85.183 348.832 90.008 353.558 C 94.784 358.283 100.678 360.646 107.692 360.646 C 114.507 360.646 120.278 358.259 125.003 353.483 M 86.203 357.662 C 80.432 351.792 77.547 344.554 77.547 335.948 C 77.547 327.392 80.407 320.154 86.128 314.235 C 91.799 308.315 98.888 305.355 107.394 305.355 C 115.850 305.355 122.939 308.340 128.659 314.309 C 134.380 320.229 137.240 327.442 137.240 335.948 C 137.240 344.305 134.405 351.468 128.734 357.438 C 123.013 363.407 116.000 366.392 107.692 366.392 C 99.136 366.392 91.973 363.482 86.203 357.662 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":258.302,\\\"max\\\":461.698},\\\"y\\\":{\\\"min\\\":234.008,\\\"max\\\":437.404}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":703.903,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":30.737,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":55.61,\\\"y\\\":336.574,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869474118611,\\\"y\\\":0.005109305814651418}},{\\\"point\\\":{\\\"x\\\":664.39,\\\"y\\\":336.574,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869474118611,\\\"y\\\":0.0051093058146513895}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":575.858,\\\"y\\\":552.603,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.712910589457642,\\\"y\\\":0.7012549404026737}},{\\\"point\\\":{\\\"x\\\":143.964,\\\"y\\\":552.647,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986749143718433,\\\"y\\\":0.7154392804616596}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":576.009,\\\"y\\\":120.645,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314277146298277,\\\"y\\\":-0.775434743351981}},{\\\"point\\\":{\\\"x\\\":144.725,\\\"y\\\":120.718,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817207438398672,\\\"y\\\":-0.7316124844604677}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":639.785,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"1241C0CD-E909-4A7C-8BA7-10D96A7D56BF_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"87.66%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"1241C0CD-E909-4A7C-8BA7-10D96A7D56BF_1\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"86.47%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\"]}},{\\\"name\\\":\\\"willendorf\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":165.09062467683822,\\\"max\\\":552.7442374791668},\\\"y\\\":{\\\"min\\\":12.473142486910888,\\\"max\\\":663.6677602138432}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"willendorf\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"willendorf\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#4F1E7D32-6869-4BC4-8C11-117BF4D80C14_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 215.609 296.629 C 215.608 296.630 206.529 304.586 201.237 304.271 C 164.047 302.056 198.776 198.841 220.819 155.257 C 235.725 125.786 286.229 144.434 309.575 124.969 C 312.117 122.850 311.005 118.551 309.535 116.268 C 298.776 99.572 288.031 86.771 291.478 64.883 C 295.906 36.765 320.446 15.135 357.214 14.488 C 394.199 13.836 419.476 34.715 424.765 62.927 C 429.018 85.618 422.011 101.518 408.680 117.344 C 407.079 119.244 404.636 122.719 406.594 125.027 C 425.430 147.222 476.596 127.163 491.178 155.231 C 512.939 197.118 536.002 289.000 525.468 295.040 C 520.519 297.878 509.688 297.966 509.688 297.966 C 519.752 308.834 549.944 341.440 550.731 386.283 C 551.598 435.657 509.615 448.676 501.683 469.775 C 496.542 483.452 499.922 505.812 492.542 523.839 C 484.554 543.352 455.425 575.694 454.213 580.233 C 448.125 603.031 431.288 608.503 432.072 634.274 C 432.336 642.967 426.653 655.433 422.873 657.450 C 417.427 660.357 407.305 659.896 403.071 660.526 C 400.227 660.950 393.068 658.505 391.582 657.242 C 388.386 654.526 375.099 631.076 373.329 626.251 C 363.856 600.424 362.206 574.584 360.133 546.882 C 359.563 539.268 360.316 528.882 361.189 520.104 C 360.658 518.500 360.695 516.991 360.708 515.554 C 360.708 515.554 360.708 515.554 361.189 520.104 C 360.772 508.270 360.271 502.770 358.102 501.451 C 355.903 500.114 350.437 499.908 347.475 498.420 C 334.424 491.865 309.735 471.665 310.497 466.759 C 311.493 460.345 351.953 474.423 360.223 474.389 C 368.093 474.358 406.421 460.735 407.491 466.816 C 408.350 471.699 382.782 490.626 370.423 498.426 C 368.525 499.625 365.132 500.659 363.708 501.726 C 361.776 503.173 361.331 508.669 360.708 515.554 C 360.866 517.045 361.032 518.599 361.189 520.104 C 362.077 528.562 363.008 538.028 363.233 545.077 C 364.108 572.517 368.145 597.675 365.101 624.754 C 364.639 628.859 360.088 650.078 358.105 652.804 C 355.988 655.714 343.170 662.236 337.900 661.628 C 333.871 661.162 324.407 660.802 319.253 658.032 C 316.458 656.530 311.342 647.730 311.450 641.287 C 311.907 614.133 296.983 606.161 285.383 583.198 C 283.407 579.286 245.040 562.823 232.745 547.464 C 215.048 525.356 214.929 492.135 206.252 472.282 C 197.702 452.720 165.179 433.581 167.179 389.663 C 169.804 332.046 201.524 336.034 213.714 305.530 C 214.904 303.600 215.239 299.525 215.609 296.629 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 351.571 232.489 C 350.945 291.811 360.638 325.716 341.581 352.982 C 324.507 377.411 299.868 386.353 271.034 378.579 C 240.874 370.446 223.979 349.060 221.089 318.020 C 219.495 300.898 233.159 291.799 239.194 278.689 M 357.941 232.339 C 370.260 295.447 362.220 380.550 449.986 382.433 C 478.389 383.042 502.990 332.833 494.030 292.544 C 475.950 283.109 457.227 264.761 440.918 259.397 C 427.223 254.893 408.722 248.055 394.309 247.689 C 387.153 247.508 371.242 254.520 370.782 251.658 C 370.276 248.512 387.272 246.645 387.869 243.665 C 388.448 240.773 367.989 247.946 367.127 245.200 C 366.054 241.783 383.185 241.221 384.744 235.661 C 378.875 234.336 368.283 237.759 367.507 236.551 C 365.613 233.604 379.585 229.842 384.289 228.872 C 402.932 225.028 422.373 231.696 441.563 234.718 C 449.295 235.935 460.465 240.602 469.054 244.661 C 471.282 245.646 473.367 246.657 475.154 247.543 C 479.030 249.464 481.506 250.794 481.507 250.795 C 481.506 250.791 476.763 236.534 472.941 221.945 M 494.030 292.544 C 499.259 295.325 502.438 297.524 509.688 297.966 C 517.657 298.452 520.519 297.878 525.468 295.040 C 536.002 289.000 512.939 197.118 491.178 155.231 C 476.596 127.163 425.430 147.222 406.594 125.027 C 404.636 122.719 407.079 119.244 408.680 117.344 C 422.011 101.518 429.018 85.618 424.765 62.927 C 419.476 34.715 394.199 13.836 357.214 14.488 C 320.446 15.135 295.906 36.765 291.478 64.883 C 288.031 86.771 298.776 99.572 309.535 116.268 C 311.005 118.551 312.117 122.850 309.575 124.969 C 286.229 144.434 235.725 125.786 220.819 155.257 C 198.776 198.841 164.047 302.056 201.237 304.271 C 206.529 304.586 215.608 296.630 215.609 296.629 C 215.615 296.624 267.401 250.568 272.691 252.239 C 284.530 255.979 301.643 248.252 313.989 249.562 C 321.046 250.311 336.140 258.388 336.858 255.605 C 337.642 252.572 321.240 249.104 320.917 246.135 C 320.598 243.217 340.162 252.124 341.336 249.512 C 342.436 247.068 331.589 243.010 330.911 238.744 C 335.889 238.213 344.282 240.730 345.215 239.983 C 348.991 236.961 327.979 232.016 321.473 230.728 C 305.759 227.618 289.179 229.510 273.047 232.155 C 268.390 232.918 262.792 235.619 257.038 238.009 C 246.757 242.599 236.228 247.197 233.007 248.894 C 231.811 249.524 238.548 231.130 241.319 222.248 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":310.141,\\\"max\\\":409.859},\\\"y\\\":{\\\"min\\\":26.979,\\\"max\\\":126.697}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":368.359,\\\"y\\\":701.625,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":17.691,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":211.902,\\\"y\\\":299.162,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871545278943,\\\"y\\\":0.005068607225371273}},{\\\"point\\\":{\\\"x\\\":509.144,\\\"y\\\":299.162,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871545278943,\\\"y\\\":0.005068607225371273}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":516.129,\\\"y\\\":446.583,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128878822340616,\\\"y\\\":0.7012780242983767}},{\\\"point\\\":{\\\"x\\\":192.423,\\\"y\\\":446.616,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698750931414721,\\\"y\\\":0.7153650367798666}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":486.135,\\\"y\\\":146.578,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314390702479099,\\\"y\\\":-0.7754254964627196}},{\\\"point\\\":{\\\"x\\\":230.513,\\\"y\\\":146.622,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6816797197040873,\\\"y\\\":-0.7316507088386897}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":367.314,\\\"y\\\":601.832,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"4F1E7D32-6869-4BC4-8C11-117BF4D80C14_0\\\",\\\"cx\\\":\\\"49.71%\\\",\\\"cy\\\":\\\"49.99%\\\",\\\"r\\\":\\\"120.54%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"25.49%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"wind\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":156.64822393686316,\\\"max\\\":553.2045129094946},\\\"y\\\":{\\\"min\\\":25.96870002188763,\\\"max\\\":691.074}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wind\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wind\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 438.462 283.668 C 467.629 240.208 463.902 208.350 425.028 162.015 C 439.941 156.785 456.304 143.679 462.385 125.813 C 470.724 101.308 464.071 70.174 448.075 51.807 C 425.575 25.972 385.595 23.993 363.398 32.450 C 316.049 50.490 310.221 86.132 308.925 106.676 C 306.645 142.805 325.362 162.454 336.659 175.715 C 368.905 213.565 393.481 234.501 390.321 265.974 C 384.144 327.490 407.733 355.519 407.735 355.528 C 407.738 355.521 405.705 332.479 438.462 283.668 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 438.462 283.668 C 467.629 240.208 463.902 208.350 425.028 162.015 C 439.941 156.785 456.304 143.679 462.385 125.813 C 470.724 101.308 464.071 70.174 448.075 51.807 C 425.575 25.972 385.595 23.993 363.398 32.450 C 316.049 50.490 310.221 86.132 308.925 106.676 C 306.645 142.805 325.362 162.454 336.659 175.715 C 368.905 213.565 393.481 234.501 390.321 265.974 C 384.144 327.490 407.733 355.519 407.735 355.528 C 407.738 355.521 405.705 332.479 438.462 283.668 M 348.756 97.068 C 334.760 142.300 373.956 179.925 425.028 162.015 M 424.886 86.782 C 409.292 54.694 358.535 65.466 348.756 97.068 M 402.594 129.352 C 425.101 129.519 433.373 104.248 424.886 86.782 M 387.206 101.437 C 377.024 110.538 382.325 129.201 402.594 129.352 M 398.234 107.904 C 403.030 102.667 394.121 95.257 387.206 101.437 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 463.495 333.462 C 480.593 303.624 485.353 283.304 488.496 255.320 C 502.100 255.489 519.202 249.714 529.389 237.055 C 543.362 219.693 547.163 192.548 539.641 172.973 C 529.061 145.439 497.305 132.047 476.856 132.342 C 433.237 132.970 418.012 160.081 410.904 176.316 C 398.405 204.867 407.155 226.516 412.976 240.339 C 426.190 271.719 431.718 287.993 432.112 309.649 C 432.840 349.600 419.787 387.215 419.786 387.223 C 419.791 387.217 439.031 376.156 463.495 333.462 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 463.495 333.462 C 480.593 303.624 485.353 283.304 488.496 255.320 C 502.100 255.489 519.202 249.714 529.389 237.055 C 543.362 219.693 547.163 192.548 539.641 172.973 C 529.061 145.439 497.305 132.047 476.856 132.342 C 433.237 132.970 418.012 160.081 410.904 176.316 C 398.405 204.867 407.155 226.516 412.976 240.339 C 426.190 271.719 431.718 287.993 432.112 309.649 C 432.840 349.600 419.787 387.215 419.786 387.223 C 419.791 387.217 439.031 376.156 463.495 333.462 M 445.956 180.292 C 421.294 212.750 441.902 254.744 488.496 255.320 M 510.568 194.425 C 507.418 163.871 463.186 157.614 445.956 180.292 M 479.983 222.283 C 498.138 229.056 512.282 211.056 510.568 194.425 M 475.769 195.166 C 464.848 199.524 463.632 216.184 479.983 222.283 M 482.781 203.649 C 488.205 200.828 483.184 192.206 475.769 195.166 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 291.326 305.005 C 267.804 273.307 259.152 251.075 251.508 219.670 C 236.043 221.839 215.733 217.749 202.294 204.817 C 183.862 187.079 175.590 156.725 181.310 133.345 C 189.356 100.459 223.565 80.598 246.890 77.962 C 296.644 72.339 317.919 100.993 328.370 118.445 C 346.750 149.136 339.933 175.056 335.314 191.640 C 324.829 229.288 321.222 248.587 323.597 273.334 C 327.918 318.353 346.247 359.294 346.249 359.303 C 346.243 359.297 324.012 349.051 291.326 305.005 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 291.326 305.005 C 267.804 273.307 259.152 251.075 251.508 219.670 C 236.043 221.839 215.733 217.749 202.294 204.817 C 183.862 187.079 175.590 156.725 181.310 133.345 C 189.356 100.459 223.565 80.598 246.890 77.962 C 296.644 72.339 317.919 100.993 328.370 118.445 C 346.750 149.136 339.933 175.056 335.314 191.640 C 324.829 229.288 321.222 248.587 323.597 273.334 C 327.918 318.353 346.247 359.294 346.249 359.303 C 346.243 359.297 324.012 349.051 291.326 305.005 M 289.039 128.065 C 321.835 161.437 304.473 212.244 251.508 219.670 M 217.528 153.545 C 216.675 118.300 266.126 104.749 289.039 128.065 M 256.400 180.820 C 236.712 191.169 217.993 172.729 217.528 153.545 M 257.257 149.332 C 270.324 152.708 274.130 171.499 256.400 180.820 M 250.505 160.010 C 243.920 157.585 248.384 147.039 257.257 149.332 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 327.812 420.135 C 327.808 420.128 291.703 355.507 257.416 342.141 C 244.855 350.536 225.441 355.517 208.293 349.905 C 184.774 342.207 164.797 319.244 159.944 296.471 C 153.118 264.437 174.564 232.741 193.775 220.632 C 234.754 194.801 265.169 211.084 281.789 221.621 C 314.736 242.510 327.483 277.763 332.809 298.750 C 349.991 366.448 327.813 420.127 327.812 420.135 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 327.812 420.135 C 327.808 420.128 291.703 355.507 257.416 342.141 C 244.855 350.536 225.441 355.517 208.293 349.905 C 184.774 342.207 164.797 319.244 159.944 296.471 C 153.118 264.437 174.564 232.741 193.775 220.632 C 234.754 194.801 265.169 211.084 281.789 221.621 C 314.736 242.510 327.483 277.763 332.809 298.750 C 349.991 366.448 327.813 420.127 327.812 420.135 M 251.572 246.548 C 294.183 261.823 300.433 313.388 257.416 342.141 M 199.994 298.830 C 184.423 268.485 221.802 235.875 251.572 246.548 M 245.333 306.237 C 232.536 323.537 208.470 315.347 199.994 298.830 M 232.832 278.446 C 245.636 275.889 256.857 290.658 245.333 306.237 M 231.443 290.589 C 224.685 291.248 224.138 280.182 232.832 278.446 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 412.257 485.621 C 440.865 423.915 424.892 345.062 397.202 291.888 C 411.939 281.221 425.692 261.387 426.534 239.677 C 427.690 209.899 410.126 177.731 386.445 162.717 C 353.135 141.598 308.371 152.542 286.656 169.162 C 240.334 204.615 245.853 245.800 250.922 268.950 C 262.896 323.631 303.882 333.106 322.628 367.994 C 354.861 427.984 338.756 454.515 327.236 505.161 C 303.589 609.115 361.814 638.590 361.817 638.603 C 361.822 638.588 362.465 593.020 412.257 485.621 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 377.883 459.915 C 422.062 396.452 344.514 307.761 344.510 307.746 M 361.834 638.423 C 361.836 638.405 308.543 559.519 377.883 459.915 M 412.257 485.621 C 440.865 423.915 424.892 345.062 397.202 291.888 C 411.939 281.221 425.692 261.387 426.534 239.677 C 427.690 209.899 410.126 177.731 386.445 162.717 C 353.135 141.598 308.371 152.542 286.656 169.162 C 240.334 204.615 245.853 245.800 250.922 268.950 C 262.896 323.631 303.882 333.106 322.628 367.994 C 354.861 427.984 338.756 454.515 327.236 505.161 C 303.589 609.115 361.814 638.590 361.817 638.603 C 361.822 638.588 362.465 593.020 412.257 485.621 M 291.718 245.269 C 291.125 299.774 346.729 328.419 397.202 291.888 M 372.342 208.924 C 344.600 178.638 292.132 207.189 291.718 245.269 M 361.723 263.214 C 386.612 256.009 387.442 225.409 372.342 208.924 M 335.578 237.465 C 327.331 250.851 339.309 269.703 361.723 263.214 M 349.870 240.980 C 353.443 233.626 341.178 228.375 335.578 237.465 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 296.010 579.309 C 281.336 564.377 256.685 522.366 263.884 471.567 C 249.925 468.273 233.903 458.008 226.708 442.463 C 216.838 421.143 219.867 392.406 232.549 374.300 C 250.388 348.831 286.304 343.147 307.126 348.735 C 345.535 359.042 356.370 390.118 360.499 407.356 C 367.491 436.552 349.278 460.860 341.768 479.994 C 327.047 517.498 324.212 542.851 332.166 580.966 C 337.246 605.305 361.827 638.921 361.830 638.927 C 361.824 638.921 329.843 613.741 296.010 579.309 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.173 530.757 C 296.581 491.523 304.413 468.553 304.413 468.547 M 361.543 638.627 C 361.537 638.616 308.965 597.333 301.173 530.757 M 296.010 579.309 C 281.336 564.377 256.685 522.366 263.884 471.567 C 249.925 468.273 233.903 458.008 226.708 442.463 C 216.838 421.143 219.867 392.406 232.549 374.300 C 250.388 348.831 286.304 343.147 307.126 348.735 C 345.535 359.042 356.370 390.118 360.499 407.356 C 367.491 436.552 349.278 460.860 341.768 479.994 C 327.047 517.498 324.212 542.851 332.166 580.966 C 337.246 605.305 361.827 638.921 361.830 638.927 C 361.824 638.921 329.843 613.741 296.010 579.309 M 326.517 405.657 C 343.474 445.145 311.693 482.850 263.884 471.567 M 256.822 403.651 C 267.830 373.199 314.670 378.069 326.517 405.657 M 281.011 439.942 C 260.713 442.245 250.831 420.226 256.822 403.651 M 292.231 413.276 C 302.291 420.517 299.291 437.869 281.011 439.942 M 282.895 420.167 C 278.065 415.899 285.399 408.358 292.231 413.276 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 459.711 478.472 C 480.818 441.524 482.778 414.823 484.469 380.020 C 498.433 382.313 516.919 379.039 529.368 367.609 C 546.443 351.932 554.581 324.609 549.896 303.308 C 543.306 273.345 512.737 254.626 491.663 251.742 C 446.709 245.591 426.828 271.098 416.989 286.686 C 399.687 314.099 405.409 337.701 409.144 352.847 C 418.065 389.023 421.984 407.793 417.566 431.080 C 406.242 490.763 381.024 512.774 368.276 539.848 C 347.042 584.945 361.765 638.651 361.765 638.661 C 361.768 638.652 366.290 589.896 397.683 548.735 C 414.163 527.127 438.967 514.784 459.711 478.472 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 387.823 538.383 C 397.290 523.106 436.732 490.975 448.272 433.383 C 456.351 393.062 451.947 365.139 451.948 365.132 M 361.342 638.241 C 361.345 638.231 359.753 583.677 387.823 538.383 M 459.711 478.472 C 480.818 441.524 482.778 414.823 484.469 380.020 C 498.433 382.313 516.919 379.039 529.368 367.609 C 546.443 351.932 554.581 324.609 549.896 303.308 C 543.306 273.345 512.737 254.626 491.663 251.742 C 446.709 245.591 426.828 271.098 416.989 286.686 C 399.687 314.099 405.409 337.701 409.144 352.847 C 418.065 389.023 421.984 407.793 417.566 431.080 C 406.242 490.763 381.024 512.774 368.276 539.848 C 347.042 584.945 361.765 638.651 361.765 638.661 C 361.768 638.652 366.290 589.896 397.683 548.735 C 414.163 527.127 438.967 514.784 459.711 478.472 M 452.415 296.236 C 421.996 325.772 436.645 372.167 484.469 380.020 M 516.656 320.838 C 518.178 288.927 473.667 275.601 452.415 296.236 M 480.863 344.721 C 498.478 354.515 515.828 338.207 516.656 320.838 M 480.755 316.177 C 468.846 318.958 464.999 335.900 480.863 344.721 M 486.645 325.994 C 492.662 323.937 488.841 314.289 480.755 316.177 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 353.439 575.967 C 355.297 545.566 363.244 528.511 375.265 506.659 C 362.868 500.270 350.299 486.246 347.955 469.756 C 345.099 449.660 355.256 426.722 370.391 415.074 C 391.680 398.690 422.721 403.346 438.478 413.278 C 472.090 434.462 471.063 462.762 468.885 478.755 C 465.055 506.882 447.980 519.560 436.896 527.544 C 411.735 545.669 399.716 555.698 389.134 572.346 C 369.612 603.058 361.912 638.493 361.909 638.500 C 361.908 638.493 350.704 620.699 353.439 575.967 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 372.584 562.003 C 384.755 529.078 404.247 513.004 404.250 513.000 M 361.770 637.200 C 361.771 637.193 356.371 605.864 372.584 562.003 M 353.439 575.967 C 355.297 545.566 363.244 528.511 375.265 506.659 C 362.868 500.270 350.299 486.246 347.955 469.756 C 345.099 449.660 355.256 426.722 370.391 415.074 C 391.680 398.690 422.721 403.346 438.478 413.278 C 472.090 434.462 471.063 462.762 468.885 478.755 C 465.055 506.882 447.980 519.560 436.896 527.544 C 411.735 545.669 399.716 555.698 389.134 572.346 C 369.612 603.058 361.912 638.493 361.909 638.500 C 361.908 638.493 350.704 620.699 353.439 575.967 M 439.749 465.215 C 444.236 501.166 412.077 525.630 375.265 506.659 M 382.814 445.545 C 399.760 423.287 436.537 439.475 439.749 465.215 M 393.372 481.715 C 376.044 478.365 373.590 457.660 382.814 445.545 M 409.515 462.633 C 415.937 471.202 408.977 484.731 393.372 481.715 M 400.038 465.900 C 397.160 461.133 405.154 456.813 409.515 462.633 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 373.016 638.790 C 376.037 621.276 377.491 610.870 375.457 596.459 C 381.338 593.537 386.735 587.061 388.884 579.518 C 392.468 566.936 390.304 551.422 382.409 541.978 C 371.304 528.694 351.123 527.286 339.821 531.333 C 315.712 539.965 312.636 557.936 311.538 568.281 C 309.476 587.722 316.794 596.322 324.363 606.359 C 335.976 621.760 342.943 628.443 347.669 639.767 C 357.646 663.675 360.402 689.069 360.403 689.074 C 360.404 689.069 366.758 675.071 373.016 638.790 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 361.913 634.464 C 360.801 612.924 352.389 599.906 352.388 599.903 M 360.672 688.276 C 360.672 688.271 363.363 662.565 361.913 634.464 M 373.016 638.790 C 376.037 621.276 377.491 610.870 375.457 596.459 C 381.338 593.537 386.735 587.061 388.884 579.518 C 392.468 566.936 390.304 551.422 382.409 541.978 C 371.304 528.694 351.123 527.286 339.821 531.333 C 315.712 539.965 312.636 557.936 311.538 568.281 C 309.476 587.722 316.794 596.322 324.363 606.359 C 335.976 621.760 342.943 628.443 347.669 639.767 C 357.646 663.675 360.402 689.069 360.403 689.074 C 360.404 689.069 366.758 675.071 373.016 638.790 M 331.763 563.834 C 324.054 588.427 349.073 609.567 375.457 596.459 M 370.335 559.414 C 362.783 543.041 336.764 547.881 331.763 563.834 M 358.637 580.696 C 370.007 581.010 374.445 568.326 370.335 559.414 M 351.146 566.434 C 345.909 570.929 348.397 580.413 358.637 580.696 M 356.653 569.814 C 359.130 567.216 354.703 563.381 351.146 566.434 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":361.052,\\\"y\\\":734.213,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":384.192,\\\"y\\\":29.171,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":171.711,\\\"y\\\":302.768,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999874560013274,\\\"y\\\":0.00500877629700349}},{\\\"point\\\":{\\\"x\\\":548.289,\\\"y\\\":302.768,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999874560013274,\\\"y\\\":0.005008776297003481}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":408.21,\\\"y\\\":548.564,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128965506064706,\\\"y\\\":0.7012692123096492}},{\\\"point\\\":{\\\"x\\\":275.057,\\\"y\\\":548.612,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986883991125029,\\\"y\\\":0.7154261114507967}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":201.216,\\\"y\\\":99.186,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.5366054888277688,\\\"y\\\":-0.8438332473657999}},{\\\"point\\\":{\\\"x\\\":533.833,\\\"y\\\":160.932,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7625015279734099,\\\"y\\\":-0.6469864139518042}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":361.052,\\\"y\\\":663.933,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]}},{\\\"name\\\":\\\"window\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":49.024,\\\"max\\\":670.976},\\\"y\\\":{\\\"min\\\":3.5490000000000004,\\\"max\\\":666.389}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"window\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"window\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 177.491 622.720 C 177.491 622.675 177.491 173.832 177.491 173.788 C 177.509 173.773 216.927 24.508 360.000 24.508 C 503.073 24.508 542.491 173.773 542.509 173.788 C 542.509 173.832 542.509 622.675 542.509 622.720 C 542.473 622.720 177.527 622.720 177.491 622.720 M 223.851 573.110 C 223.851 573.072 223.851 187.607 223.851 187.569 C 223.865 187.557 252.460 74.111 360.000 74.111 C 467.540 74.111 496.135 187.557 496.149 187.569 C 496.149 187.607 496.149 573.072 496.149 573.110 C 496.122 573.110 223.878 573.110 223.851 573.110 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#90B46009-44E3-4EEF-96C4-F1D10A4BCB90_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 496.792 187.581 C 496.792 187.619 496.792 573.084 496.792 573.122 C 496.805 573.132 632.927 663.879 632.941 663.889 C 632.941 663.823 632.941 6.115 632.941 6.049 C 632.934 6.053 591.967 24.331 564.866 51.432 C 496.792 119.506 496.798 187.567 496.792 187.581 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 632.941 6.049 C 632.941 6.115 632.941 663.823 632.941 663.889 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 668.476 12.695 C 668.473 12.694 644.786 8.264 632.941 6.049 C 632.941 6.115 632.941 663.823 632.941 663.889 C 644.786 661.673 668.473 657.243 668.476 657.243 C 668.476 657.178 668.476 12.759 668.476 12.695 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#90B46009-44E3-4EEF-96C4-F1D10A4BCB90_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 223.208 187.581 C 223.208 187.619 223.208 573.084 223.208 573.122 C 223.195 573.132 87.073 663.879 87.059 663.889 C 87.059 663.823 87.059 6.115 87.059 6.049 C 87.066 6.053 128.033 24.331 155.134 51.432 C 223.208 119.506 223.202 187.567 223.208 187.581 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 87.059 6.049 C 87.059 6.115 87.059 663.823 87.059 663.889 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"5\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 51.524 12.695 C 51.527 12.694 75.214 8.264 87.059 6.049 C 87.059 6.115 87.059 663.823 87.059 663.889 C 75.214 661.673 51.527 657.243 51.524 657.243 C 51.524 657.178 51.524 12.759 51.524 12.695 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":128.929,\\\"max\\\":591.071},\\\"y\\\":{\\\"min\\\":119.754,\\\"max\\\":550.183}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":703.666,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":28.541,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":51.845,\\\"y\\\":335.899,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999875225915545,\\\"y\\\":0.004995464063051106}},{\\\"point\\\":{\\\"x\\\":668.238,\\\"y\\\":335.899,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999875207307476,\\\"y\\\":0.00499583654380491}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":631.503,\\\"y\\\":660.938,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.71290868065275,\\\"y\\\":0.7012568809287759}},{\\\"point\\\":{\\\"x\\\":85.691,\\\"y\\\":661.013,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987247470663102,\\\"y\\\":0.7153906120694631}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":663.939,\\\"y\\\":14.832,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314455570586257,\\\"y\\\":-0.7754202141232338}},{\\\"point\\\":{\\\"x\\\":53.978,\\\"y\\\":14.91,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817255992302469,\\\"y\\\":-0.7316079601495332}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":619.624,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"90B46009-44E3-4EEF-96C4-F1D10A4BCB90_1\\\",\\\"cx\\\":\\\"-0.04%\\\",\\\"cy\\\":\\\"51.99%\\\",\\\"r\\\":\\\"181.73%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"31.37%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"90B46009-44E3-4EEF-96C4-F1D10A4BCB90_3\\\",\\\"cx\\\":\\\"100.04%\\\",\\\"cy\\\":\\\"52.79%\\\",\\\"r\\\":\\\"184.99%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"31.37%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"wing\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":38.45402314026018,\\\"max\\\":646.9647922185453},\\\"y\\\":{\\\"min\\\":40.42809554065902,\\\"max\\\":704.698428750644}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wingR_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 59.515 189.833 C 96.684 213.502 142.867 218.404 189.529 284.148 C 258.847 381.814 196.921 433.195 236.012 492.096 C 258.887 526.562 314.823 539.558 396.288 585.843 C 534.042 664.108 629.359 716.813 642.560 699.346 C 653.983 684.231 622.915 614.312 587.307 585.764 C 520.240 531.994 377.279 486.158 377.258 486.148 C 377.282 486.152 634.428 581.634 616.350 529.077 C 595.966 469.818 546.354 454.711 526.113 446.865 C 502.851 437.849 364.990 416.245 364.974 416.242 C 364.997 416.242 594.227 456.128 589.188 421.738 C 586.682 404.637 539.115 370.199 492.553 358.984 C 448.254 348.315 351.006 351.068 350.991 351.067 C 351.012 351.064 561.931 354.656 560.045 323.074 C 559.004 305.630 496.369 272.561 453.525 275.888 C 386.856 281.065 328.598 291.016 328.585 291.017 C 328.603 291.012 511.965 264.191 507.314 236.553 C 504.353 218.955 440.347 193.724 392.566 205.156 C 354.893 214.169 291.288 234.233 291.278 234.236 C 291.291 234.229 424.162 197.134 426.290 164.887 C 426.812 156.963 400.890 141.451 357.116 142.364 C 309.480 143.358 242.868 181.776 242.856 181.780 C 242.868 181.772 363.380 120.130 354.373 101.600 C 348.300 89.105 321.883 81.650 292.088 86.359 C 257.100 91.889 195.174 138.489 195.164 138.494 C 195.172 138.486 294.257 72.572 271.946 52.299 C 263.778 44.877 217.334 48.062 198.838 60.581 C 186.005 69.266 140.607 112.893 140.601 112.898 C 140.604 112.891 191.356 49.725 169.958 44.399 C 138.526 36.574 110.996 53.386 89.225 71.309 C 75.896 82.282 43.661 116.273 40.635 152.743 C 38.977 172.734 48.983 183.126 59.515 189.833 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":66.696,\\\"y\\\":155.101,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999918761041171,\\\"y\\\":0.012746423729420949}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":41.361,\\\"y\\\":155.101,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999918761041171,\\\"y\\\":0.01274642372942095}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"wing_angel\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":222.25395971538865,\\\"max\\\":488.97208874420335},\\\"y\\\":{\\\"min\\\":35.391468124075345,\\\"max\\\":685.8200392397181}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_angel\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_angel\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 473.928 683.593 C 429.620 672.034 450.971 390.718 442.789 276.628 C 442.782 276.663 446.874 644.598 428.100 637.391 C 383.635 620.322 411.211 334.581 404.783 259.680 C 404.777 259.713 401.678 595.748 385.189 587.439 C 345.101 567.239 371.297 297.310 366.936 236.183 C 366.907 243.098 359.614 516.509 345.635 508.569 C 304.696 485.315 331.335 336.190 334.844 215.095 C 331.334 251.964 320.900 444.035 311.264 432.164 C 272.355 384.230 295.790 279.455 299.300 195.214 C 299.299 195.229 282.986 351.332 279.553 347.849 C 237.141 304.826 265.925 217.215 270.606 173.922 C 270.603 173.932 250.840 273.438 246.197 270.786 C 225.079 258.728 216.400 185.994 232.819 126.625 C 242.708 90.868 286.161 49.854 333.196 40.183 C 377.681 31.038 423.985 44.294 462.524 80.956 C 499.687 116.310 483.792 196.653 482.483 272.750 C 476.666 610.994 493.315 688.650 473.928 683.593 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 462.939 172.059 C 471.155 171.209 463.330 111.047 463.330 111.040 M 432.756 91.116 C 438.983 126.186 433.858 175.070 462.939 172.059 M 428.247 157.121 C 438.234 159.985 432.755 91.123 432.756 91.116 M 400.408 75.477 C 405.310 96.601 393.683 147.209 428.247 157.121 M 388.126 141.674 C 402.604 146.005 400.309 76.008 400.408 75.477 M 365.727 67.627 C 371.224 83.021 358.340 132.761 388.126 141.674 M 352.590 131.421 C 371.910 139.300 364.420 76.481 365.727 67.627 M 332.837 67.185 C 334.115 85.974 321.253 118.642 352.590 131.421 M 318.591 122.058 C 327.876 124.804 332.835 67.190 332.837 67.185 M 302.453 68.696 C 302.455 68.701 285.290 112.209 318.591 122.058 M 457.421 283.697 C 471.456 284.108 467.171 251.774 459.909 173.532 M 423.891 155.989 C 430.116 178.505 423.462 282.702 457.421 283.697 M 410.749 263.454 C 439.820 270.094 423.446 165.287 423.891 155.989 M 389.501 141.241 C 392.752 165.105 386.266 257.861 410.749 263.454 M 378.848 243.640 C 394.001 247.484 389.261 143.540 389.501 141.241 M 357.189 131.982 C 360.901 164.441 347.530 235.694 378.848 243.640 M 340.541 217.828 C 358.944 225.520 357.187 131.991 357.189 131.982 M 323.190 122.619 C 324.384 152.225 311.920 205.866 340.541 217.828 M 305.434 199.545 C 317.809 207.427 323.188 122.627 323.190 122.619 M 296.720 106.686 C 296.438 134.257 278.290 182.257 305.434 199.545 M 272.980 175.272 C 285.912 185.785 296.717 106.693 296.720 106.686 M 269.405 96.562 C 264.075 114.333 247.551 154.600 272.980 175.272 M 482.483 272.750 C 476.666 610.994 493.315 688.650 473.928 683.593 C 429.620 672.034 450.971 390.718 442.789 276.628 C 442.782 276.663 446.874 644.598 428.100 637.391 C 383.635 620.322 411.211 334.581 404.783 259.680 C 404.777 259.713 401.678 595.748 385.189 587.439 C 345.101 567.239 371.297 297.310 366.936 236.183 C 366.907 243.098 359.614 516.509 345.635 508.569 C 304.696 485.315 331.335 336.190 334.844 215.095 C 331.334 251.964 320.900 444.035 311.264 432.164 C 272.355 384.230 295.790 279.455 299.300 195.214 C 299.299 195.229 282.986 351.332 279.553 347.849 C 237.141 304.826 265.925 217.215 270.606 173.922 C 270.603 173.932 250.840 273.438 246.197 270.786 C 225.079 258.728 216.400 185.994 232.819 126.625 C 242.708 90.868 286.161 49.854 333.196 40.183 C 377.681 31.038 423.985 44.294 462.524 80.956 C 499.687 116.310 483.792 196.653 482.483 272.750 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":237.306,\\\"y\\\":168.87,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":222.941,\\\"y\\\":168.87,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"],\\\"creature_frequency_multiplier\\\":5}},{\\\"name\\\":\\\"wing_angel2\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":52.851,\\\"max\\\":686.8749715983718},\\\"y\\\":{\\\"min\\\":136.41889658224153,\\\"max\\\":572.4097640366991}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_angel2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_angel2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.426 557.174 C 313.578 551.499 255.509 546.005 207.563 534.049 C 205.904 419.493 168.415 304.597 53.851 305.553 C 53.851 305.545 53.851 221.068 53.851 221.060 C 53.855 221.059 86.556 217.739 102.564 217.781 C 119.243 217.825 135.704 219.217 151.576 221.908 C 166.595 224.455 181.255 228.247 195.264 233.143 C 211.367 238.770 226.960 246.141 241.449 254.899 C 256.292 263.868 269.553 273.824 281.762 284.963 C 293.698 295.853 304.779 308.096 314.742 321.352 C 324.283 334.046 332.937 347.963 340.457 362.697 C 347.685 376.860 353.636 391.034 358.614 405.786 C 363.797 421.137 368.133 438.453 371.143 456.328 C 373.964 473.065 375.624 491.861 375.804 511.044 C 375.947 526.212 375.165 541.617 373.426 557.174 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 53.851 221.060 C 53.855 221.059 86.556 217.739 102.564 217.781 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 102.564 217.781 C 106.608 196.342 110.651 174.903 114.695 153.464 C 96.727 139.496 68.648 145.685 53.851 163.816 C 53.851 163.816 53.851 221.054 53.851 221.060 C 53.855 221.059 86.556 217.739 102.564 217.781 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 102.564 217.781 C 106.608 196.342 110.651 174.903 114.695 153.464 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 151.576 221.908 C 135.704 219.217 119.243 217.825 102.564 217.781 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S14\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 102.564 217.781 C 106.608 196.342 110.651 174.903 114.695 153.464 C 130.414 134.683 160.296 131.358 176.724 149.005 C 168.341 173.306 159.959 197.607 151.576 221.908 C 135.704 219.217 119.243 217.825 102.564 217.781 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 151.576 221.908 C 159.959 197.607 168.341 173.306 176.724 149.005 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 195.264 233.143 C 181.255 228.247 166.595 224.455 151.576 221.908 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 151.576 221.908 C 159.959 197.607 168.341 173.306 176.724 149.005 C 198.065 133.733 225.917 136.440 243.313 153.922 C 227.296 180.329 211.280 206.736 195.264 233.143 C 181.255 228.247 166.595 224.455 151.576 221.908 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 195.264 233.143 C 211.280 206.736 227.296 180.329 243.313 153.922 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 241.449 254.899 C 226.960 246.141 211.367 238.770 195.264 233.143 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S16\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 195.264 233.143 C 211.280 206.736 227.296 180.329 243.313 153.922 C 265.671 144.062 294.599 152.142 310.019 174.282 C 287.162 201.154 264.306 228.027 241.449 254.899 C 226.960 246.141 211.367 238.770 195.264 233.143 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 241.449 254.899 C 264.306 228.027 287.162 201.154 310.019 174.282 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 281.762 284.963 C 269.553 273.824 256.292 263.868 241.449 254.899 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_5)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 241.449 254.899 C 264.306 228.027 287.162 201.154 310.019 174.282 C 331.136 170.539 356.568 184.435 364.382 211.590 C 336.842 236.048 309.302 260.505 281.762 284.963 C 269.553 273.824 256.292 263.868 241.449 254.899 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 281.762 284.963 C 309.302 260.505 336.842 236.048 364.382 211.590 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.742 321.352 C 304.779 308.096 293.698 295.853 281.762 284.963 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_6)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 281.762 284.963 C 309.302 260.505 336.842 236.048 364.382 211.590 C 386.683 214.613 407.741 240.605 404.643 266.520 C 374.676 284.797 344.709 303.075 314.742 321.352 C 304.779 308.096 293.698 295.853 281.762 284.963 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.742 321.352 C 344.709 303.075 374.676 284.797 404.643 266.520 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 340.457 362.697 C 332.937 347.963 324.283 334.046 314.742 321.352 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_7)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.742 321.352 C 344.709 303.075 374.676 284.797 404.643 266.520 C 426.466 277.993 440.965 306.968 434.076 330.733 C 402.870 341.388 371.663 352.042 340.457 362.697 C 332.937 347.963 324.283 334.046 314.742 321.352 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 340.457 362.697 C 371.663 352.042 402.870 341.388 434.076 330.733 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 358.614 405.786 C 353.636 391.034 347.685 376.860 340.457 362.697 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_8)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 340.457 362.697 C 371.663 352.042 402.870 341.388 434.076 330.733 C 490.131 322.854 556.555 348.552 556.870 378.284 C 490.785 387.452 424.699 396.619 358.614 405.786 C 353.636 391.034 347.685 376.860 340.457 362.697 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 358.614 405.786 C 424.699 396.619 490.785 387.452 556.870 378.284 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.143 456.328 C 368.133 438.453 363.797 421.137 358.614 405.786 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_9)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 358.614 405.786 C 424.699 396.619 490.785 387.452 556.870 378.284 C 593.996 381.890 627.030 415.537 623.257 440.972 C 539.219 446.091 455.181 451.209 371.143 456.328 C 368.133 438.453 363.797 421.137 358.614 405.786 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.143 456.328 C 455.181 451.209 539.219 446.091 623.257 440.972 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 375.804 511.044 C 375.624 491.861 373.964 473.065 371.143 456.328 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_10)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 371.143 456.328 C 455.181 451.209 539.219 446.091 623.257 440.972 C 651.581 453.102 665.971 487.279 654.562 506.218 C 561.643 507.827 468.723 509.435 375.804 511.044 C 375.624 491.861 373.964 473.065 371.143 456.328 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 375.804 511.044 C 468.723 509.435 561.643 507.827 654.562 506.218 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 373.426 557.174 C 375.165 541.617 375.947 526.212 375.804 511.044 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S23\\\",\\\"fill\\\":\\\"url(#DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_11)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 375.804 511.044 C 468.723 509.435 561.643 507.827 654.562 506.218 C 678.628 514.585 704.926 569.367 666.149 570.995 C 622.837 572.814 495.261 568.729 373.426 557.174 C 375.165 541.617 375.947 526.212 375.804 511.044 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":54.28,\\\"y\\\":243.919,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":51.589,\\\"y\\\":243.919,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_0\\\",\\\"cx\\\":\\\"16.50%\\\",\\\"cy\\\":\\\"76.20%\\\",\\\"r\\\":\\\"135.16%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_1\\\",\\\"x1\\\":\\\"71.35%\\\",\\\"y1\\\":\\\"52.44%\\\",\\\"x2\\\":\\\"-26.13%\\\",\\\"y2\\\":\\\"51.06%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_2\\\",\\\"x1\\\":\\\"67.52%\\\",\\\"y1\\\":\\\"58.24%\\\",\\\"x2\\\":\\\"-9.42%\\\",\\\"y2\\\":\\\"43.84%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_3\\\",\\\"x1\\\":\\\"63.07%\\\",\\\"y1\\\":\\\"58.87%\\\",\\\"x2\\\":\\\"-2.05%\\\",\\\"y2\\\":\\\"42.57%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_4\\\",\\\"x1\\\":\\\"60.45%\\\",\\\"y1\\\":\\\"60.59%\\\",\\\"x2\\\":\\\"11.43%\\\",\\\"y2\\\":\\\"36.42%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_5\\\",\\\"x1\\\":\\\"58.13%\\\",\\\"y1\\\":\\\"61.16%\\\",\\\"x2\\\":\\\"17.00%\\\",\\\"y2\\\":\\\"30.56%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_6\\\",\\\"x1\\\":\\\"56.00%\\\",\\\"y1\\\":\\\"63.66%\\\",\\\"x2\\\":\\\"21.78%\\\",\\\"y2\\\":\\\"28.70%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_7\\\",\\\"x1\\\":\\\"62.04%\\\",\\\"y1\\\":\\\"68.70%\\\",\\\"x2\\\":\\\"33.18%\\\",\\\"y2\\\":\\\"17.01%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_8\\\",\\\"x1\\\":\\\"50.46%\\\",\\\"y1\\\":\\\"68.00%\\\",\\\"x2\\\":\\\"34.52%\\\",\\\"y2\\\":\\\"-11.08%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_9\\\",\\\"x1\\\":\\\"51.41%\\\",\\\"y1\\\":\\\"73.05%\\\",\\\"x2\\\":\\\"45.31%\\\",\\\"y2\\\":\\\"-4.64%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_10\\\",\\\"x1\\\":\\\"53.04%\\\",\\\"y1\\\":\\\"75.67%\\\",\\\"x2\\\":\\\"48.82%\\\",\\\"y2\\\":\\\"-9.41%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"linearGradient\\\",\\\"id\\\":\\\"DAA0A8AF-9A5E-4314-8D5C-00FB3C949837_11\\\",\\\"x1\\\":\\\"52.73%\\\",\\\"y1\\\":\\\"78.67%\\\",\\\"x2\\\":\\\"50.80%\\\",\\\"y2\\\":\\\"-19.72%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"],\\\"creature_frequency_multiplier\\\":10}},{\\\"name\\\":\\\"wing_bat\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":33.235141843935864,\\\"max\\\":707.255},\\\"y\\\":{\\\"min\\\":16.53723102029026,\\\"max\\\":699.624}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_bat_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"white\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"url(#31E63F49-6226-4B9E-BD66-62B08F221513_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 284.056 684.620 C 286.152 684.607 280.907 591.568 209.611 544.731 C 182.193 550.340 46.509 614.472 46.509 614.472 C 49.298 622.844 60.560 679.912 60.565 679.917 C 60.587 679.918 226.110 661.666 284.056 684.620 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S2\\\",\\\"fill\\\":\\\"url(#31E63F49-6226-4B9E-BD66-62B08F221513_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 236.266 524.323 C 273.931 594.978 283.847 640.623 290.829 680.868 C 344.951 627.867 400.689 587.442 542.632 599.817 C 496.928 551.289 397.339 485.618 285.139 458.463 C 257.914 472.167 233.014 510.842 236.266 524.323 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S3\\\",\\\"fill\\\":\\\"url(#31E63F49-6226-4B9E-BD66-62B08F221513_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 301.267 429.284 C 454.832 471.957 498.164 537.156 548.208 595.887 C 540.250 532.133 527.715 432.495 631.912 347.254 C 566.181 324.531 450.327 313.506 330.686 338.130 C 310.749 364.492 301.497 395.268 301.267 429.284 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S4\\\",\\\"fill\\\":\\\"url(#31E63F49-6226-4B9E-BD66-62B08F221513_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 330.566 310.772 C 475.329 276.552 573.444 321.782 637.512 338.412 C 567.093 197.810 627.136 76.587 679.360 25.458 C 525.101 36.634 383.814 90.367 291.066 211.567 C 293.911 239.471 313.249 285.461 330.566 310.772 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"black\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 38.230 590.475 C 316.264 520.927 345.831 232.398 203.137 236.164 C 414.969 27.011 612.979 6.009 705.255 23.299 C 699.461 24.175 690.322 24.359 679.360 25.458 C 554.155 38.017 415.635 82.757 291.066 211.567 C 309.660 234.221 325.848 279.162 330.566 310.772 C 476.379 268.153 577.644 316.532 637.512 338.412 C 650.934 343.318 667.102 355.362 667.105 355.364 C 667.102 355.363 648.076 351.293 631.912 347.254 C 566.181 330.831 450.327 313.506 330.686 338.130 C 324.398 369.742 315.146 401.568 301.267 429.284 C 454.832 471.957 501.314 536.106 548.208 595.887 C 552.920 601.894 559.106 611.500 559.107 611.501 C 559.105 611.500 548.945 605.662 542.632 599.817 C 495.879 556.538 397.339 485.618 285.139 458.463 C 272.612 483.716 240.363 520.291 236.266 524.323 C 277.080 591.828 289.097 641.673 290.829 680.868 C 291.258 690.580 289.271 697.622 289.271 697.624 C 289.271 697.622 285.805 692.637 284.056 684.620 C 275.734 646.486 246.778 586.450 207.511 547.881 C 182.716 560.748 92.846 603.552 46.509 614.472 C 34.531 608.595 32.671 599.216 38.230 590.475 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":64.048,\\\"y\\\":604.256,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9963949129429127,\\\"y\\\":-0.0848361801443549}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":38.68,\\\"y\\\":605.144,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"31E63F49-6226-4B9E-BD66-62B08F221513_0\\\",\\\"cx\\\":\\\"49.93%\\\",\\\"cy\\\":\\\"64.26%\\\",\\\"r\\\":\\\"107.78%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"27.84%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"31E63F49-6226-4B9E-BD66-62B08F221513_1\\\",\\\"cx\\\":\\\"33.77%\\\",\\\"cy\\\":\\\"42.92%\\\",\\\"r\\\":\\\"93.22%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"27.84%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"31E63F49-6226-4B9E-BD66-62B08F221513_2\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"32.58%\\\",\\\"r\\\":\\\"93.08%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"27.84%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"31E63F49-6226-4B9E-BD66-62B08F221513_3\\\",\\\"cx\\\":\\\"52.43%\\\",\\\"cy\\\":\\\"51.01%\\\",\\\"r\\\":\\\"98.94%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"27.84%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"],\\\"creature_frequency_multiplier\\\":10}},{\\\"name\\\":\\\"wing_butterfly\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":41.77071372590024,\\\"max\\\":457.0246171676067},\\\"y\\\":{\\\"min\\\":8.834233618370453,\\\"max\\\":692.742463508742}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_butterfly\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"butterfly_wing\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 224.643 647.130 C 224.977 637.478 217.460 629.422 207.807 629.088 C 198.154 628.754 190.098 636.271 189.764 645.924 C 189.430 655.576 196.948 663.632 206.600 663.966 C 216.253 664.300 224.309 656.783 224.643 647.130 M 285.190 655.896 C 285.572 644.849 276.969 635.629 265.922 635.247 C 254.875 634.865 245.655 643.468 245.273 654.515 C 244.890 665.562 253.494 674.782 264.541 675.165 C 275.588 675.547 284.808 666.943 285.190 655.896 M 191.294 611.694 C 191.607 602.645 184.561 595.092 175.512 594.779 C 166.463 594.466 158.910 601.513 158.597 610.562 C 158.284 619.612 165.331 627.164 174.380 627.477 C 183.429 627.790 190.981 620.743 191.294 611.694 M 122.105 151.246 C 122.346 144.265 116.910 138.439 109.929 138.198 C 102.949 137.956 97.122 143.393 96.881 150.373 C 96.639 157.354 102.076 163.180 109.057 163.422 C 116.037 163.663 121.863 158.227 122.105 151.246 M 110.923 109.471 C 111.232 100.551 104.285 93.107 95.365 92.798 C 86.446 92.490 79.001 99.436 78.693 108.355 C 78.384 117.275 85.330 124.720 94.250 125.028 C 103.170 125.337 110.614 118.390 110.923 109.471 M 115.689 52.814 C 116.118 40.404 106.454 30.047 94.044 29.617 C 81.634 29.188 71.276 38.853 70.847 51.263 C 70.417 63.673 80.082 74.030 92.492 74.460 C 104.902 74.889 115.260 65.224 115.689 52.814 M 158.438 127.957 C 208.891 154.275 257.677 181.803 257.687 181.809 C 257.687 181.805 254.058 154.657 259.253 143.383 C 262.604 136.112 276.856 125.907 276.858 125.905 C 276.853 125.901 240.660 94.928 227.895 86.742 C 209.920 75.216 160.359 39.151 148.728 47.678 C 138.074 55.488 112.366 103.924 158.438 127.957 M 176.845 526.574 C 152.077 528.286 160.914 548.517 162.075 561.449 C 163.226 574.271 177.574 573.572 185.431 573.361 C 208.213 572.747 246.072 527.516 246.078 527.512 C 246.078 527.510 240.701 515.022 240.701 515.021 C 240.694 515.022 218.211 523.715 176.845 526.574 M 244.574 495.831 C 242.425 496.854 183.128 508.850 178.571 499.988 C 171.826 486.869 188.158 472.379 192.593 469.163 C 201.232 462.899 258.516 467.126 258.523 467.126 C 258.521 467.129 246.139 484.723 244.574 495.831 M 209.213 448.350 C 247.385 446.028 269.682 445.239 269.688 445.239 C 269.690 445.236 293.241 419.932 293.243 419.929 C 293.236 419.930 245.751 418.525 222.551 423.833 C 205.185 427.805 196.794 449.106 209.213 448.350 M 265.510 536.720 C 267.787 537.827 307.549 531.388 307.553 531.387 C 307.551 531.391 289.710 558.043 281.257 575.342 C 275.053 588.039 275.404 600.995 267.488 610.326 C 258.038 621.465 240.948 618.799 231.173 613.594 C 224.612 610.101 216.233 598.168 218.356 592.747 C 225.190 575.294 266.648 537.846 265.510 536.720 M 412.343 542.647 C 441.310 476.057 434.452 454.496 430.782 452.071 C 426.630 449.328 365.368 503.422 348.905 517.154 C 336.612 527.408 296.644 582.810 305.377 622.246 C 312.602 654.872 345.810 622.575 359.824 608.905 C 369.663 599.308 401.471 567.640 412.343 542.647 M 366.000 469.425 C 443.637 417.181 433.685 415.332 430.501 408.096 C 427.101 400.370 353.238 408.351 336.010 418.307 C 317.651 428.917 269.259 492.064 276.768 500.458 C 288.804 513.913 321.742 499.207 366.000 469.425 M 314.609 370.700 C 350.083 370.151 376.674 368.945 376.680 368.945 C 376.673 368.940 327.113 343.819 307.575 319.325 C 292.489 300.412 238.384 307.440 189.370 287.102 C 156.616 273.511 174.000 329.439 193.432 345.708 C 219.468 367.505 250.917 371.686 314.609 370.700 M 186.668 258.739 C 238.504 278.970 284.265 280.079 284.275 280.081 C 284.273 280.078 273.018 256.801 268.007 241.660 C 264.195 230.144 260.371 210.860 260.371 210.857 C 260.360 210.851 166.936 155.018 152.973 156.709 C 133.686 159.044 132.236 237.496 186.668 258.739 M 324.171 300.530 C 352.923 343.590 431.124 378.144 437.333 372.790 C 443.366 367.588 398.924 272.894 386.285 252.733 C 320.842 148.348 295.397 146.490 284.170 165.083 C 274.676 180.806 290.762 250.493 324.171 300.530 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 224.643 647.130 C 224.977 637.478 217.460 629.422 207.807 629.088 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 207.807 629.088 C 198.154 628.754 190.098 636.271 189.764 645.924 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 189.764 645.924 C 189.430 655.576 196.948 663.632 206.600 663.966 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 206.600 663.966 C 216.253 664.300 224.309 656.783 224.643 647.130 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 285.190 655.896 C 285.572 644.849 276.969 635.629 265.922 635.247 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 265.922 635.247 C 254.875 634.865 245.655 643.468 245.273 654.515 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 245.273 654.515 C 244.890 665.562 253.494 674.782 264.541 675.165 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 264.541 675.165 C 275.588 675.547 284.808 666.943 285.190 655.896 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 191.294 611.694 C 191.607 602.645 184.561 595.092 175.512 594.779 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 175.512 594.779 C 166.463 594.466 158.910 601.513 158.597 610.562 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 158.597 610.562 C 158.284 619.612 165.331 627.164 174.380 627.477 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 174.380 627.477 C 183.429 627.790 190.981 620.743 191.294 611.694 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 122.105 151.246 C 122.346 144.265 116.910 138.439 109.929 138.198 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 109.929 138.198 C 102.949 137.956 97.122 143.393 96.881 150.373 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 96.881 150.373 C 96.639 157.354 102.076 163.180 109.057 163.422 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 109.057 163.422 C 116.037 163.663 121.863 158.227 122.105 151.246 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 110.923 109.471 C 111.232 100.551 104.285 93.107 95.365 92.798 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 95.365 92.798 C 86.446 92.490 79.001 99.436 78.693 108.355 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 78.693 108.355 C 78.384 117.275 85.330 124.720 94.250 125.028 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 94.250 125.028 C 103.170 125.337 110.614 118.390 110.923 109.471 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 115.689 52.814 C 116.118 40.404 106.454 30.047 94.044 29.617 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 94.044 29.617 C 81.634 29.188 71.276 38.853 70.847 51.263 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 70.847 51.263 C 70.417 63.673 80.082 74.030 92.492 74.460 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 92.492 74.460 C 104.902 74.889 115.260 65.224 115.689 52.814 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 158.438 127.957 C 208.891 154.275 257.677 181.803 257.687 181.809 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 257.687 181.809 C 257.687 181.805 254.058 154.657 259.253 143.383 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 259.253 143.383 C 262.604 136.112 276.856 125.907 276.858 125.905 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 276.858 125.905 C 276.853 125.901 240.660 94.928 227.895 86.742 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 227.895 86.742 C 209.920 75.216 160.359 39.151 148.728 47.678 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 148.728 47.678 C 138.074 55.488 112.366 103.924 158.438 127.957 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 176.845 526.574 C 152.077 528.286 160.914 548.517 162.075 561.449 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 162.075 561.449 C 163.226 574.271 177.574 573.572 185.431 573.361 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 185.431 573.361 C 208.213 572.747 246.072 527.516 246.078 527.512 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 246.078 527.512 C 246.078 527.510 240.701 515.022 240.701 515.021 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 240.701 515.021 C 240.694 515.022 218.211 523.715 176.845 526.574 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 244.574 495.831 C 242.425 496.854 183.128 508.850 178.571 499.988 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 178.571 499.988 C 171.826 486.869 188.158 472.379 192.593 469.163 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 192.593 469.163 C 201.232 462.899 258.516 467.126 258.523 467.126 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 258.523 467.126 C 258.521 467.129 246.139 484.723 244.574 495.831 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 209.213 448.350 C 247.385 446.028 269.682 445.239 269.688 445.239 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 269.688 445.239 C 269.690 445.236 293.241 419.932 293.243 419.929 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 293.243 419.929 C 293.236 419.930 245.751 418.525 222.551 423.833 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 222.551 423.833 C 205.185 427.805 196.794 449.106 209.213 448.350 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 265.510 536.720 C 267.787 537.827 307.549 531.388 307.553 531.387 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 307.553 531.387 C 307.551 531.391 289.710 558.043 281.257 575.342 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 281.257 575.342 C 275.053 588.039 275.404 600.995 267.488 610.326 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 267.488 610.326 C 258.038 621.465 240.948 618.799 231.173 613.594 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 231.173 613.594 C 224.612 610.101 216.233 598.168 218.356 592.747 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 218.356 592.747 C 225.190 575.294 266.648 537.846 265.510 536.720 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 412.343 542.647 C 441.310 476.057 434.452 454.496 430.782 452.071 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 430.782 452.071 C 426.630 449.328 365.368 503.422 348.905 517.154 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 348.905 517.154 C 336.612 527.408 296.644 582.810 305.377 622.246 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 305.377 622.246 C 312.602 654.872 345.810 622.575 359.824 608.905 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.824 608.905 C 369.663 599.308 401.471 567.640 412.343 542.647 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 366.000 469.425 C 443.637 417.181 433.685 415.332 430.501 408.096 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 430.501 408.096 C 427.101 400.370 353.238 408.351 336.010 418.307 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 336.010 418.307 C 317.651 428.917 269.259 492.064 276.768 500.458 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 276.768 500.458 C 288.804 513.913 321.742 499.207 366.000 469.425 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 314.609 370.700 C 350.083 370.151 376.674 368.945 376.680 368.945 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 376.680 368.945 C 376.673 368.940 327.113 343.819 307.575 319.325 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 307.575 319.325 C 292.489 300.412 238.384 307.440 189.370 287.102 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 189.370 287.102 C 156.616 273.511 174.000 329.439 193.432 345.708 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 193.432 345.708 C 219.468 367.505 250.917 371.686 314.609 370.700 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 186.668 258.739 C 238.504 278.970 284.265 280.079 284.275 280.081 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 284.275 280.081 C 284.273 280.078 273.018 256.801 268.007 241.660 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 268.007 241.660 C 264.195 230.144 260.371 210.860 260.371 210.857 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 260.371 210.857 C 260.360 210.851 166.936 155.018 152.973 156.709 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 152.973 156.709 C 133.686 159.044 132.236 237.496 186.668 258.739 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 324.171 300.530 C 352.923 343.590 431.124 378.144 437.333 372.790 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 437.333 372.790 C 443.366 367.588 398.924 272.894 386.285 252.733 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 386.285 252.733 C 320.842 148.348 295.397 146.490 284.170 165.083 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 284.170 165.083 C 274.676 180.806 290.762 250.493 324.171 300.530 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 442.037 516.914 C 464.578 450.232 454.183 360.450 438.006 320.571 C 411.342 254.839 368.837 171.055 318.052 124.353 C 261.651 72.487 165.459 5.232 89.069 11.206 C 76.116 12.219 56.651 19.470 50.506 30.917 C 19.176 89.279 106.205 175.191 126.106 238.371 C 137.218 273.650 136.656 327.469 158.467 357.342 C 166.311 368.085 180.694 379.647 194.029 383.826 C 245.540 399.968 373.918 386.962 373.936 386.962 C 373.921 386.964 305.210 396.649 223.462 401.440 C 195.618 403.072 171.503 443.465 158.914 468.355 C 140.262 505.232 130.291 564.308 139.129 604.677 C 153.006 668.058 187.864 696.407 251.012 689.808 C 297.127 684.989 327.039 668.372 349.218 650.229 C 386.763 619.518 421.103 578.844 442.037 516.914 M 224.643 647.130 C 224.977 637.478 217.460 629.422 207.807 629.088 C 198.154 628.754 190.098 636.271 189.764 645.924 C 189.430 655.576 196.948 663.632 206.600 663.966 C 216.253 664.300 224.309 656.783 224.643 647.130 M 285.190 655.896 C 285.572 644.849 276.969 635.629 265.922 635.247 C 254.875 634.865 245.655 643.468 245.273 654.515 C 244.890 665.562 253.494 674.782 264.541 675.165 C 275.588 675.547 284.808 666.943 285.190 655.896 M 191.294 611.694 C 191.607 602.645 184.561 595.092 175.512 594.779 C 166.463 594.466 158.910 601.513 158.597 610.562 C 158.284 619.612 165.331 627.164 174.380 627.477 C 183.429 627.790 190.981 620.743 191.294 611.694 M 122.105 151.246 C 122.346 144.265 116.910 138.439 109.929 138.198 C 102.949 137.956 97.122 143.393 96.881 150.373 C 96.639 157.354 102.076 163.180 109.057 163.422 C 116.037 163.663 121.863 158.227 122.105 151.246 M 110.923 109.471 C 111.232 100.551 104.285 93.107 95.365 92.798 C 86.446 92.490 79.001 99.436 78.693 108.355 C 78.384 117.275 85.330 124.720 94.250 125.028 C 103.170 125.337 110.614 118.390 110.923 109.471 M 115.689 52.814 C 116.118 40.404 106.454 30.047 94.044 29.617 C 81.634 29.188 71.276 38.853 70.847 51.263 C 70.417 63.673 80.082 74.030 92.492 74.460 C 104.902 74.889 115.260 65.224 115.689 52.814 M 158.438 127.957 C 208.891 154.275 257.677 181.803 257.687 181.809 C 257.687 181.805 254.058 154.657 259.253 143.383 C 262.604 136.112 276.856 125.907 276.858 125.905 C 276.853 125.901 240.660 94.928 227.895 86.742 C 209.920 75.216 160.359 39.151 148.728 47.678 C 138.074 55.488 112.366 103.924 158.438 127.957 M 176.845 526.574 C 152.077 528.286 160.914 548.517 162.075 561.449 C 163.226 574.271 177.574 573.572 185.431 573.361 C 208.213 572.747 246.072 527.516 246.078 527.512 C 246.078 527.510 240.701 515.022 240.701 515.021 C 240.694 515.022 218.211 523.715 176.845 526.574 M 244.574 495.831 C 242.425 496.854 183.128 508.850 178.571 499.988 C 171.826 486.869 188.158 472.379 192.593 469.163 C 201.232 462.899 258.516 467.126 258.523 467.126 C 258.521 467.129 246.139 484.723 244.574 495.831 M 209.213 448.350 C 247.385 446.028 269.682 445.239 269.688 445.239 C 269.690 445.236 293.241 419.932 293.243 419.929 C 293.236 419.930 245.751 418.525 222.551 423.833 C 205.185 427.805 196.794 449.106 209.213 448.350 M 265.510 536.720 C 267.787 537.827 307.549 531.388 307.553 531.387 C 307.551 531.391 289.710 558.043 281.257 575.342 C 275.053 588.039 275.404 600.995 267.488 610.326 C 258.038 621.465 240.948 618.799 231.173 613.594 C 224.612 610.101 216.233 598.168 218.356 592.747 C 225.190 575.294 266.648 537.846 265.510 536.720 M 412.343 542.647 C 441.310 476.057 434.452 454.496 430.782 452.071 C 426.630 449.328 365.368 503.422 348.905 517.154 C 336.612 527.408 296.644 582.810 305.377 622.246 C 312.602 654.872 345.810 622.575 359.824 608.905 C 369.663 599.308 401.471 567.640 412.343 542.647 M 366.000 469.425 C 443.637 417.181 433.685 415.332 430.501 408.096 C 427.101 400.370 353.238 408.351 336.010 418.307 C 317.651 428.917 269.259 492.064 276.768 500.458 C 288.804 513.913 321.742 499.207 366.000 469.425 M 314.609 370.700 C 350.083 370.151 376.674 368.945 376.680 368.945 C 376.673 368.940 327.113 343.819 307.575 319.325 C 292.489 300.412 238.384 307.440 189.370 287.102 C 156.616 273.511 174.000 329.439 193.432 345.708 C 219.468 367.505 250.917 371.686 314.609 370.700 M 186.668 258.739 C 238.504 278.970 284.265 280.079 284.275 280.081 C 284.273 280.078 273.018 256.801 268.007 241.660 C 264.195 230.144 260.371 210.860 260.371 210.857 C 260.360 210.851 166.936 155.018 152.973 156.709 C 133.686 159.044 132.236 237.496 186.668 258.739 M 324.171 300.530 C 352.923 343.590 431.124 378.144 437.333 372.790 C 443.366 367.588 398.924 272.894 386.285 252.733 C 320.842 148.348 295.397 146.490 284.170 165.083 C 274.676 180.806 290.762 250.493 324.171 300.530 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":457.059,\\\"y\\\":395.394,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":451.934,\\\"y\\\":395.151,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871526874639,\\\"y\\\":0.0050689703114871615}}]},\\\"meta\\\":{\\\"rotate_clockwise\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"wing_eagle\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":119.05701671286413,\\\"max\\\":648.844},\\\"y\\\":{\\\"min\\\":28.478,\\\"max\\\":698.9028389234913}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_eagle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_eagle_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 150.877 415.834 C 170.990 432.852 264.054 447.145 297.629 474.706 C 349.553 517.327 360.247 581.426 347.926 622.509 C 335.439 664.145 284.897 658.750 284.891 658.754 C 284.901 658.757 307.863 701.037 382.596 688.696 C 422.755 682.064 452.966 649.843 452.973 649.839 C 452.975 649.834 473.435 617.823 478.332 604.390 C 506.395 527.413 487.301 434.995 519.697 337.275 C 552.394 238.645 647.333 96.190 647.344 96.165 C 647.335 96.170 570.044 72.637 484.699 236.552 C 456.819 290.099 437.033 386.852 437.028 386.867 C 437.031 386.851 450.223 288.484 469.070 230.507 C 494.048 153.670 554.356 36.301 554.367 36.282 C 554.359 36.286 463.902 24.594 397.239 227.225 C 379.485 281.190 370.582 373.965 370.580 373.980 C 370.581 373.964 373.625 276.140 387.709 218.093 C 405.853 143.315 461.382 29.997 461.390 29.978 C 461.376 29.995 357.596 54.376 322.712 200.173 C 312.595 242.459 308.723 313.458 308.722 313.469 C 308.722 313.459 306.592 251.705 309.575 213.895 C 314.414 152.570 327.438 72.541 327.440 72.527 C 327.432 72.541 264.152 93.513 249.437 215.932 C 245.157 251.533 242.082 309.778 242.081 309.788 C 242.081 309.780 236.193 262.522 237.415 233.398 C 239.639 180.376 242.342 108.784 242.342 108.772 C 242.336 108.787 184.292 137.539 179.046 256.051 C 177.899 281.948 177.538 324.088 177.538 324.095 C 177.537 324.090 173.063 298.618 173.197 273.847 C 173.431 230.363 168.276 187.574 168.276 187.566 C 168.271 187.578 115.200 211.527 121.000 310.485 C 124.338 367.442 135.834 403.105 150.877 415.834 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 150.877 415.834 C 170.990 432.852 264.054 447.145 297.629 474.706 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 297.629 474.706 C 349.553 517.327 360.247 581.426 347.926 622.509 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 347.926 622.509 C 335.439 664.145 284.897 658.750 284.891 658.754 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 284.891 658.754 C 284.901 658.757 307.863 701.037 382.596 688.696 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 382.596 688.696 C 422.755 682.064 452.966 649.843 452.973 649.839 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 190.508 294.732 C 190.504 294.744 104.769 310.223 150.877 415.834 C 170.990 432.852 264.054 447.145 297.629 474.706 C 349.553 517.327 360.247 581.426 347.926 622.509 C 335.439 664.145 284.897 658.750 284.891 658.754 C 284.901 658.757 307.863 701.037 382.596 688.696 C 422.755 682.064 452.966 649.843 452.973 649.839 C 522.695 575.536 490.441 461.920 552.208 348.791 C 512.486 349.160 484.749 351.119 461.451 427.954 C 452.562 457.267 449.517 507.062 449.516 507.070 C 449.516 507.062 449.731 456.892 451.151 425.923 C 452.908 387.606 477.055 356.620 488.269 323.250 C 429.386 334.506 415.412 347.789 398.711 384.616 C 388.392 407.371 390.947 449.747 390.946 449.754 C 390.946 449.748 392.661 418.679 392.006 396.021 C 390.510 344.256 412.152 298.142 412.154 298.132 C 412.146 298.139 353.241 294.055 338.847 364.543 C 334.906 383.845 338.803 416.261 338.803 416.266 C 338.802 416.262 332.562 389.255 331.137 372.327 C 326.695 319.538 336.421 277.481 336.422 277.472 C 336.415 277.479 288.197 290.456 272.341 348.243 C 267.339 366.473 265.155 397.348 265.155 397.353 C 265.154 397.349 267.984 369.292 263.915 351.642 C 256.787 320.731 259.124 277.249 259.123 277.242 C 259.118 277.251 201.284 290.696 204.685 366.610 C 205.030 374.321 203.236 386.823 203.236 386.825 C 203.235 386.822 200.674 371.107 197.516 359.280 C 189.090 327.716 190.509 294.738 190.508 294.732 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"3\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 226.954 347.382 C 226.947 347.389 147.818 332.721 150.596 416.421 C 170.709 433.440 263.773 447.732 297.349 475.293 C 349.272 517.914 359.966 582.013 347.646 623.096 C 335.159 664.732 284.617 659.338 284.611 659.341 C 284.621 659.345 303.535 700.969 378.379 697.156 C 414.634 695.308 421.903 689.576 445.515 671.985 C 502.426 623.148 476.950 598.661 535.431 571.167 C 459.012 512.656 464.615 606.267 417.016 625.156 C 463.495 602.002 458.118 531.988 499.132 506.086 C 408.368 454.140 427.790 548.629 396.418 574.794 C 422.151 543.344 418.643 502.439 418.444 498.804 C 415.624 447.246 439.519 425.898 439.521 425.891 C 439.513 425.893 354.175 388.296 360.321 447.732 C 363.492 478.401 355.325 497.949 355.324 497.954 C 355.324 497.947 366.029 475.578 356.329 432.022 C 348.457 396.677 373.448 376.499 373.450 376.493 C 373.442 376.496 296.596 369.545 299.107 403.267 C 301.386 433.893 299.095 444.043 299.095 444.047 C 299.094 444.043 305.568 417.117 294.307 400.855 C 281.571 382.462 295.236 354.699 295.236 354.694 C 295.230 354.698 226.264 337.861 229.967 392.517 C 230.903 406.338 228.644 417.067 228.644 417.070 C 228.643 417.067 234.951 402.843 224.573 385.949 C 210.246 362.627 226.954 347.386 226.954 347.382 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":154.395,\\\"y\\\":385.234,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"]}},{\\\"name\\\":\\\"wing_egypt\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":29.89208228053569,\\\"max\\\":707.6565876455899},\\\"y\\\":{\\\"min\\\":208.19451824822798,\\\"max\\\":499.6257421494479}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_egypt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_Egypt_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 58.746 435.456 C 68.499 437.593 273.507 433.386 306.033 435.457 C 438.868 443.915 502.380 442.480 687.430 496.407 C 720.170 505.948 709.417 456.939 650.186 437.504 C 625.837 429.515 480.062 416.208 480.045 416.206 C 480.062 416.208 614.803 426.142 649.504 433.856 C 688.218 442.462 691.337 397.228 641.551 380.391 C 616.454 371.903 461.581 383.482 461.563 383.482 C 461.581 383.482 610.351 373.452 635.136 376.531 C 669.434 380.791 675.071 328.650 620.732 324.024 C 601.987 322.428 447.914 357.776 447.897 357.779 C 447.914 357.776 556.230 328.312 620.922 322.000 C 651.239 319.042 626.314 270.837 580.308 275.356 C 550.594 278.274 409.661 336.602 409.643 336.608 C 409.660 336.601 481.071 300.849 578.034 273.076 C 612.851 263.104 571.751 228.918 532.828 234.442 C 501.394 238.903 378.408 326.253 378.392 326.262 C 378.404 326.255 443.349 276.313 489.748 251.672 C 534.616 227.844 483.759 203.305 440.009 227.423 C 420.038 238.433 357.872 307.822 357.864 307.830 C 357.872 307.823 382.944 270.152 433.981 230.612 C 455.255 214.131 397.217 203.464 374.571 226.359 C 352.062 249.115 306.094 309.528 306.087 309.537 C 306.094 309.528 339.740 264.833 372.160 223.593 C 384.470 207.933 332.121 208.740 315.677 224.870 C 305.357 234.993 260.576 306.969 260.570 306.977 C 260.576 306.969 273.231 275.886 311.543 226.997 C 322.949 212.442 278.031 209.106 260.743 226.571 C 247.009 240.447 213.735 311.223 213.730 311.231 C 213.734 311.223 226.425 274.897 259.193 223.593 C 270.765 205.475 229.987 205.230 215.453 225.933 C 199.322 248.910 171.028 320.582 171.024 320.592 C 171.028 320.582 182.633 279.545 211.664 226.146 C 221.711 207.666 179.116 205.495 165.170 227.635 C 156.653 241.157 125.565 318.880 125.561 318.890 C 125.565 318.880 129.503 284.154 163.446 225.295 C 171.732 210.927 127.952 212.488 119.363 226.784 C 106.293 248.537 91.812 317.178 91.809 317.187 C 91.811 317.178 96.442 287.391 113.851 225.295 C 114.734 222.146 90.381 214.181 80.787 226.997 C 67.672 244.516 57.370 312.074 57.367 312.083 C 57.369 312.074 60.608 268.098 71.833 227.847 C 75.183 215.832 49.060 221.242 42.902 232.953 C 32.510 252.717 35.604 271.405 33.259 314.635 C 31.148 353.533 27.932 428.708 58.746 435.456 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 295.700 437.158 C 295.722 437.161 443.118 442.939 513.541 464.810 C 527.060 469.009 529.201 415.383 488.946 407.735 C 456.514 401.573 325.336 410.782 325.320 410.782 C 325.337 410.781 461.862 398.555 500.794 403.636 C 516.498 405.685 510.974 357.463 465.840 355.476 C 440.272 354.350 303.982 398.015 303.966 398.019 C 303.983 398.015 435.205 354.395 468.444 351.547 C 490.826 349.629 459.150 304.552 431.736 313.072 C 395.115 324.454 290.204 382.696 290.190 382.703 C 290.203 382.697 380.594 328.018 419.425 315.672 C 444.464 307.712 402.923 272.352 368.076 289.604 C 344.524 301.265 266.780 371.634 266.769 371.642 C 266.778 371.634 329.273 314.407 354.250 295.065 C 377.108 277.365 323.985 272.993 313.609 277.198 C 291.913 285.990 236.469 363.976 236.462 363.985 C 236.467 363.977 279.959 308.348 295.011 287.407 C 302.360 277.184 270.635 273.245 250.927 281.452 C 234.149 288.438 202.026 357.170 202.021 357.178 C 202.025 357.171 227.083 303.502 239.216 285.706 C 243.726 279.091 218.482 266.119 199.954 279.750 C 188.222 288.380 157.251 358.871 157.247 358.879 C 157.250 358.872 180.799 303.869 190.311 286.557 C 194.012 279.821 168.298 267.611 152.425 282.302 C 141.597 292.324 123.497 349.513 123.494 349.520 C 123.497 349.514 141.419 299.373 147.603 284.855 C 150.495 278.067 121.773 267.739 111.096 282.302 C 103.576 292.560 87.678 349.513 87.675 349.520 C 87.677 349.514 103.378 302.602 107.652 286.557 C 109.439 279.845 84.284 266.843 73.211 285.706 C 66.871 296.506 58.747 346.111 58.746 346.117 C 58.747 346.111 66.597 305.079 69.077 289.109 C 70.273 281.410 51.402 266.579 38.080 284.855 C 32.886 291.981 33.183 311.193 32.570 328.248 C 29.675 408.815 35.541 404.726 60.123 412.484 C 60.147 412.487 295.677 437.156 295.700 437.158 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 148.981 398.870 C 160.826 400.542 278.808 433.834 301.211 436.307 C 309.972 437.275 336.020 435.357 362.516 436.308 C 375.662 436.780 378.296 399.497 339.784 397.168 C 333.703 396.800 298.460 406.527 298.456 406.528 C 298.460 406.527 333.971 394.873 343.229 391.212 C 359.066 384.949 336.489 359.609 317.054 362.284 C 302.205 364.327 267.464 401.419 267.459 401.423 C 267.463 401.419 296.411 371.248 308.787 361.432 C 321.575 351.289 289.617 337.986 277.790 345.266 C 269.476 350.384 230.267 393.760 230.262 393.765 C 230.266 393.760 262.032 356.438 270.902 344.415 C 280.050 332.016 258.693 321.306 238.528 331.652 C 227.093 337.519 203.401 384.400 203.398 384.405 C 203.400 384.400 228.487 339.288 228.196 330.801 C 227.893 321.954 208.598 319.792 196.509 329.100 C 189.277 334.668 168.959 380.997 168.957 381.002 C 168.959 380.997 188.259 337.637 190.310 329.950 C 194.209 315.341 166.576 314.802 158.625 324.846 C 153.475 331.350 137.273 378.444 137.271 378.449 C 137.273 378.444 149.029 339.504 152.425 326.547 C 154.456 318.797 129.768 311.702 119.361 328.248 C 115.752 333.987 105.586 373.340 105.585 373.344 C 105.586 373.340 110.018 345.157 115.918 329.100 C 123.067 309.640 95.412 307.554 85.609 318.038 C 75.928 328.392 71.145 377.593 71.144 377.599 C 71.144 377.594 78.032 333.909 77.343 326.547 C 76.191 314.224 56.164 312.464 47.035 318.889 C 31.651 329.715 32.872 368.727 38.080 393.765 C 48.847 399.114 140.593 397.686 148.981 398.870 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 86.298 445.667 C 86.321 445.666 305.092 437.693 310.129 437.653 C 364.364 437.225 323.956 394.705 292.895 402.985 C 284.847 405.130 260.486 413.967 260.483 413.968 C 260.485 413.967 281.651 407.310 288.210 404.518 C 317.763 391.938 272.957 371.217 254.057 380.755 C 245.763 384.941 225.355 405.922 225.353 405.924 C 225.355 405.922 241.075 389.854 253.169 380.724 C 265.944 371.079 236.070 354.122 218.102 368.486 C 209.951 375.002 190.713 400.568 190.711 400.571 C 190.713 400.568 205.424 380.813 215.146 369.555 C 224.035 359.260 193.532 346.601 176.910 364.588 C 165.100 377.368 158.739 395.464 158.737 395.467 C 158.738 395.464 168.184 373.551 172.776 367.466 C 183.494 353.264 153.581 345.995 139.538 361.046 C 131.770 369.372 125.675 393.406 125.673 393.409 C 125.675 393.406 133.874 369.945 137.936 363.103 C 146.517 348.648 114.160 339.945 104.095 356.822 C 99.567 364.414 92.411 391.209 92.410 391.212 C 92.411 391.209 98.178 368.169 100.738 361.788 C 109.706 339.436 75.177 344.572 69.077 358.029 C 64.884 367.280 61.414 389.755 61.413 389.758 C 61.414 389.755 66.715 367.531 68.652 360.442 C 74.656 338.475 41.577 338.359 36.014 358.879 C 33.574 367.879 34.979 375.194 34.637 397.168 C 33.815 449.851 86.293 445.662 86.298 445.667 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":56.692,\\\"y\\\":333.303,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":1,\\\"y\\\":0}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":31.287,\\\"y\\\":333.303,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-1,\\\"y\\\":0}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"leg\\\",\\\"arm\\\",\\\"horn\\\"],\\\"creature_frequency_multiplier\\\":5}},{\\\"name\\\":\\\"wings_egypt\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":3.6617462006002945,\\\"max\\\":716.3382537993999},\\\"y\\\":{\\\"min\\\":277.3519690264922,\\\"max\\\":442.273}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wings_egypt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_Egypt\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 383.705 311.126 C 388.690 310.034 493.469 312.184 510.092 311.126 C 577.984 306.804 610.445 307.536 705.023 279.975 C 721.756 275.098 716.260 300.147 685.987 310.080 C 673.543 314.163 599.038 320.964 599.030 320.965 C 599.038 320.964 667.904 315.887 685.639 311.944 C 705.425 307.546 707.019 330.664 681.574 339.270 C 668.747 343.608 589.593 337.690 589.583 337.690 C 589.592 337.690 665.629 342.816 678.296 341.243 C 695.826 339.065 698.707 365.715 670.934 368.079 C 661.354 368.894 582.607 350.828 582.599 350.827 C 582.607 350.828 637.967 365.887 671.031 369.113 C 686.526 370.625 673.787 395.263 650.273 392.953 C 635.087 391.461 563.057 361.650 563.048 361.647 C 563.056 361.651 599.554 379.923 649.111 394.118 C 666.906 399.215 645.900 416.687 626.007 413.864 C 609.941 411.583 547.083 366.939 547.075 366.935 C 547.081 366.939 580.274 392.464 603.989 405.057 C 626.920 417.236 600.928 429.778 578.567 417.451 C 568.360 411.824 536.588 376.359 536.584 376.355 C 536.588 376.359 549.402 395.613 575.486 415.821 C 586.359 424.244 556.697 429.696 545.122 417.995 C 533.618 406.364 510.124 375.487 510.120 375.483 C 510.124 375.487 527.320 398.331 543.890 419.408 C 550.182 427.412 523.426 427.000 515.022 418.756 C 509.747 413.582 486.860 376.795 486.857 376.791 C 486.860 376.795 493.328 392.682 512.909 417.669 C 518.738 425.107 495.781 426.813 486.946 417.886 C 479.926 410.795 462.920 374.621 462.917 374.617 C 462.920 374.621 469.406 393.188 486.153 419.408 C 492.067 428.668 471.226 428.793 463.798 418.212 C 455.553 406.469 441.092 369.838 441.090 369.833 C 441.092 369.838 447.024 390.812 461.861 418.104 C 466.996 427.549 445.226 428.658 438.098 417.343 C 433.745 410.432 417.857 370.707 417.854 370.703 C 417.856 370.708 419.870 388.456 437.217 418.539 C 441.452 425.882 419.076 425.084 414.687 417.777 C 408.007 406.659 400.605 371.578 400.604 371.573 C 400.605 371.578 402.972 386.802 411.870 418.539 C 412.321 420.148 399.874 424.219 394.971 417.669 C 388.268 408.715 383.002 374.186 383.001 374.182 C 383.002 374.186 384.657 396.662 390.394 417.234 C 392.107 423.375 378.755 420.610 375.608 414.625 C 370.296 404.523 371.878 394.972 370.679 372.877 C 369.600 352.997 367.957 314.575 383.705 311.126 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 504.812 310.256 C 504.823 310.255 580.156 307.303 616.149 296.124 C 623.059 293.977 624.153 321.386 603.579 325.295 C 587.003 328.444 519.958 323.737 519.950 323.737 C 519.959 323.737 589.736 329.986 609.634 327.390 C 617.660 326.342 614.837 350.988 591.769 352.004 C 578.701 352.579 509.045 330.262 509.036 330.260 C 509.045 330.262 576.112 352.556 593.100 354.012 C 604.539 354.992 588.350 378.031 574.339 373.676 C 555.622 367.859 502.003 338.092 501.995 338.088 C 502.002 338.091 548.200 366.038 568.047 372.348 C 580.844 376.416 559.613 394.488 541.803 385.670 C 529.765 379.711 490.031 343.745 490.026 343.741 C 490.030 343.745 521.970 372.994 534.736 382.879 C 546.419 391.926 519.268 394.160 513.965 392.011 C 502.876 387.518 474.539 347.659 474.535 347.655 C 474.538 347.659 496.767 376.091 504.460 386.793 C 508.216 392.018 492.001 394.031 481.929 389.837 C 473.354 386.267 456.935 351.138 456.933 351.134 C 456.934 351.138 469.742 378.567 475.943 387.663 C 478.248 391.044 465.346 397.673 455.876 390.707 C 449.880 386.296 434.051 350.268 434.049 350.264 C 434.051 350.268 446.086 378.380 450.948 387.228 C 452.839 390.671 439.697 396.911 431.584 389.402 C 426.051 384.281 416.800 355.051 416.798 355.048 C 416.799 355.051 425.959 380.678 429.120 388.098 C 430.598 391.567 415.918 396.846 410.461 389.402 C 406.618 384.160 398.493 355.051 398.492 355.048 C 398.493 355.051 406.517 379.028 408.701 387.228 C 409.614 390.659 396.758 397.304 391.098 387.663 C 387.858 382.143 383.706 356.790 383.705 356.787 C 383.706 356.790 387.718 377.762 388.986 385.923 C 389.597 389.859 379.952 397.438 373.143 388.098 C 370.488 384.455 370.640 374.636 370.327 365.920 C 368.848 324.742 371.846 326.832 384.409 322.867 C 384.421 322.866 504.800 310.258 504.812 310.256 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 429.824 329.825 C 435.878 328.971 496.178 311.956 507.628 310.691 C 512.106 310.197 525.419 311.177 538.961 310.691 C 545.680 310.450 547.026 329.505 527.343 330.695 C 524.235 330.883 506.222 325.912 506.220 325.911 C 506.222 325.912 524.372 331.868 529.103 333.739 C 537.198 336.940 525.658 349.892 515.725 348.525 C 508.136 347.480 490.380 328.523 490.377 328.521 C 490.380 328.523 505.175 343.943 511.501 348.960 C 518.036 354.144 501.703 360.943 495.658 357.222 C 491.409 354.606 471.369 332.437 471.367 332.434 C 471.369 332.437 487.604 351.512 492.138 357.657 C 496.813 363.994 485.898 369.468 475.591 364.180 C 469.747 361.182 457.638 337.221 457.636 337.218 C 457.638 337.221 470.459 360.277 470.311 364.615 C 470.155 369.137 460.294 370.241 454.116 365.485 C 450.420 362.639 440.035 338.960 440.034 338.958 C 440.035 338.960 449.899 361.121 450.947 365.050 C 452.940 372.516 438.817 372.792 434.753 367.659 C 432.121 364.335 423.840 340.265 423.839 340.262 C 423.840 340.265 429.849 360.167 431.584 366.789 C 432.622 370.751 420.005 374.376 414.686 365.920 C 412.841 362.987 407.646 342.874 407.645 342.872 C 407.645 342.874 409.911 357.277 412.926 365.485 C 416.579 375.430 402.446 376.496 397.435 371.138 C 392.487 365.846 390.043 340.700 390.042 340.697 C 390.042 340.700 393.562 363.027 393.211 366.789 C 392.622 373.088 382.386 373.987 377.720 370.703 C 369.858 365.170 370.482 345.231 373.143 332.434 C 378.646 329.700 425.537 330.431 429.824 329.825 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 397.787 305.908 C 397.799 305.908 509.612 309.983 512.186 310.003 C 539.906 310.222 519.253 331.955 503.378 327.722 C 499.265 326.626 486.814 322.109 486.812 322.109 C 486.814 322.109 497.631 325.512 500.984 326.939 C 516.088 333.369 493.188 343.959 483.529 339.084 C 479.289 336.944 468.859 326.221 468.857 326.220 C 468.859 326.221 476.893 334.434 483.074 339.100 C 489.604 344.029 474.335 352.696 465.151 345.354 C 460.986 342.024 451.154 328.957 451.152 328.956 C 451.154 328.957 458.672 339.054 463.641 344.808 C 468.184 350.070 452.594 356.539 444.099 347.346 C 438.063 340.815 434.811 331.567 434.810 331.565 C 434.811 331.566 439.639 342.766 441.986 345.876 C 447.464 353.135 432.175 356.849 424.998 349.157 C 421.028 344.902 417.913 332.618 417.912 332.616 C 417.912 332.618 422.103 344.609 424.179 348.106 C 428.565 355.494 412.027 359.942 406.883 351.316 C 404.569 347.435 400.911 333.741 400.911 333.739 C 400.911 333.741 403.859 345.516 405.168 348.778 C 409.751 360.202 392.103 357.577 388.986 350.699 C 386.843 345.971 385.069 334.484 385.068 334.483 C 385.069 334.484 387.778 345.842 388.768 349.466 C 391.837 360.693 374.930 360.752 372.087 350.264 C 370.840 345.665 371.559 341.926 371.383 330.695 C 370.963 303.769 397.785 305.910 397.787 305.908 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 336.295 311.126 C 331.310 310.034 226.531 312.184 209.908 311.126 C 142.016 306.803 109.555 307.536 14.977 279.975 C -1.756 275.098 3.740 300.147 34.013 310.080 C 46.457 314.163 120.962 320.964 120.971 320.965 C 120.962 320.964 52.096 315.887 34.361 311.944 C 14.575 307.546 12.981 330.664 38.426 339.270 C 51.253 343.608 130.408 337.690 130.417 337.690 C 130.408 337.690 54.372 342.816 41.704 341.243 C 24.175 339.065 21.294 365.715 49.066 368.079 C 58.647 368.894 137.393 350.828 137.401 350.827 C 137.393 350.828 82.033 365.887 48.969 369.113 C 33.474 370.625 46.214 395.263 69.727 392.953 C 84.913 391.461 156.944 361.650 156.953 361.647 C 156.944 361.651 120.446 379.923 70.889 394.118 C 53.094 399.215 74.101 416.687 93.993 413.864 C 110.059 411.583 172.917 366.939 172.925 366.935 C 172.919 366.939 139.726 392.463 116.011 405.057 C 93.080 417.236 119.073 429.778 141.433 417.451 C 151.640 411.824 183.413 376.359 183.417 376.355 C 183.413 376.359 170.598 395.613 144.514 415.821 C 133.641 424.244 163.303 429.696 174.878 417.995 C 186.382 406.364 209.876 375.487 209.880 375.483 C 209.876 375.487 192.680 398.331 176.110 419.408 C 169.819 427.412 196.574 427.000 204.978 418.756 C 210.253 413.582 233.140 376.795 233.143 376.791 C 233.140 376.795 226.672 392.682 207.091 417.669 C 201.262 425.108 224.219 426.813 233.055 417.886 C 240.074 410.795 257.081 374.621 257.083 374.617 C 257.081 374.621 250.594 393.187 233.847 419.408 C 227.933 428.668 248.774 428.794 256.202 418.212 C 264.447 406.469 278.908 369.838 278.910 369.833 C 278.908 369.838 272.976 390.812 258.139 418.104 C 253.004 427.549 274.774 428.658 281.902 417.343 C 286.255 410.432 302.144 370.707 302.146 370.703 C 302.144 370.708 300.131 388.456 282.783 418.539 C 278.548 425.882 300.924 425.084 305.313 417.778 C 311.993 406.660 319.395 371.578 319.396 371.573 C 319.395 371.578 317.028 386.802 308.130 418.539 C 307.679 420.148 320.126 424.219 325.029 417.669 C 331.732 408.715 336.998 374.186 336.999 374.182 C 336.998 374.186 335.343 396.662 329.606 417.234 C 327.893 423.375 341.245 420.610 344.392 414.625 C 349.704 404.523 348.122 394.972 349.321 372.877 C 350.400 352.997 352.043 314.575 336.295 311.126 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 215.188 310.256 C 215.177 310.255 139.844 307.302 103.851 296.124 C 96.941 293.977 95.847 321.386 116.421 325.295 C 132.997 328.444 200.042 323.737 200.050 323.737 C 200.041 323.737 130.264 329.986 110.366 327.390 C 102.340 326.342 105.163 350.988 128.231 352.004 C 141.299 352.579 210.955 330.262 210.964 330.260 C 210.955 330.262 143.888 352.556 126.900 354.012 C 115.461 354.992 131.650 378.031 145.661 373.676 C 164.378 367.859 217.997 338.092 218.005 338.088 C 217.998 338.091 171.800 366.037 151.953 372.347 C 139.156 376.416 160.387 394.488 178.197 385.670 C 190.235 379.711 229.970 343.745 229.975 343.741 C 229.970 343.745 198.030 372.994 185.264 382.879 C 173.581 391.926 200.732 394.160 206.035 392.011 C 217.124 387.517 245.461 347.659 245.465 347.655 C 245.462 347.659 223.234 376.091 215.541 386.793 C 211.785 392.018 227.999 394.031 238.072 389.837 C 246.647 386.267 263.065 351.138 263.068 351.134 C 263.066 351.138 250.258 378.567 244.057 387.663 C 241.752 391.044 254.654 397.673 264.124 390.707 C 270.120 386.296 285.949 350.268 285.951 350.264 C 285.950 350.268 273.914 378.380 269.052 387.228 C 267.161 390.671 280.303 396.911 288.416 389.402 C 293.950 384.281 303.201 355.051 303.202 355.048 C 303.201 355.051 294.041 380.678 290.880 388.098 C 289.402 391.567 304.082 396.846 309.539 389.402 C 313.382 384.160 321.508 355.051 321.509 355.048 C 321.508 355.051 313.483 379.027 311.299 387.228 C 310.386 390.658 323.242 397.304 328.902 387.663 C 332.142 382.143 336.294 356.790 336.295 356.787 C 336.294 356.790 332.282 377.762 331.014 385.923 C 330.403 389.859 340.048 397.438 346.857 388.098 C 349.512 384.455 349.360 374.636 349.673 365.920 C 351.152 324.742 348.154 326.832 335.591 322.867 C 335.579 322.866 215.200 310.258 215.188 310.256 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 290.176 329.825 C 284.122 328.971 223.822 311.956 212.372 310.691 C 207.894 310.197 194.581 311.177 181.039 310.691 C 174.320 310.450 172.974 329.505 192.657 330.695 C 195.765 330.883 213.778 325.912 213.780 325.911 C 213.778 325.912 195.628 331.868 190.897 333.739 C 182.802 336.940 194.342 349.891 204.275 348.524 C 211.864 347.480 229.620 328.523 229.623 328.521 C 229.620 328.523 214.825 343.943 208.500 348.960 C 201.964 354.144 218.297 360.943 224.342 357.222 C 228.591 354.606 248.631 332.437 248.633 332.434 C 248.631 332.437 232.396 351.512 227.863 357.657 C 223.187 363.994 234.102 369.468 244.409 364.180 C 250.253 361.182 262.362 337.221 262.364 337.218 C 262.362 337.221 249.541 360.277 249.689 364.615 C 249.845 369.137 259.706 370.242 265.884 365.485 C 269.581 362.639 279.965 338.960 279.966 338.957 C 279.965 338.960 270.101 361.121 269.053 365.050 C 267.060 372.516 281.183 372.792 285.247 367.659 C 287.879 364.335 296.160 340.265 296.161 340.262 C 296.160 340.265 290.151 360.167 288.416 366.789 C 287.378 370.750 299.995 374.376 305.314 365.920 C 307.159 362.987 312.355 342.874 312.355 342.872 C 312.355 342.874 310.089 357.277 307.074 365.485 C 303.420 375.431 317.555 376.496 322.565 371.138 C 327.513 365.846 329.957 340.700 329.958 340.697 C 329.958 340.700 326.438 363.027 326.789 366.789 C 327.378 373.088 337.614 373.987 342.280 370.703 C 350.142 365.170 349.518 345.231 346.857 332.434 C 341.354 329.700 294.463 330.431 290.176 329.825 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 322.213 305.908 C 322.201 305.908 210.388 309.983 207.814 310.003 C 180.094 310.222 200.747 331.954 216.622 327.722 C 220.735 326.626 233.186 322.109 233.188 322.109 C 233.186 322.109 222.369 325.512 219.016 326.939 C 203.912 333.369 226.812 343.959 236.472 339.084 C 240.711 336.944 251.141 326.221 251.143 326.220 C 251.141 326.221 243.107 334.434 236.926 339.100 C 230.396 344.029 245.665 352.696 254.849 345.354 C 259.014 342.024 268.847 328.957 268.848 328.956 C 268.847 328.957 261.328 339.054 256.359 344.808 C 251.816 350.070 267.406 356.540 275.902 347.346 C 281.937 340.815 285.189 331.566 285.190 331.565 C 285.189 331.566 280.361 342.766 278.014 345.876 C 272.536 353.135 287.825 356.849 295.002 349.157 C 298.973 344.902 302.087 332.618 302.088 332.616 C 302.088 332.618 297.897 344.609 295.821 348.106 C 291.435 355.494 307.973 359.942 313.117 351.316 C 315.431 347.435 319.089 333.741 319.089 333.739 C 319.089 333.741 316.141 345.516 314.833 348.778 C 310.249 360.202 327.897 357.577 331.014 350.699 C 333.157 345.971 334.931 334.484 334.932 334.482 C 334.931 334.484 332.222 345.842 331.232 349.466 C 328.163 360.693 345.070 360.752 347.913 350.264 C 349.160 345.665 348.441 341.926 348.617 330.695 C 349.037 303.769 322.215 305.910 322.213 305.908 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"circle\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 279.727 C 404.431 279.727 440.273 315.569 440.273 360.000 C 440.273 404.431 404.431 440.273 360.000 440.273 C 315.569 440.273 279.727 404.431 279.727 360.000 C 279.727 315.569 315.569 279.727 360.000 279.727 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":303.466,\\\"max\\\":416.534},\\\"y\\\":{\\\"min\\\":303.466,\\\"max\\\":416.534}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":520.513,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":278.521,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":23.852,\\\"y\\\":321.654,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987196609553,\\\"y\\\":0.005060298110508342}},{\\\"point\\\":{\\\"x\\\":696.148,\\\"y\\\":321.654,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999987196609553,\\\"y\\\":0.005060298110508353}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":564.395,\\\"y\\\":420.033,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128578893212155,\\\"y\\\":0.7013085124483387}},{\\\"point\\\":{\\\"x\\\":155.436,\\\"y\\\":420.076,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987104229361701,\\\"y\\\":0.7154046022219583}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":420.967,\\\"y\\\":300.035,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.6314461081805572,\\\"y\\\":-0.7754197653294814}},{\\\"point\\\":{\\\"x\\\":299.797,\\\"y\\\":300.124,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817160018062427,\\\"y\\\":-0.7316169030861103}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":438.491,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":false,\\\"invert_nested\\\":true}},{\\\"name\\\":\\\"wings_pair\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":0.5001632972689456,\\\"max\\\":720.2073725352172},\\\"y\\\":{\\\"min\\\":287.4079678153827,\\\"max\\\":456.2953359635063}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wings_pair_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 584.748 291.623 C 560.334 289.314 535.614 285.293 516.440 292.532 C 481.267 305.811 501.845 381.930 425.124 378.362 C 406.689 377.504 408.249 399.547 408.247 399.549 C 408.249 399.550 421.955 404.756 428.858 406.586 C 436.049 408.493 443.303 409.793 450.452 410.466 C 457.217 411.103 463.972 411.162 470.573 410.669 C 478.161 410.104 485.731 408.728 492.985 406.628 C 500.416 404.477 507.279 401.718 513.826 398.328 C 520.226 395.014 526.414 391.018 532.237 386.457 C 537.813 382.089 543.149 377.092 548.090 371.611 C 552.840 366.344 557.040 360.923 560.888 355.142 C 564.893 349.126 568.760 342.165 572.121 334.811 C 575.269 327.925 578.155 320.018 580.447 311.774 C 582.260 305.255 583.701 298.527 584.748 291.623 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 408.247 399.549 C 408.249 399.550 421.955 404.756 428.858 406.586 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 428.858 406.586 C 428.125 416.291 427.392 425.995 426.659 435.699 C 417.305 439.643 405.921 433.735 401.639 424.214 C 401.639 424.214 408.246 399.552 408.247 399.549 C 408.249 399.550 421.955 404.756 428.858 406.586 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 428.858 406.586 C 428.125 416.291 427.392 425.995 426.659 435.699 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 450.452 410.466 C 443.303 409.793 436.049 408.493 428.858 406.586 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S14_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 428.858 406.586 C 428.125 416.291 427.392 425.995 426.659 435.699 C 431.264 445.606 443.756 450.488 452.871 444.782 C 452.065 433.343 451.258 421.905 450.452 410.466 C 443.303 409.793 436.049 408.493 428.858 406.586 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 450.452 410.466 C 451.258 421.905 452.065 433.343 452.871 444.782 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 470.573 410.669 C 463.972 411.162 457.217 411.103 450.452 410.466 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 450.452 410.466 C 451.258 421.905 452.065 433.343 452.871 444.782 C 460.304 453.826 472.616 455.875 482.130 450.351 C 478.278 437.124 474.425 423.896 470.573 410.669 C 463.972 411.162 457.217 411.103 450.452 410.466 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 470.573 410.669 C 474.425 423.896 478.278 437.124 482.130 450.351 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 492.985 406.628 C 485.731 408.728 478.161 410.104 470.573 410.669 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S16_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 470.573 410.669 C 474.425 423.896 478.278 437.124 482.130 450.351 C 490.625 457.180 504.022 457.039 513.222 449.279 C 506.477 435.062 499.731 420.845 492.985 406.628 C 485.731 408.728 478.161 410.104 470.573 410.669 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 492.985 406.628 C 499.731 420.845 506.477 435.062 513.222 449.279 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 513.826 398.328 C 507.279 401.718 500.416 404.477 492.985 406.628 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_5)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 492.985 406.628 C 499.731 420.845 506.477 435.062 513.222 449.279 C 521.889 453.330 534.451 450.279 540.953 439.481 C 531.911 425.763 522.868 412.046 513.826 398.328 C 507.279 401.718 500.416 404.477 492.985 406.628 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 513.826 398.328 C 522.868 412.046 531.911 425.763 540.953 439.481 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 532.237 386.457 C 526.414 391.018 520.226 395.014 513.826 398.328 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_6)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 513.826 398.328 C 522.868 412.046 531.911 425.763 540.953 439.481 C 550.911 440.753 562.985 431.985 564.642 420.461 C 553.840 409.126 543.039 397.791 532.237 386.457 C 526.414 391.018 520.226 395.014 513.826 398.328 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 532.237 386.457 C 543.039 397.791 553.840 409.126 564.642 420.461 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 548.090 371.611 C 543.149 377.092 537.813 382.089 532.237 386.457 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_7)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 532.237 386.457 C 543.039 397.791 553.840 409.126 564.642 420.461 C 575.369 418.037 584.962 407.227 584.737 396.193 C 572.522 387.999 560.306 379.805 548.090 371.611 C 543.149 377.092 537.813 382.089 532.237 386.457 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 548.090 371.611 C 560.306 379.805 572.522 387.999 584.737 396.193 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 560.888 355.142 C 557.040 360.923 552.840 366.344 548.090 371.611 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_8)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 548.090 371.611 C 560.306 379.805 572.522 387.999 584.737 396.193 C 607.980 406.059 639.567 402.654 643.135 389.880 C 615.719 378.301 588.304 366.721 560.888 355.142 C 557.040 360.923 552.840 366.344 548.090 371.611 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 560.888 355.142 C 588.304 366.721 615.719 378.301 643.135 389.880 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 572.121 334.811 C 568.760 342.165 564.893 349.126 560.888 355.142 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_9)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 560.888 355.142 C 588.304 366.721 615.719 378.301 643.135 389.880 C 659.548 392.613 677.666 381.929 678.977 370.534 C 643.358 358.627 607.740 346.719 572.121 334.811 C 568.760 342.165 564.893 349.126 560.888 355.142 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 572.121 334.811 C 607.740 346.719 643.358 358.627 678.977 370.534 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 580.447 311.774 C 578.155 320.018 575.269 327.925 572.121 334.811 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_10)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 572.121 334.811 C 607.740 346.719 643.358 358.627 678.977 370.534 C 692.582 368.578 702.727 355.514 699.998 346.036 C 660.148 334.615 620.297 323.195 580.447 311.774 C 578.155 320.018 575.269 327.925 572.121 334.811 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 580.447 311.774 C 620.297 323.195 660.148 334.615 699.998 346.036 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 584.748 291.623 C 583.701 298.527 582.260 305.255 580.447 311.774 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S23_2_2\\\",\\\"fill\\\":\\\"url(#869651AE-1BE5-4624-A46D-8D3A8CE9B47C_11)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 580.447 311.774 C 620.297 323.195 660.148 334.615 699.998 346.036 C 711.334 345.209 728.989 324.642 712.470 319.464 C 694.018 313.679 639.096 296.762 584.748 291.623 C 583.701 298.527 582.260 305.255 580.447 311.774 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"wing_2\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S12_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 135.959 291.623 C 160.373 289.314 185.094 285.293 204.267 292.532 C 239.440 305.811 218.862 381.930 295.584 378.362 C 314.018 377.504 312.459 399.547 312.460 399.549 C 312.458 399.550 298.752 404.756 291.849 406.586 C 284.658 408.493 277.405 409.793 270.255 410.466 C 263.490 411.103 256.735 411.162 250.134 410.669 C 242.546 410.104 234.977 408.728 227.722 406.628 C 220.291 404.477 213.428 401.718 206.882 398.328 C 200.481 395.014 194.294 391.018 188.470 386.457 C 182.894 382.089 177.558 377.092 172.617 371.611 C 167.867 366.344 163.667 360.923 159.820 355.142 C 155.814 349.126 151.947 342.165 148.586 334.811 C 145.438 327.926 142.553 320.019 140.260 311.774 C 138.448 305.255 137.006 298.527 135.959 291.623 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 312.460 399.549 C 312.458 399.550 298.752 404.756 291.849 406.586 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S13_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 291.849 406.586 C 292.582 416.291 293.315 425.995 294.048 435.699 C 303.402 439.643 314.786 433.735 319.069 424.214 C 319.069 424.214 312.461 399.552 312.460 399.549 C 312.458 399.550 298.752 404.756 291.849 406.586 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 291.849 406.586 C 292.582 416.291 293.315 425.995 294.048 435.699 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 270.255 410.466 C 277.405 409.793 284.658 408.493 291.849 406.586 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S14_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_2)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 291.849 406.586 C 292.582 416.291 293.315 425.995 294.048 435.699 C 289.443 445.606 276.951 450.489 267.836 444.782 C 268.642 433.343 269.449 421.905 270.255 410.466 C 277.405 409.793 284.658 408.493 291.849 406.586 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 270.255 410.466 C 269.449 421.905 268.642 433.343 267.836 444.782 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 250.134 410.669 C 256.735 411.162 263.490 411.103 270.255 410.466 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S15_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_3)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 270.255 410.466 C 269.449 421.905 268.642 433.343 267.836 444.782 C 260.404 453.826 248.091 455.875 238.577 450.351 C 242.429 437.124 246.282 423.896 250.134 410.669 C 256.735 411.162 263.490 411.103 270.255 410.466 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 250.134 410.669 C 246.282 423.896 242.429 437.124 238.577 450.351 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 227.722 406.628 C 234.977 408.728 242.546 410.104 250.134 410.669 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S16_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_4)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 250.134 410.669 C 246.282 423.896 242.429 437.124 238.577 450.351 C 230.082 457.180 216.685 457.039 207.485 449.279 C 214.231 435.062 220.976 420.845 227.722 406.628 C 234.977 408.728 242.546 410.104 250.134 410.669 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 227.722 406.628 C 220.976 420.845 214.231 435.062 207.485 449.279 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 206.882 398.328 C 213.428 401.718 220.291 404.477 227.722 406.628 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S17_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_5)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 227.722 406.628 C 220.976 420.845 214.231 435.062 207.485 449.279 C 198.818 453.330 186.256 450.279 179.754 439.481 C 188.797 425.763 197.839 412.046 206.882 398.328 C 213.428 401.718 220.291 404.477 227.722 406.628 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 206.882 398.328 C 197.839 412.046 188.797 425.763 179.754 439.481 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 188.470 386.457 C 194.294 391.018 200.481 395.014 206.882 398.328 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S18_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_6)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 206.882 398.328 C 197.839 412.046 188.797 425.763 179.754 439.481 C 169.796 440.753 157.722 431.985 156.065 420.461 C 166.867 409.126 177.669 397.791 188.470 386.457 C 194.294 391.018 200.481 395.014 206.882 398.328 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 188.470 386.457 C 177.669 397.791 166.867 409.126 156.065 420.461 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 172.617 371.611 C 177.558 377.092 182.894 382.089 188.470 386.457 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S19_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_7)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 188.470 386.457 C 177.669 397.791 166.867 409.126 156.065 420.461 C 145.338 418.037 135.745 407.227 135.970 396.193 C 148.186 387.999 160.401 379.805 172.617 371.611 C 177.558 377.092 182.894 382.089 188.470 386.457 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 172.617 371.611 C 160.401 379.805 148.186 387.999 135.970 396.193 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 159.820 355.142 C 163.667 360.923 167.867 366.344 172.617 371.611 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S20_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_8)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 172.617 371.611 C 160.401 379.805 148.186 387.999 135.970 396.193 C 112.727 406.059 81.140 402.654 77.572 389.880 C 104.988 378.301 132.404 366.721 159.820 355.142 C 163.667 360.923 167.867 366.344 172.617 371.611 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 159.820 355.142 C 132.404 366.721 104.988 378.301 77.572 389.880 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 148.586 334.811 C 151.947 342.165 155.814 349.126 159.820 355.142 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S21_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_9)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 159.820 355.142 C 132.404 366.721 104.988 378.301 77.572 389.880 C 61.159 392.613 43.041 381.929 41.730 370.535 C 77.349 358.627 112.968 346.719 148.586 334.811 C 151.947 342.165 155.814 349.126 159.820 355.142 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 148.586 334.811 C 112.968 346.719 77.349 358.627 41.730 370.535 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 140.260 311.774 C 142.553 320.019 145.438 327.926 148.586 334.811 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S22_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_10)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 148.586 334.811 C 112.968 346.719 77.349 358.627 41.730 370.535 C 28.126 368.578 17.980 355.514 20.709 346.036 C 60.559 334.615 100.410 323.195 140.260 311.774 C 142.553 320.019 145.438 327.926 148.586 334.811 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 140.260 311.774 C 100.410 323.195 60.559 334.615 20.709 346.036 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"1\\\",\\\"strokeLinecap\\\":\\\"butt\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 135.959 291.623 C 137.006 298.527 138.448 305.255 140.260 311.774 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S23_2_2\\\",\\\"fill\\\":\\\"url(#F3F705F1-9450-4D27-9F09-0CE0D17223B7_11)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 140.260 311.774 C 100.410 323.195 60.559 334.615 20.709 346.036 C 9.374 345.210 -8.282 324.642 8.238 319.464 C 26.689 313.679 81.611 296.762 135.959 291.623 C 137.006 298.527 138.448 305.255 140.260 311.774 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":197.417,\\\"max\\\":522.583},\\\"y\\\":{\\\"min\\\":197.417,\\\"max\\\":522.583}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":593.297,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":195.436,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":525.081,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_0\\\",\\\"cx\\\":\\\"45.81%\\\",\\\"cy\\\":\\\"44.96%\\\",\\\"r\\\":\\\"90.82%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_1\\\",\\\"cx\\\":\\\"47.48%\\\",\\\"cy\\\":\\\"42.69%\\\",\\\"r\\\":\\\"78.16%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_2\\\",\\\"cx\\\":\\\"47.28%\\\",\\\"cy\\\":\\\"44.11%\\\",\\\"r\\\":\\\"75.69%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_3\\\",\\\"cx\\\":\\\"49.67%\\\",\\\"cy\\\":\\\"46.73%\\\",\\\"r\\\":\\\"76.27%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_4\\\",\\\"cx\\\":\\\"48.52%\\\",\\\"cy\\\":\\\"45.56%\\\",\\\"r\\\":\\\"78.03%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_5\\\",\\\"cx\\\":\\\"49.43%\\\",\\\"cy\\\":\\\"45.70%\\\",\\\"r\\\":\\\"78.25%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_6\\\",\\\"cx\\\":\\\"46.57%\\\",\\\"cy\\\":\\\"45.33%\\\",\\\"r\\\":\\\"72.64%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_7\\\",\\\"cx\\\":\\\"49.78%\\\",\\\"cy\\\":\\\"44.16%\\\",\\\"r\\\":\\\"65.14%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_8\\\",\\\"cx\\\":\\\"54.65%\\\",\\\"cy\\\":\\\"26.96%\\\",\\\"r\\\":\\\"96.30%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_9\\\",\\\"cx\\\":\\\"50.45%\\\",\\\"cy\\\":\\\"39.76%\\\",\\\"r\\\":\\\"83.16%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_10\\\",\\\"cx\\\":\\\"51.15%\\\",\\\"cy\\\":\\\"42.11%\\\",\\\"r\\\":\\\"74.87%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"869651AE-1BE5-4624-A46D-8D3A8CE9B47C_11\\\",\\\"cx\\\":\\\"53.19%\\\",\\\"cy\\\":\\\"42.75%\\\",\\\"r\\\":\\\"75.46%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_0\\\",\\\"cx\\\":\\\"54.19%\\\",\\\"cy\\\":\\\"44.96%\\\",\\\"r\\\":\\\"90.82%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_1\\\",\\\"cx\\\":\\\"52.52%\\\",\\\"cy\\\":\\\"42.69%\\\",\\\"r\\\":\\\"78.16%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_2\\\",\\\"cx\\\":\\\"52.72%\\\",\\\"cy\\\":\\\"44.11%\\\",\\\"r\\\":\\\"75.69%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_3\\\",\\\"cx\\\":\\\"50.33%\\\",\\\"cy\\\":\\\"46.73%\\\",\\\"r\\\":\\\"76.27%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_4\\\",\\\"cx\\\":\\\"51.48%\\\",\\\"cy\\\":\\\"45.56%\\\",\\\"r\\\":\\\"78.03%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_5\\\",\\\"cx\\\":\\\"50.57%\\\",\\\"cy\\\":\\\"45.70%\\\",\\\"r\\\":\\\"78.25%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_6\\\",\\\"cx\\\":\\\"53.43%\\\",\\\"cy\\\":\\\"45.33%\\\",\\\"r\\\":\\\"72.64%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_7\\\",\\\"cx\\\":\\\"50.22%\\\",\\\"cy\\\":\\\"44.16%\\\",\\\"r\\\":\\\"65.14%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_8\\\",\\\"cx\\\":\\\"45.35%\\\",\\\"cy\\\":\\\"26.96%\\\",\\\"r\\\":\\\"96.30%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_9\\\",\\\"cx\\\":\\\"49.55%\\\",\\\"cy\\\":\\\"39.76%\\\",\\\"r\\\":\\\"83.16%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_10\\\",\\\"cx\\\":\\\"48.85%\\\",\\\"cy\\\":\\\"42.11%\\\",\\\"r\\\":\\\"74.87%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"F3F705F1-9450-4D27-9F09-0CE0D17223B7_11\\\",\\\"cx\\\":\\\"46.81%\\\",\\\"cy\\\":\\\"42.75%\\\",\\\"r\\\":\\\"75.46%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"50.00%\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"offset\\\":\\\"100.00%\\\",\\\"color\\\":\\\"#000000\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"horn\\\",\\\"crown\\\"],\\\"creature_frequency_multiplier\\\":7}},{\\\"name\\\":\\\"woman\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":169.40208902976374,\\\"max\\\":550.1219109727842},\\\"y\\\":{\\\"min\\\":69.09144956124587,\\\"max\\\":697.2919518444442}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"woman\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hair\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"id\\\":\\\"S1\\\",\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 336.600 74.332 C 345.698 68.639 372.172 68.717 381.318 74.332 C 409.561 91.673 411.358 163.061 425.109 205.296 C 380.133 238.543 341.688 240.755 294.891 209.461 C 307.136 168.840 307.829 92.337 336.600 74.332 Z\\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"woman\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 359.956 81.246 C 338.348 81.715 331.657 102.298 331.816 113.001 C 332.010 126.002 344.975 139.880 346.183 140.693 C 349.130 142.673 347.609 155.403 346.997 162.080 C 345.686 176.379 295.567 181.197 289.687 203.853 C 284.619 223.380 275.621 237.736 268.751 259.345 C 258.611 291.248 254.754 292.192 250.879 295.384 C 227.069 315.003 216.018 340.411 208.483 341.344 C 190.173 343.610 185.190 351.289 175.899 361.370 C 171.733 365.890 184.873 358.233 192.756 353.401 C 194.716 352.200 171.571 374.273 170.414 380.364 C 169.830 383.442 190.913 363.709 191.468 364.284 C 192.040 364.877 168.982 381.266 172.303 383.790 C 174.984 385.827 194.992 366.584 195.460 367.221 C 195.907 367.830 174.136 383.486 175.942 386.145 C 177.890 389.012 199.818 368.846 200.403 370.010 C 200.913 371.027 181.099 383.950 181.233 386.974 C 181.454 391.964 213.660 367.222 216.470 363.673 C 217.457 362.426 221.852 351.743 222.384 350.053 C 223.732 345.771 239.309 336.395 248.403 329.267 C 258.231 321.563 264.349 308.781 272.403 302.315 C 287.889 289.883 309.718 236.386 309.721 236.379 C 309.722 236.382 316.461 250.739 319.269 264.114 C 325.463 293.612 321.015 311.235 310.200 333.413 C 300.798 352.692 283.817 370.527 285.766 405.992 C 288.918 463.355 305.652 483.762 314.857 530.663 C 319.563 554.644 310.333 564.958 314.714 588.039 C 320.890 620.578 324.369 644.272 323.879 652.117 C 323.727 654.557 322.580 664.985 319.335 671.734 C 316.900 676.798 316.948 679.315 315.443 680.658 C 309.380 686.068 302.859 694.302 310.456 694.110 C 316.387 693.961 314.560 686.551 317.404 685.881 C 318.579 685.604 310.217 694.631 318.939 694.273 C 322.331 694.134 322.783 686.345 324.543 686.077 C 325.610 685.914 316.961 693.112 324.412 695.068 C 328.048 696.023 328.702 686.318 331.701 685.914 C 332.762 685.771 322.202 692.154 329.867 694.637 C 334.254 696.057 336.154 686.707 338.411 685.026 C 343.276 681.403 327.114 694.895 342.612 695.390 C 355.225 695.794 348.652 683.607 345.563 677.472 C 343.420 673.217 349.983 672.040 344.441 658.104 C 337.886 641.621 355.702 608.098 354.153 575.895 C 353.600 564.415 347.619 536.579 347.445 531.079 C 347.036 518.142 355.019 513.333 358.726 425.084 C 358.803 423.243 354.454 423.862 344.350 403.488 C 342.801 400.364 350.273 415.340 359.560 422.928 C 369.286 415.512 376.886 400.410 375.174 403.488 C 364.122 423.364 360.717 423.570 360.798 425.084 C 365.508 513.346 373.564 518.153 372.743 531.079 C 372.414 536.270 364.554 562.125 363.765 572.960 C 361.378 605.715 379.741 638.946 375.385 656.483 C 373.142 665.508 377.422 668.179 373.281 673.181 C 368.849 678.534 367.715 689.719 370.344 690.446 C 375.581 691.894 386.682 689.059 388.649 689.279 C 389.735 689.400 395.355 691.539 398.412 691.950 C 405.731 692.934 400.320 697.240 415.388 696.102 C 419.679 695.778 413.462 688.723 407.914 687.236 C 405.476 686.582 412.922 689.848 412.923 689.848 C 412.923 689.848 416.424 693.780 417.278 693.978 C 424.264 695.602 416.186 687.527 416.185 687.527 C 416.186 687.527 420.179 692.250 421.986 692.262 C 427.536 692.298 420.607 687.287 420.607 687.287 C 420.608 687.287 425.479 691.259 428.281 691.032 C 431.738 690.753 425.997 686.630 425.997 686.630 C 425.997 686.630 429.347 689.545 432.551 688.779 C 434.651 688.276 428.844 684.493 425.445 684.545 C 421.243 684.609 406.696 674.605 403.020 670.646 C 400.993 668.464 399.005 665.715 395.910 657.957 C 393.210 651.188 395.989 626.314 400.268 588.703 C 403.002 564.680 400.505 554.386 406.659 529.999 C 418.253 484.049 430.999 462.887 433.758 405.992 C 435.479 370.516 418.726 352.692 409.324 333.413 C 398.509 311.235 394.061 293.612 400.255 264.114 C 403.063 250.739 409.802 236.382 409.803 236.379 C 409.806 236.386 431.635 289.883 447.121 302.315 C 455.175 308.781 461.293 321.563 471.121 329.267 C 480.215 336.395 495.793 345.771 497.140 350.053 C 497.672 351.743 502.067 362.426 503.055 363.673 C 505.864 367.222 538.070 391.964 538.291 386.974 C 538.425 383.950 518.611 371.027 519.122 370.010 C 519.706 368.846 541.635 389.012 543.582 386.145 C 545.388 383.486 523.617 367.830 524.064 367.221 C 524.532 366.584 544.540 385.827 547.221 383.790 C 550.542 381.266 527.484 364.877 528.057 364.284 C 528.611 363.709 549.694 383.442 549.110 380.364 C 547.953 374.273 524.808 352.200 526.768 353.401 C 534.651 358.233 547.791 365.890 543.625 361.370 C 534.334 351.289 529.351 343.610 511.042 341.344 C 503.506 340.411 492.455 315.003 468.645 295.384 C 464.770 292.192 460.914 291.248 450.773 259.345 C 443.904 237.736 434.905 223.380 429.837 203.853 C 423.957 181.197 373.838 176.379 372.527 162.080 C 371.915 155.403 370.438 142.737 373.341 140.693 C 374.610 139.799 386.857 128.420 387.376 110.535 C 387.647 101.204 381.843 80.772 359.956 81.246 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 329.778 223.563 C 342.161 223.563 352.152 233.553 352.152 245.937 C 352.152 258.320 342.161 268.310 329.778 268.310 C 317.394 268.310 307.404 258.320 307.404 245.937 C 307.404 233.553 317.394 223.563 329.778 223.563 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 390.585 223.564 C 378.202 223.564 368.212 233.553 368.212 245.937 C 368.212 258.320 378.202 268.311 390.585 268.311 C 402.969 268.311 412.960 258.321 412.960 245.937 C 412.959 233.553 402.969 223.564 390.585 223.564 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 319.160 210.286 C 319.168 210.286 399.893 210.286 399.901 210.286 C 399.901 210.290 399.901 245.920 399.901 245.923 C 399.893 245.923 319.168 245.923 319.160 245.923 C 319.160 245.920 319.160 210.290 319.160 210.286 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 358.914 344.242 C 358.914 341.973 359.624 341.065 360.136 341.065 C 360.648 341.065 361.358 341.973 361.358 344.242 C 361.358 346.512 360.648 347.420 360.136 347.420 C 359.624 347.420 358.914 346.512 358.914 344.242 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":270.939,\\\"max\\\":449.061},\\\"y\\\":{\\\"min\\\":12.13,\\\"max\\\":194.796}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.599,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":13.717,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":288.373,\\\"y\\\":199.772,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999871143841557,\\\"y\\\":0.00507652101831966}},{\\\"point\\\":{\\\"x\\\":431.113,\\\"y\\\":199.772,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999871143841557,\\\"y\\\":0.00507652101831966}},{\\\"point\\\":{\\\"x\\\":286.74,\\\"y\\\":418.799,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6817421514309301,\\\"y\\\":0.7315925361581587}},{\\\"point\\\":{\\\"x\\\":431.659,\\\"y\\\":418.941,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.631439802357322,\\\"y\\\":0.7754249002959257}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":545.141,\\\"y\\\":383.385,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7128990534481845,\\\"y\\\":0.7012666679606857}},{\\\"point\\\":{\\\"x\\\":175.149,\\\"y\\\":383.43,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.69870938720385,\\\"y\\\":0.7154056137836916}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":692.646,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"woman_bottom\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":276.94281485058775,\\\"max\\\":442.50418362441917},\\\"y\\\":{\\\"min\\\":368.223,\\\"max\\\":708.3466662195988}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"woman_bottom\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"woman_bottom\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 441.210 369.223 C 441.210 369.224 441.720 380.689 441.397 386.981 C 438.177 449.759 424.287 473.122 411.491 523.831 C 404.700 550.744 407.455 562.103 404.439 588.614 C 399.717 630.121 396.650 657.572 399.630 665.042 C 403.044 673.603 405.239 676.637 407.475 679.045 C 411.532 683.414 427.586 694.454 432.223 694.383 C 435.975 694.325 442.383 698.501 440.065 699.055 C 436.529 699.901 432.833 696.684 432.832 696.684 C 432.832 696.684 439.168 701.234 435.353 701.542 C 432.260 701.792 426.885 697.409 426.884 697.409 C 426.884 697.409 434.531 702.939 428.406 702.899 C 426.412 702.886 422.005 697.674 422.005 697.674 C 422.005 697.674 430.920 706.585 423.211 704.793 C 422.268 704.574 418.404 700.236 418.404 700.235 C 418.403 700.235 410.186 696.631 412.876 697.352 C 419.000 698.994 425.860 706.779 421.124 707.137 C 404.496 708.393 410.468 703.641 402.391 702.555 C 399.017 702.102 392.815 699.741 391.617 699.607 C 389.445 699.365 377.194 702.493 371.416 700.895 C 368.514 700.092 369.766 687.750 374.657 681.842 C 379.227 676.322 374.504 673.374 376.978 663.414 C 381.786 644.061 361.520 607.389 364.154 571.242 C 365.026 559.284 373.767 530.755 374.063 525.023 C 374.687 512.944 366.349 508.649 360.881 426.295 C 360.770 424.626 364.549 424.397 376.745 402.463 C 378.635 399.065 370.248 415.732 359.514 423.917 C 349.265 415.542 341.020 399.015 342.729 402.463 C 353.880 424.947 358.705 424.265 358.594 426.295 C 354.106 508.630 345.894 512.942 346.144 525.023 C 346.270 531.094 352.938 561.811 353.547 574.480 C 355.257 610.018 335.595 647.013 342.829 665.203 C 348.945 680.583 341.703 681.882 344.068 686.577 C 347.477 693.347 354.730 706.797 340.811 706.352 C 323.708 705.805 341.544 690.916 336.175 694.914 C 333.684 696.769 331.587 707.088 326.746 705.520 C 318.288 702.781 329.941 695.736 328.770 695.894 C 325.461 696.340 324.738 707.050 320.727 705.996 C 312.504 703.837 322.048 695.894 320.871 696.073 C 318.929 696.370 318.430 704.965 314.687 705.119 C 305.061 705.514 314.289 695.552 312.992 695.858 C 309.854 696.596 311.870 704.774 305.325 704.939 C 296.941 705.150 304.138 696.064 310.828 690.093 C 312.489 688.612 312.437 685.834 315.124 680.246 C 318.705 672.797 319.970 661.290 320.138 658.597 C 320.679 649.939 316.840 623.792 310.024 587.882 C 305.189 562.411 315.375 551.028 310.181 524.563 C 300.024 472.804 281.693 450.277 278.077 386.981 C 277.718 380.690 278.193 369.226 278.193 369.226 C 332.532 369.225 441.193 369.223 441.210 369.223 Z\\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":369.551,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":369.418,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":277.695,\\\"y\\\":378.11,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.999987050065012,\\\"y\\\":0.0050891750092886216}},{\\\"point\\\":{\\\"x\\\":442.305,\\\"y\\\":378.11,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.999987050065012,\\\"y\\\":0.0050891750092886216}}]},\\\"meta\\\":{\\\"never_be_nested\\\":true,\\\"invert_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"woman_libra\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":110.15782991363385,\\\"max\\\":610.9011708871176},\\\"y\\\":{\\\"min\\\":26.588853232245643,\\\"max\\\":391.335}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"woman_libra\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"hair\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 30.893 C 351.304 25.711 320.529 30.986 311.071 39.783 C 295.719 54.060 299.757 64.641 287.007 78.359 C 271.845 94.671 256.896 92.443 243.129 109.948 C 229.970 126.681 236.480 140.866 223.548 157.776 C 210.142 175.304 194.238 172.647 180.952 190.266 C 164.774 211.722 170.110 222.538 157.865 251.281 C 144.524 282.598 120.828 277.847 112.926 321.080 C 107.235 352.220 135.032 388.199 135.035 388.206 C 135.057 388.206 359.694 389.335 359.716 389.335 C 359.739 389.335 586.002 388.206 586.025 388.206 C 586.027 388.199 613.824 352.220 608.133 321.080 C 600.231 277.847 576.535 282.598 563.194 251.281 C 550.949 222.538 556.285 211.722 540.107 190.266 C 526.822 172.647 510.917 175.304 497.511 157.776 C 484.579 140.866 491.090 126.681 477.930 109.948 C 464.164 92.443 449.214 94.671 434.052 78.359 C 421.302 64.641 425.295 54.109 409.989 39.783 C 400.346 30.758 368.908 25.206 360.000 30.893 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 238.869 389.276 C 229.367 379.460 212.849 364.188 213.001 338.772 C 213.175 309.516 228.915 309.432 232.464 287.051 C 236.760 259.958 228.065 251.834 236.860 229.941 C 244.511 210.896 260.329 210.133 268.136 191.151 C 275.254 173.842 265.734 163.223 272.999 145.975 C 281.535 125.708 296.411 124.191 307.389 105.135 C 316.514 89.295 310.903 80.206 322.686 63.474 C 328.737 54.882 351.951 45.201 359.860 47.497 C 367.838 45.055 391.466 54.782 397.616 63.474 C 409.438 80.179 403.789 89.295 412.914 105.135 C 423.892 124.191 438.768 125.708 447.304 145.975 C 454.569 163.223 445.049 173.842 452.167 191.151 C 459.974 210.133 475.792 210.896 483.443 229.941 C 492.238 251.834 483.543 259.958 487.839 287.051 C 491.388 309.432 507.128 309.516 507.302 338.772 C 507.453 364.188 490.936 379.460 481.434 389.276 M 197.902 389.217 C 187.619 375.727 173.109 362.245 175.108 336.664 C 177.806 302.135 196.951 303.813 203.823 277.883 C 211.215 249.991 203.598 240.671 215.152 218.708 C 225.014 199.964 240.942 200.461 250.947 181.793 C 260.244 164.445 251.759 152.365 261.285 135.143 C 271.656 116.396 286.200 116.349 298.507 98.812 C 309.418 83.265 304.391 73.445 317.762 56.914 C 325.072 47.877 351.319 38.559 359.860 41.726 C 368.691 38.462 395.126 47.779 402.541 56.914 C 415.940 73.423 410.885 83.265 421.795 98.812 C 434.103 116.349 448.647 116.396 459.017 135.143 C 468.544 152.365 460.059 164.445 469.356 181.793 C 479.360 200.461 495.289 199.964 505.151 218.708 C 516.705 240.671 509.088 249.991 516.480 277.883 C 523.352 303.813 542.497 302.135 545.195 336.664 C 547.194 362.245 532.684 375.727 522.401 389.217 M 163.836 387.177 C 155.470 375.593 139.720 358.199 141.998 335.698 C 146.282 293.389 169.713 296.248 180.139 265.004 C 189.650 236.502 183.479 226.474 197.356 204.673 C 208.984 186.408 224.932 187.983 236.691 169.802 C 247.816 152.601 240.310 139.428 251.664 122.377 C 263.789 104.168 278.550 105.217 292.360 88.249 C 304.321 73.553 299.757 63.232 314.365 47.850 C 322.815 38.952 351.479 31.960 360.140 36.140 C 369.107 31.281 397.483 38.948 405.938 47.850 C 420.546 63.231 415.982 73.553 427.943 88.249 C 441.752 105.217 456.513 104.168 468.639 122.377 C 479.993 139.428 472.487 152.601 483.612 169.802 C 495.371 187.983 511.319 186.408 522.946 204.673 C 536.824 226.474 530.653 236.502 540.164 265.004 C 550.590 296.248 574.021 293.389 578.305 335.698 C 580.583 358.199 564.833 375.593 556.467 387.177 \\\"},\\\"children\\\":[]}]},{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"woman_top\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 441.484 389.126 C 441.484 389.125 439.950 383.294 439.444 380.565 C 437.561 372.942 435.359 366.089 432.518 359.854 C 426.836 347.383 419.620 337.146 414.433 326.508 C 402.498 302.034 397.588 282.585 404.424 250.032 C 407.523 235.272 414.960 219.428 414.961 219.425 C 414.966 219.433 440.763 298.306 463.946 294.492 C 480.123 291.830 494.619 272.902 503.640 252.355 C 510.401 236.958 519.230 207.777 521.861 207.440 C 523.992 207.167 537.960 207.854 539.871 207.582 C 543.535 207.059 576.830 191.319 577.146 187.553 C 577.535 182.911 546.641 188.706 546.638 188.706 C 546.634 188.706 511.074 187.601 511.069 187.602 C 511.065 187.609 502.652 205.907 468.449 258.074 C 463.528 265.580 462.729 254.875 455.065 230.721 C 449.226 212.316 441.291 200.182 437.070 183.531 C 430.723 158.492 375.271 153.211 373.824 137.431 C 373.149 130.062 371.543 116.117 374.723 113.828 C 376.018 112.896 388.078 100.877 388.395 82.487 C 388.562 72.797 382.651 51.588 359.928 52.081 C 337.106 51.474 331.270 72.793 331.435 82.487 C 331.748 100.877 343.812 112.896 345.108 113.828 C 348.287 116.117 346.681 130.062 346.006 137.431 C 344.559 153.211 289.107 158.492 282.760 183.531 C 278.539 200.182 270.604 212.316 264.765 230.721 C 257.101 254.875 256.302 265.580 251.381 258.074 C 217.179 205.907 208.765 187.609 208.761 187.602 C 208.756 187.601 173.196 188.555 173.192 188.555 C 173.189 188.555 142.545 184.037 143.156 188.579 C 143.648 192.235 175.019 206.588 179.487 206.638 C 183.121 206.678 195.819 206.942 197.969 207.440 C 204.334 208.915 209.429 236.958 216.190 252.355 C 225.212 272.902 239.707 291.830 255.884 294.492 C 279.067 298.306 304.864 219.433 304.869 219.425 C 304.870 219.428 312.307 235.272 315.406 250.032 C 322.242 282.585 317.333 302.034 305.397 326.508 C 300.210 337.146 292.994 347.383 287.312 359.854 C 284.471 366.089 282.269 372.942 280.386 380.565 C 279.881 383.294 278.346 389.125 278.346 389.126 C 278.362 389.126 441.468 389.126 441.484 389.126 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 326.647 205.282 C 340.314 205.282 351.339 216.306 351.339 229.972 C 351.339 243.639 340.314 254.663 326.647 254.663 C 312.981 254.663 301.956 243.639 301.957 229.972 C 301.957 216.306 312.981 205.282 326.647 205.282 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 393.753 205.282 C 380.087 205.282 369.062 216.306 369.062 229.972 C 369.062 243.639 380.087 254.664 393.753 254.664 C 407.420 254.664 418.445 243.639 418.445 229.972 C 418.444 216.306 407.419 205.282 393.753 205.282 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 314.931 190.629 C 314.939 190.629 404.025 190.629 404.034 190.629 C 404.034 190.633 404.034 229.954 404.034 229.958 C 404.025 229.958 314.939 229.958 314.931 229.958 C 314.931 229.954 314.931 190.633 314.931 190.629 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 530.501 195.724 C 535.950 193.540 541.399 191.356 546.847 189.172 M 537.546 199.350 C 545.677 195.197 553.808 191.043 561.940 186.890 M 547.023 199.526 C 555.154 195.255 563.285 190.985 571.416 186.715 \\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 187.228 195.724 C 182.327 193.540 177.425 191.356 172.523 189.172 M 181.824 199.350 C 173.693 195.197 165.562 191.043 157.431 186.890 M 172.347 199.526 C 164.216 195.255 156.085 190.985 147.954 186.715 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":95.055,\\\"max\\\":255.587},\\\"y\\\":{\\\"min\\\":29.143,\\\"max\\\":189.675}},{\\\"x\\\":{\\\"min\\\":464.412,\\\"max\\\":624.945},\\\"y\\\":{\\\"min\\\":29.142,\\\"max\\\":189.675}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":388.743,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360.092,\\\"y\\\":30.127,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":144.567,\\\"y\\\":277.887,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872723162575,\\\"y\\\":0.0050453152023373134}},{\\\"point\\\":{\\\"x\\\":575.433,\\\"y\\\":277.887,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872723162575,\\\"y\\\":0.0050453152023373195}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":388.742,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"never_be_nested\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"woman_stand\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":167.0731740631161,\\\"max\\\":580.2318433376647},\\\"y\\\":{\\\"min\\\":15.850238606848176,\\\"max\\\":696.2289494683224}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"woman_stand\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"woman_stand\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 329.247 19.816 C 319.781 23.012 312.184 28.258 306.026 36.127 C 302.455 40.690 302.921 46.524 299.617 51.284 C 296.510 55.759 290.514 56.920 288.398 61.940 C 285.323 69.237 292.870 77.256 289.462 84.404 C 286.394 90.840 276.118 90.034 273.279 96.574 C 270.730 102.447 277.866 108.950 275.002 114.676 C 272.898 118.882 265.912 117.816 263.868 122.051 C 261.072 127.841 268.784 134.309 266.137 140.168 C 264.044 144.803 256.435 143.950 254.428 148.622 C 251.716 154.940 253.500 162.468 257.764 167.861 C 262.867 174.316 271.199 176.587 279.428 176.627 C 287.799 176.668 293.250 169.051 301.541 167.893 C 309.573 166.771 317.220 173.767 324.467 170.125 C 350.271 157.154 337.260 117.022 354.342 93.734 C 360.028 85.982 374.456 85.216 374.763 75.606 C 375.609 49.074 378.563 45.432 373.231 35.742 C 369.369 28.725 362.802 20.731 351.019 18.641 C 344.579 17.498 336.521 17.360 329.247 19.816 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 280.773 662.206 C 280.743 659.106 273.489 669.770 273.191 666.684 C 272.429 658.790 280.887 655.196 285.862 649.597 C 293.552 640.942 307.670 632.404 309.968 627.234 C 315.265 615.318 302.858 578.162 305.348 551.597 C 306.883 535.224 316.857 515.054 316.169 506.162 C 313.379 470.076 302.929 438.501 294.392 402.028 C 290.934 387.255 286.997 373.582 287.776 357.885 C 289.293 327.287 310.211 304.772 311.452 274.162 C 312.130 257.452 303.509 227.340 303.508 227.335 C 303.506 227.340 289.368 255.869 282.994 271.936 C 278.457 283.375 277.192 293.992 271.746 305.027 C 261.342 326.106 243.010 348.628 233.670 359.865 C 230.969 363.113 225.282 369.159 220.333 373.816 C 213.776 379.989 204.929 391.651 200.760 390.280 C 197.094 389.074 211.794 373.600 211.796 373.599 C 211.793 373.601 188.667 393.191 185.767 392.560 C 181.103 391.546 202.634 374.526 202.636 374.524 C 202.634 374.525 179.898 393.575 177.621 390.162 C 176.181 388.005 198.756 370.776 198.758 370.774 C 198.756 370.776 175.202 391.032 173.241 388.986 C 169.446 385.023 193.579 365.460 193.581 365.457 C 193.579 365.459 170.754 386.223 169.144 382.697 C 167.778 379.706 186.604 362.018 188.271 359.907 C 188.777 359.266 194.347 356.735 194.348 356.735 C 194.349 356.735 203.029 353.176 203.030 353.176 C 203.032 353.175 215.350 349.060 218.149 346.332 C 229.820 334.957 231.830 305.134 241.712 281.271 C 245.045 273.223 253.911 267.379 256.451 261.403 C 262.327 247.580 261.780 224.937 263.521 204.620 C 264.997 187.389 266.143 171.559 275.428 156.969 C 280.461 149.061 287.261 143.980 295.456 139.429 C 305.231 134.000 317.532 132.362 323.504 122.492 C 326.610 117.359 326.315 111.535 325.581 105.581 C 325.126 101.889 321.670 99.344 322.007 95.639 C 322.515 90.046 330.116 87.776 330.560 82.178 C 330.875 78.220 326.478 75.646 326.453 71.675 C 326.428 67.594 330.588 64.918 330.563 60.836 C 330.538 56.866 325.249 54.117 326.456 50.334 C 327.982 45.548 336.358 47.439 338.684 42.987 C 340.831 38.875 334.660 33.127 337.927 29.834 C 343.994 23.718 354.942 29.719 361.877 34.828 C 368.207 39.492 369.102 47.363 372.868 54.264 C 374.562 57.368 376.447 59.786 377.565 63.140 C 380.400 71.642 384.892 80.448 380.746 88.394 C 377.231 95.131 365.301 92.074 361.871 98.854 C 357.078 108.325 360.626 120.147 367.126 128.539 C 378.393 143.084 402.176 135.044 415.894 147.305 C 437.475 166.592 439.363 195.127 451.195 221.542 C 455.177 230.431 460.233 244.696 462.032 246.993 C 467.688 254.216 507.758 280.224 534.677 294.830 C 541.124 298.328 547.400 299.617 553.606 303.525 C 560.683 307.981 579.625 315.768 571.819 318.769 C 570.315 319.347 564.933 314.923 560.845 313.778 C 558.474 313.113 554.914 310.585 553.914 312.836 C 552.876 315.170 559.519 325.643 564.948 330.631 C 568.754 334.128 580.316 332.960 577.904 337.531 C 577.239 338.790 569.790 337.854 565.901 336.128 C 561.280 334.076 555.358 326.399 555.202 326.550 C 555.051 326.697 559.772 334.689 563.671 337.712 C 566.950 340.254 575.470 338.336 574.495 342.369 C 574.128 343.889 567.535 343.899 564.091 342.648 C 558.196 340.507 551.458 330.082 551.276 330.279 C 551.120 330.449 555.683 339.481 559.702 343.082 C 562.589 345.669 570.857 344.658 569.419 348.257 C 568.458 350.663 559.667 347.296 555.285 344.610 C 550.170 341.476 544.289 331.540 544.124 331.737 C 544.018 331.864 546.457 338.614 548.793 341.707 C 550.678 344.203 554.965 344.501 555.448 347.591 C 556.334 353.256 544.182 342.912 539.609 337.093 C 532.075 327.507 523.436 310.093 521.051 307.861 C 515.266 302.448 456.728 280.746 445.540 271.194 C 437.973 264.733 412.150 225.284 412.146 225.280 C 412.147 225.283 410.901 245.553 412.782 256.322 C 417.313 282.273 435.303 300.397 438.648 326.527 C 442.019 352.870 435.894 375.444 431.210 401.585 C 424.394 439.622 405.638 470.187 402.792 507.590 C 401.708 521.838 406.970 534.571 406.098 549.265 C 404.785 571.364 397.955 589.183 393.023 610.765 C 389.774 624.982 381.070 645.506 383.232 651.008 C 385.603 657.041 406.265 665.549 421.455 675.523 C 422.939 676.497 423.723 679.264 422.421 680.472 C 420.149 682.582 413.991 673.255 414.677 676.279 C 414.751 676.605 419.741 679.694 420.724 682.617 C 421.032 683.530 421.415 684.761 420.654 685.352 C 418.041 687.381 413.775 678.416 413.138 679.714 C 412.431 681.159 417.695 683.300 418.981 686.048 C 419.370 686.878 420.057 687.895 419.476 688.605 C 416.964 691.674 410.396 680.743 409.774 682.883 C 409.378 684.243 416.431 686.189 417.260 689.643 C 417.631 691.187 418.223 693.440 416.054 693.989 C 413.229 694.705 410.617 693.685 407.879 692.684 C 404.962 691.618 403.139 689.450 400.336 688.112 C 395.772 685.935 391.214 685.809 386.777 683.386 C 382.787 681.207 380.686 677.421 376.584 675.462 C 369.867 672.255 359.813 677.431 355.901 671.100 C 351.947 664.701 360.240 655.888 361.357 650.445 C 362.924 642.818 365.081 631.340 365.623 620.813 C 367.081 592.503 358.072 568.647 360.905 540.441 C 361.974 529.800 366.797 521.521 367.899 510.883 C 368.588 504.238 367.305 498.584 367.626 491.910 C 368.984 463.673 376.566 440.518 377.884 412.279 C 378.441 400.336 376.180 379.578 377.115 378.331 C 381.933 371.912 395.765 355.283 395.767 355.280 C 395.765 355.282 378.311 377.556 377.137 377.197 C 375.371 376.658 347.815 347.483 347.812 347.480 C 347.815 347.483 366.045 365.226 375.980 379.944 C 376.723 381.044 376.479 403.013 375.612 415.504 C 373.704 442.962 366.047 465.435 364.864 492.934 C 364.573 499.680 366.197 505.389 365.464 512.102 C 364.305 522.737 360.541 531.165 357.596 541.450 C 350.713 565.487 343.063 585.137 336.697 609.315 C 334.449 617.851 331.913 624.967 331.143 633.760 C 330.619 639.734 334.934 645.667 331.799 650.779 C 327.924 657.098 318.362 654.588 312.433 659.037 C 306.344 663.605 303.619 674.503 294.412 678.820 C 287.979 681.836 284.142 690.737 277.178 689.321 C 275.654 689.011 273.766 688.266 273.958 686.296 C 274.655 679.157 289.587 672.513 289.099 672.663 C 281.095 675.126 273.892 689.317 272.560 680.133 C 271.986 676.177 288.380 668.538 284.893 665.989 C 284.222 665.499 271.717 680.719 271.773 672.915 C 271.815 667.145 280.810 666.066 280.773 662.206 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 339.472 58.108 C 339.473 58.107 343.932 49.639 348.400 48.162 C 352.292 46.875 359.841 50.306 359.842 50.306 C 359.842 50.307 355.576 56.122 352.875 57.377 C 349.224 59.075 339.473 58.108 339.472 58.108 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 405.462 208.805 C 405.563 207.922 406.551 205.458 408.894 205.536 C 411.251 205.615 412.112 208.156 412.115 209.050 C 412.119 210.080 411.035 213.277 408.329 213.029 C 405.814 212.799 405.354 209.756 405.462 208.805 M 310.365 215.162 C 310.431 212.718 311.287 210.708 314.386 210.560 C 317.239 210.424 318.498 213.333 318.539 214.354 C 318.581 215.415 317.482 218.444 314.516 218.600 C 311.783 218.745 310.338 216.141 310.365 215.162 M 407.428 178.180 C 409.847 186.595 423.656 200.014 421.417 209.966 C 419.705 217.576 415.019 227.028 402.014 228.096 C 380.359 229.874 367.306 213.493 367.463 200.508 M 349.213 207.973 C 349.533 220.445 337.572 234.075 319.183 234.173 C 306.928 234.238 300.827 226.054 297.912 218.266 C 293.845 207.397 303.095 200.124 307.335 182.414 \\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":318.411,\\\"max\\\":407.442},\\\"y\\\":{\\\"min\\\":234.841,\\\"max\\\":345.658}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":343.316,\\\"y\\\":688.001,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":342.125,\\\"y\\\":21.385,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":418.588,\\\"y\\\":147.818,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7533266748757774,\\\"y\\\":-0.6576465014889114}},{\\\"point\\\":{\\\"x\\\":268.443,\\\"y\\\":160.834,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.8560932630537712,\\\"y\\\":-0.5168213665803171}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":289.153,\\\"y\\\":365.781,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6987219168874518,\\\"y\\\":0.7153933763050404}},{\\\"point\\\":{\\\"x\\\":439.072,\\\"y\\\":367.27,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129430797239381,\\\"y\\\":0.7012219085808332}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":343.316,\\\"y\\\":676.325,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"invert_nested\\\":true,\\\"rotate_clockwise\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}},{\\\"name\\\":\\\"woman_top\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":149.76583426659028,\\\"max\\\":569.7091657308556},\\\"y\\\":{\\\"min\\\":96.52332220511795,\\\"max\\\":452.683}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"halves\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"woman_top\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"woman_top\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#ffffff\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.387 383.482 C 381.103 383.474 388.625 389.771 410.626 381.163 C 424.126 375.882 427.779 369.350 440.964 363.325 C 449.475 359.436 455.686 362.365 462.426 355.873 C 472.144 346.511 467.824 337.308 473.248 324.952 C 477.740 314.720 486.310 315.420 485.963 300.988 C 485.461 280.117 476.089 283.542 473.248 270.067 C 469.963 254.486 477.713 246.454 472.475 231.416 C 467.762 217.884 457.784 216.514 451.603 203.587 C 444.109 187.910 451.183 177.081 441.554 162.617 C 435.074 152.882 427.476 155.263 419.191 145.127 C 410.494 134.488 413.228 127.765 405.927 118.441 C 394.959 104.434 381.029 97.601 360.387 97.524 C 339.453 97.445 325.231 104.271 314.073 118.448 C 306.750 127.752 309.504 134.490 300.809 145.127 C 292.523 155.262 284.926 152.882 278.446 162.617 C 268.817 177.081 275.891 187.910 268.397 203.587 C 262.217 216.514 252.238 217.884 247.525 231.416 C 242.287 246.454 250.037 254.486 246.752 270.067 C 243.911 283.542 234.539 280.117 234.037 300.988 C 233.691 315.420 242.260 314.720 246.752 324.952 C 252.176 337.308 247.855 346.511 257.574 355.873 C 264.314 362.365 270.525 359.436 279.036 363.325 C 292.221 369.350 295.823 376.014 309.373 381.164 C 330.965 389.370 339.352 383.491 360.387 383.482 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 439.444 443.122 C 437.561 435.499 435.359 428.646 432.518 422.411 C 426.836 409.940 419.620 399.703 414.433 389.065 C 402.498 364.591 397.588 345.143 404.424 312.589 C 407.523 297.829 414.960 281.985 414.961 281.982 C 414.965 281.990 439.054 341.027 456.144 354.747 C 465.032 361.883 471.784 375.989 482.630 384.491 C 492.665 392.356 509.857 402.704 511.344 407.430 C 511.931 409.294 516.781 421.083 517.871 422.460 C 520.971 426.376 556.513 453.681 556.757 448.174 C 556.904 444.837 535.039 430.575 535.602 429.453 C 536.247 428.169 560.447 450.423 562.595 447.260 C 564.589 444.325 540.563 427.047 541.056 426.376 C 541.573 425.672 563.653 446.908 566.612 444.660 C 570.277 441.875 544.830 423.789 545.462 423.134 C 546.075 422.500 569.341 444.277 568.696 440.880 C 567.419 434.157 541.877 409.799 544.040 411.124 C 552.740 416.456 567.241 424.907 562.643 419.918 C 552.390 408.794 546.891 400.319 526.685 397.818 C 518.370 396.789 506.173 368.749 479.898 347.099 C 475.622 343.575 471.365 342.534 460.174 307.327 C 452.593 283.479 442.663 267.636 437.070 246.088 C 430.581 221.085 375.271 215.768 373.824 199.988 C 373.149 192.619 371.543 178.674 374.723 176.385 C 376.018 175.453 388.078 163.434 388.395 145.044 C 388.562 135.354 382.651 114.145 359.928 114.638 C 337.495 115.125 330.684 136.492 330.714 147.605 C 330.750 160.951 343.520 175.539 344.752 176.385 C 347.981 178.604 346.326 192.619 345.650 199.988 C 344.204 215.768 288.894 221.085 282.405 246.088 C 276.812 267.636 266.881 283.479 259.301 307.327 C 248.110 342.534 243.853 343.575 239.577 347.099 C 213.302 368.749 201.105 396.789 192.790 397.818 C 172.584 400.319 167.085 408.794 156.831 419.918 C 152.234 424.907 166.735 416.456 175.435 411.124 C 177.597 409.799 152.055 434.157 150.779 440.880 C 150.134 444.277 173.400 422.500 174.012 423.134 C 174.645 423.789 149.198 441.875 152.863 444.660 C 155.822 446.908 177.902 425.672 178.419 426.376 C 178.912 427.047 154.886 444.325 156.879 447.260 C 159.028 450.423 183.228 428.169 183.873 429.453 C 184.436 430.575 162.570 444.837 162.718 448.174 C 162.962 453.681 198.504 426.376 201.604 422.460 C 202.694 421.083 207.544 409.294 208.131 407.430 C 209.618 402.704 226.809 392.356 236.844 384.491 C 247.691 375.989 254.443 361.883 263.331 354.747 C 280.420 341.027 304.510 281.990 304.514 281.982 C 304.515 281.985 311.951 297.829 315.051 312.589 C 321.886 345.143 316.977 364.591 305.042 389.065 C 299.854 399.703 292.576 409.943 286.862 422.416 C 284.006 428.652 281.456 435.429 279.924 443.128 C 279.264 445.675 279.024 447.169 278.091 451.408 C 278.107 451.408 441.468 451.683 441.484 451.683 C 441.484 451.682 439.950 445.851 439.444 443.122 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 326.647 267.839 C 340.314 267.839 351.339 278.863 351.339 292.530 C 351.339 306.196 340.314 317.221 326.647 317.220 C 312.981 317.220 301.956 306.196 301.957 292.530 C 301.957 278.863 312.981 267.839 326.647 267.839 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 393.753 267.839 C 380.087 267.839 369.062 278.863 369.062 292.530 C 369.062 306.196 380.087 317.221 393.753 317.221 C 407.420 317.221 418.445 306.196 418.445 292.530 C 418.444 278.863 407.419 267.839 393.753 267.839 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#ffffff\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"none\\\",\\\"d\\\":\\\"M 314.931 253.187 C 314.939 253.187 404.025 253.187 404.034 253.187 C 404.034 253.190 404.034 292.511 404.034 292.515 C 404.025 292.515 314.939 292.515 314.931 292.515 C 314.931 292.511 314.931 253.190 314.931 253.187 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"none\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"2\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 358.802 401.017 C 358.802 398.512 359.585 397.511 360.150 397.511 C 360.716 397.511 361.499 398.512 361.499 401.017 C 361.499 403.522 360.716 404.523 360.150 404.523 C 359.585 404.523 358.802 403.522 358.802 401.017 \\\"},\\\"children\\\":[]}]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":259.613,\\\"max\\\":460.387},\\\"y\\\":{\\\"min\\\":37.213,\\\"max\\\":237.988}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":451.3,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":275.475,\\\"y\\\":241.586,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999872880189178,\\\"y\\\":0.005042201956493386}},{\\\"point\\\":{\\\"x\\\":443.958,\\\"y\\\":241.586,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999872880189178,\\\"y\\\":0.0050422019564934075}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":451.299,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}]},\\\"meta\\\":{\\\"always_nest\\\":true,\\\"always_be_nested\\\":false,\\\"never_be_nested\\\":false,\\\"invert_nested\\\":false}},{\\\"name\\\":\\\"yoni\\\",\\\"bbox\\\":{\\\"x\\\":{\\\"min\\\":158.455,\\\"max\\\":561.545},\\\"y\\\":{\\\"min\\\":79.625,\\\"max\\\":640.375}},\\\"layers\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"yoni\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"g\\\",\\\"props\\\":{\\\"id\\\":\\\"yoni\\\"},\\\"children\\\":[{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#734A6FEA-CE16-44BD-8DD9-BF259C65C781_0)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 638.375 C 234.913 638.375 160.455 494.050 160.455 360.000 C 160.455 225.950 234.913 81.625 360.000 81.625 C 485.087 81.625 559.545 225.950 559.545 360.000 C 559.545 494.050 485.087 638.375 360.000 638.375 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"url(#734A6FEA-CE16-44BD-8DD9-BF259C65C781_1)\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 86.905 C 360.003 86.914 366.890 128.457 393.960 182.347 C 440.563 261.884 515.690 287.927 515.690 360.000 C 515.690 432.073 440.564 458.116 393.960 537.654 C 366.890 591.543 360.003 633.086 360.000 633.095 C 359.997 633.086 353.110 591.543 326.040 537.654 C 279.437 458.116 204.310 432.073 204.310 360.000 C 204.310 287.927 279.436 261.884 326.040 182.347 C 353.110 128.457 359.997 86.914 360.000 86.905 Z\\\"},\\\"children\\\":[]},{\\\"tagName\\\":\\\"path\\\",\\\"props\\\":{\\\"fill\\\":\\\"#000000\\\",\\\"fillRule\\\":\\\"evenodd\\\",\\\"stroke\\\":\\\"#000000\\\",\\\"strokeWidth\\\":\\\"4\\\",\\\"strokeLinecap\\\":\\\"round\\\",\\\"strokeLinejoin\\\":\\\"round\\\",\\\"d\\\":\\\"M 360.000 86.905 C 360.001 86.914 361.792 126.076 372.695 182.347 C 392.566 258.291 418.203 298.625 418.203 360.000 C 418.203 421.375 392.566 461.709 372.695 537.654 C 361.792 593.924 360.001 633.086 360.000 633.095 C 359.999 633.086 358.208 593.924 347.305 537.654 C 327.434 461.709 301.797 421.375 301.797 360.000 C 301.797 298.625 327.434 258.291 347.305 182.347 C 358.208 126.076 359.999 86.914 360.000 86.905 Z\\\"},\\\"children\\\":[]}]}]}],\\\"specs\\\":{\\\"nesting\\\":[{\\\"x\\\":{\\\"min\\\":298.128,\\\"max\\\":421.872},\\\"y\\\":{\\\"min\\\":268.993,\\\"max\\\":451.007}}],\\\"anchor\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":701.284,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"crown\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":83.977,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":-1}}],\\\"arm\\\":[{\\\"point\\\":{\\\"x\\\":158.386,\\\"y\\\":360.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.9999869423966429,\\\"y\\\":0.005110287292651839}},{\\\"point\\\":{\\\"x\\\":561.614,\\\"y\\\":360.935,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.9999869423966429,\\\"y\\\":0.005110287292651861}}],\\\"leg\\\":[{\\\"point\\\":{\\\"x\\\":503.604,\\\"y\\\":555.5,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129295332816484,\\\"y\\\":0.7012356811905758}},{\\\"point\\\":{\\\"x\\\":216.144,\\\"y\\\":555.563,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.698724731626487,\\\"y\\\":0.715390627149597}}],\\\"tail\\\":[{\\\"point\\\":{\\\"x\\\":360,\\\"y\\\":639.641,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0,\\\"y\\\":1}}],\\\"horn\\\":[{\\\"point\\\":{\\\"x\\\":216.144,\\\"y\\\":165.236,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":-0.6986964927886371,\\\"y\\\":-0.71541820704037}},{\\\"point\\\":{\\\"x\\\":503.604,\\\"y\\\":165.299,\\\"t\\\":0},\\\"normal\\\":{\\\"x\\\":0.7129295332816484,\\\"y\\\":-0.7012356811905758}}]},\\\"defs\\\":[{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"734A6FEA-CE16-44BD-8DD9-BF259C65C781_0\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"50.00%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"18.04%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"87.84%\\\",\\\"color\\\":\\\"#ffffff\\\"}]},{\\\"type\\\":\\\"radialGradient\\\",\\\"id\\\":\\\"734A6FEA-CE16-44BD-8DD9-BF259C65C781_1\\\",\\\"cx\\\":\\\"50.00%\\\",\\\"cy\\\":\\\"50.00%\\\",\\\"r\\\":\\\"50.00%\\\",\\\"stops\\\":[{\\\"offset\\\":\\\"0.00%\\\",\\\"color\\\":\\\"#000000\\\"},{\\\"offset\\\":\\\"56.08%\\\",\\\"color\\\":\\\"#ffffff\\\"}]}],\\\"meta\\\":{\\\"always_nest\\\":true,\\\"attach_to\\\":[\\\"tail\\\",\\\"leg\\\",\\\"arm\\\",\\\"horn\\\",\\\"crown\\\"]}}]\");\nexport default _SvgVocabulary;", "import React from \"react\";\nimport { Checkbox } from \"./checkbox\";\nimport { ColorWidget } from \"./color-widget\";\nimport { NumericSlider } from \"./numeric-slider\";\nimport { SvgSymbolContext, swapColors } from \"./svg-symbol\";\n\nexport type SymbolContextWidgetProps<T extends SvgSymbolContext> = {\n ctx: T;\n onChange: (value: T) => void;\n children?: any;\n extraButtons?: JSX.Element;\n};\n\nexport function SymbolContextWidget<T extends SvgSymbolContext>({\n ctx,\n children,\n onChange,\n extraButtons,\n}: SymbolContextWidgetProps<T>): JSX.Element {\n const updateCtx = (updates: Partial<SvgSymbolContext>) => {\n onChange({ ...ctx, ...updates });\n };\n\n return (\n <div className=\"thingy\">\n {children}\n <ColorWidget\n label=\"Stroke\"\n value={ctx.stroke}\n onChange={(stroke) => updateCtx({ stroke })}\n />{\" \"}\n <ColorWidget\n label=\"Fill\"\n value={ctx.fill}\n onChange={(fill) => updateCtx({ fill })}\n />{\" \"}\n <button onClick={() => updateCtx(swapColors(ctx))}>\n Swap stroke/fill\n </button>{\" \"}\n {extraButtons}\n <Checkbox\n label=\"Show specs\"\n value={ctx.showSpecs}\n onChange={(showSpecs) => updateCtx({ showSpecs })}\n />\n <Checkbox\n label=\"Disable gradients\"\n value={ctx.disableGradients}\n onChange={(disableGradients) => updateCtx({ disableGradients })}\n />\n {ctx.uniformStrokeWidth !== undefined && (\n <div className=\"thingy\">\n <NumericSlider\n label=\"Stroke width\"\n min={0}\n max={3}\n step={0.1}\n value={ctx.uniformStrokeWidth}\n onChange={(uniformStrokeWidth) => updateCtx({ uniformStrokeWidth })}\n />\n </div>\n )}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\n\nimport \"./hover-debug-helper.css\";\n\nfunction getTargetPathInfo(target: SVGElement): string[] {\n const path: string[] = [];\n let node = target;\n while (true) {\n const {\n specType,\n specIndex,\n symbolName,\n attachParent,\n attachType,\n attachIndex,\n } = node.dataset;\n if (specType && specIndex) {\n path.unshift(`${specType}[${specIndex}]`);\n } else if (symbolName) {\n path.unshift(symbolName);\n } else if (attachParent && attachType && attachIndex && path.length) {\n const i = path.length - 1;\n path[i] = `${path[i]}@${attachParent}.${attachType}[${attachIndex}]`;\n }\n if (node.parentNode instanceof SVGElement) {\n node = node.parentNode;\n } else {\n break;\n }\n }\n return path;\n}\n\nexport const HoverDebugHelper: React.FC<{\n children: any;\n}> = (props) => {\n type HoverInfo = {\n x: number;\n y: number;\n text: string;\n };\n let [hoverInfo, setHoverInfo] = useState<HoverInfo | null>(null);\n const clearHoverInfo = () => setHoverInfo(null);\n const handleMouseMove: React.MouseEventHandler = (e) => {\n const { target } = e;\n if (target instanceof SVGElement) {\n const x = e.clientX + window.scrollX;\n const y = e.clientY + window.scrollY;\n const path = getTargetPathInfo(target);\n if (path.length) {\n setHoverInfo({ x, y, text: path.join(\".\") });\n return;\n }\n }\n clearHoverInfo();\n };\n\n return (\n <div onMouseMove={handleMouseMove} onMouseLeave={clearHoverInfo}>\n {hoverInfo && (\n <div\n className=\"hover-debug-helper\"\n style={{\n position: \"absolute\",\n pointerEvents: \"none\",\n top: `${hoverInfo.y}px`,\n left: `${hoverInfo.x}px`,\n }}\n >\n {hoverInfo.text}\n </div>\n )}\n {props.children}\n </div>\n );\n};\n", "import { createPageWithShareableState } from \"../../page-with-shareable-state\";\nimport { CreaturePageWithDefaults, CREATURE_DESIGN_DEFAULTS } from \"./core\";\nimport {\n deserializeCreatureDesign,\n serializeCreatureDesign,\n} from \"./serialization\";\n\nexport const CreaturePage = createPageWithShareableState({\n defaultValue: CREATURE_DESIGN_DEFAULTS,\n serialize: serializeCreatureDesign,\n deserialize: deserializeCreatureDesign,\n component: CreaturePageWithDefaults,\n});\n", "import React, { useCallback, useContext, useEffect, useState } from \"react\";\nimport { PageContext, PAGE_QUERY_ARG } from \"./page\";\nimport type { PageName } from \"./pages\";\n\nexport type ComponentWithShareableStateProps<T> = {\n /** The default state to use when the component is first rendered. */\n defaults: T;\n\n /**\n * Callback to trigger whenever the shareable state changes. Note\n * that each call will add a new entry to the browser's navigation history.\n * As such, every call to this function will mark a boundary where the\n * user can press the \"back\" button to go back to the previous state.\n */\n onChange: (value: T) => void;\n};\n\nexport type PageWithShareableStateOptions<T> = {\n /** The default shareable state. */\n defaultValue: T;\n\n /**\n * Deserialize the given state, throwing an exception\n * if it's invalid in any way.\n */\n deserialize: (value: string) => T;\n\n /** Serialize the given state to a string. */\n serialize: (value: T) => string;\n\n /** Component to render the page. */\n component: React.ComponentType<ComponentWithShareableStateProps<T>>;\n};\n\n/** The query string argument that will store the serialized state. */\nexport const STATE_QUERY_ARG = \"s\";\n\nexport function createPageWithStateSearchParams(\n page: PageName,\n state: string\n): URLSearchParams {\n const search = new URLSearchParams();\n search.set(PAGE_QUERY_ARG, page);\n search.set(STATE_QUERY_ARG, state);\n return search;\n}\n\nconst DeserializationErrorModal: React.FC = () => {\n const [show, setShow] = useState(true);\n\n if (!show) return null;\n\n // TODO: This isn't accessible at all; it ought to trap keyboard focus,\n // disappear when the user presses ESC, and so on.\n\n return (\n <div className=\"page-error\">\n <div>\n <p>\n Sorry, an error occurred when trying to load the composition on this\n page.\n </p>\n <p>\n Either its data is corrupted, or displaying it is no longer supported.\n </p>\n <button onClick={() => setShow(false)}>OK</button>\n </div>\n </div>\n );\n};\n\n/**\n * Create a component that represents a page which exposes some\n * aspect of its state in the current URL, so that it can be\n * easily shared, recorded in the browser history, etc.\n */\nexport function createPageWithShareableState<T>({\n defaultValue,\n deserialize,\n serialize,\n component,\n}: PageWithShareableStateOptions<T>): React.FC<{}> {\n const Component = component;\n\n const PageWithShareableState: React.FC<{}> = () => {\n const { search, pushState, currPage } = useContext(PageContext);\n\n /** The current serialized state, as reflected in the URL bar. */\n const state = search.get(STATE_QUERY_ARG) || serialize(defaultValue);\n\n /**\n * What we think the latest serialized state is; used to determine whether\n * the user navigated in their browser history.\n */\n const [latestState, setLatestState] = useState(state);\n\n /**\n * The key to use when rendering our page component. This will\n * be incremented whenever the user navigates their browser\n * history, to ensure that our component resets itself to the\n * default state we pass in.\n */\n const [key, setKey] = useState(0);\n\n /**\n * Remembers whether we're in the middle of an update triggered by\n * our own component.\n */\n const [isInOnChange, setIsInOnChange] = useState(false);\n\n /** The default state from the URL, which we'll pass into our component. */\n let defaults: T = defaultValue;\n\n let didDeserializeThrow = false;\n\n try {\n defaults = deserialize(state || \"\");\n } catch (e) {\n console.log(`Error deserializing state: ${e}`);\n didDeserializeThrow = true;\n }\n\n const onChange = useCallback(\n (value: T) => {\n const newState = serialize(value);\n if (state !== newState) {\n const newSearch = createPageWithStateSearchParams(currPage, newState);\n setIsInOnChange(true);\n setLatestState(newState);\n pushState(\"?\" + newSearch.toString());\n setIsInOnChange(false);\n }\n },\n [state, currPage, pushState]\n );\n\n useEffect(() => {\n if (!isInOnChange && latestState !== state) {\n // The user navigated in their browser.\n setLatestState(state);\n setKey(key + 1);\n }\n }, [isInOnChange, state, latestState, key]);\n\n return (\n <>\n {didDeserializeThrow && <DeserializationErrorModal />}\n <Component key={key} defaults={defaults} onChange={onChange} />\n </>\n );\n };\n\n return PageWithShareableState;\n}\n", "import React, {\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { SvgVocabulary, SvgVocabularyWithBlank } from \"../../svg-vocabulary\";\nimport {\n EMPTY_SVG_SYMBOL_DATA,\n noFillIfShowingSpecs,\n SvgSymbolData,\n} from \"../../svg-symbol\";\nimport {\n AttachmentPointType,\n ATTACHMENT_POINT_TYPES,\n iterAttachmentPoints,\n} from \"../../specs\";\nimport { Random } from \"../../random\";\nimport { range } from \"../../util\";\n\nimport { AutoSizingSvg } from \"../../auto-sizing-svg\";\nimport { AnimationRenderer, ExportWidget } from \"../../export-svg\";\nimport {\n CreatureContext,\n CreatureContextType,\n CreatureSymbol,\n NestedCreatureSymbol,\n} from \"../../creature-symbol\";\nimport { HoverDebugHelper } from \"../../hover-debug-helper\";\nimport { svgScale, SvgTransform } from \"../../svg-transform\";\nimport { NumericSlider } from \"../../numeric-slider\";\nimport { Checkbox } from \"../../checkbox\";\nimport {\n CompositionContextWidget,\n createSvgCompositionContext,\n SvgCompositionContext,\n} from \"../../svg-composition-context\";\nimport { Page } from \"../../page\";\nimport { RandomizerWidget } from \"../../randomizer-widget\";\nimport { VocabularyWidget } from \"../../vocabulary-widget\";\nimport { createDistribution } from \"../../distribution\";\nimport { ComponentWithShareableStateProps } from \"../../page-with-shareable-state\";\nimport { useDebouncedEffect } from \"../../use-debounced-effect\";\nimport { useRememberedState } from \"../../use-remembered-state\";\nimport { GalleryWidget } from \"../../gallery-widget\";\nimport { serializeCreatureDesign } from \"./serialization\";\nimport { CreatureEditorWidget } from \"./creature-editor\";\nimport { useAnimationPct } from \"../../animation\";\nimport {\n CreatureAnimatorName,\n CreatureAnimators,\n CREATURE_ANIMATOR_NAMES,\n} from \"../../creature-animator\";\n\n/**\n * The minimum number of attachment points that any symbol used as the main body\n * of a creature must have.\n *\n * Note that this number is inclusive of a symbol's anchor point.\n */\nconst MIN_ROOT_ATTACHMENT_POINTS = 2;\n\nconst getFilteredDistribution = (predicate: (item: SvgSymbolData) => boolean) =>\n createDistribution(\n SvgVocabulary.items.filter(predicate),\n (s) => s.meta?.creature_frequency_multiplier ?? 1\n );\n\n/** Symbols that can be the \"root\" (i.e., main body) of a creature. */\nconst ROOT_SYMBOLS = getFilteredDistribution(\n (data) =>\n data.meta?.always_be_nested !== true &&\n Array.from(iterAttachmentPoints(data.specs || {})).length >=\n MIN_ROOT_ATTACHMENT_POINTS\n);\n\ntype AttachmentSymbolMap = {\n [key in AttachmentPointType]: SvgSymbolData[];\n};\n\n/**\n * Symbols that can be attached to the main body of a creature,\n * at a particular attachment point.\n */\nconst ATTACHMENT_SYMBOLS: AttachmentSymbolMap = (() => {\n const result = {} as AttachmentSymbolMap;\n\n for (let type of ATTACHMENT_POINT_TYPES) {\n result[type] = getFilteredDistribution((data) => {\n const { meta } = data;\n\n if (type === \"wildcard\") {\n // The wildcard attachment point type can have anything!\n return true;\n }\n\n // If we have no metadata whatsoever, it can attach anywhere.\n if (!meta) return true;\n\n if (meta.always_be_nested === true) {\n // This symbol should *only* ever be nested, so return false.\n return false;\n }\n\n // If we have no \"attach_to\", it can attach anywhere.\n if (!meta.attach_to) {\n return true;\n }\n\n // Only attach to points listed in \"attach_to\".\n return meta.attach_to.includes(type);\n });\n }\n\n return result;\n})();\n\n/** Symbols that can be nested within any part of a creature. */\nconst NESTED_SYMBOLS = getFilteredDistribution(\n // Since we don't currently support recursive nesting, ignore anything that\n // wants nested children.\n (data) =>\n data.meta?.always_nest !== true && data.meta?.never_be_nested !== true\n);\n\n/**\n * Given a parent symbol, return an array of random children to be nested within\n * it.\n *\n * Can return an empty array e.g. if the parent symbol doesn't have\n * any nesting areas.\n */\nfunction getNestingChildren(\n parent: SvgSymbolData,\n rng: Random,\n preferNesting?: boolean\n): NestedCreatureSymbol[] {\n const { meta, specs } = parent;\n if ((meta?.always_nest || preferNesting) && specs?.nesting) {\n const indices = range(specs.nesting.length);\n const child = rng.choice(NESTED_SYMBOLS);\n return [\n {\n data: child,\n attachments: [],\n nests: [],\n indices,\n invertColors: meta?.invert_nested ?? false,\n },\n ];\n }\n return [];\n}\n\n/**\n * Randomly creates a symbol with the given number of\n * types of attachments. The symbol itself, and where the\n * attachments are attached, are chosen randomly.\n */\nfunction getSymbolWithAttachments(\n numAttachmentKinds: number,\n { rng, randomlyInvert: randomlyInvertSymbols }: CreatureGeneratorOptions\n): CreatureSymbol {\n const root = rng.choice(ROOT_SYMBOLS);\n const randomlyInvertRng = rng.clone();\n const shouldInvert = () =>\n randomlyInvertSymbols ? randomlyInvertRng.bool() : false;\n const result: CreatureSymbol = {\n data: root,\n attachments: [],\n nests: getNestingChildren(root, rng, true),\n invertColors: shouldInvert(),\n };\n if (root.specs) {\n const attachmentKinds = rng.uniqueChoices(\n Array.from(iterAttachmentPoints(root.specs))\n .filter((point) => point.type !== \"anchor\")\n .map((point) => point.type),\n numAttachmentKinds\n );\n for (let kind of attachmentKinds) {\n const attachment = rng.choice(ATTACHMENT_SYMBOLS[kind]);\n const indices = range(root.specs[kind]?.length ?? 0);\n result.attachments.push({\n data: attachment,\n attachTo: kind,\n indices,\n attachments: [],\n nests: getNestingChildren(attachment, rng),\n invertColors: shouldInvert(),\n });\n }\n }\n return result;\n}\n\ntype CreatureGeneratorOptions = {\n rng: Random;\n randomlyInvert: boolean;\n};\n\ntype CreatureGenerator = (options: CreatureGeneratorOptions) => CreatureSymbol;\n\n/**\n * Each index of this array represents the algorithm we use to\n * randomly construct a creature with a particular \"complexity level\".\n *\n * For instance, the algorithm used to create a creature with\n * complexity level 0 will be the first item of this array.\n */\nconst COMPLEXITY_LEVEL_GENERATORS: CreatureGenerator[] = [\n ...range(5).map((i) => getSymbolWithAttachments.bind(null, i)),\n];\n\nconst MAX_COMPLEXITY_LEVEL = COMPLEXITY_LEVEL_GENERATORS.length - 1;\n\nconst INITIAL_COMPLEXITY_LEVEL = 2;\n\nfunction getDownloadBasename(rootSymbolName: string) {\n return `mystic-symbolic-creature-${rootSymbolName}`;\n}\n\nfunction creatureHasSymbol(\n creature: CreatureSymbol,\n symbol: SvgSymbolData\n): boolean {\n if (creature.data === symbol) return true;\n if (creature.attachments.some((a) => creatureHasSymbol(a, symbol)))\n return true;\n return creature.nests.some((n) => creatureHasSymbol(n, symbol));\n}\n\nfunction repeatUntilSymbolIsIncluded(\n symbol: SvgSymbolData,\n rng: Random,\n createCreature: (rng: Random) => CreatureSymbol,\n maxAttempts = 10_000\n): CreatureSymbol {\n if (symbol === EMPTY_SVG_SYMBOL_DATA) return createCreature(rng);\n\n for (let i = 0; i < maxAttempts; i++) {\n const creature = createCreature(rng);\n if (creatureHasSymbol(creature, symbol)) return creature;\n }\n\n // We don't want to hold up the UI forever so just log a message and\n // return *something*.\n\n console.log(\n `Tried to create a creature with the ${symbol.name} symbol ` +\n `but gave up after ${maxAttempts} attempts.`\n );\n\n return createCreature(rng);\n}\n\nexport type CreatureDesign = {\n animatorName: CreatureAnimatorName;\n compCtx: SvgCompositionContext;\n creature: CreatureSymbol;\n};\n\nexport const CREATURE_DESIGN_DEFAULTS: CreatureDesign = {\n animatorName: \"none\",\n compCtx: createSvgCompositionContext(),\n creature: {\n data: ROOT_SYMBOLS[0],\n invertColors: false,\n attachments: [],\n nests: [],\n },\n};\n\ntype AnimationWidgetProps = {\n value: CreatureAnimatorName;\n onChange: (name: CreatureAnimatorName) => void;\n};\n\nconst AnimationWidget: React.FC<AnimationWidgetProps> = (props) => {\n const id = \"animationName\";\n return (\n <div className=\"flex-widget thingy\">\n <label htmlFor={id}>Animation:</label>\n <select\n id={id}\n onChange={(e) => props.onChange(e.target.value as CreatureAnimatorName)}\n value={props.value}\n >\n {CREATURE_ANIMATOR_NAMES.map((choice) => (\n <option key={choice} value={choice}>\n {choice}\n </option>\n ))}\n </select>\n </div>\n );\n};\n\nexport const CreaturePageWithDefaults: React.FC<\n ComponentWithShareableStateProps<CreatureDesign>\n> = ({ defaults, onChange }) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const [animatorName, setAnimatorName] = useState(defaults.animatorName);\n const isAnimated = animatorName !== \"none\";\n const [randomlyInvert, setRandomlyInvert] = useRememberedState(\n \"creature-page:randomlyInvert\",\n true\n );\n const [compCtx, setCompCtx] = useState(defaults.compCtx);\n const [complexity, setComplexity] = useRememberedState(\n \"creature-page:complexity\",\n INITIAL_COMPLEXITY_LEVEL\n );\n const [creature, setCreature] = useState(defaults.creature);\n const defaultCtx = useContext(CreatureContext);\n const newRandomCreature = () => {\n setCreature(\n repeatUntilSymbolIsIncluded(\n alwaysInclude,\n new Random(Date.now()),\n (rng) =>\n COMPLEXITY_LEVEL_GENERATORS[complexity]({\n rng,\n randomlyInvert,\n })\n )\n );\n };\n const ctx: CreatureContextType = noFillIfShowingSpecs({\n ...defaultCtx,\n ...compCtx,\n });\n const [alwaysInclude, setAlwaysInclude] = useRememberedState<SvgSymbolData>(\n \"creature-page:alwaysInclude\",\n EMPTY_SVG_SYMBOL_DATA\n );\n const design: CreatureDesign = useMemo(\n () => ({\n animatorName,\n creature,\n compCtx,\n }),\n [creature, compCtx, animatorName]\n );\n\n useDebouncedEffect(\n 250,\n useCallback(() => onChange(design), [onChange, design])\n );\n\n const render = useMemo(\n () =>\n createCreatureAnimationRenderer(creature, ctx, undefined, animatorName),\n [creature, ctx, animatorName]\n );\n\n return (\n <Page title=\"Cluster!\">\n <div className=\"sidebar\">\n <CompositionContextWidget ctx={compCtx} onChange={setCompCtx} />\n <CreatureEditorWidget creature={creature} onChange={setCreature} />\n <AnimationWidget value={animatorName} onChange={setAnimatorName} />\n <RandomizerWidget\n onColorsChange={(colors) => setCompCtx({ ...compCtx, ...colors })}\n onSymbolsChange={newRandomCreature}\n >\n <div className=\"thingy\">\n <VocabularyWidget\n label=\"Always include this symbol\"\n value={alwaysInclude}\n onChange={setAlwaysInclude}\n choices={SvgVocabularyWithBlank}\n />\n </div>\n <div className=\"thingy\">\n <NumericSlider\n label=\"Random cluster complexity\"\n min={0}\n max={MAX_COMPLEXITY_LEVEL}\n step={1}\n value={complexity}\n onChange={setComplexity}\n />\n </div>\n <div className=\"thingy\">\n <Checkbox\n label=\"Randomly invert symbols\"\n value={randomlyInvert}\n onChange={setRandomlyInvert}\n />\n </div>\n </RandomizerWidget>\n <GalleryWidget\n kind=\"creature\"\n serializeValue={() => serializeCreatureDesign(design)}\n />\n <div className=\"thingy\">\n <ExportWidget\n basename={getDownloadBasename(creature.data.name)}\n svgRef={svgRef}\n animate={isAnimated && { duration: ANIMATION_PERIOD_MS, render }}\n />\n </div>\n </div>\n <CreatureCanvas\n compCtx={compCtx}\n render={render}\n ref={svgRef}\n isAnimated={isAnimated}\n />\n </Page>\n );\n};\n\nfunction createCreatureAnimationRenderer(\n creature: CreatureSymbol,\n ctx: CreatureContextType,\n scale = 0.5,\n animatorName: CreatureAnimatorName = \"none\"\n): AnimationRenderer {\n return (animPct) => {\n return (\n <SvgTransform transform={svgScale(scale)}>\n <CreatureContext.Provider value={ctx}>\n <CreatureSymbol\n {...creature}\n animPct={animPct}\n animator={CreatureAnimators[animatorName]}\n />\n </CreatureContext.Provider>\n </SvgTransform>\n );\n };\n}\n\ntype CreatureCanvasProps = {\n isAnimated: boolean;\n compCtx: SvgCompositionContext;\n render: AnimationRenderer;\n};\n\nconst ANIMATION_PERIOD_MS = 5000;\n\nconst CreatureCanvas = React.forwardRef<SVGSVGElement, CreatureCanvasProps>(\n ({ isAnimated, compCtx, render }, svgRef) => {\n const animPct = useAnimationPct(isAnimated ? ANIMATION_PERIOD_MS : 0);\n\n return (\n <div className=\"canvas\" style={{ backgroundColor: compCtx.background }}>\n <HoverDebugHelper>\n <AutoSizingSvg\n padding={100}\n ref={svgRef}\n resizeKey={render}\n bgColor={compCtx.background}\n >\n {render(animPct)}\n </AutoSizingSvg>\n </HoverDebugHelper>\n </div>\n );\n }\n);\n", "import React, { useCallback, useEffect, useRef, useState } from \"react\";\n\ntype AutoSizingSvgProps = {\n padding?: number;\n bgColor?: string;\n\n /**\n * A ref to an element that we resize the SVG dimensions\n * to match. If not provided, we'll just use the bounding\n * box of the SVG itself.\n */\n sizeToElement?: React.RefObject<HTMLElement>;\n\n /**\n * Whenever this key changes, we'll resize the SVG. If\n * it's undefined, we will use `props.children` as\n * the key.\n */\n resizeKey?: any;\n\n children: JSX.Element | JSX.Element[];\n};\n\nfunction useResizeHandler(onResize: () => void) {\n useEffect(() => {\n window.addEventListener(\"resize\", onResize);\n\n return () => {\n window.removeEventListener(\"resize\", onResize);\n };\n });\n}\n\n/**\n * An SVG element with an optional background color that\n * automatically sizes itself to either its contents, or\n * if the `sizeToElement` prop is provided, to the given\n * container.\n */\nexport const AutoSizingSvg = React.forwardRef(\n (props: AutoSizingSvgProps, ref: React.ForwardedRef<SVGSVGElement>) => {\n const { bgColor, sizeToElement } = props;\n const [x, setX] = useState(0);\n const [y, setY] = useState(0);\n const [width, setWidth] = useState(1);\n const [height, setHeight] = useState(1);\n const gRef = useRef<SVGGElement>(null);\n const resizeToElement = useCallback(() => {\n if (sizeToElement?.current) {\n const bbox = sizeToElement.current.getBoundingClientRect();\n setX(-bbox.width / 2);\n setY(-bbox.height / 2);\n setWidth(bbox.width);\n setHeight(bbox.height);\n return true;\n }\n return false;\n }, [sizeToElement]);\n\n useResizeHandler(resizeToElement);\n\n // This is an \"artificial\" effect dependency that isn't used anywhere in\n // our effect, but is used to determine when our effect is triggered.\n // By default, since any change to `props.children` may result in a\n // dimension change in the SVG element, we want it to trigger the effect,\n // but alternatively our caller can tell us when to resize via\n // `props.resizeKey` too.\n const resizeDependency = props.resizeKey ?? props.children;\n\n useEffect(() => {\n if (!resizeToElement()) {\n const svgEl = gRef.current;\n if (svgEl) {\n const bbox = svgEl.getBBox();\n const padding = props.padding || 0;\n setX(bbox.x - padding);\n setY(bbox.y - padding);\n setWidth(bbox.width + padding * 2);\n setHeight(bbox.height + padding * 2);\n }\n }\n }, [props.padding, resizeToElement, resizeDependency]);\n\n return (\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width={`${width}px`}\n height={`${height}px`}\n viewBox={`${x} ${y} ${width} ${height}`}\n ref={ref}\n >\n {bgColor && (\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={bgColor}\n data-is-background\n />\n )}\n <g ref={gRef}>{props.children}</g>\n </svg>\n );\n }\n);\n\nexport function getSvgMetadata(svgEl: SVGSVGElement) {\n let bgColor: string | undefined = undefined;\n const backgroundEl = svgEl.querySelector(\"[data-is-background]\");\n if (backgroundEl) {\n bgColor = backgroundEl.getAttribute(\"fill\") ?? undefined;\n }\n const { x, y, width, height } = svgEl.viewBox.baseVal;\n return { x, y, width, height, bgColor };\n}\n\nexport type SvgMetadata = ReturnType<typeof getSvgMetadata>;\n\nexport const SvgWithBackground: React.FC<SvgMetadata & { children?: any }> = ({\n x,\n y,\n width,\n height,\n bgColor,\n children,\n}) => (\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width={`${width}px`}\n height={`${height}px`}\n viewBox={`${x} ${y} ${width} ${height}`}\n >\n {bgColor && (\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={bgColor}\n data-is-background\n />\n )}\n {children}\n </svg>\n);\n", "import React, { useState } from \"react\";\nimport { renderToStaticMarkup } from \"react-dom/server\";\nimport { createGIF } from \"./animated-gif\";\nimport { getSvgMetadata, SvgWithBackground } from \"./auto-sizing-svg\";\n\nimport \"./export-svg.css\";\n\nfunction getSvgDocument(svgMarkup: string): string {\n return [\n `<?xml version=\"1.0\" encoding=\"utf-8\"?>`,\n \"<!-- Generator: https://github.com/toolness/mystic-symbolic -->\",\n '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">',\n svgMarkup,\n ].join(\"\\n\");\n}\n\ntype ProgressHandler = (value: number | null) => void;\n\ntype ImageExporter = (\n svgEl: SVGSVGElement,\n onProgress: ProgressHandler\n) => Promise<string>;\n\n/**\n * Initiates a download on the user's browser which downloads the given\n * SVG element under the given filename, using the given export algorithm.\n */\nasync function exportImage(\n svgRef: React.RefObject<SVGSVGElement>,\n basename: string,\n ext: string,\n onProgress: ProgressHandler,\n exporter: ImageExporter\n) {\n const svgEl = svgRef.current;\n if (!svgEl) {\n alert(\"Oops, an error occurred! Please try again later.\");\n return;\n }\n const url = await exporter(svgEl, onProgress);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `${basename}.${ext}`;\n document.body.append(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n onProgress(null);\n}\n\nfunction getCanvasContext2D(\n canvas: HTMLCanvasElement\n): CanvasRenderingContext2D {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(`Unable to get 2D context for canvas!`);\n return ctx;\n}\n\nfunction getSvgUrl(svgMarkup: string): string {\n return `data:image/svg+xml;utf8,${encodeURIComponent(\n getSvgDocument(svgMarkup)\n )}`;\n}\n\n/**\n * Exports the given SVG as an SVG in a data URL.\n */\nconst exportSvg: ImageExporter = async (svgEl) => getSvgUrl(svgEl.outerHTML);\n\n/**\n * Exports the given SVG as a PNG in a data URL.\n */\nconst exportPng: ImageExporter = async (svgEl, onProgress) => {\n const dataURL = await exportSvg(svgEl, onProgress);\n\n return new Promise((resolve, reject) => {\n const canvas = document.createElement(\"canvas\");\n const img = document.createElement(\"img\");\n\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = getCanvasContext2D(canvas);\n ctx.drawImage(img, 0, 0);\n resolve(canvas.toDataURL());\n };\n img.onerror = reject;\n img.src = dataURL;\n });\n};\n\nfunction drawImage(\n canvas: HTMLCanvasElement,\n dataURL: string,\n scale: number\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const img = document.createElement(\"img\");\n\n img.onload = () => {\n const scaledWidth = Math.floor(img.width * scale);\n const scaledHeight = Math.floor(img.height * scale);\n canvas.width = scaledWidth;\n canvas.height = scaledHeight;\n const ctx = getCanvasContext2D(canvas);\n ctx.drawImage(\n img,\n 0,\n 0,\n img.width,\n img.height,\n 0,\n 0,\n scaledWidth,\n scaledHeight\n );\n resolve();\n };\n img.onerror = reject;\n img.src = dataURL;\n });\n}\n\n/**\n * Exports the given SVG as a GIF in a data URL.\n */\nasync function exportGif(\n animate: ExportableAnimation,\n scale: number,\n svgEl: SVGSVGElement,\n onProgress: (value: number) => void\n): Promise<string> {\n const fps = animate.fps || 15;\n const msecPerFrame = 1000 / fps;\n const numFrames = Math.floor(animate.duration / msecPerFrame);\n const svgMeta = getSvgMetadata(svgEl);\n const render = (animPct: number) => (\n <SvgWithBackground {...svgMeta}>\n {animate.render(animPct)}\n </SvgWithBackground>\n );\n const gif = createGIF();\n\n for (let i = 0; i < numFrames; i++) {\n onProgress(i / numFrames);\n const canvas = document.createElement(\"canvas\");\n const animPct = i / numFrames;\n const markup = renderToStaticMarkup(render(animPct));\n const url = getSvgUrl(markup);\n await drawImage(canvas, url, scale);\n gif.addFrame(canvas, { delay: msecPerFrame });\n }\n\n return new Promise((resolve, reject) => {\n gif.on(\"finished\", function (blob) {\n onProgress(1);\n resolve(URL.createObjectURL(blob));\n });\n gif.render();\n });\n}\n\nexport type AnimationRenderer = (time: number) => JSX.Element;\n\nexport type ExportableAnimation = {\n duration: number;\n fps?: number;\n render: AnimationRenderer;\n};\n\nconst DEFAULT_GIF_SCALE = 0.5;\n\nexport const ExportWidget: React.FC<{\n svgRef: React.RefObject<SVGSVGElement>;\n animate?: ExportableAnimation | false;\n gifScale?: number;\n basename: string;\n}> = ({ svgRef, basename, animate, gifScale }) => {\n const [progress, setProgress] = useState<number | null>(null);\n\n if (progress !== null) {\n return (\n <div className=\"overlay-wrapper\">\n <p>Exporting&hellip;</p>\n <progress value={progress} />\n </div>\n );\n }\n\n return (\n <>\n <button\n onClick={() =>\n exportImage(svgRef, basename, \"svg\", setProgress, exportSvg)\n }\n >\n Export SVG\n </button>{\" \"}\n <button\n onClick={() =>\n exportImage(svgRef, basename, \"png\", setProgress, exportPng)\n }\n >\n Export PNG\n </button>{\" \"}\n {animate && (\n <button\n onClick={() =>\n exportImage(\n svgRef,\n basename,\n \"gif\",\n setProgress,\n exportGif.bind(null, animate, gifScale || DEFAULT_GIF_SCALE)\n )\n }\n >\n Export GIF\n </button>\n )}\n </>\n );\n};\n", "import GIF from \"../vendor/gif.js/gif\";\nimport { GIF_WORKER_JS } from \"../vendor/gif.js/gif.worker\";\n\nexport function createGIF(): GIF {\n const workerBlob = new Blob([GIF_WORKER_JS], {\n type: \"application/javascript\",\n });\n return new GIF({\n workers: 2,\n workerScript: URL.createObjectURL(workerBlob),\n quality: 10,\n repeat: 0,\n });\n}\n", "/**\n * This is just a string containing the gif.js worker JS. It alleviates\n * us from having to find the file at runtime.\n *\n * Concept taken from: https://github.com/jnordberg/gif.js/issues/115\n */\nexport const GIF_WORKER_JS = `\n// gif.worker.js 0.2.0 - https://github.com/jnordberg/gif.js\n(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){var NeuQuant=require(\"./TypedNeuQuant.js\");var LZWEncoder=require(\"./LZWEncoder.js\");function ByteArray(){this.page=-1;this.pages=[];this.newPage()}ByteArray.pageSize=4096;ByteArray.charMap={};for(var i=0;i<256;i++)ByteArray.charMap[i]=String.fromCharCode(i);ByteArray.prototype.newPage=function(){this.pages[++this.page]=new Uint8Array(ByteArray.pageSize);this.cursor=0};ByteArray.prototype.getData=function(){var rv=\"\";for(var p=0;p<this.pages.length;p++){for(var i=0;i<ByteArray.pageSize;i++){rv+=ByteArray.charMap[this.pages[p][i]]}}return rv};ByteArray.prototype.writeByte=function(val){if(this.cursor>=ByteArray.pageSize)this.newPage();this.pages[this.page][this.cursor++]=val};ByteArray.prototype.writeUTFBytes=function(string){for(var l=string.length,i=0;i<l;i++)this.writeByte(string.charCodeAt(i))};ByteArray.prototype.writeBytes=function(array,offset,length){for(var l=length||array.length,i=offset||0;i<l;i++)this.writeByte(array[i])};function GIFEncoder(width,height){this.width=~~width;this.height=~~height;this.transparent=null;this.transIndex=0;this.repeat=-1;this.delay=0;this.image=null;this.pixels=null;this.indexedPixels=null;this.colorDepth=null;this.colorTab=null;this.neuQuant=null;this.usedEntry=new Array;this.palSize=7;this.dispose=-1;this.firstFrame=true;this.sample=10;this.dither=false;this.globalPalette=false;this.out=new ByteArray}GIFEncoder.prototype.setDelay=function(milliseconds){this.delay=Math.round(milliseconds/10)};GIFEncoder.prototype.setFrameRate=function(fps){this.delay=Math.round(100/fps)};GIFEncoder.prototype.setDispose=function(disposalCode){if(disposalCode>=0)this.dispose=disposalCode};GIFEncoder.prototype.setRepeat=function(repeat){this.repeat=repeat};GIFEncoder.prototype.setTransparent=function(color){this.transparent=color};GIFEncoder.prototype.addFrame=function(imageData){this.image=imageData;this.colorTab=this.globalPalette&&this.globalPalette.slice?this.globalPalette:null;this.getImagePixels();this.analyzePixels();if(this.globalPalette===true)this.globalPalette=this.colorTab;if(this.firstFrame){this.writeLSD();this.writePalette();if(this.repeat>=0){this.writeNetscapeExt()}}this.writeGraphicCtrlExt();this.writeImageDesc();if(!this.firstFrame&&!this.globalPalette)this.writePalette();this.writePixels();this.firstFrame=false};GIFEncoder.prototype.finish=function(){this.out.writeByte(59)};GIFEncoder.prototype.setQuality=function(quality){if(quality<1)quality=1;this.sample=quality};GIFEncoder.prototype.setDither=function(dither){if(dither===true)dither=\"FloydSteinberg\";this.dither=dither};GIFEncoder.prototype.setGlobalPalette=function(palette){this.globalPalette=palette};GIFEncoder.prototype.getGlobalPalette=function(){return this.globalPalette&&this.globalPalette.slice&&this.globalPalette.slice(0)||this.globalPalette};GIFEncoder.prototype.writeHeader=function(){this.out.writeUTFBytes(\"GIF89a\")};GIFEncoder.prototype.analyzePixels=function(){if(!this.colorTab){this.neuQuant=new NeuQuant(this.pixels,this.sample);this.neuQuant.buildColormap();this.colorTab=this.neuQuant.getColormap()}if(this.dither){this.ditherPixels(this.dither.replace(\"-serpentine\",\"\"),this.dither.match(/-serpentine/)!==null)}else{this.indexPixels()}this.pixels=null;this.colorDepth=8;this.palSize=7;if(this.transparent!==null){this.transIndex=this.findClosest(this.transparent,true)}};GIFEncoder.prototype.indexPixels=function(imgq){var nPix=this.pixels.length/3;this.indexedPixels=new Uint8Array(nPix);var k=0;for(var j=0;j<nPix;j++){var index=this.findClosestRGB(this.pixels[k++]&255,this.pixels[k++]&255,this.pixels[k++]&255);this.usedEntry[index]=true;this.indexedPixels[j]=index}};GIFEncoder.prototype.ditherPixels=function(kernel,serpentine){var kernels={FalseFloydSteinberg:[[3/8,1,0],[3/8,0,1],[2/8,1,1]],FloydSteinberg:[[7/16,1,0],[3/16,-1,1],[5/16,0,1],[1/16,1,1]],Stucki:[[8/42,1,0],[4/42,2,0],[2/42,-2,1],[4/42,-1,1],[8/42,0,1],[4/42,1,1],[2/42,2,1],[1/42,-2,2],[2/42,-1,2],[4/42,0,2],[2/42,1,2],[1/42,2,2]],Atkinson:[[1/8,1,0],[1/8,2,0],[1/8,-1,1],[1/8,0,1],[1/8,1,1],[1/8,0,2]]};if(!kernel||!kernels[kernel]){throw\"Unknown dithering kernel: \"+kernel}var ds=kernels[kernel];var index=0,height=this.height,width=this.width,data=this.pixels;var direction=serpentine?-1:1;this.indexedPixels=new Uint8Array(this.pixels.length/3);for(var y=0;y<height;y++){if(serpentine)direction=direction*-1;for(var x=direction==1?0:width-1,xend=direction==1?width:0;x!==xend;x+=direction){index=y*width+x;var idx=index*3;var r1=data[idx];var g1=data[idx+1];var b1=data[idx+2];idx=this.findClosestRGB(r1,g1,b1);this.usedEntry[idx]=true;this.indexedPixels[index]=idx;idx*=3;var r2=this.colorTab[idx];var g2=this.colorTab[idx+1];var b2=this.colorTab[idx+2];var er=r1-r2;var eg=g1-g2;var eb=b1-b2;for(var i=direction==1?0:ds.length-1,end=direction==1?ds.length:0;i!==end;i+=direction){var x1=ds[i][1];var y1=ds[i][2];if(x1+x>=0&&x1+x<width&&y1+y>=0&&y1+y<height){var d=ds[i][0];idx=index+x1+y1*width;idx*=3;data[idx]=Math.max(0,Math.min(255,data[idx]+er*d));data[idx+1]=Math.max(0,Math.min(255,data[idx+1]+eg*d));data[idx+2]=Math.max(0,Math.min(255,data[idx+2]+eb*d))}}}}};GIFEncoder.prototype.findClosest=function(c,used){return this.findClosestRGB((c&16711680)>>16,(c&65280)>>8,c&255,used)};GIFEncoder.prototype.findClosestRGB=function(r,g,b,used){if(this.colorTab===null)return-1;if(this.neuQuant&&!used){return this.neuQuant.lookupRGB(r,g,b)}var c=b|g<<8|r<<16;var minpos=0;var dmin=256*256*256;var len=this.colorTab.length;for(var i=0,index=0;i<len;index++){var dr=r-(this.colorTab[i++]&255);var dg=g-(this.colorTab[i++]&255);var db=b-(this.colorTab[i++]&255);var d=dr*dr+dg*dg+db*db;if((!used||this.usedEntry[index])&&d<dmin){dmin=d;minpos=index}}return minpos};GIFEncoder.prototype.getImagePixels=function(){var w=this.width;var h=this.height;this.pixels=new Uint8Array(w*h*3);var data=this.image;var srcPos=0;var count=0;for(var i=0;i<h;i++){for(var j=0;j<w;j++){this.pixels[count++]=data[srcPos++];this.pixels[count++]=data[srcPos++];this.pixels[count++]=data[srcPos++];srcPos++}}};GIFEncoder.prototype.writeGraphicCtrlExt=function(){this.out.writeByte(33);this.out.writeByte(249);this.out.writeByte(4);var transp,disp;if(this.transparent===null){transp=0;disp=0}else{transp=1;disp=2}if(this.dispose>=0){disp=dispose&7}disp<<=2;this.out.writeByte(0|disp|0|transp);this.writeShort(this.delay);this.out.writeByte(this.transIndex);this.out.writeByte(0)};GIFEncoder.prototype.writeImageDesc=function(){this.out.writeByte(44);this.writeShort(0);this.writeShort(0);this.writeShort(this.width);this.writeShort(this.height);if(this.firstFrame||this.globalPalette){this.out.writeByte(0)}else{this.out.writeByte(128|0|0|0|this.palSize)}};GIFEncoder.prototype.writeLSD=function(){this.writeShort(this.width);this.writeShort(this.height);this.out.writeByte(128|112|0|this.palSize);this.out.writeByte(0);this.out.writeByte(0)};GIFEncoder.prototype.writeNetscapeExt=function(){this.out.writeByte(33);this.out.writeByte(255);this.out.writeByte(11);this.out.writeUTFBytes(\"NETSCAPE2.0\");this.out.writeByte(3);this.out.writeByte(1);this.writeShort(this.repeat);this.out.writeByte(0)};GIFEncoder.prototype.writePalette=function(){this.out.writeBytes(this.colorTab);var n=3*256-this.colorTab.length;for(var i=0;i<n;i++)this.out.writeByte(0)};GIFEncoder.prototype.writeShort=function(pValue){this.out.writeByte(pValue&255);this.out.writeByte(pValue>>8&255)};GIFEncoder.prototype.writePixels=function(){var enc=new LZWEncoder(this.width,this.height,this.indexedPixels,this.colorDepth);enc.encode(this.out)};GIFEncoder.prototype.stream=function(){return this.out};module.exports=GIFEncoder},{\"./LZWEncoder.js\":2,\"./TypedNeuQuant.js\":3}],2:[function(require,module,exports){var EOF=-1;var BITS=12;var HSIZE=5003;var masks=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535];function LZWEncoder(width,height,pixels,colorDepth){var initCodeSize=Math.max(2,colorDepth);var accum=new Uint8Array(256);var htab=new Int32Array(HSIZE);var codetab=new Int32Array(HSIZE);var cur_accum,cur_bits=0;var a_count;var free_ent=0;var maxcode;var clear_flg=false;var g_init_bits,ClearCode,EOFCode;function char_out(c,outs){accum[a_count++]=c;if(a_count>=254)flush_char(outs)}function cl_block(outs){cl_hash(HSIZE);free_ent=ClearCode+2;clear_flg=true;output(ClearCode,outs)}function cl_hash(hsize){for(var i=0;i<hsize;++i)htab[i]=-1}function compress(init_bits,outs){var fcode,c,i,ent,disp,hsize_reg,hshift;g_init_bits=init_bits;clear_flg=false;n_bits=g_init_bits;maxcode=MAXCODE(n_bits);ClearCode=1<<init_bits-1;EOFCode=ClearCode+1;free_ent=ClearCode+2;a_count=0;ent=nextPixel();hshift=0;for(fcode=HSIZE;fcode<65536;fcode*=2)++hshift;hshift=8-hshift;hsize_reg=HSIZE;cl_hash(hsize_reg);output(ClearCode,outs);outer_loop:while((c=nextPixel())!=EOF){fcode=(c<<BITS)+ent;i=c<<hshift^ent;if(htab[i]===fcode){ent=codetab[i];continue}else if(htab[i]>=0){disp=hsize_reg-i;if(i===0)disp=1;do{if((i-=disp)<0)i+=hsize_reg;if(htab[i]===fcode){ent=codetab[i];continue outer_loop}}while(htab[i]>=0)}output(ent,outs);ent=c;if(free_ent<1<<BITS){codetab[i]=free_ent++;htab[i]=fcode}else{cl_block(outs)}}output(ent,outs);output(EOFCode,outs)}function encode(outs){outs.writeByte(initCodeSize);remaining=width*height;curPixel=0;compress(initCodeSize+1,outs);outs.writeByte(0)}function flush_char(outs){if(a_count>0){outs.writeByte(a_count);outs.writeBytes(accum,0,a_count);a_count=0}}function MAXCODE(n_bits){return(1<<n_bits)-1}function nextPixel(){if(remaining===0)return EOF;--remaining;var pix=pixels[curPixel++];return pix&255}function output(code,outs){cur_accum&=masks[cur_bits];if(cur_bits>0)cur_accum|=code<<cur_bits;else cur_accum=code;cur_bits+=n_bits;while(cur_bits>=8){char_out(cur_accum&255,outs);cur_accum>>=8;cur_bits-=8}if(free_ent>maxcode||clear_flg){if(clear_flg){maxcode=MAXCODE(n_bits=g_init_bits);clear_flg=false}else{++n_bits;if(n_bits==BITS)maxcode=1<<BITS;else maxcode=MAXCODE(n_bits)}}if(code==EOFCode){while(cur_bits>0){char_out(cur_accum&255,outs);cur_accum>>=8;cur_bits-=8}flush_char(outs)}}this.encode=encode}module.exports=LZWEncoder},{}],3:[function(require,module,exports){var ncycles=100;var netsize=256;var maxnetpos=netsize-1;var netbiasshift=4;var intbiasshift=16;var intbias=1<<intbiasshift;var gammashift=10;var gamma=1<<gammashift;var betashift=10;var beta=intbias>>betashift;var betagamma=intbias<<gammashift-betashift;var initrad=netsize>>3;var radiusbiasshift=6;var radiusbias=1<<radiusbiasshift;var initradius=initrad*radiusbias;var radiusdec=30;var alphabiasshift=10;var initalpha=1<<alphabiasshift;var alphadec;var radbiasshift=8;var radbias=1<<radbiasshift;var alpharadbshift=alphabiasshift+radbiasshift;var alpharadbias=1<<alpharadbshift;var prime1=499;var prime2=491;var prime3=487;var prime4=503;var minpicturebytes=3*prime4;function NeuQuant(pixels,samplefac){var network;var netindex;var bias;var freq;var radpower;function init(){network=[];netindex=new Int32Array(256);bias=new Int32Array(netsize);freq=new Int32Array(netsize);radpower=new Int32Array(netsize>>3);var i,v;for(i=0;i<netsize;i++){v=(i<<netbiasshift+8)/netsize;network[i]=new Float64Array([v,v,v,0]);freq[i]=intbias/netsize;bias[i]=0}}function unbiasnet(){for(var i=0;i<netsize;i++){network[i][0]>>=netbiasshift;network[i][1]>>=netbiasshift;network[i][2]>>=netbiasshift;network[i][3]=i}}function altersingle(alpha,i,b,g,r){network[i][0]-=alpha*(network[i][0]-b)/initalpha;network[i][1]-=alpha*(network[i][1]-g)/initalpha;network[i][2]-=alpha*(network[i][2]-r)/initalpha}function alterneigh(radius,i,b,g,r){var lo=Math.abs(i-radius);var hi=Math.min(i+radius,netsize);var j=i+1;var k=i-1;var m=1;var p,a;while(j<hi||k>lo){a=radpower[m++];if(j<hi){p=network[j++];p[0]-=a*(p[0]-b)/alpharadbias;p[1]-=a*(p[1]-g)/alpharadbias;p[2]-=a*(p[2]-r)/alpharadbias}if(k>lo){p=network[k--];p[0]-=a*(p[0]-b)/alpharadbias;p[1]-=a*(p[1]-g)/alpharadbias;p[2]-=a*(p[2]-r)/alpharadbias}}}function contest(b,g,r){var bestd=~(1<<31);var bestbiasd=bestd;var bestpos=-1;var bestbiaspos=bestpos;var i,n,dist,biasdist,betafreq;for(i=0;i<netsize;i++){n=network[i];dist=Math.abs(n[0]-b)+Math.abs(n[1]-g)+Math.abs(n[2]-r);if(dist<bestd){bestd=dist;bestpos=i}biasdist=dist-(bias[i]>>intbiasshift-netbiasshift);if(biasdist<bestbiasd){bestbiasd=biasdist;bestbiaspos=i}betafreq=freq[i]>>betashift;freq[i]-=betafreq;bias[i]+=betafreq<<gammashift}freq[bestpos]+=beta;bias[bestpos]-=betagamma;return bestbiaspos}function inxbuild(){var i,j,p,q,smallpos,smallval,previouscol=0,startpos=0;for(i=0;i<netsize;i++){p=network[i];smallpos=i;smallval=p[1];for(j=i+1;j<netsize;j++){q=network[j];if(q[1]<smallval){smallpos=j;smallval=q[1]}}q=network[smallpos];if(i!=smallpos){j=q[0];q[0]=p[0];p[0]=j;j=q[1];q[1]=p[1];p[1]=j;j=q[2];q[2]=p[2];p[2]=j;j=q[3];q[3]=p[3];p[3]=j}if(smallval!=previouscol){netindex[previouscol]=startpos+i>>1;for(j=previouscol+1;j<smallval;j++)netindex[j]=i;previouscol=smallval;startpos=i}}netindex[previouscol]=startpos+maxnetpos>>1;for(j=previouscol+1;j<256;j++)netindex[j]=maxnetpos}function inxsearch(b,g,r){var a,p,dist;var bestd=1e3;var best=-1;var i=netindex[g];var j=i-1;while(i<netsize||j>=0){if(i<netsize){p=network[i];dist=p[1]-g;if(dist>=bestd)i=netsize;else{i++;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist<bestd){a=p[2]-r;if(a<0)a=-a;dist+=a;if(dist<bestd){bestd=dist;best=p[3]}}}}if(j>=0){p=network[j];dist=g-p[1];if(dist>=bestd)j=-1;else{j--;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist<bestd){a=p[2]-r;if(a<0)a=-a;dist+=a;if(dist<bestd){bestd=dist;best=p[3]}}}}}return best}function learn(){var i;var lengthcount=pixels.length;var alphadec=30+(samplefac-1)/3;var samplepixels=lengthcount/(3*samplefac);var delta=~~(samplepixels/ncycles);var alpha=initalpha;var radius=initradius;var rad=radius>>radiusbiasshift;if(rad<=1)rad=0;for(i=0;i<rad;i++)radpower[i]=alpha*((rad*rad-i*i)*radbias/(rad*rad));var step;if(lengthcount<minpicturebytes){samplefac=1;step=3}else if(lengthcount%prime1!==0){step=3*prime1}else if(lengthcount%prime2!==0){step=3*prime2}else if(lengthcount%prime3!==0){step=3*prime3}else{step=3*prime4}var b,g,r,j;var pix=0;i=0;while(i<samplepixels){b=(pixels[pix]&255)<<netbiasshift;g=(pixels[pix+1]&255)<<netbiasshift;r=(pixels[pix+2]&255)<<netbiasshift;j=contest(b,g,r);altersingle(alpha,j,b,g,r);if(rad!==0)alterneigh(rad,j,b,g,r);pix+=step;if(pix>=lengthcount)pix-=lengthcount;i++;if(delta===0)delta=1;if(i%delta===0){alpha-=alpha/alphadec;radius-=radius/radiusdec;rad=radius>>radiusbiasshift;if(rad<=1)rad=0;for(j=0;j<rad;j++)radpower[j]=alpha*((rad*rad-j*j)*radbias/(rad*rad))}}}function buildColormap(){init();learn();unbiasnet();inxbuild()}this.buildColormap=buildColormap;function getColormap(){var map=[];var index=[];for(var i=0;i<netsize;i++)index[network[i][3]]=i;var k=0;for(var l=0;l<netsize;l++){var j=index[l];map[k++]=network[j][0];map[k++]=network[j][1];map[k++]=network[j][2]}return map}this.getColormap=getColormap;this.lookupRGB=inxsearch}module.exports=NeuQuant},{}],4:[function(require,module,exports){var GIFEncoder,renderFrame;GIFEncoder=require(\"./GIFEncoder.js\");renderFrame=function(frame){var encoder,page,stream,transfer;encoder=new GIFEncoder(frame.width,frame.height);if(frame.index===0){encoder.writeHeader()}else{encoder.firstFrame=false}encoder.setTransparent(frame.transparent);encoder.setRepeat(frame.repeat);encoder.setDelay(frame.delay);encoder.setQuality(frame.quality);encoder.setDither(frame.dither);encoder.setGlobalPalette(frame.globalPalette);encoder.addFrame(frame.data);if(frame.last){encoder.finish()}if(frame.globalPalette===true){frame.globalPalette=encoder.getGlobalPalette()}stream=encoder.stream();frame.data=stream.pages;frame.cursor=stream.cursor;frame.pageSize=stream.constructor.pageSize;if(frame.canTransfer){transfer=function(){var i,len,ref,results;ref=frame.data;results=[];for(i=0,len=ref.length;i<len;i++){page=ref[i];results.push(page.buffer)}return results}();return self.postMessage(frame,transfer)}else{return self.postMessage(frame)}};self.onmessage=function(event){return renderFrame(event.data)}},{\"./GIFEncoder.js\":1}]},{},[4]);\n`;\n", "import React, { useContext, useMemo } from \"react\";\nimport { BBox, Point } from \"../vendor/bezier-js\";\nimport { getAttachmentTransforms } from \"./attach\";\nimport { getBoundingBoxCenter, uniformlyScaleToFit } from \"./bounding-box\";\nimport { CreatureAnimator, CreatureAnimators } from \"./creature-animator\";\nimport { scalePointXY, subtractPoints } from \"./point\";\nimport { AttachmentPointType } from \"./specs\";\nimport {\n createSvgSymbolContext,\n safeGetAttachmentPoint,\n SvgSymbolContent,\n SvgSymbolContext,\n SvgSymbolData,\n swapColors,\n} from \"./svg-symbol\";\nimport {\n svgRotate,\n svgScale,\n svgTransformOrigin,\n SvgTransform,\n svgTranslate,\n} from \"./svg-transform\";\n\nconst DEFAULT_ATTACHMENT_SCALE = 0.5;\n\nexport type CreatureContextType = SvgSymbolContext & {\n attachmentScale: number;\n parent: SvgSymbolData | null;\n};\n\nexport const CreatureContext = React.createContext<CreatureContextType>({\n ...createSvgSymbolContext(),\n attachmentScale: DEFAULT_ATTACHMENT_SCALE,\n parent: null,\n});\n\nexport type AttachedCreatureSymbol = CreatureSymbol & {\n attachTo: AttachmentPointType;\n indices: number[];\n};\n\nexport type NestedCreatureSymbol = CreatureSymbol & {\n indices: number[];\n};\n\nexport type CreatureSymbol = {\n data: SvgSymbolData;\n invertColors: boolean;\n attachments: AttachedCreatureSymbol[];\n nests: NestedCreatureSymbol[];\n};\n\nexport type CreatureSymbolProps = CreatureSymbol & {\n animator?: CreatureAnimator;\n animPct?: number;\n};\n\ntype NestedCreatureSymbolProps = NestedCreatureSymbol & {\n parent: SvgSymbolData;\n animator: CreatureAnimator;\n animPct: number;\n};\n\ntype AttachedCreatureSymbolProps = AttachedCreatureSymbol & {\n parent: SvgSymbolData;\n animator: CreatureAnimator;\n animPct: number;\n};\n\nfunction getNestingTransforms(parent: BBox, child: BBox) {\n const parentCenter = getBoundingBoxCenter(parent);\n const childCenter = getBoundingBoxCenter(child);\n const translation = subtractPoints(parentCenter, childCenter);\n const uniformScaling = uniformlyScaleToFit(parent, child);\n const scaling: Point = { x: uniformScaling, y: uniformScaling };\n\n return { translation, transformOrigin: childCenter, scaling };\n}\n\ntype AttachmentTransformProps = {\n /**\n * Where to move the attachment once it has been\n * scaled and rotated.\n */\n translate: Point;\n\n /** The origin from which scaling and rotation are done. */\n transformOrigin: Point;\n\n /** How much to scale the attachment, relative to `transformOrigin`. */\n scale: Point;\n\n /** How much to rotate the attachment, relative to `transformOrigin`. */\n rotate?: number;\n\n /** The attachment. */\n children: JSX.Element;\n};\n\n/**\n * A wrapper for an attachment that rotates and/or scales it relative\n * to the given origin point, and then translates it the given amount.\n */\nconst AttachmentTransform: React.FC<AttachmentTransformProps> = (props) => (\n <SvgTransform\n transform={[\n // Remember that transforms are applied in reverse order,\n // so read the following from the end first!\n svgTranslate(props.translate),\n svgTransformOrigin(props.transformOrigin, [\n svgScale(props.scale),\n svgRotate(props.rotate ?? 0),\n ]),\n ]}\n >\n {props.children}\n </SvgTransform>\n);\n\nconst AttachedCreatureSymbol: React.FC<AttachedCreatureSymbolProps> = ({\n indices,\n parent,\n attachTo,\n data,\n ...props\n}) => {\n const ctx = useContext(CreatureContext);\n const children: JSX.Element[] = [];\n\n for (let attachIndex of indices) {\n const parentAp = safeGetAttachmentPoint(parent, attachTo, attachIndex);\n const ourAp = safeGetAttachmentPoint(data, \"anchor\");\n\n if (!parentAp || !ourAp) {\n continue;\n }\n\n let xFlip = 1;\n\n if (!parent.meta?.never_flip_attachments) {\n // If we're attaching something oriented towards the left, horizontally flip\n // the attachment image.\n xFlip = parentAp.normal.x < 0 ? -1 : 1;\n\n // Er, things look weird if we don't inverse the flip logic for\n // the downward-facing attachments, like legs...\n if (parentAp.normal.y > 0) {\n xFlip *= -1;\n }\n }\n\n const t = getAttachmentTransforms(parentAp, {\n point: ourAp.point,\n normal: scalePointXY(ourAp.normal, xFlip, 1),\n });\n\n children.push(\n <AttachmentTransform\n key={attachIndex}\n transformOrigin={ourAp.point}\n translate={t.translation}\n scale={{ x: ctx.attachmentScale * xFlip, y: ctx.attachmentScale }}\n rotate={xFlip * t.rotation}\n >\n <g\n data-attach-parent={parent.name}\n data-attach-type={attachTo}\n data-attach-index={attachIndex}\n >\n <CreatureSymbol data={data} {...props} />\n </g>\n </AttachmentTransform>\n );\n }\n\n return <>{children}</>;\n};\n\nconst NestedCreatureSymbol: React.FC<NestedCreatureSymbolProps> = ({\n indices,\n parent,\n data,\n ...props\n}) => {\n const children: JSX.Element[] = [];\n\n for (let nestIndex of indices) {\n const parentNest = (parent.specs?.nesting ?? [])[nestIndex];\n if (!parentNest) {\n console.log(\n `Parent symbol ${parent.name} has no nesting index ${nestIndex}.`\n );\n continue;\n }\n const t = getNestingTransforms(parentNest, data.bbox);\n children.push(\n <AttachmentTransform\n key={nestIndex}\n transformOrigin={t.transformOrigin}\n translate={t.translation}\n scale={t.scaling}\n >\n <g\n data-attach-parent={parent.name}\n data-attach-type=\"nesting\"\n data-attach-index={nestIndex}\n >\n <CreatureSymbol data={data} {...props} />\n </g>\n </AttachmentTransform>\n );\n }\n\n return <>{children}</>;\n};\n\nexport const CreatureSymbol: React.FC<CreatureSymbolProps> = (props) => {\n let ctx = useContext(CreatureContext);\n const { data, attachments, nests } = props;\n const attachmentCtx: CreatureContextType = { ...ctx, parent: data };\n const animator = props.animator ?? CreatureAnimators.none;\n const animPct = props.animPct ?? 0;\n const svgTransforms = useMemo(\n () => animator.animate(animPct, data),\n [animator, animPct, data]\n );\n const childAnimator = useMemo(() => animator.getChildAnimator(), [animator]);\n\n if (props.invertColors) {\n ctx = swapColors(ctx);\n }\n\n // If we're inverted, then pass our inverted colors on to our\n // nested children, to maintain color balance in the composition.\n const nestedCtx: CreatureContextType = { ...ctx, parent: data };\n\n // The attachments should be before our symbol in the DOM so they\n // appear behind our symbol, while anything nested within our symbol\n // should be after our symbol so they appear in front of it.\n return (\n <SvgTransform transform={svgTransforms}>\n {attachments.length && (\n <CreatureContext.Provider value={attachmentCtx}>\n {attachments.map((a, i) => (\n <AttachedCreatureSymbol\n key={i}\n {...a}\n parent={data}\n animPct={animPct}\n animator={childAnimator}\n />\n ))}\n </CreatureContext.Provider>\n )}\n <SvgSymbolContent data={data} {...ctx} />\n {nests.length && (\n <CreatureContext.Provider value={nestedCtx}>\n {nests.map((n, i) => (\n <NestedCreatureSymbol\n key={i}\n {...n}\n parent={data}\n animPct={animPct}\n animator={childAnimator}\n />\n ))}\n </CreatureContext.Provider>\n )}\n </SvgTransform>\n );\n};\n", "import { Point } from \"../vendor/bezier-js\";\nimport { normalizedPoint2rad, scalePointXY, subtractPoints } from \"./point\";\nimport { PointWithNormal } from \"./specs\";\nimport { rad2deg } from \"./util\";\n\nfunction normalizeDeg(deg: number): number {\n deg = deg % 360;\n if (deg < 0) {\n deg = 360 + deg;\n }\n return deg;\n}\n\n/**\n * Convert the given normal in screen-space coordinates into\n * degrees of rotation in attachment-space coordinates.\n */\nexport function normalToAttachmentSpaceDegrees(normal: Point): number {\n // We need to flip our y because we're in screen space, yet our\n // rotational math assumes we're not.\n const yFlipped = scalePointXY(normal, 1, -1);\n\n const rad = normalizedPoint2rad(yFlipped);\n\n // The origin of our rotation space assumes that \"up\" is 0\n // degrees, while our rotational math assumes 0 degrees is \"right\".\n const reoriented = normalizeDeg(90 - rad2deg(rad));\n\n return reoriented;\n}\n\n/**\n * Given a child point that needs to be attached to a parent\n * point, return the amount of translation and rotation we\n * need to apply to the child point in order to align its\n * position and normal with that of its parent.\n */\nexport function getAttachmentTransforms(\n parent: PointWithNormal,\n child: PointWithNormal\n) {\n const translation = subtractPoints(parent.point, child.point);\n const parentRot = normalToAttachmentSpaceDegrees(parent.normal);\n const childRot = normalToAttachmentSpaceDegrees(child.normal);\n const rotation = parentRot - childRot;\n return { translation, rotation };\n}\n", "import { getBoundingBoxCenter } from \"./bounding-box\";\nimport { SvgSymbolData } from \"./svg-symbol\";\nimport {\n svgRotate,\n SvgTransform,\n svgTransformOrigin,\n svgTranslate,\n} from \"./svg-transform\";\n\n/**\n * A type of function that tells us how to transform a creature based\n * on how far through an animation we are.\n */\ntype CreatureAnimate = (\n animPct: number,\n symbol: SvgSymbolData\n) => SvgTransform[];\n\n/**\n * A strategy for animating a creature.\n */\nexport interface CreatureAnimator {\n /** How to animate the main body of the creature. */\n animate: CreatureAnimate;\n\n /** How to animate the children (attachments & nests) of the creature. */\n getChildAnimator(): CreatureAnimator;\n}\n\n/**\n * Any function that takes a number in the range [0, 1] and\n * transforms it to a number in the same range, for the\n * purposes of animation easing.\n */\ntype EasingFunction = (t: number) => number;\n\n// https://gist.github.com/gre/1650294\nconst easeInOutQuad: EasingFunction = (t) =>\n t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n\n/**\n * Ease from 0, get to 1 by the time t=0.5, and then\n * ease back to 0.\n */\nconst easeInOutQuadPingPong: EasingFunction = (t) => {\n if (t < 0.5) {\n return easeInOutQuad(t * 2);\n }\n return 1 - easeInOutQuad((t - 0.5) * 2);\n};\n\n/**\n * Convert a percentage (number in the range [0, 1]) to\n * a number in the range [-1, 1].\n */\nfunction pctToNegativeOneToOne(pct: number) {\n return (pct - 0.5) * 2;\n}\n\nconst Y_HOVER_AMPLITUDE = 25.0;\n\nconst animateHover: CreatureAnimate = (animPct) => {\n const yHover =\n pctToNegativeOneToOne(easeInOutQuadPingPong(animPct)) * Y_HOVER_AMPLITUDE;\n return [svgTranslate({ x: 0, y: yHover })];\n};\n\nconst animateSpin: CreatureAnimate = (animPct, symbol) => {\n const origin = getBoundingBoxCenter(symbol.bbox);\n return [svgTransformOrigin(origin, [svgRotate(animPct * 360)])];\n};\n\nconst spinAnimator: CreatureAnimator = {\n animate: animateSpin,\n getChildAnimator: () => spinAnimator,\n};\n\n/**\n * Names of all the animators.\n *\n * Note that this list should never be re-ordered, as the index of\n * each animator corresponds to its animator id.\n */\nexport const CREATURE_ANIMATOR_NAMES = [\"none\", \"breathe\", \"spin\"] as const;\n\nexport type CreatureAnimatorName = typeof CREATURE_ANIMATOR_NAMES[number];\n\nexport function creatureAnimatorNameToId(name: CreatureAnimatorName): number {\n return CREATURE_ANIMATOR_NAMES.indexOf(name);\n}\n\nexport function creatureAnimatorIdToName(\n id: number\n): CreatureAnimatorName | undefined {\n return CREATURE_ANIMATOR_NAMES[id];\n}\n\nexport const CreatureAnimators: {\n [k in CreatureAnimatorName]: CreatureAnimator;\n} = {\n none: {\n animate: () => [],\n getChildAnimator: () => CreatureAnimators.none,\n },\n breathe: {\n animate: animateHover,\n getChildAnimator: () => CreatureAnimators.breathe,\n },\n spin: {\n animate: animateHover,\n getChildAnimator: () => spinAnimator,\n },\n};\n", "import React from \"react\";\nimport { Point } from \"../vendor/bezier-js\";\nimport { reversePoint } from \"./point\";\n\nexport type SvgTransform =\n | {\n kind: \"translate\";\n amount: Point;\n }\n | {\n kind: \"rotate\";\n degrees: number;\n }\n | {\n kind: \"scale\";\n amount: Point;\n }\n | {\n kind: \"transformOrigin\";\n amount: Point;\n transforms: SvgTransform[];\n };\n\nfunction getSvgCodeForTransform(t: SvgTransform): string {\n switch (t.kind) {\n case \"translate\":\n return `translate(${t.amount.x} ${t.amount.y})`;\n\n case \"scale\":\n return `scale(${t.amount.x} ${t.amount.y})`;\n\n case \"rotate\":\n return `rotate(${t.degrees})`;\n\n case \"transformOrigin\":\n /**\n * We originally used the SVG \"transform-origin\" attribute here but\n * that's not currently supported by Safari. Instead, we'll set the origin\n * of our SVG to the transform origin, do the transform, and then move our\n * origin back to the original origin, which does the same thing.\n **/\n return getSvgCodeForTransforms([\n svgTranslate(t.amount),\n ...t.transforms,\n svgTranslate(reversePoint(t.amount)),\n ]);\n }\n}\n\nfunction getSvgCodeForTransforms(transforms: SvgTransform[]): string {\n return transforms.map(getSvgCodeForTransform).join(\" \");\n}\n\n/**\n * Apply the given SVG transforms (e.g. rotate, scale)\n * centered at the given origin point.\n */\nexport function svgTransformOrigin(\n amount: Point,\n transforms: SvgTransform[]\n): SvgTransform {\n return { kind: \"transformOrigin\", amount, transforms };\n}\n\nexport function svgTranslate(amount: Point): SvgTransform {\n return { kind: \"translate\", amount };\n}\n\nexport function svgScale(amount: Point | number): SvgTransform {\n if (typeof amount === \"number\") {\n amount = { x: amount, y: amount };\n }\n return { kind: \"scale\", amount };\n}\n\nexport function svgRotate(degrees: number): SvgTransform {\n return { kind: \"rotate\", degrees };\n}\n\n/**\n * Creates a SVG `<g>` element with the given children and transforms.\n *\n * Like the SVG `transform` attribute, the transforms are applied in\n * the *reverse* order that they are specified.\n */\nexport const SvgTransform: React.FC<{\n transform: SvgTransform[] | SvgTransform;\n children: any;\n}> = ({ transform, children }) => {\n if (!Array.isArray(transform)) {\n transform = [transform];\n }\n\n return <g transform={getSvgCodeForTransforms(transform)}>{children}</g>;\n};\n", "import React from \"react\";\nimport { mixColor } from \"./color-util\";\nimport { ColorWidget } from \"./color-widget\";\nimport { DEFAULT_BG_COLOR } from \"./colors\";\nimport { createSvgSymbolContext, SvgSymbolContext } from \"./svg-symbol\";\nimport {\n SymbolContextWidget,\n SymbolContextWidgetProps,\n} from \"./symbol-context-widget\";\n\nconst DEFAULT_CONTEXT: SvgCompositionContext = {\n background: DEFAULT_BG_COLOR,\n ...createSvgSymbolContext(),\n};\n\nexport type SvgCompositionContext = SvgSymbolContext & {\n /** The background color of the composition, as a hex hash (e.g. '#ff0000'). */\n background: string;\n};\n\nexport function createSvgCompositionContext(\n ctx: Partial<SvgCompositionContext> = {}\n): SvgCompositionContext {\n return {\n ...DEFAULT_CONTEXT,\n ...ctx,\n };\n}\n\nexport type CompositionContextWidgetProps<T extends SvgCompositionContext> =\n SymbolContextWidgetProps<T>;\n\nexport function CompositionContextWidget<T extends SvgCompositionContext>({\n ctx,\n onChange,\n children,\n}: CompositionContextWidgetProps<T>): JSX.Element {\n const resetColors = () => {\n const { background, stroke, fill } = DEFAULT_CONTEXT;\n onChange({ ...ctx, background, stroke, fill });\n };\n const monochromatizeColors = () => {\n onChange({\n ...ctx,\n stroke: mixColor(ctx.background, DEFAULT_CONTEXT.stroke, 0.1),\n fill: mixColor(ctx.background, DEFAULT_CONTEXT.fill, 0.1),\n });\n };\n const extraButtons = (\n <>\n <button\n onClick={resetColors}\n title=\"Reset colors to their black &amp; white defaults\"\n >\n B&amp;W\n </button>{\" \"}\n <button\n onClick={monochromatizeColors}\n title=\"Make stroke and fill a variation of the background\"\n >\n Mono\n </button>{\" \"}\n </>\n );\n return (\n <SymbolContextWidget\n ctx={ctx}\n onChange={onChange}\n extraButtons={extraButtons}\n >\n {children}\n <ColorWidget\n label=\"Background\"\n value={ctx.background}\n onChange={(background) => onChange({ ...ctx, background })}\n />{\" \"}\n </SymbolContextWidget>\n );\n}\n", "import React from \"react\";\nimport { PaletteAlgorithmWidget } from \"./palette-algorithm-widget\";\nimport { Random } from \"./random\";\nimport {\n createRandomColorPalette,\n DEFAULT_RANDOM_PALETTE_ALGORITHM,\n RandomPaletteAlgorithm,\n} from \"./random-colors\";\nimport { SvgCompositionContext } from \"./svg-composition-context\";\nimport { useRememberedState } from \"./use-remembered-state\";\n\ntype SvgCompositionColors = Pick<\n SvgCompositionContext,\n \"background\" | \"fill\" | \"stroke\"\n>;\n\nfunction createRandomCompositionColors(\n alg: RandomPaletteAlgorithm\n): SvgCompositionColors {\n const [background, stroke, fill] = createRandomColorPalette(\n 3,\n undefined,\n alg\n );\n return { background, stroke, fill };\n}\n\nexport type RandomizerWidgetProps = {\n onColorsChange: (changes: SvgCompositionColors) => void;\n onSymbolsChange: (rng: Random) => void;\n};\n\nexport const RandomizerWidget: React.FC<RandomizerWidgetProps> = (props) => {\n type RandType = \"colors\" | \"symbols\" | \"colors and symbols\";\n const [paletteAlg, setPaletteAlg] =\n useRememberedState<RandomPaletteAlgorithm>(\n \"randomizer-widget:paletteAlg\",\n DEFAULT_RANDOM_PALETTE_ALGORITHM\n );\n const [randType, setRandType] = useRememberedState<RandType>(\n \"randomizer-widget:randType\",\n \"colors and symbols\"\n );\n const randomize = () => {\n if (randType === \"colors\" || randType === \"colors and symbols\") {\n props.onColorsChange(createRandomCompositionColors(paletteAlg));\n }\n if (randType === \"symbols\" || randType === \"colors and symbols\") {\n props.onSymbolsChange(new Random(Date.now()));\n }\n };\n const makeRadio = (kind: RandType) => (\n <label className=\"checkbox\">\n <input\n type=\"radio\"\n name=\"randomize_type\"\n value={kind}\n checked={randType === kind}\n onChange={(e) => setRandType(e.target.value as RandType)}\n />{\" \"}\n Randomize {kind}\n </label>\n );\n\n return (\n <fieldset>\n <legend>Randomizer</legend>\n {makeRadio(\"colors\")}\n {makeRadio(\"symbols\")}\n {makeRadio(\"colors and symbols\")}\n {randType !== \"symbols\" && (\n <PaletteAlgorithmWidget value={paletteAlg} onChange={setPaletteAlg} />\n )}\n {props.children}\n <button accessKey=\"r\" onClick={randomize}>\n <u>R</u>andomize!\n </button>\n </fieldset>\n );\n};\n", "import React from \"react\";\nimport {\n RandomPaletteAlgorithm,\n RANDOM_PALETTE_ALGORITHMS,\n} from \"./random-colors\";\n\nexport type PaletteAlgorithmWidgetProps = {\n value: RandomPaletteAlgorithm;\n onChange: (value: RandomPaletteAlgorithm) => void;\n};\n\nexport const PaletteAlgorithmWidget: React.FC<PaletteAlgorithmWidgetProps> = ({\n value,\n onChange,\n}) => {\n const id = \"algorithm\";\n\n return (\n <div className=\"flex-widget thingy\">\n <label htmlFor={id}>Palette algorithm: </label>\n <select\n id={id}\n onChange={(e) => onChange(e.target.value as RandomPaletteAlgorithm)}\n value={value}\n >\n {RANDOM_PALETTE_ALGORITHMS.map((choice) => (\n <option key={choice} value={choice}>\n {choice}\n </option>\n ))}\n </select>\n </div>\n );\n};\n", "import { Random } from \"./random\";\nimport { range, clamp } from \"./util\";\nimport * as colorspaces from \"colorspaces\";\nimport { ColorTuple, hsluvToHex } from \"hsluv\";\nimport { clampedBytesToRGBColor } from \"./color-util\";\n\ntype RandomPaletteGenerator = (numEntries: number, rng: Random) => string[];\n//type ColorFunction = (rng: Random) => string[];\n\nexport type RandomPaletteAlgorithm = \"RGB\" | \"CIELUV\" | \"threevals\" | \"randhue\";\n\nexport const DEFAULT_RANDOM_PALETTE_ALGORITHM: RandomPaletteAlgorithm =\n \"randhue\";\n\nfunction createRandomRGBColor(rng: Random): string {\n const rgb = range(3).map(() => rng.inRange({ min: 0, max: 255, step: 1 }));\n return clampedBytesToRGBColor(rgb);\n}\n\nfunction createRandomCIELUVColor(rng: Random): string {\n const max_luv_samples = 100;\n let luvSampleFailed = true;\n let randColorHex: string = \"#000000\";\n\n //See if we can pull out a sample inside the LUV solid\n for (let i = 0; i < max_luv_samples; i++) {\n //bounds from https://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor\n let L = rng.inInterval({ min: 0, max: 100 });\n let u = rng.inInterval({ min: -134, max: 220 });\n let v = rng.inInterval({ min: -140, max: 122 });\n let randColor = colorspaces.make_color(\"CIELUV\", [L, u, v]);\n\n if (randColor.is_displayable() && !(L == 0.0 && (u != 0 || v != 0))) {\n randColorHex = randColor.as(\"hex\");\n luvSampleFailed = false;\n break;\n }\n }\n\n //just sample sRGB if I couldn't sample a random LUV color\n if (luvSampleFailed) {\n let rgb = [0, 0, 0].map(\n () => rng.inRange({ min: 0, max: 255, step: 1 }) / 255.0\n );\n let randColor = colorspaces.make_color(\"sRGB\", rgb);\n randColorHex = randColor.as(\"hex\");\n }\n\n return randColorHex;\n}\n\nfunction threeVColor(rng: Random): string[] {\n let L1 = rng.inInterval({ min: 10, max: 25 });\n let L2 = rng.inInterval({ min: L1 + 25, max: 60 });\n let L3 = rng.inInterval({ min: L2 + 25, max: 85 });\n\n let Ls = [L1, L2, L3];\n\n let angleI = rng.inInterval({ min: 0, max: 120 });\n\n //Now we have 3 lightness values, pick a random hue and sat\n let h1 = rng.inInterval({ min: 0, max: 360 }),\n h2 = h1 + angleI,\n h3 = 360 * ((((h1 + h2) / 2 + 180) / 360) % 1);\n\n h2 = 360 * ((h2 / 360) % 1);\n\n let Hs = [h1, h2, h3];\n\n let Ss = [\n rng.fromGaussian({ mean: 100, stddev: 40 }),\n rng.fromGaussian({ mean: 100, stddev: 40 }),\n rng.fromGaussian({ mean: 100, stddev: 40 }),\n ];\n Ss = Ss.map((x) => clamp(x, 0, 100));\n\n //zip\n let hsls = Ls.map((k, i) => [Hs[i], Ss[i], k]);\n let hexcolors = hsls.map((x) => hsluvToHex(x as ColorTuple));\n\n //scramble order\n hexcolors = rng.uniqueChoices(hexcolors, hexcolors.length);\n return hexcolors;\n}\n\nfunction randHue(rng: Random): string[] {\n let L1 = rng.inInterval({ min: 10, max: 25 });\n let L2 = rng.inInterval({ min: L1 + 25, max: 60 });\n let L3 = rng.inInterval({ min: L2 + 25, max: 85 });\n\n let Ls = [L1, L2, L3];\n\n //Now we have 3 lightness values, pick a random hue and sat\n let h1 = rng.inInterval({ min: 0, max: 360 }),\n h2 = rng.inInterval({ min: 0, max: 360 }),\n h3 = rng.inInterval({ min: 0, max: 360 });\n\n let Hs = [h1, h2, h3];\n\n let Ss = [\n rng.fromGaussian({ mean: 100, stddev: 40 }),\n rng.fromGaussian({ mean: 100, stddev: 40 }),\n rng.fromGaussian({ mean: 100, stddev: 40 }),\n ];\n Ss = Ss.map((x) => clamp(x, 0, 100));\n\n //zip\n let hsls = Ls.map((k, i) => [Hs[i], Ss[i], k]);\n let hexcolors = hsls.map((x) => hsluvToHex(x as ColorTuple));\n\n //scramble order\n hexcolors = rng.uniqueChoices(hexcolors, hexcolors.length);\n return hexcolors;\n}\n\n/**\n * Factory function to take a function that generates a random color\n * and return a palette generator that just calls it once for every\n * color in the palette.\n */\nfunction createSimplePaletteGenerator(\n createColor: (rng: Random) => string\n): RandomPaletteGenerator {\n return (numEntries: number, rng: Random) =>\n range(numEntries).map(() => createColor(rng));\n}\n\n/**\n * Factory function to make a random palette generator for a triad generator\n */\n\nfunction createTriadPaletteGenerator(\n createTriad: (rng: Random) => string[]\n): RandomPaletteGenerator {\n return (numEntries: number, rng: Random): string[] => {\n let colors: string[] = [];\n let n = Math.floor(numEntries / 3) + 1;\n\n if (numEntries == 3) {\n colors = colors.concat(createTriad(rng));\n } else {\n for (let i = 0; i < n; i++) colors = colors.concat(createTriad(rng));\n colors = colors.slice(0, numEntries);\n }\n\n return colors;\n };\n}\n\nconst PALETTE_GENERATORS: {\n [key in RandomPaletteAlgorithm]: RandomPaletteGenerator;\n} = {\n RGB: createSimplePaletteGenerator(createRandomRGBColor),\n CIELUV: createSimplePaletteGenerator(createRandomCIELUVColor),\n threevals: createTriadPaletteGenerator(threeVColor),\n randhue: createTriadPaletteGenerator(randHue),\n};\n\nexport const RANDOM_PALETTE_ALGORITHMS = Object.keys(\n PALETTE_GENERATORS\n) as RandomPaletteAlgorithm[];\n\n/**\n * Create a random color palette with the given number of entries,\n * optionally using the given random number generator and the\n * given algorithm.\n *\n * The return value is an Array of strings, where each string is\n * a color hex hash (e.g. `#ff0000`).\n */\nexport function createRandomColorPalette(\n numEntries: number,\n rng: Random = new Random(),\n algorithm: RandomPaletteAlgorithm = DEFAULT_RANDOM_PALETTE_ALGORITHM\n): string[] {\n return PALETTE_GENERATORS[algorithm](numEntries, rng);\n}\n", "import { useCallback, useState } from \"react\";\n\n/**\n * This is where we remember the most recently-set values\n * for `useRememberedState`.\n */\nconst shortTermMemory = new Map<string, any>();\n\n/**\n * This is like React's `useState()`, but it also takes a \"key\" which\n * uniquely identifies the state's value globally across the whole\n * application.\n *\n * The most recent value is always remembered for the lifetime of the\n * current application (but not across page reloads) and is returned\n * instead of the initial state if possible.\n *\n * This effectively allows us to have user interface elements that\n * \"remember\" their most recent value, even if the UI itself was\n * unmounted at some point.\n */\nexport function useRememberedState<S>(\n key: string,\n initialState: S | (() => S)\n): [S, (value: S) => void] {\n const remembered = shortTermMemory.get(key);\n const [value, rawSetValue] = useState<S>(\n remembered === undefined ? initialState : remembered\n );\n const setValue = useCallback(\n (value: S) => {\n shortTermMemory.set(key, value);\n rawSetValue(value);\n },\n [key, rawSetValue]\n );\n\n return [value, setValue];\n}\n", "import React from \"react\";\nimport { slugify } from \"./util\";\nimport { Vocabulary, VocabularyType } from \"./vocabulary\";\n\nexport type VocabularyWidgetProps<T extends VocabularyType> = {\n id?: string;\n label: string;\n value: T;\n onChange: (value: T) => void;\n choices: Vocabulary<T>;\n};\n\nexport function VocabularyWidget<T extends VocabularyType>({\n id,\n label,\n value,\n onChange,\n choices,\n}: VocabularyWidgetProps<T>) {\n id = id || slugify(label);\n\n return (\n <div className=\"flex-widget\">\n <label htmlFor={id}>{label}: </label>\n <select\n id={id}\n onChange={(e) => onChange(choices.get(e.target.value))}\n value={value.name}\n >\n {choices.items.map((choice) => (\n <option key={choice.name} value={choice.name}>\n {choice.name}\n </option>\n ))}\n </select>\n </div>\n );\n}\n", "/**\n * Return a probability distribution of the given Array.\n *\n * Each item may be repeated more than once in the return value,\n * making it more likely for the item to be randomly chosen.\n *\n * @param items The list of items to create a distribution from.\n *\n * @param getFrequencyMultiplier A function that takes an item\n * and returns a positive integer specifying how many times\n * it should be included in the distribution.\n */\nexport function createDistribution<T>(\n items: T[],\n getFrequencyMultiplier: (item: T) => number\n) {\n const result: T[] = [];\n\n for (let item of items) {\n const freq = getFrequencyMultiplier(item);\n for (let i = 0; i < freq; i++) {\n result.push(item);\n }\n }\n\n return result;\n}\n", "import { useEffect, useRef } from \"react\";\n\n/**\n * Like useEffect(), but ensures that the effect is only\n * called when the callback hasn't changed for the\n * given number of milliseconds. It also doesn't trigger\n * on initial mount--only when the callback *changes* from\n * its value on initial mount.\n *\n * Note that this means that the callback itself needs\n * to be wrapped in something like `useCallback()`, or\n * else it may never be called!\n */\nexport function useDebouncedEffect(ms: number, effect: React.EffectCallback) {\n // https://stackoverflow.com/a/53180013/2422398\n const didMountRef = useRef(false);\n\n useEffect(() => {\n if (didMountRef.current) {\n const timeout = setTimeout(effect, ms);\n\n return () => clearTimeout(timeout);\n } else {\n didMountRef.current = true;\n }\n }, [effect, ms, didMountRef]);\n}\n", "import { assertNotNull } from \"@justfixnyc/util/commonjs\";\nimport React, { useContext, useState } from \"react\";\nimport { AuthContext } from \"./auth-context\";\nimport { GalleryCompositionKind, GalleryContext } from \"./gallery-context\";\n\nexport type GalleryWidgetProps = {\n kind: GalleryCompositionKind;\n serializeValue: () => string;\n};\n\nconst AuthWidget: React.FC<{}> = () => {\n const ctx = useContext(AuthContext);\n\n if (!ctx.providerName) {\n return null;\n }\n\n const button = ctx.loggedInUser ? (\n <button type=\"button\" onClick={ctx.logout}>\n Logout {ctx.loggedInUser.name}\n </button>\n ) : (\n <button type=\"button\" onClick={ctx.login}>\n Login with {ctx.providerName}\n </button>\n );\n\n const error = ctx.error ? <p className=\"error\">{ctx.error}</p> : null;\n\n return (\n <>\n {button}\n {error}\n </>\n );\n};\n\nconst LoginWidget: React.FC<{}> = () => {\n return (\n <>\n <p>\n To publish your composition to our gallery, you will first need to\n login.\n </p>\n <AuthWidget />\n </>\n );\n};\n\nconst PublishWidget: React.FC<GalleryWidgetProps> = (props) => {\n const authCtx = useContext(AuthContext);\n const user = assertNotNull(authCtx.loggedInUser, \"User must be logged in\");\n const galleryCtx = useContext(GalleryContext);\n const [title, setTitle] = useState(\"\");\n const [lastSerializedValue, setLastSerializedValue] = useState(\"\");\n const handlePublish = () => {\n const serializedValue = props.serializeValue();\n setLastSerializedValue(serializedValue);\n galleryCtx.submit({\n title,\n kind: props.kind,\n serializedValue,\n owner: user.id,\n ownerName: user.name,\n });\n };\n const isSubmitting = galleryCtx.submitStatus === \"submitting\";\n\n if (galleryCtx.lastSubmission?.serializedValue === lastSerializedValue) {\n return (\n <>\n <p>Your composition \"{title}\" has been published!</p>\n <button\n onClick={() => {\n setLastSerializedValue(\"\");\n setTitle(\"\");\n }}\n >\n I want to publish more!\n </button>\n </>\n );\n }\n\n return (\n <>\n <p>\n Here you can publish your composition to our publicly-viewable gallery.\n </p>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n handlePublish();\n }}\n >\n <div className=\"flex-widget thingy\">\n <label htmlFor=\"gallery-title\">Composition title:</label>\n <input\n id=\"gallery-title\"\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n disabled={isSubmitting}\n required\n />\n </div>\n <button type=\"submit\" disabled={isSubmitting}>\n Publish to gallery\n </button>{\" \"}\n {!isSubmitting && <AuthWidget />}\n {galleryCtx.submitStatus === \"error\" && (\n <p className=\"error\">\n Sorry, an error occurred while submitting your composition. Please\n try again later.\n </p>\n )}\n </form>\n </>\n );\n};\n\nexport const GalleryWidget: React.FC<GalleryWidgetProps> = (props) => {\n const authCtx = useContext(AuthContext);\n\n return (\n <fieldset>\n <legend>Publish</legend>\n {authCtx.loggedInUser ? <PublishWidget {...props} /> : <LoginWidget />}\n </fieldset>\n );\n};\n", "import * as avro from \"avro-js\";\nimport { CreatureDesign } from \"./core\";\nimport {\n AvroAttachedCreatureSymbol,\n AvroCreatureDesign,\n AvroCreatureSymbol,\n AvroNestedCreatureSymbol,\n} from \"./creature-design.avsc\";\nimport { fromBase64, toBase64 } from \"../../base64\";\nimport CreatureAvsc from \"./creature-design.avsc.json\";\nimport CreatureAvscV2 from \"./creature-design.v2.avsc.json\";\nimport { Packer, SvgCompositionContextPacker } from \"../../serialization\";\nimport {\n AttachedCreatureSymbol,\n CreatureSymbol,\n NestedCreatureSymbol,\n} from \"../../creature-symbol\";\nimport { SvgVocabulary } from \"../../svg-vocabulary\";\nimport { ATTACHMENT_POINT_TYPES } from \"../../specs\";\nimport {\n creatureAnimatorIdToName,\n creatureAnimatorNameToId,\n} from \"../../creature-animator\";\n\nconst LATEST_VERSION = \"v3\";\n\nconst avroCreatureDesign = avro.parse<AvroCreatureDesign>(CreatureAvsc);\n\nconst ATTACHMENT_POINT_MAPPING = new Map(\n ATTACHMENT_POINT_TYPES.map((name, i) => {\n return [name, i];\n })\n);\n\nconst NestedCreatureSymbolPacker: Packer<\n NestedCreatureSymbol,\n AvroNestedCreatureSymbol\n> = {\n pack: (value) => {\n return {\n base: CreatureSymbolPacker.pack(value),\n indices: Buffer.from(value.indices),\n };\n },\n unpack: (value) => {\n return {\n ...CreatureSymbolPacker.unpack(value.base),\n indices: Array.from(value.indices),\n };\n },\n};\n\nconst AttachedCreatureSymbolPacker: Packer<\n AttachedCreatureSymbol,\n AvroAttachedCreatureSymbol\n> = {\n pack: (value) => {\n const attachTo = ATTACHMENT_POINT_MAPPING.get(value.attachTo);\n if (attachTo === undefined) {\n throw new Error(`Invalid attachment type \"${value.attachTo}\"`);\n }\n return {\n base: CreatureSymbolPacker.pack(value),\n attachTo,\n indices: Buffer.from(value.indices),\n };\n },\n unpack: (value) => {\n const attachTo = ATTACHMENT_POINT_TYPES[value.attachTo];\n if (attachTo === undefined) {\n throw new Error(`Invalid attachment type \"${value.attachTo}\"`);\n }\n return {\n ...CreatureSymbolPacker.unpack(value.base),\n attachTo,\n indices: Array.from(value.indices),\n };\n },\n};\n\nconst CreatureSymbolPacker: Packer<CreatureSymbol, AvroCreatureSymbol> = {\n pack: (value) => {\n return {\n invertColors: value.invertColors,\n symbol: value.data.name,\n attachments: value.attachments.map(AttachedCreatureSymbolPacker.pack),\n nests: value.nests.map(NestedCreatureSymbolPacker.pack),\n };\n },\n unpack: (value) => {\n return {\n invertColors: value.invertColors,\n data: SvgVocabulary.get(value.symbol),\n attachments: value.attachments.map(AttachedCreatureSymbolPacker.unpack),\n nests: value.nests.map(NestedCreatureSymbolPacker.unpack),\n };\n },\n};\n\nconst DesignConfigPacker: Packer<CreatureDesign, AvroCreatureDesign> = {\n pack: (value) => {\n return {\n animatorId: creatureAnimatorNameToId(value.animatorName),\n creature: CreatureSymbolPacker.pack(value.creature),\n compCtx: SvgCompositionContextPacker.pack(value.compCtx),\n };\n },\n unpack: (value) => {\n return {\n animatorName: creatureAnimatorIdToName(value.animatorId) ?? \"none\",\n creature: CreatureSymbolPacker.unpack(value.creature),\n compCtx: SvgCompositionContextPacker.unpack(value.compCtx),\n };\n },\n};\n\nfunction loadSchemaVersion(version: string, buf: Buffer): AvroCreatureDesign {\n switch (version) {\n case \"v1\":\n throw new Error(`Sorry, we no longer support loading v1 creatures!`);\n\n case \"v2\":\n const res = avroCreatureDesign.createResolver(avro.parse(CreatureAvscV2));\n return avroCreatureDesign.fromBuffer(buf, res);\n\n case LATEST_VERSION:\n return avroCreatureDesign.fromBuffer(buf);\n\n default:\n throw new Error(`Don't know how to load schema version ${version}`);\n }\n}\n\nexport function serializeCreatureDesign(value: CreatureDesign): string {\n const buf = avroCreatureDesign.toBuffer(DesignConfigPacker.pack(value));\n return `${LATEST_VERSION}.${toBase64(buf)}`;\n}\n\nexport function deserializeCreatureDesign(value: string): CreatureDesign {\n const [version, serialized] = value.split(\".\", 2);\n const buf = fromBase64(serialized);\n return DesignConfigPacker.unpack(loadSchemaVersion(version, buf));\n}\n", "import { SlowBuffer } from \"buffer\";\n\nexport function toBase64(buf: Buffer): string {\n return btoa(String.fromCharCode(...buf));\n}\n\nexport function fromBase64(value: string): Buffer {\n const binaryString = atob(value);\n const buf = new SlowBuffer(binaryString.length);\n\n for (let i = 0; i < binaryString.length; i++) {\n buf[i] = binaryString.charCodeAt(i);\n }\n\n return buf;\n}\n", "import { clampedBytesToRGBColor, parseHexColor } from \"./color-util\";\nimport { AvroSvgCompositionContext } from \"./pages/mandala-page/mandala-design.avsc\";\nimport { SvgCompositionContext } from \"./svg-composition-context\";\n\n/**\n * A generic interface for \"packing\" one type to a different representation\n * for the purposes of serialization, and \"unpacking\" the packed type\n * back to its original representation (for deserialization).\n */\nexport interface Packer<UnpackedType, PackedType> {\n pack(value: UnpackedType): PackedType;\n unpack(value: PackedType): UnpackedType;\n}\n\nexport const ColorPacker: Packer<string, number> = {\n pack: (string) => {\n const [red, green, blue] = parseHexColor(string);\n return (red << 16) + (green << 8) + blue;\n },\n unpack: (number) => {\n const red = (number >> 16) & 0xff;\n const green = (number >> 8) & 0xff;\n const blue = number & 0xff;\n return clampedBytesToRGBColor([red, green, blue]);\n },\n};\n\nexport const SvgCompositionContextPacker: Packer<\n SvgCompositionContext,\n AvroSvgCompositionContext\n> = {\n pack: (ctx) => ({\n ...ctx,\n fill: ColorPacker.pack(ctx.fill),\n stroke: ColorPacker.pack(ctx.stroke),\n background: ColorPacker.pack(ctx.background),\n uniformStrokeWidth: ctx.uniformStrokeWidth || 1,\n }),\n unpack: (ctx) => ({\n ...ctx,\n fill: ColorPacker.unpack(ctx.fill),\n stroke: ColorPacker.unpack(ctx.stroke),\n background: ColorPacker.unpack(ctx.background),\n showSpecs: false,\n }),\n};\n", "import React, { CSSProperties } from \"react\";\nimport { Checkbox } from \"../../checkbox\";\nimport {\n AttachedCreatureSymbol,\n CreatureSymbol,\n NestedCreatureSymbol,\n} from \"../../creature-symbol\";\nimport { RememberedDetails } from \"../../remembered-details\";\nimport { AttachmentPointType, ATTACHMENT_POINT_TYPES } from \"../../specs\";\nimport { SvgVocabulary } from \"../../svg-vocabulary\";\nimport { capitalize, range } from \"../../util\";\nimport { VocabularyWidget } from \"../../vocabulary-widget\";\n\ntype SymbolWithIndices = CreatureSymbol & { indices: number[] };\n\nfunction getAvailableIndices(\n symbols: SymbolWithIndices[],\n numIndices: number\n): number[] {\n const available = new Set(range(numIndices));\n\n for (let s of symbols) {\n for (let i of s.indices) {\n available.delete(i);\n }\n }\n\n return Array.from(available);\n}\n\nfunction getImmutableIndices(\n symbols: SymbolWithIndices[],\n symbol: SymbolWithIndices\n): Set<number> {\n const immutableIndices = new Set<number>();\n\n for (let s of symbols) {\n if (s !== symbol) {\n for (let idx of s.indices) {\n // This index is taken up by another attachment.\n immutableIndices.add(idx);\n }\n }\n }\n\n if (symbol.indices.length === 1) {\n // This attachment is only for one index, don't let it be unselected.\n immutableIndices.add(symbol.indices[0]);\n }\n\n return immutableIndices;\n}\n\ntype IndicesWidgetProps<T extends SymbolWithIndices> = {\n label: string;\n numIndices: number;\n immutableIndices: Set<number>;\n symbol: T;\n onChange: (symbol: T) => void;\n};\n\nfunction IndicesWidget<T extends SymbolWithIndices>({\n symbol,\n onChange,\n label,\n numIndices,\n immutableIndices,\n}: IndicesWidgetProps<T>): JSX.Element {\n const allIndices = range(numIndices);\n const toggleIndex = (i: number) => {\n const indices = symbol.indices.slice();\n const idx = indices.indexOf(i);\n if (idx === -1) {\n indices.push(i);\n } else {\n indices.splice(idx, 1);\n }\n onChange({ ...symbol, indices });\n };\n\n return (\n <>\n <div>{label}</div>\n <div>\n {allIndices.map((i) => {\n return (\n <Checkbox\n key={i}\n label={i.toString()}\n onChange={() => toggleIndex(i)}\n disabled={immutableIndices.has(i)}\n value={symbol.indices.includes(i)}\n />\n );\n })}\n </div>\n </>\n );\n}\n\nclass ArrayManipulator<T> {\n constructor(readonly items: T[]) {}\n\n strictIndexOf(item: T): number {\n const index = this.items.indexOf(item);\n if (index === -1) {\n throw new Error(`Assertion failure, unable to find item`);\n }\n return index;\n }\n\n withItemRemoved(item: T): T[] {\n const items = this.items.slice();\n items.splice(this.strictIndexOf(item), 1);\n return items;\n }\n\n withItemUpdated(originalItem: T, updatedItem: T): T[] {\n const items = this.items.slice();\n items[this.strictIndexOf(originalItem)] = updatedItem;\n return items;\n }\n\n withItemAdded(item: T): T[] {\n return [...this.items, item];\n }\n}\n\nfunction NestingEditor<T extends CreatureSymbol>({\n creature,\n onChange,\n idPrefix,\n}: CreatureEditorProps<T>): JSX.Element | null {\n const specs = creature.data.specs || {};\n const nests = new ArrayManipulator(creature.nests);\n const handleChangedNests = (nests: NestedCreatureSymbol[]) =>\n onChange({\n ...creature,\n nests,\n });\n const deleteNested = (nested: NestedCreatureSymbol) =>\n handleChangedNests(nests.withItemRemoved(nested));\n const updateNested = (\n orig: NestedCreatureSymbol,\n updated: NestedCreatureSymbol\n ) => handleChangedNests(nests.withItemUpdated(orig, updated));\n const addNested = (indices: number[]) =>\n handleChangedNests(\n nests.withItemAdded({\n indices,\n data: SvgVocabulary.items[0],\n invertColors: false,\n attachments: [],\n nests: [],\n })\n );\n\n const points = specs.nesting || [];\n const symbolHasNesting = points.length > 0;\n const creatureDefinesNesting = creature.nests.length > 0;\n if (!symbolHasNesting && !creatureDefinesNesting) {\n return null;\n }\n const style: CSSProperties = {};\n let title = `Symbol defines nesting and cluster provides at least one`;\n if (!symbolHasNesting) {\n style.textDecoration = \"line-through\";\n title = `Cluster defines nesting but symbol doesn't define any`;\n // Honestly, this is just going to confuse people, so leave it out\n // for now.\n return null;\n }\n if (!creatureDefinesNesting) {\n style.color = \"gray\";\n title = `Symbol defines nesting but cluster doesn't provide any`;\n }\n const availableIndices = getAvailableIndices(creature.nests, points.length);\n return (\n <div>\n <div style={style} title={title}>\n Nesting\n </div>\n {creature.nests.map((nest, i) => {\n const atIdPrefix = `${idPrefix}_nest_${i}_`;\n const immutableIndices = getImmutableIndices(creature.nests, nest);\n\n return (\n <div\n key={i}\n style={{\n borderLeft: \"2px solid lightgray\",\n paddingLeft: \"4px\",\n }}\n >\n <IndicesWidget\n label={`nesting indices:`}\n numIndices={points.length}\n immutableIndices={immutableIndices}\n symbol={nest}\n onChange={updateNested.bind(null, nest)}\n />\n <div className=\"thingy\">\n <button onClick={deleteNested.bind(null, nest)}>\n Remove this nested symbol\n </button>\n </div>\n <CreaturePartEditor\n creature={nest}\n onChange={updateNested.bind(null, nest)}\n idPrefix={atIdPrefix}\n />\n </div>\n );\n })}\n {availableIndices.length > 0 && (\n <button onClick={() => addNested(availableIndices)}>\n Add nested symbol\n </button>\n )}\n </div>\n );\n}\n\nfunction AttachmentEditor<T extends CreatureSymbol>({\n creature,\n onChange,\n idPrefix,\n}: CreatureEditorProps<T>): JSX.Element {\n const specs = creature.data.specs || {};\n const attachments = new ArrayManipulator(creature.attachments);\n const handleChangedAttachments = (attachments: AttachedCreatureSymbol[]) =>\n onChange({ ...creature, attachments });\n const deleteAttachment = (attachment: AttachedCreatureSymbol) =>\n handleChangedAttachments(attachments.withItemRemoved(attachment));\n const updateAttachment = (\n originalAttachment: AttachedCreatureSymbol,\n updatedAttachment: AttachedCreatureSymbol\n ) =>\n handleChangedAttachments(\n attachments.withItemUpdated(originalAttachment, updatedAttachment)\n );\n const addAttachment = (attachTo: AttachmentPointType, indices: number[]) =>\n handleChangedAttachments(\n attachments.withItemAdded({\n attachTo,\n indices,\n data: SvgVocabulary.items[0],\n invertColors: false,\n attachments: [],\n nests: [],\n })\n );\n\n return (\n <>\n {\" \"}\n {ATTACHMENT_POINT_TYPES.map((type) => {\n if (type === \"anchor\") return null;\n const points = specs[type] || [];\n const symbolHasAttachments = points.length > 0;\n const creatureAttachments = creature.attachments.filter(\n (at) => at.attachTo === type\n );\n const creatureDefinesAttachments = creatureAttachments.length > 0;\n if (!symbolHasAttachments && !creatureDefinesAttachments) {\n return null;\n }\n const style: CSSProperties = {};\n let title = `Symbol defines ${type}(s) and cluster provides at least one`;\n if (!symbolHasAttachments) {\n style.textDecoration = \"line-through\";\n title = `Cluster defines ${type}(s) but symbol doesn't define any`;\n // Honestly, this is just going to confuse people, so leave it out\n // for now.\n return;\n }\n if (!creatureDefinesAttachments) {\n style.color = \"gray\";\n title = `Symbol defines ${type}(s) but cluster doesn't provide any`;\n }\n const availableIndices = getAvailableIndices(\n creatureAttachments,\n points.length\n );\n const typeCap = capitalize(type);\n return (\n <div key={type}>\n <div style={style} title={title}>\n {typeCap} attachments\n </div>\n {creatureAttachments.map((attach, i) => {\n const atIdPrefix = `${idPrefix}_${type}_${i}_`;\n const immutableIndices = getImmutableIndices(\n creatureAttachments,\n attach\n );\n\n return (\n <div\n key={i}\n style={{\n borderLeft: \"2px solid lightgray\",\n paddingLeft: \"4px\",\n }}\n >\n <IndicesWidget\n label={`${typeCap} attachment point indices:`}\n numIndices={points.length}\n immutableIndices={immutableIndices}\n symbol={attach}\n onChange={updateAttachment.bind(null, attach)}\n />\n <div className=\"thingy\">\n <button onClick={deleteAttachment.bind(null, attach)}>\n Remove this attachment\n </button>\n </div>\n <CreaturePartEditor\n creature={attach}\n onChange={updateAttachment.bind(null, attach)}\n idPrefix={atIdPrefix}\n />\n </div>\n );\n })}\n {availableIndices.length > 0 && (\n <button onClick={() => addAttachment(type, availableIndices)}>\n Add {type} attachment\n </button>\n )}\n </div>\n );\n })}\n </>\n );\n}\n\ntype CreatureEditorProps<T extends CreatureSymbol> = {\n creature: T;\n onChange: (symbol: T) => void;\n idPrefix: string;\n};\n\nfunction CreaturePartEditor<T extends CreatureSymbol>({\n creature,\n onChange,\n idPrefix,\n}: CreatureEditorProps<T>): JSX.Element {\n return (\n <>\n <div className=\"thingy\">\n <VocabularyWidget\n label=\"Symbol\"\n id={`${idPrefix}symbol`}\n value={creature.data}\n onChange={(data) => onChange({ ...creature, data })}\n choices={SvgVocabulary}\n />\n </div>\n <Checkbox\n label=\"Invert colors\"\n value={creature.invertColors}\n onChange={(invertColors) => onChange({ ...creature, invertColors })}\n />\n <AttachmentEditor\n creature={creature}\n onChange={onChange}\n idPrefix={idPrefix}\n />\n <NestingEditor\n creature={creature}\n onChange={onChange}\n idPrefix={idPrefix}\n />\n </>\n );\n}\n\nexport const CreatureEditorWidget: React.FC<{\n creature: CreatureSymbol;\n onChange: (symbol: CreatureSymbol) => void;\n}> = ({ creature, onChange }) => {\n return (\n <div className=\"thingy\">\n <RememberedDetails id=\"creature_editor_widget\">\n <summary>Edit cluster&hellip;</summary>\n <CreaturePartEditor\n creature={creature}\n onChange={onChange}\n idPrefix=\"creature_edit_\"\n />\n </RememberedDetails>\n </div>\n );\n};\n", "import React from \"react\";\nimport { useRememberedState } from \"./use-remembered-state\";\n\n/**\n * A `<details>` element that remembers whether it was opened or closed via\n * the given global id, so that if the component is unmounted and remounted,\n * it can be shown in the same state it was previously in.\n */\nexport const RememberedDetails: React.FC<{ id: string }> = ({\n id,\n children,\n}) => {\n const [isOpen, setIsOpen] = useRememberedState(id, false);\n\n return (\n <details\n onToggle={(e) => setIsOpen((e.currentTarget as HTMLDetailsElement).open)}\n open={isOpen}\n >\n {children}\n </details>\n );\n};\n", "import { useEffect, useState } from \"react\";\n\n/**\n * A React hook that can be used for animation.\n *\n * Given a duration in milliseconds, returns the percentage through\n * that duration that has passed as a floating-point number\n * from 0.0 to 1.0.\n *\n * Changes in the returned value will be triggered by `requestAnimationFrame`,\n * so they will likely be tied to the monitor's refresh rate.\n *\n * Assumes that the animation is looping, so the percentage will\n * reset to zero once it has finished.\n */\nexport function useAnimationPct(durationMs: number): number {\n const [pct, setPct] = useState(0);\n const [lastTimestamp, setLastTimestamp] = useState<number | undefined>(\n undefined\n );\n\n useEffect(() => {\n if (!durationMs) {\n setPct(0);\n setLastTimestamp(undefined);\n return;\n }\n\n const callback = (timestamp: number) => {\n if (typeof lastTimestamp === \"number\") {\n const timeDelta = timestamp - lastTimestamp;\n const pctDelta = timeDelta / durationMs;\n setPct((pct + pctDelta) % 1.0);\n }\n setLastTimestamp(timestamp);\n };\n const timeout = requestAnimationFrame(callback);\n\n return () => {\n cancelAnimationFrame(timeout);\n };\n }, [durationMs, pct, lastTimestamp]);\n\n return pct;\n}\n", "import { createPageWithShareableState } from \"../../page-with-shareable-state\";\nimport { MANDALA_DESIGN_DEFAULTS, MandalaPageWithDefaults } from \"./core\";\nimport {\n deserializeMandalaDesign,\n serializeMandalaDesign,\n} from \"./serialization\";\n\nexport const MandalaPage = createPageWithShareableState({\n defaultValue: MANDALA_DESIGN_DEFAULTS,\n serialize: serializeMandalaDesign,\n deserialize: deserializeMandalaDesign,\n component: MandalaPageWithDefaults,\n});\n", "import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { AutoSizingSvg } from \"../../auto-sizing-svg\";\nimport { AnimationRenderer, ExportWidget } from \"../../export-svg\";\nimport { HoverDebugHelper } from \"../../hover-debug-helper\";\nimport { NumericSlider } from \"../../numeric-slider\";\nimport {\n noFillIfShowingSpecs,\n SvgSymbolContext,\n swapColors,\n} from \"../../svg-symbol\";\nimport { VocabularyWidget } from \"../../vocabulary-widget\";\nimport { svgRotate, svgScale, SvgTransform } from \"../../svg-transform\";\nimport { SvgVocabulary } from \"../../svg-vocabulary\";\nimport { isEvenNumber, NumericRange, secsToMsecs } from \"../../util\";\nimport { Random } from \"../../random\";\nimport { Checkbox } from \"../../checkbox\";\nimport {\n CompositionContextWidget,\n createSvgCompositionContext,\n} from \"../../svg-composition-context\";\nimport { Page } from \"../../page\";\nimport { MandalaCircle, MandalaCircleParams } from \"../../mandala-circle\";\nimport { useAnimationPct } from \"../../animation\";\nimport { RandomizerWidget } from \"../../randomizer-widget\";\nimport { useDebouncedEffect } from \"../../use-debounced-effect\";\nimport { GalleryWidget } from \"../../gallery-widget\";\nimport { serializeMandalaDesign } from \"./serialization\";\n\nexport type ExtendedMandalaCircleParams = MandalaCircleParams & {\n scaling: number;\n rotation: number;\n symbolScaling: number;\n symbolRotation: number;\n animateSymbolRotation: boolean;\n};\n\nconst CIRCLE_1_DEFAULTS: ExtendedMandalaCircleParams = {\n data: SvgVocabulary.get(\"eye\"),\n radius: 300,\n numSymbols: 5,\n scaling: 1,\n rotation: 0,\n symbolScaling: 1,\n symbolRotation: 0,\n invertEveryOtherSymbol: false,\n animateSymbolRotation: false,\n};\n\nconst CIRCLE_2_DEFAULTS: ExtendedMandalaCircleParams = {\n data: SvgVocabulary.get(\"leg\"),\n radius: 0,\n numSymbols: 3,\n scaling: 0.5,\n rotation: 0,\n symbolScaling: 1,\n symbolRotation: 0,\n invertEveryOtherSymbol: false,\n animateSymbolRotation: false,\n};\n\nconst RADIUS: NumericRange = {\n min: -500,\n max: 500,\n step: 1,\n};\n\nconst RADIUS_RANDOM: NumericRange = {\n min: 100,\n max: RADIUS.max,\n step: 1,\n};\n\nconst NUM_SYMBOLS: NumericRange = {\n min: 1,\n max: 20,\n step: 1,\n};\n\nconst SCALING: NumericRange = {\n min: 0.1,\n max: 1,\n step: 0.05,\n};\n\nconst ROTATION: NumericRange = {\n min: 0,\n max: 359,\n step: 1,\n};\n\nconst DURATION_SECS: NumericRange = {\n min: 0.5,\n max: 10,\n step: 0.1,\n};\n\nconst DEFAULT_DURATION_SECS = 3;\n\nconst ExtendedMandalaCircle: React.FC<\n ExtendedMandalaCircleParams & SvgSymbolContext\n> = ({ scaling, rotation, symbolScaling, symbolRotation, ...props }) => {\n props = {\n ...props,\n symbolTransforms: [svgScale(symbolScaling), svgRotate(symbolRotation)],\n };\n\n return (\n <SvgTransform transform={[svgScale(scaling), svgRotate(rotation)]}>\n <MandalaCircle {...props} />\n </SvgTransform>\n );\n};\n\nfunction animateMandalaCircleParams(\n value: ExtendedMandalaCircleParams,\n animPct: number\n): ExtendedMandalaCircleParams {\n if (value.animateSymbolRotation) {\n const direction = value.data.meta?.rotate_clockwise ? 1 : -1;\n value = {\n ...value,\n symbolRotation: direction * animPct * ROTATION.max,\n };\n }\n return value;\n}\n\nconst ExtendedMandalaCircleParamsWidget: React.FC<{\n idPrefix: string;\n value: ExtendedMandalaCircleParams;\n onChange: (value: ExtendedMandalaCircleParams) => void;\n}> = ({ idPrefix, value, onChange }) => {\n return (\n <div className=\"thingy\">\n <VocabularyWidget\n id={`${idPrefix}symbol`}\n label=\"Symbol\"\n value={value.data}\n onChange={(data) => onChange({ ...value, data })}\n choices={SvgVocabulary}\n />\n <NumericSlider\n id={`${idPrefix}radius`}\n label=\"Radius\"\n value={value.radius}\n onChange={(radius) => onChange({ ...value, radius })}\n {...RADIUS}\n />\n <NumericSlider\n id={`${idPrefix}numSymbols`}\n label=\"Number of symbols\"\n value={value.numSymbols}\n onChange={(numSymbols) => onChange({ ...value, numSymbols })}\n {...NUM_SYMBOLS}\n />\n <NumericSlider\n id={`${idPrefix}scaling`}\n label=\"Scaling\"\n value={value.scaling}\n onChange={(scaling) => onChange({ ...value, scaling })}\n {...SCALING}\n />\n <NumericSlider\n id={`${idPrefix}rotation`}\n label=\"Rotation\"\n value={value.rotation}\n onChange={(rotation) => onChange({ ...value, rotation })}\n {...ROTATION}\n />\n <NumericSlider\n id={`${idPrefix}symbolScaling`}\n label=\"Symbol scaling\"\n value={value.symbolScaling}\n onChange={(symbolScaling) => onChange({ ...value, symbolScaling })}\n {...SCALING}\n />\n <NumericSlider\n id={`${idPrefix}symbolRotation`}\n label=\"Symbol rotation\"\n disabled={value.animateSymbolRotation}\n value={value.symbolRotation}\n onChange={(symbolRotation) => onChange({ ...value, symbolRotation })}\n {...ROTATION}\n />\n <Checkbox\n label=\"Animate symbol rotation\"\n value={value.animateSymbolRotation}\n onChange={(animateSymbolRotation) =>\n onChange({ ...value, animateSymbolRotation })\n }\n />\n <Checkbox\n label=\"Invert every other symbol (applies only to circles with an even number of symbols)\"\n disabled={!isEvenNumber(value.numSymbols)}\n value={value.invertEveryOtherSymbol}\n onChange={(invertEveryOtherSymbol) =>\n onChange({ ...value, invertEveryOtherSymbol })\n }\n />\n </div>\n );\n};\n\nfunction getRandomCircleParams(rng: Random): MandalaCircleParams {\n return {\n data: rng.choice(SvgVocabulary.items),\n radius: rng.inRange(RADIUS_RANDOM),\n numSymbols: rng.inRange(NUM_SYMBOLS),\n invertEveryOtherSymbol: rng.bool(),\n };\n}\n\nexport const MANDALA_DESIGN_DEFAULTS = {\n circle1: CIRCLE_1_DEFAULTS,\n circle2: CIRCLE_2_DEFAULTS,\n durationSecs: DEFAULT_DURATION_SECS,\n baseCompCtx: createSvgCompositionContext(),\n useTwoCircles: false,\n invertCircle2: true,\n firstBehind: false,\n};\n\nexport type MandalaDesign = typeof MANDALA_DESIGN_DEFAULTS;\n\nfunction isDesignAnimated(design: MandalaDesign): boolean {\n return getCirclesFromDesign(design).some((c) => c.animateSymbolRotation);\n}\n\nexport function createMandalaAnimationRenderer(\n {\n baseCompCtx,\n invertCircle2,\n circle1,\n circle2,\n useTwoCircles,\n firstBehind,\n }: MandalaDesign,\n scale = 0.5\n): AnimationRenderer {\n const symbolCtx = noFillIfShowingSpecs(baseCompCtx);\n const circle2SymbolCtx = invertCircle2 ? swapColors(symbolCtx) : symbolCtx;\n\n return (animPct) => {\n const circles = [\n <ExtendedMandalaCircle\n key=\"first\"\n {...animateMandalaCircleParams(circle1, animPct)}\n {...symbolCtx}\n />,\n ];\n\n if (useTwoCircles) {\n circles.push(\n <ExtendedMandalaCircle\n key=\"second\"\n {...animateMandalaCircleParams(circle2, animPct)}\n {...circle2SymbolCtx}\n />\n );\n if (firstBehind) {\n circles.reverse();\n }\n }\n\n return <SvgTransform transform={svgScale(scale)}>{circles}</SvgTransform>;\n };\n}\n\nconst AnimatedMandala: React.FC<{\n config: MandalaDesign;\n render: AnimationRenderer;\n}> = ({ config, render }) => {\n const animPct = useAnimationPct(\n isDesignAnimated(config) ? secsToMsecs(config.durationSecs) : 0\n );\n\n return <>{render(animPct)}</>;\n};\n\nexport function getCirclesFromDesign(\n design: MandalaDesign\n): ExtendedMandalaCircleParams[] {\n const circles: ExtendedMandalaCircleParams[] = [design.circle1];\n\n if (design.useTwoCircles) {\n circles.push(design.circle2);\n }\n\n return circles;\n}\n\nfunction getBasename(design: MandalaDesign): string {\n return `mandala-${getCirclesFromDesign(design)\n .map((c) => c.data.name)\n .join(\"-\")}`;\n}\n\n/**\n * A mandala page that starts with the given default mandala configuration.\n *\n * The given handler will be called whenever the user changes the\n * configuration.\n *\n * Note that the default is only used to determine the initial state of\n * the component at mount. Any changes to the prop once the component has\n * been mounted are ignored.\n */\nexport const MandalaPageWithDefaults: React.FC<{\n defaults: MandalaDesign;\n onChange: (defaults: MandalaDesign) => void;\n}> = ({ defaults, onChange }) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const [circle1, setCircle1] = useState(defaults.circle1);\n const [circle2, setCircle2] = useState(defaults.circle2);\n const [durationSecs, setDurationSecs] = useState(defaults.durationSecs);\n const [baseCompCtx, setBaseCompCtx] = useState(defaults.baseCompCtx);\n const [useTwoCircles, setUseTwoCircles] = useState(defaults.useTwoCircles);\n const [invertCircle2, setInvertCircle2] = useState(defaults.invertCircle2);\n const [firstBehind, setFirstBehind] = useState(defaults.firstBehind);\n const design: MandalaDesign = useMemo(\n () => ({\n circle1,\n circle2,\n durationSecs,\n baseCompCtx,\n useTwoCircles,\n invertCircle2,\n firstBehind,\n }),\n [\n circle1,\n circle2,\n durationSecs,\n baseCompCtx,\n useTwoCircles,\n invertCircle2,\n firstBehind,\n ]\n );\n const isAnimated = isDesignAnimated(design);\n const render = useMemo(\n () => createMandalaAnimationRenderer(design),\n [design]\n );\n\n useDebouncedEffect(\n 250,\n useCallback(() => onChange(design), [onChange, design])\n );\n\n return (\n <Page title=\"Mandala!\">\n <div className=\"sidebar\">\n <CompositionContextWidget ctx={baseCompCtx} onChange={setBaseCompCtx} />\n <fieldset>\n <legend>First circle</legend>\n <ExtendedMandalaCircleParamsWidget\n idPrefix=\"c1\"\n value={circle1}\n onChange={setCircle1}\n />\n </fieldset>\n <div className=\"thingy\">\n <Checkbox\n label=\"Add a second circle\"\n value={useTwoCircles}\n onChange={setUseTwoCircles}\n />\n </div>\n {useTwoCircles && (\n <fieldset>\n <legend>Second circle</legend>\n <ExtendedMandalaCircleParamsWidget\n idPrefix=\"c2\"\n value={circle2}\n onChange={setCircle2}\n />\n <Checkbox\n label=\"Invert colors\"\n value={invertCircle2}\n onChange={setInvertCircle2}\n />{\" \"}\n <Checkbox\n label=\"Place behind first circle\"\n value={firstBehind}\n onChange={setFirstBehind}\n />\n </fieldset>\n )}\n {isAnimated && (\n <NumericSlider\n label=\"Animation loop duration\"\n valueSuffix=\"s\"\n value={durationSecs}\n onChange={(duration) => setDurationSecs(duration)}\n {...DURATION_SECS}\n />\n )}\n <RandomizerWidget\n onColorsChange={(colors) =>\n setBaseCompCtx({ ...baseCompCtx, ...colors })\n }\n onSymbolsChange={(rng) => {\n setCircle1({ ...circle1, ...getRandomCircleParams(rng) });\n setCircle2({ ...circle2, ...getRandomCircleParams(rng) });\n }}\n />\n <GalleryWidget\n kind=\"mandala\"\n serializeValue={() => serializeMandalaDesign(design)}\n />\n <div className=\"thingy\">\n <ExportWidget\n basename={getBasename(design)}\n svgRef={svgRef}\n animate={\n isAnimated && { duration: secsToMsecs(durationSecs), render }\n }\n />\n </div>\n </div>\n <div\n className=\"canvas\"\n style={{ backgroundColor: baseCompCtx.background }}\n ref={canvasRef}\n >\n <HoverDebugHelper>\n <AutoSizingSvg\n ref={svgRef}\n bgColor={baseCompCtx.background}\n sizeToElement={canvasRef}\n >\n <AnimatedMandala config={defaults} render={render} />\n </AutoSizingSvg>\n </HoverDebugHelper>\n </div>\n </Page>\n );\n};\n", "import React from \"react\";\n\nimport { getAttachmentTransforms } from \"./attach\";\nimport { getBoundingBoxCenter } from \"./bounding-box\";\nimport { PointWithNormal } from \"./specs\";\nimport {\n safeGetAttachmentPoint,\n SvgSymbolContent,\n SvgSymbolContext,\n SvgSymbolData,\n swapColors,\n} from \"./svg-symbol\";\nimport { svgRotate, SvgTransform, svgTranslate } from \"./svg-transform\";\nimport { isEvenNumber, range } from \"./util\";\n\n/**\n * Returns the anchor point of the given symbol; if it doesn't have\n * an anchor point, return a reasonable default one by taking the\n * center of the symbol and having the normal point along the negative\n * y-axis (i.e., up).\n */\nfunction getAnchorOrCenter(symbol: SvgSymbolData): PointWithNormal {\n return (\n safeGetAttachmentPoint(symbol, \"anchor\") || {\n point: getBoundingBoxCenter(symbol.bbox),\n normal: { x: 0, y: -1 },\n }\n );\n}\n\nexport type MandalaCircleParams = {\n data: SvgSymbolData;\n radius: number;\n numSymbols: number;\n symbolTransforms?: SvgTransform[];\n invertEveryOtherSymbol: boolean;\n};\n\nexport type MandalaCircleProps = MandalaCircleParams & SvgSymbolContext;\n\nexport const MandalaCircle: React.FC<MandalaCircleProps> = (props) => {\n const degreesPerItem = 360 / props.numSymbols;\n const { translation, rotation } = getAttachmentTransforms(\n {\n point: { x: 0, y: 0 },\n normal: { x: 0, y: -1 },\n },\n getAnchorOrCenter(props.data)\n );\n const transform: SvgTransform[] = [\n // Remember that transforms are applied in reverse order,\n // so read the following from the end first!\n\n // Finally, move the symbol out along the radius of the circle.\n svgTranslate({ x: 0, y: -props.radius }),\n\n // Then apply any individual symbol transformations.\n ...(props.symbolTransforms || []),\n\n // First, re-orient the symbol so its anchor point is at\n // the origin and facing the proper direction.\n svgRotate(rotation),\n svgTranslate(translation),\n ];\n\n const invertEveryOtherSymbol =\n isEvenNumber(props.numSymbols) && props.invertEveryOtherSymbol;\n\n const symbols = range(props.numSymbols)\n .reverse()\n .map((i) => (\n <SvgTransform\n key={i}\n transform={[svgRotate(degreesPerItem * i), ...transform]}\n >\n {invertEveryOtherSymbol && isEvenNumber(i) ? (\n <SvgSymbolContent {...swapColors(props)} />\n ) : (\n <SvgSymbolContent {...props} />\n )}\n </SvgTransform>\n ));\n\n return <>{symbols}</>;\n};\n", "import { SvgVocabulary } from \"../../svg-vocabulary\";\nimport MandalaAvsc from \"./mandala-design.avsc.json\";\nimport MandalaAvscV1 from \"./mandala-design.v1.avsc.json\";\nimport type { AvroCircle, AvroMandalaDesign } from \"./mandala-design.avsc\";\nimport * as avro from \"avro-js\";\nimport {\n MANDALA_DESIGN_DEFAULTS,\n ExtendedMandalaCircleParams,\n MandalaDesign,\n getCirclesFromDesign,\n} from \"./core\";\nimport { fromBase64, toBase64 } from \"../../base64\";\nimport { Packer, SvgCompositionContextPacker } from \"../../serialization\";\n\nconst LATEST_VERSION = \"v2\";\n\nconst avroMandalaDesign = avro.parse<AvroMandalaDesign>(MandalaAvsc);\n\nconst CirclePacker: Packer<ExtendedMandalaCircleParams, AvroCircle> = {\n pack: ({ data, ...circle }) => ({\n ...circle,\n symbol: data.name,\n }),\n unpack: ({ symbol, ...circle }) => ({\n ...circle,\n data: SvgVocabulary.get(symbol),\n }),\n};\n\nconst DesignConfigPacker: Packer<MandalaDesign, AvroMandalaDesign> = {\n pack: (value) => {\n return {\n ...value,\n circles: getCirclesFromDesign(value).map(CirclePacker.pack),\n baseCompCtx: SvgCompositionContextPacker.pack(value.baseCompCtx),\n };\n },\n unpack: ({ circles, ...value }) => {\n if (circles.length === 0) {\n throw new Error(`Circles must have at least one item!`);\n }\n const useTwoCircles = circles.length > 1;\n const circle1 = CirclePacker.unpack(circles[0]);\n const circle2 = useTwoCircles\n ? CirclePacker.unpack(circles[1])\n : MANDALA_DESIGN_DEFAULTS.circle2;\n return {\n ...value,\n baseCompCtx: SvgCompositionContextPacker.unpack(value.baseCompCtx),\n circle1,\n circle2,\n useTwoCircles,\n };\n },\n};\n\nfunction loadSchemaVersion(version: string, buf: Buffer): AvroMandalaDesign {\n switch (version) {\n case \"v1\":\n const res = avroMandalaDesign.createResolver(avro.parse(MandalaAvscV1));\n return avroMandalaDesign.fromBuffer(buf, res);\n\n case LATEST_VERSION:\n return avroMandalaDesign.fromBuffer(buf);\n\n default:\n throw new Error(`Don't know how to load schema version ${version}`);\n }\n}\n\nexport function serializeMandalaDesign(value: MandalaDesign): string {\n const buf = avroMandalaDesign.toBuffer(DesignConfigPacker.pack(value));\n return `${LATEST_VERSION}.${toBase64(buf)}`;\n}\n\nexport function deserializeMandalaDesign(value: string): MandalaDesign {\n let version = \"v1\";\n if (value.indexOf(\".\") !== -1) {\n [version, value] = value.split(\".\", 2);\n }\n const buf = fromBase64(value);\n return DesignConfigPacker.unpack(loadSchemaVersion(version, buf));\n}\n", "import React, { useContext, useState } from \"react\";\nimport { AutoSizingSvg } from \"../auto-sizing-svg\";\nimport { CreatureContext, CreatureContextType } from \"../creature-symbol\";\nimport { createCreatureSymbolFactory } from \"../creature-symbol-factory\";\nimport { HoverDebugHelper } from \"../hover-debug-helper\";\nimport { Page } from \"../page\";\nimport { PaletteAlgorithmWidget } from \"../palette-algorithm-widget\";\nimport { Random } from \"../random\";\nimport {\n createRandomColorPalette,\n DEFAULT_RANDOM_PALETTE_ALGORITHM,\n RandomPaletteAlgorithm,\n} from \"../random-colors\";\nimport { createSvgSymbolContext } from \"../svg-symbol\";\nimport { svgScale, SvgTransform } from \"../svg-transform\";\nimport { SvgVocabulary } from \"../svg-vocabulary\";\nimport { SymbolContextWidget } from \"../symbol-context-widget\";\nimport { range } from \"../util\";\n\nconst symbol = createCreatureSymbolFactory(SvgVocabulary);\n\nconst Eye = symbol(\"eye\");\n\nconst Hand = symbol(\"hand\");\n\nconst Arm = symbol(\"arm\");\n\nconst Antler = symbol(\"antler\");\n\nconst Crown = symbol(\"crown\");\n\nconst Wing = symbol(\"wing\");\n\nconst MuscleArm = symbol(\"muscle_arm\");\n\nconst Leg = symbol(\"leg\");\n\nconst Tail = symbol(\"tail\");\n\nconst Lightning = symbol(\"lightning\");\n\nconst EYE_CREATURE = (\n <Eye>\n <Lightning nestInside />\n <Arm attachTo=\"arm\" left>\n <Wing attachTo=\"arm\" left right />\n </Arm>\n <Arm attachTo=\"arm\" right>\n <MuscleArm attachTo=\"arm\" left right />\n </Arm>\n <Antler attachTo=\"horn\" left right />\n <Crown attachTo=\"crown\">\n <Hand attachTo=\"horn\" left right>\n <Arm attachTo=\"arm\" left />\n </Hand>\n </Crown>\n <Leg attachTo=\"leg\" left right />\n <Tail attachTo=\"tail\" invert />\n </Eye>\n);\n\nconst RandomColorSampling: React.FC<{}> = () => {\n const [paletteAlg, setPaletteAlg] = useState<RandomPaletteAlgorithm>(\n DEFAULT_RANDOM_PALETTE_ALGORITHM\n );\n const [seed, setSeed] = useState(Date.now());\n const NUM_COLORS = 100;\n const rng = new Random(seed);\n const palette = createRandomColorPalette(NUM_COLORS, rng, paletteAlg);\n\n return (\n <>\n <PaletteAlgorithmWidget value={paletteAlg} onChange={setPaletteAlg} />\n <div className=\"thingy\">\n <div style={{ fontSize: 0 }}>\n {range(NUM_COLORS).map((i) => (\n <div\n key={i}\n style={{\n backgroundColor: palette[i],\n width: \"1rem\",\n height: \"1rem\",\n display: \"inline-block\",\n }}\n />\n ))}\n </div>\n </div>\n <div className=\"thingy\">\n <button onClick={() => setSeed(Date.now())}>Regenerate colors</button>\n </div>\n </>\n );\n};\n\nexport const DebugPage: React.FC<{}> = () => {\n const [symbolCtx, setSymbolCtx] = useState(createSvgSymbolContext());\n const defaultCtx = useContext(CreatureContext);\n const ctx: CreatureContextType = {\n ...defaultCtx,\n ...symbolCtx,\n fill: symbolCtx.showSpecs ? \"none\" : symbolCtx.fill,\n };\n\n return (\n <Page title=\"Debug!\">\n <div className=\"sidebar\">\n <SymbolContextWidget ctx={symbolCtx} onChange={setSymbolCtx} />\n <h2>Random color sampling</h2>\n <RandomColorSampling />\n </div>\n <div className=\"canvas\">\n <CreatureContext.Provider value={ctx}>\n <HoverDebugHelper>\n <AutoSizingSvg padding={20}>\n <SvgTransform transform={svgScale(0.5)}>\n {EYE_CREATURE}\n </SvgTransform>\n </AutoSizingSvg>\n </HoverDebugHelper>\n </CreatureContext.Provider>\n </div>\n </Page>\n );\n};\n", "import React from \"react\";\nimport {\n AttachedCreatureSymbol,\n CreatureSymbol,\n NestedCreatureSymbol,\n} from \"./creature-symbol\";\nimport { AttachmentPointType } from \"./specs\";\nimport { SvgSymbolData } from \"./svg-symbol\";\nimport { Vocabulary } from \"./vocabulary\";\n\ntype AttachmentIndices = {\n left?: boolean;\n right?: boolean;\n};\n\ntype AttachmentChildren = JSX.Element | JSX.Element[];\n\ntype SimpleCreatureSymbolProps = AttachmentIndices & {\n nestInside?: boolean;\n children?: AttachmentChildren;\n attachTo?: AttachmentPointType;\n invert?: boolean;\n indices?: number[];\n};\n\nfunction getAttachmentIndices(ai: AttachmentIndices): number[] {\n const result: number[] = [];\n\n if (ai.left) {\n result.push(0);\n }\n if (ai.right) {\n result.push(1);\n }\n if (result.length === 0) {\n result.push(0);\n }\n return result;\n}\n\ntype SplitCreatureSymbolChildren = {\n attachments: JSX.Element[];\n nests: JSX.Element[];\n};\n\nfunction splitCreatureSymbolChildren(\n children?: AttachmentChildren\n): SplitCreatureSymbolChildren {\n const result: SplitCreatureSymbolChildren = {\n attachments: [],\n nests: [],\n };\n if (!children) return result;\n\n React.Children.forEach(children, (child) => {\n if (child.props.nestInside) {\n result.nests.push(child);\n } else {\n result.attachments.push(child);\n }\n });\n\n return result;\n}\n\ntype SimpleCreatureSymbolFC = React.FC<SimpleCreatureSymbolProps> & {\n creatureSymbolData: SvgSymbolData;\n};\n\n/**\n * Create a factory that can be used to return React components to\n * render a `<CreatureSymbol>`.\n */\nexport function createCreatureSymbolFactory(\n vocabulary: Vocabulary<SvgSymbolData>\n) {\n /**\n * Returns a React component that renders a `<CreatureSymbol>`, using the symbol\n * with the given name as its default data.\n */\n return function createCreatureSymbol(\n name: string\n ): React.FC<SimpleCreatureSymbolProps> {\n const data = vocabulary.get(name);\n const Component: SimpleCreatureSymbolFC = (props) => {\n const symbol = getCreatureSymbol(data, props);\n return <CreatureSymbol {...symbol} />;\n };\n Component.creatureSymbolData = data;\n return Component;\n };\n}\n\nfunction isSimpleCreatureSymbolFC(fn: any): fn is SimpleCreatureSymbolFC {\n return !!fn.creatureSymbolData;\n}\n\nfunction extractNestedCreatureSymbol(el: JSX.Element): NestedCreatureSymbol {\n const base = extractCreatureSymbolFromElement(el);\n const props: SimpleCreatureSymbolProps = el.props;\n const indices = props.indices || getAttachmentIndices(props);\n const result: NestedCreatureSymbol = {\n ...base,\n indices,\n };\n return result;\n}\n\nfunction extractAttachedCreatureSymbol(\n el: JSX.Element\n): AttachedCreatureSymbol {\n const base = extractNestedCreatureSymbol(el);\n const props: SimpleCreatureSymbolProps = el.props;\n const { attachTo } = props;\n if (!attachTo) {\n throw new Error(\"Expected attachment to have `attachTo` prop!\");\n }\n const result: AttachedCreatureSymbol = {\n ...base,\n attachTo,\n };\n return result;\n}\n\nfunction getCreatureSymbol(\n data: SvgSymbolData,\n props: SimpleCreatureSymbolProps\n): CreatureSymbol {\n const { attachments, nests } = splitCreatureSymbolChildren(props.children);\n const result: CreatureSymbol = {\n data,\n attachments: attachments.map(extractAttachedCreatureSymbol),\n nests: nests.map(extractNestedCreatureSymbol),\n invertColors: props.invert ?? false,\n };\n return result;\n}\n\nfunction extractCreatureSymbolFromElement(el: JSX.Element): CreatureSymbol {\n if (isSimpleCreatureSymbolFC(el.type)) {\n return getCreatureSymbol(el.type.creatureSymbolData, el.props);\n }\n throw new Error(\"Found unknown component type!\");\n}\n", "import React, { useContext, useEffect, useRef } from \"react\";\nimport { AutoSizingSvg } from \"../auto-sizing-svg\";\nimport {\n CreatureContext,\n CreatureContextType,\n CreatureSymbol,\n} from \"../creature-symbol\";\nimport {\n GalleryComposition,\n GalleryCompositionKind,\n GalleryContext,\n} from \"../gallery-context\";\nimport { LoadingIndicator } from \"../loading-indicator\";\nimport { Page } from \"../page\";\nimport { createPageWithStateSearchParams } from \"../page-with-shareable-state\";\nimport { svgScale, SvgTransform } from \"../svg-transform\";\nimport { CreatureDesign } from \"./creature-page/core\";\nimport { deserializeCreatureDesign } from \"./creature-page/serialization\";\nimport { getFriendlyPageName } from \"./friendly-page-names\";\n\nimport \"./gallery-page.css\";\nimport {\n createMandalaAnimationRenderer,\n MandalaDesign,\n} from \"./mandala-page/core\";\nimport { deserializeMandalaDesign } from \"./mandala-page/serialization\";\n\nfunction compositionRemixUrl(comp: GalleryComposition): string {\n return (\n \"?\" +\n createPageWithStateSearchParams(comp.kind, comp.serializedValue).toString()\n );\n}\n\nconst THUMBNAIL_CLASS = \"gallery-thumbnail canvas\";\n\nconst THUMBNAIL_SCALE = 0.2;\n\nconst ErrorThumbnail: React.FC<{ title?: string }> = ({ title }) => (\n <div className={THUMBNAIL_CLASS + \" is-empty\"} title={title}>\n <span>\u2639</span>\n </div>\n);\n\nconst CreatureThumbnail: React.FC<{ design: CreatureDesign }> = (props) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const ctx: CreatureContextType = {\n ...useContext(CreatureContext),\n ...props.design.compCtx,\n };\n const { background } = props.design.compCtx;\n\n return (\n <div className={THUMBNAIL_CLASS} style={{ backgroundColor: background }}>\n <CreatureContext.Provider value={ctx}>\n <AutoSizingSvg padding={10} ref={svgRef} bgColor={background}>\n <SvgTransform transform={svgScale(THUMBNAIL_SCALE)}>\n <CreatureSymbol {...props.design.creature} />\n </SvgTransform>\n </AutoSizingSvg>\n </CreatureContext.Provider>\n </div>\n );\n};\n\nconst MandalaThumbnail: React.FC<{ design: MandalaDesign }> = (props) => {\n const render = createMandalaAnimationRenderer(props.design, THUMBNAIL_SCALE);\n const { background } = props.design.baseCompCtx;\n const svgRef = useRef<SVGSVGElement>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n\n return (\n <div\n className={THUMBNAIL_CLASS}\n style={{ backgroundColor: background }}\n ref={canvasRef}\n >\n <AutoSizingSvg\n ref={svgRef}\n bgColor={background}\n sizeToElement={canvasRef}\n >\n {render(0)}\n </AutoSizingSvg>\n </div>\n );\n};\n\nconst THUMBNAILERS: {\n [key in GalleryCompositionKind]: (gc: GalleryComposition) => JSX.Element;\n} = {\n creature: (gc) => (\n <CreatureThumbnail design={deserializeCreatureDesign(gc.serializedValue)} />\n ),\n mandala: (gc) => (\n <MandalaThumbnail design={deserializeMandalaDesign(gc.serializedValue)} />\n ),\n};\n\nfunction getThumbnail(gc: GalleryComposition): JSX.Element {\n let errorTitle: string;\n\n if (gc.kind in THUMBNAILERS) {\n try {\n return THUMBNAILERS[gc.kind](gc);\n } catch (e) {\n errorTitle = `Could not deserialize ${gc.kind} \"${gc.title}\": ${e.message}`;\n console.error(e);\n }\n } else {\n errorTitle = `Found unknown gallery composition kind \"${gc.kind}\".`;\n }\n\n console.log(errorTitle);\n\n return <ErrorThumbnail title={errorTitle} />;\n}\n\nconst GalleryCompositionView: React.FC<GalleryComposition> = (props) => {\n const thumbnail = getThumbnail(props);\n const url = compositionRemixUrl(props);\n\n return (\n <div className=\"gallery-item\">\n <a href={url} target=\"_blank\">\n {thumbnail}\n </a>\n <p>\n <a href={url} target=\"_blank\">\n {props.title}\n </a>{\" \"}\n {getFriendlyPageName(props.kind)} by {props.ownerName}\n </p>\n </div>\n );\n};\n\nexport const GalleryPage: React.FC<{}> = () => {\n const ctx = useContext(GalleryContext);\n\n useEffect(() => {\n if (ctx.lastRefresh === 0) {\n ctx.refresh();\n }\n }, [ctx]);\n\n return (\n <Page title=\"Gallery!\">\n <div className=\"sidebar\">\n <p style={{ marginTop: \"0\" }}>\n You can publish to this gallery via the sidebar on other pages of this\n site.\n </p>\n <button onClick={ctx.refresh} disabled={ctx.isLoading}>\n {ctx.isLoading ? \"Loading\\u2026\" : \"Refresh\"}\n </button>\n {ctx.error && <p className=\"error\">{ctx.error}</p>}\n </div>\n <div className=\"canvas scrollable\">\n {ctx.isLoading ? (\n <LoadingIndicator />\n ) : (\n ctx.compositions.map((comp) => (\n <GalleryCompositionView key={comp.id} {...comp} />\n ))\n )}\n </div>\n </Page>\n );\n};\n", "import React from \"react\";\n\nimport \"./loading-indicator.css\";\n\n/**\n * Loading indicator taken from:\n *\n * https://commons.wikimedia.org/wiki/File:Chromiumthrobber.svg\n */\nexport const LoadingIndicator: React.FC = () => (\n <div className=\"loading-indicator\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 300 300\"\n xmlns=\"http://www.w3.org/2000/svg\"\n version=\"1.1\"\n >\n <path\n d=\"M 150,0\n a 150,150 0 0,1 106.066,256.066\n l -35.355,-35.355\n a -100,-100 0 0,0 -70.711,-170.711 z\"\n >\n <animateTransform\n attributeName=\"transform\"\n attributeType=\"XML\"\n type=\"rotate\"\n from=\"0 150 150\"\n to=\"360 150 150\"\n begin=\"0s\"\n dur=\"1s\"\n fill=\"freeze\"\n repeatCount=\"indefinite\"\n />\n </path>\n </svg>\n </div>\n);\n"],
"mappings": "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",
"names": []
}