@mtcute/core 0.7.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +26 -3
- package/cjs/highlevel/base.d.ts +3 -1
- package/cjs/highlevel/base.js +18 -0
- package/cjs/highlevel/base.js.map +1 -1
- package/cjs/highlevel/client.d.ts +23 -10
- package/cjs/highlevel/client.js +26 -19
- package/cjs/highlevel/client.js.map +1 -1
- package/cjs/highlevel/client.types.d.ts +14 -0
- package/cjs/highlevel/client.types.js.map +1 -1
- package/cjs/highlevel/index.d.ts +0 -2
- package/cjs/highlevel/index.js +0 -2
- package/cjs/highlevel/index.js.map +1 -1
- package/cjs/highlevel/methods/_imports.js.map +1 -1
- package/cjs/highlevel/methods/_init.js +4 -29
- package/cjs/highlevel/methods/_init.js.map +1 -1
- package/cjs/highlevel/methods/bots/get-callback-answer.js +2 -2
- package/cjs/highlevel/methods/bots/get-callback-answer.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/create-folder.js +1 -1
- package/cjs/highlevel/methods/dialogs/create-folder.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/edit-folder.js +1 -1
- package/cjs/highlevel/methods/dialogs/edit-folder.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/find-folder.js +1 -1
- package/cjs/highlevel/methods/dialogs/find-folder.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/get-folders.d.ts +1 -1
- package/cjs/highlevel/methods/dialogs/get-folders.js +1 -1
- package/cjs/highlevel/methods/dialogs/get-folders.js.map +1 -1
- package/cjs/highlevel/methods/files/download-file.d.ts +1 -10
- package/cjs/highlevel/methods/files/download-file.js +1 -32
- package/cjs/highlevel/methods/files/download-file.js.map +1 -1
- package/cjs/highlevel/methods/files/download-iterable.js +2 -1
- package/cjs/highlevel/methods/files/download-iterable.js.map +1 -1
- package/cjs/highlevel/methods/files/download-node-stream.js +4 -0
- package/cjs/highlevel/methods/files/download-node-stream.js.map +1 -0
- package/cjs/highlevel/methods/files/normalize-input-media.d.ts +1 -1
- package/cjs/highlevel/methods/files/normalize-input-media.js +2 -1
- package/cjs/highlevel/methods/files/normalize-input-media.js.map +1 -1
- package/cjs/highlevel/methods/files/upload-file.d.ts +0 -3
- package/cjs/highlevel/methods/files/upload-file.js +24 -11
- package/cjs/highlevel/methods/files/upload-file.js.map +1 -1
- package/cjs/highlevel/methods/messages/find-in-update.js +23 -8
- package/cjs/highlevel/methods/messages/find-in-update.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-media-group.d.ts +1 -1
- package/cjs/highlevel/methods/messages/send-media-group.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-media.d.ts +2 -2
- package/cjs/highlevel/methods/messages/send-media.js +5 -4
- package/cjs/highlevel/methods/messages/send-media.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-text.d.ts +1 -1
- package/cjs/highlevel/methods/messages/send-text.js +7 -6
- package/cjs/highlevel/methods/messages/send-text.js.map +1 -1
- package/cjs/highlevel/methods/misc/with-params.d.ts +10 -0
- package/cjs/highlevel/methods/misc/with-params.js +32 -0
- package/cjs/highlevel/methods/misc/with-params.js.map +1 -0
- package/cjs/highlevel/methods.d.ts +13 -1
- package/cjs/highlevel/methods.js +4 -6
- package/cjs/highlevel/methods.js.map +1 -1
- package/cjs/highlevel/types/bots/command-scope/index.d.ts +10 -0
- package/cjs/highlevel/types/bots/command-scope/index.js +29 -0
- package/cjs/highlevel/types/bots/command-scope/index.js.map +1 -0
- package/cjs/highlevel/types/bots/command-scope/inner.d.ts +54 -0
- package/cjs/highlevel/types/bots/command-scope/inner.js +76 -0
- package/cjs/highlevel/types/bots/command-scope/inner.js.map +1 -0
- package/cjs/highlevel/types/bots/index.d.ts +4 -4
- package/cjs/highlevel/types/bots/index.js +4 -4
- package/cjs/highlevel/types/bots/index.js.map +1 -1
- package/cjs/highlevel/types/bots/inline-message/factories.d.ts +43 -0
- package/cjs/highlevel/types/bots/inline-message/factories.js +175 -0
- package/cjs/highlevel/types/bots/inline-message/factories.js.map +1 -0
- package/cjs/highlevel/types/bots/inline-message/index.d.ts +3 -0
- package/cjs/highlevel/types/bots/inline-message/index.js +33 -0
- package/cjs/highlevel/types/bots/inline-message/index.js.map +1 -0
- package/{esm/highlevel/types/bots/input/input-inline-message.d.ts → cjs/highlevel/types/bots/inline-message/types.d.ts} +2 -45
- package/cjs/highlevel/types/bots/inline-message/types.js +3 -0
- package/cjs/highlevel/types/bots/inline-message/types.js.map +1 -0
- package/cjs/highlevel/types/bots/inline-result/factories.d.ts +94 -0
- package/cjs/highlevel/types/bots/inline-result/factories.js +486 -0
- package/cjs/highlevel/types/bots/inline-result/factories.js.map +1 -0
- package/cjs/highlevel/types/bots/inline-result/index.d.ts +3 -0
- package/cjs/highlevel/types/bots/inline-result/index.js +33 -0
- package/cjs/highlevel/types/bots/inline-result/index.js.map +1 -0
- package/{esm/highlevel/types/bots/input/input-inline-result.d.ts → cjs/highlevel/types/bots/inline-result/types.d.ts} +1 -95
- package/cjs/highlevel/types/bots/inline-result/types.js +3 -0
- package/cjs/highlevel/types/bots/inline-result/types.js.map +1 -0
- package/cjs/highlevel/types/bots/{keyboard-builder.d.ts → keyboards/builder.d.ts} +1 -1
- package/cjs/highlevel/types/bots/{keyboard-builder.js → keyboards/builder.js} +1 -1
- package/cjs/highlevel/types/bots/keyboards/builder.js.map +1 -0
- package/cjs/highlevel/types/bots/keyboards/factories.d.ts +195 -0
- package/cjs/highlevel/types/bots/keyboards/factories.js +366 -0
- package/cjs/highlevel/types/bots/keyboards/factories.js.map +1 -0
- package/cjs/highlevel/types/bots/keyboards/index.d.ts +14 -0
- package/cjs/highlevel/types/bots/keyboards/index.js +33 -0
- package/cjs/highlevel/types/bots/keyboards/index.js.map +1 -0
- package/cjs/highlevel/types/bots/keyboards/types.d.ts +34 -0
- package/cjs/highlevel/types/bots/keyboards/types.js +3 -0
- package/cjs/highlevel/types/bots/keyboards/types.js.map +1 -0
- package/cjs/highlevel/types/files/utils.d.ts +9 -6
- package/cjs/highlevel/types/files/utils.js.map +1 -1
- package/cjs/highlevel/types/media/document.js +3 -2
- package/cjs/highlevel/types/media/document.js.map +1 -1
- package/cjs/highlevel/types/media/index.d.ts +1 -1
- package/cjs/highlevel/types/media/index.js +1 -1
- package/cjs/highlevel/types/media/index.js.map +1 -1
- package/cjs/highlevel/types/media/input-media/factories.d.ts +141 -0
- package/cjs/highlevel/types/media/input-media/factories.js +250 -0
- package/cjs/highlevel/types/media/input-media/factories.js.map +1 -0
- package/cjs/highlevel/types/media/input-media/index.d.ts +3 -0
- package/cjs/highlevel/types/media/input-media/index.js +33 -0
- package/cjs/highlevel/types/media/input-media/index.js.map +1 -0
- package/cjs/highlevel/types/media/{input-media.d.ts → input-media/types.d.ts} +5 -145
- package/cjs/highlevel/types/media/input-media/types.js +3 -0
- package/cjs/highlevel/types/media/input-media/types.js.map +1 -0
- package/cjs/highlevel/types/media/thumbnail.js +5 -4
- package/cjs/highlevel/types/media/thumbnail.js.map +1 -1
- package/cjs/highlevel/types/messages/message.d.ts +1 -1
- package/cjs/highlevel/types/messages/message.js +3 -3
- package/cjs/highlevel/types/messages/message.js.map +1 -1
- package/cjs/highlevel/types/misc/index.d.ts +1 -1
- package/cjs/highlevel/types/misc/index.js +1 -1
- package/cjs/highlevel/types/misc/index.js.map +1 -1
- package/cjs/highlevel/types/misc/input-privacy-rule/allow.d.ts +22 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/allow.js +36 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/allow.js.map +1 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/bundle.d.ts +3 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/bundle.js +31 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/bundle.js.map +1 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/disallow.d.ts +20 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/disallow.js +32 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/disallow.js.map +1 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/index.d.ts +3 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/index.js +33 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/index.js.map +1 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/types.d.ts +11 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/types.js +3 -0
- package/cjs/highlevel/types/misc/input-privacy-rule/types.js.map +1 -0
- package/cjs/highlevel/types/peers/chat-photo.js +3 -2
- package/cjs/highlevel/types/peers/chat-photo.js.map +1 -1
- package/cjs/highlevel/types/updates/callback-query.js +2 -2
- package/cjs/highlevel/types/updates/callback-query.js.map +1 -1
- package/cjs/highlevel/types/updates/user-status-update.js +1 -1
- package/cjs/highlevel/types/updates/user-status-update.js.map +1 -1
- package/cjs/highlevel/updates/manager.d.ts +5 -3
- package/cjs/highlevel/updates/manager.js +81 -67
- package/cjs/highlevel/updates/manager.js.map +1 -1
- package/cjs/highlevel/utils/convert-file-id.js +7 -6
- package/cjs/highlevel/utils/convert-file-id.js.map +1 -1
- package/cjs/highlevel/utils/file-utils.js +8 -4
- package/cjs/highlevel/utils/file-utils.js.map +1 -1
- package/cjs/highlevel/utils/inline-utils.js +3 -2
- package/cjs/highlevel/utils/inline-utils.js.map +1 -1
- package/cjs/highlevel/utils/inspectable.d.ts +1 -1
- package/cjs/highlevel/utils/inspectable.js +3 -2
- package/cjs/highlevel/utils/inspectable.js.map +1 -1
- package/cjs/highlevel/utils/memoize.d.ts +1 -1
- package/cjs/highlevel/utils/memoize.js +1 -0
- package/cjs/highlevel/utils/memoize.js.map +1 -1
- package/cjs/highlevel/utils/stream-utils.d.ts +0 -2
- package/cjs/highlevel/utils/stream-utils.js +1 -28
- package/cjs/highlevel/utils/stream-utils.js.map +1 -1
- package/cjs/highlevel/utils/string-session.js +3 -2
- package/cjs/highlevel/utils/string-session.js.map +1 -1
- package/cjs/highlevel/worker/index.d.ts +3 -0
- package/cjs/highlevel/{types/bots/input → worker}/index.js +3 -2
- package/cjs/highlevel/worker/index.js.map +1 -0
- package/cjs/highlevel/worker/port.d.ts +6 -3
- package/cjs/highlevel/worker/port.js +8 -2
- package/cjs/highlevel/worker/port.js.map +1 -1
- package/cjs/highlevel/worker/protocol.d.ts +5 -1
- package/cjs/highlevel/worker/protocol.js.map +1 -1
- package/cjs/highlevel/worker/worker.d.ts +11 -4
- package/cjs/highlevel/worker/worker.js +53 -49
- package/cjs/highlevel/worker/worker.js.map +1 -1
- package/cjs/network/client.d.ts +4 -4
- package/cjs/network/client.js +3 -1
- package/cjs/network/client.js.map +1 -1
- package/cjs/network/multi-session-connection.d.ts +1 -0
- package/cjs/network/multi-session-connection.js +6 -0
- package/cjs/network/multi-session-connection.js.map +1 -1
- package/cjs/network/network-manager.d.ts +5 -1
- package/cjs/network/network-manager.js +24 -15
- package/cjs/network/network-manager.js.map +1 -1
- package/cjs/network/persistent-connection.d.ts +3 -0
- package/cjs/network/persistent-connection.js +23 -1
- package/cjs/network/persistent-connection.js.map +1 -1
- package/cjs/network/session-connection.d.ts +2 -0
- package/cjs/network/session-connection.js +18 -4
- package/cjs/network/session-connection.js.map +1 -1
- package/cjs/network/transports/index.d.ts +0 -3
- package/cjs/network/transports/index.js +0 -4
- package/cjs/network/transports/index.js.map +1 -1
- package/cjs/platform.d.ts +18 -0
- package/cjs/platform.js +36 -0
- package/cjs/platform.js.map +1 -0
- package/cjs/storage/index.d.ts +2 -2
- package/cjs/storage/index.js +2 -2
- package/cjs/storage/index.js.map +1 -1
- package/{esm/storage/providers → cjs/storage}/memory/driver.d.ts +1 -1
- package/cjs/storage/memory/driver.js.map +1 -0
- package/{esm/storage/providers → cjs/storage}/memory/index.d.ts +2 -2
- package/cjs/storage/memory/index.js.map +1 -0
- package/cjs/storage/{providers/memory → memory}/repository/auth-keys.d.ts +1 -1
- package/cjs/storage/memory/repository/auth-keys.js.map +1 -0
- package/{esm/storage/providers → cjs/storage}/memory/repository/kv.d.ts +1 -1
- package/cjs/storage/memory/repository/kv.js.map +1 -0
- package/{esm/storage/providers → cjs/storage}/memory/repository/peers.d.ts +1 -1
- package/cjs/storage/memory/repository/peers.js.map +1 -0
- package/{esm/storage/providers → cjs/storage}/memory/repository/ref-messages.d.ts +1 -1
- package/cjs/storage/memory/repository/ref-messages.js.map +1 -0
- package/cjs/storage/sqlite/driver.d.ts +24 -0
- package/cjs/storage/sqlite/driver.js +129 -0
- package/cjs/storage/sqlite/driver.js.map +1 -0
- package/cjs/storage/sqlite/index.d.ts +17 -0
- package/cjs/storage/sqlite/index.js +35 -0
- package/cjs/storage/sqlite/index.js.map +1 -0
- package/cjs/storage/sqlite/repository/auth-keys.d.ts +20 -0
- package/cjs/storage/sqlite/repository/auth-keys.js +68 -0
- package/cjs/storage/sqlite/repository/auth-keys.js.map +1 -0
- package/cjs/storage/sqlite/repository/kv.d.ts +14 -0
- package/cjs/storage/sqlite/repository/kv.js +96 -0
- package/cjs/storage/sqlite/repository/kv.js.map +1 -0
- package/cjs/storage/sqlite/repository/peers.d.ts +16 -0
- package/cjs/storage/sqlite/repository/peers.js +77 -0
- package/cjs/storage/sqlite/repository/peers.js.map +1 -0
- package/cjs/storage/sqlite/repository/ref-messages.d.ts +16 -0
- package/cjs/storage/sqlite/repository/ref-messages.js +49 -0
- package/cjs/storage/sqlite/repository/ref-messages.js.map +1 -0
- package/cjs/storage/sqlite/types.d.ts +18 -0
- package/cjs/storage/sqlite/types.js +3 -0
- package/cjs/storage/sqlite/types.js.map +1 -0
- package/cjs/storage/storage.js +2 -1
- package/cjs/storage/storage.js.map +1 -1
- package/cjs/utils/binary/asn1-parser.js +3 -3
- package/cjs/utils/binary/asn1-parser.js.map +1 -1
- package/cjs/utils/crypto/abstract.d.ts +0 -1
- package/cjs/utils/crypto/abstract.js.map +1 -1
- package/cjs/utils/crypto/index.d.ts +0 -2
- package/cjs/utils/crypto/index.js +0 -3
- package/cjs/utils/crypto/index.js.map +1 -1
- package/cjs/utils/crypto/keys.js +5 -3
- package/cjs/utils/crypto/keys.js.map +1 -1
- package/cjs/utils/crypto/password.js +3 -3
- package/cjs/utils/crypto/password.js.map +1 -1
- package/cjs/utils/dcs.d.ts +4 -0
- package/cjs/utils/dcs.js +0 -4
- package/cjs/utils/dcs.js.map +1 -1
- package/cjs/utils/{platform/error-reporting.d.ts → error-reporting.d.ts} +1 -1
- package/cjs/utils/error-reporting.js.map +1 -0
- package/cjs/utils/index.d.ts +4 -1
- package/cjs/utils/index.js +6 -1
- package/cjs/utils/index.js.map +1 -1
- package/cjs/utils/links/common.js +1 -1
- package/cjs/utils/links/common.js.map +1 -1
- package/cjs/utils/logger.d.ts +1 -0
- package/cjs/utils/logger.js +9 -22
- package/cjs/utils/logger.js.map +1 -1
- package/esm/highlevel/base.d.ts +3 -1
- package/esm/highlevel/base.js +18 -0
- package/esm/highlevel/base.js.map +1 -1
- package/esm/highlevel/client.d.ts +23 -10
- package/esm/highlevel/client.js +12 -19
- package/esm/highlevel/client.js.map +1 -1
- package/esm/highlevel/client.types.d.ts +14 -0
- package/esm/highlevel/client.types.js.map +1 -1
- package/esm/highlevel/index.d.ts +0 -2
- package/esm/highlevel/index.js +0 -2
- package/esm/highlevel/index.js.map +1 -1
- package/esm/highlevel/methods/_imports.js.map +1 -1
- package/esm/highlevel/methods/_init.js +4 -29
- package/esm/highlevel/methods/_init.js.map +1 -1
- package/esm/highlevel/methods/bots/get-callback-answer.js +2 -2
- package/esm/highlevel/methods/bots/get-callback-answer.js.map +1 -1
- package/esm/highlevel/methods/dialogs/create-folder.js +1 -1
- package/esm/highlevel/methods/dialogs/create-folder.js.map +1 -1
- package/esm/highlevel/methods/dialogs/edit-folder.js +1 -1
- package/esm/highlevel/methods/dialogs/edit-folder.js.map +1 -1
- package/esm/highlevel/methods/dialogs/find-folder.js +1 -1
- package/esm/highlevel/methods/dialogs/find-folder.js.map +1 -1
- package/esm/highlevel/methods/dialogs/get-folders.d.ts +1 -1
- package/esm/highlevel/methods/dialogs/get-folders.js +1 -1
- package/esm/highlevel/methods/dialogs/get-folders.js.map +1 -1
- package/esm/highlevel/methods/files/download-file.d.ts +1 -10
- package/esm/highlevel/methods/files/download-file.js +2 -30
- package/esm/highlevel/methods/files/download-file.js.map +1 -1
- package/esm/highlevel/methods/files/download-iterable.js +2 -1
- package/esm/highlevel/methods/files/download-iterable.js.map +1 -1
- package/esm/highlevel/methods/files/download-node-stream.js +3 -0
- package/esm/highlevel/methods/files/download-node-stream.js.map +1 -0
- package/esm/highlevel/methods/files/normalize-input-media.d.ts +1 -1
- package/esm/highlevel/methods/files/normalize-input-media.js +2 -1
- package/esm/highlevel/methods/files/normalize-input-media.js.map +1 -1
- package/esm/highlevel/methods/files/upload-file.d.ts +0 -3
- package/esm/highlevel/methods/files/upload-file.js +24 -11
- package/esm/highlevel/methods/files/upload-file.js.map +1 -1
- package/esm/highlevel/methods/messages/find-in-update.js +23 -8
- package/esm/highlevel/methods/messages/find-in-update.js.map +1 -1
- package/esm/highlevel/methods/messages/send-media-group.d.ts +1 -1
- package/esm/highlevel/methods/messages/send-media-group.js.map +1 -1
- package/esm/highlevel/methods/messages/send-media.d.ts +2 -2
- package/esm/highlevel/methods/messages/send-media.js +4 -3
- package/esm/highlevel/methods/messages/send-media.js.map +1 -1
- package/esm/highlevel/methods/messages/send-text.d.ts +1 -1
- package/esm/highlevel/methods/messages/send-text.js +4 -3
- package/esm/highlevel/methods/messages/send-text.js.map +1 -1
- package/esm/highlevel/methods/misc/with-params.d.ts +10 -0
- package/esm/highlevel/methods/misc/with-params.js +28 -0
- package/esm/highlevel/methods/misc/with-params.js.map +1 -0
- package/esm/highlevel/methods.d.ts +13 -1
- package/esm/highlevel/methods.js +0 -1
- package/esm/highlevel/methods.js.map +1 -1
- package/esm/highlevel/types/auth/sent-code.js +4 -3
- package/esm/highlevel/types/bots/command-scope/index.d.ts +10 -0
- package/esm/highlevel/types/bots/command-scope/index.js +11 -0
- package/esm/highlevel/types/bots/command-scope/index.js.map +1 -0
- package/esm/highlevel/types/bots/command-scope/inner.d.ts +54 -0
- package/esm/highlevel/types/bots/command-scope/inner.js +69 -0
- package/esm/highlevel/types/bots/command-scope/inner.js.map +1 -0
- package/esm/highlevel/types/bots/game-high-score.js +5 -4
- package/esm/highlevel/types/bots/index.d.ts +4 -4
- package/esm/highlevel/types/bots/index.js +4 -4
- package/esm/highlevel/types/bots/index.js.map +1 -1
- package/esm/highlevel/types/bots/inline-message/factories.d.ts +43 -0
- package/esm/highlevel/types/bots/inline-message/factories.js +163 -0
- package/esm/highlevel/types/bots/inline-message/factories.js.map +1 -0
- package/esm/highlevel/types/bots/inline-message/index.d.ts +3 -0
- package/esm/highlevel/types/bots/inline-message/index.js +4 -0
- package/esm/highlevel/types/bots/inline-message/index.js.map +1 -0
- package/{cjs/highlevel/types/bots/input/input-inline-message.d.ts → esm/highlevel/types/bots/inline-message/types.d.ts} +2 -45
- package/esm/highlevel/types/bots/inline-message/types.js +2 -0
- package/esm/highlevel/types/bots/inline-message/types.js.map +1 -0
- package/esm/highlevel/types/bots/inline-result/factories.d.ts +94 -0
- package/esm/highlevel/types/bots/inline-result/factories.js +470 -0
- package/esm/highlevel/types/bots/inline-result/factories.js.map +1 -0
- package/esm/highlevel/types/bots/inline-result/index.d.ts +3 -0
- package/esm/highlevel/types/bots/inline-result/index.js +4 -0
- package/esm/highlevel/types/bots/inline-result/index.js.map +1 -0
- package/{cjs/highlevel/types/bots/input/input-inline-result.d.ts → esm/highlevel/types/bots/inline-result/types.d.ts} +1 -95
- package/esm/highlevel/types/bots/inline-result/types.js +2 -0
- package/esm/highlevel/types/bots/inline-result/types.js.map +1 -0
- package/esm/highlevel/types/bots/{keyboard-builder.d.ts → keyboards/builder.d.ts} +1 -1
- package/esm/highlevel/types/bots/{keyboard-builder.js → keyboards/builder.js} +1 -1
- package/esm/highlevel/types/bots/keyboards/builder.js.map +1 -0
- package/esm/highlevel/types/bots/keyboards/factories.d.ts +195 -0
- package/esm/highlevel/types/bots/keyboards/factories.js +341 -0
- package/esm/highlevel/types/bots/keyboards/factories.js.map +1 -0
- package/esm/highlevel/types/bots/keyboards/index.d.ts +14 -0
- package/esm/highlevel/types/bots/keyboards/index.js +15 -0
- package/esm/highlevel/types/bots/keyboards/index.js.map +1 -0
- package/esm/highlevel/types/bots/keyboards/types.d.ts +34 -0
- package/esm/highlevel/types/bots/keyboards/types.js +2 -0
- package/esm/highlevel/types/bots/keyboards/types.js.map +1 -0
- package/esm/highlevel/types/files/file-location.js +4 -3
- package/esm/highlevel/types/files/utils.d.ts +9 -6
- package/esm/highlevel/types/files/utils.js.map +1 -1
- package/esm/highlevel/types/files/web-document.js +4 -3
- package/esm/highlevel/types/media/audio.js +5 -4
- package/esm/highlevel/types/media/contact.js +4 -3
- package/esm/highlevel/types/media/dice.js +4 -3
- package/esm/highlevel/types/media/document.js +8 -6
- package/esm/highlevel/types/media/document.js.map +1 -1
- package/esm/highlevel/types/media/game.js +5 -4
- package/esm/highlevel/types/media/index.d.ts +1 -1
- package/esm/highlevel/types/media/index.js +1 -1
- package/esm/highlevel/types/media/index.js.map +1 -1
- package/esm/highlevel/types/media/input-media/factories.d.ts +141 -0
- package/esm/highlevel/types/media/input-media/factories.js +228 -0
- package/esm/highlevel/types/media/input-media/factories.js.map +1 -0
- package/esm/highlevel/types/media/input-media/index.d.ts +3 -0
- package/esm/highlevel/types/media/input-media/index.js +4 -0
- package/esm/highlevel/types/media/input-media/index.js.map +1 -0
- package/esm/highlevel/types/media/{input-media.d.ts → input-media/types.d.ts} +5 -145
- package/esm/highlevel/types/media/input-media/types.js +2 -0
- package/esm/highlevel/types/media/input-media/types.js.map +1 -0
- package/esm/highlevel/types/media/invoice.js +9 -7
- package/esm/highlevel/types/media/location.js +7 -5
- package/esm/highlevel/types/media/photo.js +5 -4
- package/esm/highlevel/types/media/poll.js +5 -4
- package/esm/highlevel/types/media/sticker.js +5 -4
- package/esm/highlevel/types/media/story.js +4 -3
- package/esm/highlevel/types/media/thumbnail.js +10 -8
- package/esm/highlevel/types/media/thumbnail.js.map +1 -1
- package/esm/highlevel/types/media/venue.js +5 -4
- package/esm/highlevel/types/media/video.js +5 -4
- package/esm/highlevel/types/media/voice.js +5 -4
- package/esm/highlevel/types/media/web-page.js +5 -4
- package/esm/highlevel/types/messages/dialog.js +5 -4
- package/esm/highlevel/types/messages/draft-message.js +5 -4
- package/esm/highlevel/types/messages/message-entity.js +5 -4
- package/esm/highlevel/types/messages/message-forward.js +5 -4
- package/esm/highlevel/types/messages/message-reactions.js +5 -4
- package/esm/highlevel/types/messages/message-replies.js +5 -4
- package/esm/highlevel/types/messages/message.d.ts +1 -1
- package/esm/highlevel/types/messages/message.js +6 -5
- package/esm/highlevel/types/messages/message.js.map +1 -1
- package/esm/highlevel/types/messages/replied-message.js +5 -4
- package/esm/highlevel/types/misc/index.d.ts +1 -1
- package/esm/highlevel/types/misc/index.js +1 -1
- package/esm/highlevel/types/misc/index.js.map +1 -1
- package/esm/highlevel/types/misc/input-privacy-rule/allow.d.ts +22 -0
- package/esm/highlevel/types/misc/input-privacy-rule/allow.js +31 -0
- package/esm/highlevel/types/misc/input-privacy-rule/allow.js.map +1 -0
- package/esm/highlevel/types/misc/input-privacy-rule/bundle.d.ts +3 -0
- package/esm/highlevel/types/misc/input-privacy-rule/bundle.js +4 -0
- package/esm/highlevel/types/misc/input-privacy-rule/bundle.js.map +1 -0
- package/esm/highlevel/types/misc/input-privacy-rule/disallow.d.ts +20 -0
- package/esm/highlevel/types/misc/input-privacy-rule/disallow.js +27 -0
- package/esm/highlevel/types/misc/input-privacy-rule/disallow.js.map +1 -0
- package/esm/highlevel/types/misc/input-privacy-rule/index.d.ts +3 -0
- package/esm/highlevel/types/misc/input-privacy-rule/index.js +4 -0
- package/esm/highlevel/types/misc/input-privacy-rule/index.js.map +1 -0
- package/esm/highlevel/types/misc/input-privacy-rule/types.d.ts +11 -0
- package/esm/highlevel/types/misc/input-privacy-rule/types.js +2 -0
- package/esm/highlevel/types/misc/input-privacy-rule/types.js.map +1 -0
- package/esm/highlevel/types/misc/sticker-set.js +5 -4
- package/esm/highlevel/types/misc/takeout-session.js +4 -3
- package/esm/highlevel/types/peers/chat-colors.js +4 -3
- package/esm/highlevel/types/peers/chat-event/index.js +5 -4
- package/esm/highlevel/types/peers/chat-invite-link-member.js +5 -4
- package/esm/highlevel/types/peers/chat-invite-link.js +5 -4
- package/esm/highlevel/types/peers/chat-location.js +5 -4
- package/esm/highlevel/types/peers/chat-member.js +5 -4
- package/esm/highlevel/types/peers/chat-permissions.js +4 -3
- package/esm/highlevel/types/peers/chat-photo.js +12 -9
- package/esm/highlevel/types/peers/chat-photo.js.map +1 -1
- package/esm/highlevel/types/peers/chat-preview.js +5 -4
- package/esm/highlevel/types/peers/chat.js +5 -4
- package/esm/highlevel/types/peers/forum-topic.js +5 -4
- package/esm/highlevel/types/peers/user.js +5 -4
- package/esm/highlevel/types/premium/boost-slot.js +5 -4
- package/esm/highlevel/types/premium/boost-stats.js +4 -3
- package/esm/highlevel/types/premium/boost.js +5 -4
- package/esm/highlevel/types/reactions/emoji-status.js +4 -3
- package/esm/highlevel/types/reactions/peer-reaction.js +5 -4
- package/esm/highlevel/types/reactions/reaction-count.js +4 -3
- package/esm/highlevel/types/stories/all-stories.js +5 -4
- package/esm/highlevel/types/stories/interactive/channel-post.js +5 -4
- package/esm/highlevel/types/stories/interactive/location.js +5 -4
- package/esm/highlevel/types/stories/interactive/reaction.js +4 -3
- package/esm/highlevel/types/stories/interactive/venue.js +5 -4
- package/esm/highlevel/types/stories/peer-stories.js +5 -4
- package/esm/highlevel/types/stories/stealth-mode.js +4 -3
- package/esm/highlevel/types/stories/story-interactions.js +5 -4
- package/esm/highlevel/types/stories/story-viewer.js +9 -7
- package/esm/highlevel/types/stories/story.js +5 -4
- package/esm/highlevel/types/updates/bot-chat-join-request.js +5 -4
- package/esm/highlevel/types/updates/bot-reaction.js +9 -7
- package/esm/highlevel/types/updates/bot-stopped.js +5 -4
- package/esm/highlevel/types/updates/callback-query.js +11 -9
- package/esm/highlevel/types/updates/callback-query.js.map +1 -1
- package/esm/highlevel/types/updates/chat-join-request.js +5 -4
- package/esm/highlevel/types/updates/chat-member-update.js +5 -4
- package/esm/highlevel/types/updates/chosen-inline-result.js +5 -4
- package/esm/highlevel/types/updates/delete-message-update.js +4 -3
- package/esm/highlevel/types/updates/delete-story-update.js +5 -4
- package/esm/highlevel/types/updates/history-read-update.js +4 -3
- package/esm/highlevel/types/updates/inline-query.js +5 -4
- package/esm/highlevel/types/updates/poll-update.js +5 -4
- package/esm/highlevel/types/updates/poll-vote.js +5 -4
- package/esm/highlevel/types/updates/pre-checkout-query.js +5 -4
- package/esm/highlevel/types/updates/story-update.js +5 -4
- package/esm/highlevel/types/updates/user-status-update.js +5 -4
- package/esm/highlevel/types/updates/user-status-update.js.map +1 -1
- package/esm/highlevel/types/updates/user-typing-update.js +4 -3
- package/esm/highlevel/updates/manager.d.ts +5 -3
- package/esm/highlevel/updates/manager.js +81 -67
- package/esm/highlevel/updates/manager.js.map +1 -1
- package/esm/highlevel/utils/convert-file-id.js +7 -6
- package/esm/highlevel/utils/convert-file-id.js.map +1 -1
- package/esm/highlevel/utils/file-utils.js +8 -4
- package/esm/highlevel/utils/file-utils.js.map +1 -1
- package/esm/highlevel/utils/inline-utils.js +4 -3
- package/esm/highlevel/utils/inline-utils.js.map +1 -1
- package/esm/highlevel/utils/inspectable.d.ts +1 -1
- package/esm/highlevel/utils/inspectable.js +3 -2
- package/esm/highlevel/utils/inspectable.js.map +1 -1
- package/esm/highlevel/utils/memoize.d.ts +1 -1
- package/esm/highlevel/utils/memoize.js +1 -0
- package/esm/highlevel/utils/memoize.js.map +1 -1
- package/esm/highlevel/utils/stream-utils.d.ts +0 -2
- package/esm/highlevel/utils/stream-utils.js +0 -26
- package/esm/highlevel/utils/stream-utils.js.map +1 -1
- package/esm/highlevel/utils/string-session.js +4 -3
- package/esm/highlevel/utils/string-session.js.map +1 -1
- package/esm/highlevel/worker/index.d.ts +3 -0
- package/esm/highlevel/worker/index.js +4 -0
- package/esm/highlevel/worker/index.js.map +1 -0
- package/esm/highlevel/worker/port.d.ts +6 -3
- package/esm/highlevel/worker/port.js +8 -2
- package/esm/highlevel/worker/port.js.map +1 -1
- package/esm/highlevel/worker/protocol.d.ts +5 -1
- package/esm/highlevel/worker/protocol.js.map +1 -1
- package/esm/highlevel/worker/worker.d.ts +11 -4
- package/esm/highlevel/worker/worker.js +51 -47
- package/esm/highlevel/worker/worker.js.map +1 -1
- package/esm/network/client.d.ts +4 -4
- package/esm/network/client.js +4 -2
- package/esm/network/client.js.map +1 -1
- package/esm/network/multi-session-connection.d.ts +1 -0
- package/esm/network/multi-session-connection.js +6 -0
- package/esm/network/multi-session-connection.js.map +1 -1
- package/esm/network/network-manager.d.ts +5 -1
- package/esm/network/network-manager.js +24 -15
- package/esm/network/network-manager.js.map +1 -1
- package/esm/network/persistent-connection.d.ts +3 -0
- package/esm/network/persistent-connection.js +23 -1
- package/esm/network/persistent-connection.js.map +1 -1
- package/esm/network/session-connection.d.ts +2 -0
- package/esm/network/session-connection.js +18 -4
- package/esm/network/session-connection.js.map +1 -1
- package/esm/network/transports/index.d.ts +0 -3
- package/esm/network/transports/index.js +0 -3
- package/esm/network/transports/index.js.map +1 -1
- package/esm/platform.d.ts +18 -0
- package/esm/platform.js +31 -0
- package/esm/platform.js.map +1 -0
- package/esm/storage/index.d.ts +2 -2
- package/esm/storage/index.js +2 -2
- package/esm/storage/index.js.map +1 -1
- package/{cjs/storage/providers → esm/storage}/memory/driver.d.ts +1 -1
- package/esm/storage/memory/driver.js.map +1 -0
- package/{cjs/storage/providers → esm/storage}/memory/index.d.ts +2 -2
- package/esm/storage/memory/index.js.map +1 -0
- package/esm/storage/{providers/memory → memory}/repository/auth-keys.d.ts +1 -1
- package/esm/storage/memory/repository/auth-keys.js.map +1 -0
- package/{cjs/storage/providers → esm/storage}/memory/repository/kv.d.ts +1 -1
- package/esm/storage/memory/repository/kv.js.map +1 -0
- package/{cjs/storage/providers → esm/storage}/memory/repository/peers.d.ts +1 -1
- package/esm/storage/memory/repository/peers.js.map +1 -0
- package/{cjs/storage/providers → esm/storage}/memory/repository/ref-messages.d.ts +1 -1
- package/esm/storage/memory/repository/ref-messages.js.map +1 -0
- package/esm/storage/sqlite/driver.d.ts +24 -0
- package/esm/storage/sqlite/driver.js +125 -0
- package/esm/storage/sqlite/driver.js.map +1 -0
- package/esm/storage/sqlite/index.d.ts +17 -0
- package/esm/storage/sqlite/index.js +17 -0
- package/esm/storage/sqlite/index.js.map +1 -0
- package/esm/storage/sqlite/repository/auth-keys.d.ts +20 -0
- package/esm/storage/sqlite/repository/auth-keys.js +64 -0
- package/esm/storage/sqlite/repository/auth-keys.js.map +1 -0
- package/esm/storage/sqlite/repository/kv.d.ts +14 -0
- package/esm/storage/sqlite/repository/kv.js +92 -0
- package/esm/storage/sqlite/repository/kv.js.map +1 -0
- package/esm/storage/sqlite/repository/peers.d.ts +16 -0
- package/esm/storage/sqlite/repository/peers.js +73 -0
- package/esm/storage/sqlite/repository/peers.js.map +1 -0
- package/esm/storage/sqlite/repository/ref-messages.d.ts +16 -0
- package/esm/storage/sqlite/repository/ref-messages.js +45 -0
- package/esm/storage/sqlite/repository/ref-messages.js.map +1 -0
- package/esm/storage/sqlite/types.d.ts +18 -0
- package/esm/storage/sqlite/types.js +2 -0
- package/esm/storage/sqlite/types.js.map +1 -0
- package/esm/storage/storage.js +3 -2
- package/esm/storage/storage.js.map +1 -1
- package/esm/utils/binary/asn1-parser.js +3 -3
- package/esm/utils/binary/asn1-parser.js.map +1 -1
- package/esm/utils/crypto/abstract.d.ts +0 -1
- package/esm/utils/crypto/abstract.js.map +1 -1
- package/esm/utils/crypto/index.d.ts +0 -2
- package/esm/utils/crypto/index.js +0 -2
- package/esm/utils/crypto/index.js.map +1 -1
- package/esm/utils/crypto/keys.js +6 -4
- package/esm/utils/crypto/keys.js.map +1 -1
- package/esm/utils/crypto/password.js +3 -3
- package/esm/utils/crypto/password.js.map +1 -1
- package/esm/utils/dcs.d.ts +4 -0
- package/esm/utils/dcs.js +0 -4
- package/esm/utils/dcs.js.map +1 -1
- package/esm/utils/{platform/error-reporting.d.ts → error-reporting.d.ts} +1 -1
- package/esm/utils/error-reporting.js.map +1 -0
- package/esm/utils/index.d.ts +4 -1
- package/esm/utils/index.js +6 -1
- package/esm/utils/index.js.map +1 -1
- package/esm/utils/links/common.js +1 -1
- package/esm/utils/links/common.js.map +1 -1
- package/esm/utils/logger.d.ts +1 -0
- package/esm/utils/logger.js +9 -22
- package/esm/utils/logger.js.map +1 -1
- package/package.json +25 -53
- package/cjs/highlevel/base.test.js +0 -14
- package/cjs/highlevel/base.test.js.map +0 -1
- package/cjs/highlevel/methods/files/_platform.js +0 -33
- package/cjs/highlevel/methods/files/_platform.js.map +0 -1
- package/cjs/highlevel/methods/files/_platform.web.d.ts +0 -1
- package/cjs/highlevel/methods/files/_platform.web.js +0 -26
- package/cjs/highlevel/methods/files/_platform.web.js.map +0 -1
- package/cjs/highlevel/methods/files/download-file.web.d.ts +0 -1
- package/cjs/highlevel/methods/files/download-file.web.js +0 -9
- package/cjs/highlevel/methods/files/download-file.web.js.map +0 -1
- package/cjs/highlevel/methods/messages/send-text.test.d.ts +0 -1
- package/cjs/highlevel/methods/messages/send-text.test.js +0 -140
- package/cjs/highlevel/methods/messages/send-text.test.js.map +0 -1
- package/cjs/highlevel/methods/users/get-users.test.d.ts +0 -1
- package/cjs/highlevel/methods/users/get-users.test.js +0 -33
- package/cjs/highlevel/methods/users/get-users.test.js.map +0 -1
- package/cjs/highlevel/methods/users/resolve-peer.test.d.ts +0 -1
- package/cjs/highlevel/methods/users/resolve-peer.test.js +0 -307
- package/cjs/highlevel/methods/users/resolve-peer.test.js.map +0 -1
- package/cjs/highlevel/types/bots/command-scope.d.ts +0 -63
- package/cjs/highlevel/types/bots/command-scope.js +0 -87
- package/cjs/highlevel/types/bots/command-scope.js.map +0 -1
- package/cjs/highlevel/types/bots/input/index.d.ts +0 -2
- package/cjs/highlevel/types/bots/input/index.js.map +0 -1
- package/cjs/highlevel/types/bots/input/input-inline-message.js +0 -179
- package/cjs/highlevel/types/bots/input/input-inline-message.js.map +0 -1
- package/cjs/highlevel/types/bots/input/input-inline-result.js +0 -490
- package/cjs/highlevel/types/bots/input/input-inline-result.js.map +0 -1
- package/cjs/highlevel/types/bots/keyboard-builder.js.map +0 -1
- package/cjs/highlevel/types/bots/keyboard-builder.test.d.ts +0 -1
- package/cjs/highlevel/types/bots/keyboard-builder.test.js +0 -162
- package/cjs/highlevel/types/bots/keyboard-builder.test.js.map +0 -1
- package/cjs/highlevel/types/bots/keyboards.d.ts +0 -239
- package/cjs/highlevel/types/bots/keyboards.js +0 -380
- package/cjs/highlevel/types/bots/keyboards.js.map +0 -1
- package/cjs/highlevel/types/bots/keyboards.test.d.ts +0 -1
- package/cjs/highlevel/types/bots/keyboards.test.js +0 -146
- package/cjs/highlevel/types/bots/keyboards.test.js.map +0 -1
- package/cjs/highlevel/types/media/input-media.js +0 -254
- package/cjs/highlevel/types/media/input-media.js.map +0 -1
- package/cjs/highlevel/types/misc/input-privacy-rule.d.ts +0 -63
- package/cjs/highlevel/types/misc/input-privacy-rule.js +0 -85
- package/cjs/highlevel/types/misc/input-privacy-rule.js.map +0 -1
- package/cjs/highlevel/types/peers/peers-index.test.d.ts +0 -1
- package/cjs/highlevel/types/peers/peers-index.test.js +0 -71
- package/cjs/highlevel/types/peers/peers-index.test.js.map +0 -1
- package/cjs/highlevel/types/peers/user.test.d.ts +0 -1
- package/cjs/highlevel/types/peers/user.test.js +0 -176
- package/cjs/highlevel/types/peers/user.test.js.map +0 -1
- package/cjs/highlevel/utils/file-type.test.d.ts +0 -1
- package/cjs/highlevel/utils/file-type.test.js +0 -64
- package/cjs/highlevel/utils/file-type.test.js.map +0 -1
- package/cjs/highlevel/utils/file-utils.test.d.ts +0 -1
- package/cjs/highlevel/utils/file-utils.test.js +0 -126
- package/cjs/highlevel/utils/file-utils.test.js.map +0 -1
- package/cjs/highlevel/utils/inline-utils.test.d.ts +0 -1
- package/cjs/highlevel/utils/inline-utils.test.js +0 -47
- package/cjs/highlevel/utils/inline-utils.test.js.map +0 -1
- package/cjs/highlevel/utils/inspectable.test.d.ts +0 -1
- package/cjs/highlevel/utils/inspectable.test.js +0 -97
- package/cjs/highlevel/utils/inspectable.test.js.map +0 -1
- package/cjs/highlevel/utils/memoize.test.d.ts +0 -1
- package/cjs/highlevel/utils/memoize.test.js +0 -60
- package/cjs/highlevel/utils/memoize.test.js.map +0 -1
- package/cjs/highlevel/utils/peer-utils.test.d.ts +0 -1
- package/cjs/highlevel/utils/peer-utils.test.js +0 -109
- package/cjs/highlevel/utils/peer-utils.test.js.map +0 -1
- package/cjs/highlevel/utils/platform/storage.d.ts +0 -1
- package/cjs/highlevel/utils/platform/storage.js +0 -10
- package/cjs/highlevel/utils/platform/storage.js.map +0 -1
- package/cjs/highlevel/utils/platform/storage.web.d.ts +0 -1
- package/cjs/highlevel/utils/platform/storage.web.js +0 -14
- package/cjs/highlevel/utils/platform/storage.web.js.map +0 -1
- package/cjs/highlevel/utils/query-batcher.test.d.ts +0 -1
- package/cjs/highlevel/utils/query-batcher.test.js +0 -502
- package/cjs/highlevel/utils/query-batcher.test.js.map +0 -1
- package/cjs/highlevel/utils/stream-utils.test.d.ts +0 -1
- package/cjs/highlevel/utils/stream-utils.test.js +0 -98
- package/cjs/highlevel/utils/stream-utils.test.js.map +0 -1
- package/cjs/highlevel/utils/string-session.test.d.ts +0 -1
- package/cjs/highlevel/utils/string-session.test.js +0 -198
- package/cjs/highlevel/utils/string-session.test.js.map +0 -1
- package/cjs/highlevel/utils/voice-utils.test.d.ts +0 -1
- package/cjs/highlevel/utils/voice-utils.test.js +0 -28
- package/cjs/highlevel/utils/voice-utils.test.js.map +0 -1
- package/cjs/highlevel/worker/platform/connect.d.ts +0 -2
- package/cjs/highlevel/worker/platform/connect.js +0 -19
- package/cjs/highlevel/worker/platform/connect.js.map +0 -1
- package/cjs/highlevel/worker/platform/connect.web.d.ts +0 -2
- package/cjs/highlevel/worker/platform/connect.web.js +0 -51
- package/cjs/highlevel/worker/platform/connect.web.js.map +0 -1
- package/cjs/highlevel/worker/platform/register.d.ts +0 -2
- package/cjs/highlevel/worker/platform/register.js +0 -20
- package/cjs/highlevel/worker/platform/register.js.map +0 -1
- package/cjs/highlevel/worker/platform/register.web.d.ts +0 -2
- package/cjs/highlevel/worker/platform/register.web.js +0 -64
- package/cjs/highlevel/worker/platform/register.web.js.map +0 -1
- package/cjs/network/auth-key.test.d.ts +0 -1
- package/cjs/network/auth-key.test.js +0 -111
- package/cjs/network/auth-key.test.js.map +0 -1
- package/cjs/network/config-manager.test.d.ts +0 -1
- package/cjs/network/config-manager.test.js +0 -174
- package/cjs/network/config-manager.test.js.map +0 -1
- package/cjs/network/persistent-connection.test.d.ts +0 -1
- package/cjs/network/persistent-connection.test.js +0 -157
- package/cjs/network/persistent-connection.test.js.map +0 -1
- package/cjs/network/transports/intermediate.test.d.ts +0 -1
- package/cjs/network/transports/intermediate.test.js +0 -84
- package/cjs/network/transports/intermediate.test.js.map +0 -1
- package/cjs/network/transports/obfuscated.test.d.ts +0 -1
- package/cjs/network/transports/obfuscated.test.js +0 -131
- package/cjs/network/transports/obfuscated.test.js.map +0 -1
- package/cjs/network/transports/tcp.d.ts +0 -32
- package/cjs/network/transports/tcp.js +0 -130
- package/cjs/network/transports/tcp.js.map +0 -1
- package/cjs/network/transports/tcp.test.d.ts +0 -1
- package/cjs/network/transports/tcp.test.js +0 -103
- package/cjs/network/transports/tcp.test.js.map +0 -1
- package/cjs/network/transports/websocket.d.ts +0 -46
- package/cjs/network/transports/websocket.js +0 -124
- package/cjs/network/transports/websocket.js.map +0 -1
- package/cjs/network/transports/websocket.test.d.ts +0 -1
- package/cjs/network/transports/websocket.test.js +0 -91
- package/cjs/network/transports/websocket.test.js.map +0 -1
- package/cjs/storage/providers/idb/driver.d.ts +0 -18
- package/cjs/storage/providers/idb/driver.js +0 -138
- package/cjs/storage/providers/idb/driver.js.map +0 -1
- package/cjs/storage/providers/idb/idb.test.d.ts +0 -1
- package/cjs/storage/providers/idb/idb.test.js +0 -29
- package/cjs/storage/providers/idb/idb.test.js.map +0 -1
- package/cjs/storage/providers/idb/index.d.ts +0 -22
- package/cjs/storage/providers/idb/index.js +0 -28
- package/cjs/storage/providers/idb/index.js.map +0 -1
- package/cjs/storage/providers/idb/repository/auth-keys.d.ts +0 -14
- package/cjs/storage/providers/idb/repository/auth-keys.js +0 -70
- package/cjs/storage/providers/idb/repository/auth-keys.js.map +0 -1
- package/cjs/storage/providers/idb/repository/kv.d.ts +0 -11
- package/cjs/storage/providers/idb/repository/kv.js +0 -34
- package/cjs/storage/providers/idb/repository/kv.js.map +0 -1
- package/cjs/storage/providers/idb/repository/peers.d.ts +0 -12
- package/cjs/storage/providers/idb/repository/peers.js +0 -38
- package/cjs/storage/providers/idb/repository/peers.js.map +0 -1
- package/cjs/storage/providers/idb/repository/ref-messages.d.ts +0 -12
- package/cjs/storage/providers/idb/repository/ref-messages.js +0 -57
- package/cjs/storage/providers/idb/repository/ref-messages.js.map +0 -1
- package/cjs/storage/providers/idb/utils.d.ts +0 -3
- package/cjs/storage/providers/idb/utils.js +0 -27
- package/cjs/storage/providers/idb/utils.js.map +0 -1
- package/cjs/storage/providers/memory/driver.js.map +0 -1
- package/cjs/storage/providers/memory/index.js.map +0 -1
- package/cjs/storage/providers/memory/memory.test.d.ts +0 -1
- package/cjs/storage/providers/memory/memory.test.js +0 -13
- package/cjs/storage/providers/memory/memory.test.js.map +0 -1
- package/cjs/storage/providers/memory/repository/auth-keys.js.map +0 -1
- package/cjs/storage/providers/memory/repository/kv.js.map +0 -1
- package/cjs/storage/providers/memory/repository/peers.js.map +0 -1
- package/cjs/storage/providers/memory/repository/ref-messages.js.map +0 -1
- package/cjs/storage/service/auth-keys.test.d.ts +0 -1
- package/cjs/storage/service/auth-keys.test.js +0 -22
- package/cjs/storage/service/auth-keys.test.js.map +0 -1
- package/cjs/storage/service/updates.test.d.ts +0 -1
- package/cjs/storage/service/updates.test.js +0 -60
- package/cjs/storage/service/updates.test.js.map +0 -1
- package/cjs/storage/service/utils.test-utils.d.ts +0 -2
- package/cjs/storage/service/utils.test-utils.js +0 -19
- package/cjs/storage/service/utils.test-utils.js.map +0 -1
- package/cjs/utils/async-lock.test.d.ts +0 -1
- package/cjs/utils/async-lock.test.js +0 -25
- package/cjs/utils/async-lock.test.js.map +0 -1
- package/cjs/utils/bigint-utils.test.d.ts +0 -1
- package/cjs/utils/bigint-utils.test.js +0 -150
- package/cjs/utils/bigint-utils.test.js.map +0 -1
- package/cjs/utils/buffer-utils.test.d.ts +0 -1
- package/cjs/utils/buffer-utils.test.js +0 -69
- package/cjs/utils/buffer-utils.test.js.map +0 -1
- package/cjs/utils/condition-variable.test.d.ts +0 -1
- package/cjs/utils/condition-variable.test.js +0 -27
- package/cjs/utils/condition-variable.test.js.map +0 -1
- package/cjs/utils/controllable-promise.test.d.ts +0 -1
- package/cjs/utils/controllable-promise.test.js +0 -17
- package/cjs/utils/controllable-promise.test.js.map +0 -1
- package/cjs/utils/crypto/factorization.test.d.ts +0 -1
- package/cjs/utils/crypto/factorization.test.js +0 -19
- package/cjs/utils/crypto/factorization.test.js.map +0 -1
- package/cjs/utils/crypto/keys.test.d.ts +0 -1
- package/cjs/utils/crypto/keys.test.js +0 -40
- package/cjs/utils/crypto/keys.test.js.map +0 -1
- package/cjs/utils/crypto/miller-rabin.test.d.ts +0 -1
- package/cjs/utils/crypto/miller-rabin.test.js +0 -60
- package/cjs/utils/crypto/miller-rabin.test.js.map +0 -1
- package/cjs/utils/crypto/mtproto.test.d.ts +0 -1
- package/cjs/utils/crypto/mtproto.test.js +0 -50
- package/cjs/utils/crypto/mtproto.test.js.map +0 -1
- package/cjs/utils/crypto/node.d.ts +0 -21
- package/cjs/utils/crypto/node.js +0 -74
- package/cjs/utils/crypto/node.js.map +0 -1
- package/cjs/utils/crypto/node.test.d.ts +0 -1
- package/cjs/utils/crypto/node.test.js +0 -14
- package/cjs/utils/crypto/node.test.js.map +0 -1
- package/cjs/utils/crypto/password.test.d.ts +0 -1
- package/cjs/utils/crypto/password.test.js +0 -95
- package/cjs/utils/crypto/password.test.js.map +0 -1
- package/cjs/utils/crypto/utils.test.d.ts +0 -1
- package/cjs/utils/crypto/utils.test.js +0 -49
- package/cjs/utils/crypto/utils.test.js.map +0 -1
- package/cjs/utils/crypto/wasm.d.ts +0 -22
- package/cjs/utils/crypto/wasm.js +0 -41
- package/cjs/utils/crypto/wasm.js.map +0 -1
- package/cjs/utils/crypto/web.d.ts +0 -11
- package/cjs/utils/crypto/web.js +0 -40
- package/cjs/utils/crypto/web.js.map +0 -1
- package/cjs/utils/crypto/web.test.d.ts +0 -1
- package/cjs/utils/crypto/web.test.js +0 -17
- package/cjs/utils/crypto/web.test.js.map +0 -1
- package/cjs/utils/deque.test.d.ts +0 -1
- package/cjs/utils/deque.test.js +0 -128
- package/cjs/utils/deque.test.js.map +0 -1
- package/cjs/utils/function-utils.test.d.ts +0 -1
- package/cjs/utils/function-utils.test.js +0 -23
- package/cjs/utils/function-utils.test.js.map +0 -1
- package/cjs/utils/linked-list.test.d.ts +0 -1
- package/cjs/utils/linked-list.test.js +0 -36
- package/cjs/utils/linked-list.test.js.map +0 -1
- package/cjs/utils/links/bots.test.d.ts +0 -1
- package/cjs/utils/links/bots.test.js +0 -152
- package/cjs/utils/links/bots.test.js.map +0 -1
- package/cjs/utils/links/chat.test.d.ts +0 -1
- package/cjs/utils/links/chat.test.js +0 -84
- package/cjs/utils/links/chat.test.js.map +0 -1
- package/cjs/utils/links/misc.test.d.ts +0 -1
- package/cjs/utils/links/misc.test.js +0 -153
- package/cjs/utils/links/misc.test.js.map +0 -1
- package/cjs/utils/links/proxy.test.d.ts +0 -1
- package/cjs/utils/links/proxy.test.js +0 -74
- package/cjs/utils/links/proxy.test.js.map +0 -1
- package/cjs/utils/links/user.test.d.ts +0 -1
- package/cjs/utils/links/user.test.js +0 -63
- package/cjs/utils/links/user.test.js.map +0 -1
- package/cjs/utils/logger.test.d.ts +0 -1
- package/cjs/utils/logger.test.js +0 -139
- package/cjs/utils/logger.test.js.map +0 -1
- package/cjs/utils/long-utils.test.d.ts +0 -1
- package/cjs/utils/long-utils.test.js +0 -158
- package/cjs/utils/long-utils.test.js.map +0 -1
- package/cjs/utils/lru-map.test.d.ts +0 -1
- package/cjs/utils/lru-map.test.js +0 -96
- package/cjs/utils/lru-map.test.js.map +0 -1
- package/cjs/utils/lru-set.test.d.ts +0 -1
- package/cjs/utils/lru-set.test.js +0 -77
- package/cjs/utils/lru-set.test.js.map +0 -1
- package/cjs/utils/peer-utils.test.d.ts +0 -1
- package/cjs/utils/peer-utils.test.js +0 -110
- package/cjs/utils/peer-utils.test.js.map +0 -1
- package/cjs/utils/platform/crypto.d.ts +0 -1
- package/cjs/utils/platform/crypto.js +0 -8
- package/cjs/utils/platform/crypto.js.map +0 -1
- package/cjs/utils/platform/crypto.web.d.ts +0 -1
- package/cjs/utils/platform/crypto.web.js +0 -14
- package/cjs/utils/platform/crypto.web.js.map +0 -1
- package/cjs/utils/platform/error-reporting.js.map +0 -1
- package/cjs/utils/platform/exit-hook.d.ts +0 -1
- package/cjs/utils/platform/exit-hook.js +0 -45
- package/cjs/utils/platform/exit-hook.js.map +0 -1
- package/cjs/utils/platform/exit-hook.web.d.ts +0 -1
- package/cjs/utils/platform/exit-hook.web.js +0 -21
- package/cjs/utils/platform/exit-hook.web.js.map +0 -1
- package/cjs/utils/platform/logging.d.ts +0 -1
- package/cjs/utils/platform/logging.js +0 -34
- package/cjs/utils/platform/logging.js.map +0 -1
- package/cjs/utils/platform/logging.web.d.ts +0 -1
- package/cjs/utils/platform/logging.web.js +0 -35
- package/cjs/utils/platform/logging.web.js.map +0 -1
- package/cjs/utils/platform/transport.d.ts +0 -1
- package/cjs/utils/platform/transport.js +0 -8
- package/cjs/utils/platform/transport.js.map +0 -1
- package/cjs/utils/platform/transport.web.d.ts +0 -1
- package/cjs/utils/platform/transport.web.js +0 -15
- package/cjs/utils/platform/transport.web.js.map +0 -1
- package/cjs/utils/sorted-array.test.d.ts +0 -1
- package/cjs/utils/sorted-array.test.js +0 -66
- package/cjs/utils/sorted-array.test.js.map +0 -1
- package/cjs/utils/tl-json.test.d.ts +0 -1
- package/cjs/utils/tl-json.test.js +0 -83
- package/cjs/utils/tl-json.test.js.map +0 -1
- package/cjs/utils/type-assertions.test.d.ts +0 -1
- package/cjs/utils/type-assertions.test.js +0 -67
- package/cjs/utils/type-assertions.test.js.map +0 -1
- package/esm/highlevel/base.test.d.ts +0 -1
- package/esm/highlevel/base.test.js +0 -12
- package/esm/highlevel/base.test.js.map +0 -1
- package/esm/highlevel/methods/files/_platform.d.ts +0 -1
- package/esm/highlevel/methods/files/_platform.js +0 -26
- package/esm/highlevel/methods/files/_platform.js.map +0 -1
- package/esm/highlevel/methods/files/_platform.web.d.ts +0 -1
- package/esm/highlevel/methods/files/_platform.web.js +0 -19
- package/esm/highlevel/methods/files/_platform.web.js.map +0 -1
- package/esm/highlevel/methods/files/download-file.web.d.ts +0 -1
- package/esm/highlevel/methods/files/download-file.web.js +0 -5
- package/esm/highlevel/methods/files/download-file.web.js.map +0 -1
- package/esm/highlevel/methods/messages/send-text.test.d.ts +0 -1
- package/esm/highlevel/methods/messages/send-text.test.js +0 -135
- package/esm/highlevel/methods/messages/send-text.test.js.map +0 -1
- package/esm/highlevel/methods/users/get-users.test.d.ts +0 -1
- package/esm/highlevel/methods/users/get-users.test.js +0 -28
- package/esm/highlevel/methods/users/get-users.test.js.map +0 -1
- package/esm/highlevel/methods/users/resolve-peer.test.d.ts +0 -1
- package/esm/highlevel/methods/users/resolve-peer.test.js +0 -302
- package/esm/highlevel/methods/users/resolve-peer.test.js.map +0 -1
- package/esm/highlevel/types/bots/command-scope.d.ts +0 -63
- package/esm/highlevel/types/bots/command-scope.js +0 -84
- package/esm/highlevel/types/bots/command-scope.js.map +0 -1
- package/esm/highlevel/types/bots/input/index.d.ts +0 -2
- package/esm/highlevel/types/bots/input/index.js +0 -3
- package/esm/highlevel/types/bots/input/index.js.map +0 -1
- package/esm/highlevel/types/bots/input/input-inline-message.js +0 -176
- package/esm/highlevel/types/bots/input/input-inline-message.js.map +0 -1
- package/esm/highlevel/types/bots/input/input-inline-result.js +0 -487
- package/esm/highlevel/types/bots/input/input-inline-result.js.map +0 -1
- package/esm/highlevel/types/bots/keyboard-builder.js.map +0 -1
- package/esm/highlevel/types/bots/keyboard-builder.test.d.ts +0 -1
- package/esm/highlevel/types/bots/keyboard-builder.test.js +0 -160
- package/esm/highlevel/types/bots/keyboard-builder.test.js.map +0 -1
- package/esm/highlevel/types/bots/keyboards.d.ts +0 -239
- package/esm/highlevel/types/bots/keyboards.js +0 -377
- package/esm/highlevel/types/bots/keyboards.js.map +0 -1
- package/esm/highlevel/types/bots/keyboards.test.d.ts +0 -1
- package/esm/highlevel/types/bots/keyboards.test.js +0 -144
- package/esm/highlevel/types/bots/keyboards.test.js.map +0 -1
- package/esm/highlevel/types/media/input-media.js +0 -251
- package/esm/highlevel/types/media/input-media.js.map +0 -1
- package/esm/highlevel/types/misc/input-privacy-rule.d.ts +0 -63
- package/esm/highlevel/types/misc/input-privacy-rule.js +0 -82
- package/esm/highlevel/types/misc/input-privacy-rule.js.map +0 -1
- package/esm/highlevel/types/peers/peers-index.test.d.ts +0 -1
- package/esm/highlevel/types/peers/peers-index.test.js +0 -69
- package/esm/highlevel/types/peers/peers-index.test.js.map +0 -1
- package/esm/highlevel/types/peers/user.test.d.ts +0 -1
- package/esm/highlevel/types/peers/user.test.js +0 -171
- package/esm/highlevel/types/peers/user.test.js.map +0 -1
- package/esm/highlevel/utils/file-type.test.d.ts +0 -1
- package/esm/highlevel/utils/file-type.test.js +0 -62
- package/esm/highlevel/utils/file-type.test.js.map +0 -1
- package/esm/highlevel/utils/file-utils.test.d.ts +0 -1
- package/esm/highlevel/utils/file-utils.test.js +0 -124
- package/esm/highlevel/utils/file-utils.test.js.map +0 -1
- package/esm/highlevel/utils/inline-utils.test.d.ts +0 -1
- package/esm/highlevel/utils/inline-utils.test.js +0 -42
- package/esm/highlevel/utils/inline-utils.test.js.map +0 -1
- package/esm/highlevel/utils/inspectable.test.d.ts +0 -1
- package/esm/highlevel/utils/inspectable.test.js +0 -95
- package/esm/highlevel/utils/inspectable.test.js.map +0 -1
- package/esm/highlevel/utils/memoize.test.d.ts +0 -1
- package/esm/highlevel/utils/memoize.test.js +0 -58
- package/esm/highlevel/utils/memoize.test.js.map +0 -1
- package/esm/highlevel/utils/peer-utils.test.d.ts +0 -1
- package/esm/highlevel/utils/peer-utils.test.js +0 -107
- package/esm/highlevel/utils/peer-utils.test.js.map +0 -1
- package/esm/highlevel/utils/platform/storage.d.ts +0 -1
- package/esm/highlevel/utils/platform/storage.js +0 -6
- package/esm/highlevel/utils/platform/storage.js.map +0 -1
- package/esm/highlevel/utils/platform/storage.web.d.ts +0 -1
- package/esm/highlevel/utils/platform/storage.web.js +0 -10
- package/esm/highlevel/utils/platform/storage.web.js.map +0 -1
- package/esm/highlevel/utils/query-batcher.test.d.ts +0 -1
- package/esm/highlevel/utils/query-batcher.test.js +0 -500
- package/esm/highlevel/utils/query-batcher.test.js.map +0 -1
- package/esm/highlevel/utils/stream-utils.test.d.ts +0 -1
- package/esm/highlevel/utils/stream-utils.test.js +0 -96
- package/esm/highlevel/utils/stream-utils.test.js.map +0 -1
- package/esm/highlevel/utils/string-session.test.d.ts +0 -1
- package/esm/highlevel/utils/string-session.test.js +0 -196
- package/esm/highlevel/utils/string-session.test.js.map +0 -1
- package/esm/highlevel/utils/voice-utils.test.d.ts +0 -1
- package/esm/highlevel/utils/voice-utils.test.js +0 -26
- package/esm/highlevel/utils/voice-utils.test.js.map +0 -1
- package/esm/highlevel/worker/platform/connect.d.ts +0 -2
- package/esm/highlevel/worker/platform/connect.js +0 -15
- package/esm/highlevel/worker/platform/connect.js.map +0 -1
- package/esm/highlevel/worker/platform/connect.web.d.ts +0 -2
- package/esm/highlevel/worker/platform/connect.web.js +0 -47
- package/esm/highlevel/worker/platform/connect.web.js.map +0 -1
- package/esm/highlevel/worker/platform/register.d.ts +0 -2
- package/esm/highlevel/worker/platform/register.js +0 -16
- package/esm/highlevel/worker/platform/register.js.map +0 -1
- package/esm/highlevel/worker/platform/register.web.d.ts +0 -2
- package/esm/highlevel/worker/platform/register.web.js +0 -60
- package/esm/highlevel/worker/platform/register.web.js.map +0 -1
- package/esm/network/auth-key.test.d.ts +0 -1
- package/esm/network/auth-key.test.js +0 -106
- package/esm/network/auth-key.test.js.map +0 -1
- package/esm/network/config-manager.test.d.ts +0 -1
- package/esm/network/config-manager.test.js +0 -172
- package/esm/network/config-manager.test.js.map +0 -1
- package/esm/network/persistent-connection.test.d.ts +0 -1
- package/esm/network/persistent-connection.test.js +0 -155
- package/esm/network/persistent-connection.test.js.map +0 -1
- package/esm/network/transports/intermediate.test.d.ts +0 -1
- package/esm/network/transports/intermediate.test.js +0 -82
- package/esm/network/transports/intermediate.test.js.map +0 -1
- package/esm/network/transports/obfuscated.test.d.ts +0 -1
- package/esm/network/transports/obfuscated.test.js +0 -129
- package/esm/network/transports/obfuscated.test.js.map +0 -1
- package/esm/network/transports/tcp.d.ts +0 -32
- package/esm/network/transports/tcp.js +0 -122
- package/esm/network/transports/tcp.js.map +0 -1
- package/esm/network/transports/tcp.test.d.ts +0 -1
- package/esm/network/transports/tcp.test.js +0 -101
- package/esm/network/transports/tcp.test.js.map +0 -1
- package/esm/network/transports/websocket.d.ts +0 -46
- package/esm/network/transports/websocket.js +0 -116
- package/esm/network/transports/websocket.js.map +0 -1
- package/esm/network/transports/websocket.test.d.ts +0 -1
- package/esm/network/transports/websocket.test.js +0 -89
- package/esm/network/transports/websocket.test.js.map +0 -1
- package/esm/storage/providers/idb/driver.d.ts +0 -18
- package/esm/storage/providers/idb/driver.js +0 -134
- package/esm/storage/providers/idb/driver.js.map +0 -1
- package/esm/storage/providers/idb/idb.test.d.ts +0 -1
- package/esm/storage/providers/idb/idb.test.js +0 -27
- package/esm/storage/providers/idb/idb.test.js.map +0 -1
- package/esm/storage/providers/idb/index.d.ts +0 -22
- package/esm/storage/providers/idb/index.js +0 -23
- package/esm/storage/providers/idb/index.js.map +0 -1
- package/esm/storage/providers/idb/repository/auth-keys.d.ts +0 -14
- package/esm/storage/providers/idb/repository/auth-keys.js +0 -66
- package/esm/storage/providers/idb/repository/auth-keys.js.map +0 -1
- package/esm/storage/providers/idb/repository/kv.d.ts +0 -11
- package/esm/storage/providers/idb/repository/kv.js +0 -30
- package/esm/storage/providers/idb/repository/kv.js.map +0 -1
- package/esm/storage/providers/idb/repository/peers.d.ts +0 -12
- package/esm/storage/providers/idb/repository/peers.js +0 -34
- package/esm/storage/providers/idb/repository/peers.js.map +0 -1
- package/esm/storage/providers/idb/repository/ref-messages.d.ts +0 -12
- package/esm/storage/providers/idb/repository/ref-messages.js +0 -53
- package/esm/storage/providers/idb/repository/ref-messages.js.map +0 -1
- package/esm/storage/providers/idb/utils.d.ts +0 -3
- package/esm/storage/providers/idb/utils.js +0 -21
- package/esm/storage/providers/idb/utils.js.map +0 -1
- package/esm/storage/providers/memory/driver.js.map +0 -1
- package/esm/storage/providers/memory/index.js.map +0 -1
- package/esm/storage/providers/memory/memory.test.d.ts +0 -1
- package/esm/storage/providers/memory/memory.test.js +0 -11
- package/esm/storage/providers/memory/memory.test.js.map +0 -1
- package/esm/storage/providers/memory/repository/auth-keys.js.map +0 -1
- package/esm/storage/providers/memory/repository/kv.js.map +0 -1
- package/esm/storage/providers/memory/repository/peers.js.map +0 -1
- package/esm/storage/providers/memory/repository/ref-messages.js.map +0 -1
- package/esm/storage/service/auth-keys.test.d.ts +0 -1
- package/esm/storage/service/auth-keys.test.js +0 -20
- package/esm/storage/service/auth-keys.test.js.map +0 -1
- package/esm/storage/service/updates.test.d.ts +0 -1
- package/esm/storage/service/updates.test.js +0 -58
- package/esm/storage/service/updates.test.js.map +0 -1
- package/esm/storage/service/utils.test-utils.d.ts +0 -2
- package/esm/storage/service/utils.test-utils.js +0 -15
- package/esm/storage/service/utils.test-utils.js.map +0 -1
- package/esm/utils/async-lock.test.d.ts +0 -1
- package/esm/utils/async-lock.test.js +0 -23
- package/esm/utils/async-lock.test.js.map +0 -1
- package/esm/utils/bigint-utils.test.d.ts +0 -1
- package/esm/utils/bigint-utils.test.js +0 -148
- package/esm/utils/bigint-utils.test.js.map +0 -1
- package/esm/utils/buffer-utils.test.d.ts +0 -1
- package/esm/utils/buffer-utils.test.js +0 -67
- package/esm/utils/buffer-utils.test.js.map +0 -1
- package/esm/utils/condition-variable.test.d.ts +0 -1
- package/esm/utils/condition-variable.test.js +0 -25
- package/esm/utils/condition-variable.test.js.map +0 -1
- package/esm/utils/controllable-promise.test.d.ts +0 -1
- package/esm/utils/controllable-promise.test.js +0 -15
- package/esm/utils/controllable-promise.test.js.map +0 -1
- package/esm/utils/crypto/factorization.test.d.ts +0 -1
- package/esm/utils/crypto/factorization.test.js +0 -17
- package/esm/utils/crypto/factorization.test.js.map +0 -1
- package/esm/utils/crypto/keys.test.d.ts +0 -1
- package/esm/utils/crypto/keys.test.js +0 -38
- package/esm/utils/crypto/keys.test.js.map +0 -1
- package/esm/utils/crypto/miller-rabin.test.d.ts +0 -1
- package/esm/utils/crypto/miller-rabin.test.js +0 -58
- package/esm/utils/crypto/miller-rabin.test.js.map +0 -1
- package/esm/utils/crypto/mtproto.test.d.ts +0 -1
- package/esm/utils/crypto/mtproto.test.js +0 -48
- package/esm/utils/crypto/mtproto.test.js.map +0 -1
- package/esm/utils/crypto/node.d.ts +0 -21
- package/esm/utils/crypto/node.js +0 -69
- package/esm/utils/crypto/node.js.map +0 -1
- package/esm/utils/crypto/node.test.d.ts +0 -1
- package/esm/utils/crypto/node.test.js +0 -12
- package/esm/utils/crypto/node.test.js.map +0 -1
- package/esm/utils/crypto/password.test.d.ts +0 -1
- package/esm/utils/crypto/password.test.js +0 -90
- package/esm/utils/crypto/password.test.js.map +0 -1
- package/esm/utils/crypto/utils.test.d.ts +0 -1
- package/esm/utils/crypto/utils.test.js +0 -47
- package/esm/utils/crypto/utils.test.js.map +0 -1
- package/esm/utils/crypto/wasm.d.ts +0 -22
- package/esm/utils/crypto/wasm.js +0 -37
- package/esm/utils/crypto/wasm.js.map +0 -1
- package/esm/utils/crypto/web.d.ts +0 -11
- package/esm/utils/crypto/web.js +0 -36
- package/esm/utils/crypto/web.js.map +0 -1
- package/esm/utils/crypto/web.test.d.ts +0 -1
- package/esm/utils/crypto/web.test.js +0 -15
- package/esm/utils/crypto/web.test.js.map +0 -1
- package/esm/utils/deque.test.d.ts +0 -1
- package/esm/utils/deque.test.js +0 -126
- package/esm/utils/deque.test.js.map +0 -1
- package/esm/utils/function-utils.test.d.ts +0 -1
- package/esm/utils/function-utils.test.js +0 -21
- package/esm/utils/function-utils.test.js.map +0 -1
- package/esm/utils/linked-list.test.d.ts +0 -1
- package/esm/utils/linked-list.test.js +0 -34
- package/esm/utils/linked-list.test.js.map +0 -1
- package/esm/utils/links/bots.test.d.ts +0 -1
- package/esm/utils/links/bots.test.js +0 -150
- package/esm/utils/links/bots.test.js.map +0 -1
- package/esm/utils/links/chat.test.d.ts +0 -1
- package/esm/utils/links/chat.test.js +0 -82
- package/esm/utils/links/chat.test.js.map +0 -1
- package/esm/utils/links/misc.test.d.ts +0 -1
- package/esm/utils/links/misc.test.js +0 -151
- package/esm/utils/links/misc.test.js.map +0 -1
- package/esm/utils/links/proxy.test.d.ts +0 -1
- package/esm/utils/links/proxy.test.js +0 -72
- package/esm/utils/links/proxy.test.js.map +0 -1
- package/esm/utils/links/user.test.d.ts +0 -1
- package/esm/utils/links/user.test.js +0 -61
- package/esm/utils/links/user.test.js.map +0 -1
- package/esm/utils/logger.test.d.ts +0 -1
- package/esm/utils/logger.test.js +0 -134
- package/esm/utils/logger.test.js.map +0 -1
- package/esm/utils/long-utils.test.d.ts +0 -1
- package/esm/utils/long-utils.test.js +0 -153
- package/esm/utils/long-utils.test.js.map +0 -1
- package/esm/utils/lru-map.test.d.ts +0 -1
- package/esm/utils/lru-map.test.js +0 -94
- package/esm/utils/lru-map.test.js.map +0 -1
- package/esm/utils/lru-set.test.d.ts +0 -1
- package/esm/utils/lru-set.test.js +0 -72
- package/esm/utils/lru-set.test.js.map +0 -1
- package/esm/utils/peer-utils.test.d.ts +0 -1
- package/esm/utils/peer-utils.test.js +0 -105
- package/esm/utils/peer-utils.test.js.map +0 -1
- package/esm/utils/platform/crypto.d.ts +0 -1
- package/esm/utils/platform/crypto.js +0 -4
- package/esm/utils/platform/crypto.js.map +0 -1
- package/esm/utils/platform/crypto.web.d.ts +0 -1
- package/esm/utils/platform/crypto.web.js +0 -10
- package/esm/utils/platform/crypto.web.js.map +0 -1
- package/esm/utils/platform/error-reporting.js.map +0 -1
- package/esm/utils/platform/exit-hook.d.ts +0 -1
- package/esm/utils/platform/exit-hook.js +0 -41
- package/esm/utils/platform/exit-hook.js.map +0 -1
- package/esm/utils/platform/exit-hook.web.d.ts +0 -1
- package/esm/utils/platform/exit-hook.web.js +0 -17
- package/esm/utils/platform/exit-hook.web.js.map +0 -1
- package/esm/utils/platform/logging.d.ts +0 -1
- package/esm/utils/platform/logging.js +0 -31
- package/esm/utils/platform/logging.js.map +0 -1
- package/esm/utils/platform/logging.web.d.ts +0 -1
- package/esm/utils/platform/logging.web.js +0 -31
- package/esm/utils/platform/logging.web.js.map +0 -1
- package/esm/utils/platform/transport.d.ts +0 -1
- package/esm/utils/platform/transport.js +0 -4
- package/esm/utils/platform/transport.js.map +0 -1
- package/esm/utils/platform/transport.web.d.ts +0 -1
- package/esm/utils/platform/transport.web.js +0 -12
- package/esm/utils/platform/transport.web.js.map +0 -1
- package/esm/utils/sorted-array.test.d.ts +0 -1
- package/esm/utils/sorted-array.test.js +0 -64
- package/esm/utils/sorted-array.test.js.map +0 -1
- package/esm/utils/tl-json.test.d.ts +0 -1
- package/esm/utils/tl-json.test.js +0 -81
- package/esm/utils/tl-json.test.js.map +0 -1
- package/esm/utils/type-assertions.test.d.ts +0 -1
- package/esm/utils/type-assertions.test.js +0 -65
- package/esm/utils/type-assertions.test.js.map +0 -1
- /package/cjs/highlevel/{base.test.d.ts → methods/files/download-node-stream.d.ts} +0 -0
- /package/cjs/storage/{providers/memory → memory}/driver.js +0 -0
- /package/cjs/storage/{providers/memory → memory}/index.js +0 -0
- /package/cjs/storage/{providers/memory → memory}/repository/auth-keys.js +0 -0
- /package/cjs/storage/{providers/memory → memory}/repository/kv.js +0 -0
- /package/cjs/storage/{providers/memory → memory}/repository/peers.js +0 -0
- /package/cjs/storage/{providers/memory → memory}/repository/ref-messages.js +0 -0
- /package/cjs/utils/{platform/error-reporting.js → error-reporting.js} +0 -0
- /package/{cjs/highlevel/methods/files/_platform.d.ts → esm/highlevel/methods/files/download-node-stream.d.ts} +0 -0
- /package/esm/storage/{providers/memory → memory}/driver.js +0 -0
- /package/esm/storage/{providers/memory → memory}/index.js +0 -0
- /package/esm/storage/{providers/memory → memory}/repository/auth-keys.js +0 -0
- /package/esm/storage/{providers/memory → memory}/repository/kv.js +0 -0
- /package/esm/storage/{providers/memory → memory}/repository/peers.js +0 -0
- /package/esm/storage/{providers/memory → memory}/repository/ref-messages.js +0 -0
- /package/esm/utils/{platform/error-reporting.js → error-reporting.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/highlevel/updates/manager.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAA;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAgB,MAAM,sBAAsB,CAAA;AAChE,OAAO,EACH,SAAS,EACT,iBAAiB,EACjB,KAAK,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GACjB,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAE1D,OAAO,EACH,2BAA2B,EAC3B,0BAA0B,EAC1B,cAAc,EACd,eAAe,EACf,eAAe,GAClB,MAAM,YAAY,CAAA;AAEnB,gFAAgF;AAEhF,qCAAqC;AACrC,MAAM;AACN,uBAAuB;AACvB,KAAK;AACL,8DAA8D;AAC9D,KAAK;AACL,gCAAgC;AAChC,8BAA8B;AAC9B,MAAM;AACN,2FAA2F;AAC3F,qCAAqC;AACrC,mDAAmD;AACnD,qDAAqD;AACrD,IAAI;AAEJ,MAAM;AACN,sCAAsC;AACtC,KAAK;AACL,yCAAyC;AACzC,2CAA2C;AAC3C,4CAA4C;AAC5C,yCAAyC;AACzC,eAAe;AACf,MAAM;AACN,2EAA2E;AAC3E,qCAAqC;AAErC,gCAAgC;AAChC,wFAAwF;AACxF,QAAQ;AAER,wCAAwC;AACxC,IAAI;AAEJ,MAAM;AACN,wCAAwC;AACxC,KAAK;AACL,2CAA2C;AAC3C,mCAAmC;AACnC,4CAA4C;AAC5C,yCAAyC;AACzC,eAAe;AACf,MAAM;AACN,6EAA6E;AAC7E,qCAAqC;AAErC,kCAAkC;AAClC,wFAAwF;AACxF,QAAQ;AAER,0CAA0C;AAC1C,IAAI;AAEJ,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,aAAa;AAExD,iBAAiB;AACjB,MAAM,OAAO,cAAc;IAwDvB,YACa,MAA0B,EAC1B,SAA+B,EAAE;QADjC,WAAM,GAAN,MAAM,CAAoB;QAC1B,WAAM,GAAN,MAAM,CAA2B;QAzD9C,sBAAiB,GAAG,KAAK,CAAA;QACzB,kBAAa,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAEvC,mBAAc,GAAG,IAAI,UAAU,EAAE,CAAA;QACjC,yBAAoB,GAAG,KAAK,CAAA;QAE5B,4BAAuB,GAAG,IAAI,gBAAgB,CAAyB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;QACzG,sBAAiB,GAAG,IAAI,gBAAgB,CAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,GAAG,CAAC,CAAC,SAAU,CAAC,CAAA;QAC9F,+BAA0B,GAAG,IAAI,gBAAgB,CAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,GAAG,CAAC,CAAC,SAAU,CAAC,CAAA;QACvG,sBAAiB,GAAG,IAAI,gBAAgB,CAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,GAAG,CAAC,CAAC,SAAU,CAAC,CAAA;QAC9F,+BAA0B,GAAG,IAAI,gBAAgB,CAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,GAAG,CAAC,CAAC,SAAU,CAAC,CAAA;QACvG,4BAAuB,GAAG,IAAI,KAAK,EAAiB,CAAA;QAEpD,sBAAiB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAA;QAClD,4BAA4B;QAC5B,kBAAa,GAAG,IAAI,GAAG,EAAuB,CAAA;QAC9C,yBAAyB;QACzB,kBAAa,GAAG,IAAI,GAAG,EAAuB,CAAA;QAC9C,kBAAa,GAAG,IAAI,GAAG,EAAU,CAAA;QAEjC,SAAI,GAAG,IAAI,SAAS,EAAE,CAAA;QAkBtB,gBAAW,GAAG,KAAK,CAAA,CAAC,qBAAqB;QAEzC,2DAA2D;QAC3D,oBAAe,GAAG,KAAK,CAAA;QACvB,mBAAc,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAA;QAE7C,SAAI,GAAG,IAAI,GAAG,EAAkB,CAAA;QAChC,YAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;QACnC,wBAAmB,GAAG,IAAI,GAAG,EAA0B,CAAA;QACvD,mBAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;QAE1C,QAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC/B,aAAQ,GAAqB,GAAG,EAAE,GAAE,CAAC,CAAA;QASzC,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE;YAC9B,MAAM,IAAI,eAAe,CAAC,gDAAgD,CAAC,CAAA;SAC9E;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEhD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;YAChC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;IACN,CAAC;IAED,UAAU,CAAC,OAAyB;QAChC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;IAC3B,CAAC;IAED,OAAO;QACH,IAAI,CAAC,QAAQ,EAAE,CAAA;IACnB,CAAC;IAED,cAAc,CAAC,IAAqB;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,kBAAkB,EAAE;aACpB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;aAC5B,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;IACnD,CAAC;IAED,eAAe;QACX,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,SAAS,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;IACpC,CAAC;IAEO,YAAY;QAChB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAA;QACzD,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,SAAS;QACX,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAM;QAElC,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACtB,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAA;SAClC;QAED,mCAAmC;QACnC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;QAC7B,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAA;QAC5E,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;QAEvD,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,OAAO,EAAE,CAAA;SACjB;IACL,CAAC;IAED;;;;;OAKG;IACH,QAAQ;QACJ,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAM;QAEnC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAErC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAE;YACnD,YAAY,CAAC,KAAK,CAAC,CAAA;SACtB;QACD,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAA;QAEhC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAC9B,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAA;QACpC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAA;QACpC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAA;QAC9B,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAA;QAC9B,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,CAAA;QACvC,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,CAAA;QACvC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAA;QAC3B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAA;IAC/B,CAAC;IAED;;;;;;OAMG;IACH,OAAO;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;QAEpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,kBAAkB,CAAC,MAAsB,EAAE,UAAU,GAAG,IAAI;QACxD,IAAI,UAAU,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACtC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;SACrC;QAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAED,YAAY,CAAC,MAAsB;QAC/B,IAAI,CAAC,GAAG,CAAC,KAAK,CACV,iEAAiE,EACjE,MAAM,CAAC,CAAC,EACR,IAAI,CAAC,uBAAuB,CAAC,MAAM,CACtC,CAAA;QACD,0BAA0B;QAE1B,QAAQ,MAAM,CAAC,CAAC,EAAE;YACd,KAAK,gBAAgB,CAAC;YACtB,KAAK,oBAAoB,CAAC;YAC1B,KAAK,wBAAwB,CAAC;YAC9B,KAAK,aAAa,CAAC;YACnB,KAAK,wBAAwB;gBACzB,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC;oBAC7B,GAAG,EAAE,MAAM;oBACX,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,CAAC;iBACZ,CAAC,CAAA;gBACF,MAAK;YACT,KAAK,SAAS,CAAC;YACf,KAAK,iBAAiB;gBAClB,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC;oBAC7B,GAAG,EAAE,MAAM;oBACX,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG;oBACvE,MAAM,EAAE,MAAM,CAAC,GAAG;iBACrB,CAAC,CAAA;gBACF,MAAK;YACT;gBACI,WAAW,CAAC,MAAM,CAAC,CAAA;SAC1B;QAED,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAA;IAC/B,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,mBAAmB,CAAC,SAAiB,EAAE,GAAY;QAC/C,wFAAwF;QAExF,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACpC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAA;YACpD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAE,GAAG,CAAC,CAAC,CAAA;YAE3E,OAAO,KAAK,CAAA;SACf;QAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;QACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;QAE5D,iCAAiC;QACjC,IAAI,CAAC,gCAAgC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAErD,OAAO,IAAI,CAAA;IACf,CAAC;IAED;;;;;;;;;OASG;IACH,mBAAmB,CAAC,SAAiB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAE,CAAA;QAElD,IAAI,MAAM,KAAK,SAAS,EAAE;YACtB,OAAO,KAAK,CAAA;SACf;QAED,IAAI,MAAM,GAAG,CAAC,EAAE;YACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gDAAgD,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,CAAA;YACvF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,CAAA;YAE9C,OAAO,KAAK,CAAA;SACf;QAED,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAA;QAE9C,OAAO,IAAI,CAAA;IACf,CAAC;IAED,4GAA4G;IAE5G,KAAK,CAAC,kBAAkB;QACpB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;QAElC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;QAEpB,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;QAEnC,IAAI;YACA,IAAI,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAE/D,GAAG,CAAC,KAAK,CACL,kEAAkE,EAClE,YAAY,CAAC,GAAG,EAChB,YAAY,CAAC,GAAG,EAChB,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,GAAG,CACnB,CAAA;YAED,8DAA8D;YAC9D,kDAAkD;YAClD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBAC3B,CAAC,EAAE,uBAAuB;gBAC1B,GAAG,EAAE,YAAY,CAAC,GAAG;gBACrB,GAAG,EAAE,YAAY,CAAC,GAAG;gBACrB,IAAI,EAAE,YAAY,CAAC,IAAI;aAC1B,CAAC,CAAA;YAEF,QAAQ,IAAI,CAAC,CAAC,EAAE;gBACZ,KAAK,yBAAyB;oBAC1B,MAAK;gBACT,KAAK,2BAA2B,EAAE,mCAAmC;oBAChE,YAAiD,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;oBACjE,MAAK;gBACT,KAAK,yBAAyB;oBAC1B,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAA;oBACrC,MAAK;gBACT,KAAK,oBAAoB;oBACrB,YAAY,GAAG,IAAI,CAAC,KAAK,CAAA;oBACzB,MAAK;gBACT;oBACI,WAAW,CAAC,IAAI,CAAC,CAAA;aACxB;YAED,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAA;YAC3B,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAA;YAC3B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAA;YAC7B,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAA;YAE3B,GAAG,CAAC,KAAK,CAAC,uDAAuD,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;SAC9G;QAAC,OAAO,CAAC,EAAE;YACR,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACzB,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAA;aACpD;YAED,IAAI,CAAC,OAAO,EAAE,CAAA;YACd,MAAM,CAAC,CAAA;SACV;QAED,IAAI,CAAC,OAAO,EAAE,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,mBAAmB;QACrB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;QAEhE,IAAI,WAAW,EAAE;YACb,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;YACvC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;YACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;YACzC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;YAEvC,IAAI,CAAC,GAAG,CAAC,KAAK,CACV,sDAAsD,EACtD,WAAW,CAAC,CAAC,CAAC,EACd,WAAW,CAAC,CAAC,CAAC,EACd,WAAW,CAAC,CAAC,CAAC,EACd,WAAW,CAAC,CAAC,CAAC,CACjB,CAAA;SACJ;QACD,oDAAoD;QACpD,mDAAmD;QACnD,4CAA4C;IAChD,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAI,GAAG,KAAK;QAClC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QAEvB,2CAA2C;QAC3C,iDAAiD;QACjD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE;YACxB,yDAAyD;YACzD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE;gBACvD,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;aAChD;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE;gBACvD,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAI,CAAC,CAAA;aACjD;YACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE;gBAC1D,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAK,CAAC,CAAA;aACnD;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE;gBACvD,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAI,CAAC,CAAA;aACjD;YAED,qBAAqB;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAA;YACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAA;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAA;YACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAA;YAEtB,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC5D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;YAEpB,IAAI,IAAI,EAAE;gBACN,MAAM,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;aACjC;SACJ;IACL,CAAC;IAED,qBAAqB,CAAC,OAAwB;QAC1C,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAI,CAAA;QAE5D,MAAM,SAAS,GAAG,CAAC,GAAkB,EAAE,EAAE;YACrC,MAAM,SAAS,GAAG,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACtD,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;YAE9C,IAAI,GAAG,EAAE;gBACL,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;gBACxC,IAAI,CAAC,GAAG;oBAAE,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;;oBACjD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;aACpB;YAED,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;YAE9C,IAAI,GAAG,EAAE;gBACL,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;aACzB;YAED,QAAQ,GAAG,CAAC,CAAC,EAAE;gBACX,KAAK,kBAAkB,CAAC;gBACxB,KAAK,yBAAyB,CAAC,CAAC;oBAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;oBAE5F,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;oBACxC,IAAI,CAAC,GAAG;wBAAE,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;;wBAC5D,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;oBAE5B,MAAK;iBACR;aACJ;QACL,CAAC,CAAA;QAED,QAAQ,OAAO,CAAC,CAAC,EAAE;YACf,KAAK,SAAS,CAAC;YACf,KAAK,iBAAiB;gBAClB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;gBAClC,MAAK;YACT,KAAK,oBAAoB,CAAC;YAC1B,KAAK,wBAAwB,CAAC;YAC9B,KAAK,wBAAwB,CAAC,CAAC;gBAC3B,oEAAoE;gBACpE,IAAI,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBAC9B,IAAI,CAAC,GAAG;oBAAE,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;;oBAChD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;gBAExB,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBAC1B,IAAI,CAAC,GAAG;oBAAE,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;;oBACjD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACzB,MAAK;aACR;YACD,KAAK,aAAa;gBACd,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACzB,MAAK;YACT,KAAK,gBAAgB;gBACjB,MAAK;YACT;gBACI,WAAW,CAAC,OAAO,CAAC,CAAA;SAC3B;IACL,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,GAAkB,EAAE,KAAiB,EAAE,YAAY,GAAG,KAAK;QAChF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QAEvB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;QAEjC,KAAK,UAAU,SAAS,CAAC,IAA2B;YAChD,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAA;YAEtB,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YAExF,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YACtE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA;YAEpD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAA;YAChC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAA;YAErC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;YAEjE,IAAI,CAAC,MAAM,EAAE;gBACT,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBAEnB,OAAO,YAAY,CAAA;aACtB;YAED,iDAAiD;YAChD,KAAgD,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YAEnE,OAAO,IAAI,CAAA;QACf,CAAC;QAED,QAAQ,GAAG,CAAC,CAAC,EAAE;YACX,KAAK,kBAAkB,CAAC;YACxB,KAAK,yBAAyB,CAAC;YAC/B,KAAK,mBAAmB,CAAC;YACzB,KAAK,0BAA0B,CAAC,CAAC;gBAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAA;gBACvB,IAAI,GAAG,CAAC,CAAC,KAAK,cAAc;oBAAE,OAAO,OAAO,CAAA;gBAE5C,8EAA8E;gBAC9E,mDAAmD;gBACnD,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAAE,OAAO,OAAO,CAAA;gBAClD,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAAE,OAAO,OAAO,CAAA;gBAElD,IAAI,GAAG,CAAC,OAAO,EAAE;oBACb,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,oBAAoB,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE;wBACzF,OAAO,OAAO,CAAA;qBACjB;oBACD,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,yBAAyB,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;wBACrF,OAAO,OAAO,CAAA;qBACjB;iBACJ;gBAED,IAAI,GAAG,CAAC,CAAC,KAAK,gBAAgB,EAAE;oBAC5B,IACI,GAAG,CAAC,OAAO;wBACX,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAC3F;wBACE,OAAO,OAAO,CAAA;qBACjB;oBACD,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBAAE,OAAO,OAAO,CAAA;oBAEpD,IAAI,GAAG,CAAC,QAAQ,EAAE;wBACd,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE;4BAC5B,IAAI,GAAG,CAAC,CAAC,KAAK,0BAA0B,EAAE;gCACtC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oCAAE,OAAO,OAAO,CAAA;6BACrD;yBACJ;qBACJ;oBAED,IAAI,GAAG,CAAC,KAAK,EAAE;wBACX,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;4BACjB,KAAK,qBAAqB;gCACtB,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE;oCAC1D,OAAO,OAAO,CAAA;iCACjB;yBACR;qBACJ;iBACJ;qBAAM;oBACH,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE;wBAClB,KAAK,yBAAyB,CAAC;wBAC/B,KAAK,0BAA0B,CAAC;wBAChC,KAAK,gCAAgC;4BACjC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE;gCACjC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;oCAAE,OAAO,OAAO,CAAA;6BAC/C;4BACD,MAAK;wBACT,KAAK,+BAA+B;4BAChC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE;gCAC1C,OAAO,OAAO,CAAA;6BACjB;4BACD,MAAK;wBACT,KAAK,6BAA6B;4BAC9B,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gCAAE,OAAO,OAAO,CAAA;4BACzD,MAAK;wBACT,KAAK,4BAA4B;4BAC7B,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;gCAC/D,OAAO,OAAO,CAAA;6BACjB;4BACD,MAAK;wBACT,KAAK,iCAAiC;4BAClC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gCAAE,OAAO,OAAO,CAAA;4BAC1D,MAAK;wBACT,KAAK,kCAAkC;4BACnC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gCAAE,OAAO,OAAO,CAAA;4BACzD,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gCAAE,OAAO,OAAO,CAAA;4BACvD,MAAK;qBACZ;iBACJ;gBACD,MAAK;aACR;YACD,KAAK,oBAAoB;gBACrB,IAAI,UAAU,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE;oBAC/C,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE;wBAClC,IAAI,GAAG,CAAC,CAAC,KAAK,0BAA0B,EAAE;4BACtC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gCAAE,OAAO,OAAO,CAAA;yBACrD;qBACJ;iBACJ;SACR;QAED,OAAO,OAAO,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,GAAmB;QAC7C,IAAI,GAAG,CAAC,CAAC,KAAK,cAAc;YAAE,OAAM;QAEpC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QAEvB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAA;QACzB,IAAI,MAAM,CAAC,CAAC,KAAK,aAAa;YAAE,OAAM;QAEtC,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAEvD,MAAM,QAAQ,GAAyB,EAAE,CAAA;QAEzC,SAAS,KAAK,CAAC,IAAsC;YACjD,IAAI,CAAC,IAAI;gBAAE,OAAM;YAEjB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACrB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAEnB,OAAM;aACT;YAED,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YAEtE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1E,CAAC;QAED,qFAAqF;QACrF,4DAA4D;QAC5D,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEjB,IAAI,GAAG,CAAC,CAAC,KAAK,SAAS,EAAE;YACrB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACnB,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAE1B,IAAI,GAAG,CAAC,KAAK,EAAE;gBACX,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;oBACjB,KAAK,qBAAqB;wBACtB,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE;4BACnE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE;gCAC7C,IAAI,IAAI,CAAC,CAAC,KAAK,uBAAuB,EAAE;oCACpC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;iCACnB;6BACJ;yBACJ;wBACD,MAAK;oBACT,KAAK,qBAAqB;wBACtB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;wBACvB,MAAK;oBACT,KAAK,mBAAmB;wBACpB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;wBACrB,MAAK;oBACT,KAAK,sBAAsB;wBACvB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAA;wBAClD,MAAK;iBACZ;aACJ;SACJ;aAAM;YACH,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE;gBAClB,KAAK,yBAAyB,CAAC;gBAC/B,KAAK,0BAA0B,CAAC;gBAChC,KAAK,gCAAgC;oBACjC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBACvB,MAAK;gBACT,KAAK,6BAA6B;oBAC9B,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;oBACxB,MAAK;aACZ;SACJ;QAED,IAAI,GAAG,CAAC,OAAO,EAAE;YACb,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE;gBACnB,KAAK,oBAAoB;oBACrB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;oBAChC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;oBACpC,MAAK;gBACT,KAAK,yBAAyB;oBAC1B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;oBACvB,MAAK;aACZ;YACD,sEAAsE;YACtE,8EAA8E;SACjF;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,SAAiB,EAAE,WAAoB;QACjE,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAA;QAEzG,uBAAuB;QACvB,IAAI,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACpC,YAAY,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;YAChD,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;SACxC;QAED,IAAI,IAAI,GAA8B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAEzD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;YAC/B,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;SAC/D;QACD,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,WAAW,CAAA;QAE7B,IAAI,CAAC,IAAI,EAAE;YACP,GAAG,CAAC,KAAK,CAAC,sEAAsE,EAAE,SAAS,CAAC,CAAA;YAE5F,OAAO,KAAK,CAAA;SACf;QAED,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAA;QAEtF,IAAI,CAAC,WAAW,EAAE;YACd,GAAG,CAAC,KAAK,CAAC,oEAAoE,EAAE,SAAS,CAAC,CAAA;YAE1F,OAAO,KAAK,CAAA;SACf;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAA;QAE3C,mBAAmB;QACnB,IAAI,GAAG,GAAG,IAAI,CAAA;QACd,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAA;QAE3C,IAAI,GAAG,IAAI,CAAC,EAAE;YACV,GAAG,GAAG,CAAC,CAAA;YACP,KAAK,GAAG,CAAC,CAAA;SACZ;QAED,IAAI,WAAW,GAAG,CAAC,CAAA;QAEnB,SAAS;YACL,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBAC3B,CAAC,EAAE,8BAA8B;gBACjC,KAAK,EAAE,IAAI;gBACX,OAAO;gBACP,GAAG;gBACH,KAAK;gBACL,MAAM,EAAE,EAAE,CAAC,EAAE,4BAA4B,EAAE;aAC9C,CAAC,CAAA;YAEF,IAAI,IAAI,CAAC,OAAO;gBAAE,WAAW,GAAG,IAAI,CAAC,OAAO,CAAA;YAE5C,IAAI,IAAI,CAAC,CAAC,KAAK,gCAAgC,EAAE;gBAC7C,GAAG,CAAC,KAAK,CAAC,iEAAiE,EAAE,SAAS,CAAC,CAAA;gBACvF,MAAK;aACR;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAEnC,IAAI,IAAI,CAAC,CAAC,KAAK,kCAAkC,EAAE;gBAC/C,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,QAAQ,EAAE;oBAC5B,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAI,CAAA;iBACzB;gBAED,GAAG,CAAC,IAAI,CACJ,iGAAiG,EACjG,SAAS,EACT,GAAG,EACH,IAAI,CAAC,QAAQ,CAAC,MAAM,CACvB,CAAA;gBAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC9B,GAAG,CAAC,KAAK,CACL,6DAA6D,EAC7D,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,CAAC,EACT,SAAS,CACZ,CAAA;oBAED,IAAI,OAAO,CAAC,CAAC,KAAK,cAAc;wBAAE,OAAM;oBAExC,uBAAuB,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;gBAC5F,CAAC,CAAC,CAAA;gBACF,MAAK;aACR;YAED,GAAG,CAAC,KAAK,CACL,0FAA0F,EAC1F,SAAS,EACT,IAAI,CAAC,WAAW,CAAC,MAAM,EACvB,IAAI,CAAC,YAAY,CAAC,MAAM,EACxB,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,KAAK,CACb,CAAA;YAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACjC,GAAG,CAAC,KAAK,CAAC,qDAAqD,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;gBAElG,IAAI,OAAO,CAAC,CAAC,KAAK,cAAc;oBAAE,OAAM;gBAExC,uBAAuB,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;YAC5F,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;gBAEhD,GAAG,CAAC,KAAK,CACL,iEAAiE,EACjE,GAAG,CAAC,CAAC,EACL,SAAS,EACT,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,GAAG,CACb,CAAA;gBAED,IAAI,cAAc,CAAC,GAAG,CAAC;oBAAE,OAAM;gBAE/B,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAC5C,CAAC,CAAC,CAAA;YAEF,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;YAEd,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAK;SACxB;QAED,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QACxB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAE3B,sBAAsB;QACtB,IAAI,WAAW,KAAK,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACpD,GAAG,CAAC,KAAK,CAAC,oDAAoD,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;YACvF,mBAAmB,CAAC,GAAG,CACnB,SAAS,EACT,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,CACzF,CAAA;SACJ;QAED,OAAO,IAAI,CAAA;IACf,CAAC;IAED,4BAA4B,CACxB,aAAyC,EACzC,SAAiB,EACjB,WAAoB;QAEpB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YAC/B,aAAa,CAAC,GAAG,CACb,SAAS,EACT,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,WAAW,CAAC;iBAC/C,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;YACzE,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;gBACT,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;gBAE/B,IAAI,CAAC,EAAE,EAAE;oBACL,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+DAA+D,EAAE,SAAS,CAAC,CAAA;oBAC1F,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;iBAC5C;YACL,CAAC,CAAC,CACT,CAAA;SACJ;IACL,CAAC;IAED,gCAAgC,CAAC,SAAiB,EAAE,GAAY;QAC5D,IAAI,CAAC,YAAY,CACb,2BAA2B,CAAC;YACxB;gBACI,CAAC,EAAE,sBAAsB;gBACzB,SAAS;gBACT,GAAG;aACN;SACJ,CAAC,CACL,CAAA;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,aAAyC;QAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAA;QAExE,SAAS;YACL,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBAC3B,CAAC,EAAE,uBAAuB;gBAC1B,GAAG,EAAE,IAAI,CAAC,GAAI;gBACd,IAAI,EAAE,IAAI,CAAC,IAAK;gBAChB,GAAG,EAAE,IAAI,CAAC,GAAI;aACjB,CAAC,CAAA;YAEF,QAAQ,IAAI,CAAC,CAAC,EAAE;gBACZ,KAAK,yBAAyB;oBAC1B,GAAG,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAA;oBAEnE,OAAM;gBACV,KAAK,2BAA2B;oBAC5B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;oBACnB,GAAG,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAA;oBAErE,OAAM;aACb;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,KAAK,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAA;YAE1F,GAAG,CAAC,KAAK,CACL,kGAAkG,EAClG,IAAI,CAAC,WAAW,CAAC,MAAM,EACvB,IAAI,CAAC,YAAY,CAAC,MAAM,EACxB,YAAY,CAAC,GAAG,EAChB,YAAY,CAAC,GAAG,EAChB,YAAY,CAAC,GAAG,EAChB,IAAI,CAAC,CAAC,KAAK,oBAAoB,CAClC,CAAA;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAEnC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACjC,GAAG,CAAC,KAAK,CAAC,mDAAmD,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;gBAErG,IAAI,OAAO,CAAC,CAAC,KAAK,cAAc;oBAAE,OAAM;gBAExC,2CAA2C;gBAC3C,uBAAuB,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;YAC5F,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC9B,IAAI,GAAG,CAAC,CAAC,KAAK,sBAAsB,EAAE;oBAClC,GAAG,CAAC,KAAK,CACL,uFAAuF,EACvF,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,GAAG,CACV,CAAA;oBAED,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;oBAExE,OAAM;iBACT;gBAED,IAAI,cAAc,CAAC,GAAG,CAAC;oBAAE,OAAM;gBAE/B,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;gBAEhD,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE;oBACtC,6DAA6D;oBAC7D,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;iBAChC;qBAAM;oBACH,mEAAmE;oBACnE,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;iBAC3C;gBAED,GAAG,CAAC,KAAK,CACL,gFAAgF,EAChF,GAAG,CAAC,CAAC,EACL,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,SAAS,CACnB,CAAA;YACL,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAA;YAC3B,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAA;YAC3B,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAA;YAC3B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAA;YAE7B,IAAI,IAAI,CAAC,CAAC,KAAK,oBAAoB,EAAE;gBACjC,OAAM;aACT;SACJ;IACL,CAAC;IAED,qBAAqB,CAAC,aAAyC;QAC3D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACvB,aAAa,CAAC,GAAG,CACb,CAAC,EACD,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;iBAC/B,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,uBAAuB,CAAC,EAAE;oBAC9C,qEAAqE;oBACrE,4CAA4C;oBAC5C,IAAI,CAAC,QAAQ,EAAE,CAAA;oBAEf,OAAM;iBACT;gBAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAA;gBAE1D,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,8BAA8B,CAAC,EAAE;oBACrD,6BAA6B;oBAC7B,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAA;iBACnC;YACL,CAAC,CAAC;iBACD,IAAI,CAAC,GAAG,EAAE;gBACP,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAC3B,CAAC,CAAC,CACT,CAAA;SACJ;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CACX,OAAsB,EACtB,aAAyC,EACzC,SAAS,GAAG,KAAK,EACjB,SAAS,GAAG,KAAK;QAEjB,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;QAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAA;QAE1B,IAAI,OAAO,GAA4B,SAAS,CAAA;QAEhD,iDAAiD;QACjD,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE;YAC7C,4EAA4E;YAC5E,yEAAyE;YACzE,kEAAkE;YAElE,GAAG,CAAC,KAAK,CAAC,mDAAmD,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;YACrG,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;YAEnF,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,IAAI,EAAE;gBACzC,GAAG,CAAC,KAAK,CACL,iGAAiG,EACjG,OAAO,EACP,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,SAAS,CACpB,CAAA;gBAED,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,yBAAyB,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,gBAAgB,CAAC,EAAE;oBACnG,0EAA0E;oBAC1E,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;iBACzF;qBAAM;oBACH,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;iBAC5C;gBAED,OAAM;aACT;YAED,IAAI,OAAO,CAAC,IAAI,EAAE;gBACd,GAAG,CAAC,KAAK,CACL,+EAA+E,EAC/E,OAAO,EACP,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,SAAS,CACpB,CAAA;aACJ;SACJ;QAED,mCAAmC;QACnC,IAAI,CAAC,SAAS,EAAE;YACZ,uEAAuE;YAEvE,IAAI,OAAO,CAAC,GAAG,EAAE;gBACb,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;gBAEhF,IAAI,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE;oBAC5C,GAAG,CAAC,IAAI,CACJ,kGAAkG,EAClG,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,GAAG,EACX,QAAQ,CACX,CAAA;iBACJ;gBAED,GAAG,CAAC,KAAK,CACL,oGAAoG,EACpG,OAAO,CAAC,SAAS,EACjB,GAAG,CAAC,CAAC,EACL,QAAQ,EACR,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,SAAU,EAChC,SAAS,CACZ,CAAA;gBAED,IAAI,OAAO,CAAC,SAAS,EAAE;oBACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;oBAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;iBACnD;qBAAM;oBACH,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;iBACzB;aACJ;YAED,IAAI,OAAO,CAAC,SAAS,EAAE;gBACnB,GAAG,CAAC,KAAK,CACL,iEAAiE,EACjE,GAAG,CAAC,CAAC,EACL,IAAI,CAAC,GAAG,EACR,OAAO,CAAC,SAAS,GAAG,CAAC,EACrB,SAAS,CACZ,CAAA;gBAED,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;aACzB;SACJ;QAED,IAAI,cAAc,CAAC,GAAG,CAAC;YAAE,OAAM;QAE/B,4BAA4B;QAE5B,wCAAwC;QACxC,QAAQ,GAAG,CAAC,CAAC,EAAE;YACX,KAAK,oBAAoB;gBACrB,yCAAyC;gBACzC,OAAM;YACV,KAAK,iBAAiB,CAAC,CAAC;gBACpB,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;gBAEhD,IAAI,MAAM,EAAE;oBACR,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;wBAC7B,GAAG,MAAM;wBACT,SAAS,EAAE,GAAG,CAAC,SAAS;qBAC3B,CAAC,CAAA;iBACL;qBAAM;oBACH,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;iBAC9E;gBACD,MAAK;aACR;YACD,KAAK,cAAc;gBACf,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC3E,MAAK;YACT,KAAK,gBAAgB;gBACjB,OAAO;gBACP,2CAA2C;gBAC3C,wFAAwF;gBACxF,IAAI;gBACJ,MAAK;YACT,KAAK,6BAA6B;gBAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;oBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;iBACxF;gBACD,MAAK;YACT,KAAK,kBAAkB,CAAC;YACxB,KAAK,mBAAmB,CAAC;YACzB,KAAK,yBAAyB,CAAC;YAC/B,KAAK,0BAA0B;gBAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;oBACnB,MAAM,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;iBAClD;gBACD,MAAK;SACZ;QAED,IAAI,OAAO,EAAE,IAAI,EAAE;YACf,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAClB,IAAI,CAAC,GAAG,CAAC,IAAI,CACT,oEAAoE,EACpE,OAAO,EACP,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,SAAS,CACpB,CAAA;aACJ;iBAAM;gBACH,iDAAiD;gBACjD,MAAM,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;gBAE9B,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE;oBACtB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;yBAC5C,IAAI,CAAC,CAAC,IAAI,EAAW,EAAE;wBACpB,IAAI,CAAC,IAAI,EAAE;4BACP,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uDAAuD,EAAE,EAAE,CAAC,CAAA;4BAE1E,OAAM;yBACT;wBAED,uFAAuF;wBACvF,OAAO;wBACP,kCAAkC;wBAClC,+DAA+D;wBAC/D,sCAAsC;wBACtC,yDAAyD;wBACzD,IAAI;wBAEJ,GAAG,CAAC,IAAI,CAAC,kDAAkD,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;oBAC5E,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;wBACX,GAAG,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;oBACxD,CAAC,CAAC,CAAA;iBACT;aACJ;SACJ;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACxB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAA;YACxC,MAAM,KAAK,GACP,GAAG,CAAC,CAAC,KAAK,kBAAkB,IAAI,GAAG,CAAC,CAAC,KAAK,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;YAEpG,6EAA6E;YAC7E,MAAM,YAAY,GAAG,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAI,CAAC,CAAA;YAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,GAAI,CAAC,CAAA;YAE1D,IAAI,YAAY,IAAI,UAAU,IAAI,UAAU,EAAE;gBAC1C,GAAG,CAAC,KAAK,CAAC,uDAAuD,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;gBAEzE,OAAM;aACT;SACJ;QAED,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;QAC9D,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,EACF,GAAG,EACH,MAAM,EACN,IAAI,EACJ,OAAO,EACP,uBAAuB,EACvB,iBAAiB,EACjB,0BAA0B,EAC1B,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,EACvB,aAAa,EACb,cAAc,GACjB,GAAG,IAAI,CAAA;QAER,GAAG,CAAC,KAAK,CAAC,2CAA2C,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QAEhE,IAAI;YACA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;gBACX,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAA;aAClC;YAED,OAAO,IAAI,CAAC,iBAAiB,EAAE;gBAC3B,IACI,CAAC,CACG,uBAAuB,CAAC,MAAM;oBAC9B,iBAAiB,CAAC,MAAM;oBACxB,iBAAiB,CAAC,MAAM;oBACxB,uBAAuB,CAAC,MAAM;oBAC9B,IAAI,CAAC,oBAAoB,CAC5B,EACH;oBACE,MAAM,aAAa,CAAC,IAAI,EAAE,CAAA;iBAC7B;gBACD,IAAI,CAAC,IAAI,CAAC,iBAAiB;oBAAE,MAAK;gBAElC,GAAG,CAAC,KAAK,CACL,kHAAkH,EAClH,uBAAuB,CAAC,MAAM,EAC9B,iBAAiB,CAAC,MAAM,EACxB,0BAA0B,CAAC,MAAM,EACjC,iBAAiB,CAAC,MAAM,EACxB,0BAA0B,CAAC,MAAM,EACjC,uBAAuB,CAAC,MAAM,CACjC,CAAA;gBAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAAyB,CAAA;gBAEtD,mCAAmC;gBACnC,OAAO,uBAAuB,CAAC,MAAM,EAAE;oBACnC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,uBAAuB,CAAC,QAAQ,EAAG,CAAA;oBAErE,QAAQ,GAAG,CAAC,CAAC,EAAE;wBACX,KAAK,gBAAgB;4BACjB,GAAG,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAA;4BACzD,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;4BACzC,MAAK;wBACT,KAAK,iBAAiB,CAAC;wBACvB,KAAK,SAAS,CAAC,CAAC;4BACZ,IAAI,QAAQ,KAAK,CAAC,EAAE;gCAChB,8BAA8B;gCAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAI,GAAG,CAAC,CAAA;gCAClC,GAAG,CAAC,KAAK,CACL,mEAAmE,EACnE,GAAG,CAAC,CAAC,EACL,QAAQ,EACR,MAAM,EACN,GAAG,CAAC,OAAO,CAAC,MAAM,CACrB,CAAA;gCAED,IAAI,YAAY,GAAG,QAAQ,EAAE;oCACzB,GAAG,CAAC,KAAK,CACL,yEAAyE,EACzE,YAAY,EACZ,QAAQ,CACX,CAAA;oCACD,0DAA0D;oCAC1D,SAAQ;iCACX;gCAED,IAAI,YAAY,GAAG,QAAQ,EAAE;oCACzB,GAAG,CAAC,KAAK,CACL,mEAAmE,EACnE,YAAY,EACZ,QAAQ,CACX,CAAA;oCACD,+CAA+C;oCAC/C,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;iCAC5C;6BACJ;iCAAM;gCACH,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;6BAClE;4BAED,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;4BAE/C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;4BAElC,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE;gCAC9B,QAAQ,MAAM,CAAC,CAAC,EAAE;oCACd,KAAK,sBAAsB;wCACvB,GAAG,CAAC,KAAK,CACL,qFAAqF,EACrF,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,GAAG,CACb,CAAA;wCACD,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;wCAC9E,SAAQ;oCACZ,KAAK,kBAAkB;wCACnB,qHAAqH;wCACrH,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;4CAC3C,eAAe;4CACf,GAAG,CAAC,KAAK,CACL,uEAAuE,CAC1E,CAAA;4CACD,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;4CACZ,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;yCAC5C;6CAAM;4CACH,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAA;4CAC9D,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAA;yCAClC;wCACD,SAAQ;iCACf;gCAED,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;gCAE7C,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;oCAChC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;iCAChC;qCAAM,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;oCACvC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;iCAChC;qCAAM;oCACH,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;iCAC3C;6BACJ;4BAED,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,GAAI,EAAE;gCACpC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAA;gCACjB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;6BACvB;4BAED,MAAK;yBACR;wBACD,KAAK,aAAa,CAAC,CAAC;4BAChB,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;4BAErC,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC,CAAA;4BAE5D,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;gCAChC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;6BAChC;iCAAM,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;gCACvC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;6BAChC;iCAAM;gCACH,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;6BAC3C;4BAED,MAAK;yBACR;wBACD,KAAK,oBAAoB,CAAC,CAAC;4BACvB,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;4BAExC,MAAM,OAAO,GAAkB;gCAC3B,CAAC,EAAE,SAAS;gCACZ,GAAG,EAAE,GAAG,CAAC,GAAG;gCACZ,SAAS,EAAE,GAAG,CAAC,SAAS;gCACxB,WAAW,EAAE,GAAG,CAAC,WAAW;gCAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;gCAClB,EAAE,EAAE,GAAG,CAAC,EAAE;gCACV,MAAM,EAAE;oCACJ,CAAC,EAAE,UAAU;oCACb,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM;iCACnD;gCACD,MAAM,EAAE;oCACJ,CAAC,EAAE,UAAU;oCACb,MAAM,EAAE,GAAG,CAAC,MAAM;iCACrB;gCACD,OAAO,EAAE,GAAG,CAAC,OAAO;gCACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gCACtB,OAAO,EAAE,GAAG,CAAC,OAAO;gCACpB,IAAI,EAAE,GAAG,CAAC,IAAI;gCACd,OAAO,EAAE,GAAG,CAAC,OAAO;gCACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gCACtB,SAAS,EAAE,GAAG,CAAC,SAAS;6BAC3B,CAAA;4BAED,MAAM,MAAM,GAA2B;gCACnC,CAAC,EAAE,kBAAkB;gCACrB,OAAO;gCACP,GAAG,EAAE,GAAG,CAAC,GAAG;gCACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ;6BACzB,CAAA;4BAED,iBAAiB,CAAC,GAAG,CAAC;gCAClB,MAAM;gCACN,SAAS,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,QAAQ;gCACjC,GAAG,EAAE,GAAG,CAAC,GAAG;gCACZ,KAAK,EAAE,IAAI,UAAU,EAAE;gCACvB,cAAc,EAAE,KAAK;6BACxB,CAAC,CAAA;4BAEF,MAAK;yBACR;wBACD,KAAK,wBAAwB,CAAC,CAAC;4BAC3B,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;4BAE5C,MAAM,OAAO,GAAkB;gCAC3B,CAAC,EAAE,SAAS;gCACZ,GAAG,EAAE,GAAG,CAAC,GAAG;gCACZ,SAAS,EAAE,GAAG,CAAC,SAAS;gCACxB,WAAW,EAAE,GAAG,CAAC,WAAW;gCAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;gCAClB,EAAE,EAAE,GAAG,CAAC,EAAE;gCACV,MAAM,EAAE;oCACJ,CAAC,EAAE,UAAU;oCACb,MAAM,EAAE,GAAG,CAAC,MAAM;iCACrB;gCACD,MAAM,EAAE;oCACJ,CAAC,EAAE,UAAU;oCACb,MAAM,EAAE,GAAG,CAAC,MAAM;iCACrB;gCACD,OAAO,EAAE,GAAG,CAAC,OAAO;gCACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gCACtB,OAAO,EAAE,GAAG,CAAC,OAAO;gCACpB,IAAI,EAAE,GAAG,CAAC,IAAI;gCACd,OAAO,EAAE,GAAG,CAAC,OAAO;gCACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gCACtB,SAAS,EAAE,GAAG,CAAC,SAAS;6BAC3B,CAAA;4BAED,MAAM,MAAM,GAA2B;gCACnC,CAAC,EAAE,kBAAkB;gCACrB,OAAO;gCACP,GAAG,EAAE,GAAG,CAAC,GAAG;gCACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ;6BACzB,CAAA;4BAED,iBAAiB,CAAC,GAAG,CAAC;gCAClB,MAAM;gCACN,SAAS,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,QAAQ;gCACjC,GAAG,EAAE,GAAG,CAAC,GAAG;gCACZ,KAAK,EAAE,IAAI,UAAU,EAAE;gCACvB,cAAc,EAAE,KAAK;6BACxB,CAAC,CAAA;4BAEF,MAAK;yBACR;wBACD,KAAK,wBAAwB,CAAC,CAAC;4BAC3B,oBAAoB;4BACpB,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;4BAC3C,MAAK;yBACR;wBACD;4BACI,WAAW,CAAC,GAAG,CAAC,CAAA;qBACvB;iBACJ;gBAED,8BAA8B;gBAC9B,OAAO,iBAAiB,CAAC,MAAM,EAAE;oBAC7B,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAG,CAAA;oBAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAA;oBAE1B,YAAY;oBAEZ,IAAI,QAAQ,GAAkB,IAAI,CAAA;oBAElC,IAAI,CAAC,OAAO,CAAC,SAAS;wBAAE,QAAQ,GAAG,IAAI,CAAC,GAAI,CAAA;yBACvC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;wBAClC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAE,CAAA;qBAC1C;yBAAM,IAAI,IAAI,CAAC,eAAe,EAAE;wBAC7B,uCAAuC;wBACvC,oCAAoC;wBACpC,8CAA8C;wBAC9C,kDAAkD;wBAClD,wDAAwD;wBACxD,wBAAwB;wBAExB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;wBAE3E,IAAI,KAAK,EAAE;4BACP,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;4BAClC,QAAQ,GAAG,KAAK,CAAA;yBACnB;qBACJ;oBAED,IAAI,QAAQ,EAAE;wBACV,MAAM,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC,SAAU,CAAA;wBAC1C,wCAAwC;wBACxC,MAAM,SAAS,GAAG,IAAI,GAAG,OAAO,CAAA;wBAEhC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE;4BACxB,wDAAwD;4BACxD,GAAG,CAAC,KAAK,CACL,yEAAyE,EACzE,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,SAAS,EACjB,QAAQ,EACR,OAAO,CAAC,SAAS,CACpB,CAAA;4BACD,SAAQ;yBACX;wBACD,IAAI,IAAI,GAAG,CAAC,EAAE;4BACV,8CAA8C;4BAC9C,iEAAiE;4BACjE,gCAAgC;4BAChC,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE;gCACX,GAAG,CAAC,KAAK,CACL,gGAAgG,EAChG,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,SAAS,EACjB,QAAQ,EACR,OAAO,CAAC,SAAS,EACjB,IAAI,CACP,CAAA;gCACD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;gCAClC,0BAA0B,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gCACvC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;6BAC7C;iCAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE;gCACxB,GAAG,CAAC,KAAK,CACL,oGAAoG,EACpG,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,SAAS,EACjB,QAAQ,EACR,OAAO,CAAC,SAAS,EACjB,IAAI,CACP,CAAA;gCAED,IAAI,OAAO,CAAC,SAAS,EAAE;oCACnB,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;iCACtE;qCAAM;oCACH,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;iCAC5C;6BACJ;iCAAM;gCACH,GAAG,CAAC,KAAK,CACL,mFAAmF,EACnF,QAAQ,EACR,OAAO,CAAC,SAAS,EACjB,IAAI,CACP,CAAA;gCAED,IAAI,OAAO,CAAC,SAAS,EAAE;oCACnB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;oCAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;iCACpC;qCAAM;oCACH,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAA;iCAClC;6BACJ;4BACD,SAAQ;yBACX;wBAED,IAAI,SAAS,EAAE;4BACX,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;yBACzE;qBACJ;oBAED,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;iBAC/C;gBAED,wCAAwC;gBACxC,KAAK,IAAI,IAAI,GAAG,0BAA0B,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE;oBACpE,uEAAuE;oBACvE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAA;oBAEtB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAA;oBAE1B,IAAI,QAAQ,CAAA;oBAEZ,IAAI,CAAC,OAAO,CAAC,SAAS;wBAAE,QAAQ,GAAG,IAAI,CAAC,GAAI,CAAA;yBACvC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;wBAClC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;qBACzC;oBAED,0EAA0E;oBAC1E,IAAI,CAAC,QAAQ,EAAE;wBACX,GAAG,CAAC,IAAI,CACJ,+DAA+D,EAC/D,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,SAAS,CACpB,CAAA;wBACD,SAAQ;qBACX;oBAED,6CAA6C;oBAC7C,IAAI,QAAQ,GAAG,OAAO,CAAC,SAAU,EAAE;wBAC/B,wDAAwD;wBACxD,GAAG,CAAC,KAAK,CACL,mFAAmF,EACnF,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,SAAS,EACjB,QAAQ,EACR,OAAO,CAAC,SAAS,CACpB,CAAA;wBACD,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;wBACxC,SAAQ;qBACX;oBACD,IAAI,QAAQ,GAAG,OAAO,CAAC,SAAU,EAAE;wBAC/B,8CAA8C;wBAC9C,mEAAmE;wBACnE,wBAAwB;wBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;wBAEtB,IAAI,GAAG,GAAG,OAAO,CAAC,OAAQ,EAAE;4BACxB,GAAG,CAAC,KAAK,CACL,gFAAgF,EAChF,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,OAAQ,GAAG,GAAG,EACtB,QAAQ,EACR,OAAO,CAAC,SAAS,CACpB,CAAA;yBACJ;6BAAM;4BACH,GAAG,CAAC,KAAK,CACL,wFAAwF,EACxF,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,SAAS,EACjB,QAAQ,EACR,OAAO,CAAC,SAAS,CACpB,CAAA;4BACD,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;4BAExC,IAAI,OAAO,CAAC,SAAS,EAAE;gCACnB,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;6BACtE;iCAAM;gCACH,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;6BAC5C;yBACJ;wBACD,SAAQ;qBACX;oBAED,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;oBAClD,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;iBAC3C;gBAED,8BAA8B;gBAC9B,OAAO,iBAAiB,CAAC,MAAM,EAAE;oBAC7B,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAG,CAAA;oBAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAA;oBAE1B,YAAY;oBACZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAI,GAAG,OAAO,CAAC,SAAU,CAAA;oBAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,OAAO,CAAA;oBAEhC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE;wBACxB,wDAAwD;wBACxD,GAAG,CAAC,KAAK,CACL,8DAA8D,EAC9D,GAAG,CAAC,CAAC,EACL,IAAI,CAAC,GAAI,EACT,OAAO,CAAC,SAAS,CACpB,CAAA;wBACD,SAAQ;qBACX;oBACD,IAAI,IAAI,CAAC,GAAI,GAAG,OAAO,CAAC,SAAU,EAAE;wBAChC,8CAA8C;wBAC9C,iEAAiE;wBACjE,gCAAgC;wBAChC,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE;4BACX,GAAG,CAAC,KAAK,CACL,qFAAqF,EACrF,GAAG,CAAC,CAAC,EACL,IAAI,CAAC,GAAI,EACT,OAAO,CAAC,SAAS,EACjB,IAAI,CACP,CAAA;4BACD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;4BAClC,0BAA0B,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;4BACvC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;yBAC7C;6BAAM;4BACH,GAAG,CAAC,KAAK,CACL,yFAAyF,EACzF,GAAG,CAAC,CAAC,EACL,IAAI,CAAC,GAAI,EACT,OAAO,CAAC,SAAS,EACjB,IAAI,CACP,CAAA;4BACD,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;yBAC5C;wBACD,SAAQ;qBACX;oBAED,IAAI,SAAS,EAAE;wBACX,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;qBACzE;oBAED,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;iBAC/C;gBAED,wCAAwC;gBACxC,KAAK,IAAI,IAAI,GAAG,0BAA0B,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE;oBACpE,uEAAuE;oBACvE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAA;oBACtB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAA;oBAE1B,6CAA6C;oBAC7C,IAAI,IAAI,CAAC,GAAI,GAAG,OAAO,CAAC,SAAU,EAAE;wBAChC,wDAAwD;wBACxD,GAAG,CAAC,KAAK,CACL,wEAAwE,EACxE,GAAG,CAAC,CAAC,EACL,IAAI,CAAC,GAAI,EACT,OAAO,CAAC,SAAS,CACpB,CAAA;wBACD,SAAQ;qBACX;oBACD,IAAI,IAAI,CAAC,GAAI,GAAG,OAAO,CAAC,SAAU,EAAE;wBAChC,8CAA8C;wBAC9C,mEAAmE;wBACnE,wBAAwB;wBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;wBAEtB,IAAI,GAAG,GAAG,OAAO,CAAC,OAAQ,EAAE;4BACxB,GAAG,CAAC,KAAK,CACL,qEAAqE,EACrE,GAAG,CAAC,CAAC,EACL,OAAO,CAAC,OAAQ,GAAG,GAAG,EACtB,IAAI,CAAC,GAAI,EACT,OAAO,CAAC,SAAS,CACpB,CAAA;yBACJ;6BAAM;4BACH,GAAG,CAAC,KAAK,CACL,6EAA6E,EAC7E,GAAG,CAAC,CAAC,EACL,IAAI,CAAC,GAAI,EACT,OAAO,CAAC,SAAS,CACpB,CAAA;4BACD,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;4BACxC,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;yBAC5C;wBACD,SAAQ;qBACX;oBAED,gDAAgD;oBAChD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;oBAClD,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;iBAC3C;gBAED,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAA;gBAEjC,qCAAqC;gBACrC,OAAO,aAAa,CAAC,IAAI,EAAE;oBACvB,GAAG,CAAC,KAAK,CACL,8DAA8D,EAC9D,aAAa,CAAC,IAAI,EAClB,aAAa,CAAC,IAAI,EAAE,CACvB,CAAA;oBAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;oBAE9C,6DAA6D;oBAC7D,GAAG,CAAC,KAAK,CACL,qDAAqD,EACrD,aAAa,CAAC,IAAI,EAClB,aAAa,CAAC,IAAI,EAAE,CACvB,CAAA;iBACJ;gBAED,4DAA4D;gBAC5D,OAAO,uBAAuB,CAAC,MAAM,EAAE;oBACnC,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,EAAG,CAAA;oBAEnD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;iBAC5D;gBAED,yEAAyE;gBACzE,+EAA+E;gBAC/E,8CAA8C;gBAC9C,OAAO,aAAa,CAAC,IAAI,EAAE;oBACvB,GAAG,CAAC,KAAK,CACL,6DAA6D,EAC7D,aAAa,CAAC,IAAI,EAClB,aAAa,CAAC,IAAI,EAAE,CACvB,CAAA;oBAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;oBAE9C,6DAA6D;oBAC7D,GAAG,CAAC,KAAK,CACL,qDAAqD,EACrD,aAAa,CAAC,IAAI,EAClB,aAAa,CAAC,IAAI,EAAE,CACvB,CAAA;iBACJ;gBAED,wBAAwB;gBACxB,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;aACvC;YAED,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;SACpC;QAAC,OAAO,CAAC,EAAE;YACR,GAAG,CAAC,KAAK,CAAC,gDAAgD,EAAE,CAAC,CAAC,CAAA;YAE9D,OAAO,IAAI,CAAC,KAAK,EAAE,CAAA;SACtB;IACL,CAAC;CACJ","sourcesContent":["/* eslint-disable max-depth,max-params */\nimport { tl } from '@mtcute/tl'\n\nimport { MtArgumentError } from '../../types/errors.js'\nimport { assertNever, MaybePromise } from '../../types/utils.js'\nimport {\n AsyncLock,\n ConditionVariable,\n Deque,\n EarlyTimer,\n getBarePeerId,\n getMarkedPeerId,\n parseMarkedPeerId,\n SortedLinkedList,\n toggleChannelIdMark,\n toInputChannel,\n} from '../../utils/index.js'\nimport { BaseTelegramClient } from '../base.js'\nimport { CurrentUserInfo } from '../storage/service/current-user.js'\nimport { PeersIndex } from '../types/peers/peers-index.js'\nimport { PendingUpdate, PendingUpdateContainer, RawUpdateHandler, UpdatesManagerParams } from './types.js'\nimport {\n createDummyUpdatesContainer,\n extractChannelIdFromUpdate,\n isMessageEmpty,\n messageToUpdate,\n toPendingUpdate,\n} from './utils.js'\n\n// code in this file is very bad, thanks to Telegram's awesome updates mechanism\n\n// todo: maybe move to another class?\n// /**\n// * Enable RPS meter.\n// *\n// * > **Note**: This may have negative impact on performance\n// *\n// * @param size Sampling size\n// * @param time Window time\n// */\n// export function enableRps(client: ITelegramClient, size?: number, time?: number): void {\n// const state = getState(client)\n// state.rpsIncoming = new RpsMeter(size, time)\n// state.rpsProcessing = new RpsMeter(size, time)\n// }\n\n// /**\n// * Get current average incoming RPS\n// *\n// * Incoming RPS is calculated based on\n// * incoming update containers. Normally,\n// * they should be around the same, except\n// * rare situations when processing rps\n// * may peak.\n// */\n// export function getCurrentRpsIncoming(client: ITelegramClient): number {\n// const state = getState(client)\n\n// if (!state.rpsIncoming) {\n// throw new MtArgumentError('RPS meter is not enabled, use .enableRps() first')\n// }\n\n// return state.rpsIncoming.getRps()\n// }\n\n// /**\n// * Get current average processing RPS\n// *\n// * Processing RPS is calculated based on\n// * dispatched updates. Normally,\n// * they should be around the same, except\n// * rare situations when processing rps\n// * may peak.\n// */\n// export function getCurrentRpsProcessing(client: ITelegramClient): number {\n// const state = getState(client)\n\n// if (!state.rpsProcessing) {\n// throw new MtArgumentError('RPS meter is not enabled, use .enableRps() first')\n// }\n\n// return state.rpsProcessing.getRps()\n// }\n\nconst KEEP_ALIVE_INTERVAL = 15 * 60 * 1000 // 15 minutes\n\n// todo: fix docs\nexport class UpdatesManager {\n updatesLoopActive = false\n updatesLoopCv = new ConditionVariable()\n\n postponedTimer = new EarlyTimer()\n hasTimedoutPostponed = false\n\n pendingUpdateContainers = new SortedLinkedList<PendingUpdateContainer>((a, b) => a.seqStart - b.seqStart)\n pendingPtsUpdates = new SortedLinkedList<PendingUpdate>((a, b) => a.ptsBefore! - b.ptsBefore!)\n pendingPtsUpdatesPostponed = new SortedLinkedList<PendingUpdate>((a, b) => a.ptsBefore! - b.ptsBefore!)\n pendingQtsUpdates = new SortedLinkedList<PendingUpdate>((a, b) => a.qtsBefore! - b.qtsBefore!)\n pendingQtsUpdatesPostponed = new SortedLinkedList<PendingUpdate>((a, b) => a.qtsBefore! - b.qtsBefore!)\n pendingUnorderedUpdates = new Deque<PendingUpdate>()\n\n noDispatchEnabled = !this.params.disableNoDispatch\n // channel id or 0 => msg id\n noDispatchMsg = new Map<number, Set<number>>()\n // channel id or 0 => pts\n noDispatchPts = new Map<number, Set<number>>()\n noDispatchQts = new Set<number>()\n\n lock = new AsyncLock()\n // rpsIncoming?: RpsMeter\n // rpsProcessing?: RpsMeter\n\n // accessing storage every time might be expensive,\n // so store everything here, and load & save\n // every time session is loaded & saved.\n pts?: number\n qts?: number\n date?: number\n seq?: number\n\n // old values of the updates state (i.e. as in DB)\n // used to avoid redundant storage calls\n oldPts?: number\n oldQts?: number\n oldDate?: number\n oldSeq?: number\n selfChanged = false // todo what is this?\n\n // whether to catch up channels from the locally stored pts\n catchUpChannels = false\n catchUpOnStart = this.params.catchUp ?? false\n\n cpts = new Map<number, number>()\n cptsMod = new Map<number, number>()\n channelDiffTimeouts = new Map<number, NodeJS.Timeout>()\n channelsOpened = new Map<number, number>()\n\n log = this.client.log.create('updates')\n private _handler: RawUpdateHandler = () => {}\n\n auth?: CurrentUserInfo | null // todo: do we need a local copy?\n keepAliveInterval?: NodeJS.Timeout\n\n constructor(\n readonly client: BaseTelegramClient,\n readonly params: UpdatesManagerParams = {},\n ) {\n if (client.params.disableUpdates) {\n throw new MtArgumentError('Updates must be enabled to use updates manager')\n }\n\n this._onKeepAlive = this._onKeepAlive.bind(this)\n\n this.postponedTimer.onTimeout(() => {\n this.hasTimedoutPostponed = true\n this.updatesLoopCv.notify()\n })\n }\n\n setHandler(handler: RawUpdateHandler): void {\n this._handler = handler\n }\n\n destroy() {\n this.stopLoop()\n }\n\n notifyLoggedIn(self: CurrentUserInfo): void {\n this.auth = self\n this._fetchUpdatesState()\n .then(() => this.startLoop())\n .catch((err) => this.client.emitError(err))\n }\n\n notifyLoggedOut(): void {\n this.stopLoop()\n this.cpts.clear()\n this.cptsMod.clear()\n this.pts = this.qts = this.date = this.seq = undefined\n }\n\n async prepare(): Promise<void> {\n await this._loadUpdatesStorage()\n }\n\n private _onKeepAlive() {\n this.log.debug('no updates for >15 minutes, catching up')\n this.handleUpdate({ _: 'updatesTooLong' })\n }\n\n /**\n * Start updates loop.\n *\n * You must first call {@link enableUpdatesProcessing} to use this method.\n *\n * It is recommended to use this method in callback to {@link start},\n * or otherwise make sure the user is logged in.\n *\n * > **Note**: If you are using {@link UpdatesManagerParams.catchUp} option,\n * > catching up will be done in background, you can't await it.\n */\n async startLoop(): Promise<void> {\n if (this.updatesLoopActive) return\n\n // otherwise we will catch up on the first update\n if (!this.catchUpOnStart) {\n await this._fetchUpdatesState()\n }\n\n // start updates loop in background\n this.updatesLoopActive = true\n this.keepAliveInterval = setInterval(this._onKeepAlive, KEEP_ALIVE_INTERVAL)\n this._loop().catch((err) => this.client.emitError(err))\n\n if (this.catchUpOnStart) {\n this.catchUp()\n }\n }\n\n /**\n * **ADVANCED**\n *\n * Manually stop updates loop.\n * Usually done automatically when stopping the client with {@link close}\n */\n stopLoop(): void {\n if (!this.updatesLoopActive) return\n\n clearInterval(this.keepAliveInterval)\n\n for (const timer of this.channelDiffTimeouts.values()) {\n clearTimeout(timer)\n }\n this.channelDiffTimeouts.clear()\n\n this.updatesLoopActive = false\n this.pendingUpdateContainers.clear()\n this.pendingUnorderedUpdates.clear()\n this.pendingPtsUpdates.clear()\n this.pendingQtsUpdates.clear()\n this.pendingPtsUpdatesPostponed.clear()\n this.pendingQtsUpdatesPostponed.clear()\n this.postponedTimer.reset()\n this.updatesLoopCv.notify()\n }\n\n /**\n * Catch up with the server by loading missed updates.\n *\n * > **Note**: In case the storage was not properly\n * > closed the last time, \"catching up\" might\n * > result in duplicate updates.\n */\n catchUp(): void {\n this.log.debug('catch up requested')\n\n this.catchUpChannels = true\n this.handleUpdate({ _: 'updatesTooLong' })\n }\n\n handleClientUpdate(update: tl.TypeUpdates, noDispatch = true): void {\n if (noDispatch && this.noDispatchEnabled) {\n this._addToNoDispatchIndex(update)\n }\n\n this.handleUpdate(update)\n }\n\n handleUpdate(update: tl.TypeUpdates): void {\n this.log.debug(\n 'received %s, queueing for processing. containers queue size: %d',\n update._,\n this.pendingUpdateContainers.length,\n )\n // this.rpsIncoming?.hit()\n\n switch (update._) {\n case 'updatesTooLong':\n case 'updateShortMessage':\n case 'updateShortChatMessage':\n case 'updateShort':\n case 'updateShortSentMessage':\n this.pendingUpdateContainers.add({\n upd: update,\n seqStart: 0,\n seqEnd: 0,\n })\n break\n case 'updates':\n case 'updatesCombined':\n this.pendingUpdateContainers.add({\n upd: update,\n seqStart: update._ === 'updatesCombined' ? update.seqStart : update.seq,\n seqEnd: update.seq,\n })\n break\n default:\n assertNever(update)\n }\n\n this.updatesLoopCv.notify()\n }\n\n /**\n * **ADVANCED**\n *\n * Notify the updates manager that some channel was \"opened\".\n * Channel difference for \"opened\" channels will be fetched on a regular basis.\n * This is a low-level method, prefer using {@link openChat} instead.\n *\n * Channel must be resolve-able with `resolvePeer` method (i.e. be in cache);\n * base chat PTS must either be passed (e.g. from {@link Dialog}), or cached in storage.\n *\n * @param channelId Bare ID of the channel\n * @param pts PTS of the channel, if known (e.g. from {@link Dialog})\n * @returns `true` if the channel was opened for the first time, `false` if it is already opened\n */\n notifyChannelOpened(channelId: number, pts?: number): boolean {\n // this method is intentionally very dumb to avoid making this file even more unreadable\n\n if (this.channelsOpened.has(channelId)) {\n this.log.debug('channel %d opened again', channelId)\n this.channelsOpened.set(channelId, this.channelsOpened.get(channelId)! + 1)\n\n return false\n }\n\n this.channelsOpened.set(channelId, 1)\n this.log.debug('channel %d opened (pts=%d)', channelId, pts)\n\n // force fetch channel difference\n this._fetchChannelDifferenceViaUpdate(channelId, pts)\n\n return true\n }\n\n /**\n * **ADVANCED**\n *\n * Notify the updates manager that some channel was \"closed\".\n * Basically the opposite of {@link notifyChannelOpened}.\n * This is a low-level method, prefer using {@link closeChat} instead.\n *\n * @param channelId Bare channel ID\n * @returns `true` if the chat was closed for the last time, `false` otherwise\n */\n notifyChannelClosed(channelId: number): boolean {\n const opened = this.channelsOpened.get(channelId)!\n\n if (opened === undefined) {\n return false\n }\n\n if (opened > 1) {\n this.log.debug('channel %d closed, but is opened %d more times', channelId, opened - 1)\n this.channelsOpened.set(channelId, opened - 1)\n\n return false\n }\n\n this.channelsOpened.delete(channelId)\n this.log.debug('channel %d closed', channelId)\n\n return true\n }\n\n ////////////////////////////////////////////// IMPLEMENTATION //////////////////////////////////////////////\n\n async _fetchUpdatesState(): Promise<void> {\n const { client, lock, log } = this\n\n await lock.acquire()\n\n log.debug('fetching initial state')\n\n try {\n let fetchedState = await client.call({ _: 'updates.getState' })\n\n log.debug(\n 'updates.getState returned state: pts=%d, qts=%d, date=%d, seq=%d',\n fetchedState.pts,\n fetchedState.qts,\n fetchedState.date,\n fetchedState.seq,\n )\n\n // for some unknown fucking reason getState may return old qts\n // call getDifference to get actual values :shrug:\n const diff = await client.call({\n _: 'updates.getDifference',\n pts: fetchedState.pts,\n qts: fetchedState.qts,\n date: fetchedState.date,\n })\n\n switch (diff._) {\n case 'updates.differenceEmpty':\n break\n case 'updates.differenceTooLong': // shouldn't happen, but who knows?\n (fetchedState as tl.Mutable<tl.updates.TypeState>).pts = diff.pts\n break\n case 'updates.differenceSlice':\n fetchedState = diff.intermediateState\n break\n case 'updates.difference':\n fetchedState = diff.state\n break\n default:\n assertNever(diff)\n }\n\n this.qts = fetchedState.qts\n this.pts = fetchedState.pts\n this.date = fetchedState.date\n this.seq = fetchedState.seq\n\n log.debug('loaded initial state: pts=%d, qts=%d, date=%d, seq=%d', this.pts, this.qts, this.date, this.seq)\n } catch (e) {\n if (this.client.isConnected) {\n log.error('failed to fetch updates state: %s', e)\n }\n\n lock.release()\n throw e\n }\n\n lock.release()\n }\n\n async _loadUpdatesStorage(): Promise<void> {\n const storedState = await this.client.storage.updates.getState()\n\n if (storedState) {\n this.pts = this.oldPts = storedState[0]\n this.qts = this.oldQts = storedState[1]\n this.date = this.oldDate = storedState[2]\n this.seq = this.oldSeq = storedState[3]\n\n this.log.debug(\n 'loaded stored state: pts=%d, qts=%d, date=%d, seq=%d',\n storedState[0],\n storedState[1],\n storedState[2],\n storedState[3],\n )\n }\n // if no state, don't bother initializing properties\n // since that means that there is no authorization,\n // and thus fetchUpdatesState will be called\n }\n\n async _saveUpdatesStorage(save = false): Promise<void> {\n const { client } = this\n\n // todo: move this to updates state service\n // before any authorization pts will be undefined\n if (this.pts !== undefined) {\n // if old* value is not available, assume it has changed.\n if (this.oldPts === undefined || this.oldPts !== this.pts) {\n await client.storage.updates.setPts(this.pts)\n }\n if (this.oldQts === undefined || this.oldQts !== this.qts) {\n await client.storage.updates.setQts(this.qts!)\n }\n if (this.oldDate === undefined || this.oldDate !== this.date) {\n await client.storage.updates.setDate(this.date!)\n }\n if (this.oldSeq === undefined || this.oldSeq !== this.seq) {\n await client.storage.updates.setSeq(this.seq!)\n }\n\n // update old* values\n this.oldPts = this.pts\n this.oldQts = this.qts\n this.oldDate = this.date\n this.oldSeq = this.seq\n\n await client.storage.updates.setManyChannelPts(this.cptsMod)\n this.cptsMod.clear()\n\n if (save) {\n await client.mt.storage.save()\n }\n }\n }\n\n _addToNoDispatchIndex(updates?: tl.TypeUpdates): void {\n if (!updates) return\n\n const { noDispatchMsg, noDispatchPts, noDispatchQts } = this\n\n const addUpdate = (upd: tl.TypeUpdate) => {\n const channelId = extractChannelIdFromUpdate(upd) ?? 0\n const pts = 'pts' in upd ? upd.pts : undefined\n\n if (pts) {\n const set = noDispatchPts.get(channelId)\n if (!set) noDispatchPts.set(channelId, new Set([pts]))\n else set.add(pts)\n }\n\n const qts = 'qts' in upd ? upd.qts : undefined\n\n if (qts) {\n noDispatchQts.add(qts)\n }\n\n switch (upd._) {\n case 'updateNewMessage':\n case 'updateNewChannelMessage': {\n const channelId = upd.message.peerId?._ === 'peerChannel' ? upd.message.peerId.channelId : 0\n\n const set = noDispatchMsg.get(channelId)\n if (!set) noDispatchMsg.set(channelId, new Set([upd.message.id]))\n else set.add(upd.message.id)\n\n break\n }\n }\n }\n\n switch (updates._) {\n case 'updates':\n case 'updatesCombined':\n updates.updates.forEach(addUpdate)\n break\n case 'updateShortMessage':\n case 'updateShortChatMessage':\n case 'updateShortSentMessage': {\n // these updates are only used for non-channel messages, so we use 0\n let set = noDispatchMsg.get(0)\n if (!set) noDispatchMsg.set(0, new Set([updates.id]))\n else set.add(updates.id)\n\n set = noDispatchPts.get(0)\n if (!set) noDispatchPts.set(0, new Set([updates.pts]))\n else set.add(updates.pts)\n break\n }\n case 'updateShort':\n addUpdate(updates.update)\n break\n case 'updatesTooLong':\n break\n default:\n assertNever(updates)\n }\n }\n\n async _fetchMissingPeers(upd: tl.TypeUpdate, peers: PeersIndex, allowMissing = false): Promise<Set<number>> {\n const { client } = this\n\n const missing = new Set<number>()\n\n async function fetchPeer(peer?: tl.TypePeer | number) {\n if (!peer) return true\n\n const bare = typeof peer === 'number' ? parseMarkedPeerId(peer)[1] : getBarePeerId(peer)\n\n const marked = typeof peer === 'number' ? peer : getMarkedPeerId(peer)\n const index = marked > 0 ? peers.users : peers.chats\n\n if (index.has(bare)) return true\n if (missing.has(marked)) return false\n\n const cached = await client.storage.peers.getCompleteById(marked)\n\n if (!cached) {\n missing.add(marked)\n\n return allowMissing\n }\n\n // whatever, ts is not smart enough to understand\n (index as Map<number, tl.TypeUser | tl.TypeChat>).set(bare, cached)\n\n return true\n }\n\n switch (upd._) {\n case 'updateNewMessage':\n case 'updateNewChannelMessage':\n case 'updateEditMessage':\n case 'updateEditChannelMessage': {\n const msg = upd.message\n if (msg._ === 'messageEmpty') return missing\n\n // ref: https://github.com/tdlib/td/blob/master/td/telegram/UpdatesManager.cpp\n // (search by UpdatesManager::is_acceptable_update)\n if (!(await fetchPeer(msg.peerId))) return missing\n if (!(await fetchPeer(msg.fromId))) return missing\n\n if (msg.replyTo) {\n if (msg.replyTo._ === 'messageReplyHeader' && !(await fetchPeer(msg.replyTo.replyToPeerId))) {\n return missing\n }\n if (msg.replyTo._ === 'messageReplyStoryHeader' && !(await fetchPeer(msg.replyTo.peer))) {\n return missing\n }\n }\n\n if (msg._ !== 'messageService') {\n if (\n msg.fwdFrom &&\n (!(await fetchPeer(msg.fwdFrom.fromId)) || !(await fetchPeer(msg.fwdFrom.savedFromPeer)))\n ) {\n return missing\n }\n if (!(await fetchPeer(msg.viaBotId))) return missing\n\n if (msg.entities) {\n for (const ent of msg.entities) {\n if (ent._ === 'messageEntityMentionName') {\n if (!(await fetchPeer(ent.userId))) return missing\n }\n }\n }\n\n if (msg.media) {\n switch (msg.media._) {\n case 'messageMediaContact':\n if (msg.media.userId && !(await fetchPeer(msg.media.userId))) {\n return missing\n }\n }\n }\n } else {\n switch (msg.action._) {\n case 'messageActionChatCreate':\n case 'messageActionChatAddUser':\n case 'messageActionInviteToGroupCall':\n for (const user of msg.action.users) {\n if (!(await fetchPeer(user))) return missing\n }\n break\n case 'messageActionChatJoinedByLink':\n if (!(await fetchPeer(msg.action.inviterId))) {\n return missing\n }\n break\n case 'messageActionChatDeleteUser':\n if (!(await fetchPeer(msg.action.userId))) return missing\n break\n case 'messageActionChatMigrateTo':\n if (!(await fetchPeer(toggleChannelIdMark(msg.action.channelId)))) {\n return missing\n }\n break\n case 'messageActionChannelMigrateFrom':\n if (!(await fetchPeer(-msg.action.chatId))) return missing\n break\n case 'messageActionGeoProximityReached':\n if (!(await fetchPeer(msg.action.fromId))) return missing\n if (!(await fetchPeer(msg.action.toId))) return missing\n break\n }\n }\n break\n }\n case 'updateDraftMessage':\n if ('entities' in upd.draft && upd.draft.entities) {\n for (const ent of upd.draft.entities) {\n if (ent._ === 'messageEntityMentionName') {\n if (!(await fetchPeer(ent.userId))) return missing\n }\n }\n }\n }\n\n return missing\n }\n\n async _storeMessageReferences(msg: tl.TypeMessage): Promise<void> {\n if (msg._ === 'messageEmpty') return\n\n const { client } = this\n\n const peerId = msg.peerId\n if (peerId._ !== 'peerChannel') return\n\n const channelId = toggleChannelIdMark(peerId.channelId)\n\n const promises: MaybePromise<void>[] = []\n\n function store(peer?: tl.TypePeer | number | number[]): void {\n if (!peer) return\n\n if (Array.isArray(peer)) {\n peer.forEach(store)\n\n return\n }\n\n const marked = typeof peer === 'number' ? peer : getMarkedPeerId(peer)\n\n promises.push(client.storage.refMsgs.store(marked, channelId, msg.id))\n }\n\n // reference: https://github.com/tdlib/td/blob/master/td/telegram/MessagesManager.cpp\n // (search by get_message_user_ids, get_message_channel_ids)\n store(msg.fromId)\n\n if (msg._ === 'message') {\n store(msg.viaBotId)\n store(msg.fwdFrom?.fromId)\n\n if (msg.media) {\n switch (msg.media._) {\n case 'messageMediaWebPage':\n if (msg.media.webpage._ === 'webPage' && msg.media.webpage.attributes) {\n for (const attr of msg.media.webpage.attributes) {\n if (attr._ === 'webPageAttributeStory') {\n store(attr.peer)\n }\n }\n }\n break\n case 'messageMediaContact':\n store(msg.media.userId)\n break\n case 'messageMediaStory':\n store(msg.media.peer)\n break\n case 'messageMediaGiveaway':\n store(msg.media.channels.map(toggleChannelIdMark))\n break\n }\n }\n } else {\n switch (msg.action._) {\n case 'messageActionChatCreate':\n case 'messageActionChatAddUser':\n case 'messageActionInviteToGroupCall':\n store(msg.action.users)\n break\n case 'messageActionChatDeleteUser':\n store(msg.action.userId)\n break\n }\n }\n\n if (msg.replyTo) {\n switch (msg.replyTo._) {\n case 'messageReplyHeader':\n store(msg.replyTo.replyToPeerId)\n store(msg.replyTo.replyFrom?.fromId)\n break\n case 'messageReplyStoryHeader':\n store(msg.replyTo.peer)\n break\n }\n // in fact, we can also use peers contained in the replied-to message,\n // but we don't fetch it automatically, so we can't know which peers are there\n }\n\n await Promise.all(promises)\n }\n\n async _fetchChannelDifference(channelId: number, fallbackPts?: number): Promise<boolean> {\n const { channelDiffTimeouts, cpts, cptsMod, channelsOpened, client, log, pendingUnorderedUpdates } = this\n\n // clear timeout if any\n if (channelDiffTimeouts.has(channelId)) {\n clearTimeout(channelDiffTimeouts.get(channelId))\n channelDiffTimeouts.delete(channelId)\n }\n\n let _pts: number | null | undefined = cpts.get(channelId)\n\n if (!_pts && this.catchUpChannels) {\n _pts = await client.storage.updates.getChannelPts(channelId)\n }\n if (!_pts) _pts = fallbackPts\n\n if (!_pts) {\n log.debug('fetchChannelDifference failed for channel %d: base pts not available', channelId)\n\n return false\n }\n\n const channelPeer = await client.storage.peers.getById(toggleChannelIdMark(channelId))\n\n if (!channelPeer) {\n log.debug('fetchChannelDifference failed for channel %d: input peer not found', channelId)\n\n return false\n }\n\n const channel = toInputChannel(channelPeer)\n\n // to make TS happy\n let pts = _pts\n let limit = this.auth?.isBot ? 100000 : 100\n\n if (pts <= 0) {\n pts = 1\n limit = 1\n }\n\n let lastTimeout = 0\n\n for (;;) {\n const diff = await client.call({\n _: 'updates.getChannelDifference',\n force: true, // Set to true to skip some possibly unneeded updates and reduce server-side load\n channel,\n pts,\n limit,\n filter: { _: 'channelMessagesFilterEmpty' },\n })\n\n if (diff.timeout) lastTimeout = diff.timeout\n\n if (diff._ === 'updates.channelDifferenceEmpty') {\n log.debug('getChannelDifference (cid = %d) returned channelDifferenceEmpty', channelId)\n break\n }\n\n const peers = PeersIndex.from(diff)\n\n if (diff._ === 'updates.channelDifferenceTooLong') {\n if (diff.dialog._ === 'dialog') {\n pts = diff.dialog.pts!\n }\n\n log.warn(\n 'getChannelDifference (cid = %d) returned channelDifferenceTooLong. new pts: %d, recent msgs: %d',\n channelId,\n pts,\n diff.messages.length,\n )\n\n diff.messages.forEach((message) => {\n log.debug(\n 'processing message %d (%s) from TooLong diff for channel %d',\n message.id,\n message._,\n channelId,\n )\n\n if (message._ === 'messageEmpty') return\n\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n break\n }\n\n log.debug(\n 'getChannelDifference (cid = %d) returned %d messages, %d updates. new pts: %d, final: %b',\n channelId,\n diff.newMessages.length,\n diff.otherUpdates.length,\n diff.pts,\n diff.final,\n )\n\n diff.newMessages.forEach((message) => {\n log.debug('processing message %d (%s) from diff for channel %d', message.id, message._, channelId)\n\n if (message._ === 'messageEmpty') return\n\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n\n diff.otherUpdates.forEach((upd) => {\n const parsed = toPendingUpdate(upd, peers, true)\n\n log.debug(\n 'processing %s from diff for channel %d, pts_before: %d, pts: %d',\n upd._,\n channelId,\n parsed.ptsBefore,\n parsed.pts,\n )\n\n if (isMessageEmpty(upd)) return\n\n pendingUnorderedUpdates.pushBack(parsed)\n })\n\n pts = diff.pts\n\n if (diff.final) break\n }\n\n cpts.set(channelId, pts)\n cptsMod.set(channelId, pts)\n\n // schedule next fetch\n if (lastTimeout !== 0 && channelsOpened.has(channelId)) {\n log.debug('scheduling next fetch for channel %d in %d seconds', channelId, lastTimeout)\n channelDiffTimeouts.set(\n channelId,\n setTimeout(() => this._fetchChannelDifferenceViaUpdate(channelId), lastTimeout * 1000),\n )\n }\n\n return true\n }\n\n _fetchChannelDifferenceLater(\n requestedDiff: Map<number, Promise<void>>,\n channelId: number,\n fallbackPts?: number,\n ): void {\n if (!requestedDiff.has(channelId)) {\n requestedDiff.set(\n channelId,\n this._fetchChannelDifference(channelId, fallbackPts)\n .catch((err) => {\n this.log.warn('error fetching difference for %d: %s', channelId, err)\n })\n .then((ok) => {\n requestedDiff.delete(channelId)\n\n if (!ok) {\n this.log.debug('channel difference for %d failed, falling back to common diff', channelId)\n this._fetchDifferenceLater(requestedDiff)\n }\n }),\n )\n }\n }\n\n _fetchChannelDifferenceViaUpdate(channelId: number, pts?: number): void {\n this.handleUpdate(\n createDummyUpdatesContainer([\n {\n _: 'updateChannelTooLong',\n channelId,\n pts,\n },\n ]),\n )\n }\n\n async _fetchDifference(requestedDiff: Map<number, Promise<void>>): Promise<void> {\n const { client, log, pendingPtsUpdates, pendingUnorderedUpdates } = this\n\n for (;;) {\n const diff = await client.call({\n _: 'updates.getDifference',\n pts: this.pts!,\n date: this.date!,\n qts: this.qts!,\n })\n\n switch (diff._) {\n case 'updates.differenceEmpty':\n log.debug('updates.getDifference returned updates.differenceEmpty')\n\n return\n case 'updates.differenceTooLong':\n this.pts = diff.pts\n log.debug('updates.getDifference returned updates.differenceTooLong')\n\n return\n }\n\n const fetchedState = diff._ === 'updates.difference' ? diff.state : diff.intermediateState\n\n log.debug(\n 'updates.getDifference returned %d messages, %d updates. new pts: %d, qts: %d, seq: %d, final: %b',\n diff.newMessages.length,\n diff.otherUpdates.length,\n fetchedState.pts,\n fetchedState.qts,\n fetchedState.seq,\n diff._ === 'updates.difference',\n )\n\n const peers = PeersIndex.from(diff)\n\n diff.newMessages.forEach((message) => {\n log.debug('processing message %d in %j (%s) from common diff', message.id, message.peerId, message._)\n\n if (message._ === 'messageEmpty') return\n\n // pts does not need to be checked for them\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n\n diff.otherUpdates.forEach((upd) => {\n if (upd._ === 'updateChannelTooLong') {\n log.debug(\n 'received updateChannelTooLong for channel %d in common diff (pts = %d), fetching diff',\n upd.channelId,\n upd.pts,\n )\n\n this._fetchChannelDifferenceLater(requestedDiff, upd.channelId, upd.pts)\n\n return\n }\n\n if (isMessageEmpty(upd)) return\n\n const parsed = toPendingUpdate(upd, peers, true)\n\n if (parsed.channelId && parsed.ptsBefore) {\n // we need to check pts for these updates, put into pts queue\n pendingPtsUpdates.add(parsed)\n } else {\n // the updates are in order already, we can treat them as unordered\n pendingUnorderedUpdates.pushBack(parsed)\n }\n\n log.debug(\n 'received %s from common diff, cid: %d, pts_before: %d, pts: %d, qts_before: %d',\n upd._,\n parsed.channelId,\n parsed.ptsBefore,\n parsed.pts,\n parsed.qtsBefore,\n )\n })\n\n this.pts = fetchedState.pts\n this.qts = fetchedState.qts\n this.seq = fetchedState.seq\n this.date = fetchedState.date\n\n if (diff._ === 'updates.difference') {\n return\n }\n }\n }\n\n _fetchDifferenceLater(requestedDiff: Map<number, Promise<void>>): void {\n if (!requestedDiff.has(0)) {\n requestedDiff.set(\n 0,\n this._fetchDifference(requestedDiff)\n .catch((err) => {\n if (tl.RpcError.is(err, 'AUTH_KEY_UNREGISTERED')) {\n // for some reason, when logging out telegram may send updatesTooLong\n // in any case, we need to stop updates loop\n this.stopLoop()\n\n return\n }\n\n this.log.warn('error fetching common difference: %s', err)\n\n if (tl.RpcError.is(err, 'PERSISTENT_TIMESTAMP_INVALID')) {\n // this function never throws\n return this._fetchUpdatesState()\n }\n })\n .then(() => {\n requestedDiff.delete(0)\n }),\n )\n }\n }\n\n async _onUpdate(\n pending: PendingUpdate,\n requestedDiff: Map<number, Promise<void>>,\n postponed = false,\n unordered = false,\n ): Promise<void> {\n const { client, log } = this\n const upd = pending.update\n\n let missing: Set<number> | undefined = undefined\n\n // it is important to do this before updating pts\n if (pending.peers.hasMin || pending.peers.empty) {\n // even if we have min peers in difference, we can't do anything about them.\n // we still want to collect them, so we can fetch them in the background.\n // we won't wait for them, since that would block the updates loop\n\n log.debug('loading missing peers for %s (pts = %d, cid = %d)', upd._, pending.pts, pending.channelId)\n missing = await this._fetchMissingPeers(upd, pending.peers, pending.fromDifference)\n\n if (!pending.fromDifference && missing.size) {\n log.debug(\n 'fetching difference because some peers were min (%J) and not cached for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n\n if (pending.channelId && !(upd._ === 'updateNewChannelMessage' && upd.message._ === 'messageService')) {\n // don't replace service messages, because they can be about bot's kicking\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId, pending.ptsBefore)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n\n return\n }\n\n if (missing.size) {\n log.debug(\n 'peers still missing after fetching difference: %J for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n }\n }\n\n // apply new pts/qts, if applicable\n if (!unordered) {\n // because unordered may contain pts/qts values when received from diff\n\n if (pending.pts) {\n const localPts = pending.channelId ? this.cpts.get(pending.channelId) : this.pts\n\n if (localPts && pending.ptsBefore !== localPts) {\n log.warn(\n 'pts_before does not match local_pts for %s (cid = %d, pts_before = %d, pts = %d, local_pts = %d)',\n upd._,\n pending.channelId,\n pending.ptsBefore,\n pending.pts,\n localPts,\n )\n }\n\n log.debug(\n 'applying new pts (cid = %d) because received %s: %d -> %d (before: %d, count: %d) (postponed = %s)',\n pending.channelId,\n upd._,\n localPts,\n pending.pts,\n pending.ptsBefore,\n pending.pts - pending.ptsBefore!,\n postponed,\n )\n\n if (pending.channelId) {\n this.cpts.set(pending.channelId, pending.pts)\n this.cptsMod.set(pending.channelId, pending.pts)\n } else {\n this.pts = pending.pts\n }\n }\n\n if (pending.qtsBefore) {\n log.debug(\n 'applying new qts because received %s: %d -> %d (postponed = %s)',\n upd._,\n this.qts,\n pending.qtsBefore + 1,\n postponed,\n )\n\n this.qts = pending.qts\n }\n }\n\n if (isMessageEmpty(upd)) return\n\n // this.rpsProcessing?.hit()\n\n // updates that are also used internally\n switch (upd._) {\n case 'mtcute.dummyUpdate':\n // we just needed to apply new pts values\n return\n case 'updateDcOptions': {\n const config = client.mt.network.config.getNow()\n\n if (config) {\n client.mt.network.config.setData({\n ...config,\n dcOptions: upd.dcOptions,\n })\n } else {\n client.mt.network.config.update(true).catch((err) => client.emitError(err))\n }\n break\n }\n case 'updateConfig':\n client.mt.network.config.update(true).catch((err) => client.emitError(err))\n break\n case 'updateUserName':\n // todo\n // if (upd.userId === state.auth?.userId) {\n // state.auth.selfUsername = upd.usernames.find((it) => it.active)?.username ?? null\n // }\n break\n case 'updateDeleteChannelMessages':\n if (!this.auth?.isBot) {\n await client.storage.refMsgs.delete(toggleChannelIdMark(upd.channelId), upd.messages)\n }\n break\n case 'updateNewMessage':\n case 'updateEditMessage':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n if (!this.auth?.isBot) {\n await this._storeMessageReferences(upd.message)\n }\n break\n }\n\n if (missing?.size) {\n if (this.auth?.isBot) {\n this.log.warn(\n 'missing peers (%J) after getDifference for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n } else {\n // force save storage so the min peers are stored\n await client.mt.storage.save()\n\n for (const id of missing) {\n Promise.resolve(client.storage.peers.getById(id))\n .then((peer): unknown => {\n if (!peer) {\n this.log.warn('cannot fetch full peer %d - getPeerById returned null', id)\n\n return\n }\n\n // the peer will be automatically cached by the `.call()`, we don't have to do anything\n // todo\n // if (isInputPeerChannel(peer)) {\n // return _getChannelsBatched(client, toInputChannel(peer))\n // } else if (isInputPeerUser(peer)) {\n // return _getUsersBatched(client, toInputUser(peer))\n // }\n\n log.warn('cannot fetch full peer %d - unknown peer type %s', id, peer._)\n })\n .catch((err) => {\n log.warn('error fetching full peer %d: %s', id, err)\n })\n }\n }\n }\n\n // dispatch the update\n if (this.noDispatchEnabled) {\n const channelId = pending.channelId ?? 0\n const msgId =\n upd._ === 'updateNewMessage' || upd._ === 'updateNewChannelMessage' ? upd.message.id : undefined\n\n // we first need to remove it from each index, and then check if it was there\n const foundByMsgId = msgId && this.noDispatchMsg.get(channelId)?.delete(msgId)\n const foundByPts = this.noDispatchPts.get(channelId)?.delete(pending.pts!)\n const foundByQts = this.noDispatchQts.delete(pending.qts!)\n\n if (foundByMsgId || foundByPts || foundByQts) {\n log.debug('not dispatching %s because it is in no_dispatch index', upd._)\n\n return\n }\n }\n\n log.debug('dispatching %s (postponed = %s)', upd._, postponed)\n this._handler(upd, pending.peers)\n }\n\n async _loop(): Promise<void> {\n const {\n log,\n client,\n cpts,\n cptsMod,\n pendingUpdateContainers,\n pendingPtsUpdates,\n pendingPtsUpdatesPostponed,\n pendingQtsUpdates,\n pendingQtsUpdatesPostponed,\n pendingUnorderedUpdates,\n updatesLoopCv,\n postponedTimer,\n } = this\n\n log.debug('updates loop started, state available? %b', this.pts)\n\n try {\n if (!this.pts) {\n await this._fetchUpdatesState()\n }\n\n while (this.updatesLoopActive) {\n if (\n !(\n pendingUpdateContainers.length ||\n pendingPtsUpdates.length ||\n pendingQtsUpdates.length ||\n pendingUnorderedUpdates.length ||\n this.hasTimedoutPostponed\n )\n ) {\n await updatesLoopCv.wait()\n }\n if (!this.updatesLoopActive) break\n\n log.debug(\n 'updates loop tick. pending containers: %d, pts: %d, pts_postponed: %d, qts: %d, qts_postponed: %d, unordered: %d',\n pendingUpdateContainers.length,\n pendingPtsUpdates.length,\n pendingPtsUpdatesPostponed.length,\n pendingQtsUpdates.length,\n pendingQtsUpdatesPostponed.length,\n pendingUnorderedUpdates.length,\n )\n\n const requestedDiff = new Map<number, Promise<void>>()\n\n // first process pending containers\n while (pendingUpdateContainers.length) {\n const { upd, seqStart, seqEnd } = pendingUpdateContainers.popFront()!\n\n switch (upd._) {\n case 'updatesTooLong':\n log.debug('received updatesTooLong, fetching difference')\n this._fetchDifferenceLater(requestedDiff)\n break\n case 'updatesCombined':\n case 'updates': {\n if (seqStart !== 0) {\n // https://t.me/tdlibchat/5843\n const nextLocalSeq = this.seq! + 1\n log.debug(\n 'received seq-ordered %s (seq_start = %d, seq_end = %d, size = %d)',\n upd._,\n seqStart,\n seqEnd,\n upd.updates.length,\n )\n\n if (nextLocalSeq > seqStart) {\n log.debug(\n 'ignoring updates group because already applied (by seq: exp %d, got %d)',\n nextLocalSeq,\n seqStart,\n )\n // \"the updates were already applied, and must be ignored\"\n continue\n }\n\n if (nextLocalSeq < seqStart) {\n log.debug(\n 'fetching difference because gap detected (by seq: exp %d, got %d)',\n nextLocalSeq,\n seqStart,\n )\n // \"there's an updates gap that must be filled\"\n this._fetchDifferenceLater(requestedDiff)\n }\n } else {\n log.debug('received %s (size = %d)', upd._, upd.updates.length)\n }\n\n await client.storage.peers.updatePeersFrom(upd)\n\n const peers = PeersIndex.from(upd)\n\n for (const update of upd.updates) {\n switch (update._) {\n case 'updateChannelTooLong':\n log.debug(\n 'received updateChannelTooLong for channel %d (pts = %d) in container, fetching diff',\n update.channelId,\n update.pts,\n )\n this._fetchChannelDifferenceLater(requestedDiff, update.channelId, update.pts)\n continue\n case 'updatePtsChanged':\n // see https://github.com/tdlib/td/blob/07c1d53a6d3cb1fad58d2822e55eef6d57363581/td/telegram/UpdatesManager.cpp#L4051\n if (client.mt.network.getPoolSize('main') > 1) {\n // highload bot\n log.debug(\n 'updatePtsChanged received, resetting pts to 1 and fetching difference',\n )\n this.pts = 1\n this._fetchDifferenceLater(requestedDiff)\n } else {\n log.debug('updatePtsChanged received, fetching updates state')\n await this._fetchUpdatesState()\n }\n continue\n }\n\n const parsed = toPendingUpdate(update, peers)\n\n if (parsed.ptsBefore !== undefined) {\n pendingPtsUpdates.add(parsed)\n } else if (parsed.qtsBefore !== undefined) {\n pendingQtsUpdates.add(parsed)\n } else {\n pendingUnorderedUpdates.pushBack(parsed)\n }\n }\n\n if (seqEnd !== 0 && seqEnd > this.seq!) {\n this.seq = seqEnd\n this.date = upd.date\n }\n\n break\n }\n case 'updateShort': {\n log.debug('received short %s', upd._)\n\n const parsed = toPendingUpdate(upd.update, new PeersIndex())\n\n if (parsed.ptsBefore !== undefined) {\n pendingPtsUpdates.add(parsed)\n } else if (parsed.qtsBefore !== undefined) {\n pendingQtsUpdates.add(parsed)\n } else {\n pendingUnorderedUpdates.pushBack(parsed)\n }\n\n break\n }\n case 'updateShortMessage': {\n log.debug('received updateShortMessage')\n\n const message: tl.RawMessage = {\n _: 'message',\n out: upd.out,\n mentioned: upd.mentioned,\n mediaUnread: upd.mediaUnread,\n silent: upd.silent,\n id: upd.id,\n fromId: {\n _: 'peerUser',\n userId: upd.out ? this.auth!.userId : upd.userId,\n },\n peerId: {\n _: 'peerUser',\n userId: upd.userId,\n },\n fwdFrom: upd.fwdFrom,\n viaBotId: upd.viaBotId,\n replyTo: upd.replyTo,\n date: upd.date,\n message: upd.message,\n entities: upd.entities,\n ttlPeriod: upd.ttlPeriod,\n }\n\n const update: tl.RawUpdateNewMessage = {\n _: 'updateNewMessage',\n message,\n pts: upd.pts,\n ptsCount: upd.ptsCount,\n }\n\n pendingPtsUpdates.add({\n update,\n ptsBefore: upd.pts - upd.ptsCount,\n pts: upd.pts,\n peers: new PeersIndex(),\n fromDifference: false,\n })\n\n break\n }\n case 'updateShortChatMessage': {\n log.debug('received updateShortChatMessage')\n\n const message: tl.RawMessage = {\n _: 'message',\n out: upd.out,\n mentioned: upd.mentioned,\n mediaUnread: upd.mediaUnread,\n silent: upd.silent,\n id: upd.id,\n fromId: {\n _: 'peerUser',\n userId: upd.fromId,\n },\n peerId: {\n _: 'peerChat',\n chatId: upd.chatId,\n },\n fwdFrom: upd.fwdFrom,\n viaBotId: upd.viaBotId,\n replyTo: upd.replyTo,\n date: upd.date,\n message: upd.message,\n entities: upd.entities,\n ttlPeriod: upd.ttlPeriod,\n }\n\n const update: tl.RawUpdateNewMessage = {\n _: 'updateNewMessage',\n message,\n pts: upd.pts,\n ptsCount: upd.ptsCount,\n }\n\n pendingPtsUpdates.add({\n update,\n ptsBefore: upd.pts - upd.ptsCount,\n pts: upd.pts,\n peers: new PeersIndex(),\n fromDifference: false,\n })\n\n break\n }\n case 'updateShortSentMessage': {\n // should not happen\n log.warn('received updateShortSentMessage')\n break\n }\n default:\n assertNever(upd)\n }\n }\n\n // process pts-ordered updates\n while (pendingPtsUpdates.length) {\n const pending = pendingPtsUpdates.popFront()!\n const upd = pending.update\n\n // check pts\n\n let localPts: number | null = null\n\n if (!pending.channelId) localPts = this.pts!\n else if (cpts.has(pending.channelId)) {\n localPts = cpts.get(pending.channelId)!\n } else if (this.catchUpChannels) {\n // only load stored channel pts in case\n // the user has enabled catching up.\n // not loading stored pts effectively disables\n // catching up, but doesn't interfere with further\n // update gaps (i.e. first update received is considered\n // to be the base state)\n\n const saved = await client.storage.updates.getChannelPts(pending.channelId)\n\n if (saved) {\n cpts.set(pending.channelId, saved)\n localPts = saved\n }\n }\n\n if (localPts) {\n const diff = localPts - pending.ptsBefore!\n // PTS can only go up or drop cardinally\n const isPtsDrop = diff > 1000009\n\n if (diff > 0 && !isPtsDrop) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring %s (cid = %d) because already applied (by pts: exp %d, got %d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n continue\n }\n if (diff < 0) {\n // \"there's an update gap that must be filled\"\n // if the gap is less than 3, put the update into postponed queue\n // otherwise, call getDifference\n if (diff > -3) {\n log.debug(\n 'postponing %s for 0.5s (cid = %d) because small gap detected (by pts: exp %d, got %d, diff=%d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n diff,\n )\n pending.timeout = Date.now() + 500\n pendingPtsUpdatesPostponed.add(pending)\n postponedTimer.emitBefore(pending.timeout)\n } else if (diff > -1000000) {\n log.debug(\n 'fetching difference after %s (cid = %d) because pts gap detected (by pts: exp %d, got %d, diff=%d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n diff,\n )\n\n if (pending.channelId) {\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n } else {\n log.debug(\n 'skipping all updates because pts gap is too big (by pts: exp %d, got %d, diff=%d)',\n localPts,\n pending.ptsBefore,\n diff,\n )\n\n if (pending.channelId) {\n cpts.set(pending.channelId, 0)\n cptsMod.set(pending.channelId, 0)\n } else {\n await this._fetchUpdatesState()\n }\n }\n continue\n }\n\n if (isPtsDrop) {\n log.debug('pts drop detected (%d -> %d)', localPts, pending.ptsBefore)\n }\n }\n\n await this._onUpdate(pending, requestedDiff)\n }\n\n // process postponed pts-ordered updates\n for (let item = pendingPtsUpdatesPostponed._first; item; item = item.n) {\n // awesome fucking iteration because i'm so fucking tired and wanna kms\n const pending = item.v\n\n const upd = pending.update\n\n let localPts\n\n if (!pending.channelId) localPts = this.pts!\n else if (cpts.has(pending.channelId)) {\n localPts = cpts.get(pending.channelId)\n }\n\n // channel pts from storage will be available because we loaded it earlier\n if (!localPts) {\n log.warn(\n 'local pts not available for postponed %s (cid = %d), skipping',\n upd._,\n pending.channelId,\n )\n continue\n }\n\n // check the pts to see if the gap was filled\n if (localPts > pending.ptsBefore!) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring postponed %s (cid = %d) because already applied (by pts: exp %d, got %d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n pendingPtsUpdatesPostponed._remove(item)\n continue\n }\n if (localPts < pending.ptsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the timeout has not expired yet, keep the update in the queue\n // otherwise, fetch diff\n const now = Date.now()\n\n if (now < pending.timeout!) {\n log.debug(\n 'postponed %s (cid = %d) is still waiting (%dms left) (current pts %d, need %d)',\n upd._,\n pending.channelId,\n pending.timeout! - now,\n localPts,\n pending.ptsBefore,\n )\n } else {\n log.debug(\n \"gap for postponed %s (cid = %d) wasn't filled, fetching diff (current pts %d, need %d)\",\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n pendingPtsUpdatesPostponed._remove(item)\n\n if (pending.channelId) {\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n }\n continue\n }\n\n await this._onUpdate(pending, requestedDiff, true)\n pendingPtsUpdatesPostponed._remove(item)\n }\n\n // process qts-ordered updates\n while (pendingQtsUpdates.length) {\n const pending = pendingQtsUpdates.popFront()!\n const upd = pending.update\n\n // check qts\n const diff = this.qts! - pending.qtsBefore!\n const isQtsDrop = diff > 1000009\n\n if (diff > 0 && !isQtsDrop) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring %s because already applied (by qts: exp %d, got %d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n continue\n }\n if (this.qts! < pending.qtsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the gap is less than 3, put the update into postponed queue\n // otherwise, call getDifference\n if (diff > -3) {\n log.debug(\n 'postponing %s for 0.5s because small gap detected (by qts: exp %d, got %d, diff=%d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n diff,\n )\n pending.timeout = Date.now() + 500\n pendingQtsUpdatesPostponed.add(pending)\n postponedTimer.emitBefore(pending.timeout)\n } else {\n log.debug(\n 'fetching difference after %s because qts gap detected (by qts: exp %d, got %d, diff=%d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n diff,\n )\n this._fetchDifferenceLater(requestedDiff)\n }\n continue\n }\n\n if (isQtsDrop) {\n log.debug('qts drop detected (%d -> %d)', this.qts, pending.qtsBefore)\n }\n\n await this._onUpdate(pending, requestedDiff)\n }\n\n // process postponed qts-ordered updates\n for (let item = pendingQtsUpdatesPostponed._first; item; item = item.n) {\n // awesome fucking iteration because i'm so fucking tired and wanna kms\n const pending = item.v\n const upd = pending.update\n\n // check the pts to see if the gap was filled\n if (this.qts! > pending.qtsBefore!) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring postponed %s because already applied (by qts: exp %d, got %d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n continue\n }\n if (this.qts! < pending.qtsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the timeout has not expired yet, keep the update in the queue\n // otherwise, fetch diff\n const now = Date.now()\n\n if (now < pending.timeout!) {\n log.debug(\n 'postponed %s is still waiting (%dms left) (current qts %d, need %d)',\n upd._,\n pending.timeout! - now,\n this.qts!,\n pending.qtsBefore,\n )\n } else {\n log.debug(\n \"gap for postponed %s wasn't filled, fetching diff (current qts %d, need %d)\",\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n pendingQtsUpdatesPostponed._remove(item)\n this._fetchDifferenceLater(requestedDiff)\n }\n continue\n }\n\n // gap was filled, and the update can be applied\n await this._onUpdate(pending, requestedDiff, true)\n pendingQtsUpdatesPostponed._remove(item)\n }\n\n this.hasTimedoutPostponed = false\n\n // wait for all pending diffs to load\n while (requestedDiff.size) {\n log.debug(\n 'waiting for %d pending diffs before processing unordered: %J',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n\n await Promise.all([...requestedDiff.values()])\n\n // diff results may as well contain new diffs to be requested\n log.debug(\n 'pending diffs awaited, new diffs requested: %d (%J)',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n }\n\n // process unordered updates (or updates received from diff)\n while (pendingUnorderedUpdates.length) {\n const pending = pendingUnorderedUpdates.popFront()!\n\n await this._onUpdate(pending, requestedDiff, false, true)\n }\n\n // onUpdate may also call getDiff in some cases, so we also need to check\n // diff may also contain new updates, which will be processed in the next tick,\n // but we don't want to postpone diff fetching\n while (requestedDiff.size) {\n log.debug(\n 'waiting for %d pending diffs after processing unordered: %J',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n\n await Promise.all([...requestedDiff.values()])\n\n // diff results may as well contain new diffs to be requested\n log.debug(\n 'pending diffs awaited, new diffs requested: %d (%j)',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n }\n\n // save new update state\n await this._saveUpdatesStorage(true)\n }\n\n log.debug('updates loop stopped')\n } catch (e) {\n log.error('updates loop encountered error, restarting: %s', e)\n\n return this._loop()\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/highlevel/updates/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-depth,max-params */\nimport { tl } from '@mtcute/tl'\n\nimport { MtArgumentError } from '../../types/errors.js'\nimport { assertNever, MaybePromise } from '../../types/utils.js'\nimport {\n AsyncLock,\n ConditionVariable,\n Deque,\n EarlyTimer,\n getBarePeerId,\n getMarkedPeerId,\n parseMarkedPeerId,\n SortedLinkedList,\n toggleChannelIdMark,\n toInputChannel,\n} from '../../utils/index.js'\nimport { BaseTelegramClient } from '../base.js'\nimport { CurrentUserInfo } from '../storage/service/current-user.js'\nimport { PeersIndex } from '../types/peers/peers-index.js'\nimport { PendingUpdate, PendingUpdateContainer, RawUpdateHandler, UpdatesManagerParams } from './types.js'\nimport {\n createDummyUpdatesContainer,\n extractChannelIdFromUpdate,\n isMessageEmpty,\n messageToUpdate,\n toPendingUpdate,\n} from './utils.js'\n\n// code in this file is very bad, thanks to Telegram's awesome updates mechanism\n\n// todo: maybe move to another class?\n// /**\n// * Enable RPS meter.\n// *\n// * > **Note**: This may have negative impact on performance\n// *\n// * @param size Sampling size\n// * @param time Window time\n// */\n// export function enableRps(client: ITelegramClient, size?: number, time?: number): void {\n// const state = getState(client)\n// state.rpsIncoming = new RpsMeter(size, time)\n// state.rpsProcessing = new RpsMeter(size, time)\n// }\n\n// /**\n// * Get current average incoming RPS\n// *\n// * Incoming RPS is calculated based on\n// * incoming update containers. Normally,\n// * they should be around the same, except\n// * rare situations when processing rps\n// * may peak.\n// */\n// export function getCurrentRpsIncoming(client: ITelegramClient): number {\n// const state = getState(client)\n\n// if (!state.rpsIncoming) {\n// throw new MtArgumentError('RPS meter is not enabled, use .enableRps() first')\n// }\n\n// return state.rpsIncoming.getRps()\n// }\n\n// /**\n// * Get current average processing RPS\n// *\n// * Processing RPS is calculated based on\n// * dispatched updates. Normally,\n// * they should be around the same, except\n// * rare situations when processing rps\n// * may peak.\n// */\n// export function getCurrentRpsProcessing(client: ITelegramClient): number {\n// const state = getState(client)\n\n// if (!state.rpsProcessing) {\n// throw new MtArgumentError('RPS meter is not enabled, use .enableRps() first')\n// }\n\n// return state.rpsProcessing.getRps()\n// }\n\nconst KEEP_ALIVE_INTERVAL = 15 * 60 * 1000 // 15 minutes\nconst UPDATES_TOO_LONG = { _: 'updatesTooLong' } as const\n\n// todo: fix docs\nexport class UpdatesManager {\n updatesLoopActive = false\n updatesLoopCv = new ConditionVariable()\n\n postponedTimer = new EarlyTimer()\n hasTimedoutPostponed = false\n\n pendingUpdateContainers = new SortedLinkedList<PendingUpdateContainer>((a, b) => a.seqStart - b.seqStart)\n pendingPtsUpdates = new SortedLinkedList<PendingUpdate>((a, b) => a.ptsBefore! - b.ptsBefore!)\n pendingPtsUpdatesPostponed = new SortedLinkedList<PendingUpdate>((a, b) => a.ptsBefore! - b.ptsBefore!)\n pendingQtsUpdates = new SortedLinkedList<PendingUpdate>((a, b) => a.qtsBefore! - b.qtsBefore!)\n pendingQtsUpdatesPostponed = new SortedLinkedList<PendingUpdate>((a, b) => a.qtsBefore! - b.qtsBefore!)\n pendingUnorderedUpdates = new Deque<PendingUpdate>()\n\n noDispatchEnabled = !this.params.disableNoDispatch\n // channel id or 0 => msg id\n noDispatchMsg = new Map<number, Set<number>>()\n // channel id or 0 => pts\n noDispatchPts = new Map<number, Set<number>>()\n noDispatchQts = new Set<number>()\n\n lock = new AsyncLock()\n // rpsIncoming?: RpsMeter\n // rpsProcessing?: RpsMeter\n\n // accessing storage every time might be expensive,\n // so store everything here, and load & save\n // every time session is loaded & saved.\n pts?: number\n qts?: number\n date?: number\n seq?: number\n\n // old values of the updates state (i.e. as in DB)\n // used to avoid redundant storage calls\n oldPts?: number\n oldQts?: number\n oldDate?: number\n oldSeq?: number\n\n // whether to catch up channels from the locally stored pts\n catchingUp = false\n catchUpOnStart = this.params.catchUp ?? false\n\n cpts = new Map<number, number>()\n cptsMod = new Map<number, number>()\n channelDiffTimeouts = new Map<number, NodeJS.Timeout>()\n channelsOpened = new Map<number, number>()\n\n log = this.client.log.create('updates')\n private _handler: RawUpdateHandler = () => {}\n\n private _onCatchingUp: (catchingUp: boolean) => void = () => {}\n\n auth?: CurrentUserInfo | null // todo: do we need a local copy?\n keepAliveInterval?: NodeJS.Timeout\n\n constructor(\n readonly client: BaseTelegramClient,\n readonly params: UpdatesManagerParams = {},\n ) {\n if (client.params.disableUpdates) {\n throw new MtArgumentError('Updates must be enabled to use updates manager')\n }\n\n this._onKeepAlive = this._onKeepAlive.bind(this)\n\n this.postponedTimer.onTimeout(() => {\n this.hasTimedoutPostponed = true\n this.updatesLoopCv.notify()\n })\n }\n\n setHandler(handler: RawUpdateHandler): void {\n this._handler = handler\n }\n\n onCatchingUp(handler: (catchingUp: boolean) => void): void {\n this._onCatchingUp = handler\n }\n\n destroy() {\n this.stopLoop()\n }\n\n notifyLoggedIn(self: CurrentUserInfo): void {\n this.auth = self\n this.startLoop().catch((err) => this.client.emitError(err))\n }\n\n notifyLoggedOut(): void {\n this.stopLoop()\n this.cpts.clear()\n this.cptsMod.clear()\n this.pts = this.qts = this.date = this.seq = undefined\n }\n\n async prepare(): Promise<void> {\n await this._loadUpdatesStorage()\n }\n\n private _onKeepAlive() {\n this.log.debug('no updates for >15 minutes, catching up')\n this.handleUpdate(UPDATES_TOO_LONG)\n }\n\n /**\n * Start updates loop.\n *\n * You must first call {@link enableUpdatesProcessing} to use this method.\n *\n * It is recommended to use this method in callback to {@link start},\n * or otherwise make sure the user is logged in.\n *\n * > **Note**: If you are using {@link UpdatesManagerParams.catchUp} option,\n * > catching up will be done in background, you can't await it.\n * > Instead, listen for the `updating` and `connected` connection state events.\n */\n async startLoop(): Promise<void> {\n if (this.updatesLoopActive) return\n\n // otherwise we will catch up on the first update\n if (!this.catchUpOnStart) {\n await this._fetchUpdatesState()\n }\n\n // start updates loop in background\n this.updatesLoopActive = true\n clearInterval(this.keepAliveInterval)\n this.keepAliveInterval = setInterval(this._onKeepAlive, KEEP_ALIVE_INTERVAL)\n this._loop().catch((err) => this.client.emitError(err))\n\n if (this.catchUpOnStart) {\n this.catchUp()\n }\n }\n\n /**\n * **ADVANCED**\n *\n * Manually stop updates loop.\n * Usually done automatically when stopping the client with {@link close}\n */\n stopLoop(): void {\n if (!this.updatesLoopActive) return\n\n clearInterval(this.keepAliveInterval)\n\n for (const timer of this.channelDiffTimeouts.values()) {\n clearTimeout(timer)\n }\n this.channelDiffTimeouts.clear()\n\n this.updatesLoopActive = false\n this.pendingUpdateContainers.clear()\n this.pendingUnorderedUpdates.clear()\n this.pendingPtsUpdates.clear()\n this.pendingQtsUpdates.clear()\n this.pendingPtsUpdatesPostponed.clear()\n this.pendingQtsUpdatesPostponed.clear()\n this.postponedTimer.reset()\n this.updatesLoopCv.notify()\n }\n\n /**\n * Catch up with the server by loading missed updates.\n *.\n * > **Note**: In case the storage was not properly\n * > closed the last time, \"catching up\" might\n * > result in duplicate updates.\n */\n catchUp(): void {\n if (!this.updatesLoopActive) {\n this.log.warn('catch up requested, but updates loop is not active, ignoring')\n\n return\n }\n\n this.log.debug('catch up requested')\n\n this._onCatchingUp(true)\n this.catchingUp = true\n this.handleUpdate(UPDATES_TOO_LONG)\n }\n\n handleClientUpdate(update: tl.TypeUpdates, noDispatch = true): void {\n if (noDispatch && this.noDispatchEnabled) {\n this._addToNoDispatchIndex(update)\n }\n\n this.handleUpdate(update)\n }\n\n handleUpdate(update: tl.TypeUpdates): void {\n this.log.debug(\n 'received %s, queueing for processing. containers queue size: %d',\n update._,\n this.pendingUpdateContainers.length,\n )\n // this.rpsIncoming?.hit()\n\n switch (update._) {\n case 'updatesTooLong':\n case 'updateShortMessage':\n case 'updateShortChatMessage':\n case 'updateShort':\n case 'updateShortSentMessage':\n this.pendingUpdateContainers.add({\n upd: update,\n seqStart: 0,\n seqEnd: 0,\n })\n break\n case 'updates':\n case 'updatesCombined':\n this.pendingUpdateContainers.add({\n upd: update,\n seqStart: update._ === 'updatesCombined' ? update.seqStart : update.seq,\n seqEnd: update.seq,\n })\n break\n default:\n assertNever(update)\n }\n\n this.updatesLoopCv.notify()\n }\n\n /**\n * **ADVANCED**\n *\n * Notify the updates manager that some channel was \"opened\".\n * Channel difference for \"opened\" channels will be fetched on a regular basis.\n * This is a low-level method, prefer using {@link openChat} instead.\n *\n * Channel must be resolve-able with `resolvePeer` method (i.e. be in cache);\n * base chat PTS must either be passed (e.g. from {@link Dialog}), or cached in storage.\n *\n * @param channelId Bare ID of the channel\n * @param pts PTS of the channel, if known (e.g. from {@link Dialog})\n * @returns `true` if the channel was opened for the first time, `false` if it is already opened\n */\n notifyChannelOpened(channelId: number, pts?: number): boolean {\n // this method is intentionally very dumb to avoid making this file even more unreadable\n\n if (this.channelsOpened.has(channelId)) {\n this.log.debug('channel %d opened again', channelId)\n this.channelsOpened.set(channelId, this.channelsOpened.get(channelId)! + 1)\n\n return false\n }\n\n this.channelsOpened.set(channelId, 1)\n this.log.debug('channel %d opened (pts=%d)', channelId, pts)\n\n // force fetch channel difference\n this._fetchChannelDifferenceViaUpdate(channelId, pts)\n\n return true\n }\n\n /**\n * **ADVANCED**\n *\n * Notify the updates manager that some channel was \"closed\".\n * Basically the opposite of {@link notifyChannelOpened}.\n * This is a low-level method, prefer using {@link closeChat} instead.\n *\n * @param channelId Bare channel ID\n * @returns `true` if the chat was closed for the last time, `false` otherwise\n */\n notifyChannelClosed(channelId: number): boolean {\n const opened = this.channelsOpened.get(channelId)!\n\n if (opened === undefined) {\n return false\n }\n\n if (opened > 1) {\n this.log.debug('channel %d closed, but is opened %d more times', channelId, opened - 1)\n this.channelsOpened.set(channelId, opened - 1)\n\n return false\n }\n\n this.channelsOpened.delete(channelId)\n this.log.debug('channel %d closed', channelId)\n\n return true\n }\n\n ////////////////////////////////////////////// IMPLEMENTATION //////////////////////////////////////////////\n\n async _fetchUpdatesState(): Promise<void> {\n const { client, lock, log } = this\n\n await lock.acquire()\n\n log.debug('fetching initial state')\n\n try {\n let fetchedState = await client.call({ _: 'updates.getState' })\n\n log.debug(\n 'updates.getState returned state: pts=%d, qts=%d, date=%d, seq=%d',\n fetchedState.pts,\n fetchedState.qts,\n fetchedState.date,\n fetchedState.seq,\n )\n\n // for some unknown fucking reason getState may return old qts\n // call getDifference to get actual values :shrug:\n const diff = await client.call({\n _: 'updates.getDifference',\n pts: fetchedState.pts,\n qts: fetchedState.qts,\n date: fetchedState.date,\n })\n\n switch (diff._) {\n case 'updates.differenceEmpty':\n break\n case 'updates.differenceTooLong': // shouldn't happen, but who knows?\n (fetchedState as tl.Mutable<tl.updates.TypeState>).pts = diff.pts\n break\n case 'updates.differenceSlice':\n fetchedState = diff.intermediateState\n break\n case 'updates.difference':\n fetchedState = diff.state\n break\n default:\n assertNever(diff)\n }\n\n this.qts = fetchedState.qts\n this.pts = fetchedState.pts\n this.date = fetchedState.date\n this.seq = fetchedState.seq\n\n log.debug('loaded initial state: pts=%d, qts=%d, date=%d, seq=%d', this.pts, this.qts, this.date, this.seq)\n } catch (e) {\n if (this.client.isConnected) {\n log.error('failed to fetch updates state: %s', e)\n }\n\n lock.release()\n throw e\n }\n\n lock.release()\n }\n\n async _loadUpdatesStorage(): Promise<void> {\n const storedState = await this.client.storage.updates.getState()\n\n if (storedState) {\n this.pts = this.oldPts = storedState[0]\n this.qts = this.oldQts = storedState[1]\n this.date = this.oldDate = storedState[2]\n this.seq = this.oldSeq = storedState[3]\n\n this.log.debug(\n 'loaded stored state: pts=%d, qts=%d, date=%d, seq=%d',\n storedState[0],\n storedState[1],\n storedState[2],\n storedState[3],\n )\n }\n // if no state, don't bother initializing properties\n // since that means that there is no authorization,\n // and thus fetchUpdatesState will be called\n }\n\n async _saveUpdatesStorage(save = false): Promise<void> {\n const { client } = this\n\n // todo: move this to updates state service\n // before any authorization pts will be undefined\n if (this.pts !== undefined) {\n // if old* value is not available, assume it has changed.\n if (this.oldPts === undefined || this.oldPts !== this.pts) {\n await client.storage.updates.setPts(this.pts)\n }\n if (this.oldQts === undefined || this.oldQts !== this.qts) {\n await client.storage.updates.setQts(this.qts!)\n }\n if (this.oldDate === undefined || this.oldDate !== this.date) {\n await client.storage.updates.setDate(this.date!)\n }\n if (this.oldSeq === undefined || this.oldSeq !== this.seq) {\n await client.storage.updates.setSeq(this.seq!)\n }\n\n // update old* values\n this.oldPts = this.pts\n this.oldQts = this.qts\n this.oldDate = this.date\n this.oldSeq = this.seq\n\n await client.storage.updates.setManyChannelPts(this.cptsMod)\n this.cptsMod.clear()\n\n if (save) {\n await client.mt.storage.save()\n }\n }\n }\n\n _addToNoDispatchIndex(updates?: tl.TypeUpdates): void {\n if (!updates) return\n\n const { noDispatchMsg, noDispatchPts, noDispatchQts } = this\n\n const addUpdate = (upd: tl.TypeUpdate) => {\n const channelId = extractChannelIdFromUpdate(upd) ?? 0\n const pts = 'pts' in upd ? upd.pts : undefined\n\n if (pts) {\n const set = noDispatchPts.get(channelId)\n if (!set) noDispatchPts.set(channelId, new Set([pts]))\n else set.add(pts)\n }\n\n const qts = 'qts' in upd ? upd.qts : undefined\n\n if (qts) {\n noDispatchQts.add(qts)\n }\n\n switch (upd._) {\n case 'updateNewMessage':\n case 'updateNewChannelMessage': {\n const channelId = upd.message.peerId?._ === 'peerChannel' ? upd.message.peerId.channelId : 0\n\n const set = noDispatchMsg.get(channelId)\n if (!set) noDispatchMsg.set(channelId, new Set([upd.message.id]))\n else set.add(upd.message.id)\n\n break\n }\n }\n }\n\n switch (updates._) {\n case 'updates':\n case 'updatesCombined':\n updates.updates.forEach(addUpdate)\n break\n case 'updateShortMessage':\n case 'updateShortChatMessage':\n case 'updateShortSentMessage': {\n // these updates are only used for non-channel messages, so we use 0\n let set = noDispatchMsg.get(0)\n if (!set) noDispatchMsg.set(0, new Set([updates.id]))\n else set.add(updates.id)\n\n set = noDispatchPts.get(0)\n if (!set) noDispatchPts.set(0, new Set([updates.pts]))\n else set.add(updates.pts)\n break\n }\n case 'updateShort':\n addUpdate(updates.update)\n break\n case 'updatesTooLong':\n break\n default:\n assertNever(updates)\n }\n }\n\n async _fetchMissingPeers(upd: tl.TypeUpdate, peers: PeersIndex, allowMissing = false): Promise<Set<number>> {\n const { client } = this\n\n const missing = new Set<number>()\n\n async function fetchPeer(peer?: tl.TypePeer | number) {\n if (!peer) return true\n\n const bare = typeof peer === 'number' ? parseMarkedPeerId(peer)[1] : getBarePeerId(peer)\n\n const marked = typeof peer === 'number' ? peer : getMarkedPeerId(peer)\n const index = marked > 0 ? peers.users : peers.chats\n\n if (index.has(bare)) return true\n if (missing.has(marked)) return false\n\n const cached = await client.storage.peers.getCompleteById(marked)\n\n if (!cached) {\n missing.add(marked)\n\n return allowMissing\n }\n\n // whatever, ts is not smart enough to understand\n (index as Map<number, tl.TypeUser | tl.TypeChat>).set(bare, cached)\n\n return true\n }\n\n switch (upd._) {\n case 'updateNewMessage':\n case 'updateNewChannelMessage':\n case 'updateEditMessage':\n case 'updateEditChannelMessage': {\n const msg = upd.message\n if (msg._ === 'messageEmpty') return missing\n\n // ref: https://github.com/tdlib/td/blob/master/td/telegram/UpdatesManager.cpp\n // (search by UpdatesManager::is_acceptable_update)\n if (!(await fetchPeer(msg.peerId))) return missing\n if (!(await fetchPeer(msg.fromId))) return missing\n\n if (msg.replyTo) {\n if (msg.replyTo._ === 'messageReplyHeader' && !(await fetchPeer(msg.replyTo.replyToPeerId))) {\n return missing\n }\n if (msg.replyTo._ === 'messageReplyStoryHeader' && !(await fetchPeer(msg.replyTo.peer))) {\n return missing\n }\n }\n\n if (msg._ !== 'messageService') {\n if (\n msg.fwdFrom &&\n (!(await fetchPeer(msg.fwdFrom.fromId)) || !(await fetchPeer(msg.fwdFrom.savedFromPeer)))\n ) {\n return missing\n }\n if (!(await fetchPeer(msg.viaBotId))) return missing\n\n if (msg.entities) {\n for (const ent of msg.entities) {\n if (ent._ === 'messageEntityMentionName') {\n if (!(await fetchPeer(ent.userId))) return missing\n }\n }\n }\n\n if (msg.media) {\n switch (msg.media._) {\n case 'messageMediaContact':\n if (msg.media.userId && !(await fetchPeer(msg.media.userId))) {\n return missing\n }\n }\n }\n } else {\n switch (msg.action._) {\n case 'messageActionChatCreate':\n case 'messageActionChatAddUser':\n case 'messageActionInviteToGroupCall':\n for (const user of msg.action.users) {\n if (!(await fetchPeer(user))) return missing\n }\n break\n case 'messageActionChatJoinedByLink':\n if (!(await fetchPeer(msg.action.inviterId))) {\n return missing\n }\n break\n case 'messageActionChatDeleteUser':\n if (!(await fetchPeer(msg.action.userId))) return missing\n break\n case 'messageActionChatMigrateTo':\n if (!(await fetchPeer(toggleChannelIdMark(msg.action.channelId)))) {\n return missing\n }\n break\n case 'messageActionChannelMigrateFrom':\n if (!(await fetchPeer(-msg.action.chatId))) return missing\n break\n case 'messageActionGeoProximityReached':\n if (!(await fetchPeer(msg.action.fromId))) return missing\n if (!(await fetchPeer(msg.action.toId))) return missing\n break\n }\n }\n break\n }\n case 'updateDraftMessage':\n if ('entities' in upd.draft && upd.draft.entities) {\n for (const ent of upd.draft.entities) {\n if (ent._ === 'messageEntityMentionName') {\n if (!(await fetchPeer(ent.userId))) return missing\n }\n }\n }\n }\n\n return missing\n }\n\n async _storeMessageReferences(msg: tl.TypeMessage): Promise<void> {\n if (msg._ === 'messageEmpty') return\n\n const { client } = this\n\n const peerId = msg.peerId\n if (peerId._ !== 'peerChannel') return\n\n const channelId = toggleChannelIdMark(peerId.channelId)\n\n const promises: MaybePromise<void>[] = []\n\n function store(peer?: tl.TypePeer | number | number[]): void {\n if (!peer) return\n\n if (Array.isArray(peer)) {\n peer.forEach(store)\n\n return\n }\n\n const marked = typeof peer === 'number' ? peer : getMarkedPeerId(peer)\n\n promises.push(client.storage.refMsgs.store(marked, channelId, msg.id))\n }\n\n // reference: https://github.com/tdlib/td/blob/master/td/telegram/MessagesManager.cpp\n // (search by get_message_user_ids, get_message_channel_ids)\n store(msg.fromId)\n\n if (msg._ === 'message') {\n store(msg.viaBotId)\n store(msg.fwdFrom?.fromId)\n\n if (msg.media) {\n switch (msg.media._) {\n case 'messageMediaWebPage':\n if (msg.media.webpage._ === 'webPage' && msg.media.webpage.attributes) {\n for (const attr of msg.media.webpage.attributes) {\n if (attr._ === 'webPageAttributeStory') {\n store(attr.peer)\n }\n }\n }\n break\n case 'messageMediaContact':\n store(msg.media.userId)\n break\n case 'messageMediaStory':\n store(msg.media.peer)\n break\n case 'messageMediaGiveaway':\n store(msg.media.channels.map(toggleChannelIdMark))\n break\n }\n }\n } else {\n switch (msg.action._) {\n case 'messageActionChatCreate':\n case 'messageActionChatAddUser':\n case 'messageActionInviteToGroupCall':\n store(msg.action.users)\n break\n case 'messageActionChatDeleteUser':\n store(msg.action.userId)\n break\n }\n }\n\n if (msg.replyTo) {\n switch (msg.replyTo._) {\n case 'messageReplyHeader':\n store(msg.replyTo.replyToPeerId)\n store(msg.replyTo.replyFrom?.fromId)\n break\n case 'messageReplyStoryHeader':\n store(msg.replyTo.peer)\n break\n }\n // in fact, we can also use peers contained in the replied-to message,\n // but we don't fetch it automatically, so we can't know which peers are there\n }\n\n await Promise.all(promises)\n }\n\n async _fetchChannelDifference(channelId: number, fallbackPts?: number): Promise<boolean> {\n const { channelDiffTimeouts, cpts, cptsMod, channelsOpened, client, log, pendingUnorderedUpdates } = this\n\n // clear timeout if any\n if (channelDiffTimeouts.has(channelId)) {\n clearTimeout(channelDiffTimeouts.get(channelId))\n channelDiffTimeouts.delete(channelId)\n }\n\n let _pts: number | null | undefined = cpts.get(channelId)\n\n if (!_pts && this.catchingUp) {\n _pts = await client.storage.updates.getChannelPts(channelId)\n }\n if (!_pts) _pts = fallbackPts\n\n if (!_pts) {\n log.debug('fetchChannelDifference failed for channel %d: base pts not available', channelId)\n\n return false\n }\n\n const channelPeer = await client.storage.peers.getById(toggleChannelIdMark(channelId))\n\n if (!channelPeer) {\n log.debug('fetchChannelDifference failed for channel %d: input peer not found', channelId)\n\n return false\n }\n\n const channel = toInputChannel(channelPeer)\n\n // to make TS happy\n let pts = _pts\n let limit = this.auth?.isBot ? 100000 : 100\n\n if (pts <= 0) {\n pts = 1\n limit = 1\n }\n\n let lastTimeout = 0\n\n for (;;) {\n const diff = await client.call({\n _: 'updates.getChannelDifference',\n force: true, // Set to true to skip some possibly unneeded updates and reduce server-side load\n channel,\n pts,\n limit,\n filter: { _: 'channelMessagesFilterEmpty' },\n })\n\n if (diff.timeout) lastTimeout = diff.timeout\n\n if (diff._ === 'updates.channelDifferenceEmpty') {\n log.debug('getChannelDifference (cid = %d) returned channelDifferenceEmpty', channelId)\n break\n }\n\n const peers = PeersIndex.from(diff)\n\n if (diff._ === 'updates.channelDifferenceTooLong') {\n if (diff.dialog._ === 'dialog') {\n pts = diff.dialog.pts!\n }\n\n log.warn(\n 'getChannelDifference (cid = %d) returned channelDifferenceTooLong. new pts: %d, recent msgs: %d',\n channelId,\n pts,\n diff.messages.length,\n )\n\n diff.messages.forEach((message) => {\n log.debug(\n 'processing message %d (%s) from TooLong diff for channel %d',\n message.id,\n message._,\n channelId,\n )\n\n if (message._ === 'messageEmpty') return\n\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n break\n }\n\n log.debug(\n 'getChannelDifference (cid = %d) returned %d messages, %d updates. new pts: %d, final: %b',\n channelId,\n diff.newMessages.length,\n diff.otherUpdates.length,\n diff.pts,\n diff.final,\n )\n\n diff.newMessages.forEach((message) => {\n log.debug('processing message %d (%s) from diff for channel %d', message.id, message._, channelId)\n\n if (message._ === 'messageEmpty') return\n\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n\n diff.otherUpdates.forEach((upd) => {\n const parsed = toPendingUpdate(upd, peers, true)\n\n log.debug(\n 'processing %s from diff for channel %d, pts_before: %d, pts: %d',\n upd._,\n channelId,\n parsed.ptsBefore,\n parsed.pts,\n )\n\n if (isMessageEmpty(upd)) return\n\n pendingUnorderedUpdates.pushBack(parsed)\n })\n\n pts = diff.pts\n\n if (diff.final) break\n }\n\n cpts.set(channelId, pts)\n cptsMod.set(channelId, pts)\n\n // schedule next fetch\n if (lastTimeout !== 0 && channelsOpened.has(channelId)) {\n log.debug('scheduling next fetch for channel %d in %d seconds', channelId, lastTimeout)\n channelDiffTimeouts.set(\n channelId,\n setTimeout(() => this._fetchChannelDifferenceViaUpdate(channelId), lastTimeout * 1000),\n )\n }\n\n return true\n }\n\n _fetchChannelDifferenceLater(\n requestedDiff: Map<number, Promise<void>>,\n channelId: number,\n fallbackPts?: number,\n ): void {\n if (!requestedDiff.has(channelId)) {\n requestedDiff.set(\n channelId,\n this._fetchChannelDifference(channelId, fallbackPts)\n .catch((err) => {\n this.log.warn('error fetching difference for %d: %s', channelId, err)\n })\n .then((ok) => {\n requestedDiff.delete(channelId)\n\n if (!ok) {\n this.log.debug('channel difference for %d failed, falling back to common diff', channelId)\n this._fetchDifferenceLater(requestedDiff)\n }\n }),\n )\n }\n }\n\n _fetchChannelDifferenceViaUpdate(channelId: number, pts?: number): void {\n this.handleUpdate(\n createDummyUpdatesContainer([\n {\n _: 'updateChannelTooLong',\n channelId,\n pts,\n },\n ]),\n )\n }\n\n async _fetchDifference(requestedDiff: Map<number, Promise<void>>): Promise<void> {\n const { client, log, pendingPtsUpdates, pendingUnorderedUpdates } = this\n\n const diff = await client.call({\n _: 'updates.getDifference',\n pts: this.pts!,\n date: this.date!,\n qts: this.qts!,\n })\n\n switch (diff._) {\n case 'updates.differenceEmpty':\n log.debug('updates.getDifference returned updates.differenceEmpty')\n\n return\n case 'updates.differenceTooLong':\n this.pts = diff.pts\n log.debug('updates.getDifference returned updates.differenceTooLong')\n\n return\n }\n\n const fetchedState = diff._ === 'updates.difference' ? diff.state : diff.intermediateState\n\n log.debug(\n 'updates.getDifference returned %d messages, %d updates. new pts: %d, qts: %d, seq: %d, final: %b',\n diff.newMessages.length,\n diff.otherUpdates.length,\n fetchedState.pts,\n fetchedState.qts,\n fetchedState.seq,\n diff._ === 'updates.difference',\n )\n\n const peers = PeersIndex.from(diff)\n\n diff.newMessages.forEach((message) => {\n log.debug('processing message %d in %j (%s) from common diff', message.id, message.peerId, message._)\n\n if (message._ === 'messageEmpty') return\n\n // pts does not need to be checked for them\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n\n diff.otherUpdates.forEach((upd) => {\n if (upd._ === 'updateChannelTooLong') {\n log.debug(\n 'received updateChannelTooLong for channel %d in common diff (pts = %d), fetching diff',\n upd.channelId,\n upd.pts,\n )\n\n this._fetchChannelDifferenceLater(requestedDiff, upd.channelId, upd.pts)\n\n return\n }\n\n if (isMessageEmpty(upd)) return\n\n const parsed = toPendingUpdate(upd, peers, true)\n\n if (parsed.channelId && parsed.ptsBefore) {\n // we need to check pts for these updates, put into pts queue\n pendingPtsUpdates.add(parsed)\n } else {\n // the updates are in order already, we can treat them as unordered\n pendingUnorderedUpdates.pushBack(parsed)\n }\n\n log.debug(\n 'received %s from common diff, cid: %d, pts_before: %d, pts: %d, qts_before: %d',\n upd._,\n parsed.channelId,\n parsed.ptsBefore,\n parsed.pts,\n parsed.qtsBefore,\n )\n })\n\n this.pts = fetchedState.pts\n this.qts = fetchedState.qts\n this.seq = fetchedState.seq\n this.date = fetchedState.date\n\n if (diff._ === 'updates.difference') {\n return\n }\n\n // fetch the next chunk in next tick\n this.handleUpdate(UPDATES_TOO_LONG)\n }\n\n _fetchDifferenceLater(requestedDiff: Map<number, Promise<void>>): void {\n if (!requestedDiff.has(0)) {\n requestedDiff.set(\n 0,\n this._fetchDifference(requestedDiff)\n .catch((err) => {\n if (tl.RpcError.is(err, 'AUTH_KEY_UNREGISTERED')) {\n // for some reason, when logging out telegram may send updatesTooLong\n // in any case, we need to stop updates loop\n this.stopLoop()\n\n return\n }\n\n this.log.warn('error fetching common difference: %s', err)\n\n if (tl.RpcError.is(err, 'PERSISTENT_TIMESTAMP_INVALID')) {\n // this function never throws\n return this._fetchUpdatesState()\n }\n })\n .then(() => {\n requestedDiff.delete(0)\n }),\n )\n }\n }\n\n async _onUpdate(\n pending: PendingUpdate,\n requestedDiff: Map<number, Promise<void>>,\n postponed = false,\n unordered = false,\n ): Promise<void> {\n const { client, log } = this\n const upd = pending.update\n\n let missing: Set<number> | undefined = undefined\n\n // it is important to do this before updating pts\n if (pending.peers.hasMin || pending.peers.empty) {\n // even if we have min peers in difference, we can't do anything about them.\n // we still want to collect them, so we can fetch them in the background.\n // we won't wait for them, since that would block the updates loop\n\n log.debug('loading missing peers for %s (pts = %d, cid = %d)', upd._, pending.pts, pending.channelId)\n missing = await this._fetchMissingPeers(upd, pending.peers, pending.fromDifference)\n\n if (!pending.fromDifference && missing.size) {\n log.debug(\n 'fetching difference because some peers were min (%J) and not cached for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n\n if (pending.channelId && !(upd._ === 'updateNewChannelMessage' && upd.message._ === 'messageService')) {\n // don't replace service messages, because they can be about bot's kicking\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId, pending.ptsBefore)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n\n return\n }\n\n if (missing.size) {\n log.debug(\n 'peers still missing after fetching difference: %J for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n }\n }\n\n // apply new pts/qts, if applicable\n if (!unordered) {\n // because unordered may contain pts/qts values when received from diff\n\n if (pending.pts) {\n const localPts = pending.channelId ? this.cpts.get(pending.channelId) : this.pts\n\n if (localPts && pending.ptsBefore !== localPts) {\n log.warn(\n 'pts_before does not match local_pts for %s (cid = %d, pts_before = %d, pts = %d, local_pts = %d)',\n upd._,\n pending.channelId,\n pending.ptsBefore,\n pending.pts,\n localPts,\n )\n }\n\n log.debug(\n 'applying new pts (cid = %d) because received %s: %d -> %d (before: %d, count: %d) (postponed = %s)',\n pending.channelId,\n upd._,\n localPts,\n pending.pts,\n pending.ptsBefore,\n pending.pts - pending.ptsBefore!,\n postponed,\n )\n\n if (pending.channelId) {\n this.cpts.set(pending.channelId, pending.pts)\n this.cptsMod.set(pending.channelId, pending.pts)\n } else {\n this.pts = pending.pts\n }\n }\n\n if (pending.qtsBefore) {\n log.debug(\n 'applying new qts because received %s: %d -> %d (postponed = %s)',\n upd._,\n this.qts,\n pending.qtsBefore + 1,\n postponed,\n )\n\n this.qts = pending.qts\n }\n }\n\n if (isMessageEmpty(upd)) return\n\n // this.rpsProcessing?.hit()\n\n // updates that are also used internally\n switch (upd._) {\n case 'mtcute.dummyUpdate':\n // we just needed to apply new pts values\n return\n case 'updateDcOptions': {\n const config = client.mt.network.config.getNow()\n\n if (config) {\n client.mt.network.config.setData({\n ...config,\n dcOptions: upd.dcOptions,\n })\n } else {\n client.mt.network.config.update(true).catch((err) => client.emitError(err))\n }\n break\n }\n case 'updateConfig':\n client.mt.network.config.update(true).catch((err) => client.emitError(err))\n break\n case 'updateUserName':\n // todo\n // if (upd.userId === state.auth?.userId) {\n // state.auth.selfUsername = upd.usernames.find((it) => it.active)?.username ?? null\n // }\n break\n case 'updateDeleteChannelMessages':\n if (!this.auth?.isBot) {\n await client.storage.refMsgs.delete(toggleChannelIdMark(upd.channelId), upd.messages)\n }\n break\n case 'updateNewMessage':\n case 'updateEditMessage':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n if (!this.auth?.isBot) {\n await this._storeMessageReferences(upd.message)\n }\n break\n }\n\n if (missing?.size) {\n if (this.auth?.isBot) {\n this.log.warn(\n 'missing peers (%J) after getDifference for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n } else {\n // force save storage so the min peers are stored\n await client.mt.storage.save()\n\n for (const id of missing) {\n Promise.resolve(client.storage.peers.getById(id))\n .then((peer): unknown => {\n if (!peer) {\n this.log.warn('cannot fetch full peer %d - getPeerById returned null', id)\n\n return\n }\n\n // the peer will be automatically cached by the `.call()`, we don't have to do anything\n // todo\n // if (isInputPeerChannel(peer)) {\n // return _getChannelsBatched(client, toInputChannel(peer))\n // } else if (isInputPeerUser(peer)) {\n // return _getUsersBatched(client, toInputUser(peer))\n // }\n\n log.warn('cannot fetch full peer %d - unknown peer type %s', id, peer._)\n })\n .catch((err) => {\n log.warn('error fetching full peer %d: %s', id, err)\n })\n }\n }\n }\n\n // dispatch the update\n if (this.noDispatchEnabled) {\n const channelId = pending.channelId ?? 0\n const msgId =\n upd._ === 'updateNewMessage' || upd._ === 'updateNewChannelMessage' ? upd.message.id : undefined\n\n // we first need to remove it from each index, and then check if it was there\n const foundByMsgId = msgId && this.noDispatchMsg.get(channelId)?.delete(msgId)\n const foundByPts = this.noDispatchPts.get(channelId)?.delete(pending.pts!)\n const foundByQts = this.noDispatchQts.delete(pending.qts!)\n\n if (foundByMsgId || foundByPts || foundByQts) {\n log.debug('not dispatching %s because it is in no_dispatch index', upd._)\n\n return\n }\n }\n\n log.debug('dispatching %s (postponed = %s)', upd._, postponed)\n this._handler(upd, pending.peers)\n }\n\n async _loop(): Promise<void> {\n const {\n log,\n client,\n cpts,\n cptsMod,\n pendingUpdateContainers,\n pendingPtsUpdates,\n pendingPtsUpdatesPostponed,\n pendingQtsUpdates,\n pendingQtsUpdatesPostponed,\n pendingUnorderedUpdates,\n updatesLoopCv,\n postponedTimer,\n } = this\n\n log.debug('updates loop started, state available? %b', this.pts)\n\n try {\n if (!this.pts) {\n await this._fetchUpdatesState()\n }\n\n while (this.updatesLoopActive) {\n if (\n !(\n pendingUpdateContainers.length ||\n pendingPtsUpdates.length ||\n pendingQtsUpdates.length ||\n pendingUnorderedUpdates.length ||\n this.hasTimedoutPostponed\n )\n ) {\n if (this.catchingUp) {\n // consider catching up completed if there are no more updates\n this.log.debug('catching up completed')\n this.catchingUp = false\n this._onCatchingUp(false)\n }\n\n await updatesLoopCv.wait()\n }\n if (!this.updatesLoopActive) break\n\n log.debug(\n 'updates loop tick. pending containers: %d, pts: %d, pts_postponed: %d, qts: %d, qts_postponed: %d, unordered: %d',\n pendingUpdateContainers.length,\n pendingPtsUpdates.length,\n pendingPtsUpdatesPostponed.length,\n pendingQtsUpdates.length,\n pendingQtsUpdatesPostponed.length,\n pendingUnorderedUpdates.length,\n )\n\n const requestedDiff = new Map<number, Promise<void>>()\n\n this.log.debug('processing pending containers')\n\n while (pendingUpdateContainers.length) {\n const { upd, seqStart, seqEnd } = pendingUpdateContainers.popFront()!\n\n switch (upd._) {\n case 'updatesTooLong':\n log.debug('received updatesTooLong, fetching difference')\n this._fetchDifferenceLater(requestedDiff)\n break\n case 'updatesCombined':\n case 'updates': {\n if (seqStart !== 0) {\n // https://t.me/tdlibchat/5843\n const nextLocalSeq = this.seq! + 1\n log.debug(\n 'received seq-ordered %s (seq_start = %d, seq_end = %d, size = %d)',\n upd._,\n seqStart,\n seqEnd,\n upd.updates.length,\n )\n\n if (nextLocalSeq > seqStart) {\n log.debug(\n 'ignoring updates group because already applied (by seq: exp %d, got %d)',\n nextLocalSeq,\n seqStart,\n )\n // \"the updates were already applied, and must be ignored\"\n continue\n }\n\n if (nextLocalSeq < seqStart) {\n log.debug(\n 'fetching difference because gap detected (by seq: exp %d, got %d)',\n nextLocalSeq,\n seqStart,\n )\n // \"there's an updates gap that must be filled\"\n this._fetchDifferenceLater(requestedDiff)\n }\n } else {\n log.debug('received %s (size = %d)', upd._, upd.updates.length)\n }\n\n await client.storage.peers.updatePeersFrom(upd)\n\n const peers = PeersIndex.from(upd)\n\n for (const update of upd.updates) {\n switch (update._) {\n case 'updateChannelTooLong':\n log.debug(\n 'received updateChannelTooLong for channel %d (pts = %d) in container, fetching diff',\n update.channelId,\n update.pts,\n )\n this._fetchChannelDifferenceLater(requestedDiff, update.channelId, update.pts)\n continue\n case 'updatePtsChanged':\n // see https://github.com/tdlib/td/blob/07c1d53a6d3cb1fad58d2822e55eef6d57363581/td/telegram/UpdatesManager.cpp#L4051\n if (client.mt.network.getPoolSize('main') > 1) {\n // highload bot\n log.debug(\n 'updatePtsChanged received, resetting pts to 1 and fetching difference',\n )\n this.pts = 1\n this._fetchDifferenceLater(requestedDiff)\n } else {\n log.debug('updatePtsChanged received, fetching updates state')\n await this._fetchUpdatesState()\n }\n continue\n }\n\n const parsed = toPendingUpdate(update, peers)\n\n if (parsed.ptsBefore !== undefined) {\n pendingPtsUpdates.add(parsed)\n } else if (parsed.qtsBefore !== undefined) {\n pendingQtsUpdates.add(parsed)\n } else {\n pendingUnorderedUpdates.pushBack(parsed)\n }\n }\n\n if (seqEnd !== 0 && seqEnd > this.seq!) {\n this.seq = seqEnd\n this.date = upd.date\n }\n\n break\n }\n case 'updateShort': {\n log.debug('received short %s', upd._)\n\n const parsed = toPendingUpdate(upd.update, new PeersIndex())\n\n if (parsed.ptsBefore !== undefined) {\n pendingPtsUpdates.add(parsed)\n } else if (parsed.qtsBefore !== undefined) {\n pendingQtsUpdates.add(parsed)\n } else {\n pendingUnorderedUpdates.pushBack(parsed)\n }\n\n break\n }\n case 'updateShortMessage': {\n log.debug('received updateShortMessage')\n\n const message: tl.RawMessage = {\n _: 'message',\n out: upd.out,\n mentioned: upd.mentioned,\n mediaUnread: upd.mediaUnread,\n silent: upd.silent,\n id: upd.id,\n fromId: {\n _: 'peerUser',\n userId: upd.out ? this.auth!.userId : upd.userId,\n },\n peerId: {\n _: 'peerUser',\n userId: upd.userId,\n },\n fwdFrom: upd.fwdFrom,\n viaBotId: upd.viaBotId,\n replyTo: upd.replyTo,\n date: upd.date,\n message: upd.message,\n entities: upd.entities,\n ttlPeriod: upd.ttlPeriod,\n }\n\n const update: tl.RawUpdateNewMessage = {\n _: 'updateNewMessage',\n message,\n pts: upd.pts,\n ptsCount: upd.ptsCount,\n }\n\n pendingPtsUpdates.add({\n update,\n ptsBefore: upd.pts - upd.ptsCount,\n pts: upd.pts,\n peers: new PeersIndex(),\n fromDifference: false,\n })\n\n break\n }\n case 'updateShortChatMessage': {\n log.debug('received updateShortChatMessage')\n\n const message: tl.RawMessage = {\n _: 'message',\n out: upd.out,\n mentioned: upd.mentioned,\n mediaUnread: upd.mediaUnread,\n silent: upd.silent,\n id: upd.id,\n fromId: {\n _: 'peerUser',\n userId: upd.fromId,\n },\n peerId: {\n _: 'peerChat',\n chatId: upd.chatId,\n },\n fwdFrom: upd.fwdFrom,\n viaBotId: upd.viaBotId,\n replyTo: upd.replyTo,\n date: upd.date,\n message: upd.message,\n entities: upd.entities,\n ttlPeriod: upd.ttlPeriod,\n }\n\n const update: tl.RawUpdateNewMessage = {\n _: 'updateNewMessage',\n message,\n pts: upd.pts,\n ptsCount: upd.ptsCount,\n }\n\n pendingPtsUpdates.add({\n update,\n ptsBefore: upd.pts - upd.ptsCount,\n pts: upd.pts,\n peers: new PeersIndex(),\n fromDifference: false,\n })\n\n break\n }\n case 'updateShortSentMessage': {\n // should not happen\n log.warn('received updateShortSentMessage')\n break\n }\n default:\n assertNever(upd)\n }\n }\n\n this.log.debug('processing pending pts-ordered updates')\n\n while (pendingPtsUpdates.length) {\n const pending = pendingPtsUpdates.popFront()!\n const upd = pending.update\n\n // check pts\n\n let localPts: number | null = null\n\n if (!pending.channelId) localPts = this.pts!\n else if (cpts.has(pending.channelId)) {\n localPts = cpts.get(pending.channelId)!\n } else if (this.catchingUp) {\n // only load stored channel pts in case\n // the user has enabled catching up.\n // not loading stored pts effectively disables\n // catching up, but doesn't interfere with further\n // update gaps (i.e. first update received is considered\n // to be the base state)\n\n const saved = await client.storage.updates.getChannelPts(pending.channelId)\n\n if (saved) {\n cpts.set(pending.channelId, saved)\n localPts = saved\n }\n }\n\n if (localPts) {\n const diff = localPts - pending.ptsBefore!\n // PTS can only go up or drop cardinally\n const isPtsDrop = diff > 1000009\n\n if (diff > 0 && !isPtsDrop) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring %s (cid = %d) because already applied (by pts: exp %d, got %d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n continue\n }\n if (diff < 0) {\n // \"there's an update gap that must be filled\"\n // if the gap is less than 3, put the update into postponed queue\n // otherwise, call getDifference\n if (diff > -3) {\n log.debug(\n 'postponing %s for 0.5s (cid = %d) because small gap detected (by pts: exp %d, got %d, diff=%d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n diff,\n )\n pending.timeout = Date.now() + 500\n pendingPtsUpdatesPostponed.add(pending)\n postponedTimer.emitBefore(pending.timeout)\n } else if (diff > -1000000) {\n log.debug(\n 'fetching difference after %s (cid = %d) because pts gap detected (by pts: exp %d, got %d, diff=%d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n diff,\n )\n\n if (pending.channelId) {\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n } else {\n log.debug(\n 'skipping all updates because pts gap is too big (by pts: exp %d, got %d, diff=%d)',\n localPts,\n pending.ptsBefore,\n diff,\n )\n\n if (pending.channelId) {\n cpts.set(pending.channelId, 0)\n cptsMod.set(pending.channelId, 0)\n } else {\n await this._fetchUpdatesState()\n }\n }\n continue\n }\n\n if (isPtsDrop) {\n log.debug('pts drop detected (%d -> %d)', localPts, pending.ptsBefore)\n }\n }\n\n await this._onUpdate(pending, requestedDiff)\n }\n\n this.log.debug('processing postponed pts-ordered updates')\n\n for (let item = pendingPtsUpdatesPostponed._first; item; item = item.n) {\n // awesome fucking iteration because i'm so fucking tired and wanna kms\n const pending = item.v\n\n const upd = pending.update\n\n let localPts\n\n if (!pending.channelId) localPts = this.pts!\n else if (cpts.has(pending.channelId)) {\n localPts = cpts.get(pending.channelId)\n }\n\n // channel pts from storage will be available because we loaded it earlier\n if (!localPts) {\n log.warn(\n 'local pts not available for postponed %s (cid = %d), skipping',\n upd._,\n pending.channelId,\n )\n continue\n }\n\n // check the pts to see if the gap was filled\n if (localPts > pending.ptsBefore!) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring postponed %s (cid = %d) because already applied (by pts: exp %d, got %d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n pendingPtsUpdatesPostponed._remove(item)\n continue\n }\n if (localPts < pending.ptsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the timeout has not expired yet, keep the update in the queue\n // otherwise, fetch diff\n const now = Date.now()\n\n if (now < pending.timeout!) {\n log.debug(\n 'postponed %s (cid = %d) is still waiting (%dms left) (current pts %d, need %d)',\n upd._,\n pending.channelId,\n pending.timeout! - now,\n localPts,\n pending.ptsBefore,\n )\n } else {\n log.debug(\n \"gap for postponed %s (cid = %d) wasn't filled, fetching diff (current pts %d, need %d)\",\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n pendingPtsUpdatesPostponed._remove(item)\n\n if (pending.channelId) {\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n }\n continue\n }\n\n await this._onUpdate(pending, requestedDiff, true)\n pendingPtsUpdatesPostponed._remove(item)\n }\n\n this.log.debug('processing pending qts-ordered updates')\n\n while (pendingQtsUpdates.length) {\n const pending = pendingQtsUpdates.popFront()!\n const upd = pending.update\n\n // check qts\n const diff = this.qts! - pending.qtsBefore!\n const isQtsDrop = diff > 1000009\n\n if (diff > 0 && !isQtsDrop) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring %s because already applied (by qts: exp %d, got %d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n continue\n }\n if (this.qts! < pending.qtsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the gap is less than 3, put the update into postponed queue\n // otherwise, call getDifference\n if (diff > -3) {\n log.debug(\n 'postponing %s for 0.5s because small gap detected (by qts: exp %d, got %d, diff=%d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n diff,\n )\n pending.timeout = Date.now() + 500\n pendingQtsUpdatesPostponed.add(pending)\n postponedTimer.emitBefore(pending.timeout)\n } else {\n log.debug(\n 'fetching difference after %s because qts gap detected (by qts: exp %d, got %d, diff=%d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n diff,\n )\n this._fetchDifferenceLater(requestedDiff)\n }\n continue\n }\n\n if (isQtsDrop) {\n log.debug('qts drop detected (%d -> %d)', this.qts, pending.qtsBefore)\n }\n\n await this._onUpdate(pending, requestedDiff)\n }\n\n this.log.debug('processing postponed qts-ordered updates')\n\n for (let item = pendingQtsUpdatesPostponed._first; item; item = item.n) {\n // awesome fucking iteration because i'm so fucking tired and wanna kms\n const pending = item.v\n const upd = pending.update\n\n // check the pts to see if the gap was filled\n if (this.qts! > pending.qtsBefore!) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring postponed %s because already applied (by qts: exp %d, got %d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n continue\n }\n if (this.qts! < pending.qtsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the timeout has not expired yet, keep the update in the queue\n // otherwise, fetch diff\n const now = Date.now()\n\n if (now < pending.timeout!) {\n log.debug(\n 'postponed %s is still waiting (%dms left) (current qts %d, need %d)',\n upd._,\n pending.timeout! - now,\n this.qts!,\n pending.qtsBefore,\n )\n } else {\n log.debug(\n \"gap for postponed %s wasn't filled, fetching diff (current qts %d, need %d)\",\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n pendingQtsUpdatesPostponed._remove(item)\n this._fetchDifferenceLater(requestedDiff)\n }\n continue\n }\n\n // gap was filled, and the update can be applied\n await this._onUpdate(pending, requestedDiff, true)\n pendingQtsUpdatesPostponed._remove(item)\n }\n\n this.hasTimedoutPostponed = false\n\n while (requestedDiff.size) {\n log.debug(\n 'waiting for %d pending diffs before processing unordered: %J',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n\n await Promise.all([...requestedDiff.values()])\n\n // diff results may as well contain new diffs to be requested\n log.debug(\n 'pending diffs awaited, new diffs requested: %d (%J)',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n }\n\n this.log.debug('processing pending unordered updates')\n\n while (pendingUnorderedUpdates.length) {\n const pending = pendingUnorderedUpdates.popFront()!\n\n await this._onUpdate(pending, requestedDiff, false, true)\n }\n\n // onUpdate may also call getDiff in some cases, so we also need to check\n // diff may also contain new updates, which will be processed in the next tick,\n // but we don't want to postpone diff fetching\n while (requestedDiff.size) {\n log.debug(\n 'waiting for %d pending diffs after processing unordered: %J',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n\n await Promise.all([...requestedDiff.values()])\n\n // diff results may as well contain new diffs to be requested\n log.debug(\n 'pending diffs awaited, new diffs requested: %d (%j)',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n }\n\n // save new update state\n await this._saveUpdatesStorage(true)\n }\n\n log.debug('updates loop stopped')\n } catch (e) {\n log.error('updates loop encountered error, restarting: %s', e)\n\n return this._loop()\n }\n }\n}\n"]}
|