[{"data":1,"prerenderedAt":14226},["ShallowReactive",2],{"navigation":3,"/asynchronous-django/websockets-with-channels":1016,"/asynchronous-django/websockets-with-channels-surround":14221},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":721,"body":1018,"description":1028,"extension":14216,"links":14217,"meta":14218,"navigation":1069,"path":722,"seo":14219,"stem":723,"__hash__":14220},"docs/19.asynchronous-django/05.websockets-with-channels.md",{"type":1019,"value":1020,"toc":14200},"minimark",[1021,1025,1029,1034,1039,1676,1680,2180,2184,2188,5403,5407,10436,10440,10444,12585,12589,12593,14193,14196],[1022,1023,721],"h1",{"id":1024},"websockets-with-channels",[1026,1027,1028],"p",{},"Django Channels extends Django to handle WebSockets, HTTP/2, and other protocols beyond traditional HTTP. This enables building real-time applications like chat systems, live notifications, collaborative tools, and streaming dashboards. This chapter covers Channels architecture, WebSocket consumers, real-time communication patterns, and production deployment strategies.",[1030,1031,1033],"h2",{"id":1032},"channels-architecture","Channels Architecture",[1035,1036,1038],"h3",{"id":1037},"understanding-channels-components","Understanding Channels Components",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Channel layers provide the communication backbone\n# Redis is the most common channel layer backend\n\n# settings.py\nINSTALLED_APPS = [\n    'django.contrib.admin',\n    'django.contrib.auth',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.messages',\n    'django.contrib.staticfiles',\n    'channels',  # Add channels\n    'chat',      # Your app with WebSocket consumers\n]\n\n# ASGI application configuration\nASGI_APPLICATION = 'myproject.asgi.application'\n\n# Channel layer configuration\nCHANNEL_LAYERS = {\n    'default': {\n        'BACKEND': 'channels_redis.core.RedisChannelLayer',\n        'CONFIG': {\n            \"hosts\": [('127.0.0.1', 6379)],\n            \"capacity\": 1500,  # Maximum messages to store\n            \"expiry\": 60,      # Message expiry in seconds\n        },\n    },\n}\n\n# For production with Redis Sentinel\nCHANNEL_LAYERS = {\n    'default': {\n        'BACKEND': 'channels_redis.core.RedisChannelLayer',\n        'CONFIG': {\n            \"hosts\": [\n                {\n                    'sentinels': [\n                        ('sentinel1.example.com', 26379),\n                        ('sentinel2.example.com', 26379),\n                        ('sentinel3.example.com', 26379),\n                    ],\n                    'master_name': 'mymaster',\n                    'db': 0,\n                }\n            ],\n            \"capacity\": 5000,\n            \"expiry\": 300,\n            \"group_expiry\": 86400,  # 24 hours\n        },\n    },\n}\n","python","",[1047,1048,1049,1058,1064,1071,1077,1091,1108,1120,1132,1144,1156,1168,1184,1199,1205,1210,1216,1233,1238,1244,1255,1270,1292,1306,1339,1359,1379,1385,1391,1397,1402,1408,1417,1430,1449,1462,1475,1481,1496,1517,1535,1553,1559,1580,1597,1603,1609,1625,1641,1661,1666,1671],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# Channel layers provide the communication backbone\n",[1050,1059,1061],{"class":1052,"line":1060},2,[1050,1062,1063],{"class":1056},"# Redis is the most common channel layer backend\n",[1050,1065,1067],{"class":1052,"line":1066},3,[1050,1068,1070],{"emptyLinePlaceholder":1069},true,"\n",[1050,1072,1074],{"class":1052,"line":1073},4,[1050,1075,1076],{"class":1056},"# settings.py\n",[1050,1078,1080,1084,1088],{"class":1052,"line":1079},5,[1050,1081,1083],{"class":1082},"se3Ec","INSTALLED_APPS",[1050,1085,1087],{"class":1086},"soVBu"," =",[1050,1089,1090],{"class":1086}," [\n",[1050,1092,1094,1098,1102,1105],{"class":1052,"line":1093},6,[1050,1095,1097],{"class":1096},"sbYkP","    '",[1050,1099,1101],{"class":1100},"sTbE_","django.contrib.admin",[1050,1103,1104],{"class":1096},"'",[1050,1106,1107],{"class":1086},",\n",[1050,1109,1111,1113,1116,1118],{"class":1052,"line":1110},7,[1050,1112,1097],{"class":1096},[1050,1114,1115],{"class":1100},"django.contrib.auth",[1050,1117,1104],{"class":1096},[1050,1119,1107],{"class":1086},[1050,1121,1123,1125,1128,1130],{"class":1052,"line":1122},8,[1050,1124,1097],{"class":1096},[1050,1126,1127],{"class":1100},"django.contrib.contenttypes",[1050,1129,1104],{"class":1096},[1050,1131,1107],{"class":1086},[1050,1133,1135,1137,1140,1142],{"class":1052,"line":1134},9,[1050,1136,1097],{"class":1096},[1050,1138,1139],{"class":1100},"django.contrib.sessions",[1050,1141,1104],{"class":1096},[1050,1143,1107],{"class":1086},[1050,1145,1147,1149,1152,1154],{"class":1052,"line":1146},10,[1050,1148,1097],{"class":1096},[1050,1150,1151],{"class":1100},"django.contrib.messages",[1050,1153,1104],{"class":1096},[1050,1155,1107],{"class":1086},[1050,1157,1159,1161,1164,1166],{"class":1052,"line":1158},11,[1050,1160,1097],{"class":1096},[1050,1162,1163],{"class":1100},"django.contrib.staticfiles",[1050,1165,1104],{"class":1096},[1050,1167,1107],{"class":1086},[1050,1169,1171,1173,1176,1178,1181],{"class":1052,"line":1170},12,[1050,1172,1097],{"class":1096},[1050,1174,1175],{"class":1100},"channels",[1050,1177,1104],{"class":1096},[1050,1179,1180],{"class":1086},",",[1050,1182,1183],{"class":1056},"  # Add channels\n",[1050,1185,1187,1189,1192,1194,1196],{"class":1052,"line":1186},13,[1050,1188,1097],{"class":1096},[1050,1190,1191],{"class":1100},"chat",[1050,1193,1104],{"class":1096},[1050,1195,1180],{"class":1086},[1050,1197,1198],{"class":1056},"      # Your app with WebSocket consumers\n",[1050,1200,1202],{"class":1052,"line":1201},14,[1050,1203,1204],{"class":1086},"]\n",[1050,1206,1208],{"class":1052,"line":1207},15,[1050,1209,1070],{"emptyLinePlaceholder":1069},[1050,1211,1213],{"class":1052,"line":1212},16,[1050,1214,1215],{"class":1056},"# ASGI application configuration\n",[1050,1217,1219,1222,1224,1227,1230],{"class":1052,"line":1218},17,[1050,1220,1221],{"class":1082},"ASGI_APPLICATION",[1050,1223,1087],{"class":1086},[1050,1225,1226],{"class":1096}," '",[1050,1228,1229],{"class":1100},"myproject.asgi.application",[1050,1231,1232],{"class":1096},"'\n",[1050,1234,1236],{"class":1052,"line":1235},18,[1050,1237,1070],{"emptyLinePlaceholder":1069},[1050,1239,1241],{"class":1052,"line":1240},19,[1050,1242,1243],{"class":1056},"# Channel layer configuration\n",[1050,1245,1247,1250,1252],{"class":1052,"line":1246},20,[1050,1248,1249],{"class":1082},"CHANNEL_LAYERS",[1050,1251,1087],{"class":1086},[1050,1253,1254],{"class":1086}," {\n",[1050,1256,1258,1260,1263,1265,1268],{"class":1052,"line":1257},21,[1050,1259,1097],{"class":1096},[1050,1261,1262],{"class":1100},"default",[1050,1264,1104],{"class":1096},[1050,1266,1267],{"class":1086},":",[1050,1269,1254],{"class":1086},[1050,1271,1273,1276,1279,1281,1283,1285,1288,1290],{"class":1052,"line":1272},22,[1050,1274,1275],{"class":1096},"        '",[1050,1277,1278],{"class":1100},"BACKEND",[1050,1280,1104],{"class":1096},[1050,1282,1267],{"class":1086},[1050,1284,1226],{"class":1096},[1050,1286,1287],{"class":1100},"channels_redis.core.RedisChannelLayer",[1050,1289,1104],{"class":1096},[1050,1291,1107],{"class":1086},[1050,1293,1295,1297,1300,1302,1304],{"class":1052,"line":1294},23,[1050,1296,1275],{"class":1096},[1050,1298,1299],{"class":1100},"CONFIG",[1050,1301,1104],{"class":1096},[1050,1303,1267],{"class":1086},[1050,1305,1254],{"class":1086},[1050,1307,1309,1312,1315,1318,1320,1323,1325,1328,1330,1332,1336],{"class":1052,"line":1308},24,[1050,1310,1311],{"class":1096},"            \"",[1050,1313,1314],{"class":1100},"hosts",[1050,1316,1317],{"class":1096},"\"",[1050,1319,1267],{"class":1086},[1050,1321,1322],{"class":1086}," [(",[1050,1324,1104],{"class":1096},[1050,1326,1327],{"class":1100},"127.0.0.1",[1050,1329,1104],{"class":1096},[1050,1331,1180],{"class":1086},[1050,1333,1335],{"class":1334},"s7CZa"," 6379",[1050,1337,1338],{"class":1086},")],\n",[1050,1340,1342,1344,1347,1349,1351,1354,1356],{"class":1052,"line":1341},25,[1050,1343,1311],{"class":1096},[1050,1345,1346],{"class":1100},"capacity",[1050,1348,1317],{"class":1096},[1050,1350,1267],{"class":1086},[1050,1352,1353],{"class":1334}," 1500",[1050,1355,1180],{"class":1086},[1050,1357,1358],{"class":1056},"  # Maximum messages to store\n",[1050,1360,1362,1364,1367,1369,1371,1374,1376],{"class":1052,"line":1361},26,[1050,1363,1311],{"class":1096},[1050,1365,1366],{"class":1100},"expiry",[1050,1368,1317],{"class":1096},[1050,1370,1267],{"class":1086},[1050,1372,1373],{"class":1334}," 60",[1050,1375,1180],{"class":1086},[1050,1377,1378],{"class":1056},"      # Message expiry in seconds\n",[1050,1380,1382],{"class":1052,"line":1381},27,[1050,1383,1384],{"class":1086},"        },\n",[1050,1386,1388],{"class":1052,"line":1387},28,[1050,1389,1390],{"class":1086},"    },\n",[1050,1392,1394],{"class":1052,"line":1393},29,[1050,1395,1396],{"class":1086},"}\n",[1050,1398,1400],{"class":1052,"line":1399},30,[1050,1401,1070],{"emptyLinePlaceholder":1069},[1050,1403,1405],{"class":1052,"line":1404},31,[1050,1406,1407],{"class":1056},"# For production with Redis Sentinel\n",[1050,1409,1411,1413,1415],{"class":1052,"line":1410},32,[1050,1412,1249],{"class":1082},[1050,1414,1087],{"class":1086},[1050,1416,1254],{"class":1086},[1050,1418,1420,1422,1424,1426,1428],{"class":1052,"line":1419},33,[1050,1421,1097],{"class":1096},[1050,1423,1262],{"class":1100},[1050,1425,1104],{"class":1096},[1050,1427,1267],{"class":1086},[1050,1429,1254],{"class":1086},[1050,1431,1433,1435,1437,1439,1441,1443,1445,1447],{"class":1052,"line":1432},34,[1050,1434,1275],{"class":1096},[1050,1436,1278],{"class":1100},[1050,1438,1104],{"class":1096},[1050,1440,1267],{"class":1086},[1050,1442,1226],{"class":1096},[1050,1444,1287],{"class":1100},[1050,1446,1104],{"class":1096},[1050,1448,1107],{"class":1086},[1050,1450,1452,1454,1456,1458,1460],{"class":1052,"line":1451},35,[1050,1453,1275],{"class":1096},[1050,1455,1299],{"class":1100},[1050,1457,1104],{"class":1096},[1050,1459,1267],{"class":1086},[1050,1461,1254],{"class":1086},[1050,1463,1465,1467,1469,1471,1473],{"class":1052,"line":1464},36,[1050,1466,1311],{"class":1096},[1050,1468,1314],{"class":1100},[1050,1470,1317],{"class":1096},[1050,1472,1267],{"class":1086},[1050,1474,1090],{"class":1086},[1050,1476,1478],{"class":1052,"line":1477},37,[1050,1479,1480],{"class":1086},"                {\n",[1050,1482,1484,1487,1490,1492,1494],{"class":1052,"line":1483},38,[1050,1485,1486],{"class":1096},"                    '",[1050,1488,1489],{"class":1100},"sentinels",[1050,1491,1104],{"class":1096},[1050,1493,1267],{"class":1086},[1050,1495,1090],{"class":1086},[1050,1497,1499,1502,1504,1507,1509,1511,1514],{"class":1052,"line":1498},39,[1050,1500,1501],{"class":1086},"                        (",[1050,1503,1104],{"class":1096},[1050,1505,1506],{"class":1100},"sentinel1.example.com",[1050,1508,1104],{"class":1096},[1050,1510,1180],{"class":1086},[1050,1512,1513],{"class":1334}," 26379",[1050,1515,1516],{"class":1086},"),\n",[1050,1518,1520,1522,1524,1527,1529,1531,1533],{"class":1052,"line":1519},40,[1050,1521,1501],{"class":1086},[1050,1523,1104],{"class":1096},[1050,1525,1526],{"class":1100},"sentinel2.example.com",[1050,1528,1104],{"class":1096},[1050,1530,1180],{"class":1086},[1050,1532,1513],{"class":1334},[1050,1534,1516],{"class":1086},[1050,1536,1538,1540,1542,1545,1547,1549,1551],{"class":1052,"line":1537},41,[1050,1539,1501],{"class":1086},[1050,1541,1104],{"class":1096},[1050,1543,1544],{"class":1100},"sentinel3.example.com",[1050,1546,1104],{"class":1096},[1050,1548,1180],{"class":1086},[1050,1550,1513],{"class":1334},[1050,1552,1516],{"class":1086},[1050,1554,1556],{"class":1052,"line":1555},42,[1050,1557,1558],{"class":1086},"                    ],\n",[1050,1560,1562,1564,1567,1569,1571,1573,1576,1578],{"class":1052,"line":1561},43,[1050,1563,1486],{"class":1096},[1050,1565,1566],{"class":1100},"master_name",[1050,1568,1104],{"class":1096},[1050,1570,1267],{"class":1086},[1050,1572,1226],{"class":1096},[1050,1574,1575],{"class":1100},"mymaster",[1050,1577,1104],{"class":1096},[1050,1579,1107],{"class":1086},[1050,1581,1583,1585,1588,1590,1592,1595],{"class":1052,"line":1582},44,[1050,1584,1486],{"class":1096},[1050,1586,1587],{"class":1100},"db",[1050,1589,1104],{"class":1096},[1050,1591,1267],{"class":1086},[1050,1593,1594],{"class":1334}," 0",[1050,1596,1107],{"class":1086},[1050,1598,1600],{"class":1052,"line":1599},45,[1050,1601,1602],{"class":1086},"                }\n",[1050,1604,1606],{"class":1052,"line":1605},46,[1050,1607,1608],{"class":1086},"            ],\n",[1050,1610,1612,1614,1616,1618,1620,1623],{"class":1052,"line":1611},47,[1050,1613,1311],{"class":1096},[1050,1615,1346],{"class":1100},[1050,1617,1317],{"class":1096},[1050,1619,1267],{"class":1086},[1050,1621,1622],{"class":1334}," 5000",[1050,1624,1107],{"class":1086},[1050,1626,1628,1630,1632,1634,1636,1639],{"class":1052,"line":1627},48,[1050,1629,1311],{"class":1096},[1050,1631,1366],{"class":1100},[1050,1633,1317],{"class":1096},[1050,1635,1267],{"class":1086},[1050,1637,1638],{"class":1334}," 300",[1050,1640,1107],{"class":1086},[1050,1642,1644,1646,1649,1651,1653,1656,1658],{"class":1052,"line":1643},49,[1050,1645,1311],{"class":1096},[1050,1647,1648],{"class":1100},"group_expiry",[1050,1650,1317],{"class":1096},[1050,1652,1267],{"class":1086},[1050,1654,1655],{"class":1334}," 86400",[1050,1657,1180],{"class":1086},[1050,1659,1660],{"class":1056},"  # 24 hours\n",[1050,1662,1664],{"class":1052,"line":1663},50,[1050,1665,1384],{"class":1086},[1050,1667,1669],{"class":1052,"line":1668},51,[1050,1670,1390],{"class":1086},[1050,1672,1674],{"class":1052,"line":1673},52,[1050,1675,1396],{"class":1086},[1035,1677,1679],{"id":1678},"asgi-routing-configuration","ASGI Routing Configuration",[1040,1681,1683],{"className":1042,"code":1682,"language":1044,"meta":1045,"style":1045},"# asgi.py\nimport os\nfrom django.core.asgi import get_asgi_application\nfrom channels.routing import ProtocolTypeRouter, URLRouter\nfrom channels.auth import AuthMiddlewareStack\nfrom channels.security.websocket import AllowedHostsOriginValidator\nimport chat.routing\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')\n\n# Initialize Django ASGI application early\ndjango_asgi_app = get_asgi_application()\n\napplication = ProtocolTypeRouter({\n    # HTTP requests handled by Django\n    \"http\": django_asgi_app,\n    \n    # WebSocket requests handled by Channels\n    \"websocket\": AllowedHostsOriginValidator(\n        AuthMiddlewareStack(\n            URLRouter(\n                chat.routing.websocket_urlpatterns\n            )\n        )\n    ),\n})\n\n# chat/routing.py\nfrom django.urls import re_path, path\nfrom . import consumers\n\nwebsocket_urlpatterns = [\n    path('ws/chat/\u003Cstr:room_name>/', consumers.ChatConsumer.as_asgi()),\n    path('ws/notifications/', consumers.NotificationConsumer.as_asgi()),\n    path('ws/live-updates/', consumers.LiveUpdateConsumer.as_asgi()),\n    re_path(r'ws/user/(?P\u003Cuser_id>\\d+)/$', consumers.UserConsumer.as_asgi()),\n]\n",[1047,1684,1685,1690,1700,1724,1746,1762,1783,1796,1800,1838,1842,1847,1861,1865,1877,1882,1899,1904,1909,1926,1933,1940,1955,1960,1965,1970,1975,1979,1984,2005,2018,2022,2031,2063,2091,2119,2176],{"__ignoreMap":1045},[1050,1686,1687],{"class":1052,"line":1053},[1050,1688,1689],{"class":1056},"# asgi.py\n",[1050,1691,1692,1696],{"class":1052,"line":1060},[1050,1693,1695],{"class":1694},"siDh9","import",[1050,1697,1699],{"class":1698},"sftqT"," os\n",[1050,1701,1702,1705,1708,1711,1714,1716,1719,1721],{"class":1052,"line":1066},[1050,1703,1704],{"class":1694},"from",[1050,1706,1707],{"class":1698}," django",[1050,1709,1710],{"class":1086},".",[1050,1712,1713],{"class":1698},"core",[1050,1715,1710],{"class":1086},[1050,1717,1718],{"class":1698},"asgi ",[1050,1720,1695],{"class":1694},[1050,1722,1723],{"class":1698}," get_asgi_application\n",[1050,1725,1726,1728,1731,1733,1736,1738,1741,1743],{"class":1052,"line":1073},[1050,1727,1704],{"class":1694},[1050,1729,1730],{"class":1698}," channels",[1050,1732,1710],{"class":1086},[1050,1734,1735],{"class":1698},"routing ",[1050,1737,1695],{"class":1694},[1050,1739,1740],{"class":1698}," ProtocolTypeRouter",[1050,1742,1180],{"class":1086},[1050,1744,1745],{"class":1698}," URLRouter\n",[1050,1747,1748,1750,1752,1754,1757,1759],{"class":1052,"line":1079},[1050,1749,1704],{"class":1694},[1050,1751,1730],{"class":1698},[1050,1753,1710],{"class":1086},[1050,1755,1756],{"class":1698},"auth ",[1050,1758,1695],{"class":1694},[1050,1760,1761],{"class":1698}," AuthMiddlewareStack\n",[1050,1763,1764,1766,1768,1770,1773,1775,1778,1780],{"class":1052,"line":1093},[1050,1765,1704],{"class":1694},[1050,1767,1730],{"class":1698},[1050,1769,1710],{"class":1086},[1050,1771,1772],{"class":1698},"security",[1050,1774,1710],{"class":1086},[1050,1776,1777],{"class":1698},"websocket ",[1050,1779,1695],{"class":1694},[1050,1781,1782],{"class":1698}," AllowedHostsOriginValidator\n",[1050,1784,1785,1787,1790,1792],{"class":1052,"line":1110},[1050,1786,1695],{"class":1694},[1050,1788,1789],{"class":1698}," chat",[1050,1791,1710],{"class":1086},[1050,1793,1795],{"class":1794},"sBPpx","routing\n",[1050,1797,1798],{"class":1052,"line":1122},[1050,1799,1070],{"emptyLinePlaceholder":1069},[1050,1801,1802,1805,1807,1810,1812,1816,1819,1821,1824,1826,1828,1830,1833,1835],{"class":1052,"line":1134},[1050,1803,1804],{"class":1698},"os",[1050,1806,1710],{"class":1086},[1050,1808,1809],{"class":1794},"environ",[1050,1811,1710],{"class":1086},[1050,1813,1815],{"class":1814},"siWMO","setdefault",[1050,1817,1818],{"class":1086},"(",[1050,1820,1104],{"class":1096},[1050,1822,1823],{"class":1100},"DJANGO_SETTINGS_MODULE",[1050,1825,1104],{"class":1096},[1050,1827,1180],{"class":1086},[1050,1829,1226],{"class":1096},[1050,1831,1832],{"class":1100},"myproject.settings",[1050,1834,1104],{"class":1096},[1050,1836,1837],{"class":1086},")\n",[1050,1839,1840],{"class":1052,"line":1146},[1050,1841,1070],{"emptyLinePlaceholder":1069},[1050,1843,1844],{"class":1052,"line":1158},[1050,1845,1846],{"class":1056},"# Initialize Django ASGI application early\n",[1050,1848,1849,1852,1855,1858],{"class":1052,"line":1170},[1050,1850,1851],{"class":1698},"django_asgi_app ",[1050,1853,1854],{"class":1086},"=",[1050,1856,1857],{"class":1814}," get_asgi_application",[1050,1859,1860],{"class":1086},"()\n",[1050,1862,1863],{"class":1052,"line":1186},[1050,1864,1070],{"emptyLinePlaceholder":1069},[1050,1866,1867,1870,1872,1874],{"class":1052,"line":1201},[1050,1868,1869],{"class":1698},"application ",[1050,1871,1854],{"class":1086},[1050,1873,1740],{"class":1814},[1050,1875,1876],{"class":1086},"({\n",[1050,1878,1879],{"class":1052,"line":1207},[1050,1880,1881],{"class":1056},"    # HTTP requests handled by Django\n",[1050,1883,1884,1887,1890,1892,1894,1897],{"class":1052,"line":1212},[1050,1885,1886],{"class":1096},"    \"",[1050,1888,1889],{"class":1100},"http",[1050,1891,1317],{"class":1096},[1050,1893,1267],{"class":1086},[1050,1895,1896],{"class":1814}," django_asgi_app",[1050,1898,1107],{"class":1086},[1050,1900,1901],{"class":1052,"line":1218},[1050,1902,1903],{"class":1814},"    \n",[1050,1905,1906],{"class":1052,"line":1235},[1050,1907,1908],{"class":1056},"    # WebSocket requests handled by Channels\n",[1050,1910,1911,1913,1916,1918,1920,1923],{"class":1052,"line":1240},[1050,1912,1886],{"class":1096},[1050,1914,1915],{"class":1100},"websocket",[1050,1917,1317],{"class":1096},[1050,1919,1267],{"class":1086},[1050,1921,1922],{"class":1814}," AllowedHostsOriginValidator",[1050,1924,1925],{"class":1086},"(\n",[1050,1927,1928,1931],{"class":1052,"line":1246},[1050,1929,1930],{"class":1814},"        AuthMiddlewareStack",[1050,1932,1925],{"class":1086},[1050,1934,1935,1938],{"class":1052,"line":1257},[1050,1936,1937],{"class":1814},"            URLRouter",[1050,1939,1925],{"class":1086},[1050,1941,1942,1945,1947,1950,1952],{"class":1052,"line":1272},[1050,1943,1944],{"class":1814},"                chat",[1050,1946,1710],{"class":1086},[1050,1948,1949],{"class":1794},"routing",[1050,1951,1710],{"class":1086},[1050,1953,1954],{"class":1794},"websocket_urlpatterns\n",[1050,1956,1957],{"class":1052,"line":1294},[1050,1958,1959],{"class":1086},"            )\n",[1050,1961,1962],{"class":1052,"line":1308},[1050,1963,1964],{"class":1086},"        )\n",[1050,1966,1967],{"class":1052,"line":1341},[1050,1968,1969],{"class":1086},"    ),\n",[1050,1971,1972],{"class":1052,"line":1361},[1050,1973,1974],{"class":1086},"})\n",[1050,1976,1977],{"class":1052,"line":1381},[1050,1978,1070],{"emptyLinePlaceholder":1069},[1050,1980,1981],{"class":1052,"line":1387},[1050,1982,1983],{"class":1056},"# chat/routing.py\n",[1050,1985,1986,1988,1990,1992,1995,1997,2000,2002],{"class":1052,"line":1393},[1050,1987,1704],{"class":1694},[1050,1989,1707],{"class":1698},[1050,1991,1710],{"class":1086},[1050,1993,1994],{"class":1698},"urls ",[1050,1996,1695],{"class":1694},[1050,1998,1999],{"class":1698}," re_path",[1050,2001,1180],{"class":1086},[1050,2003,2004],{"class":1698}," path\n",[1050,2006,2007,2009,2012,2015],{"class":1052,"line":1399},[1050,2008,1704],{"class":1694},[1050,2010,2011],{"class":1086}," .",[1050,2013,2014],{"class":1694}," import",[1050,2016,2017],{"class":1698}," consumers\n",[1050,2019,2020],{"class":1052,"line":1404},[1050,2021,1070],{"emptyLinePlaceholder":1069},[1050,2023,2024,2027,2029],{"class":1052,"line":1410},[1050,2025,2026],{"class":1698},"websocket_urlpatterns ",[1050,2028,1854],{"class":1086},[1050,2030,1090],{"class":1086},[1050,2032,2033,2036,2038,2040,2043,2045,2047,2050,2052,2055,2057,2060],{"class":1052,"line":1419},[1050,2034,2035],{"class":1814},"    path",[1050,2037,1818],{"class":1086},[1050,2039,1104],{"class":1096},[1050,2041,2042],{"class":1100},"ws/chat/\u003Cstr:room_name>/",[1050,2044,1104],{"class":1096},[1050,2046,1180],{"class":1086},[1050,2048,2049],{"class":1814}," consumers",[1050,2051,1710],{"class":1086},[1050,2053,2054],{"class":1794},"ChatConsumer",[1050,2056,1710],{"class":1086},[1050,2058,2059],{"class":1814},"as_asgi",[1050,2061,2062],{"class":1086},"()),\n",[1050,2064,2065,2067,2069,2071,2074,2076,2078,2080,2082,2085,2087,2089],{"class":1052,"line":1432},[1050,2066,2035],{"class":1814},[1050,2068,1818],{"class":1086},[1050,2070,1104],{"class":1096},[1050,2072,2073],{"class":1100},"ws/notifications/",[1050,2075,1104],{"class":1096},[1050,2077,1180],{"class":1086},[1050,2079,2049],{"class":1814},[1050,2081,1710],{"class":1086},[1050,2083,2084],{"class":1794},"NotificationConsumer",[1050,2086,1710],{"class":1086},[1050,2088,2059],{"class":1814},[1050,2090,2062],{"class":1086},[1050,2092,2093,2095,2097,2099,2102,2104,2106,2108,2110,2113,2115,2117],{"class":1052,"line":1451},[1050,2094,2035],{"class":1814},[1050,2096,1818],{"class":1086},[1050,2098,1104],{"class":1096},[1050,2100,2101],{"class":1100},"ws/live-updates/",[1050,2103,1104],{"class":1096},[1050,2105,1180],{"class":1086},[1050,2107,2049],{"class":1814},[1050,2109,1710],{"class":1086},[1050,2111,2112],{"class":1794},"LiveUpdateConsumer",[1050,2114,1710],{"class":1086},[1050,2116,2059],{"class":1814},[1050,2118,2062],{"class":1086},[1050,2120,2121,2124,2126,2130,2132,2136,2138,2142,2146,2150,2153,2156,2159,2161,2163,2165,2167,2170,2172,2174],{"class":1052,"line":1464},[1050,2122,2123],{"class":1814},"    re_path",[1050,2125,1818],{"class":1086},[1050,2127,2129],{"class":2128},"s5Kfy","r",[1050,2131,1104],{"class":1096},[1050,2133,2135],{"class":2134},"s27EL","ws/user/",[1050,2137,1818],{"class":1086},[1050,2139,2141],{"class":2140},"sJFLg","?P\u003Cuser_id>",[1050,2143,2145],{"class":2144},"sRJPX","\\d",[1050,2147,2149],{"class":2148},"sGuSu","+",[1050,2151,2152],{"class":1086},")",[1050,2154,2155],{"class":2134},"/",[1050,2157,2158],{"class":2144},"$",[1050,2160,1104],{"class":1096},[1050,2162,1180],{"class":1086},[1050,2164,2049],{"class":1814},[1050,2166,1710],{"class":1086},[1050,2168,2169],{"class":1794},"UserConsumer",[1050,2171,1710],{"class":1086},[1050,2173,2059],{"class":1814},[1050,2175,2062],{"class":1086},[1050,2177,2178],{"class":1052,"line":1477},[1050,2179,1204],{"class":1086},[1030,2181,2183],{"id":2182},"websocket-consumers","WebSocket Consumers",[1035,2185,2187],{"id":2186},"basic-websocket-consumer","Basic WebSocket Consumer",[1040,2189,2191],{"className":1042,"code":2190,"language":1044,"meta":1045,"style":1045},"# chat/consumers.py\nimport json\nimport asyncio\nfrom channels.generic.websocket import AsyncWebsocketConsumer\nfrom channels.db import database_sync_to_async\nfrom django.contrib.auth.models import User\nfrom .models import ChatRoom, Message\n\nclass ChatConsumer(AsyncWebsocketConsumer):\n    \"\"\"Basic chat consumer for real-time messaging.\"\"\"\n    \n    async def connect(self):\n        \"\"\"Handle WebSocket connection.\"\"\"\n        self.room_name = self.scope['url_route']['kwargs']['room_name']\n        self.room_group_name = f'chat_{self.room_name}'\n        self.user = self.scope['user']\n        \n        # Reject anonymous users\n        if not self.user.is_authenticated:\n            await self.close()\n            return\n        \n        # Join room group\n        await self.channel_layer.group_add(\n            self.room_group_name,\n            self.channel_name\n        )\n        \n        # Accept WebSocket connection\n        await self.accept()\n        \n        # Notify room about user joining\n        await self.channel_layer.group_send(\n            self.room_group_name,\n            {\n                'type': 'user_joined',\n                'user': self.user.username,\n                'message': f'{self.user.username} joined the room'\n            }\n        )\n        \n        # Send recent messages to newly connected user\n        await self.send_recent_messages()\n    \n    async def disconnect(self, close_code):\n        \"\"\"Handle WebSocket disconnection.\"\"\"\n        if hasattr(self, 'room_group_name'):\n            # Notify room about user leaving\n            await self.channel_layer.group_send(\n                self.room_group_name,\n                {\n                    'type': 'user_left',\n                    'user': self.user.username,\n                    'message': f'{self.user.username} left the room'\n                }\n            )\n            \n            # Leave room group\n            await self.channel_layer.group_discard(\n                self.room_group_name,\n                self.channel_name\n            )\n    \n    async def receive(self, text_data):\n        \"\"\"Handle messages from WebSocket.\"\"\"\n        try:\n            text_data_json = json.loads(text_data)\n            message_type = text_data_json.get('type', 'message')\n            \n            if message_type == 'message':\n                await self.handle_chat_message(text_data_json)\n            elif message_type == 'typing':\n                await self.handle_typing_indicator(text_data_json)\n            elif message_type == 'ping':\n                await self.handle_ping()\n            else:\n                await self.send_error('Unknown message type')\n        \n        except json.JSONDecodeError:\n            await self.send_error('Invalid JSON')\n        except Exception as e:\n            await self.send_error(f'Error processing message: {str(e)}')\n    \n    async def handle_chat_message(self, data):\n        \"\"\"Handle chat message.\"\"\"\n        message_content = data.get('message', '').strip()\n        \n        if not message_content:\n            await self.send_error('Empty message')\n            return\n        \n        # Save message to database\n        message = await self.save_message(message_content)\n        \n        if message:\n            # Send message to room group\n            await self.channel_layer.group_send(\n                self.room_group_name,\n                {\n                    'type': 'chat_message',\n                    'message': message_content,\n                    'user': self.user.username,\n                    'user_id': self.user.id,\n                    'timestamp': message.created_at.isoformat(),\n                    'message_id': message.id\n                }\n            )\n    \n    async def handle_typing_indicator(self, data):\n        \"\"\"Handle typing indicator.\"\"\"\n        is_typing = data.get('is_typing', False)\n        \n        # Send typing indicator to room group (excluding sender)\n        await self.channel_layer.group_send(\n            self.room_group_name,\n            {\n                'type': 'typing_indicator',\n                'user': self.user.username,\n                'user_id': self.user.id,\n                'is_typing': is_typing\n            }\n        )\n    \n    async def handle_ping(self):\n        \"\"\"Handle ping message for connection keepalive.\"\"\"\n        await self.send(text_data=json.dumps({\n            'type': 'pong',\n            'timestamp': asyncio.get_event_loop().time()\n        }))\n    \n    # Group message handlers\n    async def chat_message(self, event):\n        \"\"\"Send chat message to WebSocket.\"\"\"\n        await self.send(text_data=json.dumps({\n            'type': 'message',\n            'message': event['message'],\n            'user': event['user'],\n            'user_id': event['user_id'],\n            'timestamp': event['timestamp'],\n            'message_id': event['message_id']\n        }))\n    \n    async def user_joined(self, event):\n        \"\"\"Send user joined notification to WebSocket.\"\"\"\n        # Don't send to the user who joined\n        if event['user'] != self.user.username:\n            await self.send(text_data=json.dumps({\n                'type': 'user_joined',\n                'user': event['user'],\n                'message': event['message']\n            }))\n    \n    async def user_left(self, event):\n        \"\"\"Send user left notification to WebSocket.\"\"\"\n        # Don't send to the user who left (they're already disconnected)\n        if event['user'] != self.user.username:\n            await self.send(text_data=json.dumps({\n                'type': 'user_left',\n                'user': event['user'],\n                'message': event['message']\n            }))\n    \n    async def typing_indicator(self, event):\n        \"\"\"Send typing indicator to WebSocket.\"\"\"\n        # Don't send typing indicator back to the sender\n        if event['user_id'] != self.user.id:\n            await self.send(text_data=json.dumps({\n                'type': 'typing',\n                'user': event['user'],\n                'is_typing': event['is_typing']\n            }))\n    \n    # Helper methods\n    async def send_error(self, error_message):\n        \"\"\"Send error message to WebSocket.\"\"\"\n        await self.send(text_data=json.dumps({\n            'type': 'error',\n            'message': error_message\n        }))\n    \n    async def send_recent_messages(self):\n        \"\"\"Send recent messages to newly connected user.\"\"\"\n        messages = await self.get_recent_messages()\n        \n        for message in messages:\n            await self.send(text_data=json.dumps({\n                'type': 'message',\n                'message': message.content,\n                'user': message.user.username,\n                'user_id': message.user.id,\n                'timestamp': message.created_at.isoformat(),\n                'message_id': message.id\n            }))\n    \n    @database_sync_to_async\n    def save_message(self, content):\n        \"\"\"Save message to database.\"\"\"\n        try:\n            room, created = ChatRoom.objects.get_or_create(name=self.room_name)\n            message = Message.objects.create(\n                room=room,\n                user=self.user,\n                content=content\n            )\n            return message\n        except Exception as e:\n            print(f\"Error saving message: {e}\")\n            return None\n    \n    @database_sync_to_async\n    def get_recent_messages(self):\n        \"\"\"Get recent messages from database.\"\"\"\n        try:\n            room = ChatRoom.objects.get(name=self.room_name)\n            return list(\n                room.messages.select_related('user')\n                .order_by('-created_at')[:50]\n                .reverse()\n            )\n        except ChatRoom.DoesNotExist:\n            return []\n",[1047,2192,2193,2198,2205,2212,2232,2248,2274,2292,2296,2314,2327,2331,2351,2361,2411,2443,2470,2475,2480,2503,2517,2522,2526,2531,2550,2561,2570,2574,2578,2583,2596,2600,2605,2622,2632,2637,2658,2681,2713,2718,2722,2726,2731,2744,2748,2769,2778,2800,2805,2821,2832,2836,2855,2878,2910,2915,2920,2926,2932,2950,2961,2970,2975,2980,3001,3011,3019,3042,3076,3081,3101,3121,3140,3158,3176,3190,3198,3221,3226,3241,3263,3280,3317,3322,3343,3353,3388,3393,3405,3427,3432,3437,3443,3468,3473,3483,3489,3506,3517,3522,3542,3557,3580,3605,3632,3651,3656,3661,3666,3686,3696,3727,3732,3738,3755,3766,3771,3791,3814,3837,3851,3856,3861,3866,3882,3892,3921,3942,3969,3975,3980,3986,4007,4017,4042,4061,4085,4108,4131,4154,4177,4182,4187,4207,4217,4223,4256,4281,4300,4323,4346,4352,4357,4377,4387,4393,4424,4449,4468,4491,4514,4519,4524,4544,4554,4560,4591,4616,4635,4658,4681,4686,4691,4697,4718,4728,4753,4773,4787,4792,4797,4813,4823,4842,4847,4864,4889,4908,4928,4951,4974,4997,5014,5019,5024,5033,5053,5063,5070,5110,5132,5145,5161,5172,5177,5186,5199,5222,5230,5235,5242,5256,5266,5273,5305,5315,5340,5366,5376,5381,5395],{"__ignoreMap":1045},[1050,2194,2195],{"class":1052,"line":1053},[1050,2196,2197],{"class":1056},"# chat/consumers.py\n",[1050,2199,2200,2202],{"class":1052,"line":1060},[1050,2201,1695],{"class":1694},[1050,2203,2204],{"class":1698}," json\n",[1050,2206,2207,2209],{"class":1052,"line":1066},[1050,2208,1695],{"class":1694},[1050,2210,2211],{"class":1698}," asyncio\n",[1050,2213,2214,2216,2218,2220,2223,2225,2227,2229],{"class":1052,"line":1073},[1050,2215,1704],{"class":1694},[1050,2217,1730],{"class":1698},[1050,2219,1710],{"class":1086},[1050,2221,2222],{"class":1698},"generic",[1050,2224,1710],{"class":1086},[1050,2226,1777],{"class":1698},[1050,2228,1695],{"class":1694},[1050,2230,2231],{"class":1698}," AsyncWebsocketConsumer\n",[1050,2233,2234,2236,2238,2240,2243,2245],{"class":1052,"line":1079},[1050,2235,1704],{"class":1694},[1050,2237,1730],{"class":1698},[1050,2239,1710],{"class":1086},[1050,2241,2242],{"class":1698},"db ",[1050,2244,1695],{"class":1694},[1050,2246,2247],{"class":1698}," database_sync_to_async\n",[1050,2249,2250,2252,2254,2256,2259,2261,2264,2266,2269,2271],{"class":1052,"line":1093},[1050,2251,1704],{"class":1694},[1050,2253,1707],{"class":1698},[1050,2255,1710],{"class":1086},[1050,2257,2258],{"class":1698},"contrib",[1050,2260,1710],{"class":1086},[1050,2262,2263],{"class":1698},"auth",[1050,2265,1710],{"class":1086},[1050,2267,2268],{"class":1698},"models ",[1050,2270,1695],{"class":1694},[1050,2272,2273],{"class":1698}," User\n",[1050,2275,2276,2278,2280,2282,2284,2287,2289],{"class":1052,"line":1110},[1050,2277,1704],{"class":1694},[1050,2279,2011],{"class":1086},[1050,2281,2268],{"class":1698},[1050,2283,1695],{"class":1694},[1050,2285,2286],{"class":1698}," ChatRoom",[1050,2288,1180],{"class":1086},[1050,2290,2291],{"class":1698}," Message\n",[1050,2293,2294],{"class":1052,"line":1122},[1050,2295,1070],{"emptyLinePlaceholder":1069},[1050,2297,2298,2301,2305,2307,2311],{"class":1052,"line":1134},[1050,2299,2300],{"class":2128},"class",[1050,2302,2304],{"class":2303},"sD-vU"," ChatConsumer",[1050,2306,1818],{"class":1086},[1050,2308,2310],{"class":2309},"sYn-s","AsyncWebsocketConsumer",[1050,2312,2313],{"class":1086},"):\n",[1050,2315,2316,2320,2324],{"class":1052,"line":1146},[1050,2317,2319],{"class":2318},"sm7ve","    \"\"\"",[1050,2321,2323],{"class":2322},"sVyVU","Basic chat consumer for real-time messaging.",[1050,2325,2326],{"class":2318},"\"\"\"\n",[1050,2328,2329],{"class":1052,"line":1158},[1050,2330,1903],{"class":1698},[1050,2332,2333,2336,2339,2343,2345,2349],{"class":1052,"line":1170},[1050,2334,2335],{"class":2128},"    async",[1050,2337,2338],{"class":2128}," def",[1050,2340,2342],{"class":2341},"sljsM"," connect",[1050,2344,1818],{"class":1086},[1050,2346,2348],{"class":2347},"sRjD_","self",[1050,2350,2313],{"class":1086},[1050,2352,2353,2356,2359],{"class":1052,"line":1186},[1050,2354,2355],{"class":2318},"        \"\"\"",[1050,2357,2358],{"class":2322},"Handle WebSocket connection.",[1050,2360,2326],{"class":2318},[1050,2362,2363,2366,2368,2371,2373,2376,2378,2381,2384,2386,2389,2391,2394,2396,2399,2401,2403,2405,2407,2409],{"class":1052,"line":1201},[1050,2364,2365],{"class":1082},"        self",[1050,2367,1710],{"class":1086},[1050,2369,2370],{"class":1794},"room_name",[1050,2372,1087],{"class":1086},[1050,2374,2375],{"class":1082}," self",[1050,2377,1710],{"class":1086},[1050,2379,2380],{"class":1794},"scope",[1050,2382,2383],{"class":1086},"[",[1050,2385,1104],{"class":1096},[1050,2387,2388],{"class":1100},"url_route",[1050,2390,1104],{"class":1096},[1050,2392,2393],{"class":1086},"][",[1050,2395,1104],{"class":1096},[1050,2397,2398],{"class":1100},"kwargs",[1050,2400,1104],{"class":1096},[1050,2402,2393],{"class":1086},[1050,2404,1104],{"class":1096},[1050,2406,2370],{"class":1100},[1050,2408,1104],{"class":1096},[1050,2410,1204],{"class":1086},[1050,2412,2413,2415,2417,2420,2422,2425,2428,2432,2434,2436,2438,2441],{"class":1052,"line":1207},[1050,2414,2365],{"class":1082},[1050,2416,1710],{"class":1086},[1050,2418,2419],{"class":1794},"room_group_name",[1050,2421,1087],{"class":1086},[1050,2423,2424],{"class":2128}," f",[1050,2426,2427],{"class":1100},"'chat_",[1050,2429,2431],{"class":2430},"s3h35","{",[1050,2433,2348],{"class":1082},[1050,2435,1710],{"class":1086},[1050,2437,2370],{"class":1794},[1050,2439,2440],{"class":2430},"}",[1050,2442,1232],{"class":1100},[1050,2444,2445,2447,2449,2452,2454,2456,2458,2460,2462,2464,2466,2468],{"class":1052,"line":1212},[1050,2446,2365],{"class":1082},[1050,2448,1710],{"class":1086},[1050,2450,2451],{"class":1794},"user",[1050,2453,1087],{"class":1086},[1050,2455,2375],{"class":1082},[1050,2457,1710],{"class":1086},[1050,2459,2380],{"class":1794},[1050,2461,2383],{"class":1086},[1050,2463,1104],{"class":1096},[1050,2465,2451],{"class":1100},[1050,2467,1104],{"class":1096},[1050,2469,1204],{"class":1086},[1050,2471,2472],{"class":1052,"line":1218},[1050,2473,2474],{"class":1698},"        \n",[1050,2476,2477],{"class":1052,"line":1235},[1050,2478,2479],{"class":1056},"        # Reject anonymous users\n",[1050,2481,2482,2485,2489,2491,2493,2495,2497,2500],{"class":1052,"line":1240},[1050,2483,2484],{"class":1694},"        if",[1050,2486,2488],{"class":2487},"sVsLi"," not",[1050,2490,2375],{"class":1082},[1050,2492,1710],{"class":1086},[1050,2494,2451],{"class":1794},[1050,2496,1710],{"class":1086},[1050,2498,2499],{"class":1794},"is_authenticated",[1050,2501,2502],{"class":1086},":\n",[1050,2504,2505,2508,2510,2512,2515],{"class":1052,"line":1246},[1050,2506,2507],{"class":1694},"            await",[1050,2509,2375],{"class":1082},[1050,2511,1710],{"class":1086},[1050,2513,2514],{"class":1814},"close",[1050,2516,1860],{"class":1086},[1050,2518,2519],{"class":1052,"line":1257},[1050,2520,2521],{"class":1694},"            return\n",[1050,2523,2524],{"class":1052,"line":1272},[1050,2525,2474],{"class":1698},[1050,2527,2528],{"class":1052,"line":1294},[1050,2529,2530],{"class":1056},"        # Join room group\n",[1050,2532,2533,2536,2538,2540,2543,2545,2548],{"class":1052,"line":1308},[1050,2534,2535],{"class":1694},"        await",[1050,2537,2375],{"class":1082},[1050,2539,1710],{"class":1086},[1050,2541,2542],{"class":1794},"channel_layer",[1050,2544,1710],{"class":1086},[1050,2546,2547],{"class":1814},"group_add",[1050,2549,1925],{"class":1086},[1050,2551,2552,2555,2557,2559],{"class":1052,"line":1341},[1050,2553,2554],{"class":1082},"            self",[1050,2556,1710],{"class":1086},[1050,2558,2419],{"class":1794},[1050,2560,1107],{"class":1086},[1050,2562,2563,2565,2567],{"class":1052,"line":1361},[1050,2564,2554],{"class":1082},[1050,2566,1710],{"class":1086},[1050,2568,2569],{"class":1794},"channel_name\n",[1050,2571,2572],{"class":1052,"line":1381},[1050,2573,1964],{"class":1086},[1050,2575,2576],{"class":1052,"line":1387},[1050,2577,2474],{"class":1698},[1050,2579,2580],{"class":1052,"line":1393},[1050,2581,2582],{"class":1056},"        # Accept WebSocket connection\n",[1050,2584,2585,2587,2589,2591,2594],{"class":1052,"line":1399},[1050,2586,2535],{"class":1694},[1050,2588,2375],{"class":1082},[1050,2590,1710],{"class":1086},[1050,2592,2593],{"class":1814},"accept",[1050,2595,1860],{"class":1086},[1050,2597,2598],{"class":1052,"line":1404},[1050,2599,2474],{"class":1698},[1050,2601,2602],{"class":1052,"line":1410},[1050,2603,2604],{"class":1056},"        # Notify room about user joining\n",[1050,2606,2607,2609,2611,2613,2615,2617,2620],{"class":1052,"line":1419},[1050,2608,2535],{"class":1694},[1050,2610,2375],{"class":1082},[1050,2612,1710],{"class":1086},[1050,2614,2542],{"class":1794},[1050,2616,1710],{"class":1086},[1050,2618,2619],{"class":1814},"group_send",[1050,2621,1925],{"class":1086},[1050,2623,2624,2626,2628,2630],{"class":1052,"line":1432},[1050,2625,2554],{"class":1082},[1050,2627,1710],{"class":1086},[1050,2629,2419],{"class":1794},[1050,2631,1107],{"class":1086},[1050,2633,2634],{"class":1052,"line":1451},[1050,2635,2636],{"class":1086},"            {\n",[1050,2638,2639,2642,2645,2647,2649,2651,2654,2656],{"class":1052,"line":1464},[1050,2640,2641],{"class":1096},"                '",[1050,2643,2644],{"class":1100},"type",[1050,2646,1104],{"class":1096},[1050,2648,1267],{"class":1086},[1050,2650,1226],{"class":1096},[1050,2652,2653],{"class":1100},"user_joined",[1050,2655,1104],{"class":1096},[1050,2657,1107],{"class":1086},[1050,2659,2660,2662,2664,2666,2668,2670,2672,2674,2676,2679],{"class":1052,"line":1477},[1050,2661,2641],{"class":1096},[1050,2663,2451],{"class":1100},[1050,2665,1104],{"class":1096},[1050,2667,1267],{"class":1086},[1050,2669,2375],{"class":1082},[1050,2671,1710],{"class":1086},[1050,2673,2451],{"class":1794},[1050,2675,1710],{"class":1086},[1050,2677,2678],{"class":1794},"username",[1050,2680,1107],{"class":1086},[1050,2682,2683,2685,2688,2690,2692,2694,2696,2698,2700,2702,2704,2706,2708,2710],{"class":1052,"line":1483},[1050,2684,2641],{"class":1096},[1050,2686,2687],{"class":1100},"message",[1050,2689,1104],{"class":1096},[1050,2691,1267],{"class":1086},[1050,2693,2424],{"class":2128},[1050,2695,1104],{"class":1100},[1050,2697,2431],{"class":2430},[1050,2699,2348],{"class":1082},[1050,2701,1710],{"class":1086},[1050,2703,2451],{"class":1794},[1050,2705,1710],{"class":1086},[1050,2707,2678],{"class":1794},[1050,2709,2440],{"class":2430},[1050,2711,2712],{"class":1100}," joined the room'\n",[1050,2714,2715],{"class":1052,"line":1498},[1050,2716,2717],{"class":1086},"            }\n",[1050,2719,2720],{"class":1052,"line":1519},[1050,2721,1964],{"class":1086},[1050,2723,2724],{"class":1052,"line":1537},[1050,2725,2474],{"class":1698},[1050,2727,2728],{"class":1052,"line":1555},[1050,2729,2730],{"class":1056},"        # Send recent messages to newly connected user\n",[1050,2732,2733,2735,2737,2739,2742],{"class":1052,"line":1561},[1050,2734,2535],{"class":1694},[1050,2736,2375],{"class":1082},[1050,2738,1710],{"class":1086},[1050,2740,2741],{"class":1814},"send_recent_messages",[1050,2743,1860],{"class":1086},[1050,2745,2746],{"class":1052,"line":1582},[1050,2747,1903],{"class":1698},[1050,2749,2750,2752,2754,2757,2759,2761,2763,2767],{"class":1052,"line":1599},[1050,2751,2335],{"class":2128},[1050,2753,2338],{"class":2128},[1050,2755,2756],{"class":2341}," disconnect",[1050,2758,1818],{"class":1086},[1050,2760,2348],{"class":2347},[1050,2762,1180],{"class":1086},[1050,2764,2766],{"class":2765},"sCyAa"," close_code",[1050,2768,2313],{"class":1086},[1050,2770,2771,2773,2776],{"class":1052,"line":1605},[1050,2772,2355],{"class":2318},[1050,2774,2775],{"class":2322},"Handle WebSocket disconnection.",[1050,2777,2326],{"class":2318},[1050,2779,2780,2782,2786,2788,2790,2792,2794,2796,2798],{"class":1052,"line":1611},[1050,2781,2484],{"class":1694},[1050,2783,2785],{"class":2784},"sJdAF"," hasattr",[1050,2787,1818],{"class":1086},[1050,2789,2348],{"class":1082},[1050,2791,1180],{"class":1086},[1050,2793,1226],{"class":1096},[1050,2795,2419],{"class":1100},[1050,2797,1104],{"class":1096},[1050,2799,2313],{"class":1086},[1050,2801,2802],{"class":1052,"line":1627},[1050,2803,2804],{"class":1056},"            # Notify room about user leaving\n",[1050,2806,2807,2809,2811,2813,2815,2817,2819],{"class":1052,"line":1643},[1050,2808,2507],{"class":1694},[1050,2810,2375],{"class":1082},[1050,2812,1710],{"class":1086},[1050,2814,2542],{"class":1794},[1050,2816,1710],{"class":1086},[1050,2818,2619],{"class":1814},[1050,2820,1925],{"class":1086},[1050,2822,2823,2826,2828,2830],{"class":1052,"line":1663},[1050,2824,2825],{"class":1082},"                self",[1050,2827,1710],{"class":1086},[1050,2829,2419],{"class":1794},[1050,2831,1107],{"class":1086},[1050,2833,2834],{"class":1052,"line":1668},[1050,2835,1480],{"class":1086},[1050,2837,2838,2840,2842,2844,2846,2848,2851,2853],{"class":1052,"line":1673},[1050,2839,1486],{"class":1096},[1050,2841,2644],{"class":1100},[1050,2843,1104],{"class":1096},[1050,2845,1267],{"class":1086},[1050,2847,1226],{"class":1096},[1050,2849,2850],{"class":1100},"user_left",[1050,2852,1104],{"class":1096},[1050,2854,1107],{"class":1086},[1050,2856,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876],{"class":1052,"line":2857},53,[1050,2859,1486],{"class":1096},[1050,2861,2451],{"class":1100},[1050,2863,1104],{"class":1096},[1050,2865,1267],{"class":1086},[1050,2867,2375],{"class":1082},[1050,2869,1710],{"class":1086},[1050,2871,2451],{"class":1794},[1050,2873,1710],{"class":1086},[1050,2875,2678],{"class":1794},[1050,2877,1107],{"class":1086},[1050,2879,2881,2883,2885,2887,2889,2891,2893,2895,2897,2899,2901,2903,2905,2907],{"class":1052,"line":2880},54,[1050,2882,1486],{"class":1096},[1050,2884,2687],{"class":1100},[1050,2886,1104],{"class":1096},[1050,2888,1267],{"class":1086},[1050,2890,2424],{"class":2128},[1050,2892,1104],{"class":1100},[1050,2894,2431],{"class":2430},[1050,2896,2348],{"class":1082},[1050,2898,1710],{"class":1086},[1050,2900,2451],{"class":1794},[1050,2902,1710],{"class":1086},[1050,2904,2678],{"class":1794},[1050,2906,2440],{"class":2430},[1050,2908,2909],{"class":1100}," left the room'\n",[1050,2911,2913],{"class":1052,"line":2912},55,[1050,2914,1602],{"class":1086},[1050,2916,2918],{"class":1052,"line":2917},56,[1050,2919,1959],{"class":1086},[1050,2921,2923],{"class":1052,"line":2922},57,[1050,2924,2925],{"class":1698},"            \n",[1050,2927,2929],{"class":1052,"line":2928},58,[1050,2930,2931],{"class":1056},"            # Leave room group\n",[1050,2933,2935,2937,2939,2941,2943,2945,2948],{"class":1052,"line":2934},59,[1050,2936,2507],{"class":1694},[1050,2938,2375],{"class":1082},[1050,2940,1710],{"class":1086},[1050,2942,2542],{"class":1794},[1050,2944,1710],{"class":1086},[1050,2946,2947],{"class":1814},"group_discard",[1050,2949,1925],{"class":1086},[1050,2951,2953,2955,2957,2959],{"class":1052,"line":2952},60,[1050,2954,2825],{"class":1082},[1050,2956,1710],{"class":1086},[1050,2958,2419],{"class":1794},[1050,2960,1107],{"class":1086},[1050,2962,2964,2966,2968],{"class":1052,"line":2963},61,[1050,2965,2825],{"class":1082},[1050,2967,1710],{"class":1086},[1050,2969,2569],{"class":1794},[1050,2971,2973],{"class":1052,"line":2972},62,[1050,2974,1959],{"class":1086},[1050,2976,2978],{"class":1052,"line":2977},63,[1050,2979,1903],{"class":1698},[1050,2981,2983,2985,2987,2990,2992,2994,2996,2999],{"class":1052,"line":2982},64,[1050,2984,2335],{"class":2128},[1050,2986,2338],{"class":2128},[1050,2988,2989],{"class":2341}," receive",[1050,2991,1818],{"class":1086},[1050,2993,2348],{"class":2347},[1050,2995,1180],{"class":1086},[1050,2997,2998],{"class":2765}," text_data",[1050,3000,2313],{"class":1086},[1050,3002,3004,3006,3009],{"class":1052,"line":3003},65,[1050,3005,2355],{"class":2318},[1050,3007,3008],{"class":2322},"Handle messages from WebSocket.",[1050,3010,2326],{"class":2318},[1050,3012,3014,3017],{"class":1052,"line":3013},66,[1050,3015,3016],{"class":1694},"        try",[1050,3018,2502],{"class":1086},[1050,3020,3022,3025,3027,3030,3032,3035,3037,3040],{"class":1052,"line":3021},67,[1050,3023,3024],{"class":1698},"            text_data_json ",[1050,3026,1854],{"class":1086},[1050,3028,3029],{"class":1698}," json",[1050,3031,1710],{"class":1086},[1050,3033,3034],{"class":1814},"loads",[1050,3036,1818],{"class":1086},[1050,3038,3039],{"class":1814},"text_data",[1050,3041,1837],{"class":1086},[1050,3043,3045,3048,3050,3053,3055,3058,3060,3062,3064,3066,3068,3070,3072,3074],{"class":1052,"line":3044},68,[1050,3046,3047],{"class":1698},"            message_type ",[1050,3049,1854],{"class":1086},[1050,3051,3052],{"class":1698}," text_data_json",[1050,3054,1710],{"class":1086},[1050,3056,3057],{"class":1814},"get",[1050,3059,1818],{"class":1086},[1050,3061,1104],{"class":1096},[1050,3063,2644],{"class":1100},[1050,3065,1104],{"class":1096},[1050,3067,1180],{"class":1086},[1050,3069,1226],{"class":1096},[1050,3071,2687],{"class":1100},[1050,3073,1104],{"class":1096},[1050,3075,1837],{"class":1086},[1050,3077,3079],{"class":1052,"line":3078},69,[1050,3080,2925],{"class":1698},[1050,3082,3084,3087,3090,3093,3095,3097,3099],{"class":1052,"line":3083},70,[1050,3085,3086],{"class":1694},"            if",[1050,3088,3089],{"class":1698}," message_type ",[1050,3091,3092],{"class":2487},"==",[1050,3094,1226],{"class":1096},[1050,3096,2687],{"class":1100},[1050,3098,1104],{"class":1096},[1050,3100,2502],{"class":1086},[1050,3102,3104,3107,3109,3111,3114,3116,3119],{"class":1052,"line":3103},71,[1050,3105,3106],{"class":1694},"                await",[1050,3108,2375],{"class":1082},[1050,3110,1710],{"class":1086},[1050,3112,3113],{"class":1814},"handle_chat_message",[1050,3115,1818],{"class":1086},[1050,3117,3118],{"class":1814},"text_data_json",[1050,3120,1837],{"class":1086},[1050,3122,3124,3127,3129,3131,3133,3136,3138],{"class":1052,"line":3123},72,[1050,3125,3126],{"class":1694},"            elif",[1050,3128,3089],{"class":1698},[1050,3130,3092],{"class":2487},[1050,3132,1226],{"class":1096},[1050,3134,3135],{"class":1100},"typing",[1050,3137,1104],{"class":1096},[1050,3139,2502],{"class":1086},[1050,3141,3143,3145,3147,3149,3152,3154,3156],{"class":1052,"line":3142},73,[1050,3144,3106],{"class":1694},[1050,3146,2375],{"class":1082},[1050,3148,1710],{"class":1086},[1050,3150,3151],{"class":1814},"handle_typing_indicator",[1050,3153,1818],{"class":1086},[1050,3155,3118],{"class":1814},[1050,3157,1837],{"class":1086},[1050,3159,3161,3163,3165,3167,3169,3172,3174],{"class":1052,"line":3160},74,[1050,3162,3126],{"class":1694},[1050,3164,3089],{"class":1698},[1050,3166,3092],{"class":2487},[1050,3168,1226],{"class":1096},[1050,3170,3171],{"class":1100},"ping",[1050,3173,1104],{"class":1096},[1050,3175,2502],{"class":1086},[1050,3177,3179,3181,3183,3185,3188],{"class":1052,"line":3178},75,[1050,3180,3106],{"class":1694},[1050,3182,2375],{"class":1082},[1050,3184,1710],{"class":1086},[1050,3186,3187],{"class":1814},"handle_ping",[1050,3189,1860],{"class":1086},[1050,3191,3193,3196],{"class":1052,"line":3192},76,[1050,3194,3195],{"class":1694},"            else",[1050,3197,2502],{"class":1086},[1050,3199,3201,3203,3205,3207,3210,3212,3214,3217,3219],{"class":1052,"line":3200},77,[1050,3202,3106],{"class":1694},[1050,3204,2375],{"class":1082},[1050,3206,1710],{"class":1086},[1050,3208,3209],{"class":1814},"send_error",[1050,3211,1818],{"class":1086},[1050,3213,1104],{"class":1096},[1050,3215,3216],{"class":1100},"Unknown message type",[1050,3218,1104],{"class":1096},[1050,3220,1837],{"class":1086},[1050,3222,3224],{"class":1052,"line":3223},78,[1050,3225,2474],{"class":1698},[1050,3227,3229,3232,3234,3236,3239],{"class":1052,"line":3228},79,[1050,3230,3231],{"class":1694},"        except",[1050,3233,3029],{"class":1698},[1050,3235,1710],{"class":1086},[1050,3237,3238],{"class":1794},"JSONDecodeError",[1050,3240,2502],{"class":1086},[1050,3242,3244,3246,3248,3250,3252,3254,3256,3259,3261],{"class":1052,"line":3243},80,[1050,3245,2507],{"class":1694},[1050,3247,2375],{"class":1082},[1050,3249,1710],{"class":1086},[1050,3251,3209],{"class":1814},[1050,3253,1818],{"class":1086},[1050,3255,1104],{"class":1096},[1050,3257,3258],{"class":1100},"Invalid JSON",[1050,3260,1104],{"class":1096},[1050,3262,1837],{"class":1086},[1050,3264,3266,3268,3272,3275,3278],{"class":1052,"line":3265},81,[1050,3267,3231],{"class":1694},[1050,3269,3271],{"class":3270},"sa2tF"," Exception",[1050,3273,3274],{"class":1694}," as",[1050,3276,3277],{"class":1698}," e",[1050,3279,2502],{"class":1086},[1050,3281,3283,3285,3287,3289,3291,3293,3296,3299,3301,3304,3306,3309,3311,3313,3315],{"class":1052,"line":3282},82,[1050,3284,2507],{"class":1694},[1050,3286,2375],{"class":1082},[1050,3288,1710],{"class":1086},[1050,3290,3209],{"class":1814},[1050,3292,1818],{"class":1086},[1050,3294,3295],{"class":2128},"f",[1050,3297,3298],{"class":1100},"'Error processing message: ",[1050,3300,2431],{"class":2430},[1050,3302,3303],{"class":3270},"str",[1050,3305,1818],{"class":1086},[1050,3307,3308],{"class":1814},"e",[1050,3310,2152],{"class":1086},[1050,3312,2440],{"class":2430},[1050,3314,1104],{"class":1100},[1050,3316,1837],{"class":1086},[1050,3318,3320],{"class":1052,"line":3319},83,[1050,3321,1903],{"class":1698},[1050,3323,3325,3327,3329,3332,3334,3336,3338,3341],{"class":1052,"line":3324},84,[1050,3326,2335],{"class":2128},[1050,3328,2338],{"class":2128},[1050,3330,3331],{"class":2341}," handle_chat_message",[1050,3333,1818],{"class":1086},[1050,3335,2348],{"class":2347},[1050,3337,1180],{"class":1086},[1050,3339,3340],{"class":2765}," data",[1050,3342,2313],{"class":1086},[1050,3344,3346,3348,3351],{"class":1052,"line":3345},85,[1050,3347,2355],{"class":2318},[1050,3349,3350],{"class":2322},"Handle chat message.",[1050,3352,2326],{"class":2318},[1050,3354,3356,3359,3361,3363,3365,3367,3369,3371,3373,3375,3377,3380,3383,3386],{"class":1052,"line":3355},86,[1050,3357,3358],{"class":1698},"        message_content ",[1050,3360,1854],{"class":1086},[1050,3362,3340],{"class":1698},[1050,3364,1710],{"class":1086},[1050,3366,3057],{"class":1814},[1050,3368,1818],{"class":1086},[1050,3370,1104],{"class":1096},[1050,3372,2687],{"class":1100},[1050,3374,1104],{"class":1096},[1050,3376,1180],{"class":1086},[1050,3378,3379],{"class":1096}," ''",[1050,3381,3382],{"class":1086},").",[1050,3384,3385],{"class":1814},"strip",[1050,3387,1860],{"class":1086},[1050,3389,3391],{"class":1052,"line":3390},87,[1050,3392,2474],{"class":1698},[1050,3394,3396,3398,3400,3403],{"class":1052,"line":3395},88,[1050,3397,2484],{"class":1694},[1050,3399,2488],{"class":2487},[1050,3401,3402],{"class":1698}," message_content",[1050,3404,2502],{"class":1086},[1050,3406,3408,3410,3412,3414,3416,3418,3420,3423,3425],{"class":1052,"line":3407},89,[1050,3409,2507],{"class":1694},[1050,3411,2375],{"class":1082},[1050,3413,1710],{"class":1086},[1050,3415,3209],{"class":1814},[1050,3417,1818],{"class":1086},[1050,3419,1104],{"class":1096},[1050,3421,3422],{"class":1100},"Empty message",[1050,3424,1104],{"class":1096},[1050,3426,1837],{"class":1086},[1050,3428,3430],{"class":1052,"line":3429},90,[1050,3431,2521],{"class":1694},[1050,3433,3435],{"class":1052,"line":3434},91,[1050,3436,2474],{"class":1698},[1050,3438,3440],{"class":1052,"line":3439},92,[1050,3441,3442],{"class":1056},"        # Save message to database\n",[1050,3444,3446,3449,3451,3454,3456,3458,3461,3463,3466],{"class":1052,"line":3445},93,[1050,3447,3448],{"class":1698},"        message ",[1050,3450,1854],{"class":1086},[1050,3452,3453],{"class":1694}," await",[1050,3455,2375],{"class":1082},[1050,3457,1710],{"class":1086},[1050,3459,3460],{"class":1814},"save_message",[1050,3462,1818],{"class":1086},[1050,3464,3465],{"class":1814},"message_content",[1050,3467,1837],{"class":1086},[1050,3469,3471],{"class":1052,"line":3470},94,[1050,3472,2474],{"class":1698},[1050,3474,3476,3478,3481],{"class":1052,"line":3475},95,[1050,3477,2484],{"class":1694},[1050,3479,3480],{"class":1698}," message",[1050,3482,2502],{"class":1086},[1050,3484,3486],{"class":1052,"line":3485},96,[1050,3487,3488],{"class":1056},"            # Send message to room group\n",[1050,3490,3492,3494,3496,3498,3500,3502,3504],{"class":1052,"line":3491},97,[1050,3493,2507],{"class":1694},[1050,3495,2375],{"class":1082},[1050,3497,1710],{"class":1086},[1050,3499,2542],{"class":1794},[1050,3501,1710],{"class":1086},[1050,3503,2619],{"class":1814},[1050,3505,1925],{"class":1086},[1050,3507,3509,3511,3513,3515],{"class":1052,"line":3508},98,[1050,3510,2825],{"class":1082},[1050,3512,1710],{"class":1086},[1050,3514,2419],{"class":1794},[1050,3516,1107],{"class":1086},[1050,3518,3520],{"class":1052,"line":3519},99,[1050,3521,1480],{"class":1086},[1050,3523,3525,3527,3529,3531,3533,3535,3538,3540],{"class":1052,"line":3524},100,[1050,3526,1486],{"class":1096},[1050,3528,2644],{"class":1100},[1050,3530,1104],{"class":1096},[1050,3532,1267],{"class":1086},[1050,3534,1226],{"class":1096},[1050,3536,3537],{"class":1100},"chat_message",[1050,3539,1104],{"class":1096},[1050,3541,1107],{"class":1086},[1050,3543,3545,3547,3549,3551,3553,3555],{"class":1052,"line":3544},101,[1050,3546,1486],{"class":1096},[1050,3548,2687],{"class":1100},[1050,3550,1104],{"class":1096},[1050,3552,1267],{"class":1086},[1050,3554,3402],{"class":1814},[1050,3556,1107],{"class":1086},[1050,3558,3560,3562,3564,3566,3568,3570,3572,3574,3576,3578],{"class":1052,"line":3559},102,[1050,3561,1486],{"class":1096},[1050,3563,2451],{"class":1100},[1050,3565,1104],{"class":1096},[1050,3567,1267],{"class":1086},[1050,3569,2375],{"class":1082},[1050,3571,1710],{"class":1086},[1050,3573,2451],{"class":1794},[1050,3575,1710],{"class":1086},[1050,3577,2678],{"class":1794},[1050,3579,1107],{"class":1086},[1050,3581,3583,3585,3588,3590,3592,3594,3596,3598,3600,3603],{"class":1052,"line":3582},103,[1050,3584,1486],{"class":1096},[1050,3586,3587],{"class":1100},"user_id",[1050,3589,1104],{"class":1096},[1050,3591,1267],{"class":1086},[1050,3593,2375],{"class":1082},[1050,3595,1710],{"class":1086},[1050,3597,2451],{"class":1794},[1050,3599,1710],{"class":1086},[1050,3601,3602],{"class":1794},"id",[1050,3604,1107],{"class":1086},[1050,3606,3608,3610,3613,3615,3617,3619,3621,3624,3626,3629],{"class":1052,"line":3607},104,[1050,3609,1486],{"class":1096},[1050,3611,3612],{"class":1100},"timestamp",[1050,3614,1104],{"class":1096},[1050,3616,1267],{"class":1086},[1050,3618,3480],{"class":1814},[1050,3620,1710],{"class":1086},[1050,3622,3623],{"class":1794},"created_at",[1050,3625,1710],{"class":1086},[1050,3627,3628],{"class":1814},"isoformat",[1050,3630,3631],{"class":1086},"(),\n",[1050,3633,3635,3637,3640,3642,3644,3646,3648],{"class":1052,"line":3634},105,[1050,3636,1486],{"class":1096},[1050,3638,3639],{"class":1100},"message_id",[1050,3641,1104],{"class":1096},[1050,3643,1267],{"class":1086},[1050,3645,3480],{"class":1814},[1050,3647,1710],{"class":1086},[1050,3649,3650],{"class":1794},"id\n",[1050,3652,3654],{"class":1052,"line":3653},106,[1050,3655,1602],{"class":1086},[1050,3657,3659],{"class":1052,"line":3658},107,[1050,3660,1959],{"class":1086},[1050,3662,3664],{"class":1052,"line":3663},108,[1050,3665,1903],{"class":1698},[1050,3667,3669,3671,3673,3676,3678,3680,3682,3684],{"class":1052,"line":3668},109,[1050,3670,2335],{"class":2128},[1050,3672,2338],{"class":2128},[1050,3674,3675],{"class":2341}," handle_typing_indicator",[1050,3677,1818],{"class":1086},[1050,3679,2348],{"class":2347},[1050,3681,1180],{"class":1086},[1050,3683,3340],{"class":2765},[1050,3685,2313],{"class":1086},[1050,3687,3689,3691,3694],{"class":1052,"line":3688},110,[1050,3690,2355],{"class":2318},[1050,3692,3693],{"class":2322},"Handle typing indicator.",[1050,3695,2326],{"class":2318},[1050,3697,3699,3702,3704,3706,3708,3710,3712,3714,3717,3719,3721,3725],{"class":1052,"line":3698},111,[1050,3700,3701],{"class":1698},"        is_typing ",[1050,3703,1854],{"class":1086},[1050,3705,3340],{"class":1698},[1050,3707,1710],{"class":1086},[1050,3709,3057],{"class":1814},[1050,3711,1818],{"class":1086},[1050,3713,1104],{"class":1096},[1050,3715,3716],{"class":1100},"is_typing",[1050,3718,1104],{"class":1096},[1050,3720,1180],{"class":1086},[1050,3722,3724],{"class":3723},"s8XtY"," False",[1050,3726,1837],{"class":1086},[1050,3728,3730],{"class":1052,"line":3729},112,[1050,3731,2474],{"class":1698},[1050,3733,3735],{"class":1052,"line":3734},113,[1050,3736,3737],{"class":1056},"        # Send typing indicator to room group (excluding sender)\n",[1050,3739,3741,3743,3745,3747,3749,3751,3753],{"class":1052,"line":3740},114,[1050,3742,2535],{"class":1694},[1050,3744,2375],{"class":1082},[1050,3746,1710],{"class":1086},[1050,3748,2542],{"class":1794},[1050,3750,1710],{"class":1086},[1050,3752,2619],{"class":1814},[1050,3754,1925],{"class":1086},[1050,3756,3758,3760,3762,3764],{"class":1052,"line":3757},115,[1050,3759,2554],{"class":1082},[1050,3761,1710],{"class":1086},[1050,3763,2419],{"class":1794},[1050,3765,1107],{"class":1086},[1050,3767,3769],{"class":1052,"line":3768},116,[1050,3770,2636],{"class":1086},[1050,3772,3774,3776,3778,3780,3782,3784,3787,3789],{"class":1052,"line":3773},117,[1050,3775,2641],{"class":1096},[1050,3777,2644],{"class":1100},[1050,3779,1104],{"class":1096},[1050,3781,1267],{"class":1086},[1050,3783,1226],{"class":1096},[1050,3785,3786],{"class":1100},"typing_indicator",[1050,3788,1104],{"class":1096},[1050,3790,1107],{"class":1086},[1050,3792,3794,3796,3798,3800,3802,3804,3806,3808,3810,3812],{"class":1052,"line":3793},118,[1050,3795,2641],{"class":1096},[1050,3797,2451],{"class":1100},[1050,3799,1104],{"class":1096},[1050,3801,1267],{"class":1086},[1050,3803,2375],{"class":1082},[1050,3805,1710],{"class":1086},[1050,3807,2451],{"class":1794},[1050,3809,1710],{"class":1086},[1050,3811,2678],{"class":1794},[1050,3813,1107],{"class":1086},[1050,3815,3817,3819,3821,3823,3825,3827,3829,3831,3833,3835],{"class":1052,"line":3816},119,[1050,3818,2641],{"class":1096},[1050,3820,3587],{"class":1100},[1050,3822,1104],{"class":1096},[1050,3824,1267],{"class":1086},[1050,3826,2375],{"class":1082},[1050,3828,1710],{"class":1086},[1050,3830,2451],{"class":1794},[1050,3832,1710],{"class":1086},[1050,3834,3602],{"class":1794},[1050,3836,1107],{"class":1086},[1050,3838,3840,3842,3844,3846,3848],{"class":1052,"line":3839},120,[1050,3841,2641],{"class":1096},[1050,3843,3716],{"class":1100},[1050,3845,1104],{"class":1096},[1050,3847,1267],{"class":1086},[1050,3849,3850],{"class":1814}," is_typing\n",[1050,3852,3854],{"class":1052,"line":3853},121,[1050,3855,2717],{"class":1086},[1050,3857,3859],{"class":1052,"line":3858},122,[1050,3860,1964],{"class":1086},[1050,3862,3864],{"class":1052,"line":3863},123,[1050,3865,1903],{"class":1698},[1050,3867,3869,3871,3873,3876,3878,3880],{"class":1052,"line":3868},124,[1050,3870,2335],{"class":2128},[1050,3872,2338],{"class":2128},[1050,3874,3875],{"class":2341}," handle_ping",[1050,3877,1818],{"class":1086},[1050,3879,2348],{"class":2347},[1050,3881,2313],{"class":1086},[1050,3883,3885,3887,3890],{"class":1052,"line":3884},125,[1050,3886,2355],{"class":2318},[1050,3888,3889],{"class":2322},"Handle ping message for connection keepalive.",[1050,3891,2326],{"class":2318},[1050,3893,3895,3897,3899,3901,3904,3906,3909,3911,3914,3916,3919],{"class":1052,"line":3894},126,[1050,3896,2535],{"class":1694},[1050,3898,2375],{"class":1082},[1050,3900,1710],{"class":1086},[1050,3902,3903],{"class":1814},"send",[1050,3905,1818],{"class":1086},[1050,3907,3039],{"class":3908},"sqOPj",[1050,3910,1854],{"class":1086},[1050,3912,3913],{"class":1814},"json",[1050,3915,1710],{"class":1086},[1050,3917,3918],{"class":1814},"dumps",[1050,3920,1876],{"class":1086},[1050,3922,3924,3927,3929,3931,3933,3935,3938,3940],{"class":1052,"line":3923},127,[1050,3925,3926],{"class":1096},"            '",[1050,3928,2644],{"class":1100},[1050,3930,1104],{"class":1096},[1050,3932,1267],{"class":1086},[1050,3934,1226],{"class":1096},[1050,3936,3937],{"class":1100},"pong",[1050,3939,1104],{"class":1096},[1050,3941,1107],{"class":1086},[1050,3943,3945,3947,3949,3951,3953,3956,3958,3961,3964,3967],{"class":1052,"line":3944},128,[1050,3946,3926],{"class":1096},[1050,3948,3612],{"class":1100},[1050,3950,1104],{"class":1096},[1050,3952,1267],{"class":1086},[1050,3954,3955],{"class":1814}," asyncio",[1050,3957,1710],{"class":1086},[1050,3959,3960],{"class":1814},"get_event_loop",[1050,3962,3963],{"class":1086},"().",[1050,3965,3966],{"class":1814},"time",[1050,3968,1860],{"class":1086},[1050,3970,3972],{"class":1052,"line":3971},129,[1050,3973,3974],{"class":1086},"        }))\n",[1050,3976,3978],{"class":1052,"line":3977},130,[1050,3979,1903],{"class":1698},[1050,3981,3983],{"class":1052,"line":3982},131,[1050,3984,3985],{"class":1056},"    # Group message handlers\n",[1050,3987,3989,3991,3993,3996,3998,4000,4002,4005],{"class":1052,"line":3988},132,[1050,3990,2335],{"class":2128},[1050,3992,2338],{"class":2128},[1050,3994,3995],{"class":2341}," chat_message",[1050,3997,1818],{"class":1086},[1050,3999,2348],{"class":2347},[1050,4001,1180],{"class":1086},[1050,4003,4004],{"class":2765}," event",[1050,4006,2313],{"class":1086},[1050,4008,4010,4012,4015],{"class":1052,"line":4009},133,[1050,4011,2355],{"class":2318},[1050,4013,4014],{"class":2322},"Send chat message to WebSocket.",[1050,4016,2326],{"class":2318},[1050,4018,4020,4022,4024,4026,4028,4030,4032,4034,4036,4038,4040],{"class":1052,"line":4019},134,[1050,4021,2535],{"class":1694},[1050,4023,2375],{"class":1082},[1050,4025,1710],{"class":1086},[1050,4027,3903],{"class":1814},[1050,4029,1818],{"class":1086},[1050,4031,3039],{"class":3908},[1050,4033,1854],{"class":1086},[1050,4035,3913],{"class":1814},[1050,4037,1710],{"class":1086},[1050,4039,3918],{"class":1814},[1050,4041,1876],{"class":1086},[1050,4043,4045,4047,4049,4051,4053,4055,4057,4059],{"class":1052,"line":4044},135,[1050,4046,3926],{"class":1096},[1050,4048,2644],{"class":1100},[1050,4050,1104],{"class":1096},[1050,4052,1267],{"class":1086},[1050,4054,1226],{"class":1096},[1050,4056,2687],{"class":1100},[1050,4058,1104],{"class":1096},[1050,4060,1107],{"class":1086},[1050,4062,4064,4066,4068,4070,4072,4074,4076,4078,4080,4082],{"class":1052,"line":4063},136,[1050,4065,3926],{"class":1096},[1050,4067,2687],{"class":1100},[1050,4069,1104],{"class":1096},[1050,4071,1267],{"class":1086},[1050,4073,4004],{"class":1814},[1050,4075,2383],{"class":1086},[1050,4077,1104],{"class":1096},[1050,4079,2687],{"class":1100},[1050,4081,1104],{"class":1096},[1050,4083,4084],{"class":1086},"],\n",[1050,4086,4088,4090,4092,4094,4096,4098,4100,4102,4104,4106],{"class":1052,"line":4087},137,[1050,4089,3926],{"class":1096},[1050,4091,2451],{"class":1100},[1050,4093,1104],{"class":1096},[1050,4095,1267],{"class":1086},[1050,4097,4004],{"class":1814},[1050,4099,2383],{"class":1086},[1050,4101,1104],{"class":1096},[1050,4103,2451],{"class":1100},[1050,4105,1104],{"class":1096},[1050,4107,4084],{"class":1086},[1050,4109,4111,4113,4115,4117,4119,4121,4123,4125,4127,4129],{"class":1052,"line":4110},138,[1050,4112,3926],{"class":1096},[1050,4114,3587],{"class":1100},[1050,4116,1104],{"class":1096},[1050,4118,1267],{"class":1086},[1050,4120,4004],{"class":1814},[1050,4122,2383],{"class":1086},[1050,4124,1104],{"class":1096},[1050,4126,3587],{"class":1100},[1050,4128,1104],{"class":1096},[1050,4130,4084],{"class":1086},[1050,4132,4134,4136,4138,4140,4142,4144,4146,4148,4150,4152],{"class":1052,"line":4133},139,[1050,4135,3926],{"class":1096},[1050,4137,3612],{"class":1100},[1050,4139,1104],{"class":1096},[1050,4141,1267],{"class":1086},[1050,4143,4004],{"class":1814},[1050,4145,2383],{"class":1086},[1050,4147,1104],{"class":1096},[1050,4149,3612],{"class":1100},[1050,4151,1104],{"class":1096},[1050,4153,4084],{"class":1086},[1050,4155,4157,4159,4161,4163,4165,4167,4169,4171,4173,4175],{"class":1052,"line":4156},140,[1050,4158,3926],{"class":1096},[1050,4160,3639],{"class":1100},[1050,4162,1104],{"class":1096},[1050,4164,1267],{"class":1086},[1050,4166,4004],{"class":1814},[1050,4168,2383],{"class":1086},[1050,4170,1104],{"class":1096},[1050,4172,3639],{"class":1100},[1050,4174,1104],{"class":1096},[1050,4176,1204],{"class":1086},[1050,4178,4180],{"class":1052,"line":4179},141,[1050,4181,3974],{"class":1086},[1050,4183,4185],{"class":1052,"line":4184},142,[1050,4186,1903],{"class":1698},[1050,4188,4190,4192,4194,4197,4199,4201,4203,4205],{"class":1052,"line":4189},143,[1050,4191,2335],{"class":2128},[1050,4193,2338],{"class":2128},[1050,4195,4196],{"class":2341}," user_joined",[1050,4198,1818],{"class":1086},[1050,4200,2348],{"class":2347},[1050,4202,1180],{"class":1086},[1050,4204,4004],{"class":2765},[1050,4206,2313],{"class":1086},[1050,4208,4210,4212,4215],{"class":1052,"line":4209},144,[1050,4211,2355],{"class":2318},[1050,4213,4214],{"class":2322},"Send user joined notification to WebSocket.",[1050,4216,2326],{"class":2318},[1050,4218,4220],{"class":1052,"line":4219},145,[1050,4221,4222],{"class":1056},"        # Don't send to the user who joined\n",[1050,4224,4226,4228,4230,4232,4234,4236,4238,4241,4244,4246,4248,4250,4252,4254],{"class":1052,"line":4225},146,[1050,4227,2484],{"class":1694},[1050,4229,4004],{"class":1698},[1050,4231,2383],{"class":1086},[1050,4233,1104],{"class":1096},[1050,4235,2451],{"class":1100},[1050,4237,1104],{"class":1096},[1050,4239,4240],{"class":1086},"]",[1050,4242,4243],{"class":2487}," !=",[1050,4245,2375],{"class":1082},[1050,4247,1710],{"class":1086},[1050,4249,2451],{"class":1794},[1050,4251,1710],{"class":1086},[1050,4253,2678],{"class":1794},[1050,4255,2502],{"class":1086},[1050,4257,4259,4261,4263,4265,4267,4269,4271,4273,4275,4277,4279],{"class":1052,"line":4258},147,[1050,4260,2507],{"class":1694},[1050,4262,2375],{"class":1082},[1050,4264,1710],{"class":1086},[1050,4266,3903],{"class":1814},[1050,4268,1818],{"class":1086},[1050,4270,3039],{"class":3908},[1050,4272,1854],{"class":1086},[1050,4274,3913],{"class":1814},[1050,4276,1710],{"class":1086},[1050,4278,3918],{"class":1814},[1050,4280,1876],{"class":1086},[1050,4282,4284,4286,4288,4290,4292,4294,4296,4298],{"class":1052,"line":4283},148,[1050,4285,2641],{"class":1096},[1050,4287,2644],{"class":1100},[1050,4289,1104],{"class":1096},[1050,4291,1267],{"class":1086},[1050,4293,1226],{"class":1096},[1050,4295,2653],{"class":1100},[1050,4297,1104],{"class":1096},[1050,4299,1107],{"class":1086},[1050,4301,4303,4305,4307,4309,4311,4313,4315,4317,4319,4321],{"class":1052,"line":4302},149,[1050,4304,2641],{"class":1096},[1050,4306,2451],{"class":1100},[1050,4308,1104],{"class":1096},[1050,4310,1267],{"class":1086},[1050,4312,4004],{"class":1814},[1050,4314,2383],{"class":1086},[1050,4316,1104],{"class":1096},[1050,4318,2451],{"class":1100},[1050,4320,1104],{"class":1096},[1050,4322,4084],{"class":1086},[1050,4324,4326,4328,4330,4332,4334,4336,4338,4340,4342,4344],{"class":1052,"line":4325},150,[1050,4327,2641],{"class":1096},[1050,4329,2687],{"class":1100},[1050,4331,1104],{"class":1096},[1050,4333,1267],{"class":1086},[1050,4335,4004],{"class":1814},[1050,4337,2383],{"class":1086},[1050,4339,1104],{"class":1096},[1050,4341,2687],{"class":1100},[1050,4343,1104],{"class":1096},[1050,4345,1204],{"class":1086},[1050,4347,4349],{"class":1052,"line":4348},151,[1050,4350,4351],{"class":1086},"            }))\n",[1050,4353,4355],{"class":1052,"line":4354},152,[1050,4356,1903],{"class":1698},[1050,4358,4360,4362,4364,4367,4369,4371,4373,4375],{"class":1052,"line":4359},153,[1050,4361,2335],{"class":2128},[1050,4363,2338],{"class":2128},[1050,4365,4366],{"class":2341}," user_left",[1050,4368,1818],{"class":1086},[1050,4370,2348],{"class":2347},[1050,4372,1180],{"class":1086},[1050,4374,4004],{"class":2765},[1050,4376,2313],{"class":1086},[1050,4378,4380,4382,4385],{"class":1052,"line":4379},154,[1050,4381,2355],{"class":2318},[1050,4383,4384],{"class":2322},"Send user left notification to WebSocket.",[1050,4386,2326],{"class":2318},[1050,4388,4390],{"class":1052,"line":4389},155,[1050,4391,4392],{"class":1056},"        # Don't send to the user who left (they're already disconnected)\n",[1050,4394,4396,4398,4400,4402,4404,4406,4408,4410,4412,4414,4416,4418,4420,4422],{"class":1052,"line":4395},156,[1050,4397,2484],{"class":1694},[1050,4399,4004],{"class":1698},[1050,4401,2383],{"class":1086},[1050,4403,1104],{"class":1096},[1050,4405,2451],{"class":1100},[1050,4407,1104],{"class":1096},[1050,4409,4240],{"class":1086},[1050,4411,4243],{"class":2487},[1050,4413,2375],{"class":1082},[1050,4415,1710],{"class":1086},[1050,4417,2451],{"class":1794},[1050,4419,1710],{"class":1086},[1050,4421,2678],{"class":1794},[1050,4423,2502],{"class":1086},[1050,4425,4427,4429,4431,4433,4435,4437,4439,4441,4443,4445,4447],{"class":1052,"line":4426},157,[1050,4428,2507],{"class":1694},[1050,4430,2375],{"class":1082},[1050,4432,1710],{"class":1086},[1050,4434,3903],{"class":1814},[1050,4436,1818],{"class":1086},[1050,4438,3039],{"class":3908},[1050,4440,1854],{"class":1086},[1050,4442,3913],{"class":1814},[1050,4444,1710],{"class":1086},[1050,4446,3918],{"class":1814},[1050,4448,1876],{"class":1086},[1050,4450,4452,4454,4456,4458,4460,4462,4464,4466],{"class":1052,"line":4451},158,[1050,4453,2641],{"class":1096},[1050,4455,2644],{"class":1100},[1050,4457,1104],{"class":1096},[1050,4459,1267],{"class":1086},[1050,4461,1226],{"class":1096},[1050,4463,2850],{"class":1100},[1050,4465,1104],{"class":1096},[1050,4467,1107],{"class":1086},[1050,4469,4471,4473,4475,4477,4479,4481,4483,4485,4487,4489],{"class":1052,"line":4470},159,[1050,4472,2641],{"class":1096},[1050,4474,2451],{"class":1100},[1050,4476,1104],{"class":1096},[1050,4478,1267],{"class":1086},[1050,4480,4004],{"class":1814},[1050,4482,2383],{"class":1086},[1050,4484,1104],{"class":1096},[1050,4486,2451],{"class":1100},[1050,4488,1104],{"class":1096},[1050,4490,4084],{"class":1086},[1050,4492,4494,4496,4498,4500,4502,4504,4506,4508,4510,4512],{"class":1052,"line":4493},160,[1050,4495,2641],{"class":1096},[1050,4497,2687],{"class":1100},[1050,4499,1104],{"class":1096},[1050,4501,1267],{"class":1086},[1050,4503,4004],{"class":1814},[1050,4505,2383],{"class":1086},[1050,4507,1104],{"class":1096},[1050,4509,2687],{"class":1100},[1050,4511,1104],{"class":1096},[1050,4513,1204],{"class":1086},[1050,4515,4517],{"class":1052,"line":4516},161,[1050,4518,4351],{"class":1086},[1050,4520,4522],{"class":1052,"line":4521},162,[1050,4523,1903],{"class":1698},[1050,4525,4527,4529,4531,4534,4536,4538,4540,4542],{"class":1052,"line":4526},163,[1050,4528,2335],{"class":2128},[1050,4530,2338],{"class":2128},[1050,4532,4533],{"class":2341}," typing_indicator",[1050,4535,1818],{"class":1086},[1050,4537,2348],{"class":2347},[1050,4539,1180],{"class":1086},[1050,4541,4004],{"class":2765},[1050,4543,2313],{"class":1086},[1050,4545,4547,4549,4552],{"class":1052,"line":4546},164,[1050,4548,2355],{"class":2318},[1050,4550,4551],{"class":2322},"Send typing indicator to WebSocket.",[1050,4553,2326],{"class":2318},[1050,4555,4557],{"class":1052,"line":4556},165,[1050,4558,4559],{"class":1056},"        # Don't send typing indicator back to the sender\n",[1050,4561,4563,4565,4567,4569,4571,4573,4575,4577,4579,4581,4583,4585,4587,4589],{"class":1052,"line":4562},166,[1050,4564,2484],{"class":1694},[1050,4566,4004],{"class":1698},[1050,4568,2383],{"class":1086},[1050,4570,1104],{"class":1096},[1050,4572,3587],{"class":1100},[1050,4574,1104],{"class":1096},[1050,4576,4240],{"class":1086},[1050,4578,4243],{"class":2487},[1050,4580,2375],{"class":1082},[1050,4582,1710],{"class":1086},[1050,4584,2451],{"class":1794},[1050,4586,1710],{"class":1086},[1050,4588,3602],{"class":1794},[1050,4590,2502],{"class":1086},[1050,4592,4594,4596,4598,4600,4602,4604,4606,4608,4610,4612,4614],{"class":1052,"line":4593},167,[1050,4595,2507],{"class":1694},[1050,4597,2375],{"class":1082},[1050,4599,1710],{"class":1086},[1050,4601,3903],{"class":1814},[1050,4603,1818],{"class":1086},[1050,4605,3039],{"class":3908},[1050,4607,1854],{"class":1086},[1050,4609,3913],{"class":1814},[1050,4611,1710],{"class":1086},[1050,4613,3918],{"class":1814},[1050,4615,1876],{"class":1086},[1050,4617,4619,4621,4623,4625,4627,4629,4631,4633],{"class":1052,"line":4618},168,[1050,4620,2641],{"class":1096},[1050,4622,2644],{"class":1100},[1050,4624,1104],{"class":1096},[1050,4626,1267],{"class":1086},[1050,4628,1226],{"class":1096},[1050,4630,3135],{"class":1100},[1050,4632,1104],{"class":1096},[1050,4634,1107],{"class":1086},[1050,4636,4638,4640,4642,4644,4646,4648,4650,4652,4654,4656],{"class":1052,"line":4637},169,[1050,4639,2641],{"class":1096},[1050,4641,2451],{"class":1100},[1050,4643,1104],{"class":1096},[1050,4645,1267],{"class":1086},[1050,4647,4004],{"class":1814},[1050,4649,2383],{"class":1086},[1050,4651,1104],{"class":1096},[1050,4653,2451],{"class":1100},[1050,4655,1104],{"class":1096},[1050,4657,4084],{"class":1086},[1050,4659,4661,4663,4665,4667,4669,4671,4673,4675,4677,4679],{"class":1052,"line":4660},170,[1050,4662,2641],{"class":1096},[1050,4664,3716],{"class":1100},[1050,4666,1104],{"class":1096},[1050,4668,1267],{"class":1086},[1050,4670,4004],{"class":1814},[1050,4672,2383],{"class":1086},[1050,4674,1104],{"class":1096},[1050,4676,3716],{"class":1100},[1050,4678,1104],{"class":1096},[1050,4680,1204],{"class":1086},[1050,4682,4684],{"class":1052,"line":4683},171,[1050,4685,4351],{"class":1086},[1050,4687,4689],{"class":1052,"line":4688},172,[1050,4690,1903],{"class":1698},[1050,4692,4694],{"class":1052,"line":4693},173,[1050,4695,4696],{"class":1056},"    # Helper methods\n",[1050,4698,4700,4702,4704,4707,4709,4711,4713,4716],{"class":1052,"line":4699},174,[1050,4701,2335],{"class":2128},[1050,4703,2338],{"class":2128},[1050,4705,4706],{"class":2341}," send_error",[1050,4708,1818],{"class":1086},[1050,4710,2348],{"class":2347},[1050,4712,1180],{"class":1086},[1050,4714,4715],{"class":2765}," error_message",[1050,4717,2313],{"class":1086},[1050,4719,4721,4723,4726],{"class":1052,"line":4720},175,[1050,4722,2355],{"class":2318},[1050,4724,4725],{"class":2322},"Send error message to WebSocket.",[1050,4727,2326],{"class":2318},[1050,4729,4731,4733,4735,4737,4739,4741,4743,4745,4747,4749,4751],{"class":1052,"line":4730},176,[1050,4732,2535],{"class":1694},[1050,4734,2375],{"class":1082},[1050,4736,1710],{"class":1086},[1050,4738,3903],{"class":1814},[1050,4740,1818],{"class":1086},[1050,4742,3039],{"class":3908},[1050,4744,1854],{"class":1086},[1050,4746,3913],{"class":1814},[1050,4748,1710],{"class":1086},[1050,4750,3918],{"class":1814},[1050,4752,1876],{"class":1086},[1050,4754,4756,4758,4760,4762,4764,4766,4769,4771],{"class":1052,"line":4755},177,[1050,4757,3926],{"class":1096},[1050,4759,2644],{"class":1100},[1050,4761,1104],{"class":1096},[1050,4763,1267],{"class":1086},[1050,4765,1226],{"class":1096},[1050,4767,4768],{"class":1100},"error",[1050,4770,1104],{"class":1096},[1050,4772,1107],{"class":1086},[1050,4774,4776,4778,4780,4782,4784],{"class":1052,"line":4775},178,[1050,4777,3926],{"class":1096},[1050,4779,2687],{"class":1100},[1050,4781,1104],{"class":1096},[1050,4783,1267],{"class":1086},[1050,4785,4786],{"class":1814}," error_message\n",[1050,4788,4790],{"class":1052,"line":4789},179,[1050,4791,3974],{"class":1086},[1050,4793,4795],{"class":1052,"line":4794},180,[1050,4796,1903],{"class":1698},[1050,4798,4800,4802,4804,4807,4809,4811],{"class":1052,"line":4799},181,[1050,4801,2335],{"class":2128},[1050,4803,2338],{"class":2128},[1050,4805,4806],{"class":2341}," send_recent_messages",[1050,4808,1818],{"class":1086},[1050,4810,2348],{"class":2347},[1050,4812,2313],{"class":1086},[1050,4814,4816,4818,4821],{"class":1052,"line":4815},182,[1050,4817,2355],{"class":2318},[1050,4819,4820],{"class":2322},"Send recent messages to newly connected user.",[1050,4822,2326],{"class":2318},[1050,4824,4826,4829,4831,4833,4835,4837,4840],{"class":1052,"line":4825},183,[1050,4827,4828],{"class":1698},"        messages ",[1050,4830,1854],{"class":1086},[1050,4832,3453],{"class":1694},[1050,4834,2375],{"class":1082},[1050,4836,1710],{"class":1086},[1050,4838,4839],{"class":1814},"get_recent_messages",[1050,4841,1860],{"class":1086},[1050,4843,4845],{"class":1052,"line":4844},184,[1050,4846,2474],{"class":1698},[1050,4848,4850,4853,4856,4859,4862],{"class":1052,"line":4849},185,[1050,4851,4852],{"class":1694},"        for",[1050,4854,4855],{"class":1698}," message ",[1050,4857,4858],{"class":1694},"in",[1050,4860,4861],{"class":1698}," messages",[1050,4863,2502],{"class":1086},[1050,4865,4867,4869,4871,4873,4875,4877,4879,4881,4883,4885,4887],{"class":1052,"line":4866},186,[1050,4868,2507],{"class":1694},[1050,4870,2375],{"class":1082},[1050,4872,1710],{"class":1086},[1050,4874,3903],{"class":1814},[1050,4876,1818],{"class":1086},[1050,4878,3039],{"class":3908},[1050,4880,1854],{"class":1086},[1050,4882,3913],{"class":1814},[1050,4884,1710],{"class":1086},[1050,4886,3918],{"class":1814},[1050,4888,1876],{"class":1086},[1050,4890,4892,4894,4896,4898,4900,4902,4904,4906],{"class":1052,"line":4891},187,[1050,4893,2641],{"class":1096},[1050,4895,2644],{"class":1100},[1050,4897,1104],{"class":1096},[1050,4899,1267],{"class":1086},[1050,4901,1226],{"class":1096},[1050,4903,2687],{"class":1100},[1050,4905,1104],{"class":1096},[1050,4907,1107],{"class":1086},[1050,4909,4911,4913,4915,4917,4919,4921,4923,4926],{"class":1052,"line":4910},188,[1050,4912,2641],{"class":1096},[1050,4914,2687],{"class":1100},[1050,4916,1104],{"class":1096},[1050,4918,1267],{"class":1086},[1050,4920,3480],{"class":1814},[1050,4922,1710],{"class":1086},[1050,4924,4925],{"class":1794},"content",[1050,4927,1107],{"class":1086},[1050,4929,4931,4933,4935,4937,4939,4941,4943,4945,4947,4949],{"class":1052,"line":4930},189,[1050,4932,2641],{"class":1096},[1050,4934,2451],{"class":1100},[1050,4936,1104],{"class":1096},[1050,4938,1267],{"class":1086},[1050,4940,3480],{"class":1814},[1050,4942,1710],{"class":1086},[1050,4944,2451],{"class":1794},[1050,4946,1710],{"class":1086},[1050,4948,2678],{"class":1794},[1050,4950,1107],{"class":1086},[1050,4952,4954,4956,4958,4960,4962,4964,4966,4968,4970,4972],{"class":1052,"line":4953},190,[1050,4955,2641],{"class":1096},[1050,4957,3587],{"class":1100},[1050,4959,1104],{"class":1096},[1050,4961,1267],{"class":1086},[1050,4963,3480],{"class":1814},[1050,4965,1710],{"class":1086},[1050,4967,2451],{"class":1794},[1050,4969,1710],{"class":1086},[1050,4971,3602],{"class":1794},[1050,4973,1107],{"class":1086},[1050,4975,4977,4979,4981,4983,4985,4987,4989,4991,4993,4995],{"class":1052,"line":4976},191,[1050,4978,2641],{"class":1096},[1050,4980,3612],{"class":1100},[1050,4982,1104],{"class":1096},[1050,4984,1267],{"class":1086},[1050,4986,3480],{"class":1814},[1050,4988,1710],{"class":1086},[1050,4990,3623],{"class":1794},[1050,4992,1710],{"class":1086},[1050,4994,3628],{"class":1814},[1050,4996,3631],{"class":1086},[1050,4998,5000,5002,5004,5006,5008,5010,5012],{"class":1052,"line":4999},192,[1050,5001,2641],{"class":1096},[1050,5003,3639],{"class":1100},[1050,5005,1104],{"class":1096},[1050,5007,1267],{"class":1086},[1050,5009,3480],{"class":1814},[1050,5011,1710],{"class":1086},[1050,5013,3650],{"class":1794},[1050,5015,5017],{"class":1052,"line":5016},193,[1050,5018,4351],{"class":1086},[1050,5020,5022],{"class":1052,"line":5021},194,[1050,5023,1903],{"class":1698},[1050,5025,5027,5030],{"class":1052,"line":5026},195,[1050,5028,5029],{"class":1086},"    @",[1050,5031,5032],{"class":2341},"database_sync_to_async\n",[1050,5034,5036,5039,5042,5044,5046,5048,5051],{"class":1052,"line":5035},196,[1050,5037,5038],{"class":2128},"    def",[1050,5040,5041],{"class":2341}," save_message",[1050,5043,1818],{"class":1086},[1050,5045,2348],{"class":2347},[1050,5047,1180],{"class":1086},[1050,5049,5050],{"class":2765}," content",[1050,5052,2313],{"class":1086},[1050,5054,5056,5058,5061],{"class":1052,"line":5055},197,[1050,5057,2355],{"class":2318},[1050,5059,5060],{"class":2322},"Save message to database.",[1050,5062,2326],{"class":2318},[1050,5064,5066,5068],{"class":1052,"line":5065},198,[1050,5067,3016],{"class":1694},[1050,5069,2502],{"class":1086},[1050,5071,5073,5076,5078,5081,5083,5085,5087,5090,5092,5095,5097,5100,5102,5104,5106,5108],{"class":1052,"line":5072},199,[1050,5074,5075],{"class":1698},"            room",[1050,5077,1180],{"class":1086},[1050,5079,5080],{"class":1698}," created ",[1050,5082,1854],{"class":1086},[1050,5084,2286],{"class":1698},[1050,5086,1710],{"class":1086},[1050,5088,5089],{"class":1794},"objects",[1050,5091,1710],{"class":1086},[1050,5093,5094],{"class":1814},"get_or_create",[1050,5096,1818],{"class":1086},[1050,5098,5099],{"class":3908},"name",[1050,5101,1854],{"class":1086},[1050,5103,2348],{"class":1082},[1050,5105,1710],{"class":1086},[1050,5107,2370],{"class":1794},[1050,5109,1837],{"class":1086},[1050,5111,5113,5116,5118,5121,5123,5125,5127,5130],{"class":1052,"line":5112},200,[1050,5114,5115],{"class":1698},"            message ",[1050,5117,1854],{"class":1086},[1050,5119,5120],{"class":1698}," Message",[1050,5122,1710],{"class":1086},[1050,5124,5089],{"class":1794},[1050,5126,1710],{"class":1086},[1050,5128,5129],{"class":1814},"create",[1050,5131,1925],{"class":1086},[1050,5133,5135,5138,5140,5143],{"class":1052,"line":5134},201,[1050,5136,5137],{"class":3908},"                room",[1050,5139,1854],{"class":1086},[1050,5141,5142],{"class":1814},"room",[1050,5144,1107],{"class":1086},[1050,5146,5148,5151,5153,5155,5157,5159],{"class":1052,"line":5147},202,[1050,5149,5150],{"class":3908},"                user",[1050,5152,1854],{"class":1086},[1050,5154,2348],{"class":1082},[1050,5156,1710],{"class":1086},[1050,5158,2451],{"class":1794},[1050,5160,1107],{"class":1086},[1050,5162,5164,5167,5169],{"class":1052,"line":5163},203,[1050,5165,5166],{"class":3908},"                content",[1050,5168,1854],{"class":1086},[1050,5170,5171],{"class":1814},"content\n",[1050,5173,5175],{"class":1052,"line":5174},204,[1050,5176,1959],{"class":1086},[1050,5178,5180,5183],{"class":1052,"line":5179},205,[1050,5181,5182],{"class":1694},"            return",[1050,5184,5185],{"class":1698}," message\n",[1050,5187,5189,5191,5193,5195,5197],{"class":1052,"line":5188},206,[1050,5190,3231],{"class":1694},[1050,5192,3271],{"class":3270},[1050,5194,3274],{"class":1694},[1050,5196,3277],{"class":1698},[1050,5198,2502],{"class":1086},[1050,5200,5202,5205,5207,5209,5212,5214,5216,5218,5220],{"class":1052,"line":5201},207,[1050,5203,5204],{"class":2784},"            print",[1050,5206,1818],{"class":1086},[1050,5208,3295],{"class":2128},[1050,5210,5211],{"class":1100},"\"Error saving message: ",[1050,5213,2431],{"class":2430},[1050,5215,3308],{"class":1814},[1050,5217,2440],{"class":2430},[1050,5219,1317],{"class":1100},[1050,5221,1837],{"class":1086},[1050,5223,5225,5227],{"class":1052,"line":5224},208,[1050,5226,5182],{"class":1694},[1050,5228,5229],{"class":3723}," None\n",[1050,5231,5233],{"class":1052,"line":5232},209,[1050,5234,1903],{"class":1698},[1050,5236,5238,5240],{"class":1052,"line":5237},210,[1050,5239,5029],{"class":1086},[1050,5241,5032],{"class":2341},[1050,5243,5245,5247,5250,5252,5254],{"class":1052,"line":5244},211,[1050,5246,5038],{"class":2128},[1050,5248,5249],{"class":2341}," get_recent_messages",[1050,5251,1818],{"class":1086},[1050,5253,2348],{"class":2347},[1050,5255,2313],{"class":1086},[1050,5257,5259,5261,5264],{"class":1052,"line":5258},212,[1050,5260,2355],{"class":2318},[1050,5262,5263],{"class":2322},"Get recent messages from database.",[1050,5265,2326],{"class":2318},[1050,5267,5269,5271],{"class":1052,"line":5268},213,[1050,5270,3016],{"class":1694},[1050,5272,2502],{"class":1086},[1050,5274,5276,5279,5281,5283,5285,5287,5289,5291,5293,5295,5297,5299,5301,5303],{"class":1052,"line":5275},214,[1050,5277,5278],{"class":1698},"            room ",[1050,5280,1854],{"class":1086},[1050,5282,2286],{"class":1698},[1050,5284,1710],{"class":1086},[1050,5286,5089],{"class":1794},[1050,5288,1710],{"class":1086},[1050,5290,3057],{"class":1814},[1050,5292,1818],{"class":1086},[1050,5294,5099],{"class":3908},[1050,5296,1854],{"class":1086},[1050,5298,2348],{"class":1082},[1050,5300,1710],{"class":1086},[1050,5302,2370],{"class":1794},[1050,5304,1837],{"class":1086},[1050,5306,5308,5310,5313],{"class":1052,"line":5307},215,[1050,5309,5182],{"class":1694},[1050,5311,5312],{"class":3270}," list",[1050,5314,1925],{"class":1086},[1050,5316,5318,5320,5322,5325,5327,5330,5332,5334,5336,5338],{"class":1052,"line":5317},216,[1050,5319,5137],{"class":1814},[1050,5321,1710],{"class":1086},[1050,5323,5324],{"class":1794},"messages",[1050,5326,1710],{"class":1086},[1050,5328,5329],{"class":1814},"select_related",[1050,5331,1818],{"class":1086},[1050,5333,1104],{"class":1096},[1050,5335,2451],{"class":1100},[1050,5337,1104],{"class":1096},[1050,5339,1837],{"class":1086},[1050,5341,5343,5346,5349,5351,5353,5356,5358,5361,5364],{"class":1052,"line":5342},217,[1050,5344,5345],{"class":1086},"                .",[1050,5347,5348],{"class":1814},"order_by",[1050,5350,1818],{"class":1086},[1050,5352,1104],{"class":1096},[1050,5354,5355],{"class":1100},"-created_at",[1050,5357,1104],{"class":1096},[1050,5359,5360],{"class":1086},")[:",[1050,5362,5363],{"class":1334},"50",[1050,5365,1204],{"class":1086},[1050,5367,5369,5371,5374],{"class":1052,"line":5368},218,[1050,5370,5345],{"class":1086},[1050,5372,5373],{"class":1814},"reverse",[1050,5375,1860],{"class":1086},[1050,5377,5379],{"class":1052,"line":5378},219,[1050,5380,1959],{"class":1086},[1050,5382,5384,5386,5388,5390,5393],{"class":1052,"line":5383},220,[1050,5385,3231],{"class":1694},[1050,5387,2286],{"class":1698},[1050,5389,1710],{"class":1086},[1050,5391,5392],{"class":1794},"DoesNotExist",[1050,5394,2502],{"class":1086},[1050,5396,5398,5400],{"class":1052,"line":5397},221,[1050,5399,5182],{"class":1694},[1050,5401,5402],{"class":1086}," []\n",[1035,5404,5406],{"id":5405},"advanced-websocket-consumer","Advanced WebSocket Consumer",[1040,5408,5410],{"className":1042,"code":5409,"language":1044,"meta":1045,"style":1045},"# consumers.py\nimport json\nimport asyncio\nfrom datetime import datetime, timedelta\nfrom channels.generic.websocket import AsyncWebsocketConsumer\nfrom channels.db import database_sync_to_async\nfrom django.core.cache import cache\nfrom asgiref.sync import sync_to_async\n\nclass AdvancedChatConsumer(AsyncWebsocketConsumer):\n    \"\"\"Advanced chat consumer with additional features.\"\"\"\n    \n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.heartbeat_task = None\n        self.last_activity = None\n        self.user_status = 'online'\n    \n    async def connect(self):\n        \"\"\"Enhanced connection handling.\"\"\"\n        self.room_name = self.scope['url_route']['kwargs']['room_name']\n        self.room_group_name = f'chat_{self.room_name}'\n        self.user = self.scope['user']\n        \n        if not self.user.is_authenticated:\n            await self.close(code=4001)  # Unauthorized\n            return\n        \n        # Check if user is banned from room\n        if await self.is_user_banned():\n            await self.close(code=4003)  # Forbidden\n            return\n        \n        # Rate limiting check\n        if not await self.check_rate_limit():\n            await self.close(code=4029)  # Too many requests\n            return\n        \n        # Join room group\n        await self.channel_layer.group_add(\n            self.room_group_name,\n            self.channel_name\n        )\n        \n        await self.accept()\n        \n        # Start heartbeat\n        self.heartbeat_task = asyncio.create_task(self.heartbeat_loop())\n        \n        # Update user status\n        await self.update_user_status('online')\n        \n        # Send user list and recent messages\n        await self.send_user_list()\n        await self.send_recent_messages()\n        \n        # Notify others\n        await self.broadcast_user_status('joined')\n    \n    async def disconnect(self, close_code):\n        \"\"\"Enhanced disconnection handling.\"\"\"\n        # Cancel heartbeat\n        if self.heartbeat_task:\n            self.heartbeat_task.cancel()\n        \n        # Update user status\n        await self.update_user_status('offline')\n        \n        # Notify others\n        await self.broadcast_user_status('left')\n        \n        # Leave room group\n        if hasattr(self, 'room_group_name'):\n            await self.channel_layer.group_discard(\n                self.room_group_name,\n                self.channel_name\n            )\n    \n    async def receive(self, text_data):\n        \"\"\"Enhanced message handling with validation.\"\"\"\n        self.last_activity = datetime.now()\n        \n        try:\n            data = json.loads(text_data)\n            message_type = data.get('type')\n            \n            # Validate message structure\n            if not await self.validate_message(data):\n                return\n            \n            # Route message based on type\n            handlers = {\n                'message': self.handle_chat_message,\n                'typing': self.handle_typing,\n                'reaction': self.handle_reaction,\n                'edit': self.handle_edit_message,\n                'delete': self.handle_delete_message,\n                'ping': self.handle_ping,\n                'status': self.handle_status_change,\n            }\n            \n            handler = handlers.get(message_type)\n            if handler:\n                await handler(data)\n            else:\n                await self.send_error('Unknown message type', data.get('id'))\n        \n        except json.JSONDecodeError:\n            await self.send_error('Invalid JSON format')\n        except Exception as e:\n            await self.send_error(f'Error processing message: {str(e)}')\n    \n    async def handle_chat_message(self, data):\n        \"\"\"Handle chat message with advanced features.\"\"\"\n        content = data.get('message', '').strip()\n        reply_to = data.get('reply_to')\n        \n        if not content:\n            await self.send_error('Empty message', data.get('id'))\n            return\n        \n        # Content filtering\n        if await self.is_content_blocked(content):\n            await self.send_error('Message blocked by content filter', data.get('id'))\n            return\n        \n        # Save message\n        message = await self.save_message(content, reply_to)\n        \n        if message:\n            # Broadcast message\n            await self.channel_layer.group_send(\n                self.room_group_name,\n                {\n                    'type': 'chat_message',\n                    'message_id': message.id,\n                    'content': content,\n                    'user': self.user.username,\n                    'user_id': self.user.id,\n                    'timestamp': message.created_at.isoformat(),\n                    'reply_to': reply_to,\n                    'client_id': data.get('id')  # For client-side correlation\n                }\n            )\n    \n    async def handle_reaction(self, data):\n        \"\"\"Handle message reactions.\"\"\"\n        message_id = data.get('message_id')\n        emoji = data.get('emoji')\n        action = data.get('action', 'add')  # add or remove\n        \n        if not message_id or not emoji:\n            await self.send_error('Invalid reaction data', data.get('id'))\n            return\n        \n        # Save reaction\n        success = await self.save_reaction(message_id, emoji, action)\n        \n        if success:\n            # Broadcast reaction\n            await self.channel_layer.group_send(\n                self.room_group_name,\n                {\n                    'type': 'message_reaction',\n                    'message_id': message_id,\n                    'emoji': emoji,\n                    'action': action,\n                    'user': self.user.username,\n                    'user_id': self.user.id\n                }\n            )\n    \n    async def handle_edit_message(self, data):\n        \"\"\"Handle message editing.\"\"\"\n        message_id = data.get('message_id')\n        new_content = data.get('content', '').strip()\n        \n        if not message_id or not new_content:\n            await self.send_error('Invalid edit data', data.get('id'))\n            return\n        \n        # Check if user can edit this message\n        if not await self.can_edit_message(message_id):\n            await self.send_error('Cannot edit this message', data.get('id'))\n            return\n        \n        # Update message\n        success = await self.update_message(message_id, new_content)\n        \n        if success:\n            # Broadcast edit\n            await self.channel_layer.group_send(\n                self.room_group_name,\n                {\n                    'type': 'message_edited',\n                    'message_id': message_id,\n                    'content': new_content,\n                    'user': self.user.username,\n                    'edited_at': datetime.now().isoformat()\n                }\n            )\n    \n    async def heartbeat_loop(self):\n        \"\"\"Maintain connection with periodic heartbeat.\"\"\"\n        try:\n            while True:\n                await asyncio.sleep(30)  # Send heartbeat every 30 seconds\n                \n                # Check for inactive connections\n                if self.last_activity:\n                    inactive_time = datetime.now() - self.last_activity\n                    if inactive_time > timedelta(minutes=30):\n                        await self.close(code=4000)  # Timeout\n                        break\n                \n                # Send heartbeat\n                await self.send(text_data=json.dumps({\n                    'type': 'heartbeat',\n                    'timestamp': datetime.now().isoformat()\n                }))\n        \n        except asyncio.CancelledError:\n            pass\n    \n    # Group message handlers\n    async def chat_message(self, event):\n        \"\"\"Send chat message to WebSocket.\"\"\"\n        await self.send(text_data=json.dumps({\n            'type': 'message',\n            'message_id': event['message_id'],\n            'content': event['content'],\n            'user': event['user'],\n            'user_id': event['user_id'],\n            'timestamp': event['timestamp'],\n            'reply_to': event.get('reply_to'),\n            'client_id': event.get('client_id')\n        }))\n    \n    async def message_reaction(self, event):\n        \"\"\"Send message reaction to WebSocket.\"\"\"\n        await self.send(text_data=json.dumps({\n            'type': 'reaction',\n            'message_id': event['message_id'],\n            'emoji': event['emoji'],\n            'action': event['action'],\n            'user': event['user'],\n            'user_id': event['user_id']\n        }))\n    \n    async def message_edited(self, event):\n        \"\"\"Send message edit notification to WebSocket.\"\"\"\n        await self.send(text_data=json.dumps({\n            'type': 'message_edited',\n            'message_id': event['message_id'],\n            'content': event['content'],\n            'user': event['user'],\n            'edited_at': event['edited_at']\n        }))\n    \n    async def user_status_changed(self, event):\n        \"\"\"Send user status change to WebSocket.\"\"\"\n        if event['user_id'] != self.user.id:  # Don't send to self\n            await self.send(text_data=json.dumps({\n                'type': 'user_status',\n                'user': event['user'],\n                'status': event['status'],\n                'timestamp': event['timestamp']\n            }))\n    \n    # Helper methods\n    async def validate_message(self, data):\n        \"\"\"Validate incoming message structure.\"\"\"\n        required_fields = ['type']\n        \n        for field in required_fields:\n            if field not in data:\n                await self.send_error(f'Missing required field: {field}', data.get('id'))\n                return False\n        \n        return True\n    \n    @database_sync_to_async\n    def is_user_banned(self):\n        \"\"\"Check if user is banned from room.\"\"\"\n        # Implement ban checking logic\n        return False\n    \n    @sync_to_async\n    def check_rate_limit(self):\n        \"\"\"Check rate limiting for user.\"\"\"\n        cache_key = f'rate_limit_{self.user.id}_{self.room_name}'\n        current_count = cache.get(cache_key, 0)\n        \n        if current_count >= 100:  # Max 100 connections per hour\n            return False\n        \n        cache.set(cache_key, current_count + 1, 3600)  # 1 hour\n        return True\n    \n    @sync_to_async\n    def is_content_blocked(self, content):\n        \"\"\"Check if content should be blocked.\"\"\"\n        # Implement content filtering logic\n        blocked_words = ['spam', 'abuse']  # Example\n        return any(word in content.lower() for word in blocked_words)\n    \n    @database_sync_to_async\n    def save_message(self, content, reply_to=None):\n        \"\"\"Save message with reply support.\"\"\"\n        try:\n            from .models import ChatRoom, Message\n            \n            room, created = ChatRoom.objects.get_or_create(name=self.room_name)\n            \n            reply_message = None\n            if reply_to:\n                try:\n                    reply_message = Message.objects.get(id=reply_to, room=room)\n                except Message.DoesNotExist:\n                    pass\n            \n            message = Message.objects.create(\n                room=room,\n                user=self.user,\n                content=content,\n                reply_to=reply_message\n            )\n            return message\n        except Exception as e:\n            print(f\"Error saving message: {e}\")\n            return None\n    \n    @database_sync_to_async\n    def save_reaction(self, message_id, emoji, action):\n        \"\"\"Save message reaction.\"\"\"\n        try:\n            from .models import Message, MessageReaction\n            \n            message = Message.objects.get(id=message_id)\n            \n            if action == 'add':\n                reaction, created = MessageReaction.objects.get_or_create(\n                    message=message,\n                    user=self.user,\n                    emoji=emoji\n                )\n                return True\n            elif action == 'remove':\n                MessageReaction.objects.filter(\n                    message=message,\n                    user=self.user,\n                    emoji=emoji\n                ).delete()\n                return True\n            \n            return False\n        except Exception as e:\n            print(f\"Error saving reaction: {e}\")\n            return False\n    \n    async def send_error(self, message, client_id=None):\n        \"\"\"Send error message to client.\"\"\"\n        error_data = {\n            'type': 'error',\n            'message': message\n        }\n        \n        if client_id:\n            error_data['client_id'] = client_id\n        \n        await self.send(text_data=json.dumps(error_data))\n",[1047,5411,5412,5417,5423,5429,5446,5464,5478,5498,5515,5519,5532,5541,5545,5573,5598,5611,5624,5642,5646,5660,5669,5711,5737,5763,5767,5785,5809,5813,5817,5822,5838,5862,5866,5870,5875,5892,5916,5920,5924,5928,5944,5954,5962,5966,5970,5982,5986,5991,6020,6024,6029,6050,6054,6059,6072,6084,6088,6093,6115,6119,6137,6146,6151,6163,6178,6182,6186,6207,6211,6215,6236,6240,6245,6265,6281,6291,6299,6303,6307,6325,6334,6353,6357,6363,6382,6404,6408,6413,6435,6440,6444,6449,6458,6476,6495,6515,6535,6555,6573,6593,6597,6601,6622,6631,6643,6649,6686,6690,6702,6723,6735,6767,6771,6789,6798,6829,6853,6857,6867,6903,6907,6911,6916,6935,6972,6976,6980,6985,7010,7014,7022,7027,7043,7053,7057,7075,7093,7107,7129,7151,7173,7187,7217,7221,7225,7229,7248,7257,7280,7304,7340,7344,7363,7400,7404,7408,7413,7444,7448,7457,7462,7478,7488,7492,7511,7526,7540,7554,7576,7596,7600,7604,7608,7627,7636,7658,7689,7693,7710,7747,7751,7755,7760,7781,7818,7822,7826,7831,7856,7860,7868,7873,7889,7899,7903,7922,7936,7950,7972,7995,7999,8003,8007,8022,8031,8037,8047,8068,8073,8078,8091,8117,8142,8167,8172,8176,8181,8205,8224,8246,8251,8255,8269,8275,8280,8285,8304,8313,8338,8357,8380,8403,8426,8449,8472,8499,8526,8531,8536,8556,8566,8591,8610,8633,8656,8679,8702,8725,8730,8735,8755,8765,8790,8809,8832,8855,8878,8901,8906,8911,8931,8941,8975,9000,9019,9042,9065,9088,9093,9098,9103,9123,9133,9152,9157,9172,9189,9234,9243,9248,9257,9262,9269,9283,9293,9299,9306,9311,9319,9333,9343,9385,9411,9416,9435,9442,9447,9481,9488,9493,9500,9518,9528,9534,9565,9602,9607,9614,9640,9650,9657,9675,9680,9715,9720,9730,9739,9747,9784,9798,9804,9809,9828,9839,9854,9865,9876,9881,9888,9901,9922,9929,9934,9941,9967,9977,9984,10002,10007,10034,10039,10057,10082,10094,10110,10121,10127,10134,10152,10169,10180,10195,10204,10214,10221,10226,10233,10246,10268,10275,10280,10308,10318,10328,10347,10360,10366,10371,10380,10401,10406],{"__ignoreMap":1045},[1050,5413,5414],{"class":1052,"line":1053},[1050,5415,5416],{"class":1056},"# consumers.py\n",[1050,5418,5419,5421],{"class":1052,"line":1060},[1050,5420,1695],{"class":1694},[1050,5422,2204],{"class":1698},[1050,5424,5425,5427],{"class":1052,"line":1066},[1050,5426,1695],{"class":1694},[1050,5428,2211],{"class":1698},[1050,5430,5431,5433,5436,5438,5441,5443],{"class":1052,"line":1073},[1050,5432,1704],{"class":1694},[1050,5434,5435],{"class":1698}," datetime ",[1050,5437,1695],{"class":1694},[1050,5439,5440],{"class":1698}," datetime",[1050,5442,1180],{"class":1086},[1050,5444,5445],{"class":1698}," timedelta\n",[1050,5447,5448,5450,5452,5454,5456,5458,5460,5462],{"class":1052,"line":1079},[1050,5449,1704],{"class":1694},[1050,5451,1730],{"class":1698},[1050,5453,1710],{"class":1086},[1050,5455,2222],{"class":1698},[1050,5457,1710],{"class":1086},[1050,5459,1777],{"class":1698},[1050,5461,1695],{"class":1694},[1050,5463,2231],{"class":1698},[1050,5465,5466,5468,5470,5472,5474,5476],{"class":1052,"line":1093},[1050,5467,1704],{"class":1694},[1050,5469,1730],{"class":1698},[1050,5471,1710],{"class":1086},[1050,5473,2242],{"class":1698},[1050,5475,1695],{"class":1694},[1050,5477,2247],{"class":1698},[1050,5479,5480,5482,5484,5486,5488,5490,5493,5495],{"class":1052,"line":1110},[1050,5481,1704],{"class":1694},[1050,5483,1707],{"class":1698},[1050,5485,1710],{"class":1086},[1050,5487,1713],{"class":1698},[1050,5489,1710],{"class":1086},[1050,5491,5492],{"class":1698},"cache ",[1050,5494,1695],{"class":1694},[1050,5496,5497],{"class":1698}," cache\n",[1050,5499,5500,5502,5505,5507,5510,5512],{"class":1052,"line":1122},[1050,5501,1704],{"class":1694},[1050,5503,5504],{"class":1698}," asgiref",[1050,5506,1710],{"class":1086},[1050,5508,5509],{"class":1698},"sync ",[1050,5511,1695],{"class":1694},[1050,5513,5514],{"class":1698}," sync_to_async\n",[1050,5516,5517],{"class":1052,"line":1134},[1050,5518,1070],{"emptyLinePlaceholder":1069},[1050,5520,5521,5523,5526,5528,5530],{"class":1052,"line":1146},[1050,5522,2300],{"class":2128},[1050,5524,5525],{"class":2303}," AdvancedChatConsumer",[1050,5527,1818],{"class":1086},[1050,5529,2310],{"class":2309},[1050,5531,2313],{"class":1086},[1050,5533,5534,5536,5539],{"class":1052,"line":1158},[1050,5535,2319],{"class":2318},[1050,5537,5538],{"class":2322},"Advanced chat consumer with additional features.",[1050,5540,2326],{"class":2318},[1050,5542,5543],{"class":1052,"line":1170},[1050,5544,1903],{"class":1698},[1050,5546,5547,5549,5552,5554,5556,5558,5561,5564,5566,5569,5571],{"class":1052,"line":1186},[1050,5548,5038],{"class":2128},[1050,5550,5551],{"class":2784}," __init__",[1050,5553,1818],{"class":1086},[1050,5555,2348],{"class":2347},[1050,5557,1180],{"class":1086},[1050,5559,5560],{"class":2487}," *",[1050,5562,5563],{"class":2765},"args",[1050,5565,1180],{"class":1086},[1050,5567,5568],{"class":2487}," **",[1050,5570,2398],{"class":2765},[1050,5572,2313],{"class":1086},[1050,5574,5575,5578,5580,5583,5585,5588,5590,5592,5594,5596],{"class":1052,"line":1201},[1050,5576,5577],{"class":3270},"        super",[1050,5579,3963],{"class":1086},[1050,5581,5582],{"class":2784},"__init__",[1050,5584,1818],{"class":1086},[1050,5586,5587],{"class":2487},"*",[1050,5589,5563],{"class":1814},[1050,5591,1180],{"class":1086},[1050,5593,5568],{"class":2487},[1050,5595,2398],{"class":1814},[1050,5597,1837],{"class":1086},[1050,5599,5600,5602,5604,5607,5609],{"class":1052,"line":1207},[1050,5601,2365],{"class":1082},[1050,5603,1710],{"class":1086},[1050,5605,5606],{"class":1794},"heartbeat_task",[1050,5608,1087],{"class":1086},[1050,5610,5229],{"class":3723},[1050,5612,5613,5615,5617,5620,5622],{"class":1052,"line":1212},[1050,5614,2365],{"class":1082},[1050,5616,1710],{"class":1086},[1050,5618,5619],{"class":1794},"last_activity",[1050,5621,1087],{"class":1086},[1050,5623,5229],{"class":3723},[1050,5625,5626,5628,5630,5633,5635,5637,5640],{"class":1052,"line":1218},[1050,5627,2365],{"class":1082},[1050,5629,1710],{"class":1086},[1050,5631,5632],{"class":1794},"user_status",[1050,5634,1087],{"class":1086},[1050,5636,1226],{"class":1096},[1050,5638,5639],{"class":1100},"online",[1050,5641,1232],{"class":1096},[1050,5643,5644],{"class":1052,"line":1235},[1050,5645,1903],{"class":1698},[1050,5647,5648,5650,5652,5654,5656,5658],{"class":1052,"line":1240},[1050,5649,2335],{"class":2128},[1050,5651,2338],{"class":2128},[1050,5653,2342],{"class":2341},[1050,5655,1818],{"class":1086},[1050,5657,2348],{"class":2347},[1050,5659,2313],{"class":1086},[1050,5661,5662,5664,5667],{"class":1052,"line":1246},[1050,5663,2355],{"class":2318},[1050,5665,5666],{"class":2322},"Enhanced connection handling.",[1050,5668,2326],{"class":2318},[1050,5670,5671,5673,5675,5677,5679,5681,5683,5685,5687,5689,5691,5693,5695,5697,5699,5701,5703,5705,5707,5709],{"class":1052,"line":1257},[1050,5672,2365],{"class":1082},[1050,5674,1710],{"class":1086},[1050,5676,2370],{"class":1794},[1050,5678,1087],{"class":1086},[1050,5680,2375],{"class":1082},[1050,5682,1710],{"class":1086},[1050,5684,2380],{"class":1794},[1050,5686,2383],{"class":1086},[1050,5688,1104],{"class":1096},[1050,5690,2388],{"class":1100},[1050,5692,1104],{"class":1096},[1050,5694,2393],{"class":1086},[1050,5696,1104],{"class":1096},[1050,5698,2398],{"class":1100},[1050,5700,1104],{"class":1096},[1050,5702,2393],{"class":1086},[1050,5704,1104],{"class":1096},[1050,5706,2370],{"class":1100},[1050,5708,1104],{"class":1096},[1050,5710,1204],{"class":1086},[1050,5712,5713,5715,5717,5719,5721,5723,5725,5727,5729,5731,5733,5735],{"class":1052,"line":1272},[1050,5714,2365],{"class":1082},[1050,5716,1710],{"class":1086},[1050,5718,2419],{"class":1794},[1050,5720,1087],{"class":1086},[1050,5722,2424],{"class":2128},[1050,5724,2427],{"class":1100},[1050,5726,2431],{"class":2430},[1050,5728,2348],{"class":1082},[1050,5730,1710],{"class":1086},[1050,5732,2370],{"class":1794},[1050,5734,2440],{"class":2430},[1050,5736,1232],{"class":1100},[1050,5738,5739,5741,5743,5745,5747,5749,5751,5753,5755,5757,5759,5761],{"class":1052,"line":1294},[1050,5740,2365],{"class":1082},[1050,5742,1710],{"class":1086},[1050,5744,2451],{"class":1794},[1050,5746,1087],{"class":1086},[1050,5748,2375],{"class":1082},[1050,5750,1710],{"class":1086},[1050,5752,2380],{"class":1794},[1050,5754,2383],{"class":1086},[1050,5756,1104],{"class":1096},[1050,5758,2451],{"class":1100},[1050,5760,1104],{"class":1096},[1050,5762,1204],{"class":1086},[1050,5764,5765],{"class":1052,"line":1308},[1050,5766,2474],{"class":1698},[1050,5768,5769,5771,5773,5775,5777,5779,5781,5783],{"class":1052,"line":1341},[1050,5770,2484],{"class":1694},[1050,5772,2488],{"class":2487},[1050,5774,2375],{"class":1082},[1050,5776,1710],{"class":1086},[1050,5778,2451],{"class":1794},[1050,5780,1710],{"class":1086},[1050,5782,2499],{"class":1794},[1050,5784,2502],{"class":1086},[1050,5786,5787,5789,5791,5793,5795,5797,5799,5801,5804,5806],{"class":1052,"line":1361},[1050,5788,2507],{"class":1694},[1050,5790,2375],{"class":1082},[1050,5792,1710],{"class":1086},[1050,5794,2514],{"class":1814},[1050,5796,1818],{"class":1086},[1050,5798,1047],{"class":3908},[1050,5800,1854],{"class":1086},[1050,5802,5803],{"class":1334},"4001",[1050,5805,2152],{"class":1086},[1050,5807,5808],{"class":1056},"  # Unauthorized\n",[1050,5810,5811],{"class":1052,"line":1381},[1050,5812,2521],{"class":1694},[1050,5814,5815],{"class":1052,"line":1387},[1050,5816,2474],{"class":1698},[1050,5818,5819],{"class":1052,"line":1393},[1050,5820,5821],{"class":1056},"        # Check if user is banned from room\n",[1050,5823,5824,5826,5828,5830,5832,5835],{"class":1052,"line":1399},[1050,5825,2484],{"class":1694},[1050,5827,3453],{"class":1694},[1050,5829,2375],{"class":1082},[1050,5831,1710],{"class":1086},[1050,5833,5834],{"class":1814},"is_user_banned",[1050,5836,5837],{"class":1086},"():\n",[1050,5839,5840,5842,5844,5846,5848,5850,5852,5854,5857,5859],{"class":1052,"line":1404},[1050,5841,2507],{"class":1694},[1050,5843,2375],{"class":1082},[1050,5845,1710],{"class":1086},[1050,5847,2514],{"class":1814},[1050,5849,1818],{"class":1086},[1050,5851,1047],{"class":3908},[1050,5853,1854],{"class":1086},[1050,5855,5856],{"class":1334},"4003",[1050,5858,2152],{"class":1086},[1050,5860,5861],{"class":1056},"  # Forbidden\n",[1050,5863,5864],{"class":1052,"line":1410},[1050,5865,2521],{"class":1694},[1050,5867,5868],{"class":1052,"line":1419},[1050,5869,2474],{"class":1698},[1050,5871,5872],{"class":1052,"line":1432},[1050,5873,5874],{"class":1056},"        # Rate limiting check\n",[1050,5876,5877,5879,5881,5883,5885,5887,5890],{"class":1052,"line":1451},[1050,5878,2484],{"class":1694},[1050,5880,2488],{"class":2487},[1050,5882,3453],{"class":1694},[1050,5884,2375],{"class":1082},[1050,5886,1710],{"class":1086},[1050,5888,5889],{"class":1814},"check_rate_limit",[1050,5891,5837],{"class":1086},[1050,5893,5894,5896,5898,5900,5902,5904,5906,5908,5911,5913],{"class":1052,"line":1464},[1050,5895,2507],{"class":1694},[1050,5897,2375],{"class":1082},[1050,5899,1710],{"class":1086},[1050,5901,2514],{"class":1814},[1050,5903,1818],{"class":1086},[1050,5905,1047],{"class":3908},[1050,5907,1854],{"class":1086},[1050,5909,5910],{"class":1334},"4029",[1050,5912,2152],{"class":1086},[1050,5914,5915],{"class":1056},"  # Too many requests\n",[1050,5917,5918],{"class":1052,"line":1477},[1050,5919,2521],{"class":1694},[1050,5921,5922],{"class":1052,"line":1483},[1050,5923,2474],{"class":1698},[1050,5925,5926],{"class":1052,"line":1498},[1050,5927,2530],{"class":1056},[1050,5929,5930,5932,5934,5936,5938,5940,5942],{"class":1052,"line":1519},[1050,5931,2535],{"class":1694},[1050,5933,2375],{"class":1082},[1050,5935,1710],{"class":1086},[1050,5937,2542],{"class":1794},[1050,5939,1710],{"class":1086},[1050,5941,2547],{"class":1814},[1050,5943,1925],{"class":1086},[1050,5945,5946,5948,5950,5952],{"class":1052,"line":1537},[1050,5947,2554],{"class":1082},[1050,5949,1710],{"class":1086},[1050,5951,2419],{"class":1794},[1050,5953,1107],{"class":1086},[1050,5955,5956,5958,5960],{"class":1052,"line":1555},[1050,5957,2554],{"class":1082},[1050,5959,1710],{"class":1086},[1050,5961,2569],{"class":1794},[1050,5963,5964],{"class":1052,"line":1561},[1050,5965,1964],{"class":1086},[1050,5967,5968],{"class":1052,"line":1582},[1050,5969,2474],{"class":1698},[1050,5971,5972,5974,5976,5978,5980],{"class":1052,"line":1599},[1050,5973,2535],{"class":1694},[1050,5975,2375],{"class":1082},[1050,5977,1710],{"class":1086},[1050,5979,2593],{"class":1814},[1050,5981,1860],{"class":1086},[1050,5983,5984],{"class":1052,"line":1605},[1050,5985,2474],{"class":1698},[1050,5987,5988],{"class":1052,"line":1611},[1050,5989,5990],{"class":1056},"        # Start heartbeat\n",[1050,5992,5993,5995,5997,5999,6001,6003,6005,6008,6010,6012,6014,6017],{"class":1052,"line":1627},[1050,5994,2365],{"class":1082},[1050,5996,1710],{"class":1086},[1050,5998,5606],{"class":1794},[1050,6000,1087],{"class":1086},[1050,6002,3955],{"class":1698},[1050,6004,1710],{"class":1086},[1050,6006,6007],{"class":1814},"create_task",[1050,6009,1818],{"class":1086},[1050,6011,2348],{"class":1082},[1050,6013,1710],{"class":1086},[1050,6015,6016],{"class":1814},"heartbeat_loop",[1050,6018,6019],{"class":1086},"())\n",[1050,6021,6022],{"class":1052,"line":1643},[1050,6023,2474],{"class":1698},[1050,6025,6026],{"class":1052,"line":1663},[1050,6027,6028],{"class":1056},"        # Update user status\n",[1050,6030,6031,6033,6035,6037,6040,6042,6044,6046,6048],{"class":1052,"line":1668},[1050,6032,2535],{"class":1694},[1050,6034,2375],{"class":1082},[1050,6036,1710],{"class":1086},[1050,6038,6039],{"class":1814},"update_user_status",[1050,6041,1818],{"class":1086},[1050,6043,1104],{"class":1096},[1050,6045,5639],{"class":1100},[1050,6047,1104],{"class":1096},[1050,6049,1837],{"class":1086},[1050,6051,6052],{"class":1052,"line":1673},[1050,6053,2474],{"class":1698},[1050,6055,6056],{"class":1052,"line":2857},[1050,6057,6058],{"class":1056},"        # Send user list and recent messages\n",[1050,6060,6061,6063,6065,6067,6070],{"class":1052,"line":2880},[1050,6062,2535],{"class":1694},[1050,6064,2375],{"class":1082},[1050,6066,1710],{"class":1086},[1050,6068,6069],{"class":1814},"send_user_list",[1050,6071,1860],{"class":1086},[1050,6073,6074,6076,6078,6080,6082],{"class":1052,"line":2912},[1050,6075,2535],{"class":1694},[1050,6077,2375],{"class":1082},[1050,6079,1710],{"class":1086},[1050,6081,2741],{"class":1814},[1050,6083,1860],{"class":1086},[1050,6085,6086],{"class":1052,"line":2917},[1050,6087,2474],{"class":1698},[1050,6089,6090],{"class":1052,"line":2922},[1050,6091,6092],{"class":1056},"        # Notify others\n",[1050,6094,6095,6097,6099,6101,6104,6106,6108,6111,6113],{"class":1052,"line":2928},[1050,6096,2535],{"class":1694},[1050,6098,2375],{"class":1082},[1050,6100,1710],{"class":1086},[1050,6102,6103],{"class":1814},"broadcast_user_status",[1050,6105,1818],{"class":1086},[1050,6107,1104],{"class":1096},[1050,6109,6110],{"class":1100},"joined",[1050,6112,1104],{"class":1096},[1050,6114,1837],{"class":1086},[1050,6116,6117],{"class":1052,"line":2934},[1050,6118,1903],{"class":1698},[1050,6120,6121,6123,6125,6127,6129,6131,6133,6135],{"class":1052,"line":2952},[1050,6122,2335],{"class":2128},[1050,6124,2338],{"class":2128},[1050,6126,2756],{"class":2341},[1050,6128,1818],{"class":1086},[1050,6130,2348],{"class":2347},[1050,6132,1180],{"class":1086},[1050,6134,2766],{"class":2765},[1050,6136,2313],{"class":1086},[1050,6138,6139,6141,6144],{"class":1052,"line":2963},[1050,6140,2355],{"class":2318},[1050,6142,6143],{"class":2322},"Enhanced disconnection handling.",[1050,6145,2326],{"class":2318},[1050,6147,6148],{"class":1052,"line":2972},[1050,6149,6150],{"class":1056},"        # Cancel heartbeat\n",[1050,6152,6153,6155,6157,6159,6161],{"class":1052,"line":2977},[1050,6154,2484],{"class":1694},[1050,6156,2375],{"class":1082},[1050,6158,1710],{"class":1086},[1050,6160,5606],{"class":1794},[1050,6162,2502],{"class":1086},[1050,6164,6165,6167,6169,6171,6173,6176],{"class":1052,"line":2982},[1050,6166,2554],{"class":1082},[1050,6168,1710],{"class":1086},[1050,6170,5606],{"class":1794},[1050,6172,1710],{"class":1086},[1050,6174,6175],{"class":1814},"cancel",[1050,6177,1860],{"class":1086},[1050,6179,6180],{"class":1052,"line":3003},[1050,6181,2474],{"class":1698},[1050,6183,6184],{"class":1052,"line":3013},[1050,6185,6028],{"class":1056},[1050,6187,6188,6190,6192,6194,6196,6198,6200,6203,6205],{"class":1052,"line":3021},[1050,6189,2535],{"class":1694},[1050,6191,2375],{"class":1082},[1050,6193,1710],{"class":1086},[1050,6195,6039],{"class":1814},[1050,6197,1818],{"class":1086},[1050,6199,1104],{"class":1096},[1050,6201,6202],{"class":1100},"offline",[1050,6204,1104],{"class":1096},[1050,6206,1837],{"class":1086},[1050,6208,6209],{"class":1052,"line":3044},[1050,6210,2474],{"class":1698},[1050,6212,6213],{"class":1052,"line":3078},[1050,6214,6092],{"class":1056},[1050,6216,6217,6219,6221,6223,6225,6227,6229,6232,6234],{"class":1052,"line":3083},[1050,6218,2535],{"class":1694},[1050,6220,2375],{"class":1082},[1050,6222,1710],{"class":1086},[1050,6224,6103],{"class":1814},[1050,6226,1818],{"class":1086},[1050,6228,1104],{"class":1096},[1050,6230,6231],{"class":1100},"left",[1050,6233,1104],{"class":1096},[1050,6235,1837],{"class":1086},[1050,6237,6238],{"class":1052,"line":3103},[1050,6239,2474],{"class":1698},[1050,6241,6242],{"class":1052,"line":3123},[1050,6243,6244],{"class":1056},"        # Leave room group\n",[1050,6246,6247,6249,6251,6253,6255,6257,6259,6261,6263],{"class":1052,"line":3142},[1050,6248,2484],{"class":1694},[1050,6250,2785],{"class":2784},[1050,6252,1818],{"class":1086},[1050,6254,2348],{"class":1082},[1050,6256,1180],{"class":1086},[1050,6258,1226],{"class":1096},[1050,6260,2419],{"class":1100},[1050,6262,1104],{"class":1096},[1050,6264,2313],{"class":1086},[1050,6266,6267,6269,6271,6273,6275,6277,6279],{"class":1052,"line":3160},[1050,6268,2507],{"class":1694},[1050,6270,2375],{"class":1082},[1050,6272,1710],{"class":1086},[1050,6274,2542],{"class":1794},[1050,6276,1710],{"class":1086},[1050,6278,2947],{"class":1814},[1050,6280,1925],{"class":1086},[1050,6282,6283,6285,6287,6289],{"class":1052,"line":3178},[1050,6284,2825],{"class":1082},[1050,6286,1710],{"class":1086},[1050,6288,2419],{"class":1794},[1050,6290,1107],{"class":1086},[1050,6292,6293,6295,6297],{"class":1052,"line":3192},[1050,6294,2825],{"class":1082},[1050,6296,1710],{"class":1086},[1050,6298,2569],{"class":1794},[1050,6300,6301],{"class":1052,"line":3200},[1050,6302,1959],{"class":1086},[1050,6304,6305],{"class":1052,"line":3223},[1050,6306,1903],{"class":1698},[1050,6308,6309,6311,6313,6315,6317,6319,6321,6323],{"class":1052,"line":3228},[1050,6310,2335],{"class":2128},[1050,6312,2338],{"class":2128},[1050,6314,2989],{"class":2341},[1050,6316,1818],{"class":1086},[1050,6318,2348],{"class":2347},[1050,6320,1180],{"class":1086},[1050,6322,2998],{"class":2765},[1050,6324,2313],{"class":1086},[1050,6326,6327,6329,6332],{"class":1052,"line":3243},[1050,6328,2355],{"class":2318},[1050,6330,6331],{"class":2322},"Enhanced message handling with validation.",[1050,6333,2326],{"class":2318},[1050,6335,6336,6338,6340,6342,6344,6346,6348,6351],{"class":1052,"line":3265},[1050,6337,2365],{"class":1082},[1050,6339,1710],{"class":1086},[1050,6341,5619],{"class":1794},[1050,6343,1087],{"class":1086},[1050,6345,5440],{"class":1698},[1050,6347,1710],{"class":1086},[1050,6349,6350],{"class":1814},"now",[1050,6352,1860],{"class":1086},[1050,6354,6355],{"class":1052,"line":3282},[1050,6356,2474],{"class":1698},[1050,6358,6359,6361],{"class":1052,"line":3319},[1050,6360,3016],{"class":1694},[1050,6362,2502],{"class":1086},[1050,6364,6365,6368,6370,6372,6374,6376,6378,6380],{"class":1052,"line":3324},[1050,6366,6367],{"class":1698},"            data ",[1050,6369,1854],{"class":1086},[1050,6371,3029],{"class":1698},[1050,6373,1710],{"class":1086},[1050,6375,3034],{"class":1814},[1050,6377,1818],{"class":1086},[1050,6379,3039],{"class":1814},[1050,6381,1837],{"class":1086},[1050,6383,6384,6386,6388,6390,6392,6394,6396,6398,6400,6402],{"class":1052,"line":3345},[1050,6385,3047],{"class":1698},[1050,6387,1854],{"class":1086},[1050,6389,3340],{"class":1698},[1050,6391,1710],{"class":1086},[1050,6393,3057],{"class":1814},[1050,6395,1818],{"class":1086},[1050,6397,1104],{"class":1096},[1050,6399,2644],{"class":1100},[1050,6401,1104],{"class":1096},[1050,6403,1837],{"class":1086},[1050,6405,6406],{"class":1052,"line":3355},[1050,6407,2925],{"class":1698},[1050,6409,6410],{"class":1052,"line":3390},[1050,6411,6412],{"class":1056},"            # Validate message structure\n",[1050,6414,6415,6417,6419,6421,6423,6425,6428,6430,6433],{"class":1052,"line":3395},[1050,6416,3086],{"class":1694},[1050,6418,2488],{"class":2487},[1050,6420,3453],{"class":1694},[1050,6422,2375],{"class":1082},[1050,6424,1710],{"class":1086},[1050,6426,6427],{"class":1814},"validate_message",[1050,6429,1818],{"class":1086},[1050,6431,6432],{"class":1814},"data",[1050,6434,2313],{"class":1086},[1050,6436,6437],{"class":1052,"line":3407},[1050,6438,6439],{"class":1694},"                return\n",[1050,6441,6442],{"class":1052,"line":3429},[1050,6443,2925],{"class":1698},[1050,6445,6446],{"class":1052,"line":3434},[1050,6447,6448],{"class":1056},"            # Route message based on type\n",[1050,6450,6451,6454,6456],{"class":1052,"line":3439},[1050,6452,6453],{"class":1698},"            handlers ",[1050,6455,1854],{"class":1086},[1050,6457,1254],{"class":1086},[1050,6459,6460,6462,6464,6466,6468,6470,6472,6474],{"class":1052,"line":3445},[1050,6461,2641],{"class":1096},[1050,6463,2687],{"class":1100},[1050,6465,1104],{"class":1096},[1050,6467,1267],{"class":1086},[1050,6469,2375],{"class":1082},[1050,6471,1710],{"class":1086},[1050,6473,3113],{"class":1794},[1050,6475,1107],{"class":1086},[1050,6477,6478,6480,6482,6484,6486,6488,6490,6493],{"class":1052,"line":3470},[1050,6479,2641],{"class":1096},[1050,6481,3135],{"class":1100},[1050,6483,1104],{"class":1096},[1050,6485,1267],{"class":1086},[1050,6487,2375],{"class":1082},[1050,6489,1710],{"class":1086},[1050,6491,6492],{"class":1794},"handle_typing",[1050,6494,1107],{"class":1086},[1050,6496,6497,6499,6502,6504,6506,6508,6510,6513],{"class":1052,"line":3475},[1050,6498,2641],{"class":1096},[1050,6500,6501],{"class":1100},"reaction",[1050,6503,1104],{"class":1096},[1050,6505,1267],{"class":1086},[1050,6507,2375],{"class":1082},[1050,6509,1710],{"class":1086},[1050,6511,6512],{"class":1794},"handle_reaction",[1050,6514,1107],{"class":1086},[1050,6516,6517,6519,6522,6524,6526,6528,6530,6533],{"class":1052,"line":3485},[1050,6518,2641],{"class":1096},[1050,6520,6521],{"class":1100},"edit",[1050,6523,1104],{"class":1096},[1050,6525,1267],{"class":1086},[1050,6527,2375],{"class":1082},[1050,6529,1710],{"class":1086},[1050,6531,6532],{"class":1794},"handle_edit_message",[1050,6534,1107],{"class":1086},[1050,6536,6537,6539,6542,6544,6546,6548,6550,6553],{"class":1052,"line":3491},[1050,6538,2641],{"class":1096},[1050,6540,6541],{"class":1100},"delete",[1050,6543,1104],{"class":1096},[1050,6545,1267],{"class":1086},[1050,6547,2375],{"class":1082},[1050,6549,1710],{"class":1086},[1050,6551,6552],{"class":1794},"handle_delete_message",[1050,6554,1107],{"class":1086},[1050,6556,6557,6559,6561,6563,6565,6567,6569,6571],{"class":1052,"line":3508},[1050,6558,2641],{"class":1096},[1050,6560,3171],{"class":1100},[1050,6562,1104],{"class":1096},[1050,6564,1267],{"class":1086},[1050,6566,2375],{"class":1082},[1050,6568,1710],{"class":1086},[1050,6570,3187],{"class":1794},[1050,6572,1107],{"class":1086},[1050,6574,6575,6577,6580,6582,6584,6586,6588,6591],{"class":1052,"line":3519},[1050,6576,2641],{"class":1096},[1050,6578,6579],{"class":1100},"status",[1050,6581,1104],{"class":1096},[1050,6583,1267],{"class":1086},[1050,6585,2375],{"class":1082},[1050,6587,1710],{"class":1086},[1050,6589,6590],{"class":1794},"handle_status_change",[1050,6592,1107],{"class":1086},[1050,6594,6595],{"class":1052,"line":3524},[1050,6596,2717],{"class":1086},[1050,6598,6599],{"class":1052,"line":3544},[1050,6600,2925],{"class":1698},[1050,6602,6603,6606,6608,6611,6613,6615,6617,6620],{"class":1052,"line":3559},[1050,6604,6605],{"class":1698},"            handler ",[1050,6607,1854],{"class":1086},[1050,6609,6610],{"class":1698}," handlers",[1050,6612,1710],{"class":1086},[1050,6614,3057],{"class":1814},[1050,6616,1818],{"class":1086},[1050,6618,6619],{"class":1814},"message_type",[1050,6621,1837],{"class":1086},[1050,6623,6624,6626,6629],{"class":1052,"line":3582},[1050,6625,3086],{"class":1694},[1050,6627,6628],{"class":1698}," handler",[1050,6630,2502],{"class":1086},[1050,6632,6633,6635,6637,6639,6641],{"class":1052,"line":3607},[1050,6634,3106],{"class":1694},[1050,6636,6628],{"class":1814},[1050,6638,1818],{"class":1086},[1050,6640,6432],{"class":1814},[1050,6642,1837],{"class":1086},[1050,6644,6645,6647],{"class":1052,"line":3634},[1050,6646,3195],{"class":1694},[1050,6648,2502],{"class":1086},[1050,6650,6651,6653,6655,6657,6659,6661,6663,6665,6667,6669,6671,6673,6675,6677,6679,6681,6683],{"class":1052,"line":3653},[1050,6652,3106],{"class":1694},[1050,6654,2375],{"class":1082},[1050,6656,1710],{"class":1086},[1050,6658,3209],{"class":1814},[1050,6660,1818],{"class":1086},[1050,6662,1104],{"class":1096},[1050,6664,3216],{"class":1100},[1050,6666,1104],{"class":1096},[1050,6668,1180],{"class":1086},[1050,6670,3340],{"class":1814},[1050,6672,1710],{"class":1086},[1050,6674,3057],{"class":1814},[1050,6676,1818],{"class":1086},[1050,6678,1104],{"class":1096},[1050,6680,3602],{"class":1100},[1050,6682,1104],{"class":1096},[1050,6684,6685],{"class":1086},"))\n",[1050,6687,6688],{"class":1052,"line":3658},[1050,6689,2474],{"class":1698},[1050,6691,6692,6694,6696,6698,6700],{"class":1052,"line":3663},[1050,6693,3231],{"class":1694},[1050,6695,3029],{"class":1698},[1050,6697,1710],{"class":1086},[1050,6699,3238],{"class":1794},[1050,6701,2502],{"class":1086},[1050,6703,6704,6706,6708,6710,6712,6714,6716,6719,6721],{"class":1052,"line":3668},[1050,6705,2507],{"class":1694},[1050,6707,2375],{"class":1082},[1050,6709,1710],{"class":1086},[1050,6711,3209],{"class":1814},[1050,6713,1818],{"class":1086},[1050,6715,1104],{"class":1096},[1050,6717,6718],{"class":1100},"Invalid JSON format",[1050,6720,1104],{"class":1096},[1050,6722,1837],{"class":1086},[1050,6724,6725,6727,6729,6731,6733],{"class":1052,"line":3688},[1050,6726,3231],{"class":1694},[1050,6728,3271],{"class":3270},[1050,6730,3274],{"class":1694},[1050,6732,3277],{"class":1698},[1050,6734,2502],{"class":1086},[1050,6736,6737,6739,6741,6743,6745,6747,6749,6751,6753,6755,6757,6759,6761,6763,6765],{"class":1052,"line":3698},[1050,6738,2507],{"class":1694},[1050,6740,2375],{"class":1082},[1050,6742,1710],{"class":1086},[1050,6744,3209],{"class":1814},[1050,6746,1818],{"class":1086},[1050,6748,3295],{"class":2128},[1050,6750,3298],{"class":1100},[1050,6752,2431],{"class":2430},[1050,6754,3303],{"class":3270},[1050,6756,1818],{"class":1086},[1050,6758,3308],{"class":1814},[1050,6760,2152],{"class":1086},[1050,6762,2440],{"class":2430},[1050,6764,1104],{"class":1100},[1050,6766,1837],{"class":1086},[1050,6768,6769],{"class":1052,"line":3729},[1050,6770,1903],{"class":1698},[1050,6772,6773,6775,6777,6779,6781,6783,6785,6787],{"class":1052,"line":3734},[1050,6774,2335],{"class":2128},[1050,6776,2338],{"class":2128},[1050,6778,3331],{"class":2341},[1050,6780,1818],{"class":1086},[1050,6782,2348],{"class":2347},[1050,6784,1180],{"class":1086},[1050,6786,3340],{"class":2765},[1050,6788,2313],{"class":1086},[1050,6790,6791,6793,6796],{"class":1052,"line":3740},[1050,6792,2355],{"class":2318},[1050,6794,6795],{"class":2322},"Handle chat message with advanced features.",[1050,6797,2326],{"class":2318},[1050,6799,6800,6803,6805,6807,6809,6811,6813,6815,6817,6819,6821,6823,6825,6827],{"class":1052,"line":3757},[1050,6801,6802],{"class":1698},"        content ",[1050,6804,1854],{"class":1086},[1050,6806,3340],{"class":1698},[1050,6808,1710],{"class":1086},[1050,6810,3057],{"class":1814},[1050,6812,1818],{"class":1086},[1050,6814,1104],{"class":1096},[1050,6816,2687],{"class":1100},[1050,6818,1104],{"class":1096},[1050,6820,1180],{"class":1086},[1050,6822,3379],{"class":1096},[1050,6824,3382],{"class":1086},[1050,6826,3385],{"class":1814},[1050,6828,1860],{"class":1086},[1050,6830,6831,6834,6836,6838,6840,6842,6844,6846,6849,6851],{"class":1052,"line":3768},[1050,6832,6833],{"class":1698},"        reply_to ",[1050,6835,1854],{"class":1086},[1050,6837,3340],{"class":1698},[1050,6839,1710],{"class":1086},[1050,6841,3057],{"class":1814},[1050,6843,1818],{"class":1086},[1050,6845,1104],{"class":1096},[1050,6847,6848],{"class":1100},"reply_to",[1050,6850,1104],{"class":1096},[1050,6852,1837],{"class":1086},[1050,6854,6855],{"class":1052,"line":3773},[1050,6856,2474],{"class":1698},[1050,6858,6859,6861,6863,6865],{"class":1052,"line":3793},[1050,6860,2484],{"class":1694},[1050,6862,2488],{"class":2487},[1050,6864,5050],{"class":1698},[1050,6866,2502],{"class":1086},[1050,6868,6869,6871,6873,6875,6877,6879,6881,6883,6885,6887,6889,6891,6893,6895,6897,6899,6901],{"class":1052,"line":3816},[1050,6870,2507],{"class":1694},[1050,6872,2375],{"class":1082},[1050,6874,1710],{"class":1086},[1050,6876,3209],{"class":1814},[1050,6878,1818],{"class":1086},[1050,6880,1104],{"class":1096},[1050,6882,3422],{"class":1100},[1050,6884,1104],{"class":1096},[1050,6886,1180],{"class":1086},[1050,6888,3340],{"class":1814},[1050,6890,1710],{"class":1086},[1050,6892,3057],{"class":1814},[1050,6894,1818],{"class":1086},[1050,6896,1104],{"class":1096},[1050,6898,3602],{"class":1100},[1050,6900,1104],{"class":1096},[1050,6902,6685],{"class":1086},[1050,6904,6905],{"class":1052,"line":3839},[1050,6906,2521],{"class":1694},[1050,6908,6909],{"class":1052,"line":3853},[1050,6910,2474],{"class":1698},[1050,6912,6913],{"class":1052,"line":3858},[1050,6914,6915],{"class":1056},"        # Content filtering\n",[1050,6917,6918,6920,6922,6924,6926,6929,6931,6933],{"class":1052,"line":3863},[1050,6919,2484],{"class":1694},[1050,6921,3453],{"class":1694},[1050,6923,2375],{"class":1082},[1050,6925,1710],{"class":1086},[1050,6927,6928],{"class":1814},"is_content_blocked",[1050,6930,1818],{"class":1086},[1050,6932,4925],{"class":1814},[1050,6934,2313],{"class":1086},[1050,6936,6937,6939,6941,6943,6945,6947,6949,6952,6954,6956,6958,6960,6962,6964,6966,6968,6970],{"class":1052,"line":3868},[1050,6938,2507],{"class":1694},[1050,6940,2375],{"class":1082},[1050,6942,1710],{"class":1086},[1050,6944,3209],{"class":1814},[1050,6946,1818],{"class":1086},[1050,6948,1104],{"class":1096},[1050,6950,6951],{"class":1100},"Message blocked by content filter",[1050,6953,1104],{"class":1096},[1050,6955,1180],{"class":1086},[1050,6957,3340],{"class":1814},[1050,6959,1710],{"class":1086},[1050,6961,3057],{"class":1814},[1050,6963,1818],{"class":1086},[1050,6965,1104],{"class":1096},[1050,6967,3602],{"class":1100},[1050,6969,1104],{"class":1096},[1050,6971,6685],{"class":1086},[1050,6973,6974],{"class":1052,"line":3884},[1050,6975,2521],{"class":1694},[1050,6977,6978],{"class":1052,"line":3894},[1050,6979,2474],{"class":1698},[1050,6981,6982],{"class":1052,"line":3923},[1050,6983,6984],{"class":1056},"        # Save message\n",[1050,6986,6987,6989,6991,6993,6995,6997,6999,7001,7003,7005,7008],{"class":1052,"line":3944},[1050,6988,3448],{"class":1698},[1050,6990,1854],{"class":1086},[1050,6992,3453],{"class":1694},[1050,6994,2375],{"class":1082},[1050,6996,1710],{"class":1086},[1050,6998,3460],{"class":1814},[1050,7000,1818],{"class":1086},[1050,7002,4925],{"class":1814},[1050,7004,1180],{"class":1086},[1050,7006,7007],{"class":1814}," reply_to",[1050,7009,1837],{"class":1086},[1050,7011,7012],{"class":1052,"line":3971},[1050,7013,2474],{"class":1698},[1050,7015,7016,7018,7020],{"class":1052,"line":3977},[1050,7017,2484],{"class":1694},[1050,7019,3480],{"class":1698},[1050,7021,2502],{"class":1086},[1050,7023,7024],{"class":1052,"line":3982},[1050,7025,7026],{"class":1056},"            # Broadcast message\n",[1050,7028,7029,7031,7033,7035,7037,7039,7041],{"class":1052,"line":3988},[1050,7030,2507],{"class":1694},[1050,7032,2375],{"class":1082},[1050,7034,1710],{"class":1086},[1050,7036,2542],{"class":1794},[1050,7038,1710],{"class":1086},[1050,7040,2619],{"class":1814},[1050,7042,1925],{"class":1086},[1050,7044,7045,7047,7049,7051],{"class":1052,"line":4009},[1050,7046,2825],{"class":1082},[1050,7048,1710],{"class":1086},[1050,7050,2419],{"class":1794},[1050,7052,1107],{"class":1086},[1050,7054,7055],{"class":1052,"line":4019},[1050,7056,1480],{"class":1086},[1050,7058,7059,7061,7063,7065,7067,7069,7071,7073],{"class":1052,"line":4044},[1050,7060,1486],{"class":1096},[1050,7062,2644],{"class":1100},[1050,7064,1104],{"class":1096},[1050,7066,1267],{"class":1086},[1050,7068,1226],{"class":1096},[1050,7070,3537],{"class":1100},[1050,7072,1104],{"class":1096},[1050,7074,1107],{"class":1086},[1050,7076,7077,7079,7081,7083,7085,7087,7089,7091],{"class":1052,"line":4063},[1050,7078,1486],{"class":1096},[1050,7080,3639],{"class":1100},[1050,7082,1104],{"class":1096},[1050,7084,1267],{"class":1086},[1050,7086,3480],{"class":1814},[1050,7088,1710],{"class":1086},[1050,7090,3602],{"class":1794},[1050,7092,1107],{"class":1086},[1050,7094,7095,7097,7099,7101,7103,7105],{"class":1052,"line":4087},[1050,7096,1486],{"class":1096},[1050,7098,4925],{"class":1100},[1050,7100,1104],{"class":1096},[1050,7102,1267],{"class":1086},[1050,7104,5050],{"class":1814},[1050,7106,1107],{"class":1086},[1050,7108,7109,7111,7113,7115,7117,7119,7121,7123,7125,7127],{"class":1052,"line":4110},[1050,7110,1486],{"class":1096},[1050,7112,2451],{"class":1100},[1050,7114,1104],{"class":1096},[1050,7116,1267],{"class":1086},[1050,7118,2375],{"class":1082},[1050,7120,1710],{"class":1086},[1050,7122,2451],{"class":1794},[1050,7124,1710],{"class":1086},[1050,7126,2678],{"class":1794},[1050,7128,1107],{"class":1086},[1050,7130,7131,7133,7135,7137,7139,7141,7143,7145,7147,7149],{"class":1052,"line":4133},[1050,7132,1486],{"class":1096},[1050,7134,3587],{"class":1100},[1050,7136,1104],{"class":1096},[1050,7138,1267],{"class":1086},[1050,7140,2375],{"class":1082},[1050,7142,1710],{"class":1086},[1050,7144,2451],{"class":1794},[1050,7146,1710],{"class":1086},[1050,7148,3602],{"class":1794},[1050,7150,1107],{"class":1086},[1050,7152,7153,7155,7157,7159,7161,7163,7165,7167,7169,7171],{"class":1052,"line":4156},[1050,7154,1486],{"class":1096},[1050,7156,3612],{"class":1100},[1050,7158,1104],{"class":1096},[1050,7160,1267],{"class":1086},[1050,7162,3480],{"class":1814},[1050,7164,1710],{"class":1086},[1050,7166,3623],{"class":1794},[1050,7168,1710],{"class":1086},[1050,7170,3628],{"class":1814},[1050,7172,3631],{"class":1086},[1050,7174,7175,7177,7179,7181,7183,7185],{"class":1052,"line":4179},[1050,7176,1486],{"class":1096},[1050,7178,6848],{"class":1100},[1050,7180,1104],{"class":1096},[1050,7182,1267],{"class":1086},[1050,7184,7007],{"class":1814},[1050,7186,1107],{"class":1086},[1050,7188,7189,7191,7194,7196,7198,7200,7202,7204,7206,7208,7210,7212,7214],{"class":1052,"line":4184},[1050,7190,1486],{"class":1096},[1050,7192,7193],{"class":1100},"client_id",[1050,7195,1104],{"class":1096},[1050,7197,1267],{"class":1086},[1050,7199,3340],{"class":1814},[1050,7201,1710],{"class":1086},[1050,7203,3057],{"class":1814},[1050,7205,1818],{"class":1086},[1050,7207,1104],{"class":1096},[1050,7209,3602],{"class":1100},[1050,7211,1104],{"class":1096},[1050,7213,2152],{"class":1086},[1050,7215,7216],{"class":1056},"  # For client-side correlation\n",[1050,7218,7219],{"class":1052,"line":4189},[1050,7220,1602],{"class":1086},[1050,7222,7223],{"class":1052,"line":4209},[1050,7224,1959],{"class":1086},[1050,7226,7227],{"class":1052,"line":4219},[1050,7228,1903],{"class":1698},[1050,7230,7231,7233,7235,7238,7240,7242,7244,7246],{"class":1052,"line":4225},[1050,7232,2335],{"class":2128},[1050,7234,2338],{"class":2128},[1050,7236,7237],{"class":2341}," handle_reaction",[1050,7239,1818],{"class":1086},[1050,7241,2348],{"class":2347},[1050,7243,1180],{"class":1086},[1050,7245,3340],{"class":2765},[1050,7247,2313],{"class":1086},[1050,7249,7250,7252,7255],{"class":1052,"line":4258},[1050,7251,2355],{"class":2318},[1050,7253,7254],{"class":2322},"Handle message reactions.",[1050,7256,2326],{"class":2318},[1050,7258,7259,7262,7264,7266,7268,7270,7272,7274,7276,7278],{"class":1052,"line":4283},[1050,7260,7261],{"class":1698},"        message_id ",[1050,7263,1854],{"class":1086},[1050,7265,3340],{"class":1698},[1050,7267,1710],{"class":1086},[1050,7269,3057],{"class":1814},[1050,7271,1818],{"class":1086},[1050,7273,1104],{"class":1096},[1050,7275,3639],{"class":1100},[1050,7277,1104],{"class":1096},[1050,7279,1837],{"class":1086},[1050,7281,7282,7285,7287,7289,7291,7293,7295,7297,7300,7302],{"class":1052,"line":4302},[1050,7283,7284],{"class":1698},"        emoji ",[1050,7286,1854],{"class":1086},[1050,7288,3340],{"class":1698},[1050,7290,1710],{"class":1086},[1050,7292,3057],{"class":1814},[1050,7294,1818],{"class":1086},[1050,7296,1104],{"class":1096},[1050,7298,7299],{"class":1100},"emoji",[1050,7301,1104],{"class":1096},[1050,7303,1837],{"class":1086},[1050,7305,7306,7309,7311,7313,7315,7317,7319,7321,7324,7326,7328,7330,7333,7335,7337],{"class":1052,"line":4325},[1050,7307,7308],{"class":1698},"        action ",[1050,7310,1854],{"class":1086},[1050,7312,3340],{"class":1698},[1050,7314,1710],{"class":1086},[1050,7316,3057],{"class":1814},[1050,7318,1818],{"class":1086},[1050,7320,1104],{"class":1096},[1050,7322,7323],{"class":1100},"action",[1050,7325,1104],{"class":1096},[1050,7327,1180],{"class":1086},[1050,7329,1226],{"class":1096},[1050,7331,7332],{"class":1100},"add",[1050,7334,1104],{"class":1096},[1050,7336,2152],{"class":1086},[1050,7338,7339],{"class":1056},"  # add or remove\n",[1050,7341,7342],{"class":1052,"line":4348},[1050,7343,2474],{"class":1698},[1050,7345,7346,7348,7350,7353,7356,7358,7361],{"class":1052,"line":4354},[1050,7347,2484],{"class":1694},[1050,7349,2488],{"class":2487},[1050,7351,7352],{"class":1698}," message_id ",[1050,7354,7355],{"class":2487},"or",[1050,7357,2488],{"class":2487},[1050,7359,7360],{"class":1698}," emoji",[1050,7362,2502],{"class":1086},[1050,7364,7365,7367,7369,7371,7373,7375,7377,7380,7382,7384,7386,7388,7390,7392,7394,7396,7398],{"class":1052,"line":4359},[1050,7366,2507],{"class":1694},[1050,7368,2375],{"class":1082},[1050,7370,1710],{"class":1086},[1050,7372,3209],{"class":1814},[1050,7374,1818],{"class":1086},[1050,7376,1104],{"class":1096},[1050,7378,7379],{"class":1100},"Invalid reaction data",[1050,7381,1104],{"class":1096},[1050,7383,1180],{"class":1086},[1050,7385,3340],{"class":1814},[1050,7387,1710],{"class":1086},[1050,7389,3057],{"class":1814},[1050,7391,1818],{"class":1086},[1050,7393,1104],{"class":1096},[1050,7395,3602],{"class":1100},[1050,7397,1104],{"class":1096},[1050,7399,6685],{"class":1086},[1050,7401,7402],{"class":1052,"line":4379},[1050,7403,2521],{"class":1694},[1050,7405,7406],{"class":1052,"line":4389},[1050,7407,2474],{"class":1698},[1050,7409,7410],{"class":1052,"line":4395},[1050,7411,7412],{"class":1056},"        # Save reaction\n",[1050,7414,7415,7418,7420,7422,7424,7426,7429,7431,7433,7435,7437,7439,7442],{"class":1052,"line":4426},[1050,7416,7417],{"class":1698},"        success ",[1050,7419,1854],{"class":1086},[1050,7421,3453],{"class":1694},[1050,7423,2375],{"class":1082},[1050,7425,1710],{"class":1086},[1050,7427,7428],{"class":1814},"save_reaction",[1050,7430,1818],{"class":1086},[1050,7432,3639],{"class":1814},[1050,7434,1180],{"class":1086},[1050,7436,7360],{"class":1814},[1050,7438,1180],{"class":1086},[1050,7440,7441],{"class":1814}," action",[1050,7443,1837],{"class":1086},[1050,7445,7446],{"class":1052,"line":4451},[1050,7447,2474],{"class":1698},[1050,7449,7450,7452,7455],{"class":1052,"line":4470},[1050,7451,2484],{"class":1694},[1050,7453,7454],{"class":1698}," success",[1050,7456,2502],{"class":1086},[1050,7458,7459],{"class":1052,"line":4493},[1050,7460,7461],{"class":1056},"            # Broadcast reaction\n",[1050,7463,7464,7466,7468,7470,7472,7474,7476],{"class":1052,"line":4516},[1050,7465,2507],{"class":1694},[1050,7467,2375],{"class":1082},[1050,7469,1710],{"class":1086},[1050,7471,2542],{"class":1794},[1050,7473,1710],{"class":1086},[1050,7475,2619],{"class":1814},[1050,7477,1925],{"class":1086},[1050,7479,7480,7482,7484,7486],{"class":1052,"line":4521},[1050,7481,2825],{"class":1082},[1050,7483,1710],{"class":1086},[1050,7485,2419],{"class":1794},[1050,7487,1107],{"class":1086},[1050,7489,7490],{"class":1052,"line":4526},[1050,7491,1480],{"class":1086},[1050,7493,7494,7496,7498,7500,7502,7504,7507,7509],{"class":1052,"line":4546},[1050,7495,1486],{"class":1096},[1050,7497,2644],{"class":1100},[1050,7499,1104],{"class":1096},[1050,7501,1267],{"class":1086},[1050,7503,1226],{"class":1096},[1050,7505,7506],{"class":1100},"message_reaction",[1050,7508,1104],{"class":1096},[1050,7510,1107],{"class":1086},[1050,7512,7513,7515,7517,7519,7521,7524],{"class":1052,"line":4556},[1050,7514,1486],{"class":1096},[1050,7516,3639],{"class":1100},[1050,7518,1104],{"class":1096},[1050,7520,1267],{"class":1086},[1050,7522,7523],{"class":1814}," message_id",[1050,7525,1107],{"class":1086},[1050,7527,7528,7530,7532,7534,7536,7538],{"class":1052,"line":4562},[1050,7529,1486],{"class":1096},[1050,7531,7299],{"class":1100},[1050,7533,1104],{"class":1096},[1050,7535,1267],{"class":1086},[1050,7537,7360],{"class":1814},[1050,7539,1107],{"class":1086},[1050,7541,7542,7544,7546,7548,7550,7552],{"class":1052,"line":4593},[1050,7543,1486],{"class":1096},[1050,7545,7323],{"class":1100},[1050,7547,1104],{"class":1096},[1050,7549,1267],{"class":1086},[1050,7551,7441],{"class":1814},[1050,7553,1107],{"class":1086},[1050,7555,7556,7558,7560,7562,7564,7566,7568,7570,7572,7574],{"class":1052,"line":4618},[1050,7557,1486],{"class":1096},[1050,7559,2451],{"class":1100},[1050,7561,1104],{"class":1096},[1050,7563,1267],{"class":1086},[1050,7565,2375],{"class":1082},[1050,7567,1710],{"class":1086},[1050,7569,2451],{"class":1794},[1050,7571,1710],{"class":1086},[1050,7573,2678],{"class":1794},[1050,7575,1107],{"class":1086},[1050,7577,7578,7580,7582,7584,7586,7588,7590,7592,7594],{"class":1052,"line":4637},[1050,7579,1486],{"class":1096},[1050,7581,3587],{"class":1100},[1050,7583,1104],{"class":1096},[1050,7585,1267],{"class":1086},[1050,7587,2375],{"class":1082},[1050,7589,1710],{"class":1086},[1050,7591,2451],{"class":1794},[1050,7593,1710],{"class":1086},[1050,7595,3650],{"class":1794},[1050,7597,7598],{"class":1052,"line":4660},[1050,7599,1602],{"class":1086},[1050,7601,7602],{"class":1052,"line":4683},[1050,7603,1959],{"class":1086},[1050,7605,7606],{"class":1052,"line":4688},[1050,7607,1903],{"class":1698},[1050,7609,7610,7612,7614,7617,7619,7621,7623,7625],{"class":1052,"line":4693},[1050,7611,2335],{"class":2128},[1050,7613,2338],{"class":2128},[1050,7615,7616],{"class":2341}," handle_edit_message",[1050,7618,1818],{"class":1086},[1050,7620,2348],{"class":2347},[1050,7622,1180],{"class":1086},[1050,7624,3340],{"class":2765},[1050,7626,2313],{"class":1086},[1050,7628,7629,7631,7634],{"class":1052,"line":4699},[1050,7630,2355],{"class":2318},[1050,7632,7633],{"class":2322},"Handle message editing.",[1050,7635,2326],{"class":2318},[1050,7637,7638,7640,7642,7644,7646,7648,7650,7652,7654,7656],{"class":1052,"line":4720},[1050,7639,7261],{"class":1698},[1050,7641,1854],{"class":1086},[1050,7643,3340],{"class":1698},[1050,7645,1710],{"class":1086},[1050,7647,3057],{"class":1814},[1050,7649,1818],{"class":1086},[1050,7651,1104],{"class":1096},[1050,7653,3639],{"class":1100},[1050,7655,1104],{"class":1096},[1050,7657,1837],{"class":1086},[1050,7659,7660,7663,7665,7667,7669,7671,7673,7675,7677,7679,7681,7683,7685,7687],{"class":1052,"line":4730},[1050,7661,7662],{"class":1698},"        new_content ",[1050,7664,1854],{"class":1086},[1050,7666,3340],{"class":1698},[1050,7668,1710],{"class":1086},[1050,7670,3057],{"class":1814},[1050,7672,1818],{"class":1086},[1050,7674,1104],{"class":1096},[1050,7676,4925],{"class":1100},[1050,7678,1104],{"class":1096},[1050,7680,1180],{"class":1086},[1050,7682,3379],{"class":1096},[1050,7684,3382],{"class":1086},[1050,7686,3385],{"class":1814},[1050,7688,1860],{"class":1086},[1050,7690,7691],{"class":1052,"line":4755},[1050,7692,2474],{"class":1698},[1050,7694,7695,7697,7699,7701,7703,7705,7708],{"class":1052,"line":4775},[1050,7696,2484],{"class":1694},[1050,7698,2488],{"class":2487},[1050,7700,7352],{"class":1698},[1050,7702,7355],{"class":2487},[1050,7704,2488],{"class":2487},[1050,7706,7707],{"class":1698}," new_content",[1050,7709,2502],{"class":1086},[1050,7711,7712,7714,7716,7718,7720,7722,7724,7727,7729,7731,7733,7735,7737,7739,7741,7743,7745],{"class":1052,"line":4789},[1050,7713,2507],{"class":1694},[1050,7715,2375],{"class":1082},[1050,7717,1710],{"class":1086},[1050,7719,3209],{"class":1814},[1050,7721,1818],{"class":1086},[1050,7723,1104],{"class":1096},[1050,7725,7726],{"class":1100},"Invalid edit data",[1050,7728,1104],{"class":1096},[1050,7730,1180],{"class":1086},[1050,7732,3340],{"class":1814},[1050,7734,1710],{"class":1086},[1050,7736,3057],{"class":1814},[1050,7738,1818],{"class":1086},[1050,7740,1104],{"class":1096},[1050,7742,3602],{"class":1100},[1050,7744,1104],{"class":1096},[1050,7746,6685],{"class":1086},[1050,7748,7749],{"class":1052,"line":4794},[1050,7750,2521],{"class":1694},[1050,7752,7753],{"class":1052,"line":4799},[1050,7754,2474],{"class":1698},[1050,7756,7757],{"class":1052,"line":4815},[1050,7758,7759],{"class":1056},"        # Check if user can edit this message\n",[1050,7761,7762,7764,7766,7768,7770,7772,7775,7777,7779],{"class":1052,"line":4825},[1050,7763,2484],{"class":1694},[1050,7765,2488],{"class":2487},[1050,7767,3453],{"class":1694},[1050,7769,2375],{"class":1082},[1050,7771,1710],{"class":1086},[1050,7773,7774],{"class":1814},"can_edit_message",[1050,7776,1818],{"class":1086},[1050,7778,3639],{"class":1814},[1050,7780,2313],{"class":1086},[1050,7782,7783,7785,7787,7789,7791,7793,7795,7798,7800,7802,7804,7806,7808,7810,7812,7814,7816],{"class":1052,"line":4844},[1050,7784,2507],{"class":1694},[1050,7786,2375],{"class":1082},[1050,7788,1710],{"class":1086},[1050,7790,3209],{"class":1814},[1050,7792,1818],{"class":1086},[1050,7794,1104],{"class":1096},[1050,7796,7797],{"class":1100},"Cannot edit this message",[1050,7799,1104],{"class":1096},[1050,7801,1180],{"class":1086},[1050,7803,3340],{"class":1814},[1050,7805,1710],{"class":1086},[1050,7807,3057],{"class":1814},[1050,7809,1818],{"class":1086},[1050,7811,1104],{"class":1096},[1050,7813,3602],{"class":1100},[1050,7815,1104],{"class":1096},[1050,7817,6685],{"class":1086},[1050,7819,7820],{"class":1052,"line":4849},[1050,7821,2521],{"class":1694},[1050,7823,7824],{"class":1052,"line":4866},[1050,7825,2474],{"class":1698},[1050,7827,7828],{"class":1052,"line":4891},[1050,7829,7830],{"class":1056},"        # Update message\n",[1050,7832,7833,7835,7837,7839,7841,7843,7846,7848,7850,7852,7854],{"class":1052,"line":4910},[1050,7834,7417],{"class":1698},[1050,7836,1854],{"class":1086},[1050,7838,3453],{"class":1694},[1050,7840,2375],{"class":1082},[1050,7842,1710],{"class":1086},[1050,7844,7845],{"class":1814},"update_message",[1050,7847,1818],{"class":1086},[1050,7849,3639],{"class":1814},[1050,7851,1180],{"class":1086},[1050,7853,7707],{"class":1814},[1050,7855,1837],{"class":1086},[1050,7857,7858],{"class":1052,"line":4930},[1050,7859,2474],{"class":1698},[1050,7861,7862,7864,7866],{"class":1052,"line":4953},[1050,7863,2484],{"class":1694},[1050,7865,7454],{"class":1698},[1050,7867,2502],{"class":1086},[1050,7869,7870],{"class":1052,"line":4976},[1050,7871,7872],{"class":1056},"            # Broadcast edit\n",[1050,7874,7875,7877,7879,7881,7883,7885,7887],{"class":1052,"line":4999},[1050,7876,2507],{"class":1694},[1050,7878,2375],{"class":1082},[1050,7880,1710],{"class":1086},[1050,7882,2542],{"class":1794},[1050,7884,1710],{"class":1086},[1050,7886,2619],{"class":1814},[1050,7888,1925],{"class":1086},[1050,7890,7891,7893,7895,7897],{"class":1052,"line":5016},[1050,7892,2825],{"class":1082},[1050,7894,1710],{"class":1086},[1050,7896,2419],{"class":1794},[1050,7898,1107],{"class":1086},[1050,7900,7901],{"class":1052,"line":5021},[1050,7902,1480],{"class":1086},[1050,7904,7905,7907,7909,7911,7913,7915,7918,7920],{"class":1052,"line":5026},[1050,7906,1486],{"class":1096},[1050,7908,2644],{"class":1100},[1050,7910,1104],{"class":1096},[1050,7912,1267],{"class":1086},[1050,7914,1226],{"class":1096},[1050,7916,7917],{"class":1100},"message_edited",[1050,7919,1104],{"class":1096},[1050,7921,1107],{"class":1086},[1050,7923,7924,7926,7928,7930,7932,7934],{"class":1052,"line":5035},[1050,7925,1486],{"class":1096},[1050,7927,3639],{"class":1100},[1050,7929,1104],{"class":1096},[1050,7931,1267],{"class":1086},[1050,7933,7523],{"class":1814},[1050,7935,1107],{"class":1086},[1050,7937,7938,7940,7942,7944,7946,7948],{"class":1052,"line":5055},[1050,7939,1486],{"class":1096},[1050,7941,4925],{"class":1100},[1050,7943,1104],{"class":1096},[1050,7945,1267],{"class":1086},[1050,7947,7707],{"class":1814},[1050,7949,1107],{"class":1086},[1050,7951,7952,7954,7956,7958,7960,7962,7964,7966,7968,7970],{"class":1052,"line":5065},[1050,7953,1486],{"class":1096},[1050,7955,2451],{"class":1100},[1050,7957,1104],{"class":1096},[1050,7959,1267],{"class":1086},[1050,7961,2375],{"class":1082},[1050,7963,1710],{"class":1086},[1050,7965,2451],{"class":1794},[1050,7967,1710],{"class":1086},[1050,7969,2678],{"class":1794},[1050,7971,1107],{"class":1086},[1050,7973,7974,7976,7979,7981,7983,7985,7987,7989,7991,7993],{"class":1052,"line":5072},[1050,7975,1486],{"class":1096},[1050,7977,7978],{"class":1100},"edited_at",[1050,7980,1104],{"class":1096},[1050,7982,1267],{"class":1086},[1050,7984,5440],{"class":1814},[1050,7986,1710],{"class":1086},[1050,7988,6350],{"class":1814},[1050,7990,3963],{"class":1086},[1050,7992,3628],{"class":1814},[1050,7994,1860],{"class":1086},[1050,7996,7997],{"class":1052,"line":5112},[1050,7998,1602],{"class":1086},[1050,8000,8001],{"class":1052,"line":5134},[1050,8002,1959],{"class":1086},[1050,8004,8005],{"class":1052,"line":5147},[1050,8006,1903],{"class":1698},[1050,8008,8009,8011,8013,8016,8018,8020],{"class":1052,"line":5163},[1050,8010,2335],{"class":2128},[1050,8012,2338],{"class":2128},[1050,8014,8015],{"class":2341}," heartbeat_loop",[1050,8017,1818],{"class":1086},[1050,8019,2348],{"class":2347},[1050,8021,2313],{"class":1086},[1050,8023,8024,8026,8029],{"class":1052,"line":5174},[1050,8025,2355],{"class":2318},[1050,8027,8028],{"class":2322},"Maintain connection with periodic heartbeat.",[1050,8030,2326],{"class":2318},[1050,8032,8033,8035],{"class":1052,"line":5179},[1050,8034,3016],{"class":1694},[1050,8036,2502],{"class":1086},[1050,8038,8039,8042,8045],{"class":1052,"line":5188},[1050,8040,8041],{"class":1694},"            while",[1050,8043,8044],{"class":3723}," True",[1050,8046,2502],{"class":1086},[1050,8048,8049,8051,8053,8055,8058,8060,8063,8065],{"class":1052,"line":5201},[1050,8050,3106],{"class":1694},[1050,8052,3955],{"class":1698},[1050,8054,1710],{"class":1086},[1050,8056,8057],{"class":1814},"sleep",[1050,8059,1818],{"class":1086},[1050,8061,8062],{"class":1334},"30",[1050,8064,2152],{"class":1086},[1050,8066,8067],{"class":1056},"  # Send heartbeat every 30 seconds\n",[1050,8069,8070],{"class":1052,"line":5224},[1050,8071,8072],{"class":1698},"                \n",[1050,8074,8075],{"class":1052,"line":5232},[1050,8076,8077],{"class":1056},"                # Check for inactive connections\n",[1050,8079,8080,8083,8085,8087,8089],{"class":1052,"line":5237},[1050,8081,8082],{"class":1694},"                if",[1050,8084,2375],{"class":1082},[1050,8086,1710],{"class":1086},[1050,8088,5619],{"class":1794},[1050,8090,2502],{"class":1086},[1050,8092,8093,8096,8098,8100,8102,8104,8107,8110,8112,8114],{"class":1052,"line":5244},[1050,8094,8095],{"class":1698},"                    inactive_time ",[1050,8097,1854],{"class":1086},[1050,8099,5440],{"class":1698},[1050,8101,1710],{"class":1086},[1050,8103,6350],{"class":1814},[1050,8105,8106],{"class":1086},"()",[1050,8108,8109],{"class":2487}," -",[1050,8111,2375],{"class":1082},[1050,8113,1710],{"class":1086},[1050,8115,8116],{"class":1794},"last_activity\n",[1050,8118,8119,8122,8125,8128,8131,8133,8136,8138,8140],{"class":1052,"line":5258},[1050,8120,8121],{"class":1694},"                    if",[1050,8123,8124],{"class":1698}," inactive_time ",[1050,8126,8127],{"class":2487},">",[1050,8129,8130],{"class":1814}," timedelta",[1050,8132,1818],{"class":1086},[1050,8134,8135],{"class":3908},"minutes",[1050,8137,1854],{"class":1086},[1050,8139,8062],{"class":1334},[1050,8141,2313],{"class":1086},[1050,8143,8144,8147,8149,8151,8153,8155,8157,8159,8162,8164],{"class":1052,"line":5268},[1050,8145,8146],{"class":1694},"                        await",[1050,8148,2375],{"class":1082},[1050,8150,1710],{"class":1086},[1050,8152,2514],{"class":1814},[1050,8154,1818],{"class":1086},[1050,8156,1047],{"class":3908},[1050,8158,1854],{"class":1086},[1050,8160,8161],{"class":1334},"4000",[1050,8163,2152],{"class":1086},[1050,8165,8166],{"class":1056},"  # Timeout\n",[1050,8168,8169],{"class":1052,"line":5275},[1050,8170,8171],{"class":1694},"                        break\n",[1050,8173,8174],{"class":1052,"line":5307},[1050,8175,8072],{"class":1698},[1050,8177,8178],{"class":1052,"line":5317},[1050,8179,8180],{"class":1056},"                # Send heartbeat\n",[1050,8182,8183,8185,8187,8189,8191,8193,8195,8197,8199,8201,8203],{"class":1052,"line":5342},[1050,8184,3106],{"class":1694},[1050,8186,2375],{"class":1082},[1050,8188,1710],{"class":1086},[1050,8190,3903],{"class":1814},[1050,8192,1818],{"class":1086},[1050,8194,3039],{"class":3908},[1050,8196,1854],{"class":1086},[1050,8198,3913],{"class":1814},[1050,8200,1710],{"class":1086},[1050,8202,3918],{"class":1814},[1050,8204,1876],{"class":1086},[1050,8206,8207,8209,8211,8213,8215,8217,8220,8222],{"class":1052,"line":5368},[1050,8208,1486],{"class":1096},[1050,8210,2644],{"class":1100},[1050,8212,1104],{"class":1096},[1050,8214,1267],{"class":1086},[1050,8216,1226],{"class":1096},[1050,8218,8219],{"class":1100},"heartbeat",[1050,8221,1104],{"class":1096},[1050,8223,1107],{"class":1086},[1050,8225,8226,8228,8230,8232,8234,8236,8238,8240,8242,8244],{"class":1052,"line":5378},[1050,8227,1486],{"class":1096},[1050,8229,3612],{"class":1100},[1050,8231,1104],{"class":1096},[1050,8233,1267],{"class":1086},[1050,8235,5440],{"class":1814},[1050,8237,1710],{"class":1086},[1050,8239,6350],{"class":1814},[1050,8241,3963],{"class":1086},[1050,8243,3628],{"class":1814},[1050,8245,1860],{"class":1086},[1050,8247,8248],{"class":1052,"line":5383},[1050,8249,8250],{"class":1086},"                }))\n",[1050,8252,8253],{"class":1052,"line":5397},[1050,8254,2474],{"class":1698},[1050,8256,8258,8260,8262,8264,8267],{"class":1052,"line":8257},222,[1050,8259,3231],{"class":1694},[1050,8261,3955],{"class":1698},[1050,8263,1710],{"class":1086},[1050,8265,8266],{"class":1794},"CancelledError",[1050,8268,2502],{"class":1086},[1050,8270,8272],{"class":1052,"line":8271},223,[1050,8273,8274],{"class":1694},"            pass\n",[1050,8276,8278],{"class":1052,"line":8277},224,[1050,8279,1903],{"class":1698},[1050,8281,8283],{"class":1052,"line":8282},225,[1050,8284,3985],{"class":1056},[1050,8286,8288,8290,8292,8294,8296,8298,8300,8302],{"class":1052,"line":8287},226,[1050,8289,2335],{"class":2128},[1050,8291,2338],{"class":2128},[1050,8293,3995],{"class":2341},[1050,8295,1818],{"class":1086},[1050,8297,2348],{"class":2347},[1050,8299,1180],{"class":1086},[1050,8301,4004],{"class":2765},[1050,8303,2313],{"class":1086},[1050,8305,8307,8309,8311],{"class":1052,"line":8306},227,[1050,8308,2355],{"class":2318},[1050,8310,4014],{"class":2322},[1050,8312,2326],{"class":2318},[1050,8314,8316,8318,8320,8322,8324,8326,8328,8330,8332,8334,8336],{"class":1052,"line":8315},228,[1050,8317,2535],{"class":1694},[1050,8319,2375],{"class":1082},[1050,8321,1710],{"class":1086},[1050,8323,3903],{"class":1814},[1050,8325,1818],{"class":1086},[1050,8327,3039],{"class":3908},[1050,8329,1854],{"class":1086},[1050,8331,3913],{"class":1814},[1050,8333,1710],{"class":1086},[1050,8335,3918],{"class":1814},[1050,8337,1876],{"class":1086},[1050,8339,8341,8343,8345,8347,8349,8351,8353,8355],{"class":1052,"line":8340},229,[1050,8342,3926],{"class":1096},[1050,8344,2644],{"class":1100},[1050,8346,1104],{"class":1096},[1050,8348,1267],{"class":1086},[1050,8350,1226],{"class":1096},[1050,8352,2687],{"class":1100},[1050,8354,1104],{"class":1096},[1050,8356,1107],{"class":1086},[1050,8358,8360,8362,8364,8366,8368,8370,8372,8374,8376,8378],{"class":1052,"line":8359},230,[1050,8361,3926],{"class":1096},[1050,8363,3639],{"class":1100},[1050,8365,1104],{"class":1096},[1050,8367,1267],{"class":1086},[1050,8369,4004],{"class":1814},[1050,8371,2383],{"class":1086},[1050,8373,1104],{"class":1096},[1050,8375,3639],{"class":1100},[1050,8377,1104],{"class":1096},[1050,8379,4084],{"class":1086},[1050,8381,8383,8385,8387,8389,8391,8393,8395,8397,8399,8401],{"class":1052,"line":8382},231,[1050,8384,3926],{"class":1096},[1050,8386,4925],{"class":1100},[1050,8388,1104],{"class":1096},[1050,8390,1267],{"class":1086},[1050,8392,4004],{"class":1814},[1050,8394,2383],{"class":1086},[1050,8396,1104],{"class":1096},[1050,8398,4925],{"class":1100},[1050,8400,1104],{"class":1096},[1050,8402,4084],{"class":1086},[1050,8404,8406,8408,8410,8412,8414,8416,8418,8420,8422,8424],{"class":1052,"line":8405},232,[1050,8407,3926],{"class":1096},[1050,8409,2451],{"class":1100},[1050,8411,1104],{"class":1096},[1050,8413,1267],{"class":1086},[1050,8415,4004],{"class":1814},[1050,8417,2383],{"class":1086},[1050,8419,1104],{"class":1096},[1050,8421,2451],{"class":1100},[1050,8423,1104],{"class":1096},[1050,8425,4084],{"class":1086},[1050,8427,8429,8431,8433,8435,8437,8439,8441,8443,8445,8447],{"class":1052,"line":8428},233,[1050,8430,3926],{"class":1096},[1050,8432,3587],{"class":1100},[1050,8434,1104],{"class":1096},[1050,8436,1267],{"class":1086},[1050,8438,4004],{"class":1814},[1050,8440,2383],{"class":1086},[1050,8442,1104],{"class":1096},[1050,8444,3587],{"class":1100},[1050,8446,1104],{"class":1096},[1050,8448,4084],{"class":1086},[1050,8450,8452,8454,8456,8458,8460,8462,8464,8466,8468,8470],{"class":1052,"line":8451},234,[1050,8453,3926],{"class":1096},[1050,8455,3612],{"class":1100},[1050,8457,1104],{"class":1096},[1050,8459,1267],{"class":1086},[1050,8461,4004],{"class":1814},[1050,8463,2383],{"class":1086},[1050,8465,1104],{"class":1096},[1050,8467,3612],{"class":1100},[1050,8469,1104],{"class":1096},[1050,8471,4084],{"class":1086},[1050,8473,8475,8477,8479,8481,8483,8485,8487,8489,8491,8493,8495,8497],{"class":1052,"line":8474},235,[1050,8476,3926],{"class":1096},[1050,8478,6848],{"class":1100},[1050,8480,1104],{"class":1096},[1050,8482,1267],{"class":1086},[1050,8484,4004],{"class":1814},[1050,8486,1710],{"class":1086},[1050,8488,3057],{"class":1814},[1050,8490,1818],{"class":1086},[1050,8492,1104],{"class":1096},[1050,8494,6848],{"class":1100},[1050,8496,1104],{"class":1096},[1050,8498,1516],{"class":1086},[1050,8500,8502,8504,8506,8508,8510,8512,8514,8516,8518,8520,8522,8524],{"class":1052,"line":8501},236,[1050,8503,3926],{"class":1096},[1050,8505,7193],{"class":1100},[1050,8507,1104],{"class":1096},[1050,8509,1267],{"class":1086},[1050,8511,4004],{"class":1814},[1050,8513,1710],{"class":1086},[1050,8515,3057],{"class":1814},[1050,8517,1818],{"class":1086},[1050,8519,1104],{"class":1096},[1050,8521,7193],{"class":1100},[1050,8523,1104],{"class":1096},[1050,8525,1837],{"class":1086},[1050,8527,8529],{"class":1052,"line":8528},237,[1050,8530,3974],{"class":1086},[1050,8532,8534],{"class":1052,"line":8533},238,[1050,8535,1903],{"class":1698},[1050,8537,8539,8541,8543,8546,8548,8550,8552,8554],{"class":1052,"line":8538},239,[1050,8540,2335],{"class":2128},[1050,8542,2338],{"class":2128},[1050,8544,8545],{"class":2341}," message_reaction",[1050,8547,1818],{"class":1086},[1050,8549,2348],{"class":2347},[1050,8551,1180],{"class":1086},[1050,8553,4004],{"class":2765},[1050,8555,2313],{"class":1086},[1050,8557,8559,8561,8564],{"class":1052,"line":8558},240,[1050,8560,2355],{"class":2318},[1050,8562,8563],{"class":2322},"Send message reaction to WebSocket.",[1050,8565,2326],{"class":2318},[1050,8567,8569,8571,8573,8575,8577,8579,8581,8583,8585,8587,8589],{"class":1052,"line":8568},241,[1050,8570,2535],{"class":1694},[1050,8572,2375],{"class":1082},[1050,8574,1710],{"class":1086},[1050,8576,3903],{"class":1814},[1050,8578,1818],{"class":1086},[1050,8580,3039],{"class":3908},[1050,8582,1854],{"class":1086},[1050,8584,3913],{"class":1814},[1050,8586,1710],{"class":1086},[1050,8588,3918],{"class":1814},[1050,8590,1876],{"class":1086},[1050,8592,8594,8596,8598,8600,8602,8604,8606,8608],{"class":1052,"line":8593},242,[1050,8595,3926],{"class":1096},[1050,8597,2644],{"class":1100},[1050,8599,1104],{"class":1096},[1050,8601,1267],{"class":1086},[1050,8603,1226],{"class":1096},[1050,8605,6501],{"class":1100},[1050,8607,1104],{"class":1096},[1050,8609,1107],{"class":1086},[1050,8611,8613,8615,8617,8619,8621,8623,8625,8627,8629,8631],{"class":1052,"line":8612},243,[1050,8614,3926],{"class":1096},[1050,8616,3639],{"class":1100},[1050,8618,1104],{"class":1096},[1050,8620,1267],{"class":1086},[1050,8622,4004],{"class":1814},[1050,8624,2383],{"class":1086},[1050,8626,1104],{"class":1096},[1050,8628,3639],{"class":1100},[1050,8630,1104],{"class":1096},[1050,8632,4084],{"class":1086},[1050,8634,8636,8638,8640,8642,8644,8646,8648,8650,8652,8654],{"class":1052,"line":8635},244,[1050,8637,3926],{"class":1096},[1050,8639,7299],{"class":1100},[1050,8641,1104],{"class":1096},[1050,8643,1267],{"class":1086},[1050,8645,4004],{"class":1814},[1050,8647,2383],{"class":1086},[1050,8649,1104],{"class":1096},[1050,8651,7299],{"class":1100},[1050,8653,1104],{"class":1096},[1050,8655,4084],{"class":1086},[1050,8657,8659,8661,8663,8665,8667,8669,8671,8673,8675,8677],{"class":1052,"line":8658},245,[1050,8660,3926],{"class":1096},[1050,8662,7323],{"class":1100},[1050,8664,1104],{"class":1096},[1050,8666,1267],{"class":1086},[1050,8668,4004],{"class":1814},[1050,8670,2383],{"class":1086},[1050,8672,1104],{"class":1096},[1050,8674,7323],{"class":1100},[1050,8676,1104],{"class":1096},[1050,8678,4084],{"class":1086},[1050,8680,8682,8684,8686,8688,8690,8692,8694,8696,8698,8700],{"class":1052,"line":8681},246,[1050,8683,3926],{"class":1096},[1050,8685,2451],{"class":1100},[1050,8687,1104],{"class":1096},[1050,8689,1267],{"class":1086},[1050,8691,4004],{"class":1814},[1050,8693,2383],{"class":1086},[1050,8695,1104],{"class":1096},[1050,8697,2451],{"class":1100},[1050,8699,1104],{"class":1096},[1050,8701,4084],{"class":1086},[1050,8703,8705,8707,8709,8711,8713,8715,8717,8719,8721,8723],{"class":1052,"line":8704},247,[1050,8706,3926],{"class":1096},[1050,8708,3587],{"class":1100},[1050,8710,1104],{"class":1096},[1050,8712,1267],{"class":1086},[1050,8714,4004],{"class":1814},[1050,8716,2383],{"class":1086},[1050,8718,1104],{"class":1096},[1050,8720,3587],{"class":1100},[1050,8722,1104],{"class":1096},[1050,8724,1204],{"class":1086},[1050,8726,8728],{"class":1052,"line":8727},248,[1050,8729,3974],{"class":1086},[1050,8731,8733],{"class":1052,"line":8732},249,[1050,8734,1903],{"class":1698},[1050,8736,8738,8740,8742,8745,8747,8749,8751,8753],{"class":1052,"line":8737},250,[1050,8739,2335],{"class":2128},[1050,8741,2338],{"class":2128},[1050,8743,8744],{"class":2341}," message_edited",[1050,8746,1818],{"class":1086},[1050,8748,2348],{"class":2347},[1050,8750,1180],{"class":1086},[1050,8752,4004],{"class":2765},[1050,8754,2313],{"class":1086},[1050,8756,8758,8760,8763],{"class":1052,"line":8757},251,[1050,8759,2355],{"class":2318},[1050,8761,8762],{"class":2322},"Send message edit notification to WebSocket.",[1050,8764,2326],{"class":2318},[1050,8766,8768,8770,8772,8774,8776,8778,8780,8782,8784,8786,8788],{"class":1052,"line":8767},252,[1050,8769,2535],{"class":1694},[1050,8771,2375],{"class":1082},[1050,8773,1710],{"class":1086},[1050,8775,3903],{"class":1814},[1050,8777,1818],{"class":1086},[1050,8779,3039],{"class":3908},[1050,8781,1854],{"class":1086},[1050,8783,3913],{"class":1814},[1050,8785,1710],{"class":1086},[1050,8787,3918],{"class":1814},[1050,8789,1876],{"class":1086},[1050,8791,8793,8795,8797,8799,8801,8803,8805,8807],{"class":1052,"line":8792},253,[1050,8794,3926],{"class":1096},[1050,8796,2644],{"class":1100},[1050,8798,1104],{"class":1096},[1050,8800,1267],{"class":1086},[1050,8802,1226],{"class":1096},[1050,8804,7917],{"class":1100},[1050,8806,1104],{"class":1096},[1050,8808,1107],{"class":1086},[1050,8810,8812,8814,8816,8818,8820,8822,8824,8826,8828,8830],{"class":1052,"line":8811},254,[1050,8813,3926],{"class":1096},[1050,8815,3639],{"class":1100},[1050,8817,1104],{"class":1096},[1050,8819,1267],{"class":1086},[1050,8821,4004],{"class":1814},[1050,8823,2383],{"class":1086},[1050,8825,1104],{"class":1096},[1050,8827,3639],{"class":1100},[1050,8829,1104],{"class":1096},[1050,8831,4084],{"class":1086},[1050,8833,8835,8837,8839,8841,8843,8845,8847,8849,8851,8853],{"class":1052,"line":8834},255,[1050,8836,3926],{"class":1096},[1050,8838,4925],{"class":1100},[1050,8840,1104],{"class":1096},[1050,8842,1267],{"class":1086},[1050,8844,4004],{"class":1814},[1050,8846,2383],{"class":1086},[1050,8848,1104],{"class":1096},[1050,8850,4925],{"class":1100},[1050,8852,1104],{"class":1096},[1050,8854,4084],{"class":1086},[1050,8856,8858,8860,8862,8864,8866,8868,8870,8872,8874,8876],{"class":1052,"line":8857},256,[1050,8859,3926],{"class":1096},[1050,8861,2451],{"class":1100},[1050,8863,1104],{"class":1096},[1050,8865,1267],{"class":1086},[1050,8867,4004],{"class":1814},[1050,8869,2383],{"class":1086},[1050,8871,1104],{"class":1096},[1050,8873,2451],{"class":1100},[1050,8875,1104],{"class":1096},[1050,8877,4084],{"class":1086},[1050,8879,8881,8883,8885,8887,8889,8891,8893,8895,8897,8899],{"class":1052,"line":8880},257,[1050,8882,3926],{"class":1096},[1050,8884,7978],{"class":1100},[1050,8886,1104],{"class":1096},[1050,8888,1267],{"class":1086},[1050,8890,4004],{"class":1814},[1050,8892,2383],{"class":1086},[1050,8894,1104],{"class":1096},[1050,8896,7978],{"class":1100},[1050,8898,1104],{"class":1096},[1050,8900,1204],{"class":1086},[1050,8902,8904],{"class":1052,"line":8903},258,[1050,8905,3974],{"class":1086},[1050,8907,8909],{"class":1052,"line":8908},259,[1050,8910,1903],{"class":1698},[1050,8912,8914,8916,8918,8921,8923,8925,8927,8929],{"class":1052,"line":8913},260,[1050,8915,2335],{"class":2128},[1050,8917,2338],{"class":2128},[1050,8919,8920],{"class":2341}," user_status_changed",[1050,8922,1818],{"class":1086},[1050,8924,2348],{"class":2347},[1050,8926,1180],{"class":1086},[1050,8928,4004],{"class":2765},[1050,8930,2313],{"class":1086},[1050,8932,8934,8936,8939],{"class":1052,"line":8933},261,[1050,8935,2355],{"class":2318},[1050,8937,8938],{"class":2322},"Send user status change to WebSocket.",[1050,8940,2326],{"class":2318},[1050,8942,8944,8946,8948,8950,8952,8954,8956,8958,8960,8962,8964,8966,8968,8970,8972],{"class":1052,"line":8943},262,[1050,8945,2484],{"class":1694},[1050,8947,4004],{"class":1698},[1050,8949,2383],{"class":1086},[1050,8951,1104],{"class":1096},[1050,8953,3587],{"class":1100},[1050,8955,1104],{"class":1096},[1050,8957,4240],{"class":1086},[1050,8959,4243],{"class":2487},[1050,8961,2375],{"class":1082},[1050,8963,1710],{"class":1086},[1050,8965,2451],{"class":1794},[1050,8967,1710],{"class":1086},[1050,8969,3602],{"class":1794},[1050,8971,1267],{"class":1086},[1050,8973,8974],{"class":1056},"  # Don't send to self\n",[1050,8976,8978,8980,8982,8984,8986,8988,8990,8992,8994,8996,8998],{"class":1052,"line":8977},263,[1050,8979,2507],{"class":1694},[1050,8981,2375],{"class":1082},[1050,8983,1710],{"class":1086},[1050,8985,3903],{"class":1814},[1050,8987,1818],{"class":1086},[1050,8989,3039],{"class":3908},[1050,8991,1854],{"class":1086},[1050,8993,3913],{"class":1814},[1050,8995,1710],{"class":1086},[1050,8997,3918],{"class":1814},[1050,8999,1876],{"class":1086},[1050,9001,9003,9005,9007,9009,9011,9013,9015,9017],{"class":1052,"line":9002},264,[1050,9004,2641],{"class":1096},[1050,9006,2644],{"class":1100},[1050,9008,1104],{"class":1096},[1050,9010,1267],{"class":1086},[1050,9012,1226],{"class":1096},[1050,9014,5632],{"class":1100},[1050,9016,1104],{"class":1096},[1050,9018,1107],{"class":1086},[1050,9020,9022,9024,9026,9028,9030,9032,9034,9036,9038,9040],{"class":1052,"line":9021},265,[1050,9023,2641],{"class":1096},[1050,9025,2451],{"class":1100},[1050,9027,1104],{"class":1096},[1050,9029,1267],{"class":1086},[1050,9031,4004],{"class":1814},[1050,9033,2383],{"class":1086},[1050,9035,1104],{"class":1096},[1050,9037,2451],{"class":1100},[1050,9039,1104],{"class":1096},[1050,9041,4084],{"class":1086},[1050,9043,9045,9047,9049,9051,9053,9055,9057,9059,9061,9063],{"class":1052,"line":9044},266,[1050,9046,2641],{"class":1096},[1050,9048,6579],{"class":1100},[1050,9050,1104],{"class":1096},[1050,9052,1267],{"class":1086},[1050,9054,4004],{"class":1814},[1050,9056,2383],{"class":1086},[1050,9058,1104],{"class":1096},[1050,9060,6579],{"class":1100},[1050,9062,1104],{"class":1096},[1050,9064,4084],{"class":1086},[1050,9066,9068,9070,9072,9074,9076,9078,9080,9082,9084,9086],{"class":1052,"line":9067},267,[1050,9069,2641],{"class":1096},[1050,9071,3612],{"class":1100},[1050,9073,1104],{"class":1096},[1050,9075,1267],{"class":1086},[1050,9077,4004],{"class":1814},[1050,9079,2383],{"class":1086},[1050,9081,1104],{"class":1096},[1050,9083,3612],{"class":1100},[1050,9085,1104],{"class":1096},[1050,9087,1204],{"class":1086},[1050,9089,9091],{"class":1052,"line":9090},268,[1050,9092,4351],{"class":1086},[1050,9094,9096],{"class":1052,"line":9095},269,[1050,9097,1903],{"class":1698},[1050,9099,9101],{"class":1052,"line":9100},270,[1050,9102,4696],{"class":1056},[1050,9104,9106,9108,9110,9113,9115,9117,9119,9121],{"class":1052,"line":9105},271,[1050,9107,2335],{"class":2128},[1050,9109,2338],{"class":2128},[1050,9111,9112],{"class":2341}," validate_message",[1050,9114,1818],{"class":1086},[1050,9116,2348],{"class":2347},[1050,9118,1180],{"class":1086},[1050,9120,3340],{"class":2765},[1050,9122,2313],{"class":1086},[1050,9124,9126,9128,9131],{"class":1052,"line":9125},272,[1050,9127,2355],{"class":2318},[1050,9129,9130],{"class":2322},"Validate incoming message structure.",[1050,9132,2326],{"class":2318},[1050,9134,9136,9139,9141,9144,9146,9148,9150],{"class":1052,"line":9135},273,[1050,9137,9138],{"class":1698},"        required_fields ",[1050,9140,1854],{"class":1086},[1050,9142,9143],{"class":1086}," [",[1050,9145,1104],{"class":1096},[1050,9147,2644],{"class":1100},[1050,9149,1104],{"class":1096},[1050,9151,1204],{"class":1086},[1050,9153,9155],{"class":1052,"line":9154},274,[1050,9156,2474],{"class":1698},[1050,9158,9160,9162,9165,9167,9170],{"class":1052,"line":9159},275,[1050,9161,4852],{"class":1694},[1050,9163,9164],{"class":1698}," field ",[1050,9166,4858],{"class":1694},[1050,9168,9169],{"class":1698}," required_fields",[1050,9171,2502],{"class":1086},[1050,9173,9175,9177,9179,9182,9185,9187],{"class":1052,"line":9174},276,[1050,9176,3086],{"class":1694},[1050,9178,9164],{"class":1698},[1050,9180,9181],{"class":2487},"not",[1050,9183,9184],{"class":2487}," in",[1050,9186,3340],{"class":1698},[1050,9188,2502],{"class":1086},[1050,9190,9192,9194,9196,9198,9200,9202,9204,9207,9209,9212,9214,9216,9218,9220,9222,9224,9226,9228,9230,9232],{"class":1052,"line":9191},277,[1050,9193,3106],{"class":1694},[1050,9195,2375],{"class":1082},[1050,9197,1710],{"class":1086},[1050,9199,3209],{"class":1814},[1050,9201,1818],{"class":1086},[1050,9203,3295],{"class":2128},[1050,9205,9206],{"class":1100},"'Missing required field: ",[1050,9208,2431],{"class":2430},[1050,9210,9211],{"class":1814},"field",[1050,9213,2440],{"class":2430},[1050,9215,1104],{"class":1100},[1050,9217,1180],{"class":1086},[1050,9219,3340],{"class":1814},[1050,9221,1710],{"class":1086},[1050,9223,3057],{"class":1814},[1050,9225,1818],{"class":1086},[1050,9227,1104],{"class":1096},[1050,9229,3602],{"class":1100},[1050,9231,1104],{"class":1096},[1050,9233,6685],{"class":1086},[1050,9235,9237,9240],{"class":1052,"line":9236},278,[1050,9238,9239],{"class":1694},"                return",[1050,9241,9242],{"class":3723}," False\n",[1050,9244,9246],{"class":1052,"line":9245},279,[1050,9247,2474],{"class":1698},[1050,9249,9251,9254],{"class":1052,"line":9250},280,[1050,9252,9253],{"class":1694},"        return",[1050,9255,9256],{"class":3723}," True\n",[1050,9258,9260],{"class":1052,"line":9259},281,[1050,9261,1903],{"class":1698},[1050,9263,9265,9267],{"class":1052,"line":9264},282,[1050,9266,5029],{"class":1086},[1050,9268,5032],{"class":2341},[1050,9270,9272,9274,9277,9279,9281],{"class":1052,"line":9271},283,[1050,9273,5038],{"class":2128},[1050,9275,9276],{"class":2341}," is_user_banned",[1050,9278,1818],{"class":1086},[1050,9280,2348],{"class":2347},[1050,9282,2313],{"class":1086},[1050,9284,9286,9288,9291],{"class":1052,"line":9285},284,[1050,9287,2355],{"class":2318},[1050,9289,9290],{"class":2322},"Check if user is banned from room.",[1050,9292,2326],{"class":2318},[1050,9294,9296],{"class":1052,"line":9295},285,[1050,9297,9298],{"class":1056},"        # Implement ban checking logic\n",[1050,9300,9302,9304],{"class":1052,"line":9301},286,[1050,9303,9253],{"class":1694},[1050,9305,9242],{"class":3723},[1050,9307,9309],{"class":1052,"line":9308},287,[1050,9310,1903],{"class":1698},[1050,9312,9314,9316],{"class":1052,"line":9313},288,[1050,9315,5029],{"class":1086},[1050,9317,9318],{"class":2341},"sync_to_async\n",[1050,9320,9322,9324,9327,9329,9331],{"class":1052,"line":9321},289,[1050,9323,5038],{"class":2128},[1050,9325,9326],{"class":2341}," check_rate_limit",[1050,9328,1818],{"class":1086},[1050,9330,2348],{"class":2347},[1050,9332,2313],{"class":1086},[1050,9334,9336,9338,9341],{"class":1052,"line":9335},290,[1050,9337,2355],{"class":2318},[1050,9339,9340],{"class":2322},"Check rate limiting for user.",[1050,9342,2326],{"class":2318},[1050,9344,9346,9349,9351,9353,9356,9358,9360,9362,9364,9366,9368,9370,9373,9375,9377,9379,9381,9383],{"class":1052,"line":9345},291,[1050,9347,9348],{"class":1698},"        cache_key ",[1050,9350,1854],{"class":1086},[1050,9352,2424],{"class":2128},[1050,9354,9355],{"class":1100},"'rate_limit_",[1050,9357,2431],{"class":2430},[1050,9359,2348],{"class":1082},[1050,9361,1710],{"class":1086},[1050,9363,2451],{"class":1794},[1050,9365,1710],{"class":1086},[1050,9367,3602],{"class":1794},[1050,9369,2440],{"class":2430},[1050,9371,9372],{"class":1100},"_",[1050,9374,2431],{"class":2430},[1050,9376,2348],{"class":1082},[1050,9378,1710],{"class":1086},[1050,9380,2370],{"class":1794},[1050,9382,2440],{"class":2430},[1050,9384,1232],{"class":1100},[1050,9386,9388,9391,9393,9396,9398,9400,9402,9405,9407,9409],{"class":1052,"line":9387},292,[1050,9389,9390],{"class":1698},"        current_count ",[1050,9392,1854],{"class":1086},[1050,9394,9395],{"class":1698}," cache",[1050,9397,1710],{"class":1086},[1050,9399,3057],{"class":1814},[1050,9401,1818],{"class":1086},[1050,9403,9404],{"class":1814},"cache_key",[1050,9406,1180],{"class":1086},[1050,9408,1594],{"class":1334},[1050,9410,1837],{"class":1086},[1050,9412,9414],{"class":1052,"line":9413},293,[1050,9415,2474],{"class":1698},[1050,9417,9419,9421,9424,9427,9430,9432],{"class":1052,"line":9418},294,[1050,9420,2484],{"class":1694},[1050,9422,9423],{"class":1698}," current_count ",[1050,9425,9426],{"class":2487},">=",[1050,9428,9429],{"class":1334}," 100",[1050,9431,1267],{"class":1086},[1050,9433,9434],{"class":1056},"  # Max 100 connections per hour\n",[1050,9436,9438,9440],{"class":1052,"line":9437},295,[1050,9439,5182],{"class":1694},[1050,9441,9242],{"class":3723},[1050,9443,9445],{"class":1052,"line":9444},296,[1050,9446,2474],{"class":1698},[1050,9448,9450,9453,9455,9458,9460,9462,9464,9466,9468,9471,9473,9476,9478],{"class":1052,"line":9449},297,[1050,9451,9452],{"class":1698},"        cache",[1050,9454,1710],{"class":1086},[1050,9456,9457],{"class":1814},"set",[1050,9459,1818],{"class":1086},[1050,9461,9404],{"class":1814},[1050,9463,1180],{"class":1086},[1050,9465,9423],{"class":1814},[1050,9467,2149],{"class":2487},[1050,9469,9470],{"class":1334}," 1",[1050,9472,1180],{"class":1086},[1050,9474,9475],{"class":1334}," 3600",[1050,9477,2152],{"class":1086},[1050,9479,9480],{"class":1056},"  # 1 hour\n",[1050,9482,9484,9486],{"class":1052,"line":9483},298,[1050,9485,9253],{"class":1694},[1050,9487,9256],{"class":3723},[1050,9489,9491],{"class":1052,"line":9490},299,[1050,9492,1903],{"class":1698},[1050,9494,9496,9498],{"class":1052,"line":9495},300,[1050,9497,5029],{"class":1086},[1050,9499,9318],{"class":2341},[1050,9501,9503,9505,9508,9510,9512,9514,9516],{"class":1052,"line":9502},301,[1050,9504,5038],{"class":2128},[1050,9506,9507],{"class":2341}," is_content_blocked",[1050,9509,1818],{"class":1086},[1050,9511,2348],{"class":2347},[1050,9513,1180],{"class":1086},[1050,9515,5050],{"class":2765},[1050,9517,2313],{"class":1086},[1050,9519,9521,9523,9526],{"class":1052,"line":9520},302,[1050,9522,2355],{"class":2318},[1050,9524,9525],{"class":2322},"Check if content should be blocked.",[1050,9527,2326],{"class":2318},[1050,9529,9531],{"class":1052,"line":9530},303,[1050,9532,9533],{"class":1056},"        # Implement content filtering logic\n",[1050,9535,9537,9540,9542,9544,9546,9549,9551,9553,9555,9558,9560,9562],{"class":1052,"line":9536},304,[1050,9538,9539],{"class":1698},"        blocked_words ",[1050,9541,1854],{"class":1086},[1050,9543,9143],{"class":1086},[1050,9545,1104],{"class":1096},[1050,9547,9548],{"class":1100},"spam",[1050,9550,1104],{"class":1096},[1050,9552,1180],{"class":1086},[1050,9554,1226],{"class":1096},[1050,9556,9557],{"class":1100},"abuse",[1050,9559,1104],{"class":1096},[1050,9561,4240],{"class":1086},[1050,9563,9564],{"class":1056},"  # Example\n",[1050,9566,9568,9570,9573,9575,9578,9580,9582,9584,9587,9589,9592,9595,9597,9600],{"class":1052,"line":9567},305,[1050,9569,9253],{"class":1694},[1050,9571,9572],{"class":2784}," any",[1050,9574,1818],{"class":1086},[1050,9576,9577],{"class":1814},"word ",[1050,9579,4858],{"class":1694},[1050,9581,5050],{"class":1814},[1050,9583,1710],{"class":1086},[1050,9585,9586],{"class":1814},"lower",[1050,9588,8106],{"class":1086},[1050,9590,9591],{"class":1694}," for",[1050,9593,9594],{"class":1814}," word ",[1050,9596,4858],{"class":1694},[1050,9598,9599],{"class":1814}," blocked_words",[1050,9601,1837],{"class":1086},[1050,9603,9605],{"class":1052,"line":9604},306,[1050,9606,1903],{"class":1698},[1050,9608,9610,9612],{"class":1052,"line":9609},307,[1050,9611,5029],{"class":1086},[1050,9613,5032],{"class":2341},[1050,9615,9617,9619,9621,9623,9625,9627,9629,9631,9633,9635,9638],{"class":1052,"line":9616},308,[1050,9618,5038],{"class":2128},[1050,9620,5041],{"class":2341},[1050,9622,1818],{"class":1086},[1050,9624,2348],{"class":2347},[1050,9626,1180],{"class":1086},[1050,9628,5050],{"class":2765},[1050,9630,1180],{"class":1086},[1050,9632,7007],{"class":2765},[1050,9634,1854],{"class":2487},[1050,9636,9637],{"class":3723},"None",[1050,9639,2313],{"class":1086},[1050,9641,9643,9645,9648],{"class":1052,"line":9642},309,[1050,9644,2355],{"class":2318},[1050,9646,9647],{"class":2322},"Save message with reply support.",[1050,9649,2326],{"class":2318},[1050,9651,9653,9655],{"class":1052,"line":9652},310,[1050,9654,3016],{"class":1694},[1050,9656,2502],{"class":1086},[1050,9658,9660,9663,9665,9667,9669,9671,9673],{"class":1052,"line":9659},311,[1050,9661,9662],{"class":1694},"            from",[1050,9664,2011],{"class":1086},[1050,9666,2268],{"class":1698},[1050,9668,1695],{"class":1694},[1050,9670,2286],{"class":1698},[1050,9672,1180],{"class":1086},[1050,9674,2291],{"class":1698},[1050,9676,9678],{"class":1052,"line":9677},312,[1050,9679,2925],{"class":1698},[1050,9681,9683,9685,9687,9689,9691,9693,9695,9697,9699,9701,9703,9705,9707,9709,9711,9713],{"class":1052,"line":9682},313,[1050,9684,5075],{"class":1698},[1050,9686,1180],{"class":1086},[1050,9688,5080],{"class":1698},[1050,9690,1854],{"class":1086},[1050,9692,2286],{"class":1698},[1050,9694,1710],{"class":1086},[1050,9696,5089],{"class":1794},[1050,9698,1710],{"class":1086},[1050,9700,5094],{"class":1814},[1050,9702,1818],{"class":1086},[1050,9704,5099],{"class":3908},[1050,9706,1854],{"class":1086},[1050,9708,2348],{"class":1082},[1050,9710,1710],{"class":1086},[1050,9712,2370],{"class":1794},[1050,9714,1837],{"class":1086},[1050,9716,9718],{"class":1052,"line":9717},314,[1050,9719,2925],{"class":1698},[1050,9721,9723,9726,9728],{"class":1052,"line":9722},315,[1050,9724,9725],{"class":1698},"            reply_message ",[1050,9727,1854],{"class":1086},[1050,9729,5229],{"class":3723},[1050,9731,9733,9735,9737],{"class":1052,"line":9732},316,[1050,9734,3086],{"class":1694},[1050,9736,7007],{"class":1698},[1050,9738,2502],{"class":1086},[1050,9740,9742,9745],{"class":1052,"line":9741},317,[1050,9743,9744],{"class":1694},"                try",[1050,9746,2502],{"class":1086},[1050,9748,9750,9753,9755,9757,9759,9761,9763,9765,9767,9769,9771,9773,9775,9778,9780,9782],{"class":1052,"line":9749},318,[1050,9751,9752],{"class":1698},"                    reply_message ",[1050,9754,1854],{"class":1086},[1050,9756,5120],{"class":1698},[1050,9758,1710],{"class":1086},[1050,9760,5089],{"class":1794},[1050,9762,1710],{"class":1086},[1050,9764,3057],{"class":1814},[1050,9766,1818],{"class":1086},[1050,9768,3602],{"class":3908},[1050,9770,1854],{"class":1086},[1050,9772,6848],{"class":1814},[1050,9774,1180],{"class":1086},[1050,9776,9777],{"class":3908}," room",[1050,9779,1854],{"class":1086},[1050,9781,5142],{"class":1814},[1050,9783,1837],{"class":1086},[1050,9785,9787,9790,9792,9794,9796],{"class":1052,"line":9786},319,[1050,9788,9789],{"class":1694},"                except",[1050,9791,5120],{"class":1698},[1050,9793,1710],{"class":1086},[1050,9795,5392],{"class":1794},[1050,9797,2502],{"class":1086},[1050,9799,9801],{"class":1052,"line":9800},320,[1050,9802,9803],{"class":1694},"                    pass\n",[1050,9805,9807],{"class":1052,"line":9806},321,[1050,9808,2925],{"class":1698},[1050,9810,9812,9814,9816,9818,9820,9822,9824,9826],{"class":1052,"line":9811},322,[1050,9813,5115],{"class":1698},[1050,9815,1854],{"class":1086},[1050,9817,5120],{"class":1698},[1050,9819,1710],{"class":1086},[1050,9821,5089],{"class":1794},[1050,9823,1710],{"class":1086},[1050,9825,5129],{"class":1814},[1050,9827,1925],{"class":1086},[1050,9829,9831,9833,9835,9837],{"class":1052,"line":9830},323,[1050,9832,5137],{"class":3908},[1050,9834,1854],{"class":1086},[1050,9836,5142],{"class":1814},[1050,9838,1107],{"class":1086},[1050,9840,9842,9844,9846,9848,9850,9852],{"class":1052,"line":9841},324,[1050,9843,5150],{"class":3908},[1050,9845,1854],{"class":1086},[1050,9847,2348],{"class":1082},[1050,9849,1710],{"class":1086},[1050,9851,2451],{"class":1794},[1050,9853,1107],{"class":1086},[1050,9855,9857,9859,9861,9863],{"class":1052,"line":9856},325,[1050,9858,5166],{"class":3908},[1050,9860,1854],{"class":1086},[1050,9862,4925],{"class":1814},[1050,9864,1107],{"class":1086},[1050,9866,9868,9871,9873],{"class":1052,"line":9867},326,[1050,9869,9870],{"class":3908},"                reply_to",[1050,9872,1854],{"class":1086},[1050,9874,9875],{"class":1814},"reply_message\n",[1050,9877,9879],{"class":1052,"line":9878},327,[1050,9880,1959],{"class":1086},[1050,9882,9884,9886],{"class":1052,"line":9883},328,[1050,9885,5182],{"class":1694},[1050,9887,5185],{"class":1698},[1050,9889,9891,9893,9895,9897,9899],{"class":1052,"line":9890},329,[1050,9892,3231],{"class":1694},[1050,9894,3271],{"class":3270},[1050,9896,3274],{"class":1694},[1050,9898,3277],{"class":1698},[1050,9900,2502],{"class":1086},[1050,9902,9904,9906,9908,9910,9912,9914,9916,9918,9920],{"class":1052,"line":9903},330,[1050,9905,5204],{"class":2784},[1050,9907,1818],{"class":1086},[1050,9909,3295],{"class":2128},[1050,9911,5211],{"class":1100},[1050,9913,2431],{"class":2430},[1050,9915,3308],{"class":1814},[1050,9917,2440],{"class":2430},[1050,9919,1317],{"class":1100},[1050,9921,1837],{"class":1086},[1050,9923,9925,9927],{"class":1052,"line":9924},331,[1050,9926,5182],{"class":1694},[1050,9928,5229],{"class":3723},[1050,9930,9932],{"class":1052,"line":9931},332,[1050,9933,1903],{"class":1698},[1050,9935,9937,9939],{"class":1052,"line":9936},333,[1050,9938,5029],{"class":1086},[1050,9940,5032],{"class":2341},[1050,9942,9944,9946,9949,9951,9953,9955,9957,9959,9961,9963,9965],{"class":1052,"line":9943},334,[1050,9945,5038],{"class":2128},[1050,9947,9948],{"class":2341}," save_reaction",[1050,9950,1818],{"class":1086},[1050,9952,2348],{"class":2347},[1050,9954,1180],{"class":1086},[1050,9956,7523],{"class":2765},[1050,9958,1180],{"class":1086},[1050,9960,7360],{"class":2765},[1050,9962,1180],{"class":1086},[1050,9964,7441],{"class":2765},[1050,9966,2313],{"class":1086},[1050,9968,9970,9972,9975],{"class":1052,"line":9969},335,[1050,9971,2355],{"class":2318},[1050,9973,9974],{"class":2322},"Save message reaction.",[1050,9976,2326],{"class":2318},[1050,9978,9980,9982],{"class":1052,"line":9979},336,[1050,9981,3016],{"class":1694},[1050,9983,2502],{"class":1086},[1050,9985,9987,9989,9991,9993,9995,9997,9999],{"class":1052,"line":9986},337,[1050,9988,9662],{"class":1694},[1050,9990,2011],{"class":1086},[1050,9992,2268],{"class":1698},[1050,9994,1695],{"class":1694},[1050,9996,5120],{"class":1698},[1050,9998,1180],{"class":1086},[1050,10000,10001],{"class":1698}," MessageReaction\n",[1050,10003,10005],{"class":1052,"line":10004},338,[1050,10006,2925],{"class":1698},[1050,10008,10010,10012,10014,10016,10018,10020,10022,10024,10026,10028,10030,10032],{"class":1052,"line":10009},339,[1050,10011,5115],{"class":1698},[1050,10013,1854],{"class":1086},[1050,10015,5120],{"class":1698},[1050,10017,1710],{"class":1086},[1050,10019,5089],{"class":1794},[1050,10021,1710],{"class":1086},[1050,10023,3057],{"class":1814},[1050,10025,1818],{"class":1086},[1050,10027,3602],{"class":3908},[1050,10029,1854],{"class":1086},[1050,10031,3639],{"class":1814},[1050,10033,1837],{"class":1086},[1050,10035,10037],{"class":1052,"line":10036},340,[1050,10038,2925],{"class":1698},[1050,10040,10042,10044,10047,10049,10051,10053,10055],{"class":1052,"line":10041},341,[1050,10043,3086],{"class":1694},[1050,10045,10046],{"class":1698}," action ",[1050,10048,3092],{"class":2487},[1050,10050,1226],{"class":1096},[1050,10052,7332],{"class":1100},[1050,10054,1104],{"class":1096},[1050,10056,2502],{"class":1086},[1050,10058,10060,10063,10065,10067,10069,10072,10074,10076,10078,10080],{"class":1052,"line":10059},342,[1050,10061,10062],{"class":1698},"                reaction",[1050,10064,1180],{"class":1086},[1050,10066,5080],{"class":1698},[1050,10068,1854],{"class":1086},[1050,10070,10071],{"class":1698}," MessageReaction",[1050,10073,1710],{"class":1086},[1050,10075,5089],{"class":1794},[1050,10077,1710],{"class":1086},[1050,10079,5094],{"class":1814},[1050,10081,1925],{"class":1086},[1050,10083,10085,10088,10090,10092],{"class":1052,"line":10084},343,[1050,10086,10087],{"class":3908},"                    message",[1050,10089,1854],{"class":1086},[1050,10091,2687],{"class":1814},[1050,10093,1107],{"class":1086},[1050,10095,10097,10100,10102,10104,10106,10108],{"class":1052,"line":10096},344,[1050,10098,10099],{"class":3908},"                    user",[1050,10101,1854],{"class":1086},[1050,10103,2348],{"class":1082},[1050,10105,1710],{"class":1086},[1050,10107,2451],{"class":1794},[1050,10109,1107],{"class":1086},[1050,10111,10113,10116,10118],{"class":1052,"line":10112},345,[1050,10114,10115],{"class":3908},"                    emoji",[1050,10117,1854],{"class":1086},[1050,10119,10120],{"class":1814},"emoji\n",[1050,10122,10124],{"class":1052,"line":10123},346,[1050,10125,10126],{"class":1086},"                )\n",[1050,10128,10130,10132],{"class":1052,"line":10129},347,[1050,10131,9239],{"class":1694},[1050,10133,9256],{"class":3723},[1050,10135,10137,10139,10141,10143,10145,10148,10150],{"class":1052,"line":10136},348,[1050,10138,3126],{"class":1694},[1050,10140,10046],{"class":1698},[1050,10142,3092],{"class":2487},[1050,10144,1226],{"class":1096},[1050,10146,10147],{"class":1100},"remove",[1050,10149,1104],{"class":1096},[1050,10151,2502],{"class":1086},[1050,10153,10155,10158,10160,10162,10164,10167],{"class":1052,"line":10154},349,[1050,10156,10157],{"class":1698},"                MessageReaction",[1050,10159,1710],{"class":1086},[1050,10161,5089],{"class":1794},[1050,10163,1710],{"class":1086},[1050,10165,10166],{"class":1814},"filter",[1050,10168,1925],{"class":1086},[1050,10170,10172,10174,10176,10178],{"class":1052,"line":10171},350,[1050,10173,10087],{"class":3908},[1050,10175,1854],{"class":1086},[1050,10177,2687],{"class":1814},[1050,10179,1107],{"class":1086},[1050,10181,10183,10185,10187,10189,10191,10193],{"class":1052,"line":10182},351,[1050,10184,10099],{"class":3908},[1050,10186,1854],{"class":1086},[1050,10188,2348],{"class":1082},[1050,10190,1710],{"class":1086},[1050,10192,2451],{"class":1794},[1050,10194,1107],{"class":1086},[1050,10196,10198,10200,10202],{"class":1052,"line":10197},352,[1050,10199,10115],{"class":3908},[1050,10201,1854],{"class":1086},[1050,10203,10120],{"class":1814},[1050,10205,10207,10210,10212],{"class":1052,"line":10206},353,[1050,10208,10209],{"class":1086},"                ).",[1050,10211,6541],{"class":1814},[1050,10213,1860],{"class":1086},[1050,10215,10217,10219],{"class":1052,"line":10216},354,[1050,10218,9239],{"class":1694},[1050,10220,9256],{"class":3723},[1050,10222,10224],{"class":1052,"line":10223},355,[1050,10225,2925],{"class":1698},[1050,10227,10229,10231],{"class":1052,"line":10228},356,[1050,10230,5182],{"class":1694},[1050,10232,9242],{"class":3723},[1050,10234,10236,10238,10240,10242,10244],{"class":1052,"line":10235},357,[1050,10237,3231],{"class":1694},[1050,10239,3271],{"class":3270},[1050,10241,3274],{"class":1694},[1050,10243,3277],{"class":1698},[1050,10245,2502],{"class":1086},[1050,10247,10249,10251,10253,10255,10258,10260,10262,10264,10266],{"class":1052,"line":10248},358,[1050,10250,5204],{"class":2784},[1050,10252,1818],{"class":1086},[1050,10254,3295],{"class":2128},[1050,10256,10257],{"class":1100},"\"Error saving reaction: ",[1050,10259,2431],{"class":2430},[1050,10261,3308],{"class":1814},[1050,10263,2440],{"class":2430},[1050,10265,1317],{"class":1100},[1050,10267,1837],{"class":1086},[1050,10269,10271,10273],{"class":1052,"line":10270},359,[1050,10272,5182],{"class":1694},[1050,10274,9242],{"class":3723},[1050,10276,10278],{"class":1052,"line":10277},360,[1050,10279,1903],{"class":1698},[1050,10281,10283,10285,10287,10289,10291,10293,10295,10297,10299,10302,10304,10306],{"class":1052,"line":10282},361,[1050,10284,2335],{"class":2128},[1050,10286,2338],{"class":2128},[1050,10288,4706],{"class":2341},[1050,10290,1818],{"class":1086},[1050,10292,2348],{"class":2347},[1050,10294,1180],{"class":1086},[1050,10296,3480],{"class":2765},[1050,10298,1180],{"class":1086},[1050,10300,10301],{"class":2765}," client_id",[1050,10303,1854],{"class":2487},[1050,10305,9637],{"class":3723},[1050,10307,2313],{"class":1086},[1050,10309,10311,10313,10316],{"class":1052,"line":10310},362,[1050,10312,2355],{"class":2318},[1050,10314,10315],{"class":2322},"Send error message to client.",[1050,10317,2326],{"class":2318},[1050,10319,10321,10324,10326],{"class":1052,"line":10320},363,[1050,10322,10323],{"class":1698},"        error_data ",[1050,10325,1854],{"class":1086},[1050,10327,1254],{"class":1086},[1050,10329,10331,10333,10335,10337,10339,10341,10343,10345],{"class":1052,"line":10330},364,[1050,10332,3926],{"class":1096},[1050,10334,2644],{"class":1100},[1050,10336,1104],{"class":1096},[1050,10338,1267],{"class":1086},[1050,10340,1226],{"class":1096},[1050,10342,4768],{"class":1100},[1050,10344,1104],{"class":1096},[1050,10346,1107],{"class":1086},[1050,10348,10350,10352,10354,10356,10358],{"class":1052,"line":10349},365,[1050,10351,3926],{"class":1096},[1050,10353,2687],{"class":1100},[1050,10355,1104],{"class":1096},[1050,10357,1267],{"class":1086},[1050,10359,5185],{"class":1698},[1050,10361,10363],{"class":1052,"line":10362},366,[1050,10364,10365],{"class":1086},"        }\n",[1050,10367,10369],{"class":1052,"line":10368},367,[1050,10370,2474],{"class":1698},[1050,10372,10374,10376,10378],{"class":1052,"line":10373},368,[1050,10375,2484],{"class":1694},[1050,10377,10301],{"class":1698},[1050,10379,2502],{"class":1086},[1050,10381,10383,10386,10388,10390,10392,10394,10396,10398],{"class":1052,"line":10382},369,[1050,10384,10385],{"class":1698},"            error_data",[1050,10387,2383],{"class":1086},[1050,10389,1104],{"class":1096},[1050,10391,7193],{"class":1100},[1050,10393,1104],{"class":1096},[1050,10395,4240],{"class":1086},[1050,10397,1087],{"class":1086},[1050,10399,10400],{"class":1698}," client_id\n",[1050,10402,10404],{"class":1052,"line":10403},370,[1050,10405,2474],{"class":1698},[1050,10407,10409,10411,10413,10415,10417,10419,10421,10423,10425,10427,10429,10431,10434],{"class":1052,"line":10408},371,[1050,10410,2535],{"class":1694},[1050,10412,2375],{"class":1082},[1050,10414,1710],{"class":1086},[1050,10416,3903],{"class":1814},[1050,10418,1818],{"class":1086},[1050,10420,3039],{"class":3908},[1050,10422,1854],{"class":1086},[1050,10424,3913],{"class":1814},[1050,10426,1710],{"class":1086},[1050,10428,3918],{"class":1814},[1050,10430,1818],{"class":1086},[1050,10432,10433],{"class":1814},"error_data",[1050,10435,6685],{"class":1086},[1030,10437,10439],{"id":10438},"real-time-notifications","Real-Time Notifications",[1035,10441,10443],{"id":10442},"notification-consumer","Notification Consumer",[1040,10445,10447],{"className":1042,"code":10446,"language":1044,"meta":1045,"style":1045},"# consumers.py\nimport json\nfrom channels.generic.websocket import AsyncWebsocketConsumer\nfrom channels.db import database_sync_to_async\nfrom django.contrib.auth.models import User\n\nclass NotificationConsumer(AsyncWebsocketConsumer):\n    \"\"\"Consumer for real-time notifications.\"\"\"\n    \n    async def connect(self):\n        \"\"\"Handle notification connection.\"\"\"\n        self.user = self.scope['user']\n        \n        if not self.user.is_authenticated:\n            await self.close()\n            return\n        \n        # Create user-specific group\n        self.user_group_name = f'user_{self.user.id}'\n        \n        # Join user group\n        await self.channel_layer.group_add(\n            self.user_group_name,\n            self.channel_name\n        )\n        \n        await self.accept()\n        \n        # Send unread notifications count\n        await self.send_unread_count()\n    \n    async def disconnect(self, close_code):\n        \"\"\"Handle notification disconnection.\"\"\"\n        if hasattr(self, 'user_group_name'):\n            await self.channel_layer.group_discard(\n                self.user_group_name,\n                self.channel_name\n            )\n    \n    async def receive(self, text_data):\n        \"\"\"Handle notification actions.\"\"\"\n        try:\n            data = json.loads(text_data)\n            action = data.get('action')\n            \n            if action == 'mark_read':\n                await self.mark_notification_read(data.get('notification_id'))\n            elif action == 'mark_all_read':\n                await self.mark_all_notifications_read()\n            elif action == 'get_notifications':\n                await self.send_notifications()\n        \n        except json.JSONDecodeError:\n            pass\n    \n    # Group message handlers\n    async def notification_message(self, event):\n        \"\"\"Send notification to WebSocket.\"\"\"\n        await self.send(text_data=json.dumps({\n            'type': 'notification',\n            'id': event['notification_id'],\n            'title': event['title'],\n            'message': event['message'],\n            'category': event.get('category', 'general'),\n            'timestamp': event['timestamp'],\n            'read': False\n        }))\n    \n    async def notification_count_update(self, event):\n        \"\"\"Send updated notification count.\"\"\"\n        await self.send(text_data=json.dumps({\n            'type': 'count_update',\n            'unread_count': event['unread_count']\n        }))\n    \n    # Helper methods\n    @database_sync_to_async\n    def send_unread_count(self):\n        \"\"\"Send current unread notifications count.\"\"\"\n        from .models import Notification\n        \n        unread_count = Notification.objects.filter(\n            user=self.user,\n            read=False\n        ).count()\n        \n        asyncio.create_task(self.send(text_data=json.dumps({\n            'type': 'count_update',\n            'unread_count': unread_count\n        })))\n    \n    @database_sync_to_async\n    def mark_notification_read(self, notification_id):\n        \"\"\"Mark specific notification as read.\"\"\"\n        from .models import Notification\n        \n        try:\n            notification = Notification.objects.get(\n                id=notification_id,\n                user=self.user\n            )\n            notification.read = True\n            notification.save()\n            \n            # Send updated count\n            asyncio.create_task(self.send_unread_count())\n        except Notification.DoesNotExist:\n            pass\n    \n    @database_sync_to_async\n    def mark_all_notifications_read(self):\n        \"\"\"Mark all notifications as read.\"\"\"\n        from .models import Notification\n        \n        Notification.objects.filter(\n            user=self.user,\n            read=False\n        ).update(read=True)\n        \n        # Send updated count\n        asyncio.create_task(self.send_unread_count())\n    \n    @database_sync_to_async\n    def send_notifications(self):\n        \"\"\"Send recent notifications.\"\"\"\n        from .models import Notification\n        \n        notifications = Notification.objects.filter(\n            user=self.user\n        ).order_by('-created_at')[:20]\n        \n        notifications_data = []\n        for notification in notifications:\n            notifications_data.append({\n                'id': notification.id,\n                'title': notification.title,\n                'message': notification.message,\n                'category': notification.category,\n                'timestamp': notification.created_at.isoformat(),\n                'read': notification.read\n            })\n        \n        asyncio.create_task(self.send(text_data=json.dumps({\n            'type': 'notifications_list',\n            'notifications': notifications_data\n        })))\n\n# Utility function to send notifications\nasync def send_notification_to_user(user_id, title, message, category='general'):\n    \"\"\"Send notification to specific user.\"\"\"\n    from channels.layers import get_channel_layer\n    from .models import Notification\n    from asgiref.sync import sync_to_async\n    \n    # Save notification to database\n    @sync_to_async\n    def save_notification():\n        user = User.objects.get(id=user_id)\n        return Notification.objects.create(\n            user=user,\n            title=title,\n            message=message,\n            category=category\n        )\n    \n    notification = await save_notification()\n    \n    # Send to WebSocket\n    channel_layer = get_channel_layer()\n    await channel_layer.group_send(\n        f'user_{user_id}',\n        {\n            'type': 'notification_message',\n            'notification_id': notification.id,\n            'title': title,\n            'message': message,\n            'category': category,\n            'timestamp': notification.created_at.isoformat()\n        }\n    )\n",[1047,10448,10449,10453,10459,10477,10491,10513,10517,10530,10539,10543,10557,10566,10592,10596,10614,10626,10630,10634,10639,10671,10675,10680,10696,10706,10714,10718,10722,10734,10738,10743,10756,10760,10778,10787,10807,10823,10833,10841,10845,10849,10867,10876,10882,10900,10923,10927,10944,10974,10991,11004,11021,11034,11038,11050,11054,11058,11062,11081,11090,11114,11133,11155,11178,11200,11236,11258,11271,11275,11279,11298,11307,11331,11350,11373,11377,11381,11385,11391,11404,11413,11427,11431,11451,11466,11476,11486,11490,11521,11539,11552,11557,11561,11567,11585,11594,11606,11610,11616,11635,11646,11659,11663,11676,11687,11691,11696,11715,11727,11731,11735,11741,11754,11763,11775,11779,11794,11808,11816,11834,11838,11843,11861,11865,11871,11884,11893,11905,11909,11928,11940,11961,11965,11974,11988,12000,12019,12037,12055,12073,12095,12112,12117,12121,12151,12170,12184,12188,12192,12197,12235,12244,12261,12273,12287,12291,12296,12302,12311,12339,12355,12365,12376,12387,12397,12401,12405,12418,12422,12427,12439,12453,12470,12475,12494,12512,12526,12540,12554,12576,12580],{"__ignoreMap":1045},[1050,10450,10451],{"class":1052,"line":1053},[1050,10452,5416],{"class":1056},[1050,10454,10455,10457],{"class":1052,"line":1060},[1050,10456,1695],{"class":1694},[1050,10458,2204],{"class":1698},[1050,10460,10461,10463,10465,10467,10469,10471,10473,10475],{"class":1052,"line":1066},[1050,10462,1704],{"class":1694},[1050,10464,1730],{"class":1698},[1050,10466,1710],{"class":1086},[1050,10468,2222],{"class":1698},[1050,10470,1710],{"class":1086},[1050,10472,1777],{"class":1698},[1050,10474,1695],{"class":1694},[1050,10476,2231],{"class":1698},[1050,10478,10479,10481,10483,10485,10487,10489],{"class":1052,"line":1073},[1050,10480,1704],{"class":1694},[1050,10482,1730],{"class":1698},[1050,10484,1710],{"class":1086},[1050,10486,2242],{"class":1698},[1050,10488,1695],{"class":1694},[1050,10490,2247],{"class":1698},[1050,10492,10493,10495,10497,10499,10501,10503,10505,10507,10509,10511],{"class":1052,"line":1079},[1050,10494,1704],{"class":1694},[1050,10496,1707],{"class":1698},[1050,10498,1710],{"class":1086},[1050,10500,2258],{"class":1698},[1050,10502,1710],{"class":1086},[1050,10504,2263],{"class":1698},[1050,10506,1710],{"class":1086},[1050,10508,2268],{"class":1698},[1050,10510,1695],{"class":1694},[1050,10512,2273],{"class":1698},[1050,10514,10515],{"class":1052,"line":1093},[1050,10516,1070],{"emptyLinePlaceholder":1069},[1050,10518,10519,10521,10524,10526,10528],{"class":1052,"line":1110},[1050,10520,2300],{"class":2128},[1050,10522,10523],{"class":2303}," NotificationConsumer",[1050,10525,1818],{"class":1086},[1050,10527,2310],{"class":2309},[1050,10529,2313],{"class":1086},[1050,10531,10532,10534,10537],{"class":1052,"line":1122},[1050,10533,2319],{"class":2318},[1050,10535,10536],{"class":2322},"Consumer for real-time notifications.",[1050,10538,2326],{"class":2318},[1050,10540,10541],{"class":1052,"line":1134},[1050,10542,1903],{"class":1698},[1050,10544,10545,10547,10549,10551,10553,10555],{"class":1052,"line":1146},[1050,10546,2335],{"class":2128},[1050,10548,2338],{"class":2128},[1050,10550,2342],{"class":2341},[1050,10552,1818],{"class":1086},[1050,10554,2348],{"class":2347},[1050,10556,2313],{"class":1086},[1050,10558,10559,10561,10564],{"class":1052,"line":1158},[1050,10560,2355],{"class":2318},[1050,10562,10563],{"class":2322},"Handle notification connection.",[1050,10565,2326],{"class":2318},[1050,10567,10568,10570,10572,10574,10576,10578,10580,10582,10584,10586,10588,10590],{"class":1052,"line":1170},[1050,10569,2365],{"class":1082},[1050,10571,1710],{"class":1086},[1050,10573,2451],{"class":1794},[1050,10575,1087],{"class":1086},[1050,10577,2375],{"class":1082},[1050,10579,1710],{"class":1086},[1050,10581,2380],{"class":1794},[1050,10583,2383],{"class":1086},[1050,10585,1104],{"class":1096},[1050,10587,2451],{"class":1100},[1050,10589,1104],{"class":1096},[1050,10591,1204],{"class":1086},[1050,10593,10594],{"class":1052,"line":1186},[1050,10595,2474],{"class":1698},[1050,10597,10598,10600,10602,10604,10606,10608,10610,10612],{"class":1052,"line":1201},[1050,10599,2484],{"class":1694},[1050,10601,2488],{"class":2487},[1050,10603,2375],{"class":1082},[1050,10605,1710],{"class":1086},[1050,10607,2451],{"class":1794},[1050,10609,1710],{"class":1086},[1050,10611,2499],{"class":1794},[1050,10613,2502],{"class":1086},[1050,10615,10616,10618,10620,10622,10624],{"class":1052,"line":1207},[1050,10617,2507],{"class":1694},[1050,10619,2375],{"class":1082},[1050,10621,1710],{"class":1086},[1050,10623,2514],{"class":1814},[1050,10625,1860],{"class":1086},[1050,10627,10628],{"class":1052,"line":1212},[1050,10629,2521],{"class":1694},[1050,10631,10632],{"class":1052,"line":1218},[1050,10633,2474],{"class":1698},[1050,10635,10636],{"class":1052,"line":1235},[1050,10637,10638],{"class":1056},"        # Create user-specific group\n",[1050,10640,10641,10643,10645,10648,10650,10652,10655,10657,10659,10661,10663,10665,10667,10669],{"class":1052,"line":1240},[1050,10642,2365],{"class":1082},[1050,10644,1710],{"class":1086},[1050,10646,10647],{"class":1794},"user_group_name",[1050,10649,1087],{"class":1086},[1050,10651,2424],{"class":2128},[1050,10653,10654],{"class":1100},"'user_",[1050,10656,2431],{"class":2430},[1050,10658,2348],{"class":1082},[1050,10660,1710],{"class":1086},[1050,10662,2451],{"class":1794},[1050,10664,1710],{"class":1086},[1050,10666,3602],{"class":1794},[1050,10668,2440],{"class":2430},[1050,10670,1232],{"class":1100},[1050,10672,10673],{"class":1052,"line":1246},[1050,10674,2474],{"class":1698},[1050,10676,10677],{"class":1052,"line":1257},[1050,10678,10679],{"class":1056},"        # Join user group\n",[1050,10681,10682,10684,10686,10688,10690,10692,10694],{"class":1052,"line":1272},[1050,10683,2535],{"class":1694},[1050,10685,2375],{"class":1082},[1050,10687,1710],{"class":1086},[1050,10689,2542],{"class":1794},[1050,10691,1710],{"class":1086},[1050,10693,2547],{"class":1814},[1050,10695,1925],{"class":1086},[1050,10697,10698,10700,10702,10704],{"class":1052,"line":1294},[1050,10699,2554],{"class":1082},[1050,10701,1710],{"class":1086},[1050,10703,10647],{"class":1794},[1050,10705,1107],{"class":1086},[1050,10707,10708,10710,10712],{"class":1052,"line":1308},[1050,10709,2554],{"class":1082},[1050,10711,1710],{"class":1086},[1050,10713,2569],{"class":1794},[1050,10715,10716],{"class":1052,"line":1341},[1050,10717,1964],{"class":1086},[1050,10719,10720],{"class":1052,"line":1361},[1050,10721,2474],{"class":1698},[1050,10723,10724,10726,10728,10730,10732],{"class":1052,"line":1381},[1050,10725,2535],{"class":1694},[1050,10727,2375],{"class":1082},[1050,10729,1710],{"class":1086},[1050,10731,2593],{"class":1814},[1050,10733,1860],{"class":1086},[1050,10735,10736],{"class":1052,"line":1387},[1050,10737,2474],{"class":1698},[1050,10739,10740],{"class":1052,"line":1393},[1050,10741,10742],{"class":1056},"        # Send unread notifications count\n",[1050,10744,10745,10747,10749,10751,10754],{"class":1052,"line":1399},[1050,10746,2535],{"class":1694},[1050,10748,2375],{"class":1082},[1050,10750,1710],{"class":1086},[1050,10752,10753],{"class":1814},"send_unread_count",[1050,10755,1860],{"class":1086},[1050,10757,10758],{"class":1052,"line":1404},[1050,10759,1903],{"class":1698},[1050,10761,10762,10764,10766,10768,10770,10772,10774,10776],{"class":1052,"line":1410},[1050,10763,2335],{"class":2128},[1050,10765,2338],{"class":2128},[1050,10767,2756],{"class":2341},[1050,10769,1818],{"class":1086},[1050,10771,2348],{"class":2347},[1050,10773,1180],{"class":1086},[1050,10775,2766],{"class":2765},[1050,10777,2313],{"class":1086},[1050,10779,10780,10782,10785],{"class":1052,"line":1419},[1050,10781,2355],{"class":2318},[1050,10783,10784],{"class":2322},"Handle notification disconnection.",[1050,10786,2326],{"class":2318},[1050,10788,10789,10791,10793,10795,10797,10799,10801,10803,10805],{"class":1052,"line":1432},[1050,10790,2484],{"class":1694},[1050,10792,2785],{"class":2784},[1050,10794,1818],{"class":1086},[1050,10796,2348],{"class":1082},[1050,10798,1180],{"class":1086},[1050,10800,1226],{"class":1096},[1050,10802,10647],{"class":1100},[1050,10804,1104],{"class":1096},[1050,10806,2313],{"class":1086},[1050,10808,10809,10811,10813,10815,10817,10819,10821],{"class":1052,"line":1451},[1050,10810,2507],{"class":1694},[1050,10812,2375],{"class":1082},[1050,10814,1710],{"class":1086},[1050,10816,2542],{"class":1794},[1050,10818,1710],{"class":1086},[1050,10820,2947],{"class":1814},[1050,10822,1925],{"class":1086},[1050,10824,10825,10827,10829,10831],{"class":1052,"line":1464},[1050,10826,2825],{"class":1082},[1050,10828,1710],{"class":1086},[1050,10830,10647],{"class":1794},[1050,10832,1107],{"class":1086},[1050,10834,10835,10837,10839],{"class":1052,"line":1477},[1050,10836,2825],{"class":1082},[1050,10838,1710],{"class":1086},[1050,10840,2569],{"class":1794},[1050,10842,10843],{"class":1052,"line":1483},[1050,10844,1959],{"class":1086},[1050,10846,10847],{"class":1052,"line":1498},[1050,10848,1903],{"class":1698},[1050,10850,10851,10853,10855,10857,10859,10861,10863,10865],{"class":1052,"line":1519},[1050,10852,2335],{"class":2128},[1050,10854,2338],{"class":2128},[1050,10856,2989],{"class":2341},[1050,10858,1818],{"class":1086},[1050,10860,2348],{"class":2347},[1050,10862,1180],{"class":1086},[1050,10864,2998],{"class":2765},[1050,10866,2313],{"class":1086},[1050,10868,10869,10871,10874],{"class":1052,"line":1537},[1050,10870,2355],{"class":2318},[1050,10872,10873],{"class":2322},"Handle notification actions.",[1050,10875,2326],{"class":2318},[1050,10877,10878,10880],{"class":1052,"line":1555},[1050,10879,3016],{"class":1694},[1050,10881,2502],{"class":1086},[1050,10883,10884,10886,10888,10890,10892,10894,10896,10898],{"class":1052,"line":1561},[1050,10885,6367],{"class":1698},[1050,10887,1854],{"class":1086},[1050,10889,3029],{"class":1698},[1050,10891,1710],{"class":1086},[1050,10893,3034],{"class":1814},[1050,10895,1818],{"class":1086},[1050,10897,3039],{"class":1814},[1050,10899,1837],{"class":1086},[1050,10901,10902,10905,10907,10909,10911,10913,10915,10917,10919,10921],{"class":1052,"line":1582},[1050,10903,10904],{"class":1698},"            action ",[1050,10906,1854],{"class":1086},[1050,10908,3340],{"class":1698},[1050,10910,1710],{"class":1086},[1050,10912,3057],{"class":1814},[1050,10914,1818],{"class":1086},[1050,10916,1104],{"class":1096},[1050,10918,7323],{"class":1100},[1050,10920,1104],{"class":1096},[1050,10922,1837],{"class":1086},[1050,10924,10925],{"class":1052,"line":1599},[1050,10926,2925],{"class":1698},[1050,10928,10929,10931,10933,10935,10937,10940,10942],{"class":1052,"line":1605},[1050,10930,3086],{"class":1694},[1050,10932,10046],{"class":1698},[1050,10934,3092],{"class":2487},[1050,10936,1226],{"class":1096},[1050,10938,10939],{"class":1100},"mark_read",[1050,10941,1104],{"class":1096},[1050,10943,2502],{"class":1086},[1050,10945,10946,10948,10950,10952,10955,10957,10959,10961,10963,10965,10967,10970,10972],{"class":1052,"line":1611},[1050,10947,3106],{"class":1694},[1050,10949,2375],{"class":1082},[1050,10951,1710],{"class":1086},[1050,10953,10954],{"class":1814},"mark_notification_read",[1050,10956,1818],{"class":1086},[1050,10958,6432],{"class":1814},[1050,10960,1710],{"class":1086},[1050,10962,3057],{"class":1814},[1050,10964,1818],{"class":1086},[1050,10966,1104],{"class":1096},[1050,10968,10969],{"class":1100},"notification_id",[1050,10971,1104],{"class":1096},[1050,10973,6685],{"class":1086},[1050,10975,10976,10978,10980,10982,10984,10987,10989],{"class":1052,"line":1627},[1050,10977,3126],{"class":1694},[1050,10979,10046],{"class":1698},[1050,10981,3092],{"class":2487},[1050,10983,1226],{"class":1096},[1050,10985,10986],{"class":1100},"mark_all_read",[1050,10988,1104],{"class":1096},[1050,10990,2502],{"class":1086},[1050,10992,10993,10995,10997,10999,11002],{"class":1052,"line":1643},[1050,10994,3106],{"class":1694},[1050,10996,2375],{"class":1082},[1050,10998,1710],{"class":1086},[1050,11000,11001],{"class":1814},"mark_all_notifications_read",[1050,11003,1860],{"class":1086},[1050,11005,11006,11008,11010,11012,11014,11017,11019],{"class":1052,"line":1663},[1050,11007,3126],{"class":1694},[1050,11009,10046],{"class":1698},[1050,11011,3092],{"class":2487},[1050,11013,1226],{"class":1096},[1050,11015,11016],{"class":1100},"get_notifications",[1050,11018,1104],{"class":1096},[1050,11020,2502],{"class":1086},[1050,11022,11023,11025,11027,11029,11032],{"class":1052,"line":1668},[1050,11024,3106],{"class":1694},[1050,11026,2375],{"class":1082},[1050,11028,1710],{"class":1086},[1050,11030,11031],{"class":1814},"send_notifications",[1050,11033,1860],{"class":1086},[1050,11035,11036],{"class":1052,"line":1673},[1050,11037,2474],{"class":1698},[1050,11039,11040,11042,11044,11046,11048],{"class":1052,"line":2857},[1050,11041,3231],{"class":1694},[1050,11043,3029],{"class":1698},[1050,11045,1710],{"class":1086},[1050,11047,3238],{"class":1794},[1050,11049,2502],{"class":1086},[1050,11051,11052],{"class":1052,"line":2880},[1050,11053,8274],{"class":1694},[1050,11055,11056],{"class":1052,"line":2912},[1050,11057,1903],{"class":1698},[1050,11059,11060],{"class":1052,"line":2917},[1050,11061,3985],{"class":1056},[1050,11063,11064,11066,11068,11071,11073,11075,11077,11079],{"class":1052,"line":2922},[1050,11065,2335],{"class":2128},[1050,11067,2338],{"class":2128},[1050,11069,11070],{"class":2341}," notification_message",[1050,11072,1818],{"class":1086},[1050,11074,2348],{"class":2347},[1050,11076,1180],{"class":1086},[1050,11078,4004],{"class":2765},[1050,11080,2313],{"class":1086},[1050,11082,11083,11085,11088],{"class":1052,"line":2928},[1050,11084,2355],{"class":2318},[1050,11086,11087],{"class":2322},"Send notification to WebSocket.",[1050,11089,2326],{"class":2318},[1050,11091,11092,11094,11096,11098,11100,11102,11104,11106,11108,11110,11112],{"class":1052,"line":2934},[1050,11093,2535],{"class":1694},[1050,11095,2375],{"class":1082},[1050,11097,1710],{"class":1086},[1050,11099,3903],{"class":1814},[1050,11101,1818],{"class":1086},[1050,11103,3039],{"class":3908},[1050,11105,1854],{"class":1086},[1050,11107,3913],{"class":1814},[1050,11109,1710],{"class":1086},[1050,11111,3918],{"class":1814},[1050,11113,1876],{"class":1086},[1050,11115,11116,11118,11120,11122,11124,11126,11129,11131],{"class":1052,"line":2952},[1050,11117,3926],{"class":1096},[1050,11119,2644],{"class":1100},[1050,11121,1104],{"class":1096},[1050,11123,1267],{"class":1086},[1050,11125,1226],{"class":1096},[1050,11127,11128],{"class":1100},"notification",[1050,11130,1104],{"class":1096},[1050,11132,1107],{"class":1086},[1050,11134,11135,11137,11139,11141,11143,11145,11147,11149,11151,11153],{"class":1052,"line":2963},[1050,11136,3926],{"class":1096},[1050,11138,3602],{"class":1100},[1050,11140,1104],{"class":1096},[1050,11142,1267],{"class":1086},[1050,11144,4004],{"class":1814},[1050,11146,2383],{"class":1086},[1050,11148,1104],{"class":1096},[1050,11150,10969],{"class":1100},[1050,11152,1104],{"class":1096},[1050,11154,4084],{"class":1086},[1050,11156,11157,11159,11162,11164,11166,11168,11170,11172,11174,11176],{"class":1052,"line":2972},[1050,11158,3926],{"class":1096},[1050,11160,11161],{"class":1100},"title",[1050,11163,1104],{"class":1096},[1050,11165,1267],{"class":1086},[1050,11167,4004],{"class":1814},[1050,11169,2383],{"class":1086},[1050,11171,1104],{"class":1096},[1050,11173,11161],{"class":1100},[1050,11175,1104],{"class":1096},[1050,11177,4084],{"class":1086},[1050,11179,11180,11182,11184,11186,11188,11190,11192,11194,11196,11198],{"class":1052,"line":2977},[1050,11181,3926],{"class":1096},[1050,11183,2687],{"class":1100},[1050,11185,1104],{"class":1096},[1050,11187,1267],{"class":1086},[1050,11189,4004],{"class":1814},[1050,11191,2383],{"class":1086},[1050,11193,1104],{"class":1096},[1050,11195,2687],{"class":1100},[1050,11197,1104],{"class":1096},[1050,11199,4084],{"class":1086},[1050,11201,11202,11204,11207,11209,11211,11213,11215,11217,11219,11221,11223,11225,11227,11229,11232,11234],{"class":1052,"line":2982},[1050,11203,3926],{"class":1096},[1050,11205,11206],{"class":1100},"category",[1050,11208,1104],{"class":1096},[1050,11210,1267],{"class":1086},[1050,11212,4004],{"class":1814},[1050,11214,1710],{"class":1086},[1050,11216,3057],{"class":1814},[1050,11218,1818],{"class":1086},[1050,11220,1104],{"class":1096},[1050,11222,11206],{"class":1100},[1050,11224,1104],{"class":1096},[1050,11226,1180],{"class":1086},[1050,11228,1226],{"class":1096},[1050,11230,11231],{"class":1100},"general",[1050,11233,1104],{"class":1096},[1050,11235,1516],{"class":1086},[1050,11237,11238,11240,11242,11244,11246,11248,11250,11252,11254,11256],{"class":1052,"line":3003},[1050,11239,3926],{"class":1096},[1050,11241,3612],{"class":1100},[1050,11243,1104],{"class":1096},[1050,11245,1267],{"class":1086},[1050,11247,4004],{"class":1814},[1050,11249,2383],{"class":1086},[1050,11251,1104],{"class":1096},[1050,11253,3612],{"class":1100},[1050,11255,1104],{"class":1096},[1050,11257,4084],{"class":1086},[1050,11259,11260,11262,11265,11267,11269],{"class":1052,"line":3013},[1050,11261,3926],{"class":1096},[1050,11263,11264],{"class":1100},"read",[1050,11266,1104],{"class":1096},[1050,11268,1267],{"class":1086},[1050,11270,9242],{"class":3723},[1050,11272,11273],{"class":1052,"line":3021},[1050,11274,3974],{"class":1086},[1050,11276,11277],{"class":1052,"line":3044},[1050,11278,1903],{"class":1698},[1050,11280,11281,11283,11285,11288,11290,11292,11294,11296],{"class":1052,"line":3078},[1050,11282,2335],{"class":2128},[1050,11284,2338],{"class":2128},[1050,11286,11287],{"class":2341}," notification_count_update",[1050,11289,1818],{"class":1086},[1050,11291,2348],{"class":2347},[1050,11293,1180],{"class":1086},[1050,11295,4004],{"class":2765},[1050,11297,2313],{"class":1086},[1050,11299,11300,11302,11305],{"class":1052,"line":3083},[1050,11301,2355],{"class":2318},[1050,11303,11304],{"class":2322},"Send updated notification count.",[1050,11306,2326],{"class":2318},[1050,11308,11309,11311,11313,11315,11317,11319,11321,11323,11325,11327,11329],{"class":1052,"line":3103},[1050,11310,2535],{"class":1694},[1050,11312,2375],{"class":1082},[1050,11314,1710],{"class":1086},[1050,11316,3903],{"class":1814},[1050,11318,1818],{"class":1086},[1050,11320,3039],{"class":3908},[1050,11322,1854],{"class":1086},[1050,11324,3913],{"class":1814},[1050,11326,1710],{"class":1086},[1050,11328,3918],{"class":1814},[1050,11330,1876],{"class":1086},[1050,11332,11333,11335,11337,11339,11341,11343,11346,11348],{"class":1052,"line":3123},[1050,11334,3926],{"class":1096},[1050,11336,2644],{"class":1100},[1050,11338,1104],{"class":1096},[1050,11340,1267],{"class":1086},[1050,11342,1226],{"class":1096},[1050,11344,11345],{"class":1100},"count_update",[1050,11347,1104],{"class":1096},[1050,11349,1107],{"class":1086},[1050,11351,11352,11354,11357,11359,11361,11363,11365,11367,11369,11371],{"class":1052,"line":3142},[1050,11353,3926],{"class":1096},[1050,11355,11356],{"class":1100},"unread_count",[1050,11358,1104],{"class":1096},[1050,11360,1267],{"class":1086},[1050,11362,4004],{"class":1814},[1050,11364,2383],{"class":1086},[1050,11366,1104],{"class":1096},[1050,11368,11356],{"class":1100},[1050,11370,1104],{"class":1096},[1050,11372,1204],{"class":1086},[1050,11374,11375],{"class":1052,"line":3160},[1050,11376,3974],{"class":1086},[1050,11378,11379],{"class":1052,"line":3178},[1050,11380,1903],{"class":1698},[1050,11382,11383],{"class":1052,"line":3192},[1050,11384,4696],{"class":1056},[1050,11386,11387,11389],{"class":1052,"line":3200},[1050,11388,5029],{"class":1086},[1050,11390,5032],{"class":2341},[1050,11392,11393,11395,11398,11400,11402],{"class":1052,"line":3223},[1050,11394,5038],{"class":2128},[1050,11396,11397],{"class":2341}," send_unread_count",[1050,11399,1818],{"class":1086},[1050,11401,2348],{"class":2347},[1050,11403,2313],{"class":1086},[1050,11405,11406,11408,11411],{"class":1052,"line":3228},[1050,11407,2355],{"class":2318},[1050,11409,11410],{"class":2322},"Send current unread notifications count.",[1050,11412,2326],{"class":2318},[1050,11414,11415,11418,11420,11422,11424],{"class":1052,"line":3243},[1050,11416,11417],{"class":1694},"        from",[1050,11419,2011],{"class":1086},[1050,11421,2268],{"class":1698},[1050,11423,1695],{"class":1694},[1050,11425,11426],{"class":1698}," Notification\n",[1050,11428,11429],{"class":1052,"line":3265},[1050,11430,2474],{"class":1698},[1050,11432,11433,11436,11438,11441,11443,11445,11447,11449],{"class":1052,"line":3282},[1050,11434,11435],{"class":1698},"        unread_count ",[1050,11437,1854],{"class":1086},[1050,11439,11440],{"class":1698}," Notification",[1050,11442,1710],{"class":1086},[1050,11444,5089],{"class":1794},[1050,11446,1710],{"class":1086},[1050,11448,10166],{"class":1814},[1050,11450,1925],{"class":1086},[1050,11452,11453,11456,11458,11460,11462,11464],{"class":1052,"line":3319},[1050,11454,11455],{"class":3908},"            user",[1050,11457,1854],{"class":1086},[1050,11459,2348],{"class":1082},[1050,11461,1710],{"class":1086},[1050,11463,2451],{"class":1794},[1050,11465,1107],{"class":1086},[1050,11467,11468,11471,11473],{"class":1052,"line":3324},[1050,11469,11470],{"class":3908},"            read",[1050,11472,1854],{"class":1086},[1050,11474,11475],{"class":3723},"False\n",[1050,11477,11478,11481,11484],{"class":1052,"line":3345},[1050,11479,11480],{"class":1086},"        ).",[1050,11482,11483],{"class":1814},"count",[1050,11485,1860],{"class":1086},[1050,11487,11488],{"class":1052,"line":3355},[1050,11489,2474],{"class":1698},[1050,11491,11492,11495,11497,11499,11501,11503,11505,11507,11509,11511,11513,11515,11517,11519],{"class":1052,"line":3390},[1050,11493,11494],{"class":1698},"        asyncio",[1050,11496,1710],{"class":1086},[1050,11498,6007],{"class":1814},[1050,11500,1818],{"class":1086},[1050,11502,2348],{"class":1082},[1050,11504,1710],{"class":1086},[1050,11506,3903],{"class":1814},[1050,11508,1818],{"class":1086},[1050,11510,3039],{"class":3908},[1050,11512,1854],{"class":1086},[1050,11514,3913],{"class":1814},[1050,11516,1710],{"class":1086},[1050,11518,3918],{"class":1814},[1050,11520,1876],{"class":1086},[1050,11522,11523,11525,11527,11529,11531,11533,11535,11537],{"class":1052,"line":3395},[1050,11524,3926],{"class":1096},[1050,11526,2644],{"class":1100},[1050,11528,1104],{"class":1096},[1050,11530,1267],{"class":1086},[1050,11532,1226],{"class":1096},[1050,11534,11345],{"class":1100},[1050,11536,1104],{"class":1096},[1050,11538,1107],{"class":1086},[1050,11540,11541,11543,11545,11547,11549],{"class":1052,"line":3407},[1050,11542,3926],{"class":1096},[1050,11544,11356],{"class":1100},[1050,11546,1104],{"class":1096},[1050,11548,1267],{"class":1086},[1050,11550,11551],{"class":1814}," unread_count\n",[1050,11553,11554],{"class":1052,"line":3429},[1050,11555,11556],{"class":1086},"        })))\n",[1050,11558,11559],{"class":1052,"line":3434},[1050,11560,1903],{"class":1698},[1050,11562,11563,11565],{"class":1052,"line":3439},[1050,11564,5029],{"class":1086},[1050,11566,5032],{"class":2341},[1050,11568,11569,11571,11574,11576,11578,11580,11583],{"class":1052,"line":3445},[1050,11570,5038],{"class":2128},[1050,11572,11573],{"class":2341}," mark_notification_read",[1050,11575,1818],{"class":1086},[1050,11577,2348],{"class":2347},[1050,11579,1180],{"class":1086},[1050,11581,11582],{"class":2765}," notification_id",[1050,11584,2313],{"class":1086},[1050,11586,11587,11589,11592],{"class":1052,"line":3470},[1050,11588,2355],{"class":2318},[1050,11590,11591],{"class":2322},"Mark specific notification as read.",[1050,11593,2326],{"class":2318},[1050,11595,11596,11598,11600,11602,11604],{"class":1052,"line":3475},[1050,11597,11417],{"class":1694},[1050,11599,2011],{"class":1086},[1050,11601,2268],{"class":1698},[1050,11603,1695],{"class":1694},[1050,11605,11426],{"class":1698},[1050,11607,11608],{"class":1052,"line":3485},[1050,11609,2474],{"class":1698},[1050,11611,11612,11614],{"class":1052,"line":3491},[1050,11613,3016],{"class":1694},[1050,11615,2502],{"class":1086},[1050,11617,11618,11621,11623,11625,11627,11629,11631,11633],{"class":1052,"line":3508},[1050,11619,11620],{"class":1698},"            notification ",[1050,11622,1854],{"class":1086},[1050,11624,11440],{"class":1698},[1050,11626,1710],{"class":1086},[1050,11628,5089],{"class":1794},[1050,11630,1710],{"class":1086},[1050,11632,3057],{"class":1814},[1050,11634,1925],{"class":1086},[1050,11636,11637,11640,11642,11644],{"class":1052,"line":3519},[1050,11638,11639],{"class":3908},"                id",[1050,11641,1854],{"class":1086},[1050,11643,10969],{"class":1814},[1050,11645,1107],{"class":1086},[1050,11647,11648,11650,11652,11654,11656],{"class":1052,"line":3524},[1050,11649,5150],{"class":3908},[1050,11651,1854],{"class":1086},[1050,11653,2348],{"class":1082},[1050,11655,1710],{"class":1086},[1050,11657,11658],{"class":1794},"user\n",[1050,11660,11661],{"class":1052,"line":3544},[1050,11662,1959],{"class":1086},[1050,11664,11665,11668,11670,11672,11674],{"class":1052,"line":3559},[1050,11666,11667],{"class":1698},"            notification",[1050,11669,1710],{"class":1086},[1050,11671,11264],{"class":1794},[1050,11673,1087],{"class":1086},[1050,11675,9256],{"class":3723},[1050,11677,11678,11680,11682,11685],{"class":1052,"line":3582},[1050,11679,11667],{"class":1698},[1050,11681,1710],{"class":1086},[1050,11683,11684],{"class":1814},"save",[1050,11686,1860],{"class":1086},[1050,11688,11689],{"class":1052,"line":3607},[1050,11690,2925],{"class":1698},[1050,11692,11693],{"class":1052,"line":3634},[1050,11694,11695],{"class":1056},"            # Send updated count\n",[1050,11697,11698,11701,11703,11705,11707,11709,11711,11713],{"class":1052,"line":3653},[1050,11699,11700],{"class":1698},"            asyncio",[1050,11702,1710],{"class":1086},[1050,11704,6007],{"class":1814},[1050,11706,1818],{"class":1086},[1050,11708,2348],{"class":1082},[1050,11710,1710],{"class":1086},[1050,11712,10753],{"class":1814},[1050,11714,6019],{"class":1086},[1050,11716,11717,11719,11721,11723,11725],{"class":1052,"line":3658},[1050,11718,3231],{"class":1694},[1050,11720,11440],{"class":1698},[1050,11722,1710],{"class":1086},[1050,11724,5392],{"class":1794},[1050,11726,2502],{"class":1086},[1050,11728,11729],{"class":1052,"line":3663},[1050,11730,8274],{"class":1694},[1050,11732,11733],{"class":1052,"line":3668},[1050,11734,1903],{"class":1698},[1050,11736,11737,11739],{"class":1052,"line":3688},[1050,11738,5029],{"class":1086},[1050,11740,5032],{"class":2341},[1050,11742,11743,11745,11748,11750,11752],{"class":1052,"line":3698},[1050,11744,5038],{"class":2128},[1050,11746,11747],{"class":2341}," mark_all_notifications_read",[1050,11749,1818],{"class":1086},[1050,11751,2348],{"class":2347},[1050,11753,2313],{"class":1086},[1050,11755,11756,11758,11761],{"class":1052,"line":3729},[1050,11757,2355],{"class":2318},[1050,11759,11760],{"class":2322},"Mark all notifications as read.",[1050,11762,2326],{"class":2318},[1050,11764,11765,11767,11769,11771,11773],{"class":1052,"line":3734},[1050,11766,11417],{"class":1694},[1050,11768,2011],{"class":1086},[1050,11770,2268],{"class":1698},[1050,11772,1695],{"class":1694},[1050,11774,11426],{"class":1698},[1050,11776,11777],{"class":1052,"line":3740},[1050,11778,2474],{"class":1698},[1050,11780,11781,11784,11786,11788,11790,11792],{"class":1052,"line":3757},[1050,11782,11783],{"class":1698},"        Notification",[1050,11785,1710],{"class":1086},[1050,11787,5089],{"class":1794},[1050,11789,1710],{"class":1086},[1050,11791,10166],{"class":1814},[1050,11793,1925],{"class":1086},[1050,11795,11796,11798,11800,11802,11804,11806],{"class":1052,"line":3768},[1050,11797,11455],{"class":3908},[1050,11799,1854],{"class":1086},[1050,11801,2348],{"class":1082},[1050,11803,1710],{"class":1086},[1050,11805,2451],{"class":1794},[1050,11807,1107],{"class":1086},[1050,11809,11810,11812,11814],{"class":1052,"line":3773},[1050,11811,11470],{"class":3908},[1050,11813,1854],{"class":1086},[1050,11815,11475],{"class":3723},[1050,11817,11818,11820,11823,11825,11827,11829,11832],{"class":1052,"line":3793},[1050,11819,11480],{"class":1086},[1050,11821,11822],{"class":1814},"update",[1050,11824,1818],{"class":1086},[1050,11826,11264],{"class":3908},[1050,11828,1854],{"class":1086},[1050,11830,11831],{"class":3723},"True",[1050,11833,1837],{"class":1086},[1050,11835,11836],{"class":1052,"line":3816},[1050,11837,2474],{"class":1698},[1050,11839,11840],{"class":1052,"line":3839},[1050,11841,11842],{"class":1056},"        # Send updated count\n",[1050,11844,11845,11847,11849,11851,11853,11855,11857,11859],{"class":1052,"line":3853},[1050,11846,11494],{"class":1698},[1050,11848,1710],{"class":1086},[1050,11850,6007],{"class":1814},[1050,11852,1818],{"class":1086},[1050,11854,2348],{"class":1082},[1050,11856,1710],{"class":1086},[1050,11858,10753],{"class":1814},[1050,11860,6019],{"class":1086},[1050,11862,11863],{"class":1052,"line":3858},[1050,11864,1903],{"class":1698},[1050,11866,11867,11869],{"class":1052,"line":3863},[1050,11868,5029],{"class":1086},[1050,11870,5032],{"class":2341},[1050,11872,11873,11875,11878,11880,11882],{"class":1052,"line":3868},[1050,11874,5038],{"class":2128},[1050,11876,11877],{"class":2341}," send_notifications",[1050,11879,1818],{"class":1086},[1050,11881,2348],{"class":2347},[1050,11883,2313],{"class":1086},[1050,11885,11886,11888,11891],{"class":1052,"line":3884},[1050,11887,2355],{"class":2318},[1050,11889,11890],{"class":2322},"Send recent notifications.",[1050,11892,2326],{"class":2318},[1050,11894,11895,11897,11899,11901,11903],{"class":1052,"line":3894},[1050,11896,11417],{"class":1694},[1050,11898,2011],{"class":1086},[1050,11900,2268],{"class":1698},[1050,11902,1695],{"class":1694},[1050,11904,11426],{"class":1698},[1050,11906,11907],{"class":1052,"line":3923},[1050,11908,2474],{"class":1698},[1050,11910,11911,11914,11916,11918,11920,11922,11924,11926],{"class":1052,"line":3944},[1050,11912,11913],{"class":1698},"        notifications ",[1050,11915,1854],{"class":1086},[1050,11917,11440],{"class":1698},[1050,11919,1710],{"class":1086},[1050,11921,5089],{"class":1794},[1050,11923,1710],{"class":1086},[1050,11925,10166],{"class":1814},[1050,11927,1925],{"class":1086},[1050,11929,11930,11932,11934,11936,11938],{"class":1052,"line":3971},[1050,11931,11455],{"class":3908},[1050,11933,1854],{"class":1086},[1050,11935,2348],{"class":1082},[1050,11937,1710],{"class":1086},[1050,11939,11658],{"class":1794},[1050,11941,11942,11944,11946,11948,11950,11952,11954,11956,11959],{"class":1052,"line":3977},[1050,11943,11480],{"class":1086},[1050,11945,5348],{"class":1814},[1050,11947,1818],{"class":1086},[1050,11949,1104],{"class":1096},[1050,11951,5355],{"class":1100},[1050,11953,1104],{"class":1096},[1050,11955,5360],{"class":1086},[1050,11957,11958],{"class":1334},"20",[1050,11960,1204],{"class":1086},[1050,11962,11963],{"class":1052,"line":3982},[1050,11964,2474],{"class":1698},[1050,11966,11967,11970,11972],{"class":1052,"line":3988},[1050,11968,11969],{"class":1698},"        notifications_data ",[1050,11971,1854],{"class":1086},[1050,11973,5402],{"class":1086},[1050,11975,11976,11978,11981,11983,11986],{"class":1052,"line":4009},[1050,11977,4852],{"class":1694},[1050,11979,11980],{"class":1698}," notification ",[1050,11982,4858],{"class":1694},[1050,11984,11985],{"class":1698}," notifications",[1050,11987,2502],{"class":1086},[1050,11989,11990,11993,11995,11998],{"class":1052,"line":4019},[1050,11991,11992],{"class":1698},"            notifications_data",[1050,11994,1710],{"class":1086},[1050,11996,11997],{"class":1814},"append",[1050,11999,1876],{"class":1086},[1050,12001,12002,12004,12006,12008,12010,12013,12015,12017],{"class":1052,"line":4044},[1050,12003,2641],{"class":1096},[1050,12005,3602],{"class":1100},[1050,12007,1104],{"class":1096},[1050,12009,1267],{"class":1086},[1050,12011,12012],{"class":1814}," notification",[1050,12014,1710],{"class":1086},[1050,12016,3602],{"class":1794},[1050,12018,1107],{"class":1086},[1050,12020,12021,12023,12025,12027,12029,12031,12033,12035],{"class":1052,"line":4063},[1050,12022,2641],{"class":1096},[1050,12024,11161],{"class":1100},[1050,12026,1104],{"class":1096},[1050,12028,1267],{"class":1086},[1050,12030,12012],{"class":1814},[1050,12032,1710],{"class":1086},[1050,12034,11161],{"class":1794},[1050,12036,1107],{"class":1086},[1050,12038,12039,12041,12043,12045,12047,12049,12051,12053],{"class":1052,"line":4087},[1050,12040,2641],{"class":1096},[1050,12042,2687],{"class":1100},[1050,12044,1104],{"class":1096},[1050,12046,1267],{"class":1086},[1050,12048,12012],{"class":1814},[1050,12050,1710],{"class":1086},[1050,12052,2687],{"class":1794},[1050,12054,1107],{"class":1086},[1050,12056,12057,12059,12061,12063,12065,12067,12069,12071],{"class":1052,"line":4110},[1050,12058,2641],{"class":1096},[1050,12060,11206],{"class":1100},[1050,12062,1104],{"class":1096},[1050,12064,1267],{"class":1086},[1050,12066,12012],{"class":1814},[1050,12068,1710],{"class":1086},[1050,12070,11206],{"class":1794},[1050,12072,1107],{"class":1086},[1050,12074,12075,12077,12079,12081,12083,12085,12087,12089,12091,12093],{"class":1052,"line":4133},[1050,12076,2641],{"class":1096},[1050,12078,3612],{"class":1100},[1050,12080,1104],{"class":1096},[1050,12082,1267],{"class":1086},[1050,12084,12012],{"class":1814},[1050,12086,1710],{"class":1086},[1050,12088,3623],{"class":1794},[1050,12090,1710],{"class":1086},[1050,12092,3628],{"class":1814},[1050,12094,3631],{"class":1086},[1050,12096,12097,12099,12101,12103,12105,12107,12109],{"class":1052,"line":4156},[1050,12098,2641],{"class":1096},[1050,12100,11264],{"class":1100},[1050,12102,1104],{"class":1096},[1050,12104,1267],{"class":1086},[1050,12106,12012],{"class":1814},[1050,12108,1710],{"class":1086},[1050,12110,12111],{"class":1794},"read\n",[1050,12113,12114],{"class":1052,"line":4179},[1050,12115,12116],{"class":1086},"            })\n",[1050,12118,12119],{"class":1052,"line":4184},[1050,12120,2474],{"class":1698},[1050,12122,12123,12125,12127,12129,12131,12133,12135,12137,12139,12141,12143,12145,12147,12149],{"class":1052,"line":4189},[1050,12124,11494],{"class":1698},[1050,12126,1710],{"class":1086},[1050,12128,6007],{"class":1814},[1050,12130,1818],{"class":1086},[1050,12132,2348],{"class":1082},[1050,12134,1710],{"class":1086},[1050,12136,3903],{"class":1814},[1050,12138,1818],{"class":1086},[1050,12140,3039],{"class":3908},[1050,12142,1854],{"class":1086},[1050,12144,3913],{"class":1814},[1050,12146,1710],{"class":1086},[1050,12148,3918],{"class":1814},[1050,12150,1876],{"class":1086},[1050,12152,12153,12155,12157,12159,12161,12163,12166,12168],{"class":1052,"line":4209},[1050,12154,3926],{"class":1096},[1050,12156,2644],{"class":1100},[1050,12158,1104],{"class":1096},[1050,12160,1267],{"class":1086},[1050,12162,1226],{"class":1096},[1050,12164,12165],{"class":1100},"notifications_list",[1050,12167,1104],{"class":1096},[1050,12169,1107],{"class":1086},[1050,12171,12172,12174,12177,12179,12181],{"class":1052,"line":4219},[1050,12173,3926],{"class":1096},[1050,12175,12176],{"class":1100},"notifications",[1050,12178,1104],{"class":1096},[1050,12180,1267],{"class":1086},[1050,12182,12183],{"class":1814}," notifications_data\n",[1050,12185,12186],{"class":1052,"line":4225},[1050,12187,11556],{"class":1086},[1050,12189,12190],{"class":1052,"line":4258},[1050,12191,1070],{"emptyLinePlaceholder":1069},[1050,12193,12194],{"class":1052,"line":4283},[1050,12195,12196],{"class":1056},"# Utility function to send notifications\n",[1050,12198,12199,12202,12204,12207,12209,12211,12213,12216,12218,12220,12222,12225,12227,12229,12231,12233],{"class":1052,"line":4302},[1050,12200,12201],{"class":2128},"async",[1050,12203,2338],{"class":2128},[1050,12205,12206],{"class":2341}," send_notification_to_user",[1050,12208,1818],{"class":1086},[1050,12210,3587],{"class":2765},[1050,12212,1180],{"class":1086},[1050,12214,12215],{"class":2765}," title",[1050,12217,1180],{"class":1086},[1050,12219,3480],{"class":2765},[1050,12221,1180],{"class":1086},[1050,12223,12224],{"class":2765}," category",[1050,12226,1854],{"class":2487},[1050,12228,1104],{"class":1096},[1050,12230,11231],{"class":1100},[1050,12232,1104],{"class":1096},[1050,12234,2313],{"class":1086},[1050,12236,12237,12239,12242],{"class":1052,"line":4325},[1050,12238,2319],{"class":2318},[1050,12240,12241],{"class":2322},"Send notification to specific user.",[1050,12243,2326],{"class":2318},[1050,12245,12246,12249,12251,12253,12256,12258],{"class":1052,"line":4348},[1050,12247,12248],{"class":1694},"    from",[1050,12250,1730],{"class":1698},[1050,12252,1710],{"class":1086},[1050,12254,12255],{"class":1698},"layers ",[1050,12257,1695],{"class":1694},[1050,12259,12260],{"class":1698}," get_channel_layer\n",[1050,12262,12263,12265,12267,12269,12271],{"class":1052,"line":4354},[1050,12264,12248],{"class":1694},[1050,12266,2011],{"class":1086},[1050,12268,2268],{"class":1698},[1050,12270,1695],{"class":1694},[1050,12272,11426],{"class":1698},[1050,12274,12275,12277,12279,12281,12283,12285],{"class":1052,"line":4359},[1050,12276,12248],{"class":1694},[1050,12278,5504],{"class":1698},[1050,12280,1710],{"class":1086},[1050,12282,5509],{"class":1698},[1050,12284,1695],{"class":1694},[1050,12286,5514],{"class":1698},[1050,12288,12289],{"class":1052,"line":4379},[1050,12290,1903],{"class":1698},[1050,12292,12293],{"class":1052,"line":4389},[1050,12294,12295],{"class":1056},"    # Save notification to database\n",[1050,12297,12298,12300],{"class":1052,"line":4395},[1050,12299,5029],{"class":1086},[1050,12301,9318],{"class":2341},[1050,12303,12304,12306,12309],{"class":1052,"line":4426},[1050,12305,5038],{"class":2128},[1050,12307,12308],{"class":2341}," save_notification",[1050,12310,5837],{"class":1086},[1050,12312,12313,12316,12318,12321,12323,12325,12327,12329,12331,12333,12335,12337],{"class":1052,"line":4451},[1050,12314,12315],{"class":1698},"        user ",[1050,12317,1854],{"class":1086},[1050,12319,12320],{"class":1698}," User",[1050,12322,1710],{"class":1086},[1050,12324,5089],{"class":1794},[1050,12326,1710],{"class":1086},[1050,12328,3057],{"class":1814},[1050,12330,1818],{"class":1086},[1050,12332,3602],{"class":3908},[1050,12334,1854],{"class":1086},[1050,12336,3587],{"class":1814},[1050,12338,1837],{"class":1086},[1050,12340,12341,12343,12345,12347,12349,12351,12353],{"class":1052,"line":4470},[1050,12342,9253],{"class":1694},[1050,12344,11440],{"class":1698},[1050,12346,1710],{"class":1086},[1050,12348,5089],{"class":1794},[1050,12350,1710],{"class":1086},[1050,12352,5129],{"class":1814},[1050,12354,1925],{"class":1086},[1050,12356,12357,12359,12361,12363],{"class":1052,"line":4493},[1050,12358,11455],{"class":3908},[1050,12360,1854],{"class":1086},[1050,12362,2451],{"class":1814},[1050,12364,1107],{"class":1086},[1050,12366,12367,12370,12372,12374],{"class":1052,"line":4516},[1050,12368,12369],{"class":3908},"            title",[1050,12371,1854],{"class":1086},[1050,12373,11161],{"class":1814},[1050,12375,1107],{"class":1086},[1050,12377,12378,12381,12383,12385],{"class":1052,"line":4521},[1050,12379,12380],{"class":3908},"            message",[1050,12382,1854],{"class":1086},[1050,12384,2687],{"class":1814},[1050,12386,1107],{"class":1086},[1050,12388,12389,12392,12394],{"class":1052,"line":4526},[1050,12390,12391],{"class":3908},"            category",[1050,12393,1854],{"class":1086},[1050,12395,12396],{"class":1814},"category\n",[1050,12398,12399],{"class":1052,"line":4546},[1050,12400,1964],{"class":1086},[1050,12402,12403],{"class":1052,"line":4556},[1050,12404,1903],{"class":1698},[1050,12406,12407,12410,12412,12414,12416],{"class":1052,"line":4562},[1050,12408,12409],{"class":1698},"    notification ",[1050,12411,1854],{"class":1086},[1050,12413,3453],{"class":1694},[1050,12415,12308],{"class":1814},[1050,12417,1860],{"class":1086},[1050,12419,12420],{"class":1052,"line":4593},[1050,12421,1903],{"class":1698},[1050,12423,12424],{"class":1052,"line":4618},[1050,12425,12426],{"class":1056},"    # Send to WebSocket\n",[1050,12428,12429,12432,12434,12437],{"class":1052,"line":4637},[1050,12430,12431],{"class":1698},"    channel_layer ",[1050,12433,1854],{"class":1086},[1050,12435,12436],{"class":1814}," get_channel_layer",[1050,12438,1860],{"class":1086},[1050,12440,12441,12444,12447,12449,12451],{"class":1052,"line":4660},[1050,12442,12443],{"class":1694},"    await",[1050,12445,12446],{"class":1698}," channel_layer",[1050,12448,1710],{"class":1086},[1050,12450,2619],{"class":1814},[1050,12452,1925],{"class":1086},[1050,12454,12455,12458,12460,12462,12464,12466,12468],{"class":1052,"line":4683},[1050,12456,12457],{"class":2128},"        f",[1050,12459,10654],{"class":1100},[1050,12461,2431],{"class":2430},[1050,12463,3587],{"class":1814},[1050,12465,2440],{"class":2430},[1050,12467,1104],{"class":1100},[1050,12469,1107],{"class":1086},[1050,12471,12472],{"class":1052,"line":4688},[1050,12473,12474],{"class":1086},"        {\n",[1050,12476,12477,12479,12481,12483,12485,12487,12490,12492],{"class":1052,"line":4693},[1050,12478,3926],{"class":1096},[1050,12480,2644],{"class":1100},[1050,12482,1104],{"class":1096},[1050,12484,1267],{"class":1086},[1050,12486,1226],{"class":1096},[1050,12488,12489],{"class":1100},"notification_message",[1050,12491,1104],{"class":1096},[1050,12493,1107],{"class":1086},[1050,12495,12496,12498,12500,12502,12504,12506,12508,12510],{"class":1052,"line":4699},[1050,12497,3926],{"class":1096},[1050,12499,10969],{"class":1100},[1050,12501,1104],{"class":1096},[1050,12503,1267],{"class":1086},[1050,12505,12012],{"class":1814},[1050,12507,1710],{"class":1086},[1050,12509,3602],{"class":1794},[1050,12511,1107],{"class":1086},[1050,12513,12514,12516,12518,12520,12522,12524],{"class":1052,"line":4720},[1050,12515,3926],{"class":1096},[1050,12517,11161],{"class":1100},[1050,12519,1104],{"class":1096},[1050,12521,1267],{"class":1086},[1050,12523,12215],{"class":1814},[1050,12525,1107],{"class":1086},[1050,12527,12528,12530,12532,12534,12536,12538],{"class":1052,"line":4730},[1050,12529,3926],{"class":1096},[1050,12531,2687],{"class":1100},[1050,12533,1104],{"class":1096},[1050,12535,1267],{"class":1086},[1050,12537,3480],{"class":1814},[1050,12539,1107],{"class":1086},[1050,12541,12542,12544,12546,12548,12550,12552],{"class":1052,"line":4755},[1050,12543,3926],{"class":1096},[1050,12545,11206],{"class":1100},[1050,12547,1104],{"class":1096},[1050,12549,1267],{"class":1086},[1050,12551,12224],{"class":1814},[1050,12553,1107],{"class":1086},[1050,12555,12556,12558,12560,12562,12564,12566,12568,12570,12572,12574],{"class":1052,"line":4775},[1050,12557,3926],{"class":1096},[1050,12559,3612],{"class":1100},[1050,12561,1104],{"class":1096},[1050,12563,1267],{"class":1086},[1050,12565,12012],{"class":1814},[1050,12567,1710],{"class":1086},[1050,12569,3623],{"class":1794},[1050,12571,1710],{"class":1086},[1050,12573,3628],{"class":1814},[1050,12575,1860],{"class":1086},[1050,12577,12578],{"class":1052,"line":4789},[1050,12579,10365],{"class":1086},[1050,12581,12582],{"class":1052,"line":4794},[1050,12583,12584],{"class":1086},"    )\n",[1030,12586,12588],{"id":12587},"models-for-real-time-features","Models for Real-Time Features",[1035,12590,12592],{"id":12591},"chat-and-notification-models","Chat and Notification Models",[1040,12594,12596],{"className":1042,"code":12595,"language":1044,"meta":1045,"style":1045},"# models.py\nfrom django.db import models\nfrom django.contrib.auth.models import User\nfrom django.utils import timezone\n\nclass ChatRoom(models.Model):\n    \"\"\"Chat room model.\"\"\"\n    name = models.CharField(max_length=100, unique=True)\n    display_name = models.CharField(max_length=200)\n    description = models.TextField(blank=True)\n    created_at = models.DateTimeField(auto_now_add=True)\n    is_private = models.BooleanField(default=False)\n    max_users = models.IntegerField(default=100)\n    \n    class Meta:\n        ordering = ['name']\n    \n    def __str__(self):\n        return self.display_name or self.name\n\nclass Message(models.Model):\n    \"\"\"Chat message model.\"\"\"\n    room = models.ForeignKey(ChatRoom, on_delete=models.CASCADE, related_name='messages')\n    user = models.ForeignKey(User, on_delete=models.CASCADE)\n    content = models.TextField()\n    reply_to = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)\n    created_at = models.DateTimeField(auto_now_add=True)\n    updated_at = models.DateTimeField(auto_now=True)\n    is_edited = models.BooleanField(default=False)\n    is_deleted = models.BooleanField(default=False)\n    \n    class Meta:\n        ordering = ['created_at']\n    \n    def __str__(self):\n        return f'{self.user.username}: {self.content[:50]}'\n\nclass MessageReaction(models.Model):\n    \"\"\"Message reaction model.\"\"\"\n    message = models.ForeignKey(Message, on_delete=models.CASCADE, related_name='reactions')\n    user = models.ForeignKey(User, on_delete=models.CASCADE)\n    emoji = models.CharField(max_length=10)\n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    class Meta:\n        unique_together = ['message', 'user', 'emoji']\n\nclass Notification(models.Model):\n    \"\"\"Notification model.\"\"\"\n    CATEGORY_CHOICES = [\n        ('general', 'General'),\n        ('message', 'Message'),\n        ('mention', 'Mention'),\n        ('system', 'System'),\n        ('warning', 'Warning'),\n    ]\n    \n    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='notifications')\n    title = models.CharField(max_length=200)\n    message = models.TextField()\n    category = models.CharField(max_length=20, choices=CATEGORY_CHOICES, default='general')\n    read = models.BooleanField(default=False)\n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    class Meta:\n        ordering = ['-created_at']\n    \n    def __str__(self):\n        return f'{self.user.username}: {self.title}'\n\nclass UserStatus(models.Model):\n    \"\"\"User online status model.\"\"\"\n    STATUS_CHOICES = [\n        ('online', 'Online'),\n        ('away', 'Away'),\n        ('busy', 'Busy'),\n        ('offline', 'Offline'),\n    ]\n    \n    user = models.OneToOneField(User, on_delete=models.CASCADE)\n    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='offline')\n    last_seen = models.DateTimeField(default=timezone.now)\n    custom_message = models.CharField(max_length=100, blank=True)\n    \n    def __str__(self):\n        return f'{self.user.username}: {self.status}'\n",[1047,12597,12598,12603,12618,12640,12656,12660,12678,12687,12723,12747,12772,12797,12822,12846,12850,12860,12877,12881,12894,12915,12919,12935,12944,12993,13025,13040,13093,13115,13139,13162,13185,13189,13197,13213,13217,13229,13273,13277,13293,13302,13347,13377,13401,13423,13427,13435,13468,13472,13488,13497,13506,13528,13548,13570,13592,13614,13619,13623,13665,13688,13702,13749,13772,13794,13798,13806,13822,13826,13838,13874,13878,13895,13904,13913,13934,13956,13978,13999,14003,14007,14038,14082,14110,14141,14145,14157],{"__ignoreMap":1045},[1050,12599,12600],{"class":1052,"line":1053},[1050,12601,12602],{"class":1056},"# models.py\n",[1050,12604,12605,12607,12609,12611,12613,12615],{"class":1052,"line":1060},[1050,12606,1704],{"class":1694},[1050,12608,1707],{"class":1698},[1050,12610,1710],{"class":1086},[1050,12612,2242],{"class":1698},[1050,12614,1695],{"class":1694},[1050,12616,12617],{"class":1698}," models\n",[1050,12619,12620,12622,12624,12626,12628,12630,12632,12634,12636,12638],{"class":1052,"line":1066},[1050,12621,1704],{"class":1694},[1050,12623,1707],{"class":1698},[1050,12625,1710],{"class":1086},[1050,12627,2258],{"class":1698},[1050,12629,1710],{"class":1086},[1050,12631,2263],{"class":1698},[1050,12633,1710],{"class":1086},[1050,12635,2268],{"class":1698},[1050,12637,1695],{"class":1694},[1050,12639,2273],{"class":1698},[1050,12641,12642,12644,12646,12648,12651,12653],{"class":1052,"line":1073},[1050,12643,1704],{"class":1694},[1050,12645,1707],{"class":1698},[1050,12647,1710],{"class":1086},[1050,12649,12650],{"class":1698},"utils ",[1050,12652,1695],{"class":1694},[1050,12654,12655],{"class":1698}," timezone\n",[1050,12657,12658],{"class":1052,"line":1079},[1050,12659,1070],{"emptyLinePlaceholder":1069},[1050,12661,12662,12664,12666,12668,12671,12673,12676],{"class":1052,"line":1093},[1050,12663,2300],{"class":2128},[1050,12665,2286],{"class":2303},[1050,12667,1818],{"class":1086},[1050,12669,12670],{"class":2309},"models",[1050,12672,1710],{"class":1086},[1050,12674,12675],{"class":2309},"Model",[1050,12677,2313],{"class":1086},[1050,12679,12680,12682,12685],{"class":1052,"line":1110},[1050,12681,2319],{"class":2318},[1050,12683,12684],{"class":2322},"Chat room model.",[1050,12686,2326],{"class":2318},[1050,12688,12689,12692,12694,12697,12699,12702,12704,12707,12709,12712,12714,12717,12719,12721],{"class":1052,"line":1122},[1050,12690,12691],{"class":1698},"    name ",[1050,12693,1854],{"class":1086},[1050,12695,12696],{"class":1698}," models",[1050,12698,1710],{"class":1086},[1050,12700,12701],{"class":1814},"CharField",[1050,12703,1818],{"class":1086},[1050,12705,12706],{"class":3908},"max_length",[1050,12708,1854],{"class":1086},[1050,12710,12711],{"class":1334},"100",[1050,12713,1180],{"class":1086},[1050,12715,12716],{"class":3908}," unique",[1050,12718,1854],{"class":1086},[1050,12720,11831],{"class":3723},[1050,12722,1837],{"class":1086},[1050,12724,12725,12728,12730,12732,12734,12736,12738,12740,12742,12745],{"class":1052,"line":1134},[1050,12726,12727],{"class":1698},"    display_name ",[1050,12729,1854],{"class":1086},[1050,12731,12696],{"class":1698},[1050,12733,1710],{"class":1086},[1050,12735,12701],{"class":1814},[1050,12737,1818],{"class":1086},[1050,12739,12706],{"class":3908},[1050,12741,1854],{"class":1086},[1050,12743,12744],{"class":1334},"200",[1050,12746,1837],{"class":1086},[1050,12748,12749,12752,12754,12756,12758,12761,12763,12766,12768,12770],{"class":1052,"line":1146},[1050,12750,12751],{"class":1698},"    description ",[1050,12753,1854],{"class":1086},[1050,12755,12696],{"class":1698},[1050,12757,1710],{"class":1086},[1050,12759,12760],{"class":1814},"TextField",[1050,12762,1818],{"class":1086},[1050,12764,12765],{"class":3908},"blank",[1050,12767,1854],{"class":1086},[1050,12769,11831],{"class":3723},[1050,12771,1837],{"class":1086},[1050,12773,12774,12777,12779,12781,12783,12786,12788,12791,12793,12795],{"class":1052,"line":1158},[1050,12775,12776],{"class":1698},"    created_at ",[1050,12778,1854],{"class":1086},[1050,12780,12696],{"class":1698},[1050,12782,1710],{"class":1086},[1050,12784,12785],{"class":1814},"DateTimeField",[1050,12787,1818],{"class":1086},[1050,12789,12790],{"class":3908},"auto_now_add",[1050,12792,1854],{"class":1086},[1050,12794,11831],{"class":3723},[1050,12796,1837],{"class":1086},[1050,12798,12799,12802,12804,12806,12808,12811,12813,12815,12817,12820],{"class":1052,"line":1170},[1050,12800,12801],{"class":1698},"    is_private ",[1050,12803,1854],{"class":1086},[1050,12805,12696],{"class":1698},[1050,12807,1710],{"class":1086},[1050,12809,12810],{"class":1814},"BooleanField",[1050,12812,1818],{"class":1086},[1050,12814,1262],{"class":3908},[1050,12816,1854],{"class":1086},[1050,12818,12819],{"class":3723},"False",[1050,12821,1837],{"class":1086},[1050,12823,12824,12827,12829,12831,12833,12836,12838,12840,12842,12844],{"class":1052,"line":1186},[1050,12825,12826],{"class":1698},"    max_users ",[1050,12828,1854],{"class":1086},[1050,12830,12696],{"class":1698},[1050,12832,1710],{"class":1086},[1050,12834,12835],{"class":1814},"IntegerField",[1050,12837,1818],{"class":1086},[1050,12839,1262],{"class":3908},[1050,12841,1854],{"class":1086},[1050,12843,12711],{"class":1334},[1050,12845,1837],{"class":1086},[1050,12847,12848],{"class":1052,"line":1201},[1050,12849,1903],{"class":1698},[1050,12851,12852,12855,12858],{"class":1052,"line":1207},[1050,12853,12854],{"class":2128},"    class",[1050,12856,12857],{"class":2303}," Meta",[1050,12859,2502],{"class":1086},[1050,12861,12862,12865,12867,12869,12871,12873,12875],{"class":1052,"line":1212},[1050,12863,12864],{"class":1698},"        ordering ",[1050,12866,1854],{"class":1086},[1050,12868,9143],{"class":1086},[1050,12870,1104],{"class":1096},[1050,12872,5099],{"class":1100},[1050,12874,1104],{"class":1096},[1050,12876,1204],{"class":1086},[1050,12878,12879],{"class":1052,"line":1218},[1050,12880,1903],{"class":1698},[1050,12882,12883,12885,12888,12890,12892],{"class":1052,"line":1235},[1050,12884,5038],{"class":2128},[1050,12886,12887],{"class":2784}," __str__",[1050,12889,1818],{"class":1086},[1050,12891,2348],{"class":2347},[1050,12893,2313],{"class":1086},[1050,12895,12896,12898,12900,12902,12905,12908,12910,12912],{"class":1052,"line":1240},[1050,12897,9253],{"class":1694},[1050,12899,2375],{"class":1082},[1050,12901,1710],{"class":1086},[1050,12903,12904],{"class":1794},"display_name",[1050,12906,12907],{"class":2487}," or",[1050,12909,2375],{"class":1082},[1050,12911,1710],{"class":1086},[1050,12913,12914],{"class":1794},"name\n",[1050,12916,12917],{"class":1052,"line":1246},[1050,12918,1070],{"emptyLinePlaceholder":1069},[1050,12920,12921,12923,12925,12927,12929,12931,12933],{"class":1052,"line":1257},[1050,12922,2300],{"class":2128},[1050,12924,5120],{"class":2303},[1050,12926,1818],{"class":1086},[1050,12928,12670],{"class":2309},[1050,12930,1710],{"class":1086},[1050,12932,12675],{"class":2309},[1050,12934,2313],{"class":1086},[1050,12936,12937,12939,12942],{"class":1052,"line":1272},[1050,12938,2319],{"class":2318},[1050,12940,12941],{"class":2322},"Chat message model.",[1050,12943,2326],{"class":2318},[1050,12945,12946,12949,12951,12953,12955,12958,12960,12963,12965,12968,12970,12972,12974,12978,12980,12983,12985,12987,12989,12991],{"class":1052,"line":1294},[1050,12947,12948],{"class":1698},"    room ",[1050,12950,1854],{"class":1086},[1050,12952,12696],{"class":1698},[1050,12954,1710],{"class":1086},[1050,12956,12957],{"class":1814},"ForeignKey",[1050,12959,1818],{"class":1086},[1050,12961,12962],{"class":1814},"ChatRoom",[1050,12964,1180],{"class":1086},[1050,12966,12967],{"class":3908}," on_delete",[1050,12969,1854],{"class":1086},[1050,12971,12670],{"class":1814},[1050,12973,1710],{"class":1086},[1050,12975,12977],{"class":12976},"sFGJz","CASCADE",[1050,12979,1180],{"class":1086},[1050,12981,12982],{"class":3908}," related_name",[1050,12984,1854],{"class":1086},[1050,12986,1104],{"class":1096},[1050,12988,5324],{"class":1100},[1050,12990,1104],{"class":1096},[1050,12992,1837],{"class":1086},[1050,12994,12995,12998,13000,13002,13004,13006,13008,13011,13013,13015,13017,13019,13021,13023],{"class":1052,"line":1308},[1050,12996,12997],{"class":1698},"    user ",[1050,12999,1854],{"class":1086},[1050,13001,12696],{"class":1698},[1050,13003,1710],{"class":1086},[1050,13005,12957],{"class":1814},[1050,13007,1818],{"class":1086},[1050,13009,13010],{"class":1814},"User",[1050,13012,1180],{"class":1086},[1050,13014,12967],{"class":3908},[1050,13016,1854],{"class":1086},[1050,13018,12670],{"class":1814},[1050,13020,1710],{"class":1086},[1050,13022,12977],{"class":12976},[1050,13024,1837],{"class":1086},[1050,13026,13027,13030,13032,13034,13036,13038],{"class":1052,"line":1341},[1050,13028,13029],{"class":1698},"    content ",[1050,13031,1854],{"class":1086},[1050,13033,12696],{"class":1698},[1050,13035,1710],{"class":1086},[1050,13037,12760],{"class":1814},[1050,13039,1860],{"class":1086},[1050,13041,13042,13045,13047,13049,13051,13053,13055,13057,13059,13061,13063,13065,13067,13069,13071,13073,13075,13078,13080,13082,13084,13087,13089,13091],{"class":1052,"line":1361},[1050,13043,13044],{"class":1698},"    reply_to ",[1050,13046,1854],{"class":1086},[1050,13048,12696],{"class":1698},[1050,13050,1710],{"class":1086},[1050,13052,12957],{"class":1814},[1050,13054,1818],{"class":1086},[1050,13056,1104],{"class":1096},[1050,13058,2348],{"class":1100},[1050,13060,1104],{"class":1096},[1050,13062,1180],{"class":1086},[1050,13064,12967],{"class":3908},[1050,13066,1854],{"class":1086},[1050,13068,12670],{"class":1814},[1050,13070,1710],{"class":1086},[1050,13072,12977],{"class":12976},[1050,13074,1180],{"class":1086},[1050,13076,13077],{"class":3908}," null",[1050,13079,1854],{"class":1086},[1050,13081,11831],{"class":3723},[1050,13083,1180],{"class":1086},[1050,13085,13086],{"class":3908}," blank",[1050,13088,1854],{"class":1086},[1050,13090,11831],{"class":3723},[1050,13092,1837],{"class":1086},[1050,13094,13095,13097,13099,13101,13103,13105,13107,13109,13111,13113],{"class":1052,"line":1381},[1050,13096,12776],{"class":1698},[1050,13098,1854],{"class":1086},[1050,13100,12696],{"class":1698},[1050,13102,1710],{"class":1086},[1050,13104,12785],{"class":1814},[1050,13106,1818],{"class":1086},[1050,13108,12790],{"class":3908},[1050,13110,1854],{"class":1086},[1050,13112,11831],{"class":3723},[1050,13114,1837],{"class":1086},[1050,13116,13117,13120,13122,13124,13126,13128,13130,13133,13135,13137],{"class":1052,"line":1387},[1050,13118,13119],{"class":1698},"    updated_at ",[1050,13121,1854],{"class":1086},[1050,13123,12696],{"class":1698},[1050,13125,1710],{"class":1086},[1050,13127,12785],{"class":1814},[1050,13129,1818],{"class":1086},[1050,13131,13132],{"class":3908},"auto_now",[1050,13134,1854],{"class":1086},[1050,13136,11831],{"class":3723},[1050,13138,1837],{"class":1086},[1050,13140,13141,13144,13146,13148,13150,13152,13154,13156,13158,13160],{"class":1052,"line":1393},[1050,13142,13143],{"class":1698},"    is_edited ",[1050,13145,1854],{"class":1086},[1050,13147,12696],{"class":1698},[1050,13149,1710],{"class":1086},[1050,13151,12810],{"class":1814},[1050,13153,1818],{"class":1086},[1050,13155,1262],{"class":3908},[1050,13157,1854],{"class":1086},[1050,13159,12819],{"class":3723},[1050,13161,1837],{"class":1086},[1050,13163,13164,13167,13169,13171,13173,13175,13177,13179,13181,13183],{"class":1052,"line":1399},[1050,13165,13166],{"class":1698},"    is_deleted ",[1050,13168,1854],{"class":1086},[1050,13170,12696],{"class":1698},[1050,13172,1710],{"class":1086},[1050,13174,12810],{"class":1814},[1050,13176,1818],{"class":1086},[1050,13178,1262],{"class":3908},[1050,13180,1854],{"class":1086},[1050,13182,12819],{"class":3723},[1050,13184,1837],{"class":1086},[1050,13186,13187],{"class":1052,"line":1404},[1050,13188,1903],{"class":1698},[1050,13190,13191,13193,13195],{"class":1052,"line":1410},[1050,13192,12854],{"class":2128},[1050,13194,12857],{"class":2303},[1050,13196,2502],{"class":1086},[1050,13198,13199,13201,13203,13205,13207,13209,13211],{"class":1052,"line":1419},[1050,13200,12864],{"class":1698},[1050,13202,1854],{"class":1086},[1050,13204,9143],{"class":1086},[1050,13206,1104],{"class":1096},[1050,13208,3623],{"class":1100},[1050,13210,1104],{"class":1096},[1050,13212,1204],{"class":1086},[1050,13214,13215],{"class":1052,"line":1432},[1050,13216,1903],{"class":1698},[1050,13218,13219,13221,13223,13225,13227],{"class":1052,"line":1451},[1050,13220,5038],{"class":2128},[1050,13222,12887],{"class":2784},[1050,13224,1818],{"class":1086},[1050,13226,2348],{"class":2347},[1050,13228,2313],{"class":1086},[1050,13230,13231,13233,13235,13237,13239,13241,13243,13245,13247,13249,13251,13254,13256,13258,13260,13262,13265,13267,13269,13271],{"class":1052,"line":1464},[1050,13232,9253],{"class":1694},[1050,13234,2424],{"class":2128},[1050,13236,1104],{"class":1100},[1050,13238,2431],{"class":2430},[1050,13240,2348],{"class":1082},[1050,13242,1710],{"class":1086},[1050,13244,2451],{"class":1794},[1050,13246,1710],{"class":1086},[1050,13248,2678],{"class":1794},[1050,13250,2440],{"class":2430},[1050,13252,13253],{"class":1100},": ",[1050,13255,2431],{"class":2430},[1050,13257,2348],{"class":1082},[1050,13259,1710],{"class":1086},[1050,13261,4925],{"class":1794},[1050,13263,13264],{"class":1086},"[:",[1050,13266,5363],{"class":1334},[1050,13268,4240],{"class":1086},[1050,13270,2440],{"class":2430},[1050,13272,1232],{"class":1100},[1050,13274,13275],{"class":1052,"line":1477},[1050,13276,1070],{"emptyLinePlaceholder":1069},[1050,13278,13279,13281,13283,13285,13287,13289,13291],{"class":1052,"line":1483},[1050,13280,2300],{"class":2128},[1050,13282,10071],{"class":2303},[1050,13284,1818],{"class":1086},[1050,13286,12670],{"class":2309},[1050,13288,1710],{"class":1086},[1050,13290,12675],{"class":2309},[1050,13292,2313],{"class":1086},[1050,13294,13295,13297,13300],{"class":1052,"line":1498},[1050,13296,2319],{"class":2318},[1050,13298,13299],{"class":2322},"Message reaction model.",[1050,13301,2326],{"class":2318},[1050,13303,13304,13307,13309,13311,13313,13315,13317,13320,13322,13324,13326,13328,13330,13332,13334,13336,13338,13340,13343,13345],{"class":1052,"line":1519},[1050,13305,13306],{"class":1698},"    message ",[1050,13308,1854],{"class":1086},[1050,13310,12696],{"class":1698},[1050,13312,1710],{"class":1086},[1050,13314,12957],{"class":1814},[1050,13316,1818],{"class":1086},[1050,13318,13319],{"class":1814},"Message",[1050,13321,1180],{"class":1086},[1050,13323,12967],{"class":3908},[1050,13325,1854],{"class":1086},[1050,13327,12670],{"class":1814},[1050,13329,1710],{"class":1086},[1050,13331,12977],{"class":12976},[1050,13333,1180],{"class":1086},[1050,13335,12982],{"class":3908},[1050,13337,1854],{"class":1086},[1050,13339,1104],{"class":1096},[1050,13341,13342],{"class":1100},"reactions",[1050,13344,1104],{"class":1096},[1050,13346,1837],{"class":1086},[1050,13348,13349,13351,13353,13355,13357,13359,13361,13363,13365,13367,13369,13371,13373,13375],{"class":1052,"line":1537},[1050,13350,12997],{"class":1698},[1050,13352,1854],{"class":1086},[1050,13354,12696],{"class":1698},[1050,13356,1710],{"class":1086},[1050,13358,12957],{"class":1814},[1050,13360,1818],{"class":1086},[1050,13362,13010],{"class":1814},[1050,13364,1180],{"class":1086},[1050,13366,12967],{"class":3908},[1050,13368,1854],{"class":1086},[1050,13370,12670],{"class":1814},[1050,13372,1710],{"class":1086},[1050,13374,12977],{"class":12976},[1050,13376,1837],{"class":1086},[1050,13378,13379,13382,13384,13386,13388,13390,13392,13394,13396,13399],{"class":1052,"line":1555},[1050,13380,13381],{"class":1698},"    emoji ",[1050,13383,1854],{"class":1086},[1050,13385,12696],{"class":1698},[1050,13387,1710],{"class":1086},[1050,13389,12701],{"class":1814},[1050,13391,1818],{"class":1086},[1050,13393,12706],{"class":3908},[1050,13395,1854],{"class":1086},[1050,13397,13398],{"class":1334},"10",[1050,13400,1837],{"class":1086},[1050,13402,13403,13405,13407,13409,13411,13413,13415,13417,13419,13421],{"class":1052,"line":1561},[1050,13404,12776],{"class":1698},[1050,13406,1854],{"class":1086},[1050,13408,12696],{"class":1698},[1050,13410,1710],{"class":1086},[1050,13412,12785],{"class":1814},[1050,13414,1818],{"class":1086},[1050,13416,12790],{"class":3908},[1050,13418,1854],{"class":1086},[1050,13420,11831],{"class":3723},[1050,13422,1837],{"class":1086},[1050,13424,13425],{"class":1052,"line":1582},[1050,13426,1903],{"class":1698},[1050,13428,13429,13431,13433],{"class":1052,"line":1599},[1050,13430,12854],{"class":2128},[1050,13432,12857],{"class":2303},[1050,13434,2502],{"class":1086},[1050,13436,13437,13440,13442,13444,13446,13448,13450,13452,13454,13456,13458,13460,13462,13464,13466],{"class":1052,"line":1605},[1050,13438,13439],{"class":1698},"        unique_together ",[1050,13441,1854],{"class":1086},[1050,13443,9143],{"class":1086},[1050,13445,1104],{"class":1096},[1050,13447,2687],{"class":1100},[1050,13449,1104],{"class":1096},[1050,13451,1180],{"class":1086},[1050,13453,1226],{"class":1096},[1050,13455,2451],{"class":1100},[1050,13457,1104],{"class":1096},[1050,13459,1180],{"class":1086},[1050,13461,1226],{"class":1096},[1050,13463,7299],{"class":1100},[1050,13465,1104],{"class":1096},[1050,13467,1204],{"class":1086},[1050,13469,13470],{"class":1052,"line":1611},[1050,13471,1070],{"emptyLinePlaceholder":1069},[1050,13473,13474,13476,13478,13480,13482,13484,13486],{"class":1052,"line":1627},[1050,13475,2300],{"class":2128},[1050,13477,11440],{"class":2303},[1050,13479,1818],{"class":1086},[1050,13481,12670],{"class":2309},[1050,13483,1710],{"class":1086},[1050,13485,12675],{"class":2309},[1050,13487,2313],{"class":1086},[1050,13489,13490,13492,13495],{"class":1052,"line":1643},[1050,13491,2319],{"class":2318},[1050,13493,13494],{"class":2322},"Notification model.",[1050,13496,2326],{"class":2318},[1050,13498,13499,13502,13504],{"class":1052,"line":1663},[1050,13500,13501],{"class":1082},"    CATEGORY_CHOICES",[1050,13503,1087],{"class":1086},[1050,13505,1090],{"class":1086},[1050,13507,13508,13511,13513,13515,13517,13519,13521,13524,13526],{"class":1052,"line":1668},[1050,13509,13510],{"class":1086},"        (",[1050,13512,1104],{"class":1096},[1050,13514,11231],{"class":1100},[1050,13516,1104],{"class":1096},[1050,13518,1180],{"class":1086},[1050,13520,1226],{"class":1096},[1050,13522,13523],{"class":1100},"General",[1050,13525,1104],{"class":1096},[1050,13527,1516],{"class":1086},[1050,13529,13530,13532,13534,13536,13538,13540,13542,13544,13546],{"class":1052,"line":1673},[1050,13531,13510],{"class":1086},[1050,13533,1104],{"class":1096},[1050,13535,2687],{"class":1100},[1050,13537,1104],{"class":1096},[1050,13539,1180],{"class":1086},[1050,13541,1226],{"class":1096},[1050,13543,13319],{"class":1100},[1050,13545,1104],{"class":1096},[1050,13547,1516],{"class":1086},[1050,13549,13550,13552,13554,13557,13559,13561,13563,13566,13568],{"class":1052,"line":2857},[1050,13551,13510],{"class":1086},[1050,13553,1104],{"class":1096},[1050,13555,13556],{"class":1100},"mention",[1050,13558,1104],{"class":1096},[1050,13560,1180],{"class":1086},[1050,13562,1226],{"class":1096},[1050,13564,13565],{"class":1100},"Mention",[1050,13567,1104],{"class":1096},[1050,13569,1516],{"class":1086},[1050,13571,13572,13574,13576,13579,13581,13583,13585,13588,13590],{"class":1052,"line":2880},[1050,13573,13510],{"class":1086},[1050,13575,1104],{"class":1096},[1050,13577,13578],{"class":1100},"system",[1050,13580,1104],{"class":1096},[1050,13582,1180],{"class":1086},[1050,13584,1226],{"class":1096},[1050,13586,13587],{"class":1100},"System",[1050,13589,1104],{"class":1096},[1050,13591,1516],{"class":1086},[1050,13593,13594,13596,13598,13601,13603,13605,13607,13610,13612],{"class":1052,"line":2912},[1050,13595,13510],{"class":1086},[1050,13597,1104],{"class":1096},[1050,13599,13600],{"class":1100},"warning",[1050,13602,1104],{"class":1096},[1050,13604,1180],{"class":1086},[1050,13606,1226],{"class":1096},[1050,13608,13609],{"class":1100},"Warning",[1050,13611,1104],{"class":1096},[1050,13613,1516],{"class":1086},[1050,13615,13616],{"class":1052,"line":2917},[1050,13617,13618],{"class":1086},"    ]\n",[1050,13620,13621],{"class":1052,"line":2922},[1050,13622,1903],{"class":1698},[1050,13624,13625,13627,13629,13631,13633,13635,13637,13639,13641,13643,13645,13647,13649,13651,13653,13655,13657,13659,13661,13663],{"class":1052,"line":2928},[1050,13626,12997],{"class":1698},[1050,13628,1854],{"class":1086},[1050,13630,12696],{"class":1698},[1050,13632,1710],{"class":1086},[1050,13634,12957],{"class":1814},[1050,13636,1818],{"class":1086},[1050,13638,13010],{"class":1814},[1050,13640,1180],{"class":1086},[1050,13642,12967],{"class":3908},[1050,13644,1854],{"class":1086},[1050,13646,12670],{"class":1814},[1050,13648,1710],{"class":1086},[1050,13650,12977],{"class":12976},[1050,13652,1180],{"class":1086},[1050,13654,12982],{"class":3908},[1050,13656,1854],{"class":1086},[1050,13658,1104],{"class":1096},[1050,13660,12176],{"class":1100},[1050,13662,1104],{"class":1096},[1050,13664,1837],{"class":1086},[1050,13666,13667,13670,13672,13674,13676,13678,13680,13682,13684,13686],{"class":1052,"line":2934},[1050,13668,13669],{"class":1698},"    title ",[1050,13671,1854],{"class":1086},[1050,13673,12696],{"class":1698},[1050,13675,1710],{"class":1086},[1050,13677,12701],{"class":1814},[1050,13679,1818],{"class":1086},[1050,13681,12706],{"class":3908},[1050,13683,1854],{"class":1086},[1050,13685,12744],{"class":1334},[1050,13687,1837],{"class":1086},[1050,13689,13690,13692,13694,13696,13698,13700],{"class":1052,"line":2952},[1050,13691,13306],{"class":1698},[1050,13693,1854],{"class":1086},[1050,13695,12696],{"class":1698},[1050,13697,1710],{"class":1086},[1050,13699,12760],{"class":1814},[1050,13701,1860],{"class":1086},[1050,13703,13704,13707,13709,13711,13713,13715,13717,13719,13721,13723,13725,13728,13730,13734,13736,13739,13741,13743,13745,13747],{"class":1052,"line":2963},[1050,13705,13706],{"class":1698},"    category ",[1050,13708,1854],{"class":1086},[1050,13710,12696],{"class":1698},[1050,13712,1710],{"class":1086},[1050,13714,12701],{"class":1814},[1050,13716,1818],{"class":1086},[1050,13718,12706],{"class":3908},[1050,13720,1854],{"class":1086},[1050,13722,11958],{"class":1334},[1050,13724,1180],{"class":1086},[1050,13726,13727],{"class":3908}," choices",[1050,13729,1854],{"class":1086},[1050,13731,13733],{"class":13732},"s6DHA","CATEGORY_CHOICES",[1050,13735,1180],{"class":1086},[1050,13737,13738],{"class":3908}," default",[1050,13740,1854],{"class":1086},[1050,13742,1104],{"class":1096},[1050,13744,11231],{"class":1100},[1050,13746,1104],{"class":1096},[1050,13748,1837],{"class":1086},[1050,13750,13751,13754,13756,13758,13760,13762,13764,13766,13768,13770],{"class":1052,"line":2972},[1050,13752,13753],{"class":1698},"    read ",[1050,13755,1854],{"class":1086},[1050,13757,12696],{"class":1698},[1050,13759,1710],{"class":1086},[1050,13761,12810],{"class":1814},[1050,13763,1818],{"class":1086},[1050,13765,1262],{"class":3908},[1050,13767,1854],{"class":1086},[1050,13769,12819],{"class":3723},[1050,13771,1837],{"class":1086},[1050,13773,13774,13776,13778,13780,13782,13784,13786,13788,13790,13792],{"class":1052,"line":2977},[1050,13775,12776],{"class":1698},[1050,13777,1854],{"class":1086},[1050,13779,12696],{"class":1698},[1050,13781,1710],{"class":1086},[1050,13783,12785],{"class":1814},[1050,13785,1818],{"class":1086},[1050,13787,12790],{"class":3908},[1050,13789,1854],{"class":1086},[1050,13791,11831],{"class":3723},[1050,13793,1837],{"class":1086},[1050,13795,13796],{"class":1052,"line":2982},[1050,13797,1903],{"class":1698},[1050,13799,13800,13802,13804],{"class":1052,"line":3003},[1050,13801,12854],{"class":2128},[1050,13803,12857],{"class":2303},[1050,13805,2502],{"class":1086},[1050,13807,13808,13810,13812,13814,13816,13818,13820],{"class":1052,"line":3013},[1050,13809,12864],{"class":1698},[1050,13811,1854],{"class":1086},[1050,13813,9143],{"class":1086},[1050,13815,1104],{"class":1096},[1050,13817,5355],{"class":1100},[1050,13819,1104],{"class":1096},[1050,13821,1204],{"class":1086},[1050,13823,13824],{"class":1052,"line":3021},[1050,13825,1903],{"class":1698},[1050,13827,13828,13830,13832,13834,13836],{"class":1052,"line":3044},[1050,13829,5038],{"class":2128},[1050,13831,12887],{"class":2784},[1050,13833,1818],{"class":1086},[1050,13835,2348],{"class":2347},[1050,13837,2313],{"class":1086},[1050,13839,13840,13842,13844,13846,13848,13850,13852,13854,13856,13858,13860,13862,13864,13866,13868,13870,13872],{"class":1052,"line":3078},[1050,13841,9253],{"class":1694},[1050,13843,2424],{"class":2128},[1050,13845,1104],{"class":1100},[1050,13847,2431],{"class":2430},[1050,13849,2348],{"class":1082},[1050,13851,1710],{"class":1086},[1050,13853,2451],{"class":1794},[1050,13855,1710],{"class":1086},[1050,13857,2678],{"class":1794},[1050,13859,2440],{"class":2430},[1050,13861,13253],{"class":1100},[1050,13863,2431],{"class":2430},[1050,13865,2348],{"class":1082},[1050,13867,1710],{"class":1086},[1050,13869,11161],{"class":1794},[1050,13871,2440],{"class":2430},[1050,13873,1232],{"class":1100},[1050,13875,13876],{"class":1052,"line":3083},[1050,13877,1070],{"emptyLinePlaceholder":1069},[1050,13879,13880,13882,13885,13887,13889,13891,13893],{"class":1052,"line":3103},[1050,13881,2300],{"class":2128},[1050,13883,13884],{"class":2303}," UserStatus",[1050,13886,1818],{"class":1086},[1050,13888,12670],{"class":2309},[1050,13890,1710],{"class":1086},[1050,13892,12675],{"class":2309},[1050,13894,2313],{"class":1086},[1050,13896,13897,13899,13902],{"class":1052,"line":3123},[1050,13898,2319],{"class":2318},[1050,13900,13901],{"class":2322},"User online status model.",[1050,13903,2326],{"class":2318},[1050,13905,13906,13909,13911],{"class":1052,"line":3142},[1050,13907,13908],{"class":1082},"    STATUS_CHOICES",[1050,13910,1087],{"class":1086},[1050,13912,1090],{"class":1086},[1050,13914,13915,13917,13919,13921,13923,13925,13927,13930,13932],{"class":1052,"line":3160},[1050,13916,13510],{"class":1086},[1050,13918,1104],{"class":1096},[1050,13920,5639],{"class":1100},[1050,13922,1104],{"class":1096},[1050,13924,1180],{"class":1086},[1050,13926,1226],{"class":1096},[1050,13928,13929],{"class":1100},"Online",[1050,13931,1104],{"class":1096},[1050,13933,1516],{"class":1086},[1050,13935,13936,13938,13940,13943,13945,13947,13949,13952,13954],{"class":1052,"line":3178},[1050,13937,13510],{"class":1086},[1050,13939,1104],{"class":1096},[1050,13941,13942],{"class":1100},"away",[1050,13944,1104],{"class":1096},[1050,13946,1180],{"class":1086},[1050,13948,1226],{"class":1096},[1050,13950,13951],{"class":1100},"Away",[1050,13953,1104],{"class":1096},[1050,13955,1516],{"class":1086},[1050,13957,13958,13960,13962,13965,13967,13969,13971,13974,13976],{"class":1052,"line":3192},[1050,13959,13510],{"class":1086},[1050,13961,1104],{"class":1096},[1050,13963,13964],{"class":1100},"busy",[1050,13966,1104],{"class":1096},[1050,13968,1180],{"class":1086},[1050,13970,1226],{"class":1096},[1050,13972,13973],{"class":1100},"Busy",[1050,13975,1104],{"class":1096},[1050,13977,1516],{"class":1086},[1050,13979,13980,13982,13984,13986,13988,13990,13992,13995,13997],{"class":1052,"line":3200},[1050,13981,13510],{"class":1086},[1050,13983,1104],{"class":1096},[1050,13985,6202],{"class":1100},[1050,13987,1104],{"class":1096},[1050,13989,1180],{"class":1086},[1050,13991,1226],{"class":1096},[1050,13993,13994],{"class":1100},"Offline",[1050,13996,1104],{"class":1096},[1050,13998,1516],{"class":1086},[1050,14000,14001],{"class":1052,"line":3223},[1050,14002,13618],{"class":1086},[1050,14004,14005],{"class":1052,"line":3228},[1050,14006,1903],{"class":1698},[1050,14008,14009,14011,14013,14015,14017,14020,14022,14024,14026,14028,14030,14032,14034,14036],{"class":1052,"line":3243},[1050,14010,12997],{"class":1698},[1050,14012,1854],{"class":1086},[1050,14014,12696],{"class":1698},[1050,14016,1710],{"class":1086},[1050,14018,14019],{"class":1814},"OneToOneField",[1050,14021,1818],{"class":1086},[1050,14023,13010],{"class":1814},[1050,14025,1180],{"class":1086},[1050,14027,12967],{"class":3908},[1050,14029,1854],{"class":1086},[1050,14031,12670],{"class":1814},[1050,14033,1710],{"class":1086},[1050,14035,12977],{"class":12976},[1050,14037,1837],{"class":1086},[1050,14039,14040,14043,14045,14047,14049,14051,14053,14055,14057,14059,14061,14063,14065,14068,14070,14072,14074,14076,14078,14080],{"class":1052,"line":3265},[1050,14041,14042],{"class":1698},"    status ",[1050,14044,1854],{"class":1086},[1050,14046,12696],{"class":1698},[1050,14048,1710],{"class":1086},[1050,14050,12701],{"class":1814},[1050,14052,1818],{"class":1086},[1050,14054,12706],{"class":3908},[1050,14056,1854],{"class":1086},[1050,14058,11958],{"class":1334},[1050,14060,1180],{"class":1086},[1050,14062,13727],{"class":3908},[1050,14064,1854],{"class":1086},[1050,14066,14067],{"class":13732},"STATUS_CHOICES",[1050,14069,1180],{"class":1086},[1050,14071,13738],{"class":3908},[1050,14073,1854],{"class":1086},[1050,14075,1104],{"class":1096},[1050,14077,6202],{"class":1100},[1050,14079,1104],{"class":1096},[1050,14081,1837],{"class":1086},[1050,14083,14084,14087,14089,14091,14093,14095,14097,14099,14101,14104,14106,14108],{"class":1052,"line":3282},[1050,14085,14086],{"class":1698},"    last_seen ",[1050,14088,1854],{"class":1086},[1050,14090,12696],{"class":1698},[1050,14092,1710],{"class":1086},[1050,14094,12785],{"class":1814},[1050,14096,1818],{"class":1086},[1050,14098,1262],{"class":3908},[1050,14100,1854],{"class":1086},[1050,14102,14103],{"class":1814},"timezone",[1050,14105,1710],{"class":1086},[1050,14107,6350],{"class":1794},[1050,14109,1837],{"class":1086},[1050,14111,14112,14115,14117,14119,14121,14123,14125,14127,14129,14131,14133,14135,14137,14139],{"class":1052,"line":3319},[1050,14113,14114],{"class":1698},"    custom_message ",[1050,14116,1854],{"class":1086},[1050,14118,12696],{"class":1698},[1050,14120,1710],{"class":1086},[1050,14122,12701],{"class":1814},[1050,14124,1818],{"class":1086},[1050,14126,12706],{"class":3908},[1050,14128,1854],{"class":1086},[1050,14130,12711],{"class":1334},[1050,14132,1180],{"class":1086},[1050,14134,13086],{"class":3908},[1050,14136,1854],{"class":1086},[1050,14138,11831],{"class":3723},[1050,14140,1837],{"class":1086},[1050,14142,14143],{"class":1052,"line":3324},[1050,14144,1903],{"class":1698},[1050,14146,14147,14149,14151,14153,14155],{"class":1052,"line":3345},[1050,14148,5038],{"class":2128},[1050,14150,12887],{"class":2784},[1050,14152,1818],{"class":1086},[1050,14154,2348],{"class":2347},[1050,14156,2313],{"class":1086},[1050,14158,14159,14161,14163,14165,14167,14169,14171,14173,14175,14177,14179,14181,14183,14185,14187,14189,14191],{"class":1052,"line":3355},[1050,14160,9253],{"class":1694},[1050,14162,2424],{"class":2128},[1050,14164,1104],{"class":1100},[1050,14166,2431],{"class":2430},[1050,14168,2348],{"class":1082},[1050,14170,1710],{"class":1086},[1050,14172,2451],{"class":1794},[1050,14174,1710],{"class":1086},[1050,14176,2678],{"class":1794},[1050,14178,2440],{"class":2430},[1050,14180,13253],{"class":1100},[1050,14182,2431],{"class":2430},[1050,14184,2348],{"class":1082},[1050,14186,1710],{"class":1086},[1050,14188,6579],{"class":1794},[1050,14190,2440],{"class":2430},[1050,14192,1232],{"class":1100},[1026,14194,14195],{},"Django Channels transforms Django into a powerful real-time application framework. The key to successful WebSocket implementation is understanding the consumer lifecycle, proper group management, and efficient message broadcasting. Start with simple chat functionality and gradually add advanced features like typing indicators, message reactions, and user presence as your real-time requirements evolve.",[14197,14198,14199],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s27EL, html code.shiki .s27EL{--shiki-light:#91B859;--shiki-default:#AB5E3F;--shiki-dark:#C4704F}html pre.shiki code .sJFLg, html code.shiki .sJFLg{--shiki-light:#E53935;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sRJPX, html code.shiki .sRJPX{--shiki-light:#91B859;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sGuSu, html code.shiki .sGuSu{--shiki-light:#39ADB5;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s6DHA, html code.shiki .s6DHA{--shiki-light:#6182B8;--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":1045,"searchDepth":1053,"depth":1060,"links":14201},[14202,14206,14210,14213],{"id":1032,"depth":1060,"text":1033,"children":14203},[14204,14205],{"id":1037,"depth":1066,"text":1038},{"id":1678,"depth":1066,"text":1679},{"id":2182,"depth":1060,"text":2183,"children":14207},[14208,14209],{"id":2186,"depth":1066,"text":2187},{"id":5405,"depth":1066,"text":5406},{"id":10438,"depth":1060,"text":10439,"children":14211},[14212],{"id":10442,"depth":1066,"text":10443},{"id":12587,"depth":1060,"text":12588,"children":14214},[14215],{"id":12591,"depth":1066,"text":12592},"md",null,{},{"title":721,"description":1028},"_5vfLer0cUPJjH0YFTLfg1j5tgHDjUrS6iZaU4is98Y",[14222,14224],{"title":717,"path":718,"stem":719,"description":14223,"children":-1},"Django's async ORM support has evolved significantly since Django 3.1, but it's still a work in progress. Understanding the current capabilities, limitations, and best practices for async database operations is crucial for building efficient async Django applications. This chapter covers the current state of async ORM, workarounds for limitations, and strategies for optimal database performance in async contexts.",{"title":725,"path":726,"stem":727,"description":14225,"children":-1},"Background task processing is essential for building responsive async Django applications. While async views handle concurrent requests efficiently, long-running operations like file processing, email sending, data analysis, or external API calls should be offloaded to background workers. This chapter covers integrating Celery and RQ with async Django applications, implementing task queues, scheduling, monitoring, and async task patterns.",1772474949903]