[{"data":1,"prerenderedAt":16563},["ShallowReactive",2],{"navigation":3,"/advanced-and-expert-topics/advanced-security-hardening":1016,"/advanced-and-expert-topics/advanced-security-hardening-surround":16558},[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":847,"body":1018,"description":1028,"extension":16553,"links":16554,"meta":16555,"navigation":1206,"path":848,"seo":16556,"stem":849,"__hash__":16557},"docs/22.advanced-and-expert-topics/12.advanced-security-hardening.md",{"type":1019,"value":1020,"toc":16541},"minimark",[1021,1025,1029,1034,1039,4707,4711,7924,7928,7932,12098,12102,12106,16534,16537],[1022,1023,847],"h1",{"id":1024},"advanced-security-hardening",[1026,1027,1028],"p",{},"Advanced security hardening goes beyond Django's built-in security features to implement enterprise-grade security measures. This comprehensive guide covers advanced authentication, authorization patterns, security monitoring, compliance frameworks, and defense-in-depth strategies for production Django applications.",[1030,1031,1033],"h2",{"id":1032},"advanced-authentication-systems","Advanced Authentication Systems",[1035,1036,1038],"h3",{"id":1037},"multi-factor-authentication-mfa","Multi-Factor Authentication (MFA)",[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","# authentication/mfa.py\nimport pyotp\nimport qrcode\nfrom io import BytesIO\nimport base64\nfrom django.contrib.auth.models import User\nfrom django.db import models\nfrom django.utils import timezone\nfrom django.core.cache import cache\nimport secrets\nimport hashlib\n\nclass MFADevice(models.Model):\n    \"\"\"Multi-factor authentication device\"\"\"\n    \n    DEVICE_TYPES = [\n        ('totp', 'Time-based OTP'),\n        ('sms', 'SMS'),\n        ('email', 'Email'),\n        ('backup', 'Backup Codes'),\n    ]\n    \n    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='mfa_devices')\n    name = models.CharField(max_length=100)\n    device_type = models.CharField(max_length=10, choices=DEVICE_TYPES)\n    secret_key = models.CharField(max_length=32, blank=True)\n    phone_number = models.CharField(max_length=20, blank=True)\n    email = models.EmailField(blank=True)\n    backup_codes = models.JSONField(default=list, blank=True)\n    is_active = models.BooleanField(default=True)\n    last_used = models.DateTimeField(null=True, blank=True)\n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    class Meta:\n        unique_together = ['user', 'name']\n    \n    def generate_secret_key(self):\n        \"\"\"Generate secret key for TOTP\"\"\"\n        if self.device_type == 'totp':\n            self.secret_key = pyotp.random_base32()\n            self.save()\n    \n    def get_qr_code(self):\n        \"\"\"Generate QR code for TOTP setup\"\"\"\n        if self.device_type != 'totp' or not self.secret_key:\n            return None\n        \n        totp = pyotp.TOTP(self.secret_key)\n        provisioning_uri = totp.provisioning_uri(\n            name=self.user.email,\n            issuer_name=\"MyApp\"\n        )\n        \n        qr = qrcode.QRCode(version=1, box_size=10, border=5)\n        qr.add_data(provisioning_uri)\n        qr.make(fit=True)\n        \n        img = qr.make_image(fill_color=\"black\", back_color=\"white\")\n        buffer = BytesIO()\n        img.save(buffer, format='PNG')\n        \n        return base64.b64encode(buffer.getvalue()).decode()\n    \n    def verify_token(self, token):\n        \"\"\"Verify MFA token\"\"\"\n        if not self.is_active:\n            return False\n        \n        if self.device_type == 'totp':\n            return self._verify_totp_token(token)\n        elif self.device_type == 'backup':\n            return self._verify_backup_code(token)\n        elif self.device_type in ['sms', 'email']:\n            return self._verify_sent_token(token)\n        \n        return False\n    \n    def _verify_totp_token(self, token):\n        \"\"\"Verify TOTP token\"\"\"\n        totp = pyotp.TOTP(self.secret_key)\n        \n        # Check current and previous window to account for clock drift\n        for window in [0, -1, 1]:\n            if totp.verify(token, valid_window=window):\n                # Prevent token reuse\n                cache_key = f\"mfa_used_token:{self.id}:{token}\"\n                if cache.get(cache_key):\n                    return False\n                \n                cache.set(cache_key, True, 60)  # 60 second window\n                self.last_used = timezone.now()\n                self.save()\n                return True\n        \n        return False\n    \n    def _verify_backup_code(self, code):\n        \"\"\"Verify backup code\"\"\"\n        if code in self.backup_codes:\n            # Remove used backup code\n            self.backup_codes.remove(code)\n            self.last_used = timezone.now()\n            self.save()\n            return True\n        \n        return False\n    \n    def _verify_sent_token(self, token):\n        \"\"\"Verify SMS/Email token\"\"\"\n        cache_key = f\"mfa_sent_token:{self.id}\"\n        stored_token = cache.get(cache_key)\n        \n        if stored_token and stored_token == token:\n            cache.delete(cache_key)\n            self.last_used = timezone.now()\n            self.save()\n            return True\n        \n        return False\n    \n    def generate_backup_codes(self, count=10):\n        \"\"\"Generate backup codes\"\"\"\n        codes = []\n        for _ in range(count):\n            code = secrets.token_hex(4).upper()\n            codes.append(code)\n        \n        self.backup_codes = codes\n        self.save()\n        return codes\n    \n    def send_token(self):\n        \"\"\"Send token via SMS or email\"\"\"\n        if self.device_type not in ['sms', 'email']:\n            return False\n        \n        # Generate 6-digit token\n        token = secrets.randbelow(1000000)\n        token_str = f\"{token:06d}\"\n        \n        # Store token in cache for 5 minutes\n        cache_key = f\"mfa_sent_token:{self.id}\"\n        cache.set(cache_key, token_str, 300)\n        \n        if self.device_type == 'sms':\n            return self._send_sms_token(token_str)\n        elif self.device_type == 'email':\n            return self._send_email_token(token_str)\n        \n        return False\n    \n    def _send_sms_token(self, token):\n        \"\"\"Send SMS token\"\"\"\n        # Implementation would use SMS service\n        from django.core.mail import send_mail\n        # Placeholder - would use actual SMS service\n        return True\n    \n    def _send_email_token(self, token):\n        \"\"\"Send email token\"\"\"\n        from django.core.mail import send_mail\n        \n        send_mail(\n            'Your verification code',\n            f'Your verification code is: {token}',\n            'noreply@myapp.com',\n            [self.email or self.user.email],\n            fail_silently=False,\n        )\n        return True\n\nclass MFABackend:\n    \"\"\"MFA authentication backend\"\"\"\n    \n    def authenticate(self, request, username=None, password=None, mfa_token=None, **kwargs):\n        \"\"\"Authenticate with MFA\"\"\"\n        from django.contrib.auth import authenticate\n        \n        # First authenticate with username/password\n        user = authenticate(request, username=username, password=password)\n        if not user:\n            return None\n        \n        # Check if MFA is required\n        if not self.requires_mfa(user):\n            return user\n        \n        # Check if MFA token provided\n        if not mfa_token:\n            # Store partial authentication\n            cache.set(f\"mfa_pending:{username}\", user.id, 300)\n            return None\n        \n        # Verify MFA token\n        if self.verify_mfa_token(user, mfa_token):\n            # Clear partial authentication\n            cache.delete(f\"mfa_pending:{username}\")\n            return user\n        \n        return None\n    \n    def requires_mfa(self, user):\n        \"\"\"Check if user requires MFA\"\"\"\n        return user.mfa_devices.filter(is_active=True).exists()\n    \n    def verify_mfa_token(self, user, token):\n        \"\"\"Verify MFA token against all user devices\"\"\"\n        for device in user.mfa_devices.filter(is_active=True):\n            if device.verify_token(token):\n                return True\n        return False\n    \n    def get_user(self, user_id):\n        \"\"\"Get user by ID\"\"\"\n        try:\n            return User.objects.get(pk=user_id)\n        except User.DoesNotExist:\n            return None\n\n# MFA middleware\nclass MFAMiddleware:\n    \"\"\"Middleware to enforce MFA\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        self.mfa_backend = MFABackend()\n    \n    def __call__(self, request):\n        # Check if user needs MFA\n        if (request.user.is_authenticated and \n            self.mfa_backend.requires_mfa(request.user) and\n            not self.is_mfa_verified(request)):\n            \n            # Redirect to MFA verification\n            from django.shortcuts import redirect\n            if not request.path.startswith('/mfa/'):\n                return redirect('mfa:verify')\n        \n        response = self.get_response(request)\n        return response\n    \n    def is_mfa_verified(self, request):\n        \"\"\"Check if MFA is verified for this session\"\"\"\n        return request.session.get('mfa_verified', False)\n","python","",[1047,1048,1049,1058,1069,1077,1091,1099,1129,1146,1163,1185,1193,1201,1208,1234,1248,1254,1267,1297,1320,1343,1366,1372,1377,1433,1461,1497,1533,1566,1592,1628,1653,1687,1712,1717,1729,1759,1764,1782,1793,1820,1844,1856,1861,1875,1885,1919,1928,1934,1959,1978,1999,2016,2022,2027,2074,2091,2112,2117,2163,2176,2207,2212,2243,2248,2268,2278,2294,2302,2307,2328,2347,2369,2387,2420,2438,2443,2450,2455,2473,2483,2506,2511,2517,2548,2577,2583,2622,2643,2651,2657,2688,2711,2722,2731,2736,2743,2748,2767,2777,2796,2802,2822,2841,2852,2859,2864,2871,2876,2894,2904,2929,2949,2954,2974,2991,3010,3021,3028,3033,3040,3045,3068,3078,3089,3110,3139,3156,3161,3176,3187,3194,3199,3213,3223,3256,3263,3268,3274,3296,3319,3324,3330,3353,3379,3384,3405,3424,3445,3463,3468,3475,3480,3498,3508,3514,3536,3542,3549,3554,3572,3582,3601,3606,3614,3627,3646,3658,3685,3698,3703,3710,3715,3725,3735,3740,3795,3805,3826,3831,3837,3872,3884,3891,3896,3902,3922,3930,3935,3941,3952,3958,3997,4004,4009,4015,4037,4043,4068,4075,4080,4087,4092,4110,4120,4151,4156,4178,4188,4218,4237,4244,4251,4256,4275,4285,4293,4322,4337,4344,4349,4355,4365,4375,4380,4399,4414,4430,4435,4453,4459,4484,4510,4530,4536,4542,4560,4590,4609,4614,4634,4642,4647,4665,4675],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# authentication/mfa.py\n",[1050,1059,1061,1065],{"class":1052,"line":1060},2,[1050,1062,1064],{"class":1063},"siDh9","import",[1050,1066,1068],{"class":1067},"sftqT"," pyotp\n",[1050,1070,1072,1074],{"class":1052,"line":1071},3,[1050,1073,1064],{"class":1063},[1050,1075,1076],{"class":1067}," qrcode\n",[1050,1078,1080,1083,1086,1088],{"class":1052,"line":1079},4,[1050,1081,1082],{"class":1063},"from",[1050,1084,1085],{"class":1067}," io ",[1050,1087,1064],{"class":1063},[1050,1089,1090],{"class":1067}," BytesIO\n",[1050,1092,1094,1096],{"class":1052,"line":1093},5,[1050,1095,1064],{"class":1063},[1050,1097,1098],{"class":1067}," base64\n",[1050,1100,1102,1104,1107,1111,1114,1116,1119,1121,1124,1126],{"class":1052,"line":1101},6,[1050,1103,1082],{"class":1063},[1050,1105,1106],{"class":1067}," django",[1050,1108,1110],{"class":1109},"soVBu",".",[1050,1112,1113],{"class":1067},"contrib",[1050,1115,1110],{"class":1109},[1050,1117,1118],{"class":1067},"auth",[1050,1120,1110],{"class":1109},[1050,1122,1123],{"class":1067},"models ",[1050,1125,1064],{"class":1063},[1050,1127,1128],{"class":1067}," User\n",[1050,1130,1132,1134,1136,1138,1141,1143],{"class":1052,"line":1131},7,[1050,1133,1082],{"class":1063},[1050,1135,1106],{"class":1067},[1050,1137,1110],{"class":1109},[1050,1139,1140],{"class":1067},"db ",[1050,1142,1064],{"class":1063},[1050,1144,1145],{"class":1067}," models\n",[1050,1147,1149,1151,1153,1155,1158,1160],{"class":1052,"line":1148},8,[1050,1150,1082],{"class":1063},[1050,1152,1106],{"class":1067},[1050,1154,1110],{"class":1109},[1050,1156,1157],{"class":1067},"utils ",[1050,1159,1064],{"class":1063},[1050,1161,1162],{"class":1067}," timezone\n",[1050,1164,1166,1168,1170,1172,1175,1177,1180,1182],{"class":1052,"line":1165},9,[1050,1167,1082],{"class":1063},[1050,1169,1106],{"class":1067},[1050,1171,1110],{"class":1109},[1050,1173,1174],{"class":1067},"core",[1050,1176,1110],{"class":1109},[1050,1178,1179],{"class":1067},"cache ",[1050,1181,1064],{"class":1063},[1050,1183,1184],{"class":1067}," cache\n",[1050,1186,1188,1190],{"class":1052,"line":1187},10,[1050,1189,1064],{"class":1063},[1050,1191,1192],{"class":1067}," secrets\n",[1050,1194,1196,1198],{"class":1052,"line":1195},11,[1050,1197,1064],{"class":1063},[1050,1199,1200],{"class":1067}," hashlib\n",[1050,1202,1204],{"class":1052,"line":1203},12,[1050,1205,1207],{"emptyLinePlaceholder":1206},true,"\n",[1050,1209,1211,1215,1219,1222,1226,1228,1231],{"class":1052,"line":1210},13,[1050,1212,1214],{"class":1213},"s5Kfy","class",[1050,1216,1218],{"class":1217},"sD-vU"," MFADevice",[1050,1220,1221],{"class":1109},"(",[1050,1223,1225],{"class":1224},"sYn-s","models",[1050,1227,1110],{"class":1109},[1050,1229,1230],{"class":1224},"Model",[1050,1232,1233],{"class":1109},"):\n",[1050,1235,1237,1241,1245],{"class":1052,"line":1236},14,[1050,1238,1240],{"class":1239},"sm7ve","    \"\"\"",[1050,1242,1244],{"class":1243},"sVyVU","Multi-factor authentication device",[1050,1246,1247],{"class":1239},"\"\"\"\n",[1050,1249,1251],{"class":1052,"line":1250},15,[1050,1252,1253],{"class":1067},"    \n",[1050,1255,1257,1261,1264],{"class":1052,"line":1256},16,[1050,1258,1260],{"class":1259},"se3Ec","    DEVICE_TYPES",[1050,1262,1263],{"class":1109}," =",[1050,1265,1266],{"class":1109}," [\n",[1050,1268,1270,1273,1277,1281,1283,1286,1289,1292,1294],{"class":1052,"line":1269},17,[1050,1271,1272],{"class":1109},"        (",[1050,1274,1276],{"class":1275},"sbYkP","'",[1050,1278,1280],{"class":1279},"sTbE_","totp",[1050,1282,1276],{"class":1275},[1050,1284,1285],{"class":1109},",",[1050,1287,1288],{"class":1275}," '",[1050,1290,1291],{"class":1279},"Time-based OTP",[1050,1293,1276],{"class":1275},[1050,1295,1296],{"class":1109},"),\n",[1050,1298,1300,1302,1304,1307,1309,1311,1313,1316,1318],{"class":1052,"line":1299},18,[1050,1301,1272],{"class":1109},[1050,1303,1276],{"class":1275},[1050,1305,1306],{"class":1279},"sms",[1050,1308,1276],{"class":1275},[1050,1310,1285],{"class":1109},[1050,1312,1288],{"class":1275},[1050,1314,1315],{"class":1279},"SMS",[1050,1317,1276],{"class":1275},[1050,1319,1296],{"class":1109},[1050,1321,1323,1325,1327,1330,1332,1334,1336,1339,1341],{"class":1052,"line":1322},19,[1050,1324,1272],{"class":1109},[1050,1326,1276],{"class":1275},[1050,1328,1329],{"class":1279},"email",[1050,1331,1276],{"class":1275},[1050,1333,1285],{"class":1109},[1050,1335,1288],{"class":1275},[1050,1337,1338],{"class":1279},"Email",[1050,1340,1276],{"class":1275},[1050,1342,1296],{"class":1109},[1050,1344,1346,1348,1350,1353,1355,1357,1359,1362,1364],{"class":1052,"line":1345},20,[1050,1347,1272],{"class":1109},[1050,1349,1276],{"class":1275},[1050,1351,1352],{"class":1279},"backup",[1050,1354,1276],{"class":1275},[1050,1356,1285],{"class":1109},[1050,1358,1288],{"class":1275},[1050,1360,1361],{"class":1279},"Backup Codes",[1050,1363,1276],{"class":1275},[1050,1365,1296],{"class":1109},[1050,1367,1369],{"class":1052,"line":1368},21,[1050,1370,1371],{"class":1109},"    ]\n",[1050,1373,1375],{"class":1052,"line":1374},22,[1050,1376,1253],{"class":1067},[1050,1378,1380,1383,1386,1389,1391,1395,1397,1400,1402,1406,1408,1410,1412,1416,1418,1421,1423,1425,1428,1430],{"class":1052,"line":1379},23,[1050,1381,1382],{"class":1067},"    user ",[1050,1384,1385],{"class":1109},"=",[1050,1387,1388],{"class":1067}," models",[1050,1390,1110],{"class":1109},[1050,1392,1394],{"class":1393},"siWMO","ForeignKey",[1050,1396,1221],{"class":1109},[1050,1398,1399],{"class":1393},"User",[1050,1401,1285],{"class":1109},[1050,1403,1405],{"class":1404},"sqOPj"," on_delete",[1050,1407,1385],{"class":1109},[1050,1409,1225],{"class":1393},[1050,1411,1110],{"class":1109},[1050,1413,1415],{"class":1414},"sFGJz","CASCADE",[1050,1417,1285],{"class":1109},[1050,1419,1420],{"class":1404}," related_name",[1050,1422,1385],{"class":1109},[1050,1424,1276],{"class":1275},[1050,1426,1427],{"class":1279},"mfa_devices",[1050,1429,1276],{"class":1275},[1050,1431,1432],{"class":1109},")\n",[1050,1434,1436,1439,1441,1443,1445,1448,1450,1453,1455,1459],{"class":1052,"line":1435},24,[1050,1437,1438],{"class":1067},"    name ",[1050,1440,1385],{"class":1109},[1050,1442,1388],{"class":1067},[1050,1444,1110],{"class":1109},[1050,1446,1447],{"class":1393},"CharField",[1050,1449,1221],{"class":1109},[1050,1451,1452],{"class":1404},"max_length",[1050,1454,1385],{"class":1109},[1050,1456,1458],{"class":1457},"s7CZa","100",[1050,1460,1432],{"class":1109},[1050,1462,1464,1467,1469,1471,1473,1475,1477,1479,1481,1484,1486,1489,1491,1495],{"class":1052,"line":1463},25,[1050,1465,1466],{"class":1067},"    device_type ",[1050,1468,1385],{"class":1109},[1050,1470,1388],{"class":1067},[1050,1472,1110],{"class":1109},[1050,1474,1447],{"class":1393},[1050,1476,1221],{"class":1109},[1050,1478,1452],{"class":1404},[1050,1480,1385],{"class":1109},[1050,1482,1483],{"class":1457},"10",[1050,1485,1285],{"class":1109},[1050,1487,1488],{"class":1404}," choices",[1050,1490,1385],{"class":1109},[1050,1492,1494],{"class":1493},"s6DHA","DEVICE_TYPES",[1050,1496,1432],{"class":1109},[1050,1498,1500,1503,1505,1507,1509,1511,1513,1515,1517,1520,1522,1525,1527,1531],{"class":1052,"line":1499},26,[1050,1501,1502],{"class":1067},"    secret_key ",[1050,1504,1385],{"class":1109},[1050,1506,1388],{"class":1067},[1050,1508,1110],{"class":1109},[1050,1510,1447],{"class":1393},[1050,1512,1221],{"class":1109},[1050,1514,1452],{"class":1404},[1050,1516,1385],{"class":1109},[1050,1518,1519],{"class":1457},"32",[1050,1521,1285],{"class":1109},[1050,1523,1524],{"class":1404}," blank",[1050,1526,1385],{"class":1109},[1050,1528,1530],{"class":1529},"s8XtY","True",[1050,1532,1432],{"class":1109},[1050,1534,1536,1539,1541,1543,1545,1547,1549,1551,1553,1556,1558,1560,1562,1564],{"class":1052,"line":1535},27,[1050,1537,1538],{"class":1067},"    phone_number ",[1050,1540,1385],{"class":1109},[1050,1542,1388],{"class":1067},[1050,1544,1110],{"class":1109},[1050,1546,1447],{"class":1393},[1050,1548,1221],{"class":1109},[1050,1550,1452],{"class":1404},[1050,1552,1385],{"class":1109},[1050,1554,1555],{"class":1457},"20",[1050,1557,1285],{"class":1109},[1050,1559,1524],{"class":1404},[1050,1561,1385],{"class":1109},[1050,1563,1530],{"class":1529},[1050,1565,1432],{"class":1109},[1050,1567,1569,1572,1574,1576,1578,1581,1583,1586,1588,1590],{"class":1052,"line":1568},28,[1050,1570,1571],{"class":1067},"    email ",[1050,1573,1385],{"class":1109},[1050,1575,1388],{"class":1067},[1050,1577,1110],{"class":1109},[1050,1579,1580],{"class":1393},"EmailField",[1050,1582,1221],{"class":1109},[1050,1584,1585],{"class":1404},"blank",[1050,1587,1385],{"class":1109},[1050,1589,1530],{"class":1529},[1050,1591,1432],{"class":1109},[1050,1593,1595,1598,1600,1602,1604,1607,1609,1612,1614,1618,1620,1622,1624,1626],{"class":1052,"line":1594},29,[1050,1596,1597],{"class":1067},"    backup_codes ",[1050,1599,1385],{"class":1109},[1050,1601,1388],{"class":1067},[1050,1603,1110],{"class":1109},[1050,1605,1606],{"class":1393},"JSONField",[1050,1608,1221],{"class":1109},[1050,1610,1611],{"class":1404},"default",[1050,1613,1385],{"class":1109},[1050,1615,1617],{"class":1616},"sa2tF","list",[1050,1619,1285],{"class":1109},[1050,1621,1524],{"class":1404},[1050,1623,1385],{"class":1109},[1050,1625,1530],{"class":1529},[1050,1627,1432],{"class":1109},[1050,1629,1631,1634,1636,1638,1640,1643,1645,1647,1649,1651],{"class":1052,"line":1630},30,[1050,1632,1633],{"class":1067},"    is_active ",[1050,1635,1385],{"class":1109},[1050,1637,1388],{"class":1067},[1050,1639,1110],{"class":1109},[1050,1641,1642],{"class":1393},"BooleanField",[1050,1644,1221],{"class":1109},[1050,1646,1611],{"class":1404},[1050,1648,1385],{"class":1109},[1050,1650,1530],{"class":1529},[1050,1652,1432],{"class":1109},[1050,1654,1656,1659,1661,1663,1665,1668,1670,1673,1675,1677,1679,1681,1683,1685],{"class":1052,"line":1655},31,[1050,1657,1658],{"class":1067},"    last_used ",[1050,1660,1385],{"class":1109},[1050,1662,1388],{"class":1067},[1050,1664,1110],{"class":1109},[1050,1666,1667],{"class":1393},"DateTimeField",[1050,1669,1221],{"class":1109},[1050,1671,1672],{"class":1404},"null",[1050,1674,1385],{"class":1109},[1050,1676,1530],{"class":1529},[1050,1678,1285],{"class":1109},[1050,1680,1524],{"class":1404},[1050,1682,1385],{"class":1109},[1050,1684,1530],{"class":1529},[1050,1686,1432],{"class":1109},[1050,1688,1690,1693,1695,1697,1699,1701,1703,1706,1708,1710],{"class":1052,"line":1689},32,[1050,1691,1692],{"class":1067},"    created_at ",[1050,1694,1385],{"class":1109},[1050,1696,1388],{"class":1067},[1050,1698,1110],{"class":1109},[1050,1700,1667],{"class":1393},[1050,1702,1221],{"class":1109},[1050,1704,1705],{"class":1404},"auto_now_add",[1050,1707,1385],{"class":1109},[1050,1709,1530],{"class":1529},[1050,1711,1432],{"class":1109},[1050,1713,1715],{"class":1052,"line":1714},33,[1050,1716,1253],{"class":1067},[1050,1718,1720,1723,1726],{"class":1052,"line":1719},34,[1050,1721,1722],{"class":1213},"    class",[1050,1724,1725],{"class":1217}," Meta",[1050,1727,1728],{"class":1109},":\n",[1050,1730,1732,1735,1737,1740,1742,1745,1747,1749,1751,1754,1756],{"class":1052,"line":1731},35,[1050,1733,1734],{"class":1067},"        unique_together ",[1050,1736,1385],{"class":1109},[1050,1738,1739],{"class":1109}," [",[1050,1741,1276],{"class":1275},[1050,1743,1744],{"class":1279},"user",[1050,1746,1276],{"class":1275},[1050,1748,1285],{"class":1109},[1050,1750,1288],{"class":1275},[1050,1752,1753],{"class":1279},"name",[1050,1755,1276],{"class":1275},[1050,1757,1758],{"class":1109},"]\n",[1050,1760,1762],{"class":1052,"line":1761},36,[1050,1763,1253],{"class":1067},[1050,1765,1767,1770,1774,1776,1780],{"class":1052,"line":1766},37,[1050,1768,1769],{"class":1213},"    def",[1050,1771,1773],{"class":1772},"sljsM"," generate_secret_key",[1050,1775,1221],{"class":1109},[1050,1777,1779],{"class":1778},"sRjD_","self",[1050,1781,1233],{"class":1109},[1050,1783,1785,1788,1791],{"class":1052,"line":1784},38,[1050,1786,1787],{"class":1239},"        \"\"\"",[1050,1789,1790],{"class":1243},"Generate secret key for TOTP",[1050,1792,1247],{"class":1239},[1050,1794,1796,1799,1802,1804,1808,1812,1814,1816,1818],{"class":1052,"line":1795},39,[1050,1797,1798],{"class":1063},"        if",[1050,1800,1801],{"class":1259}," self",[1050,1803,1110],{"class":1109},[1050,1805,1807],{"class":1806},"sBPpx","device_type",[1050,1809,1811],{"class":1810},"sVsLi"," ==",[1050,1813,1288],{"class":1275},[1050,1815,1280],{"class":1279},[1050,1817,1276],{"class":1275},[1050,1819,1728],{"class":1109},[1050,1821,1823,1826,1828,1831,1833,1836,1838,1841],{"class":1052,"line":1822},40,[1050,1824,1825],{"class":1259},"            self",[1050,1827,1110],{"class":1109},[1050,1829,1830],{"class":1806},"secret_key",[1050,1832,1263],{"class":1109},[1050,1834,1835],{"class":1067}," pyotp",[1050,1837,1110],{"class":1109},[1050,1839,1840],{"class":1393},"random_base32",[1050,1842,1843],{"class":1109},"()\n",[1050,1845,1847,1849,1851,1854],{"class":1052,"line":1846},41,[1050,1848,1825],{"class":1259},[1050,1850,1110],{"class":1109},[1050,1852,1853],{"class":1393},"save",[1050,1855,1843],{"class":1109},[1050,1857,1859],{"class":1052,"line":1858},42,[1050,1860,1253],{"class":1067},[1050,1862,1864,1866,1869,1871,1873],{"class":1052,"line":1863},43,[1050,1865,1769],{"class":1213},[1050,1867,1868],{"class":1772}," get_qr_code",[1050,1870,1221],{"class":1109},[1050,1872,1779],{"class":1778},[1050,1874,1233],{"class":1109},[1050,1876,1878,1880,1883],{"class":1052,"line":1877},44,[1050,1879,1787],{"class":1239},[1050,1881,1882],{"class":1243},"Generate QR code for TOTP setup",[1050,1884,1247],{"class":1239},[1050,1886,1888,1890,1892,1894,1896,1899,1901,1903,1905,1908,1911,1913,1915,1917],{"class":1052,"line":1887},45,[1050,1889,1798],{"class":1063},[1050,1891,1801],{"class":1259},[1050,1893,1110],{"class":1109},[1050,1895,1807],{"class":1806},[1050,1897,1898],{"class":1810}," !=",[1050,1900,1288],{"class":1275},[1050,1902,1280],{"class":1279},[1050,1904,1276],{"class":1275},[1050,1906,1907],{"class":1810}," or",[1050,1909,1910],{"class":1810}," not",[1050,1912,1801],{"class":1259},[1050,1914,1110],{"class":1109},[1050,1916,1830],{"class":1806},[1050,1918,1728],{"class":1109},[1050,1920,1922,1925],{"class":1052,"line":1921},46,[1050,1923,1924],{"class":1063},"            return",[1050,1926,1927],{"class":1529}," None\n",[1050,1929,1931],{"class":1052,"line":1930},47,[1050,1932,1933],{"class":1067},"        \n",[1050,1935,1937,1940,1942,1944,1946,1949,1951,1953,1955,1957],{"class":1052,"line":1936},48,[1050,1938,1939],{"class":1067},"        totp ",[1050,1941,1385],{"class":1109},[1050,1943,1835],{"class":1067},[1050,1945,1110],{"class":1109},[1050,1947,1948],{"class":1393},"TOTP",[1050,1950,1221],{"class":1109},[1050,1952,1779],{"class":1259},[1050,1954,1110],{"class":1109},[1050,1956,1830],{"class":1806},[1050,1958,1432],{"class":1109},[1050,1960,1962,1965,1967,1970,1972,1975],{"class":1052,"line":1961},49,[1050,1963,1964],{"class":1067},"        provisioning_uri ",[1050,1966,1385],{"class":1109},[1050,1968,1969],{"class":1067}," totp",[1050,1971,1110],{"class":1109},[1050,1973,1974],{"class":1393},"provisioning_uri",[1050,1976,1977],{"class":1109},"(\n",[1050,1979,1981,1984,1986,1988,1990,1992,1994,1996],{"class":1052,"line":1980},50,[1050,1982,1983],{"class":1404},"            name",[1050,1985,1385],{"class":1109},[1050,1987,1779],{"class":1259},[1050,1989,1110],{"class":1109},[1050,1991,1744],{"class":1806},[1050,1993,1110],{"class":1109},[1050,1995,1329],{"class":1806},[1050,1997,1998],{"class":1109},",\n",[1050,2000,2002,2005,2007,2010,2013],{"class":1052,"line":2001},51,[1050,2003,2004],{"class":1404},"            issuer_name",[1050,2006,1385],{"class":1109},[1050,2008,2009],{"class":1275},"\"",[1050,2011,2012],{"class":1279},"MyApp",[1050,2014,2015],{"class":1275},"\"\n",[1050,2017,2019],{"class":1052,"line":2018},52,[1050,2020,2021],{"class":1109},"        )\n",[1050,2023,2025],{"class":1052,"line":2024},53,[1050,2026,1933],{"class":1067},[1050,2028,2030,2033,2035,2038,2040,2043,2045,2048,2050,2053,2055,2058,2060,2062,2064,2067,2069,2072],{"class":1052,"line":2029},54,[1050,2031,2032],{"class":1067},"        qr ",[1050,2034,1385],{"class":1109},[1050,2036,2037],{"class":1067}," qrcode",[1050,2039,1110],{"class":1109},[1050,2041,2042],{"class":1393},"QRCode",[1050,2044,1221],{"class":1109},[1050,2046,2047],{"class":1404},"version",[1050,2049,1385],{"class":1109},[1050,2051,2052],{"class":1457},"1",[1050,2054,1285],{"class":1109},[1050,2056,2057],{"class":1404}," box_size",[1050,2059,1385],{"class":1109},[1050,2061,1483],{"class":1457},[1050,2063,1285],{"class":1109},[1050,2065,2066],{"class":1404}," border",[1050,2068,1385],{"class":1109},[1050,2070,2071],{"class":1457},"5",[1050,2073,1432],{"class":1109},[1050,2075,2077,2080,2082,2085,2087,2089],{"class":1052,"line":2076},55,[1050,2078,2079],{"class":1067},"        qr",[1050,2081,1110],{"class":1109},[1050,2083,2084],{"class":1393},"add_data",[1050,2086,1221],{"class":1109},[1050,2088,1974],{"class":1393},[1050,2090,1432],{"class":1109},[1050,2092,2094,2096,2098,2101,2103,2106,2108,2110],{"class":1052,"line":2093},56,[1050,2095,2079],{"class":1067},[1050,2097,1110],{"class":1109},[1050,2099,2100],{"class":1393},"make",[1050,2102,1221],{"class":1109},[1050,2104,2105],{"class":1404},"fit",[1050,2107,1385],{"class":1109},[1050,2109,1530],{"class":1529},[1050,2111,1432],{"class":1109},[1050,2113,2115],{"class":1052,"line":2114},57,[1050,2116,1933],{"class":1067},[1050,2118,2120,2123,2125,2128,2130,2133,2135,2138,2140,2142,2145,2147,2149,2152,2154,2156,2159,2161],{"class":1052,"line":2119},58,[1050,2121,2122],{"class":1067},"        img ",[1050,2124,1385],{"class":1109},[1050,2126,2127],{"class":1067}," qr",[1050,2129,1110],{"class":1109},[1050,2131,2132],{"class":1393},"make_image",[1050,2134,1221],{"class":1109},[1050,2136,2137],{"class":1404},"fill_color",[1050,2139,1385],{"class":1109},[1050,2141,2009],{"class":1275},[1050,2143,2144],{"class":1279},"black",[1050,2146,2009],{"class":1275},[1050,2148,1285],{"class":1109},[1050,2150,2151],{"class":1404}," back_color",[1050,2153,1385],{"class":1109},[1050,2155,2009],{"class":1275},[1050,2157,2158],{"class":1279},"white",[1050,2160,2009],{"class":1275},[1050,2162,1432],{"class":1109},[1050,2164,2166,2169,2171,2174],{"class":1052,"line":2165},59,[1050,2167,2168],{"class":1067},"        buffer ",[1050,2170,1385],{"class":1109},[1050,2172,2173],{"class":1393}," BytesIO",[1050,2175,1843],{"class":1109},[1050,2177,2179,2182,2184,2186,2188,2191,2193,2196,2198,2200,2203,2205],{"class":1052,"line":2178},60,[1050,2180,2181],{"class":1067},"        img",[1050,2183,1110],{"class":1109},[1050,2185,1853],{"class":1393},[1050,2187,1221],{"class":1109},[1050,2189,2190],{"class":1393},"buffer",[1050,2192,1285],{"class":1109},[1050,2194,2195],{"class":1404}," format",[1050,2197,1385],{"class":1109},[1050,2199,1276],{"class":1275},[1050,2201,2202],{"class":1279},"PNG",[1050,2204,1276],{"class":1275},[1050,2206,1432],{"class":1109},[1050,2208,2210],{"class":1052,"line":2209},61,[1050,2211,1933],{"class":1067},[1050,2213,2215,2218,2221,2223,2226,2228,2230,2232,2235,2238,2241],{"class":1052,"line":2214},62,[1050,2216,2217],{"class":1063},"        return",[1050,2219,2220],{"class":1067}," base64",[1050,2222,1110],{"class":1109},[1050,2224,2225],{"class":1393},"b64encode",[1050,2227,1221],{"class":1109},[1050,2229,2190],{"class":1393},[1050,2231,1110],{"class":1109},[1050,2233,2234],{"class":1393},"getvalue",[1050,2236,2237],{"class":1109},"()).",[1050,2239,2240],{"class":1393},"decode",[1050,2242,1843],{"class":1109},[1050,2244,2246],{"class":1052,"line":2245},63,[1050,2247,1253],{"class":1067},[1050,2249,2251,2253,2256,2258,2260,2262,2266],{"class":1052,"line":2250},64,[1050,2252,1769],{"class":1213},[1050,2254,2255],{"class":1772}," verify_token",[1050,2257,1221],{"class":1109},[1050,2259,1779],{"class":1778},[1050,2261,1285],{"class":1109},[1050,2263,2265],{"class":2264},"sCyAa"," token",[1050,2267,1233],{"class":1109},[1050,2269,2271,2273,2276],{"class":1052,"line":2270},65,[1050,2272,1787],{"class":1239},[1050,2274,2275],{"class":1243},"Verify MFA token",[1050,2277,1247],{"class":1239},[1050,2279,2281,2283,2285,2287,2289,2292],{"class":1052,"line":2280},66,[1050,2282,1798],{"class":1063},[1050,2284,1910],{"class":1810},[1050,2286,1801],{"class":1259},[1050,2288,1110],{"class":1109},[1050,2290,2291],{"class":1806},"is_active",[1050,2293,1728],{"class":1109},[1050,2295,2297,2299],{"class":1052,"line":2296},67,[1050,2298,1924],{"class":1063},[1050,2300,2301],{"class":1529}," False\n",[1050,2303,2305],{"class":1052,"line":2304},68,[1050,2306,1933],{"class":1067},[1050,2308,2310,2312,2314,2316,2318,2320,2322,2324,2326],{"class":1052,"line":2309},69,[1050,2311,1798],{"class":1063},[1050,2313,1801],{"class":1259},[1050,2315,1110],{"class":1109},[1050,2317,1807],{"class":1806},[1050,2319,1811],{"class":1810},[1050,2321,1288],{"class":1275},[1050,2323,1280],{"class":1279},[1050,2325,1276],{"class":1275},[1050,2327,1728],{"class":1109},[1050,2329,2331,2333,2335,2337,2340,2342,2345],{"class":1052,"line":2330},70,[1050,2332,1924],{"class":1063},[1050,2334,1801],{"class":1259},[1050,2336,1110],{"class":1109},[1050,2338,2339],{"class":1393},"_verify_totp_token",[1050,2341,1221],{"class":1109},[1050,2343,2344],{"class":1393},"token",[1050,2346,1432],{"class":1109},[1050,2348,2350,2353,2355,2357,2359,2361,2363,2365,2367],{"class":1052,"line":2349},71,[1050,2351,2352],{"class":1063},"        elif",[1050,2354,1801],{"class":1259},[1050,2356,1110],{"class":1109},[1050,2358,1807],{"class":1806},[1050,2360,1811],{"class":1810},[1050,2362,1288],{"class":1275},[1050,2364,1352],{"class":1279},[1050,2366,1276],{"class":1275},[1050,2368,1728],{"class":1109},[1050,2370,2372,2374,2376,2378,2381,2383,2385],{"class":1052,"line":2371},72,[1050,2373,1924],{"class":1063},[1050,2375,1801],{"class":1259},[1050,2377,1110],{"class":1109},[1050,2379,2380],{"class":1393},"_verify_backup_code",[1050,2382,1221],{"class":1109},[1050,2384,2344],{"class":1393},[1050,2386,1432],{"class":1109},[1050,2388,2390,2392,2394,2396,2398,2401,2403,2405,2407,2409,2411,2413,2415,2417],{"class":1052,"line":2389},73,[1050,2391,2352],{"class":1063},[1050,2393,1801],{"class":1259},[1050,2395,1110],{"class":1109},[1050,2397,1807],{"class":1806},[1050,2399,2400],{"class":1810}," in",[1050,2402,1739],{"class":1109},[1050,2404,1276],{"class":1275},[1050,2406,1306],{"class":1279},[1050,2408,1276],{"class":1275},[1050,2410,1285],{"class":1109},[1050,2412,1288],{"class":1275},[1050,2414,1329],{"class":1279},[1050,2416,1276],{"class":1275},[1050,2418,2419],{"class":1109},"]:\n",[1050,2421,2423,2425,2427,2429,2432,2434,2436],{"class":1052,"line":2422},74,[1050,2424,1924],{"class":1063},[1050,2426,1801],{"class":1259},[1050,2428,1110],{"class":1109},[1050,2430,2431],{"class":1393},"_verify_sent_token",[1050,2433,1221],{"class":1109},[1050,2435,2344],{"class":1393},[1050,2437,1432],{"class":1109},[1050,2439,2441],{"class":1052,"line":2440},75,[1050,2442,1933],{"class":1067},[1050,2444,2446,2448],{"class":1052,"line":2445},76,[1050,2447,2217],{"class":1063},[1050,2449,2301],{"class":1529},[1050,2451,2453],{"class":1052,"line":2452},77,[1050,2454,1253],{"class":1067},[1050,2456,2458,2460,2463,2465,2467,2469,2471],{"class":1052,"line":2457},78,[1050,2459,1769],{"class":1213},[1050,2461,2462],{"class":1772}," _verify_totp_token",[1050,2464,1221],{"class":1109},[1050,2466,1779],{"class":1778},[1050,2468,1285],{"class":1109},[1050,2470,2265],{"class":2264},[1050,2472,1233],{"class":1109},[1050,2474,2476,2478,2481],{"class":1052,"line":2475},79,[1050,2477,1787],{"class":1239},[1050,2479,2480],{"class":1243},"Verify TOTP token",[1050,2482,1247],{"class":1239},[1050,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502,2504],{"class":1052,"line":2485},80,[1050,2487,1939],{"class":1067},[1050,2489,1385],{"class":1109},[1050,2491,1835],{"class":1067},[1050,2493,1110],{"class":1109},[1050,2495,1948],{"class":1393},[1050,2497,1221],{"class":1109},[1050,2499,1779],{"class":1259},[1050,2501,1110],{"class":1109},[1050,2503,1830],{"class":1806},[1050,2505,1432],{"class":1109},[1050,2507,2509],{"class":1052,"line":2508},81,[1050,2510,1933],{"class":1067},[1050,2512,2514],{"class":1052,"line":2513},82,[1050,2515,2516],{"class":1056},"        # Check current and previous window to account for clock drift\n",[1050,2518,2520,2523,2526,2529,2531,2534,2536,2539,2541,2543,2546],{"class":1052,"line":2519},83,[1050,2521,2522],{"class":1063},"        for",[1050,2524,2525],{"class":1067}," window ",[1050,2527,2528],{"class":1063},"in",[1050,2530,1739],{"class":1109},[1050,2532,2533],{"class":1457},"0",[1050,2535,1285],{"class":1109},[1050,2537,2538],{"class":1810}," -",[1050,2540,2052],{"class":1457},[1050,2542,1285],{"class":1109},[1050,2544,2545],{"class":1457}," 1",[1050,2547,2419],{"class":1109},[1050,2549,2551,2554,2556,2558,2561,2563,2565,2567,2570,2572,2575],{"class":1052,"line":2550},84,[1050,2552,2553],{"class":1063},"            if",[1050,2555,1969],{"class":1067},[1050,2557,1110],{"class":1109},[1050,2559,2560],{"class":1393},"verify",[1050,2562,1221],{"class":1109},[1050,2564,2344],{"class":1393},[1050,2566,1285],{"class":1109},[1050,2568,2569],{"class":1404}," valid_window",[1050,2571,1385],{"class":1109},[1050,2573,2574],{"class":1393},"window",[1050,2576,1233],{"class":1109},[1050,2578,2580],{"class":1052,"line":2579},85,[1050,2581,2582],{"class":1056},"                # Prevent token reuse\n",[1050,2584,2586,2589,2591,2594,2597,2601,2603,2605,2608,2611,2614,2616,2618,2620],{"class":1052,"line":2585},86,[1050,2587,2588],{"class":1067},"                cache_key ",[1050,2590,1385],{"class":1109},[1050,2592,2593],{"class":1213}," f",[1050,2595,2596],{"class":1279},"\"mfa_used_token:",[1050,2598,2600],{"class":2599},"s3h35","{",[1050,2602,1779],{"class":1259},[1050,2604,1110],{"class":1109},[1050,2606,2607],{"class":1806},"id",[1050,2609,2610],{"class":2599},"}",[1050,2612,2613],{"class":1279},":",[1050,2615,2600],{"class":2599},[1050,2617,2344],{"class":1067},[1050,2619,2610],{"class":2599},[1050,2621,2015],{"class":1279},[1050,2623,2625,2628,2631,2633,2636,2638,2641],{"class":1052,"line":2624},87,[1050,2626,2627],{"class":1063},"                if",[1050,2629,2630],{"class":1067}," cache",[1050,2632,1110],{"class":1109},[1050,2634,2635],{"class":1393},"get",[1050,2637,1221],{"class":1109},[1050,2639,2640],{"class":1393},"cache_key",[1050,2642,1233],{"class":1109},[1050,2644,2646,2649],{"class":1052,"line":2645},88,[1050,2647,2648],{"class":1063},"                    return",[1050,2650,2301],{"class":1529},[1050,2652,2654],{"class":1052,"line":2653},89,[1050,2655,2656],{"class":1067},"                \n",[1050,2658,2660,2663,2665,2668,2670,2672,2674,2677,2679,2682,2685],{"class":1052,"line":2659},90,[1050,2661,2662],{"class":1067},"                cache",[1050,2664,1110],{"class":1109},[1050,2666,2667],{"class":1393},"set",[1050,2669,1221],{"class":1109},[1050,2671,2640],{"class":1393},[1050,2673,1285],{"class":1109},[1050,2675,2676],{"class":1529}," True",[1050,2678,1285],{"class":1109},[1050,2680,2681],{"class":1457}," 60",[1050,2683,2684],{"class":1109},")",[1050,2686,2687],{"class":1056},"  # 60 second window\n",[1050,2689,2691,2694,2696,2699,2701,2704,2706,2709],{"class":1052,"line":2690},91,[1050,2692,2693],{"class":1259},"                self",[1050,2695,1110],{"class":1109},[1050,2697,2698],{"class":1806},"last_used",[1050,2700,1263],{"class":1109},[1050,2702,2703],{"class":1067}," timezone",[1050,2705,1110],{"class":1109},[1050,2707,2708],{"class":1393},"now",[1050,2710,1843],{"class":1109},[1050,2712,2714,2716,2718,2720],{"class":1052,"line":2713},92,[1050,2715,2693],{"class":1259},[1050,2717,1110],{"class":1109},[1050,2719,1853],{"class":1393},[1050,2721,1843],{"class":1109},[1050,2723,2725,2728],{"class":1052,"line":2724},93,[1050,2726,2727],{"class":1063},"                return",[1050,2729,2730],{"class":1529}," True\n",[1050,2732,2734],{"class":1052,"line":2733},94,[1050,2735,1933],{"class":1067},[1050,2737,2739,2741],{"class":1052,"line":2738},95,[1050,2740,2217],{"class":1063},[1050,2742,2301],{"class":1529},[1050,2744,2746],{"class":1052,"line":2745},96,[1050,2747,1253],{"class":1067},[1050,2749,2751,2753,2756,2758,2760,2762,2765],{"class":1052,"line":2750},97,[1050,2752,1769],{"class":1213},[1050,2754,2755],{"class":1772}," _verify_backup_code",[1050,2757,1221],{"class":1109},[1050,2759,1779],{"class":1778},[1050,2761,1285],{"class":1109},[1050,2763,2764],{"class":2264}," code",[1050,2766,1233],{"class":1109},[1050,2768,2770,2772,2775],{"class":1052,"line":2769},98,[1050,2771,1787],{"class":1239},[1050,2773,2774],{"class":1243},"Verify backup code",[1050,2776,1247],{"class":1239},[1050,2778,2780,2782,2785,2787,2789,2791,2794],{"class":1052,"line":2779},99,[1050,2781,1798],{"class":1063},[1050,2783,2784],{"class":1067}," code ",[1050,2786,2528],{"class":1810},[1050,2788,1801],{"class":1259},[1050,2790,1110],{"class":1109},[1050,2792,2793],{"class":1806},"backup_codes",[1050,2795,1728],{"class":1109},[1050,2797,2799],{"class":1052,"line":2798},100,[1050,2800,2801],{"class":1056},"            # Remove used backup code\n",[1050,2803,2805,2807,2809,2811,2813,2816,2818,2820],{"class":1052,"line":2804},101,[1050,2806,1825],{"class":1259},[1050,2808,1110],{"class":1109},[1050,2810,2793],{"class":1806},[1050,2812,1110],{"class":1109},[1050,2814,2815],{"class":1393},"remove",[1050,2817,1221],{"class":1109},[1050,2819,1047],{"class":1393},[1050,2821,1432],{"class":1109},[1050,2823,2825,2827,2829,2831,2833,2835,2837,2839],{"class":1052,"line":2824},102,[1050,2826,1825],{"class":1259},[1050,2828,1110],{"class":1109},[1050,2830,2698],{"class":1806},[1050,2832,1263],{"class":1109},[1050,2834,2703],{"class":1067},[1050,2836,1110],{"class":1109},[1050,2838,2708],{"class":1393},[1050,2840,1843],{"class":1109},[1050,2842,2844,2846,2848,2850],{"class":1052,"line":2843},103,[1050,2845,1825],{"class":1259},[1050,2847,1110],{"class":1109},[1050,2849,1853],{"class":1393},[1050,2851,1843],{"class":1109},[1050,2853,2855,2857],{"class":1052,"line":2854},104,[1050,2856,1924],{"class":1063},[1050,2858,2730],{"class":1529},[1050,2860,2862],{"class":1052,"line":2861},105,[1050,2863,1933],{"class":1067},[1050,2865,2867,2869],{"class":1052,"line":2866},106,[1050,2868,2217],{"class":1063},[1050,2870,2301],{"class":1529},[1050,2872,2874],{"class":1052,"line":2873},107,[1050,2875,1253],{"class":1067},[1050,2877,2879,2881,2884,2886,2888,2890,2892],{"class":1052,"line":2878},108,[1050,2880,1769],{"class":1213},[1050,2882,2883],{"class":1772}," _verify_sent_token",[1050,2885,1221],{"class":1109},[1050,2887,1779],{"class":1778},[1050,2889,1285],{"class":1109},[1050,2891,2265],{"class":2264},[1050,2893,1233],{"class":1109},[1050,2895,2897,2899,2902],{"class":1052,"line":2896},109,[1050,2898,1787],{"class":1239},[1050,2900,2901],{"class":1243},"Verify SMS/Email token",[1050,2903,1247],{"class":1239},[1050,2905,2907,2910,2912,2914,2917,2919,2921,2923,2925,2927],{"class":1052,"line":2906},110,[1050,2908,2909],{"class":1067},"        cache_key ",[1050,2911,1385],{"class":1109},[1050,2913,2593],{"class":1213},[1050,2915,2916],{"class":1279},"\"mfa_sent_token:",[1050,2918,2600],{"class":2599},[1050,2920,1779],{"class":1259},[1050,2922,1110],{"class":1109},[1050,2924,2607],{"class":1806},[1050,2926,2610],{"class":2599},[1050,2928,2015],{"class":1279},[1050,2930,2932,2935,2937,2939,2941,2943,2945,2947],{"class":1052,"line":2931},111,[1050,2933,2934],{"class":1067},"        stored_token ",[1050,2936,1385],{"class":1109},[1050,2938,2630],{"class":1067},[1050,2940,1110],{"class":1109},[1050,2942,2635],{"class":1393},[1050,2944,1221],{"class":1109},[1050,2946,2640],{"class":1393},[1050,2948,1432],{"class":1109},[1050,2950,2952],{"class":1052,"line":2951},112,[1050,2953,1933],{"class":1067},[1050,2955,2957,2959,2962,2965,2967,2970,2972],{"class":1052,"line":2956},113,[1050,2958,1798],{"class":1063},[1050,2960,2961],{"class":1067}," stored_token ",[1050,2963,2964],{"class":1810},"and",[1050,2966,2961],{"class":1067},[1050,2968,2969],{"class":1810},"==",[1050,2971,2265],{"class":1067},[1050,2973,1728],{"class":1109},[1050,2975,2977,2980,2982,2985,2987,2989],{"class":1052,"line":2976},114,[1050,2978,2979],{"class":1067},"            cache",[1050,2981,1110],{"class":1109},[1050,2983,2984],{"class":1393},"delete",[1050,2986,1221],{"class":1109},[1050,2988,2640],{"class":1393},[1050,2990,1432],{"class":1109},[1050,2992,2994,2996,2998,3000,3002,3004,3006,3008],{"class":1052,"line":2993},115,[1050,2995,1825],{"class":1259},[1050,2997,1110],{"class":1109},[1050,2999,2698],{"class":1806},[1050,3001,1263],{"class":1109},[1050,3003,2703],{"class":1067},[1050,3005,1110],{"class":1109},[1050,3007,2708],{"class":1393},[1050,3009,1843],{"class":1109},[1050,3011,3013,3015,3017,3019],{"class":1052,"line":3012},116,[1050,3014,1825],{"class":1259},[1050,3016,1110],{"class":1109},[1050,3018,1853],{"class":1393},[1050,3020,1843],{"class":1109},[1050,3022,3024,3026],{"class":1052,"line":3023},117,[1050,3025,1924],{"class":1063},[1050,3027,2730],{"class":1529},[1050,3029,3031],{"class":1052,"line":3030},118,[1050,3032,1933],{"class":1067},[1050,3034,3036,3038],{"class":1052,"line":3035},119,[1050,3037,2217],{"class":1063},[1050,3039,2301],{"class":1529},[1050,3041,3043],{"class":1052,"line":3042},120,[1050,3044,1253],{"class":1067},[1050,3046,3048,3050,3053,3055,3057,3059,3062,3064,3066],{"class":1052,"line":3047},121,[1050,3049,1769],{"class":1213},[1050,3051,3052],{"class":1772}," generate_backup_codes",[1050,3054,1221],{"class":1109},[1050,3056,1779],{"class":1778},[1050,3058,1285],{"class":1109},[1050,3060,3061],{"class":2264}," count",[1050,3063,1385],{"class":1810},[1050,3065,1483],{"class":1457},[1050,3067,1233],{"class":1109},[1050,3069,3071,3073,3076],{"class":1052,"line":3070},122,[1050,3072,1787],{"class":1239},[1050,3074,3075],{"class":1243},"Generate backup codes",[1050,3077,1247],{"class":1239},[1050,3079,3081,3084,3086],{"class":1052,"line":3080},123,[1050,3082,3083],{"class":1067},"        codes ",[1050,3085,1385],{"class":1109},[1050,3087,3088],{"class":1109}," []\n",[1050,3090,3092,3094,3097,3099,3103,3105,3108],{"class":1052,"line":3091},124,[1050,3093,2522],{"class":1063},[1050,3095,3096],{"class":1067}," _ ",[1050,3098,2528],{"class":1063},[1050,3100,3102],{"class":3101},"sJdAF"," range",[1050,3104,1221],{"class":1109},[1050,3106,3107],{"class":1393},"count",[1050,3109,1233],{"class":1109},[1050,3111,3113,3116,3118,3121,3123,3126,3128,3131,3134,3137],{"class":1052,"line":3112},125,[1050,3114,3115],{"class":1067},"            code ",[1050,3117,1385],{"class":1109},[1050,3119,3120],{"class":1067}," secrets",[1050,3122,1110],{"class":1109},[1050,3124,3125],{"class":1393},"token_hex",[1050,3127,1221],{"class":1109},[1050,3129,3130],{"class":1457},"4",[1050,3132,3133],{"class":1109},").",[1050,3135,3136],{"class":1393},"upper",[1050,3138,1843],{"class":1109},[1050,3140,3142,3145,3147,3150,3152,3154],{"class":1052,"line":3141},126,[1050,3143,3144],{"class":1067},"            codes",[1050,3146,1110],{"class":1109},[1050,3148,3149],{"class":1393},"append",[1050,3151,1221],{"class":1109},[1050,3153,1047],{"class":1393},[1050,3155,1432],{"class":1109},[1050,3157,3159],{"class":1052,"line":3158},127,[1050,3160,1933],{"class":1067},[1050,3162,3164,3167,3169,3171,3173],{"class":1052,"line":3163},128,[1050,3165,3166],{"class":1259},"        self",[1050,3168,1110],{"class":1109},[1050,3170,2793],{"class":1806},[1050,3172,1263],{"class":1109},[1050,3174,3175],{"class":1067}," codes\n",[1050,3177,3179,3181,3183,3185],{"class":1052,"line":3178},129,[1050,3180,3166],{"class":1259},[1050,3182,1110],{"class":1109},[1050,3184,1853],{"class":1393},[1050,3186,1843],{"class":1109},[1050,3188,3190,3192],{"class":1052,"line":3189},130,[1050,3191,2217],{"class":1063},[1050,3193,3175],{"class":1067},[1050,3195,3197],{"class":1052,"line":3196},131,[1050,3198,1253],{"class":1067},[1050,3200,3202,3204,3207,3209,3211],{"class":1052,"line":3201},132,[1050,3203,1769],{"class":1213},[1050,3205,3206],{"class":1772}," send_token",[1050,3208,1221],{"class":1109},[1050,3210,1779],{"class":1778},[1050,3212,1233],{"class":1109},[1050,3214,3216,3218,3221],{"class":1052,"line":3215},133,[1050,3217,1787],{"class":1239},[1050,3219,3220],{"class":1243},"Send token via SMS or email",[1050,3222,1247],{"class":1239},[1050,3224,3226,3228,3230,3232,3234,3236,3238,3240,3242,3244,3246,3248,3250,3252,3254],{"class":1052,"line":3225},134,[1050,3227,1798],{"class":1063},[1050,3229,1801],{"class":1259},[1050,3231,1110],{"class":1109},[1050,3233,1807],{"class":1806},[1050,3235,1910],{"class":1810},[1050,3237,2400],{"class":1810},[1050,3239,1739],{"class":1109},[1050,3241,1276],{"class":1275},[1050,3243,1306],{"class":1279},[1050,3245,1276],{"class":1275},[1050,3247,1285],{"class":1109},[1050,3249,1288],{"class":1275},[1050,3251,1329],{"class":1279},[1050,3253,1276],{"class":1275},[1050,3255,2419],{"class":1109},[1050,3257,3259,3261],{"class":1052,"line":3258},135,[1050,3260,1924],{"class":1063},[1050,3262,2301],{"class":1529},[1050,3264,3266],{"class":1052,"line":3265},136,[1050,3267,1933],{"class":1067},[1050,3269,3271],{"class":1052,"line":3270},137,[1050,3272,3273],{"class":1056},"        # Generate 6-digit token\n",[1050,3275,3277,3280,3282,3284,3286,3289,3291,3294],{"class":1052,"line":3276},138,[1050,3278,3279],{"class":1067},"        token ",[1050,3281,1385],{"class":1109},[1050,3283,3120],{"class":1067},[1050,3285,1110],{"class":1109},[1050,3287,3288],{"class":1393},"randbelow",[1050,3290,1221],{"class":1109},[1050,3292,3293],{"class":1457},"1000000",[1050,3295,1432],{"class":1109},[1050,3297,3299,3302,3304,3306,3308,3310,3312,3315,3317],{"class":1052,"line":3298},139,[1050,3300,3301],{"class":1067},"        token_str ",[1050,3303,1385],{"class":1109},[1050,3305,2593],{"class":1213},[1050,3307,2009],{"class":1279},[1050,3309,2600],{"class":2599},[1050,3311,2344],{"class":1067},[1050,3313,3314],{"class":1213},":06d",[1050,3316,2610],{"class":2599},[1050,3318,2015],{"class":1279},[1050,3320,3322],{"class":1052,"line":3321},140,[1050,3323,1933],{"class":1067},[1050,3325,3327],{"class":1052,"line":3326},141,[1050,3328,3329],{"class":1056},"        # Store token in cache for 5 minutes\n",[1050,3331,3333,3335,3337,3339,3341,3343,3345,3347,3349,3351],{"class":1052,"line":3332},142,[1050,3334,2909],{"class":1067},[1050,3336,1385],{"class":1109},[1050,3338,2593],{"class":1213},[1050,3340,2916],{"class":1279},[1050,3342,2600],{"class":2599},[1050,3344,1779],{"class":1259},[1050,3346,1110],{"class":1109},[1050,3348,2607],{"class":1806},[1050,3350,2610],{"class":2599},[1050,3352,2015],{"class":1279},[1050,3354,3356,3359,3361,3363,3365,3367,3369,3372,3374,3377],{"class":1052,"line":3355},143,[1050,3357,3358],{"class":1067},"        cache",[1050,3360,1110],{"class":1109},[1050,3362,2667],{"class":1393},[1050,3364,1221],{"class":1109},[1050,3366,2640],{"class":1393},[1050,3368,1285],{"class":1109},[1050,3370,3371],{"class":1393}," token_str",[1050,3373,1285],{"class":1109},[1050,3375,3376],{"class":1457}," 300",[1050,3378,1432],{"class":1109},[1050,3380,3382],{"class":1052,"line":3381},144,[1050,3383,1933],{"class":1067},[1050,3385,3387,3389,3391,3393,3395,3397,3399,3401,3403],{"class":1052,"line":3386},145,[1050,3388,1798],{"class":1063},[1050,3390,1801],{"class":1259},[1050,3392,1110],{"class":1109},[1050,3394,1807],{"class":1806},[1050,3396,1811],{"class":1810},[1050,3398,1288],{"class":1275},[1050,3400,1306],{"class":1279},[1050,3402,1276],{"class":1275},[1050,3404,1728],{"class":1109},[1050,3406,3408,3410,3412,3414,3417,3419,3422],{"class":1052,"line":3407},146,[1050,3409,1924],{"class":1063},[1050,3411,1801],{"class":1259},[1050,3413,1110],{"class":1109},[1050,3415,3416],{"class":1393},"_send_sms_token",[1050,3418,1221],{"class":1109},[1050,3420,3421],{"class":1393},"token_str",[1050,3423,1432],{"class":1109},[1050,3425,3427,3429,3431,3433,3435,3437,3439,3441,3443],{"class":1052,"line":3426},147,[1050,3428,2352],{"class":1063},[1050,3430,1801],{"class":1259},[1050,3432,1110],{"class":1109},[1050,3434,1807],{"class":1806},[1050,3436,1811],{"class":1810},[1050,3438,1288],{"class":1275},[1050,3440,1329],{"class":1279},[1050,3442,1276],{"class":1275},[1050,3444,1728],{"class":1109},[1050,3446,3448,3450,3452,3454,3457,3459,3461],{"class":1052,"line":3447},148,[1050,3449,1924],{"class":1063},[1050,3451,1801],{"class":1259},[1050,3453,1110],{"class":1109},[1050,3455,3456],{"class":1393},"_send_email_token",[1050,3458,1221],{"class":1109},[1050,3460,3421],{"class":1393},[1050,3462,1432],{"class":1109},[1050,3464,3466],{"class":1052,"line":3465},149,[1050,3467,1933],{"class":1067},[1050,3469,3471,3473],{"class":1052,"line":3470},150,[1050,3472,2217],{"class":1063},[1050,3474,2301],{"class":1529},[1050,3476,3478],{"class":1052,"line":3477},151,[1050,3479,1253],{"class":1067},[1050,3481,3483,3485,3488,3490,3492,3494,3496],{"class":1052,"line":3482},152,[1050,3484,1769],{"class":1213},[1050,3486,3487],{"class":1772}," _send_sms_token",[1050,3489,1221],{"class":1109},[1050,3491,1779],{"class":1778},[1050,3493,1285],{"class":1109},[1050,3495,2265],{"class":2264},[1050,3497,1233],{"class":1109},[1050,3499,3501,3503,3506],{"class":1052,"line":3500},153,[1050,3502,1787],{"class":1239},[1050,3504,3505],{"class":1243},"Send SMS token",[1050,3507,1247],{"class":1239},[1050,3509,3511],{"class":1052,"line":3510},154,[1050,3512,3513],{"class":1056},"        # Implementation would use SMS service\n",[1050,3515,3517,3520,3522,3524,3526,3528,3531,3533],{"class":1052,"line":3516},155,[1050,3518,3519],{"class":1063},"        from",[1050,3521,1106],{"class":1067},[1050,3523,1110],{"class":1109},[1050,3525,1174],{"class":1067},[1050,3527,1110],{"class":1109},[1050,3529,3530],{"class":1067},"mail ",[1050,3532,1064],{"class":1063},[1050,3534,3535],{"class":1067}," send_mail\n",[1050,3537,3539],{"class":1052,"line":3538},156,[1050,3540,3541],{"class":1056},"        # Placeholder - would use actual SMS service\n",[1050,3543,3545,3547],{"class":1052,"line":3544},157,[1050,3546,2217],{"class":1063},[1050,3548,2730],{"class":1529},[1050,3550,3552],{"class":1052,"line":3551},158,[1050,3553,1253],{"class":1067},[1050,3555,3557,3559,3562,3564,3566,3568,3570],{"class":1052,"line":3556},159,[1050,3558,1769],{"class":1213},[1050,3560,3561],{"class":1772}," _send_email_token",[1050,3563,1221],{"class":1109},[1050,3565,1779],{"class":1778},[1050,3567,1285],{"class":1109},[1050,3569,2265],{"class":2264},[1050,3571,1233],{"class":1109},[1050,3573,3575,3577,3580],{"class":1052,"line":3574},160,[1050,3576,1787],{"class":1239},[1050,3578,3579],{"class":1243},"Send email token",[1050,3581,1247],{"class":1239},[1050,3583,3585,3587,3589,3591,3593,3595,3597,3599],{"class":1052,"line":3584},161,[1050,3586,3519],{"class":1063},[1050,3588,1106],{"class":1067},[1050,3590,1110],{"class":1109},[1050,3592,1174],{"class":1067},[1050,3594,1110],{"class":1109},[1050,3596,3530],{"class":1067},[1050,3598,1064],{"class":1063},[1050,3600,3535],{"class":1067},[1050,3602,3604],{"class":1052,"line":3603},162,[1050,3605,1933],{"class":1067},[1050,3607,3609,3612],{"class":1052,"line":3608},163,[1050,3610,3611],{"class":1393},"        send_mail",[1050,3613,1977],{"class":1109},[1050,3615,3617,3620,3623,3625],{"class":1052,"line":3616},164,[1050,3618,3619],{"class":1275},"            '",[1050,3621,3622],{"class":1279},"Your verification code",[1050,3624,1276],{"class":1275},[1050,3626,1998],{"class":1109},[1050,3628,3630,3633,3636,3638,3640,3642,3644],{"class":1052,"line":3629},165,[1050,3631,3632],{"class":1213},"            f",[1050,3634,3635],{"class":1279},"'Your verification code is: ",[1050,3637,2600],{"class":2599},[1050,3639,2344],{"class":1393},[1050,3641,2610],{"class":2599},[1050,3643,1276],{"class":1279},[1050,3645,1998],{"class":1109},[1050,3647,3649,3651,3654,3656],{"class":1052,"line":3648},166,[1050,3650,3619],{"class":1275},[1050,3652,3653],{"class":1279},"noreply@myapp.com",[1050,3655,1276],{"class":1275},[1050,3657,1998],{"class":1109},[1050,3659,3661,3664,3666,3668,3670,3672,3674,3676,3678,3680,3682],{"class":1052,"line":3660},167,[1050,3662,3663],{"class":1109},"            [",[1050,3665,1779],{"class":1259},[1050,3667,1110],{"class":1109},[1050,3669,1329],{"class":1806},[1050,3671,1907],{"class":1810},[1050,3673,1801],{"class":1259},[1050,3675,1110],{"class":1109},[1050,3677,1744],{"class":1806},[1050,3679,1110],{"class":1109},[1050,3681,1329],{"class":1806},[1050,3683,3684],{"class":1109},"],\n",[1050,3686,3688,3691,3693,3696],{"class":1052,"line":3687},168,[1050,3689,3690],{"class":1404},"            fail_silently",[1050,3692,1385],{"class":1109},[1050,3694,3695],{"class":1529},"False",[1050,3697,1998],{"class":1109},[1050,3699,3701],{"class":1052,"line":3700},169,[1050,3702,2021],{"class":1109},[1050,3704,3706,3708],{"class":1052,"line":3705},170,[1050,3707,2217],{"class":1063},[1050,3709,2730],{"class":1529},[1050,3711,3713],{"class":1052,"line":3712},171,[1050,3714,1207],{"emptyLinePlaceholder":1206},[1050,3716,3718,3720,3723],{"class":1052,"line":3717},172,[1050,3719,1214],{"class":1213},[1050,3721,3722],{"class":1217}," MFABackend",[1050,3724,1728],{"class":1109},[1050,3726,3728,3730,3733],{"class":1052,"line":3727},173,[1050,3729,1240],{"class":1239},[1050,3731,3732],{"class":1243},"MFA authentication backend",[1050,3734,1247],{"class":1239},[1050,3736,3738],{"class":1052,"line":3737},174,[1050,3739,1253],{"class":1067},[1050,3741,3743,3745,3748,3750,3752,3754,3757,3759,3762,3764,3767,3769,3772,3774,3776,3778,3781,3783,3785,3787,3790,3793],{"class":1052,"line":3742},175,[1050,3744,1769],{"class":1213},[1050,3746,3747],{"class":1772}," authenticate",[1050,3749,1221],{"class":1109},[1050,3751,1779],{"class":1778},[1050,3753,1285],{"class":1109},[1050,3755,3756],{"class":2264}," request",[1050,3758,1285],{"class":1109},[1050,3760,3761],{"class":2264}," username",[1050,3763,1385],{"class":1810},[1050,3765,3766],{"class":1529},"None",[1050,3768,1285],{"class":1109},[1050,3770,3771],{"class":2264}," password",[1050,3773,1385],{"class":1810},[1050,3775,3766],{"class":1529},[1050,3777,1285],{"class":1109},[1050,3779,3780],{"class":2264}," mfa_token",[1050,3782,1385],{"class":1810},[1050,3784,3766],{"class":1529},[1050,3786,1285],{"class":1109},[1050,3788,3789],{"class":1810}," **",[1050,3791,3792],{"class":2264},"kwargs",[1050,3794,1233],{"class":1109},[1050,3796,3798,3800,3803],{"class":1052,"line":3797},176,[1050,3799,1787],{"class":1239},[1050,3801,3802],{"class":1243},"Authenticate with MFA",[1050,3804,1247],{"class":1239},[1050,3806,3808,3810,3812,3814,3816,3818,3821,3823],{"class":1052,"line":3807},177,[1050,3809,3519],{"class":1063},[1050,3811,1106],{"class":1067},[1050,3813,1110],{"class":1109},[1050,3815,1113],{"class":1067},[1050,3817,1110],{"class":1109},[1050,3819,3820],{"class":1067},"auth ",[1050,3822,1064],{"class":1063},[1050,3824,3825],{"class":1067}," authenticate\n",[1050,3827,3829],{"class":1052,"line":3828},178,[1050,3830,1933],{"class":1067},[1050,3832,3834],{"class":1052,"line":3833},179,[1050,3835,3836],{"class":1056},"        # First authenticate with username/password\n",[1050,3838,3840,3843,3845,3847,3849,3852,3854,3856,3858,3861,3863,3865,3867,3870],{"class":1052,"line":3839},180,[1050,3841,3842],{"class":1067},"        user ",[1050,3844,1385],{"class":1109},[1050,3846,3747],{"class":1393},[1050,3848,1221],{"class":1109},[1050,3850,3851],{"class":1393},"request",[1050,3853,1285],{"class":1109},[1050,3855,3761],{"class":1404},[1050,3857,1385],{"class":1109},[1050,3859,3860],{"class":1393},"username",[1050,3862,1285],{"class":1109},[1050,3864,3771],{"class":1404},[1050,3866,1385],{"class":1109},[1050,3868,3869],{"class":1393},"password",[1050,3871,1432],{"class":1109},[1050,3873,3875,3877,3879,3882],{"class":1052,"line":3874},181,[1050,3876,1798],{"class":1063},[1050,3878,1910],{"class":1810},[1050,3880,3881],{"class":1067}," user",[1050,3883,1728],{"class":1109},[1050,3885,3887,3889],{"class":1052,"line":3886},182,[1050,3888,1924],{"class":1063},[1050,3890,1927],{"class":1529},[1050,3892,3894],{"class":1052,"line":3893},183,[1050,3895,1933],{"class":1067},[1050,3897,3899],{"class":1052,"line":3898},184,[1050,3900,3901],{"class":1056},"        # Check if MFA is required\n",[1050,3903,3905,3907,3909,3911,3913,3916,3918,3920],{"class":1052,"line":3904},185,[1050,3906,1798],{"class":1063},[1050,3908,1910],{"class":1810},[1050,3910,1801],{"class":1259},[1050,3912,1110],{"class":1109},[1050,3914,3915],{"class":1393},"requires_mfa",[1050,3917,1221],{"class":1109},[1050,3919,1744],{"class":1393},[1050,3921,1233],{"class":1109},[1050,3923,3925,3927],{"class":1052,"line":3924},186,[1050,3926,1924],{"class":1063},[1050,3928,3929],{"class":1067}," user\n",[1050,3931,3933],{"class":1052,"line":3932},187,[1050,3934,1933],{"class":1067},[1050,3936,3938],{"class":1052,"line":3937},188,[1050,3939,3940],{"class":1056},"        # Check if MFA token provided\n",[1050,3942,3944,3946,3948,3950],{"class":1052,"line":3943},189,[1050,3945,1798],{"class":1063},[1050,3947,1910],{"class":1810},[1050,3949,3780],{"class":1067},[1050,3951,1728],{"class":1109},[1050,3953,3955],{"class":1052,"line":3954},190,[1050,3956,3957],{"class":1056},"            # Store partial authentication\n",[1050,3959,3961,3963,3965,3967,3969,3972,3975,3977,3979,3981,3983,3985,3987,3989,3991,3993,3995],{"class":1052,"line":3960},191,[1050,3962,2979],{"class":1067},[1050,3964,1110],{"class":1109},[1050,3966,2667],{"class":1393},[1050,3968,1221],{"class":1109},[1050,3970,3971],{"class":1213},"f",[1050,3973,3974],{"class":1279},"\"mfa_pending:",[1050,3976,2600],{"class":2599},[1050,3978,3860],{"class":1393},[1050,3980,2610],{"class":2599},[1050,3982,2009],{"class":1279},[1050,3984,1285],{"class":1109},[1050,3986,3881],{"class":1393},[1050,3988,1110],{"class":1109},[1050,3990,2607],{"class":1806},[1050,3992,1285],{"class":1109},[1050,3994,3376],{"class":1457},[1050,3996,1432],{"class":1109},[1050,3998,4000,4002],{"class":1052,"line":3999},192,[1050,4001,1924],{"class":1063},[1050,4003,1927],{"class":1529},[1050,4005,4007],{"class":1052,"line":4006},193,[1050,4008,1933],{"class":1067},[1050,4010,4012],{"class":1052,"line":4011},194,[1050,4013,4014],{"class":1056},"        # Verify MFA token\n",[1050,4016,4018,4020,4022,4024,4027,4029,4031,4033,4035],{"class":1052,"line":4017},195,[1050,4019,1798],{"class":1063},[1050,4021,1801],{"class":1259},[1050,4023,1110],{"class":1109},[1050,4025,4026],{"class":1393},"verify_mfa_token",[1050,4028,1221],{"class":1109},[1050,4030,1744],{"class":1393},[1050,4032,1285],{"class":1109},[1050,4034,3780],{"class":1393},[1050,4036,1233],{"class":1109},[1050,4038,4040],{"class":1052,"line":4039},196,[1050,4041,4042],{"class":1056},"            # Clear partial authentication\n",[1050,4044,4046,4048,4050,4052,4054,4056,4058,4060,4062,4064,4066],{"class":1052,"line":4045},197,[1050,4047,2979],{"class":1067},[1050,4049,1110],{"class":1109},[1050,4051,2984],{"class":1393},[1050,4053,1221],{"class":1109},[1050,4055,3971],{"class":1213},[1050,4057,3974],{"class":1279},[1050,4059,2600],{"class":2599},[1050,4061,3860],{"class":1393},[1050,4063,2610],{"class":2599},[1050,4065,2009],{"class":1279},[1050,4067,1432],{"class":1109},[1050,4069,4071,4073],{"class":1052,"line":4070},198,[1050,4072,1924],{"class":1063},[1050,4074,3929],{"class":1067},[1050,4076,4078],{"class":1052,"line":4077},199,[1050,4079,1933],{"class":1067},[1050,4081,4083,4085],{"class":1052,"line":4082},200,[1050,4084,2217],{"class":1063},[1050,4086,1927],{"class":1529},[1050,4088,4090],{"class":1052,"line":4089},201,[1050,4091,1253],{"class":1067},[1050,4093,4095,4097,4100,4102,4104,4106,4108],{"class":1052,"line":4094},202,[1050,4096,1769],{"class":1213},[1050,4098,4099],{"class":1772}," requires_mfa",[1050,4101,1221],{"class":1109},[1050,4103,1779],{"class":1778},[1050,4105,1285],{"class":1109},[1050,4107,3881],{"class":2264},[1050,4109,1233],{"class":1109},[1050,4111,4113,4115,4118],{"class":1052,"line":4112},203,[1050,4114,1787],{"class":1239},[1050,4116,4117],{"class":1243},"Check if user requires MFA",[1050,4119,1247],{"class":1239},[1050,4121,4123,4125,4127,4129,4131,4133,4136,4138,4140,4142,4144,4146,4149],{"class":1052,"line":4122},204,[1050,4124,2217],{"class":1063},[1050,4126,3881],{"class":1067},[1050,4128,1110],{"class":1109},[1050,4130,1427],{"class":1806},[1050,4132,1110],{"class":1109},[1050,4134,4135],{"class":1393},"filter",[1050,4137,1221],{"class":1109},[1050,4139,2291],{"class":1404},[1050,4141,1385],{"class":1109},[1050,4143,1530],{"class":1529},[1050,4145,3133],{"class":1109},[1050,4147,4148],{"class":1393},"exists",[1050,4150,1843],{"class":1109},[1050,4152,4154],{"class":1052,"line":4153},205,[1050,4155,1253],{"class":1067},[1050,4157,4159,4161,4164,4166,4168,4170,4172,4174,4176],{"class":1052,"line":4158},206,[1050,4160,1769],{"class":1213},[1050,4162,4163],{"class":1772}," verify_mfa_token",[1050,4165,1221],{"class":1109},[1050,4167,1779],{"class":1778},[1050,4169,1285],{"class":1109},[1050,4171,3881],{"class":2264},[1050,4173,1285],{"class":1109},[1050,4175,2265],{"class":2264},[1050,4177,1233],{"class":1109},[1050,4179,4181,4183,4186],{"class":1052,"line":4180},207,[1050,4182,1787],{"class":1239},[1050,4184,4185],{"class":1243},"Verify MFA token against all user devices",[1050,4187,1247],{"class":1239},[1050,4189,4191,4193,4196,4198,4200,4202,4204,4206,4208,4210,4212,4214,4216],{"class":1052,"line":4190},208,[1050,4192,2522],{"class":1063},[1050,4194,4195],{"class":1067}," device ",[1050,4197,2528],{"class":1063},[1050,4199,3881],{"class":1067},[1050,4201,1110],{"class":1109},[1050,4203,1427],{"class":1806},[1050,4205,1110],{"class":1109},[1050,4207,4135],{"class":1393},[1050,4209,1221],{"class":1109},[1050,4211,2291],{"class":1404},[1050,4213,1385],{"class":1109},[1050,4215,1530],{"class":1529},[1050,4217,1233],{"class":1109},[1050,4219,4221,4223,4226,4228,4231,4233,4235],{"class":1052,"line":4220},209,[1050,4222,2553],{"class":1063},[1050,4224,4225],{"class":1067}," device",[1050,4227,1110],{"class":1109},[1050,4229,4230],{"class":1393},"verify_token",[1050,4232,1221],{"class":1109},[1050,4234,2344],{"class":1393},[1050,4236,1233],{"class":1109},[1050,4238,4240,4242],{"class":1052,"line":4239},210,[1050,4241,2727],{"class":1063},[1050,4243,2730],{"class":1529},[1050,4245,4247,4249],{"class":1052,"line":4246},211,[1050,4248,2217],{"class":1063},[1050,4250,2301],{"class":1529},[1050,4252,4254],{"class":1052,"line":4253},212,[1050,4255,1253],{"class":1067},[1050,4257,4259,4261,4264,4266,4268,4270,4273],{"class":1052,"line":4258},213,[1050,4260,1769],{"class":1213},[1050,4262,4263],{"class":1772}," get_user",[1050,4265,1221],{"class":1109},[1050,4267,1779],{"class":1778},[1050,4269,1285],{"class":1109},[1050,4271,4272],{"class":2264}," user_id",[1050,4274,1233],{"class":1109},[1050,4276,4278,4280,4283],{"class":1052,"line":4277},214,[1050,4279,1787],{"class":1239},[1050,4281,4282],{"class":1243},"Get user by ID",[1050,4284,1247],{"class":1239},[1050,4286,4288,4291],{"class":1052,"line":4287},215,[1050,4289,4290],{"class":1063},"        try",[1050,4292,1728],{"class":1109},[1050,4294,4296,4298,4301,4303,4306,4308,4310,4312,4315,4317,4320],{"class":1052,"line":4295},216,[1050,4297,1924],{"class":1063},[1050,4299,4300],{"class":1067}," User",[1050,4302,1110],{"class":1109},[1050,4304,4305],{"class":1806},"objects",[1050,4307,1110],{"class":1109},[1050,4309,2635],{"class":1393},[1050,4311,1221],{"class":1109},[1050,4313,4314],{"class":1404},"pk",[1050,4316,1385],{"class":1109},[1050,4318,4319],{"class":1393},"user_id",[1050,4321,1432],{"class":1109},[1050,4323,4325,4328,4330,4332,4335],{"class":1052,"line":4324},217,[1050,4326,4327],{"class":1063},"        except",[1050,4329,4300],{"class":1067},[1050,4331,1110],{"class":1109},[1050,4333,4334],{"class":1806},"DoesNotExist",[1050,4336,1728],{"class":1109},[1050,4338,4340,4342],{"class":1052,"line":4339},218,[1050,4341,1924],{"class":1063},[1050,4343,1927],{"class":1529},[1050,4345,4347],{"class":1052,"line":4346},219,[1050,4348,1207],{"emptyLinePlaceholder":1206},[1050,4350,4352],{"class":1052,"line":4351},220,[1050,4353,4354],{"class":1056},"# MFA middleware\n",[1050,4356,4358,4360,4363],{"class":1052,"line":4357},221,[1050,4359,1214],{"class":1213},[1050,4361,4362],{"class":1217}," MFAMiddleware",[1050,4364,1728],{"class":1109},[1050,4366,4368,4370,4373],{"class":1052,"line":4367},222,[1050,4369,1240],{"class":1239},[1050,4371,4372],{"class":1243},"Middleware to enforce MFA",[1050,4374,1247],{"class":1239},[1050,4376,4378],{"class":1052,"line":4377},223,[1050,4379,1253],{"class":1067},[1050,4381,4383,4385,4388,4390,4392,4394,4397],{"class":1052,"line":4382},224,[1050,4384,1769],{"class":1213},[1050,4386,4387],{"class":3101}," __init__",[1050,4389,1221],{"class":1109},[1050,4391,1779],{"class":1778},[1050,4393,1285],{"class":1109},[1050,4395,4396],{"class":2264}," get_response",[1050,4398,1233],{"class":1109},[1050,4400,4402,4404,4406,4409,4411],{"class":1052,"line":4401},225,[1050,4403,3166],{"class":1259},[1050,4405,1110],{"class":1109},[1050,4407,4408],{"class":1806},"get_response",[1050,4410,1263],{"class":1109},[1050,4412,4413],{"class":1067}," get_response\n",[1050,4415,4417,4419,4421,4424,4426,4428],{"class":1052,"line":4416},226,[1050,4418,3166],{"class":1259},[1050,4420,1110],{"class":1109},[1050,4422,4423],{"class":1806},"mfa_backend",[1050,4425,1263],{"class":1109},[1050,4427,3722],{"class":1393},[1050,4429,1843],{"class":1109},[1050,4431,4433],{"class":1052,"line":4432},227,[1050,4434,1253],{"class":1067},[1050,4436,4438,4440,4443,4445,4447,4449,4451],{"class":1052,"line":4437},228,[1050,4439,1769],{"class":1213},[1050,4441,4442],{"class":3101}," __call__",[1050,4444,1221],{"class":1109},[1050,4446,1779],{"class":1778},[1050,4448,1285],{"class":1109},[1050,4450,3756],{"class":2264},[1050,4452,1233],{"class":1109},[1050,4454,4456],{"class":1052,"line":4455},229,[1050,4457,4458],{"class":1056},"        # Check if user needs MFA\n",[1050,4460,4462,4464,4467,4469,4471,4473,4475,4478,4481],{"class":1052,"line":4461},230,[1050,4463,1798],{"class":1063},[1050,4465,4466],{"class":1109}," (",[1050,4468,3851],{"class":1067},[1050,4470,1110],{"class":1109},[1050,4472,1744],{"class":1806},[1050,4474,1110],{"class":1109},[1050,4476,4477],{"class":1806},"is_authenticated",[1050,4479,4480],{"class":1810}," and",[1050,4482,4483],{"class":1067}," \n",[1050,4485,4487,4489,4491,4493,4495,4497,4499,4501,4503,4505,4507],{"class":1052,"line":4486},231,[1050,4488,1825],{"class":1259},[1050,4490,1110],{"class":1109},[1050,4492,4423],{"class":1806},[1050,4494,1110],{"class":1109},[1050,4496,3915],{"class":1393},[1050,4498,1221],{"class":1109},[1050,4500,3851],{"class":1393},[1050,4502,1110],{"class":1109},[1050,4504,1744],{"class":1806},[1050,4506,2684],{"class":1109},[1050,4508,4509],{"class":1810}," and\n",[1050,4511,4513,4516,4518,4520,4523,4525,4527],{"class":1052,"line":4512},232,[1050,4514,4515],{"class":1810},"            not",[1050,4517,1801],{"class":1259},[1050,4519,1110],{"class":1109},[1050,4521,4522],{"class":1393},"is_mfa_verified",[1050,4524,1221],{"class":1109},[1050,4526,3851],{"class":1393},[1050,4528,4529],{"class":1109},")):\n",[1050,4531,4533],{"class":1052,"line":4532},233,[1050,4534,4535],{"class":1067},"            \n",[1050,4537,4539],{"class":1052,"line":4538},234,[1050,4540,4541],{"class":1056},"            # Redirect to MFA verification\n",[1050,4543,4545,4548,4550,4552,4555,4557],{"class":1052,"line":4544},235,[1050,4546,4547],{"class":1063},"            from",[1050,4549,1106],{"class":1067},[1050,4551,1110],{"class":1109},[1050,4553,4554],{"class":1067},"shortcuts ",[1050,4556,1064],{"class":1063},[1050,4558,4559],{"class":1067}," redirect\n",[1050,4561,4563,4565,4567,4569,4571,4574,4576,4579,4581,4583,4586,4588],{"class":1052,"line":4562},236,[1050,4564,2553],{"class":1063},[1050,4566,1910],{"class":1810},[1050,4568,3756],{"class":1067},[1050,4570,1110],{"class":1109},[1050,4572,4573],{"class":1806},"path",[1050,4575,1110],{"class":1109},[1050,4577,4578],{"class":1393},"startswith",[1050,4580,1221],{"class":1109},[1050,4582,1276],{"class":1275},[1050,4584,4585],{"class":1279},"/mfa/",[1050,4587,1276],{"class":1275},[1050,4589,1233],{"class":1109},[1050,4591,4593,4595,4598,4600,4602,4605,4607],{"class":1052,"line":4592},237,[1050,4594,2727],{"class":1063},[1050,4596,4597],{"class":1393}," redirect",[1050,4599,1221],{"class":1109},[1050,4601,1276],{"class":1275},[1050,4603,4604],{"class":1279},"mfa:verify",[1050,4606,1276],{"class":1275},[1050,4608,1432],{"class":1109},[1050,4610,4612],{"class":1052,"line":4611},238,[1050,4613,1933],{"class":1067},[1050,4615,4617,4620,4622,4624,4626,4628,4630,4632],{"class":1052,"line":4616},239,[1050,4618,4619],{"class":1067},"        response ",[1050,4621,1385],{"class":1109},[1050,4623,1801],{"class":1259},[1050,4625,1110],{"class":1109},[1050,4627,4408],{"class":1393},[1050,4629,1221],{"class":1109},[1050,4631,3851],{"class":1393},[1050,4633,1432],{"class":1109},[1050,4635,4637,4639],{"class":1052,"line":4636},240,[1050,4638,2217],{"class":1063},[1050,4640,4641],{"class":1067}," response\n",[1050,4643,4645],{"class":1052,"line":4644},241,[1050,4646,1253],{"class":1067},[1050,4648,4650,4652,4655,4657,4659,4661,4663],{"class":1052,"line":4649},242,[1050,4651,1769],{"class":1213},[1050,4653,4654],{"class":1772}," is_mfa_verified",[1050,4656,1221],{"class":1109},[1050,4658,1779],{"class":1778},[1050,4660,1285],{"class":1109},[1050,4662,3756],{"class":2264},[1050,4664,1233],{"class":1109},[1050,4666,4668,4670,4673],{"class":1052,"line":4667},243,[1050,4669,1787],{"class":1239},[1050,4671,4672],{"class":1243},"Check if MFA is verified for this session",[1050,4674,1247],{"class":1239},[1050,4676,4678,4680,4682,4684,4687,4689,4691,4693,4695,4698,4700,4702,4705],{"class":1052,"line":4677},244,[1050,4679,2217],{"class":1063},[1050,4681,3756],{"class":1067},[1050,4683,1110],{"class":1109},[1050,4685,4686],{"class":1806},"session",[1050,4688,1110],{"class":1109},[1050,4690,2635],{"class":1393},[1050,4692,1221],{"class":1109},[1050,4694,1276],{"class":1275},[1050,4696,4697],{"class":1279},"mfa_verified",[1050,4699,1276],{"class":1275},[1050,4701,1285],{"class":1109},[1050,4703,4704],{"class":1529}," False",[1050,4706,1432],{"class":1109},[1035,4708,4710],{"id":4709},"advanced-authorization-patterns","Advanced Authorization Patterns",[1040,4712,4714],{"className":1042,"code":4713,"language":1044,"meta":1045,"style":1045},"# authorization/rbac.py\nfrom django.db import models\nfrom django.contrib.auth.models import User\nfrom django.contrib.contenttypes.models import ContentType\nfrom django.contrib.contenttypes.fields import GenericForeignKey\n\nclass Role(models.Model):\n    \"\"\"Role-based access control role\"\"\"\n    \n    name = models.CharField(max_length=100, unique=True)\n    description = models.TextField(blank=True)\n    is_active = models.BooleanField(default=True)\n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    def __str__(self):\n        return self.name\n\nclass Permission(models.Model):\n    \"\"\"Custom permission\"\"\"\n    \n    name = models.CharField(max_length=100)\n    codename = models.CharField(max_length=100)\n    description = models.TextField(blank=True)\n    \n    # Optional: scope to specific content type\n    content_type = models.ForeignKey(\n        ContentType,\n        on_delete=models.CASCADE,\n        null=True,\n        blank=True\n    )\n    \n    class Meta:\n        unique_together = ['codename', 'content_type']\n    \n    def __str__(self):\n        if self.content_type:\n            return f\"{self.content_type.name} | {self.name}\"\n        return self.name\n\nclass RolePermission(models.Model):\n    \"\"\"Many-to-many relationship between roles and permissions\"\"\"\n    \n    role = models.ForeignKey(Role, on_delete=models.CASCADE)\n    permission = models.ForeignKey(Permission, on_delete=models.CASCADE)\n    \n    # Optional: scope permission to specific object\n    object_id = models.PositiveIntegerField(null=True, blank=True)\n    content_object = GenericForeignKey('permission__content_type', 'object_id')\n    \n    class Meta:\n        unique_together = ['role', 'permission', 'object_id']\n\nclass UserRole(models.Model):\n    \"\"\"User role assignment\"\"\"\n    \n    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_roles')\n    role = models.ForeignKey(Role, on_delete=models.CASCADE)\n    \n    # Optional: scope role to specific object\n    content_type = models.ForeignKey(\n        ContentType,\n        on_delete=models.CASCADE,\n        null=True,\n        blank=True\n    )\n    object_id = models.PositiveIntegerField(null=True, blank=True)\n    content_object = GenericForeignKey('content_type', 'object_id')\n    \n    # Time-based access\n    valid_from = models.DateTimeField(null=True, blank=True)\n    valid_until = models.DateTimeField(null=True, blank=True)\n    \n    is_active = models.BooleanField(default=True)\n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    class Meta:\n        unique_together = ['user', 'role', 'content_type', 'object_id']\n    \n    def is_valid(self):\n        \"\"\"Check if role assignment is currently valid\"\"\"\n        if not self.is_active:\n            return False\n        \n        now = timezone.now()\n        \n        if self.valid_from and now \u003C self.valid_from:\n            return False\n        \n        if self.valid_until and now > self.valid_until:\n            return False\n        \n        return True\n\nclass RBACBackend:\n    \"\"\"Role-based access control backend\"\"\"\n    \n    def authenticate(self, request, username=None, password=None, **kwargs):\n        \"\"\"This backend doesn't authenticate\"\"\"\n        return None\n    \n    def has_perm(self, user_obj, perm, obj=None):\n        \"\"\"Check if user has permission\"\"\"\n        if not user_obj.is_active:\n            return False\n        \n        # Parse permission\n        if '.' in perm:\n            app_label, codename = perm.split('.', 1)\n        else:\n            codename = perm\n            app_label = None\n        \n        # Get user roles\n        user_roles = self.get_user_roles(user_obj, obj)\n        \n        # Check permissions for each role\n        for role in user_roles:\n            if self.role_has_permission(role, codename, obj, app_label):\n                return True\n        \n        return False\n    \n    def get_user_roles(self, user, obj=None):\n        \"\"\"Get active roles for user\"\"\"\n        queryset = user.user_roles.filter(is_active=True)\n        \n        if obj:\n            content_type = ContentType.objects.get_for_model(obj)\n            queryset = queryset.filter(\n                models.Q(content_type__isnull=True) |\n                models.Q(content_type=content_type, object_id=obj.pk)\n            )\n        else:\n            queryset = queryset.filter(content_type__isnull=True)\n        \n        # Filter by time validity\n        now = timezone.now()\n        queryset = queryset.filter(\n            models.Q(valid_from__isnull=True) | models.Q(valid_from__lte=now),\n            models.Q(valid_until__isnull=True) | models.Q(valid_until__gte=now)\n        )\n        \n        return [ur.role for ur in queryset.select_related('role')]\n    \n    def role_has_permission(self, role, codename, obj=None, app_label=None):\n        \"\"\"Check if role has specific permission\"\"\"\n        queryset = RolePermission.objects.filter(\n            role=role,\n            permission__codename=codename\n        )\n        \n        if app_label:\n            queryset = queryset.filter(\n                permission__content_type__app_label=app_label\n            )\n        \n        if obj:\n            content_type = ContentType.objects.get_for_model(obj)\n            queryset = queryset.filter(\n                models.Q(object_id__isnull=True) |\n                models.Q(object_id=obj.pk),\n                permission__content_type=content_type\n            )\n        \n        return queryset.exists()\n    \n    def get_user(self, user_id):\n        \"\"\"Get user by ID\"\"\"\n        try:\n            return User.objects.get(pk=user_id)\n        except User.DoesNotExist:\n            return None\n\n# Permission decorators\nfrom functools import wraps\nfrom django.core.exceptions import PermissionDenied\n\ndef require_permission(permission, obj_func=None):\n    \"\"\"Decorator to require specific permission\"\"\"\n    def decorator(view_func):\n        @wraps(view_func)\n        def wrapper(request, *args, **kwargs):\n            if not request.user.is_authenticated:\n                raise PermissionDenied(\"Authentication required\")\n            \n            # Get object if obj_func provided\n            obj = None\n            if obj_func:\n                obj = obj_func(request, *args, **kwargs)\n            \n            # Check permission\n            if not request.user.has_perm(permission, obj):\n                raise PermissionDenied(f\"Permission {permission} required\")\n            \n            return view_func(request, *args, **kwargs)\n        \n        return wrapper\n    return decorator\n\ndef require_role(role_name, obj_func=None):\n    \"\"\"Decorator to require specific role\"\"\"\n    def decorator(view_func):\n        @wraps(view_func)\n        def wrapper(request, *args, **kwargs):\n            if not request.user.is_authenticated:\n                raise PermissionDenied(\"Authentication required\")\n            \n            # Get object if obj_func provided\n            obj = None\n            if obj_func:\n                obj = obj_func(request, *args, **kwargs)\n            \n            # Check if user has role\n            backend = RBACBackend()\n            user_roles = backend.get_user_roles(request.user, obj)\n            \n            if not any(role.name == role_name for role in user_roles):\n                raise PermissionDenied(f\"Role {role_name} required\")\n            \n            return view_func(request, *args, **kwargs)\n        \n        return wrapper\n    return decorator\n\n# Usage examples\n@require_permission('myapp.view_sensitive_data')\ndef sensitive_view(request):\n    \"\"\"View requiring specific permission\"\"\"\n    return render(request, 'sensitive.html')\n\n@require_role('manager', lambda req, **kw: get_object_or_404(Project, pk=kw['project_id']))\ndef manage_project(request, project_id):\n    \"\"\"View requiring manager role for specific project\"\"\"\n    project = get_object_or_404(Project, pk=project_id)\n    return render(request, 'manage_project.html', {'project': project})\n",[1047,4715,4716,4721,4735,4757,4781,4805,4809,4826,4835,4839,4870,4894,4916,4938,4942,4955,4966,4970,4987,4996,5000,5022,5045,5067,5071,5076,5091,5098,5113,5124,5134,5139,5143,5151,5177,5181,5193,5205,5242,5252,5256,5273,5282,5286,5318,5350,5354,5359,5391,5421,5425,5433,5467,5471,5488,5497,5501,5544,5574,5578,5583,5597,5603,5617,5627,5635,5639,5669,5695,5699,5704,5735,5766,5770,5792,5814,5818,5826,5866,5870,5883,5892,5906,5912,5916,5931,5935,5962,5968,5972,5998,6004,6008,6014,6018,6027,6036,6040,6078,6087,6093,6097,6129,6138,6152,6158,6162,6167,6183,6216,6223,6233,6242,6246,6251,6276,6280,6285,6299,6330,6336,6340,6346,6350,6375,6384,6411,6415,6423,6449,6465,6489,6520,6525,6531,6553,6557,6562,6576,6590,6630,6668,6672,6676,6715,6719,6757,6766,6784,6795,6805,6809,6813,6821,6835,6845,6849,6853,6861,6883,6897,6918,6940,6950,6954,6958,6970,6974,6990,6998,7004,7028,7040,7046,7050,7055,7067,7087,7091,7114,7123,7137,7151,7179,7197,7216,7220,7225,7234,7242,7269,7273,7278,7305,7329,7333,7358,7362,7369,7377,7381,7403,7412,7424,7436,7460,7478,7494,7498,7502,7510,7518,7544,7548,7553,7564,7592,7596,7629,7652,7656,7680,7684,7690,7696,7700,7705,7724,7737,7746,7768,7772,7835,7853,7862,7885],{"__ignoreMap":1045},[1050,4717,4718],{"class":1052,"line":1053},[1050,4719,4720],{"class":1056},"# authorization/rbac.py\n",[1050,4722,4723,4725,4727,4729,4731,4733],{"class":1052,"line":1060},[1050,4724,1082],{"class":1063},[1050,4726,1106],{"class":1067},[1050,4728,1110],{"class":1109},[1050,4730,1140],{"class":1067},[1050,4732,1064],{"class":1063},[1050,4734,1145],{"class":1067},[1050,4736,4737,4739,4741,4743,4745,4747,4749,4751,4753,4755],{"class":1052,"line":1071},[1050,4738,1082],{"class":1063},[1050,4740,1106],{"class":1067},[1050,4742,1110],{"class":1109},[1050,4744,1113],{"class":1067},[1050,4746,1110],{"class":1109},[1050,4748,1118],{"class":1067},[1050,4750,1110],{"class":1109},[1050,4752,1123],{"class":1067},[1050,4754,1064],{"class":1063},[1050,4756,1128],{"class":1067},[1050,4758,4759,4761,4763,4765,4767,4769,4772,4774,4776,4778],{"class":1052,"line":1079},[1050,4760,1082],{"class":1063},[1050,4762,1106],{"class":1067},[1050,4764,1110],{"class":1109},[1050,4766,1113],{"class":1067},[1050,4768,1110],{"class":1109},[1050,4770,4771],{"class":1067},"contenttypes",[1050,4773,1110],{"class":1109},[1050,4775,1123],{"class":1067},[1050,4777,1064],{"class":1063},[1050,4779,4780],{"class":1067}," ContentType\n",[1050,4782,4783,4785,4787,4789,4791,4793,4795,4797,4800,4802],{"class":1052,"line":1093},[1050,4784,1082],{"class":1063},[1050,4786,1106],{"class":1067},[1050,4788,1110],{"class":1109},[1050,4790,1113],{"class":1067},[1050,4792,1110],{"class":1109},[1050,4794,4771],{"class":1067},[1050,4796,1110],{"class":1109},[1050,4798,4799],{"class":1067},"fields ",[1050,4801,1064],{"class":1063},[1050,4803,4804],{"class":1067}," GenericForeignKey\n",[1050,4806,4807],{"class":1052,"line":1101},[1050,4808,1207],{"emptyLinePlaceholder":1206},[1050,4810,4811,4813,4816,4818,4820,4822,4824],{"class":1052,"line":1131},[1050,4812,1214],{"class":1213},[1050,4814,4815],{"class":1217}," Role",[1050,4817,1221],{"class":1109},[1050,4819,1225],{"class":1224},[1050,4821,1110],{"class":1109},[1050,4823,1230],{"class":1224},[1050,4825,1233],{"class":1109},[1050,4827,4828,4830,4833],{"class":1052,"line":1148},[1050,4829,1240],{"class":1239},[1050,4831,4832],{"class":1243},"Role-based access control role",[1050,4834,1247],{"class":1239},[1050,4836,4837],{"class":1052,"line":1165},[1050,4838,1253],{"class":1067},[1050,4840,4841,4843,4845,4847,4849,4851,4853,4855,4857,4859,4861,4864,4866,4868],{"class":1052,"line":1187},[1050,4842,1438],{"class":1067},[1050,4844,1385],{"class":1109},[1050,4846,1388],{"class":1067},[1050,4848,1110],{"class":1109},[1050,4850,1447],{"class":1393},[1050,4852,1221],{"class":1109},[1050,4854,1452],{"class":1404},[1050,4856,1385],{"class":1109},[1050,4858,1458],{"class":1457},[1050,4860,1285],{"class":1109},[1050,4862,4863],{"class":1404}," unique",[1050,4865,1385],{"class":1109},[1050,4867,1530],{"class":1529},[1050,4869,1432],{"class":1109},[1050,4871,4872,4875,4877,4879,4881,4884,4886,4888,4890,4892],{"class":1052,"line":1195},[1050,4873,4874],{"class":1067},"    description ",[1050,4876,1385],{"class":1109},[1050,4878,1388],{"class":1067},[1050,4880,1110],{"class":1109},[1050,4882,4883],{"class":1393},"TextField",[1050,4885,1221],{"class":1109},[1050,4887,1585],{"class":1404},[1050,4889,1385],{"class":1109},[1050,4891,1530],{"class":1529},[1050,4893,1432],{"class":1109},[1050,4895,4896,4898,4900,4902,4904,4906,4908,4910,4912,4914],{"class":1052,"line":1203},[1050,4897,1633],{"class":1067},[1050,4899,1385],{"class":1109},[1050,4901,1388],{"class":1067},[1050,4903,1110],{"class":1109},[1050,4905,1642],{"class":1393},[1050,4907,1221],{"class":1109},[1050,4909,1611],{"class":1404},[1050,4911,1385],{"class":1109},[1050,4913,1530],{"class":1529},[1050,4915,1432],{"class":1109},[1050,4917,4918,4920,4922,4924,4926,4928,4930,4932,4934,4936],{"class":1052,"line":1210},[1050,4919,1692],{"class":1067},[1050,4921,1385],{"class":1109},[1050,4923,1388],{"class":1067},[1050,4925,1110],{"class":1109},[1050,4927,1667],{"class":1393},[1050,4929,1221],{"class":1109},[1050,4931,1705],{"class":1404},[1050,4933,1385],{"class":1109},[1050,4935,1530],{"class":1529},[1050,4937,1432],{"class":1109},[1050,4939,4940],{"class":1052,"line":1236},[1050,4941,1253],{"class":1067},[1050,4943,4944,4946,4949,4951,4953],{"class":1052,"line":1250},[1050,4945,1769],{"class":1213},[1050,4947,4948],{"class":3101}," __str__",[1050,4950,1221],{"class":1109},[1050,4952,1779],{"class":1778},[1050,4954,1233],{"class":1109},[1050,4956,4957,4959,4961,4963],{"class":1052,"line":1256},[1050,4958,2217],{"class":1063},[1050,4960,1801],{"class":1259},[1050,4962,1110],{"class":1109},[1050,4964,4965],{"class":1806},"name\n",[1050,4967,4968],{"class":1052,"line":1269},[1050,4969,1207],{"emptyLinePlaceholder":1206},[1050,4971,4972,4974,4977,4979,4981,4983,4985],{"class":1052,"line":1299},[1050,4973,1214],{"class":1213},[1050,4975,4976],{"class":1217}," Permission",[1050,4978,1221],{"class":1109},[1050,4980,1225],{"class":1224},[1050,4982,1110],{"class":1109},[1050,4984,1230],{"class":1224},[1050,4986,1233],{"class":1109},[1050,4988,4989,4991,4994],{"class":1052,"line":1322},[1050,4990,1240],{"class":1239},[1050,4992,4993],{"class":1243},"Custom permission",[1050,4995,1247],{"class":1239},[1050,4997,4998],{"class":1052,"line":1345},[1050,4999,1253],{"class":1067},[1050,5001,5002,5004,5006,5008,5010,5012,5014,5016,5018,5020],{"class":1052,"line":1368},[1050,5003,1438],{"class":1067},[1050,5005,1385],{"class":1109},[1050,5007,1388],{"class":1067},[1050,5009,1110],{"class":1109},[1050,5011,1447],{"class":1393},[1050,5013,1221],{"class":1109},[1050,5015,1452],{"class":1404},[1050,5017,1385],{"class":1109},[1050,5019,1458],{"class":1457},[1050,5021,1432],{"class":1109},[1050,5023,5024,5027,5029,5031,5033,5035,5037,5039,5041,5043],{"class":1052,"line":1374},[1050,5025,5026],{"class":1067},"    codename ",[1050,5028,1385],{"class":1109},[1050,5030,1388],{"class":1067},[1050,5032,1110],{"class":1109},[1050,5034,1447],{"class":1393},[1050,5036,1221],{"class":1109},[1050,5038,1452],{"class":1404},[1050,5040,1385],{"class":1109},[1050,5042,1458],{"class":1457},[1050,5044,1432],{"class":1109},[1050,5046,5047,5049,5051,5053,5055,5057,5059,5061,5063,5065],{"class":1052,"line":1379},[1050,5048,4874],{"class":1067},[1050,5050,1385],{"class":1109},[1050,5052,1388],{"class":1067},[1050,5054,1110],{"class":1109},[1050,5056,4883],{"class":1393},[1050,5058,1221],{"class":1109},[1050,5060,1585],{"class":1404},[1050,5062,1385],{"class":1109},[1050,5064,1530],{"class":1529},[1050,5066,1432],{"class":1109},[1050,5068,5069],{"class":1052,"line":1435},[1050,5070,1253],{"class":1067},[1050,5072,5073],{"class":1052,"line":1463},[1050,5074,5075],{"class":1056},"    # Optional: scope to specific content type\n",[1050,5077,5078,5081,5083,5085,5087,5089],{"class":1052,"line":1499},[1050,5079,5080],{"class":1067},"    content_type ",[1050,5082,1385],{"class":1109},[1050,5084,1388],{"class":1067},[1050,5086,1110],{"class":1109},[1050,5088,1394],{"class":1393},[1050,5090,1977],{"class":1109},[1050,5092,5093,5096],{"class":1052,"line":1535},[1050,5094,5095],{"class":1393},"        ContentType",[1050,5097,1998],{"class":1109},[1050,5099,5100,5103,5105,5107,5109,5111],{"class":1052,"line":1568},[1050,5101,5102],{"class":1404},"        on_delete",[1050,5104,1385],{"class":1109},[1050,5106,1225],{"class":1393},[1050,5108,1110],{"class":1109},[1050,5110,1415],{"class":1414},[1050,5112,1998],{"class":1109},[1050,5114,5115,5118,5120,5122],{"class":1052,"line":1594},[1050,5116,5117],{"class":1404},"        null",[1050,5119,1385],{"class":1109},[1050,5121,1530],{"class":1529},[1050,5123,1998],{"class":1109},[1050,5125,5126,5129,5131],{"class":1052,"line":1630},[1050,5127,5128],{"class":1404},"        blank",[1050,5130,1385],{"class":1109},[1050,5132,5133],{"class":1529},"True\n",[1050,5135,5136],{"class":1052,"line":1655},[1050,5137,5138],{"class":1109},"    )\n",[1050,5140,5141],{"class":1052,"line":1689},[1050,5142,1253],{"class":1067},[1050,5144,5145,5147,5149],{"class":1052,"line":1714},[1050,5146,1722],{"class":1213},[1050,5148,1725],{"class":1217},[1050,5150,1728],{"class":1109},[1050,5152,5153,5155,5157,5159,5161,5164,5166,5168,5170,5173,5175],{"class":1052,"line":1719},[1050,5154,1734],{"class":1067},[1050,5156,1385],{"class":1109},[1050,5158,1739],{"class":1109},[1050,5160,1276],{"class":1275},[1050,5162,5163],{"class":1279},"codename",[1050,5165,1276],{"class":1275},[1050,5167,1285],{"class":1109},[1050,5169,1288],{"class":1275},[1050,5171,5172],{"class":1279},"content_type",[1050,5174,1276],{"class":1275},[1050,5176,1758],{"class":1109},[1050,5178,5179],{"class":1052,"line":1731},[1050,5180,1253],{"class":1067},[1050,5182,5183,5185,5187,5189,5191],{"class":1052,"line":1761},[1050,5184,1769],{"class":1213},[1050,5186,4948],{"class":3101},[1050,5188,1221],{"class":1109},[1050,5190,1779],{"class":1778},[1050,5192,1233],{"class":1109},[1050,5194,5195,5197,5199,5201,5203],{"class":1052,"line":1766},[1050,5196,1798],{"class":1063},[1050,5198,1801],{"class":1259},[1050,5200,1110],{"class":1109},[1050,5202,5172],{"class":1806},[1050,5204,1728],{"class":1109},[1050,5206,5207,5209,5211,5213,5215,5217,5219,5221,5223,5225,5227,5230,5232,5234,5236,5238,5240],{"class":1052,"line":1784},[1050,5208,1924],{"class":1063},[1050,5210,2593],{"class":1213},[1050,5212,2009],{"class":1279},[1050,5214,2600],{"class":2599},[1050,5216,1779],{"class":1259},[1050,5218,1110],{"class":1109},[1050,5220,5172],{"class":1806},[1050,5222,1110],{"class":1109},[1050,5224,1753],{"class":1806},[1050,5226,2610],{"class":2599},[1050,5228,5229],{"class":1279}," | ",[1050,5231,2600],{"class":2599},[1050,5233,1779],{"class":1259},[1050,5235,1110],{"class":1109},[1050,5237,1753],{"class":1806},[1050,5239,2610],{"class":2599},[1050,5241,2015],{"class":1279},[1050,5243,5244,5246,5248,5250],{"class":1052,"line":1795},[1050,5245,2217],{"class":1063},[1050,5247,1801],{"class":1259},[1050,5249,1110],{"class":1109},[1050,5251,4965],{"class":1806},[1050,5253,5254],{"class":1052,"line":1822},[1050,5255,1207],{"emptyLinePlaceholder":1206},[1050,5257,5258,5260,5263,5265,5267,5269,5271],{"class":1052,"line":1846},[1050,5259,1214],{"class":1213},[1050,5261,5262],{"class":1217}," RolePermission",[1050,5264,1221],{"class":1109},[1050,5266,1225],{"class":1224},[1050,5268,1110],{"class":1109},[1050,5270,1230],{"class":1224},[1050,5272,1233],{"class":1109},[1050,5274,5275,5277,5280],{"class":1052,"line":1858},[1050,5276,1240],{"class":1239},[1050,5278,5279],{"class":1243},"Many-to-many relationship between roles and permissions",[1050,5281,1247],{"class":1239},[1050,5283,5284],{"class":1052,"line":1863},[1050,5285,1253],{"class":1067},[1050,5287,5288,5291,5293,5295,5297,5299,5301,5304,5306,5308,5310,5312,5314,5316],{"class":1052,"line":1877},[1050,5289,5290],{"class":1067},"    role ",[1050,5292,1385],{"class":1109},[1050,5294,1388],{"class":1067},[1050,5296,1110],{"class":1109},[1050,5298,1394],{"class":1393},[1050,5300,1221],{"class":1109},[1050,5302,5303],{"class":1393},"Role",[1050,5305,1285],{"class":1109},[1050,5307,1405],{"class":1404},[1050,5309,1385],{"class":1109},[1050,5311,1225],{"class":1393},[1050,5313,1110],{"class":1109},[1050,5315,1415],{"class":1414},[1050,5317,1432],{"class":1109},[1050,5319,5320,5323,5325,5327,5329,5331,5333,5336,5338,5340,5342,5344,5346,5348],{"class":1052,"line":1887},[1050,5321,5322],{"class":1067},"    permission ",[1050,5324,1385],{"class":1109},[1050,5326,1388],{"class":1067},[1050,5328,1110],{"class":1109},[1050,5330,1394],{"class":1393},[1050,5332,1221],{"class":1109},[1050,5334,5335],{"class":1393},"Permission",[1050,5337,1285],{"class":1109},[1050,5339,1405],{"class":1404},[1050,5341,1385],{"class":1109},[1050,5343,1225],{"class":1393},[1050,5345,1110],{"class":1109},[1050,5347,1415],{"class":1414},[1050,5349,1432],{"class":1109},[1050,5351,5352],{"class":1052,"line":1921},[1050,5353,1253],{"class":1067},[1050,5355,5356],{"class":1052,"line":1930},[1050,5357,5358],{"class":1056},"    # Optional: scope permission to specific object\n",[1050,5360,5361,5364,5366,5368,5370,5373,5375,5377,5379,5381,5383,5385,5387,5389],{"class":1052,"line":1936},[1050,5362,5363],{"class":1067},"    object_id ",[1050,5365,1385],{"class":1109},[1050,5367,1388],{"class":1067},[1050,5369,1110],{"class":1109},[1050,5371,5372],{"class":1393},"PositiveIntegerField",[1050,5374,1221],{"class":1109},[1050,5376,1672],{"class":1404},[1050,5378,1385],{"class":1109},[1050,5380,1530],{"class":1529},[1050,5382,1285],{"class":1109},[1050,5384,1524],{"class":1404},[1050,5386,1385],{"class":1109},[1050,5388,1530],{"class":1529},[1050,5390,1432],{"class":1109},[1050,5392,5393,5396,5398,5401,5403,5405,5408,5410,5412,5414,5417,5419],{"class":1052,"line":1961},[1050,5394,5395],{"class":1067},"    content_object ",[1050,5397,1385],{"class":1109},[1050,5399,5400],{"class":1393}," GenericForeignKey",[1050,5402,1221],{"class":1109},[1050,5404,1276],{"class":1275},[1050,5406,5407],{"class":1279},"permission__content_type",[1050,5409,1276],{"class":1275},[1050,5411,1285],{"class":1109},[1050,5413,1288],{"class":1275},[1050,5415,5416],{"class":1279},"object_id",[1050,5418,1276],{"class":1275},[1050,5420,1432],{"class":1109},[1050,5422,5423],{"class":1052,"line":1980},[1050,5424,1253],{"class":1067},[1050,5426,5427,5429,5431],{"class":1052,"line":2001},[1050,5428,1722],{"class":1213},[1050,5430,1725],{"class":1217},[1050,5432,1728],{"class":1109},[1050,5434,5435,5437,5439,5441,5443,5446,5448,5450,5452,5455,5457,5459,5461,5463,5465],{"class":1052,"line":2018},[1050,5436,1734],{"class":1067},[1050,5438,1385],{"class":1109},[1050,5440,1739],{"class":1109},[1050,5442,1276],{"class":1275},[1050,5444,5445],{"class":1279},"role",[1050,5447,1276],{"class":1275},[1050,5449,1285],{"class":1109},[1050,5451,1288],{"class":1275},[1050,5453,5454],{"class":1279},"permission",[1050,5456,1276],{"class":1275},[1050,5458,1285],{"class":1109},[1050,5460,1288],{"class":1275},[1050,5462,5416],{"class":1279},[1050,5464,1276],{"class":1275},[1050,5466,1758],{"class":1109},[1050,5468,5469],{"class":1052,"line":2024},[1050,5470,1207],{"emptyLinePlaceholder":1206},[1050,5472,5473,5475,5478,5480,5482,5484,5486],{"class":1052,"line":2029},[1050,5474,1214],{"class":1213},[1050,5476,5477],{"class":1217}," UserRole",[1050,5479,1221],{"class":1109},[1050,5481,1225],{"class":1224},[1050,5483,1110],{"class":1109},[1050,5485,1230],{"class":1224},[1050,5487,1233],{"class":1109},[1050,5489,5490,5492,5495],{"class":1052,"line":2076},[1050,5491,1240],{"class":1239},[1050,5493,5494],{"class":1243},"User role assignment",[1050,5496,1247],{"class":1239},[1050,5498,5499],{"class":1052,"line":2093},[1050,5500,1253],{"class":1067},[1050,5502,5503,5505,5507,5509,5511,5513,5515,5517,5519,5521,5523,5525,5527,5529,5531,5533,5535,5537,5540,5542],{"class":1052,"line":2114},[1050,5504,1382],{"class":1067},[1050,5506,1385],{"class":1109},[1050,5508,1388],{"class":1067},[1050,5510,1110],{"class":1109},[1050,5512,1394],{"class":1393},[1050,5514,1221],{"class":1109},[1050,5516,1399],{"class":1393},[1050,5518,1285],{"class":1109},[1050,5520,1405],{"class":1404},[1050,5522,1385],{"class":1109},[1050,5524,1225],{"class":1393},[1050,5526,1110],{"class":1109},[1050,5528,1415],{"class":1414},[1050,5530,1285],{"class":1109},[1050,5532,1420],{"class":1404},[1050,5534,1385],{"class":1109},[1050,5536,1276],{"class":1275},[1050,5538,5539],{"class":1279},"user_roles",[1050,5541,1276],{"class":1275},[1050,5543,1432],{"class":1109},[1050,5545,5546,5548,5550,5552,5554,5556,5558,5560,5562,5564,5566,5568,5570,5572],{"class":1052,"line":2119},[1050,5547,5290],{"class":1067},[1050,5549,1385],{"class":1109},[1050,5551,1388],{"class":1067},[1050,5553,1110],{"class":1109},[1050,5555,1394],{"class":1393},[1050,5557,1221],{"class":1109},[1050,5559,5303],{"class":1393},[1050,5561,1285],{"class":1109},[1050,5563,1405],{"class":1404},[1050,5565,1385],{"class":1109},[1050,5567,1225],{"class":1393},[1050,5569,1110],{"class":1109},[1050,5571,1415],{"class":1414},[1050,5573,1432],{"class":1109},[1050,5575,5576],{"class":1052,"line":2165},[1050,5577,1253],{"class":1067},[1050,5579,5580],{"class":1052,"line":2178},[1050,5581,5582],{"class":1056},"    # Optional: scope role to specific object\n",[1050,5584,5585,5587,5589,5591,5593,5595],{"class":1052,"line":2209},[1050,5586,5080],{"class":1067},[1050,5588,1385],{"class":1109},[1050,5590,1388],{"class":1067},[1050,5592,1110],{"class":1109},[1050,5594,1394],{"class":1393},[1050,5596,1977],{"class":1109},[1050,5598,5599,5601],{"class":1052,"line":2214},[1050,5600,5095],{"class":1393},[1050,5602,1998],{"class":1109},[1050,5604,5605,5607,5609,5611,5613,5615],{"class":1052,"line":2245},[1050,5606,5102],{"class":1404},[1050,5608,1385],{"class":1109},[1050,5610,1225],{"class":1393},[1050,5612,1110],{"class":1109},[1050,5614,1415],{"class":1414},[1050,5616,1998],{"class":1109},[1050,5618,5619,5621,5623,5625],{"class":1052,"line":2250},[1050,5620,5117],{"class":1404},[1050,5622,1385],{"class":1109},[1050,5624,1530],{"class":1529},[1050,5626,1998],{"class":1109},[1050,5628,5629,5631,5633],{"class":1052,"line":2270},[1050,5630,5128],{"class":1404},[1050,5632,1385],{"class":1109},[1050,5634,5133],{"class":1529},[1050,5636,5637],{"class":1052,"line":2280},[1050,5638,5138],{"class":1109},[1050,5640,5641,5643,5645,5647,5649,5651,5653,5655,5657,5659,5661,5663,5665,5667],{"class":1052,"line":2296},[1050,5642,5363],{"class":1067},[1050,5644,1385],{"class":1109},[1050,5646,1388],{"class":1067},[1050,5648,1110],{"class":1109},[1050,5650,5372],{"class":1393},[1050,5652,1221],{"class":1109},[1050,5654,1672],{"class":1404},[1050,5656,1385],{"class":1109},[1050,5658,1530],{"class":1529},[1050,5660,1285],{"class":1109},[1050,5662,1524],{"class":1404},[1050,5664,1385],{"class":1109},[1050,5666,1530],{"class":1529},[1050,5668,1432],{"class":1109},[1050,5670,5671,5673,5675,5677,5679,5681,5683,5685,5687,5689,5691,5693],{"class":1052,"line":2304},[1050,5672,5395],{"class":1067},[1050,5674,1385],{"class":1109},[1050,5676,5400],{"class":1393},[1050,5678,1221],{"class":1109},[1050,5680,1276],{"class":1275},[1050,5682,5172],{"class":1279},[1050,5684,1276],{"class":1275},[1050,5686,1285],{"class":1109},[1050,5688,1288],{"class":1275},[1050,5690,5416],{"class":1279},[1050,5692,1276],{"class":1275},[1050,5694,1432],{"class":1109},[1050,5696,5697],{"class":1052,"line":2309},[1050,5698,1253],{"class":1067},[1050,5700,5701],{"class":1052,"line":2330},[1050,5702,5703],{"class":1056},"    # Time-based access\n",[1050,5705,5706,5709,5711,5713,5715,5717,5719,5721,5723,5725,5727,5729,5731,5733],{"class":1052,"line":2349},[1050,5707,5708],{"class":1067},"    valid_from ",[1050,5710,1385],{"class":1109},[1050,5712,1388],{"class":1067},[1050,5714,1110],{"class":1109},[1050,5716,1667],{"class":1393},[1050,5718,1221],{"class":1109},[1050,5720,1672],{"class":1404},[1050,5722,1385],{"class":1109},[1050,5724,1530],{"class":1529},[1050,5726,1285],{"class":1109},[1050,5728,1524],{"class":1404},[1050,5730,1385],{"class":1109},[1050,5732,1530],{"class":1529},[1050,5734,1432],{"class":1109},[1050,5736,5737,5740,5742,5744,5746,5748,5750,5752,5754,5756,5758,5760,5762,5764],{"class":1052,"line":2371},[1050,5738,5739],{"class":1067},"    valid_until ",[1050,5741,1385],{"class":1109},[1050,5743,1388],{"class":1067},[1050,5745,1110],{"class":1109},[1050,5747,1667],{"class":1393},[1050,5749,1221],{"class":1109},[1050,5751,1672],{"class":1404},[1050,5753,1385],{"class":1109},[1050,5755,1530],{"class":1529},[1050,5757,1285],{"class":1109},[1050,5759,1524],{"class":1404},[1050,5761,1385],{"class":1109},[1050,5763,1530],{"class":1529},[1050,5765,1432],{"class":1109},[1050,5767,5768],{"class":1052,"line":2389},[1050,5769,1253],{"class":1067},[1050,5771,5772,5774,5776,5778,5780,5782,5784,5786,5788,5790],{"class":1052,"line":2422},[1050,5773,1633],{"class":1067},[1050,5775,1385],{"class":1109},[1050,5777,1388],{"class":1067},[1050,5779,1110],{"class":1109},[1050,5781,1642],{"class":1393},[1050,5783,1221],{"class":1109},[1050,5785,1611],{"class":1404},[1050,5787,1385],{"class":1109},[1050,5789,1530],{"class":1529},[1050,5791,1432],{"class":1109},[1050,5793,5794,5796,5798,5800,5802,5804,5806,5808,5810,5812],{"class":1052,"line":2440},[1050,5795,1692],{"class":1067},[1050,5797,1385],{"class":1109},[1050,5799,1388],{"class":1067},[1050,5801,1110],{"class":1109},[1050,5803,1667],{"class":1393},[1050,5805,1221],{"class":1109},[1050,5807,1705],{"class":1404},[1050,5809,1385],{"class":1109},[1050,5811,1530],{"class":1529},[1050,5813,1432],{"class":1109},[1050,5815,5816],{"class":1052,"line":2445},[1050,5817,1253],{"class":1067},[1050,5819,5820,5822,5824],{"class":1052,"line":2452},[1050,5821,1722],{"class":1213},[1050,5823,1725],{"class":1217},[1050,5825,1728],{"class":1109},[1050,5827,5828,5830,5832,5834,5836,5838,5840,5842,5844,5846,5848,5850,5852,5854,5856,5858,5860,5862,5864],{"class":1052,"line":2457},[1050,5829,1734],{"class":1067},[1050,5831,1385],{"class":1109},[1050,5833,1739],{"class":1109},[1050,5835,1276],{"class":1275},[1050,5837,1744],{"class":1279},[1050,5839,1276],{"class":1275},[1050,5841,1285],{"class":1109},[1050,5843,1288],{"class":1275},[1050,5845,5445],{"class":1279},[1050,5847,1276],{"class":1275},[1050,5849,1285],{"class":1109},[1050,5851,1288],{"class":1275},[1050,5853,5172],{"class":1279},[1050,5855,1276],{"class":1275},[1050,5857,1285],{"class":1109},[1050,5859,1288],{"class":1275},[1050,5861,5416],{"class":1279},[1050,5863,1276],{"class":1275},[1050,5865,1758],{"class":1109},[1050,5867,5868],{"class":1052,"line":2475},[1050,5869,1253],{"class":1067},[1050,5871,5872,5874,5877,5879,5881],{"class":1052,"line":2485},[1050,5873,1769],{"class":1213},[1050,5875,5876],{"class":1772}," is_valid",[1050,5878,1221],{"class":1109},[1050,5880,1779],{"class":1778},[1050,5882,1233],{"class":1109},[1050,5884,5885,5887,5890],{"class":1052,"line":2508},[1050,5886,1787],{"class":1239},[1050,5888,5889],{"class":1243},"Check if role assignment is currently valid",[1050,5891,1247],{"class":1239},[1050,5893,5894,5896,5898,5900,5902,5904],{"class":1052,"line":2513},[1050,5895,1798],{"class":1063},[1050,5897,1910],{"class":1810},[1050,5899,1801],{"class":1259},[1050,5901,1110],{"class":1109},[1050,5903,2291],{"class":1806},[1050,5905,1728],{"class":1109},[1050,5907,5908,5910],{"class":1052,"line":2519},[1050,5909,1924],{"class":1063},[1050,5911,2301],{"class":1529},[1050,5913,5914],{"class":1052,"line":2550},[1050,5915,1933],{"class":1067},[1050,5917,5918,5921,5923,5925,5927,5929],{"class":1052,"line":2579},[1050,5919,5920],{"class":1067},"        now ",[1050,5922,1385],{"class":1109},[1050,5924,2703],{"class":1067},[1050,5926,1110],{"class":1109},[1050,5928,2708],{"class":1393},[1050,5930,1843],{"class":1109},[1050,5932,5933],{"class":1052,"line":2585},[1050,5934,1933],{"class":1067},[1050,5936,5937,5939,5941,5943,5946,5948,5951,5954,5956,5958,5960],{"class":1052,"line":2624},[1050,5938,1798],{"class":1063},[1050,5940,1801],{"class":1259},[1050,5942,1110],{"class":1109},[1050,5944,5945],{"class":1806},"valid_from",[1050,5947,4480],{"class":1810},[1050,5949,5950],{"class":1067}," now ",[1050,5952,5953],{"class":1810},"\u003C",[1050,5955,1801],{"class":1259},[1050,5957,1110],{"class":1109},[1050,5959,5945],{"class":1806},[1050,5961,1728],{"class":1109},[1050,5963,5964,5966],{"class":1052,"line":2645},[1050,5965,1924],{"class":1063},[1050,5967,2301],{"class":1529},[1050,5969,5970],{"class":1052,"line":2653},[1050,5971,1933],{"class":1067},[1050,5973,5974,5976,5978,5980,5983,5985,5987,5990,5992,5994,5996],{"class":1052,"line":2659},[1050,5975,1798],{"class":1063},[1050,5977,1801],{"class":1259},[1050,5979,1110],{"class":1109},[1050,5981,5982],{"class":1806},"valid_until",[1050,5984,4480],{"class":1810},[1050,5986,5950],{"class":1067},[1050,5988,5989],{"class":1810},">",[1050,5991,1801],{"class":1259},[1050,5993,1110],{"class":1109},[1050,5995,5982],{"class":1806},[1050,5997,1728],{"class":1109},[1050,5999,6000,6002],{"class":1052,"line":2690},[1050,6001,1924],{"class":1063},[1050,6003,2301],{"class":1529},[1050,6005,6006],{"class":1052,"line":2713},[1050,6007,1933],{"class":1067},[1050,6009,6010,6012],{"class":1052,"line":2724},[1050,6011,2217],{"class":1063},[1050,6013,2730],{"class":1529},[1050,6015,6016],{"class":1052,"line":2733},[1050,6017,1207],{"emptyLinePlaceholder":1206},[1050,6019,6020,6022,6025],{"class":1052,"line":2738},[1050,6021,1214],{"class":1213},[1050,6023,6024],{"class":1217}," RBACBackend",[1050,6026,1728],{"class":1109},[1050,6028,6029,6031,6034],{"class":1052,"line":2745},[1050,6030,1240],{"class":1239},[1050,6032,6033],{"class":1243},"Role-based access control backend",[1050,6035,1247],{"class":1239},[1050,6037,6038],{"class":1052,"line":2750},[1050,6039,1253],{"class":1067},[1050,6041,6042,6044,6046,6048,6050,6052,6054,6056,6058,6060,6062,6064,6066,6068,6070,6072,6074,6076],{"class":1052,"line":2769},[1050,6043,1769],{"class":1213},[1050,6045,3747],{"class":1772},[1050,6047,1221],{"class":1109},[1050,6049,1779],{"class":1778},[1050,6051,1285],{"class":1109},[1050,6053,3756],{"class":2264},[1050,6055,1285],{"class":1109},[1050,6057,3761],{"class":2264},[1050,6059,1385],{"class":1810},[1050,6061,3766],{"class":1529},[1050,6063,1285],{"class":1109},[1050,6065,3771],{"class":2264},[1050,6067,1385],{"class":1810},[1050,6069,3766],{"class":1529},[1050,6071,1285],{"class":1109},[1050,6073,3789],{"class":1810},[1050,6075,3792],{"class":2264},[1050,6077,1233],{"class":1109},[1050,6079,6080,6082,6085],{"class":1052,"line":2779},[1050,6081,1787],{"class":1239},[1050,6083,6084],{"class":1243},"This backend doesn't authenticate",[1050,6086,1247],{"class":1239},[1050,6088,6089,6091],{"class":1052,"line":2798},[1050,6090,2217],{"class":1063},[1050,6092,1927],{"class":1529},[1050,6094,6095],{"class":1052,"line":2804},[1050,6096,1253],{"class":1067},[1050,6098,6099,6101,6104,6106,6108,6110,6113,6115,6118,6120,6123,6125,6127],{"class":1052,"line":2824},[1050,6100,1769],{"class":1213},[1050,6102,6103],{"class":1772}," has_perm",[1050,6105,1221],{"class":1109},[1050,6107,1779],{"class":1778},[1050,6109,1285],{"class":1109},[1050,6111,6112],{"class":2264}," user_obj",[1050,6114,1285],{"class":1109},[1050,6116,6117],{"class":2264}," perm",[1050,6119,1285],{"class":1109},[1050,6121,6122],{"class":2264}," obj",[1050,6124,1385],{"class":1810},[1050,6126,3766],{"class":1529},[1050,6128,1233],{"class":1109},[1050,6130,6131,6133,6136],{"class":1052,"line":2843},[1050,6132,1787],{"class":1239},[1050,6134,6135],{"class":1243},"Check if user has permission",[1050,6137,1247],{"class":1239},[1050,6139,6140,6142,6144,6146,6148,6150],{"class":1052,"line":2854},[1050,6141,1798],{"class":1063},[1050,6143,1910],{"class":1810},[1050,6145,6112],{"class":1067},[1050,6147,1110],{"class":1109},[1050,6149,2291],{"class":1806},[1050,6151,1728],{"class":1109},[1050,6153,6154,6156],{"class":1052,"line":2861},[1050,6155,1924],{"class":1063},[1050,6157,2301],{"class":1529},[1050,6159,6160],{"class":1052,"line":2866},[1050,6161,1933],{"class":1067},[1050,6163,6164],{"class":1052,"line":2873},[1050,6165,6166],{"class":1056},"        # Parse permission\n",[1050,6168,6169,6171,6173,6175,6177,6179,6181],{"class":1052,"line":2878},[1050,6170,1798],{"class":1063},[1050,6172,1288],{"class":1275},[1050,6174,1110],{"class":1279},[1050,6176,1276],{"class":1275},[1050,6178,2400],{"class":1810},[1050,6180,6117],{"class":1067},[1050,6182,1728],{"class":1109},[1050,6184,6185,6188,6190,6193,6195,6197,6199,6202,6204,6206,6208,6210,6212,6214],{"class":1052,"line":2896},[1050,6186,6187],{"class":1067},"            app_label",[1050,6189,1285],{"class":1109},[1050,6191,6192],{"class":1067}," codename ",[1050,6194,1385],{"class":1109},[1050,6196,6117],{"class":1067},[1050,6198,1110],{"class":1109},[1050,6200,6201],{"class":1393},"split",[1050,6203,1221],{"class":1109},[1050,6205,1276],{"class":1275},[1050,6207,1110],{"class":1279},[1050,6209,1276],{"class":1275},[1050,6211,1285],{"class":1109},[1050,6213,2545],{"class":1457},[1050,6215,1432],{"class":1109},[1050,6217,6218,6221],{"class":1052,"line":2906},[1050,6219,6220],{"class":1063},"        else",[1050,6222,1728],{"class":1109},[1050,6224,6225,6228,6230],{"class":1052,"line":2931},[1050,6226,6227],{"class":1067},"            codename ",[1050,6229,1385],{"class":1109},[1050,6231,6232],{"class":1067}," perm\n",[1050,6234,6235,6238,6240],{"class":1052,"line":2951},[1050,6236,6237],{"class":1067},"            app_label ",[1050,6239,1385],{"class":1109},[1050,6241,1927],{"class":1529},[1050,6243,6244],{"class":1052,"line":2956},[1050,6245,1933],{"class":1067},[1050,6247,6248],{"class":1052,"line":2976},[1050,6249,6250],{"class":1056},"        # Get user roles\n",[1050,6252,6253,6256,6258,6260,6262,6265,6267,6270,6272,6274],{"class":1052,"line":2993},[1050,6254,6255],{"class":1067},"        user_roles ",[1050,6257,1385],{"class":1109},[1050,6259,1801],{"class":1259},[1050,6261,1110],{"class":1109},[1050,6263,6264],{"class":1393},"get_user_roles",[1050,6266,1221],{"class":1109},[1050,6268,6269],{"class":1393},"user_obj",[1050,6271,1285],{"class":1109},[1050,6273,6122],{"class":1393},[1050,6275,1432],{"class":1109},[1050,6277,6278],{"class":1052,"line":3012},[1050,6279,1933],{"class":1067},[1050,6281,6282],{"class":1052,"line":3023},[1050,6283,6284],{"class":1056},"        # Check permissions for each role\n",[1050,6286,6287,6289,6292,6294,6297],{"class":1052,"line":3030},[1050,6288,2522],{"class":1063},[1050,6290,6291],{"class":1067}," role ",[1050,6293,2528],{"class":1063},[1050,6295,6296],{"class":1067}," user_roles",[1050,6298,1728],{"class":1109},[1050,6300,6301,6303,6305,6307,6310,6312,6314,6316,6319,6321,6323,6325,6328],{"class":1052,"line":3035},[1050,6302,2553],{"class":1063},[1050,6304,1801],{"class":1259},[1050,6306,1110],{"class":1109},[1050,6308,6309],{"class":1393},"role_has_permission",[1050,6311,1221],{"class":1109},[1050,6313,5445],{"class":1393},[1050,6315,1285],{"class":1109},[1050,6317,6318],{"class":1393}," codename",[1050,6320,1285],{"class":1109},[1050,6322,6122],{"class":1393},[1050,6324,1285],{"class":1109},[1050,6326,6327],{"class":1393}," app_label",[1050,6329,1233],{"class":1109},[1050,6331,6332,6334],{"class":1052,"line":3042},[1050,6333,2727],{"class":1063},[1050,6335,2730],{"class":1529},[1050,6337,6338],{"class":1052,"line":3047},[1050,6339,1933],{"class":1067},[1050,6341,6342,6344],{"class":1052,"line":3070},[1050,6343,2217],{"class":1063},[1050,6345,2301],{"class":1529},[1050,6347,6348],{"class":1052,"line":3080},[1050,6349,1253],{"class":1067},[1050,6351,6352,6354,6357,6359,6361,6363,6365,6367,6369,6371,6373],{"class":1052,"line":3091},[1050,6353,1769],{"class":1213},[1050,6355,6356],{"class":1772}," get_user_roles",[1050,6358,1221],{"class":1109},[1050,6360,1779],{"class":1778},[1050,6362,1285],{"class":1109},[1050,6364,3881],{"class":2264},[1050,6366,1285],{"class":1109},[1050,6368,6122],{"class":2264},[1050,6370,1385],{"class":1810},[1050,6372,3766],{"class":1529},[1050,6374,1233],{"class":1109},[1050,6376,6377,6379,6382],{"class":1052,"line":3112},[1050,6378,1787],{"class":1239},[1050,6380,6381],{"class":1243},"Get active roles for user",[1050,6383,1247],{"class":1239},[1050,6385,6386,6389,6391,6393,6395,6397,6399,6401,6403,6405,6407,6409],{"class":1052,"line":3141},[1050,6387,6388],{"class":1067},"        queryset ",[1050,6390,1385],{"class":1109},[1050,6392,3881],{"class":1067},[1050,6394,1110],{"class":1109},[1050,6396,5539],{"class":1806},[1050,6398,1110],{"class":1109},[1050,6400,4135],{"class":1393},[1050,6402,1221],{"class":1109},[1050,6404,2291],{"class":1404},[1050,6406,1385],{"class":1109},[1050,6408,1530],{"class":1529},[1050,6410,1432],{"class":1109},[1050,6412,6413],{"class":1052,"line":3158},[1050,6414,1933],{"class":1067},[1050,6416,6417,6419,6421],{"class":1052,"line":3163},[1050,6418,1798],{"class":1063},[1050,6420,6122],{"class":1067},[1050,6422,1728],{"class":1109},[1050,6424,6425,6428,6430,6433,6435,6437,6439,6442,6444,6447],{"class":1052,"line":3178},[1050,6426,6427],{"class":1067},"            content_type ",[1050,6429,1385],{"class":1109},[1050,6431,6432],{"class":1067}," ContentType",[1050,6434,1110],{"class":1109},[1050,6436,4305],{"class":1806},[1050,6438,1110],{"class":1109},[1050,6440,6441],{"class":1393},"get_for_model",[1050,6443,1221],{"class":1109},[1050,6445,6446],{"class":1393},"obj",[1050,6448,1432],{"class":1109},[1050,6450,6451,6454,6456,6459,6461,6463],{"class":1052,"line":3189},[1050,6452,6453],{"class":1067},"            queryset ",[1050,6455,1385],{"class":1109},[1050,6457,6458],{"class":1067}," queryset",[1050,6460,1110],{"class":1109},[1050,6462,4135],{"class":1393},[1050,6464,1977],{"class":1109},[1050,6466,6467,6470,6472,6475,6477,6480,6482,6484,6486],{"class":1052,"line":3196},[1050,6468,6469],{"class":1393},"                models",[1050,6471,1110],{"class":1109},[1050,6473,6474],{"class":1393},"Q",[1050,6476,1221],{"class":1109},[1050,6478,6479],{"class":1404},"content_type__isnull",[1050,6481,1385],{"class":1109},[1050,6483,1530],{"class":1529},[1050,6485,2684],{"class":1109},[1050,6487,6488],{"class":1810}," |\n",[1050,6490,6491,6493,6495,6497,6499,6501,6503,6505,6507,6510,6512,6514,6516,6518],{"class":1052,"line":3201},[1050,6492,6469],{"class":1393},[1050,6494,1110],{"class":1109},[1050,6496,6474],{"class":1393},[1050,6498,1221],{"class":1109},[1050,6500,5172],{"class":1404},[1050,6502,1385],{"class":1109},[1050,6504,5172],{"class":1393},[1050,6506,1285],{"class":1109},[1050,6508,6509],{"class":1404}," object_id",[1050,6511,1385],{"class":1109},[1050,6513,6446],{"class":1393},[1050,6515,1110],{"class":1109},[1050,6517,4314],{"class":1806},[1050,6519,1432],{"class":1109},[1050,6521,6522],{"class":1052,"line":3215},[1050,6523,6524],{"class":1109},"            )\n",[1050,6526,6527,6529],{"class":1052,"line":3225},[1050,6528,6220],{"class":1063},[1050,6530,1728],{"class":1109},[1050,6532,6533,6535,6537,6539,6541,6543,6545,6547,6549,6551],{"class":1052,"line":3258},[1050,6534,6453],{"class":1067},[1050,6536,1385],{"class":1109},[1050,6538,6458],{"class":1067},[1050,6540,1110],{"class":1109},[1050,6542,4135],{"class":1393},[1050,6544,1221],{"class":1109},[1050,6546,6479],{"class":1404},[1050,6548,1385],{"class":1109},[1050,6550,1530],{"class":1529},[1050,6552,1432],{"class":1109},[1050,6554,6555],{"class":1052,"line":3265},[1050,6556,1933],{"class":1067},[1050,6558,6559],{"class":1052,"line":3270},[1050,6560,6561],{"class":1056},"        # Filter by time validity\n",[1050,6563,6564,6566,6568,6570,6572,6574],{"class":1052,"line":3276},[1050,6565,5920],{"class":1067},[1050,6567,1385],{"class":1109},[1050,6569,2703],{"class":1067},[1050,6571,1110],{"class":1109},[1050,6573,2708],{"class":1393},[1050,6575,1843],{"class":1109},[1050,6577,6578,6580,6582,6584,6586,6588],{"class":1052,"line":3298},[1050,6579,6388],{"class":1067},[1050,6581,1385],{"class":1109},[1050,6583,6458],{"class":1067},[1050,6585,1110],{"class":1109},[1050,6587,4135],{"class":1393},[1050,6589,1977],{"class":1109},[1050,6591,6592,6595,6597,6599,6601,6604,6606,6608,6610,6613,6615,6617,6619,6621,6624,6626,6628],{"class":1052,"line":3321},[1050,6593,6594],{"class":1393},"            models",[1050,6596,1110],{"class":1109},[1050,6598,6474],{"class":1393},[1050,6600,1221],{"class":1109},[1050,6602,6603],{"class":1404},"valid_from__isnull",[1050,6605,1385],{"class":1109},[1050,6607,1530],{"class":1529},[1050,6609,2684],{"class":1109},[1050,6611,6612],{"class":1810}," |",[1050,6614,1388],{"class":1393},[1050,6616,1110],{"class":1109},[1050,6618,6474],{"class":1393},[1050,6620,1221],{"class":1109},[1050,6622,6623],{"class":1404},"valid_from__lte",[1050,6625,1385],{"class":1109},[1050,6627,2708],{"class":1393},[1050,6629,1296],{"class":1109},[1050,6631,6632,6634,6636,6638,6640,6643,6645,6647,6649,6651,6653,6655,6657,6659,6662,6664,6666],{"class":1052,"line":3326},[1050,6633,6594],{"class":1393},[1050,6635,1110],{"class":1109},[1050,6637,6474],{"class":1393},[1050,6639,1221],{"class":1109},[1050,6641,6642],{"class":1404},"valid_until__isnull",[1050,6644,1385],{"class":1109},[1050,6646,1530],{"class":1529},[1050,6648,2684],{"class":1109},[1050,6650,6612],{"class":1810},[1050,6652,1388],{"class":1393},[1050,6654,1110],{"class":1109},[1050,6656,6474],{"class":1393},[1050,6658,1221],{"class":1109},[1050,6660,6661],{"class":1404},"valid_until__gte",[1050,6663,1385],{"class":1109},[1050,6665,2708],{"class":1393},[1050,6667,1432],{"class":1109},[1050,6669,6670],{"class":1052,"line":3332},[1050,6671,2021],{"class":1109},[1050,6673,6674],{"class":1052,"line":3355},[1050,6675,1933],{"class":1067},[1050,6677,6678,6680,6682,6685,6687,6689,6692,6695,6697,6699,6701,6704,6706,6708,6710,6712],{"class":1052,"line":3381},[1050,6679,2217],{"class":1063},[1050,6681,1739],{"class":1109},[1050,6683,6684],{"class":1067},"ur",[1050,6686,1110],{"class":1109},[1050,6688,5445],{"class":1806},[1050,6690,6691],{"class":1063}," for",[1050,6693,6694],{"class":1067}," ur ",[1050,6696,2528],{"class":1063},[1050,6698,6458],{"class":1067},[1050,6700,1110],{"class":1109},[1050,6702,6703],{"class":1393},"select_related",[1050,6705,1221],{"class":1109},[1050,6707,1276],{"class":1275},[1050,6709,5445],{"class":1279},[1050,6711,1276],{"class":1275},[1050,6713,6714],{"class":1109},")]\n",[1050,6716,6717],{"class":1052,"line":3386},[1050,6718,1253],{"class":1067},[1050,6720,6721,6723,6726,6728,6730,6732,6735,6737,6739,6741,6743,6745,6747,6749,6751,6753,6755],{"class":1052,"line":3407},[1050,6722,1769],{"class":1213},[1050,6724,6725],{"class":1772}," role_has_permission",[1050,6727,1221],{"class":1109},[1050,6729,1779],{"class":1778},[1050,6731,1285],{"class":1109},[1050,6733,6734],{"class":2264}," role",[1050,6736,1285],{"class":1109},[1050,6738,6318],{"class":2264},[1050,6740,1285],{"class":1109},[1050,6742,6122],{"class":2264},[1050,6744,1385],{"class":1810},[1050,6746,3766],{"class":1529},[1050,6748,1285],{"class":1109},[1050,6750,6327],{"class":2264},[1050,6752,1385],{"class":1810},[1050,6754,3766],{"class":1529},[1050,6756,1233],{"class":1109},[1050,6758,6759,6761,6764],{"class":1052,"line":3426},[1050,6760,1787],{"class":1239},[1050,6762,6763],{"class":1243},"Check if role has specific permission",[1050,6765,1247],{"class":1239},[1050,6767,6768,6770,6772,6774,6776,6778,6780,6782],{"class":1052,"line":3447},[1050,6769,6388],{"class":1067},[1050,6771,1385],{"class":1109},[1050,6773,5262],{"class":1067},[1050,6775,1110],{"class":1109},[1050,6777,4305],{"class":1806},[1050,6779,1110],{"class":1109},[1050,6781,4135],{"class":1393},[1050,6783,1977],{"class":1109},[1050,6785,6786,6789,6791,6793],{"class":1052,"line":3465},[1050,6787,6788],{"class":1404},"            role",[1050,6790,1385],{"class":1109},[1050,6792,5445],{"class":1393},[1050,6794,1998],{"class":1109},[1050,6796,6797,6800,6802],{"class":1052,"line":3470},[1050,6798,6799],{"class":1404},"            permission__codename",[1050,6801,1385],{"class":1109},[1050,6803,6804],{"class":1393},"codename\n",[1050,6806,6807],{"class":1052,"line":3477},[1050,6808,2021],{"class":1109},[1050,6810,6811],{"class":1052,"line":3482},[1050,6812,1933],{"class":1067},[1050,6814,6815,6817,6819],{"class":1052,"line":3500},[1050,6816,1798],{"class":1063},[1050,6818,6327],{"class":1067},[1050,6820,1728],{"class":1109},[1050,6822,6823,6825,6827,6829,6831,6833],{"class":1052,"line":3510},[1050,6824,6453],{"class":1067},[1050,6826,1385],{"class":1109},[1050,6828,6458],{"class":1067},[1050,6830,1110],{"class":1109},[1050,6832,4135],{"class":1393},[1050,6834,1977],{"class":1109},[1050,6836,6837,6840,6842],{"class":1052,"line":3516},[1050,6838,6839],{"class":1404},"                permission__content_type__app_label",[1050,6841,1385],{"class":1109},[1050,6843,6844],{"class":1393},"app_label\n",[1050,6846,6847],{"class":1052,"line":3538},[1050,6848,6524],{"class":1109},[1050,6850,6851],{"class":1052,"line":3544},[1050,6852,1933],{"class":1067},[1050,6854,6855,6857,6859],{"class":1052,"line":3551},[1050,6856,1798],{"class":1063},[1050,6858,6122],{"class":1067},[1050,6860,1728],{"class":1109},[1050,6862,6863,6865,6867,6869,6871,6873,6875,6877,6879,6881],{"class":1052,"line":3556},[1050,6864,6427],{"class":1067},[1050,6866,1385],{"class":1109},[1050,6868,6432],{"class":1067},[1050,6870,1110],{"class":1109},[1050,6872,4305],{"class":1806},[1050,6874,1110],{"class":1109},[1050,6876,6441],{"class":1393},[1050,6878,1221],{"class":1109},[1050,6880,6446],{"class":1393},[1050,6882,1432],{"class":1109},[1050,6884,6885,6887,6889,6891,6893,6895],{"class":1052,"line":3574},[1050,6886,6453],{"class":1067},[1050,6888,1385],{"class":1109},[1050,6890,6458],{"class":1067},[1050,6892,1110],{"class":1109},[1050,6894,4135],{"class":1393},[1050,6896,1977],{"class":1109},[1050,6898,6899,6901,6903,6905,6907,6910,6912,6914,6916],{"class":1052,"line":3584},[1050,6900,6469],{"class":1393},[1050,6902,1110],{"class":1109},[1050,6904,6474],{"class":1393},[1050,6906,1221],{"class":1109},[1050,6908,6909],{"class":1404},"object_id__isnull",[1050,6911,1385],{"class":1109},[1050,6913,1530],{"class":1529},[1050,6915,2684],{"class":1109},[1050,6917,6488],{"class":1810},[1050,6919,6920,6922,6924,6926,6928,6930,6932,6934,6936,6938],{"class":1052,"line":3603},[1050,6921,6469],{"class":1393},[1050,6923,1110],{"class":1109},[1050,6925,6474],{"class":1393},[1050,6927,1221],{"class":1109},[1050,6929,5416],{"class":1404},[1050,6931,1385],{"class":1109},[1050,6933,6446],{"class":1393},[1050,6935,1110],{"class":1109},[1050,6937,4314],{"class":1806},[1050,6939,1296],{"class":1109},[1050,6941,6942,6945,6947],{"class":1052,"line":3608},[1050,6943,6944],{"class":1404},"                permission__content_type",[1050,6946,1385],{"class":1109},[1050,6948,6949],{"class":1393},"content_type\n",[1050,6951,6952],{"class":1052,"line":3616},[1050,6953,6524],{"class":1109},[1050,6955,6956],{"class":1052,"line":3629},[1050,6957,1933],{"class":1067},[1050,6959,6960,6962,6964,6966,6968],{"class":1052,"line":3648},[1050,6961,2217],{"class":1063},[1050,6963,6458],{"class":1067},[1050,6965,1110],{"class":1109},[1050,6967,4148],{"class":1393},[1050,6969,1843],{"class":1109},[1050,6971,6972],{"class":1052,"line":3660},[1050,6973,1253],{"class":1067},[1050,6975,6976,6978,6980,6982,6984,6986,6988],{"class":1052,"line":3687},[1050,6977,1769],{"class":1213},[1050,6979,4263],{"class":1772},[1050,6981,1221],{"class":1109},[1050,6983,1779],{"class":1778},[1050,6985,1285],{"class":1109},[1050,6987,4272],{"class":2264},[1050,6989,1233],{"class":1109},[1050,6991,6992,6994,6996],{"class":1052,"line":3700},[1050,6993,1787],{"class":1239},[1050,6995,4282],{"class":1243},[1050,6997,1247],{"class":1239},[1050,6999,7000,7002],{"class":1052,"line":3705},[1050,7001,4290],{"class":1063},[1050,7003,1728],{"class":1109},[1050,7005,7006,7008,7010,7012,7014,7016,7018,7020,7022,7024,7026],{"class":1052,"line":3712},[1050,7007,1924],{"class":1063},[1050,7009,4300],{"class":1067},[1050,7011,1110],{"class":1109},[1050,7013,4305],{"class":1806},[1050,7015,1110],{"class":1109},[1050,7017,2635],{"class":1393},[1050,7019,1221],{"class":1109},[1050,7021,4314],{"class":1404},[1050,7023,1385],{"class":1109},[1050,7025,4319],{"class":1393},[1050,7027,1432],{"class":1109},[1050,7029,7030,7032,7034,7036,7038],{"class":1052,"line":3717},[1050,7031,4327],{"class":1063},[1050,7033,4300],{"class":1067},[1050,7035,1110],{"class":1109},[1050,7037,4334],{"class":1806},[1050,7039,1728],{"class":1109},[1050,7041,7042,7044],{"class":1052,"line":3727},[1050,7043,1924],{"class":1063},[1050,7045,1927],{"class":1529},[1050,7047,7048],{"class":1052,"line":3737},[1050,7049,1207],{"emptyLinePlaceholder":1206},[1050,7051,7052],{"class":1052,"line":3742},[1050,7053,7054],{"class":1056},"# Permission decorators\n",[1050,7056,7057,7059,7062,7064],{"class":1052,"line":3797},[1050,7058,1082],{"class":1063},[1050,7060,7061],{"class":1067}," functools ",[1050,7063,1064],{"class":1063},[1050,7065,7066],{"class":1067}," wraps\n",[1050,7068,7069,7071,7073,7075,7077,7079,7082,7084],{"class":1052,"line":3807},[1050,7070,1082],{"class":1063},[1050,7072,1106],{"class":1067},[1050,7074,1110],{"class":1109},[1050,7076,1174],{"class":1067},[1050,7078,1110],{"class":1109},[1050,7080,7081],{"class":1067},"exceptions ",[1050,7083,1064],{"class":1063},[1050,7085,7086],{"class":1067}," PermissionDenied\n",[1050,7088,7089],{"class":1052,"line":3828},[1050,7090,1207],{"emptyLinePlaceholder":1206},[1050,7092,7093,7096,7099,7101,7103,7105,7108,7110,7112],{"class":1052,"line":3833},[1050,7094,7095],{"class":1213},"def",[1050,7097,7098],{"class":1772}," require_permission",[1050,7100,1221],{"class":1109},[1050,7102,5454],{"class":2264},[1050,7104,1285],{"class":1109},[1050,7106,7107],{"class":2264}," obj_func",[1050,7109,1385],{"class":1810},[1050,7111,3766],{"class":1529},[1050,7113,1233],{"class":1109},[1050,7115,7116,7118,7121],{"class":1052,"line":3839},[1050,7117,1240],{"class":1239},[1050,7119,7120],{"class":1243},"Decorator to require specific permission",[1050,7122,1247],{"class":1239},[1050,7124,7125,7127,7130,7132,7135],{"class":1052,"line":3874},[1050,7126,1769],{"class":1213},[1050,7128,7129],{"class":1772}," decorator",[1050,7131,1221],{"class":1109},[1050,7133,7134],{"class":2264},"view_func",[1050,7136,1233],{"class":1109},[1050,7138,7139,7142,7145,7147,7149],{"class":1052,"line":3886},[1050,7140,7141],{"class":1109},"        @",[1050,7143,7144],{"class":1772},"wraps",[1050,7146,1221],{"class":1109},[1050,7148,7134],{"class":1393},[1050,7150,1432],{"class":1109},[1050,7152,7153,7156,7159,7161,7163,7165,7168,7171,7173,7175,7177],{"class":1052,"line":3893},[1050,7154,7155],{"class":1213},"        def",[1050,7157,7158],{"class":1772}," wrapper",[1050,7160,1221],{"class":1109},[1050,7162,3851],{"class":2264},[1050,7164,1285],{"class":1109},[1050,7166,7167],{"class":1810}," *",[1050,7169,7170],{"class":2264},"args",[1050,7172,1285],{"class":1109},[1050,7174,3789],{"class":1810},[1050,7176,3792],{"class":2264},[1050,7178,1233],{"class":1109},[1050,7180,7181,7183,7185,7187,7189,7191,7193,7195],{"class":1052,"line":3898},[1050,7182,2553],{"class":1063},[1050,7184,1910],{"class":1810},[1050,7186,3756],{"class":1067},[1050,7188,1110],{"class":1109},[1050,7190,1744],{"class":1806},[1050,7192,1110],{"class":1109},[1050,7194,4477],{"class":1806},[1050,7196,1728],{"class":1109},[1050,7198,7199,7202,7205,7207,7209,7212,7214],{"class":1052,"line":3904},[1050,7200,7201],{"class":1063},"                raise",[1050,7203,7204],{"class":1393}," PermissionDenied",[1050,7206,1221],{"class":1109},[1050,7208,2009],{"class":1275},[1050,7210,7211],{"class":1279},"Authentication required",[1050,7213,2009],{"class":1275},[1050,7215,1432],{"class":1109},[1050,7217,7218],{"class":1052,"line":3924},[1050,7219,4535],{"class":1067},[1050,7221,7222],{"class":1052,"line":3932},[1050,7223,7224],{"class":1056},"            # Get object if obj_func provided\n",[1050,7226,7227,7230,7232],{"class":1052,"line":3937},[1050,7228,7229],{"class":1067},"            obj ",[1050,7231,1385],{"class":1109},[1050,7233,1927],{"class":1529},[1050,7235,7236,7238,7240],{"class":1052,"line":3943},[1050,7237,2553],{"class":1063},[1050,7239,7107],{"class":1067},[1050,7241,1728],{"class":1109},[1050,7243,7244,7247,7249,7251,7253,7255,7257,7259,7261,7263,7265,7267],{"class":1052,"line":3954},[1050,7245,7246],{"class":1067},"                obj ",[1050,7248,1385],{"class":1109},[1050,7250,7107],{"class":1393},[1050,7252,1221],{"class":1109},[1050,7254,3851],{"class":1393},[1050,7256,1285],{"class":1109},[1050,7258,7167],{"class":1810},[1050,7260,7170],{"class":1393},[1050,7262,1285],{"class":1109},[1050,7264,3789],{"class":1810},[1050,7266,3792],{"class":1393},[1050,7268,1432],{"class":1109},[1050,7270,7271],{"class":1052,"line":3960},[1050,7272,4535],{"class":1067},[1050,7274,7275],{"class":1052,"line":3999},[1050,7276,7277],{"class":1056},"            # Check permission\n",[1050,7279,7280,7282,7284,7286,7288,7290,7292,7295,7297,7299,7301,7303],{"class":1052,"line":4006},[1050,7281,2553],{"class":1063},[1050,7283,1910],{"class":1810},[1050,7285,3756],{"class":1067},[1050,7287,1110],{"class":1109},[1050,7289,1744],{"class":1806},[1050,7291,1110],{"class":1109},[1050,7293,7294],{"class":1393},"has_perm",[1050,7296,1221],{"class":1109},[1050,7298,5454],{"class":1393},[1050,7300,1285],{"class":1109},[1050,7302,6122],{"class":1393},[1050,7304,1233],{"class":1109},[1050,7306,7307,7309,7311,7313,7315,7318,7320,7322,7324,7327],{"class":1052,"line":4011},[1050,7308,7201],{"class":1063},[1050,7310,7204],{"class":1393},[1050,7312,1221],{"class":1109},[1050,7314,3971],{"class":1213},[1050,7316,7317],{"class":1279},"\"Permission ",[1050,7319,2600],{"class":2599},[1050,7321,5454],{"class":1393},[1050,7323,2610],{"class":2599},[1050,7325,7326],{"class":1279}," required\"",[1050,7328,1432],{"class":1109},[1050,7330,7331],{"class":1052,"line":4017},[1050,7332,4535],{"class":1067},[1050,7334,7335,7337,7340,7342,7344,7346,7348,7350,7352,7354,7356],{"class":1052,"line":4039},[1050,7336,1924],{"class":1063},[1050,7338,7339],{"class":1393}," view_func",[1050,7341,1221],{"class":1109},[1050,7343,3851],{"class":1393},[1050,7345,1285],{"class":1109},[1050,7347,7167],{"class":1810},[1050,7349,7170],{"class":1393},[1050,7351,1285],{"class":1109},[1050,7353,3789],{"class":1810},[1050,7355,3792],{"class":1393},[1050,7357,1432],{"class":1109},[1050,7359,7360],{"class":1052,"line":4045},[1050,7361,1933],{"class":1067},[1050,7363,7364,7366],{"class":1052,"line":4070},[1050,7365,2217],{"class":1063},[1050,7367,7368],{"class":1067}," wrapper\n",[1050,7370,7371,7374],{"class":1052,"line":4077},[1050,7372,7373],{"class":1063},"    return",[1050,7375,7376],{"class":1067}," decorator\n",[1050,7378,7379],{"class":1052,"line":4082},[1050,7380,1207],{"emptyLinePlaceholder":1206},[1050,7382,7383,7385,7388,7390,7393,7395,7397,7399,7401],{"class":1052,"line":4089},[1050,7384,7095],{"class":1213},[1050,7386,7387],{"class":1772}," require_role",[1050,7389,1221],{"class":1109},[1050,7391,7392],{"class":2264},"role_name",[1050,7394,1285],{"class":1109},[1050,7396,7107],{"class":2264},[1050,7398,1385],{"class":1810},[1050,7400,3766],{"class":1529},[1050,7402,1233],{"class":1109},[1050,7404,7405,7407,7410],{"class":1052,"line":4094},[1050,7406,1240],{"class":1239},[1050,7408,7409],{"class":1243},"Decorator to require specific role",[1050,7411,1247],{"class":1239},[1050,7413,7414,7416,7418,7420,7422],{"class":1052,"line":4112},[1050,7415,1769],{"class":1213},[1050,7417,7129],{"class":1772},[1050,7419,1221],{"class":1109},[1050,7421,7134],{"class":2264},[1050,7423,1233],{"class":1109},[1050,7425,7426,7428,7430,7432,7434],{"class":1052,"line":4122},[1050,7427,7141],{"class":1109},[1050,7429,7144],{"class":1772},[1050,7431,1221],{"class":1109},[1050,7433,7134],{"class":1393},[1050,7435,1432],{"class":1109},[1050,7437,7438,7440,7442,7444,7446,7448,7450,7452,7454,7456,7458],{"class":1052,"line":4153},[1050,7439,7155],{"class":1213},[1050,7441,7158],{"class":1772},[1050,7443,1221],{"class":1109},[1050,7445,3851],{"class":2264},[1050,7447,1285],{"class":1109},[1050,7449,7167],{"class":1810},[1050,7451,7170],{"class":2264},[1050,7453,1285],{"class":1109},[1050,7455,3789],{"class":1810},[1050,7457,3792],{"class":2264},[1050,7459,1233],{"class":1109},[1050,7461,7462,7464,7466,7468,7470,7472,7474,7476],{"class":1052,"line":4158},[1050,7463,2553],{"class":1063},[1050,7465,1910],{"class":1810},[1050,7467,3756],{"class":1067},[1050,7469,1110],{"class":1109},[1050,7471,1744],{"class":1806},[1050,7473,1110],{"class":1109},[1050,7475,4477],{"class":1806},[1050,7477,1728],{"class":1109},[1050,7479,7480,7482,7484,7486,7488,7490,7492],{"class":1052,"line":4180},[1050,7481,7201],{"class":1063},[1050,7483,7204],{"class":1393},[1050,7485,1221],{"class":1109},[1050,7487,2009],{"class":1275},[1050,7489,7211],{"class":1279},[1050,7491,2009],{"class":1275},[1050,7493,1432],{"class":1109},[1050,7495,7496],{"class":1052,"line":4190},[1050,7497,4535],{"class":1067},[1050,7499,7500],{"class":1052,"line":4220},[1050,7501,7224],{"class":1056},[1050,7503,7504,7506,7508],{"class":1052,"line":4239},[1050,7505,7229],{"class":1067},[1050,7507,1385],{"class":1109},[1050,7509,1927],{"class":1529},[1050,7511,7512,7514,7516],{"class":1052,"line":4246},[1050,7513,2553],{"class":1063},[1050,7515,7107],{"class":1067},[1050,7517,1728],{"class":1109},[1050,7519,7520,7522,7524,7526,7528,7530,7532,7534,7536,7538,7540,7542],{"class":1052,"line":4253},[1050,7521,7246],{"class":1067},[1050,7523,1385],{"class":1109},[1050,7525,7107],{"class":1393},[1050,7527,1221],{"class":1109},[1050,7529,3851],{"class":1393},[1050,7531,1285],{"class":1109},[1050,7533,7167],{"class":1810},[1050,7535,7170],{"class":1393},[1050,7537,1285],{"class":1109},[1050,7539,3789],{"class":1810},[1050,7541,3792],{"class":1393},[1050,7543,1432],{"class":1109},[1050,7545,7546],{"class":1052,"line":4258},[1050,7547,4535],{"class":1067},[1050,7549,7550],{"class":1052,"line":4277},[1050,7551,7552],{"class":1056},"            # Check if user has role\n",[1050,7554,7555,7558,7560,7562],{"class":1052,"line":4287},[1050,7556,7557],{"class":1067},"            backend ",[1050,7559,1385],{"class":1109},[1050,7561,6024],{"class":1393},[1050,7563,1843],{"class":1109},[1050,7565,7566,7569,7571,7574,7576,7578,7580,7582,7584,7586,7588,7590],{"class":1052,"line":4295},[1050,7567,7568],{"class":1067},"            user_roles ",[1050,7570,1385],{"class":1109},[1050,7572,7573],{"class":1067}," backend",[1050,7575,1110],{"class":1109},[1050,7577,6264],{"class":1393},[1050,7579,1221],{"class":1109},[1050,7581,3851],{"class":1393},[1050,7583,1110],{"class":1109},[1050,7585,1744],{"class":1806},[1050,7587,1285],{"class":1109},[1050,7589,6122],{"class":1393},[1050,7591,1432],{"class":1109},[1050,7593,7594],{"class":1052,"line":4324},[1050,7595,4535],{"class":1067},[1050,7597,7598,7600,7602,7605,7607,7609,7611,7613,7615,7618,7621,7623,7625,7627],{"class":1052,"line":4339},[1050,7599,2553],{"class":1063},[1050,7601,1910],{"class":1810},[1050,7603,7604],{"class":3101}," any",[1050,7606,1221],{"class":1109},[1050,7608,5445],{"class":1393},[1050,7610,1110],{"class":1109},[1050,7612,1753],{"class":1806},[1050,7614,1811],{"class":1810},[1050,7616,7617],{"class":1393}," role_name ",[1050,7619,7620],{"class":1063},"for",[1050,7622,6291],{"class":1393},[1050,7624,2528],{"class":1063},[1050,7626,6296],{"class":1393},[1050,7628,1233],{"class":1109},[1050,7630,7631,7633,7635,7637,7639,7642,7644,7646,7648,7650],{"class":1052,"line":4346},[1050,7632,7201],{"class":1063},[1050,7634,7204],{"class":1393},[1050,7636,1221],{"class":1109},[1050,7638,3971],{"class":1213},[1050,7640,7641],{"class":1279},"\"Role ",[1050,7643,2600],{"class":2599},[1050,7645,7392],{"class":1393},[1050,7647,2610],{"class":2599},[1050,7649,7326],{"class":1279},[1050,7651,1432],{"class":1109},[1050,7653,7654],{"class":1052,"line":4351},[1050,7655,4535],{"class":1067},[1050,7657,7658,7660,7662,7664,7666,7668,7670,7672,7674,7676,7678],{"class":1052,"line":4357},[1050,7659,1924],{"class":1063},[1050,7661,7339],{"class":1393},[1050,7663,1221],{"class":1109},[1050,7665,3851],{"class":1393},[1050,7667,1285],{"class":1109},[1050,7669,7167],{"class":1810},[1050,7671,7170],{"class":1393},[1050,7673,1285],{"class":1109},[1050,7675,3789],{"class":1810},[1050,7677,3792],{"class":1393},[1050,7679,1432],{"class":1109},[1050,7681,7682],{"class":1052,"line":4367},[1050,7683,1933],{"class":1067},[1050,7685,7686,7688],{"class":1052,"line":4377},[1050,7687,2217],{"class":1063},[1050,7689,7368],{"class":1067},[1050,7691,7692,7694],{"class":1052,"line":4382},[1050,7693,7373],{"class":1063},[1050,7695,7376],{"class":1067},[1050,7697,7698],{"class":1052,"line":4401},[1050,7699,1207],{"emptyLinePlaceholder":1206},[1050,7701,7702],{"class":1052,"line":4416},[1050,7703,7704],{"class":1056},"# Usage examples\n",[1050,7706,7707,7710,7713,7715,7717,7720,7722],{"class":1052,"line":4432},[1050,7708,7709],{"class":1109},"@",[1050,7711,7712],{"class":1772},"require_permission",[1050,7714,1221],{"class":1109},[1050,7716,1276],{"class":1275},[1050,7718,7719],{"class":1279},"myapp.view_sensitive_data",[1050,7721,1276],{"class":1275},[1050,7723,1432],{"class":1109},[1050,7725,7726,7728,7731,7733,7735],{"class":1052,"line":4437},[1050,7727,7095],{"class":1213},[1050,7729,7730],{"class":1772}," sensitive_view",[1050,7732,1221],{"class":1109},[1050,7734,3851],{"class":2264},[1050,7736,1233],{"class":1109},[1050,7738,7739,7741,7744],{"class":1052,"line":4455},[1050,7740,1240],{"class":1239},[1050,7742,7743],{"class":1243},"View requiring specific permission",[1050,7745,1247],{"class":1239},[1050,7747,7748,7750,7753,7755,7757,7759,7761,7764,7766],{"class":1052,"line":4461},[1050,7749,7373],{"class":1063},[1050,7751,7752],{"class":1393}," render",[1050,7754,1221],{"class":1109},[1050,7756,3851],{"class":1393},[1050,7758,1285],{"class":1109},[1050,7760,1288],{"class":1275},[1050,7762,7763],{"class":1279},"sensitive.html",[1050,7765,1276],{"class":1275},[1050,7767,1432],{"class":1109},[1050,7769,7770],{"class":1052,"line":4486},[1050,7771,1207],{"emptyLinePlaceholder":1206},[1050,7773,7774,7776,7779,7781,7783,7786,7788,7790,7793,7796,7798,7800,7803,7805,7808,7810,7813,7815,7818,7820,7822,7825,7827,7830,7832],{"class":1052,"line":4512},[1050,7775,7709],{"class":1109},[1050,7777,7778],{"class":1772},"require_role",[1050,7780,1221],{"class":1109},[1050,7782,1276],{"class":1275},[1050,7784,7785],{"class":1279},"manager",[1050,7787,1276],{"class":1275},[1050,7789,1285],{"class":1109},[1050,7791,7792],{"class":1213}," lambda",[1050,7794,7795],{"class":2264}," req",[1050,7797,1285],{"class":1109},[1050,7799,3789],{"class":1810},[1050,7801,7802],{"class":2264},"kw",[1050,7804,2613],{"class":1109},[1050,7806,7807],{"class":1393}," get_object_or_404",[1050,7809,1221],{"class":1109},[1050,7811,7812],{"class":1393},"Project",[1050,7814,1285],{"class":1109},[1050,7816,7817],{"class":1404}," pk",[1050,7819,1385],{"class":1109},[1050,7821,7802],{"class":1393},[1050,7823,7824],{"class":1109},"[",[1050,7826,1276],{"class":1275},[1050,7828,7829],{"class":1279},"project_id",[1050,7831,1276],{"class":1275},[1050,7833,7834],{"class":1109},"]))\n",[1050,7836,7837,7839,7842,7844,7846,7848,7851],{"class":1052,"line":4532},[1050,7838,7095],{"class":1213},[1050,7840,7841],{"class":1772}," manage_project",[1050,7843,1221],{"class":1109},[1050,7845,3851],{"class":2264},[1050,7847,1285],{"class":1109},[1050,7849,7850],{"class":2264}," project_id",[1050,7852,1233],{"class":1109},[1050,7854,7855,7857,7860],{"class":1052,"line":4538},[1050,7856,1240],{"class":1239},[1050,7858,7859],{"class":1243},"View requiring manager role for specific project",[1050,7861,1247],{"class":1239},[1050,7863,7864,7867,7869,7871,7873,7875,7877,7879,7881,7883],{"class":1052,"line":4544},[1050,7865,7866],{"class":1067},"    project ",[1050,7868,1385],{"class":1109},[1050,7870,7807],{"class":1393},[1050,7872,1221],{"class":1109},[1050,7874,7812],{"class":1393},[1050,7876,1285],{"class":1109},[1050,7878,7817],{"class":1404},[1050,7880,1385],{"class":1109},[1050,7882,7829],{"class":1393},[1050,7884,1432],{"class":1109},[1050,7886,7887,7889,7891,7893,7895,7897,7899,7902,7904,7906,7909,7911,7914,7916,7918,7921],{"class":1052,"line":4562},[1050,7888,7373],{"class":1063},[1050,7890,7752],{"class":1393},[1050,7892,1221],{"class":1109},[1050,7894,3851],{"class":1393},[1050,7896,1285],{"class":1109},[1050,7898,1288],{"class":1275},[1050,7900,7901],{"class":1279},"manage_project.html",[1050,7903,1276],{"class":1275},[1050,7905,1285],{"class":1109},[1050,7907,7908],{"class":1109}," {",[1050,7910,1276],{"class":1275},[1050,7912,7913],{"class":1279},"project",[1050,7915,1276],{"class":1275},[1050,7917,2613],{"class":1109},[1050,7919,7920],{"class":1393}," project",[1050,7922,7923],{"class":1109},"})\n",[1030,7925,7927],{"id":7926},"security-monitoring-and-logging","Security Monitoring and Logging",[1035,7929,7931],{"id":7930},"advanced-security-logging","Advanced Security Logging",[1040,7933,7935],{"className":1042,"code":7934,"language":1044,"meta":1045,"style":1045},"# security/logging.py\nimport logging\nimport json\nfrom django.utils.deprecation import MiddlewareMixin\nfrom django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed\nfrom django.db.models.signals import post_save, post_delete\nfrom django.dispatch import receiver\nfrom django.utils import timezone\nfrom django.db import models\nimport hashlib\n\nclass SecurityEvent(models.Model):\n    \"\"\"Security event logging\"\"\"\n    \n    EVENT_TYPES = [\n        ('login_success', 'Login Success'),\n        ('login_failed', 'Login Failed'),\n        ('logout', 'Logout'),\n        ('permission_denied', 'Permission Denied'),\n        ('suspicious_activity', 'Suspicious Activity'),\n        ('data_access', 'Data Access'),\n        ('data_modification', 'Data Modification'),\n        ('admin_action', 'Admin Action'),\n        ('mfa_success', 'MFA Success'),\n        ('mfa_failed', 'MFA Failed'),\n    ]\n    \n    SEVERITY_LEVELS = [\n        ('low', 'Low'),\n        ('medium', 'Medium'),\n        ('high', 'High'),\n        ('critical', 'Critical'),\n    ]\n    \n    event_type = models.CharField(max_length=50, choices=EVENT_TYPES)\n    severity = models.CharField(max_length=10, choices=SEVERITY_LEVELS, default='medium')\n    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)\n    ip_address = models.GenericIPAddressField()\n    user_agent = models.TextField(blank=True)\n    session_key = models.CharField(max_length=40, blank=True)\n    \n    # Event details\n    description = models.TextField()\n    additional_data = models.JSONField(default=dict, blank=True)\n    \n    # Request details\n    request_method = models.CharField(max_length=10, blank=True)\n    request_path = models.TextField(blank=True)\n    request_params = models.JSONField(default=dict, blank=True)\n    \n    timestamp = models.DateTimeField(auto_now_add=True)\n    \n    class Meta:\n        indexes = [\n            models.Index(fields=['event_type', 'timestamp']),\n            models.Index(fields=['user', 'timestamp']),\n            models.Index(fields=['ip_address', 'timestamp']),\n            models.Index(fields=['severity', 'timestamp']),\n        ]\n    \n    def __str__(self):\n        return f\"{self.event_type} - {self.user} - {self.timestamp}\"\n\nclass SecurityLogger:\n    \"\"\"Centralized security logging\"\"\"\n    \n    def __init__(self):\n        self.logger = logging.getLogger('security')\n    \n    def log_event(self, event_type, request=None, user=None, severity='medium', \n                  description='', additional_data=None):\n        \"\"\"Log security event\"\"\"\n        \n        # Extract request information\n        ip_address = self._get_client_ip(request) if request else '127.0.0.1'\n        user_agent = request.META.get('HTTP_USER_AGENT', '') if request else ''\n        session_key = request.session.session_key if request and hasattr(request, 'session') else ''\n        request_method = request.method if request else ''\n        request_path = request.path if request else ''\n        request_params = dict(request.GET) if request else {}\n        \n        # Use request user if not provided\n        if not user and request and hasattr(request, 'user') and request.user.is_authenticated:\n            user = request.user\n        \n        # Create security event\n        event = SecurityEvent.objects.create(\n            event_type=event_type,\n            severity=severity,\n            user=user,\n            ip_address=ip_address,\n            user_agent=user_agent,\n            session_key=session_key,\n            description=description,\n            additional_data=additional_data or {},\n            request_method=request_method,\n            request_path=request_path,\n            request_params=request_params\n        )\n        \n        # Log to file/external system\n        log_data = {\n            'event_id': event.id,\n            'event_type': event_type,\n            'severity': severity,\n            'user_id': user.id if user else None,\n            'username': user.username if user else None,\n            'ip_address': ip_address,\n            'timestamp': timezone.now().isoformat(),\n            'description': description,\n            'additional_data': additional_data or {}\n        }\n        \n        if severity in ['high', 'critical']:\n            self.logger.critical(json.dumps(log_data))\n        elif severity == 'medium':\n            self.logger.warning(json.dumps(log_data))\n        else:\n            self.logger.info(json.dumps(log_data))\n        \n        # Send alerts for critical events\n        if severity == 'critical':\n            self._send_security_alert(event)\n        \n        return event\n    \n    def _get_client_ip(self, request):\n        \"\"\"Extract client IP from request\"\"\"\n        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')\n        if x_forwarded_for:\n            ip = x_forwarded_for.split(',')[0]\n        else:\n            ip = request.META.get('REMOTE_ADDR')\n        return ip\n    \n    def _send_security_alert(self, event):\n        \"\"\"Send security alert for critical events\"\"\"\n        from django.core.mail import send_mail\n        from django.conf import settings\n        \n        subject = f\"CRITICAL Security Event: {event.event_type}\"\n        message = f\"\"\"\n        Critical security event detected:\n        \n        Event Type: {event.event_type}\n        User: {event.user}\n        IP Address: {event.ip_address}\n        Timestamp: {event.timestamp}\n        Description: {event.description}\n        \n        Additional Data: {json.dumps(event.additional_data, indent=2)}\n        \"\"\"\n        \n        security_emails = getattr(settings, 'SECURITY_ALERT_EMAILS', [])\n        if security_emails:\n            send_mail(\n                subject,\n                message,\n                settings.DEFAULT_FROM_EMAIL,\n                security_emails,\n                fail_silently=False\n            )\n\n# Global security logger\nsecurity_logger = SecurityLogger()\n\n# Security monitoring middleware\nclass SecurityMonitoringMiddleware(MiddlewareMixin):\n    \"\"\"Middleware for security monitoring\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        self.suspicious_patterns = [\n            'union select',\n            'drop table',\n            '\u003Cscript',\n            'javascript:',\n            '../../../',\n            'cmd.exe',\n            '/etc/passwd',\n        ]\n    \n    def __call__(self, request):\n        # Check for suspicious patterns\n        self._check_suspicious_activity(request)\n        \n        # Track failed permission checks\n        response = self.get_response(request)\n        \n        if response.status_code == 403:\n            security_logger.log_event(\n                'permission_denied',\n                request=request,\n                severity='medium',\n                description=f\"Permission denied for {request.path}\"\n            )\n        \n        return response\n    \n    def _check_suspicious_activity(self, request):\n        \"\"\"Check for suspicious activity patterns\"\"\"\n        # Check query parameters\n        query_string = request.META.get('QUERY_STRING', '').lower()\n        \n        for pattern in self.suspicious_patterns:\n            if pattern in query_string:\n                security_logger.log_event(\n                    'suspicious_activity',\n                    request=request,\n                    severity='high',\n                    description=f\"Suspicious pattern detected: {pattern}\",\n                    additional_data={'pattern': pattern, 'query_string': query_string}\n                )\n                break\n        \n        # Check for excessive requests from same IP\n        self._check_rate_limiting(request)\n    \n    def _check_rate_limiting(self, request):\n        \"\"\"Check for potential DoS attacks\"\"\"\n        ip_address = security_logger._get_client_ip(request)\n        cache_key = f\"request_count:{ip_address}\"\n        \n        from django.core.cache import cache\n        \n        current_count = cache.get(cache_key, 0)\n        cache.set(cache_key, current_count + 1, 60)  # 1 minute window\n        \n        if current_count > 100:  # More than 100 requests per minute\n            security_logger.log_event(\n                'suspicious_activity',\n                request=request,\n                severity='high',\n                description=f\"Excessive requests from IP: {ip_address}\",\n                additional_data={'request_count': current_count}\n            )\n\n# Signal handlers for security events\n@receiver(user_logged_in)\ndef log_user_login(sender, request, user, **kwargs):\n    \"\"\"Log successful user login\"\"\"\n    security_logger.log_event(\n        'login_success',\n        request=request,\n        user=user,\n        severity='low',\n        description=f\"User {user.username} logged in successfully\"\n    )\n\n@receiver(user_login_failed)\ndef log_failed_login(sender, credentials, request, **kwargs):\n    \"\"\"Log failed login attempt\"\"\"\n    username = credentials.get('username', 'unknown')\n    \n    security_logger.log_event(\n        'login_failed',\n        request=request,\n        severity='medium',\n        description=f\"Failed login attempt for username: {username}\",\n        additional_data={'username': username}\n    )\n    \n    # Check for brute force attempts\n    ip_address = security_logger._get_client_ip(request)\n    cache_key = f\"failed_login:{ip_address}\"\n    \n    from django.core.cache import cache\n    \n    failed_count = cache.get(cache_key, 0)\n    cache.set(cache_key, failed_count + 1, 300)  # 5 minute window\n    \n    if failed_count > 5:  # More than 5 failed attempts\n        security_logger.log_event(\n            'suspicious_activity',\n            request=request,\n            severity='high',\n            description=f\"Brute force attack detected from IP: {ip_address}\",\n            additional_data={'failed_attempts': failed_count}\n        )\n\n@receiver(user_logged_out)\ndef log_user_logout(sender, request, user, **kwargs):\n    \"\"\"Log user logout\"\"\"\n    security_logger.log_event(\n        'logout',\n        request=request,\n        user=user,\n        severity='low',\n        description=f\"User {user.username} logged out\"\n    )\n",[1047,7936,7937,7942,7949,7956,7977,8011,8040,8056,8070,8084,8090,8094,8111,8120,8124,8133,8155,8177,8199,8221,8243,8265,8287,8309,8331,8353,8357,8361,8370,8392,8414,8436,8458,8462,8466,8499,8544,8592,8608,8631,8663,8667,8672,8686,8718,8722,8727,8758,8781,8812,8816,8839,8843,8851,8860,8896,8926,8957,8988,8993,8997,9009,9054,9058,9067,9076,9080,9092,9122,9126,9175,9196,9205,9209,9214,9251,9294,9340,9362,9383,9413,9417,9422,9467,9481,9485,9490,9510,9521,9532,9543,9554,9566,9577,9589,9605,9617,9629,9639,9643,9647,9652,9662,9682,9696,9710,9737,9763,9778,9803,9818,9836,9841,9845,9872,9902,9918,9945,9951,9978,9982,9987,10003,10019,10023,10030,10034,10051,10060,10088,10097,10125,10131,10158,10165,10169,10186,10195,10213,10229,10233,10257,10268,10273,10277,10293,10308,10323,10338,10353,10357,10392,10397,10401,10430,10439,10446,10453,10460,10472,10479,10489,10493,10497,10502,10513,10517,10522,10536,10545,10549,10565,10577,10590,10601,10612,10623,10634,10645,10656,10667,10671,10675,10691,10696,10711,10715,10720,10738,10742,10761,10773,10784,10795,10810,10834,10838,10842,10848,10852,10869,10878,10883,10920,10924,10941,10954,10965,10976,10987,11002,11025,11059,11064,11069,11073,11078,11093,11097,11114,11123,11142,11161,11165,11183,11187,11211,11242,11246,11262,11272,11282,11292,11306,11327,11348,11352,11356,11361,11375,11403,11412,11423,11434,11445,11457,11473,11499,11504,11509,11523,11552,11562,11595,11600,11611,11622,11633,11648,11670,11690,11695,11700,11706,11725,11746,11751,11771,11776,11800,11832,11837,11855,11867,11878,11890,11905,11927,11948,11953,11958,11972,12000,12010,12021,12032,12043,12054,12069,12093],{"__ignoreMap":1045},[1050,7938,7939],{"class":1052,"line":1053},[1050,7940,7941],{"class":1056},"# security/logging.py\n",[1050,7943,7944,7946],{"class":1052,"line":1060},[1050,7945,1064],{"class":1063},[1050,7947,7948],{"class":1067}," logging\n",[1050,7950,7951,7953],{"class":1052,"line":1071},[1050,7952,1064],{"class":1063},[1050,7954,7955],{"class":1067}," json\n",[1050,7957,7958,7960,7962,7964,7967,7969,7972,7974],{"class":1052,"line":1079},[1050,7959,1082],{"class":1063},[1050,7961,1106],{"class":1067},[1050,7963,1110],{"class":1109},[1050,7965,7966],{"class":1067},"utils",[1050,7968,1110],{"class":1109},[1050,7970,7971],{"class":1067},"deprecation ",[1050,7973,1064],{"class":1063},[1050,7975,7976],{"class":1067}," MiddlewareMixin\n",[1050,7978,7979,7981,7983,7985,7987,7989,7991,7993,7996,7998,8001,8003,8006,8008],{"class":1052,"line":1093},[1050,7980,1082],{"class":1063},[1050,7982,1106],{"class":1067},[1050,7984,1110],{"class":1109},[1050,7986,1113],{"class":1067},[1050,7988,1110],{"class":1109},[1050,7990,1118],{"class":1067},[1050,7992,1110],{"class":1109},[1050,7994,7995],{"class":1067},"signals ",[1050,7997,1064],{"class":1063},[1050,7999,8000],{"class":1067}," user_logged_in",[1050,8002,1285],{"class":1109},[1050,8004,8005],{"class":1067}," user_logged_out",[1050,8007,1285],{"class":1109},[1050,8009,8010],{"class":1067}," user_login_failed\n",[1050,8012,8013,8015,8017,8019,8022,8024,8026,8028,8030,8032,8035,8037],{"class":1052,"line":1101},[1050,8014,1082],{"class":1063},[1050,8016,1106],{"class":1067},[1050,8018,1110],{"class":1109},[1050,8020,8021],{"class":1067},"db",[1050,8023,1110],{"class":1109},[1050,8025,1225],{"class":1067},[1050,8027,1110],{"class":1109},[1050,8029,7995],{"class":1067},[1050,8031,1064],{"class":1063},[1050,8033,8034],{"class":1067}," post_save",[1050,8036,1285],{"class":1109},[1050,8038,8039],{"class":1067}," post_delete\n",[1050,8041,8042,8044,8046,8048,8051,8053],{"class":1052,"line":1131},[1050,8043,1082],{"class":1063},[1050,8045,1106],{"class":1067},[1050,8047,1110],{"class":1109},[1050,8049,8050],{"class":1067},"dispatch ",[1050,8052,1064],{"class":1063},[1050,8054,8055],{"class":1067}," receiver\n",[1050,8057,8058,8060,8062,8064,8066,8068],{"class":1052,"line":1148},[1050,8059,1082],{"class":1063},[1050,8061,1106],{"class":1067},[1050,8063,1110],{"class":1109},[1050,8065,1157],{"class":1067},[1050,8067,1064],{"class":1063},[1050,8069,1162],{"class":1067},[1050,8071,8072,8074,8076,8078,8080,8082],{"class":1052,"line":1165},[1050,8073,1082],{"class":1063},[1050,8075,1106],{"class":1067},[1050,8077,1110],{"class":1109},[1050,8079,1140],{"class":1067},[1050,8081,1064],{"class":1063},[1050,8083,1145],{"class":1067},[1050,8085,8086,8088],{"class":1052,"line":1187},[1050,8087,1064],{"class":1063},[1050,8089,1200],{"class":1067},[1050,8091,8092],{"class":1052,"line":1195},[1050,8093,1207],{"emptyLinePlaceholder":1206},[1050,8095,8096,8098,8101,8103,8105,8107,8109],{"class":1052,"line":1203},[1050,8097,1214],{"class":1213},[1050,8099,8100],{"class":1217}," SecurityEvent",[1050,8102,1221],{"class":1109},[1050,8104,1225],{"class":1224},[1050,8106,1110],{"class":1109},[1050,8108,1230],{"class":1224},[1050,8110,1233],{"class":1109},[1050,8112,8113,8115,8118],{"class":1052,"line":1210},[1050,8114,1240],{"class":1239},[1050,8116,8117],{"class":1243},"Security event logging",[1050,8119,1247],{"class":1239},[1050,8121,8122],{"class":1052,"line":1236},[1050,8123,1253],{"class":1067},[1050,8125,8126,8129,8131],{"class":1052,"line":1250},[1050,8127,8128],{"class":1259},"    EVENT_TYPES",[1050,8130,1263],{"class":1109},[1050,8132,1266],{"class":1109},[1050,8134,8135,8137,8139,8142,8144,8146,8148,8151,8153],{"class":1052,"line":1256},[1050,8136,1272],{"class":1109},[1050,8138,1276],{"class":1275},[1050,8140,8141],{"class":1279},"login_success",[1050,8143,1276],{"class":1275},[1050,8145,1285],{"class":1109},[1050,8147,1288],{"class":1275},[1050,8149,8150],{"class":1279},"Login Success",[1050,8152,1276],{"class":1275},[1050,8154,1296],{"class":1109},[1050,8156,8157,8159,8161,8164,8166,8168,8170,8173,8175],{"class":1052,"line":1269},[1050,8158,1272],{"class":1109},[1050,8160,1276],{"class":1275},[1050,8162,8163],{"class":1279},"login_failed",[1050,8165,1276],{"class":1275},[1050,8167,1285],{"class":1109},[1050,8169,1288],{"class":1275},[1050,8171,8172],{"class":1279},"Login Failed",[1050,8174,1276],{"class":1275},[1050,8176,1296],{"class":1109},[1050,8178,8179,8181,8183,8186,8188,8190,8192,8195,8197],{"class":1052,"line":1299},[1050,8180,1272],{"class":1109},[1050,8182,1276],{"class":1275},[1050,8184,8185],{"class":1279},"logout",[1050,8187,1276],{"class":1275},[1050,8189,1285],{"class":1109},[1050,8191,1288],{"class":1275},[1050,8193,8194],{"class":1279},"Logout",[1050,8196,1276],{"class":1275},[1050,8198,1296],{"class":1109},[1050,8200,8201,8203,8205,8208,8210,8212,8214,8217,8219],{"class":1052,"line":1322},[1050,8202,1272],{"class":1109},[1050,8204,1276],{"class":1275},[1050,8206,8207],{"class":1279},"permission_denied",[1050,8209,1276],{"class":1275},[1050,8211,1285],{"class":1109},[1050,8213,1288],{"class":1275},[1050,8215,8216],{"class":1279},"Permission Denied",[1050,8218,1276],{"class":1275},[1050,8220,1296],{"class":1109},[1050,8222,8223,8225,8227,8230,8232,8234,8236,8239,8241],{"class":1052,"line":1345},[1050,8224,1272],{"class":1109},[1050,8226,1276],{"class":1275},[1050,8228,8229],{"class":1279},"suspicious_activity",[1050,8231,1276],{"class":1275},[1050,8233,1285],{"class":1109},[1050,8235,1288],{"class":1275},[1050,8237,8238],{"class":1279},"Suspicious Activity",[1050,8240,1276],{"class":1275},[1050,8242,1296],{"class":1109},[1050,8244,8245,8247,8249,8252,8254,8256,8258,8261,8263],{"class":1052,"line":1368},[1050,8246,1272],{"class":1109},[1050,8248,1276],{"class":1275},[1050,8250,8251],{"class":1279},"data_access",[1050,8253,1276],{"class":1275},[1050,8255,1285],{"class":1109},[1050,8257,1288],{"class":1275},[1050,8259,8260],{"class":1279},"Data Access",[1050,8262,1276],{"class":1275},[1050,8264,1296],{"class":1109},[1050,8266,8267,8269,8271,8274,8276,8278,8280,8283,8285],{"class":1052,"line":1374},[1050,8268,1272],{"class":1109},[1050,8270,1276],{"class":1275},[1050,8272,8273],{"class":1279},"data_modification",[1050,8275,1276],{"class":1275},[1050,8277,1285],{"class":1109},[1050,8279,1288],{"class":1275},[1050,8281,8282],{"class":1279},"Data Modification",[1050,8284,1276],{"class":1275},[1050,8286,1296],{"class":1109},[1050,8288,8289,8291,8293,8296,8298,8300,8302,8305,8307],{"class":1052,"line":1379},[1050,8290,1272],{"class":1109},[1050,8292,1276],{"class":1275},[1050,8294,8295],{"class":1279},"admin_action",[1050,8297,1276],{"class":1275},[1050,8299,1285],{"class":1109},[1050,8301,1288],{"class":1275},[1050,8303,8304],{"class":1279},"Admin Action",[1050,8306,1276],{"class":1275},[1050,8308,1296],{"class":1109},[1050,8310,8311,8313,8315,8318,8320,8322,8324,8327,8329],{"class":1052,"line":1435},[1050,8312,1272],{"class":1109},[1050,8314,1276],{"class":1275},[1050,8316,8317],{"class":1279},"mfa_success",[1050,8319,1276],{"class":1275},[1050,8321,1285],{"class":1109},[1050,8323,1288],{"class":1275},[1050,8325,8326],{"class":1279},"MFA Success",[1050,8328,1276],{"class":1275},[1050,8330,1296],{"class":1109},[1050,8332,8333,8335,8337,8340,8342,8344,8346,8349,8351],{"class":1052,"line":1463},[1050,8334,1272],{"class":1109},[1050,8336,1276],{"class":1275},[1050,8338,8339],{"class":1279},"mfa_failed",[1050,8341,1276],{"class":1275},[1050,8343,1285],{"class":1109},[1050,8345,1288],{"class":1275},[1050,8347,8348],{"class":1279},"MFA Failed",[1050,8350,1276],{"class":1275},[1050,8352,1296],{"class":1109},[1050,8354,8355],{"class":1052,"line":1499},[1050,8356,1371],{"class":1109},[1050,8358,8359],{"class":1052,"line":1535},[1050,8360,1253],{"class":1067},[1050,8362,8363,8366,8368],{"class":1052,"line":1568},[1050,8364,8365],{"class":1259},"    SEVERITY_LEVELS",[1050,8367,1263],{"class":1109},[1050,8369,1266],{"class":1109},[1050,8371,8372,8374,8376,8379,8381,8383,8385,8388,8390],{"class":1052,"line":1594},[1050,8373,1272],{"class":1109},[1050,8375,1276],{"class":1275},[1050,8377,8378],{"class":1279},"low",[1050,8380,1276],{"class":1275},[1050,8382,1285],{"class":1109},[1050,8384,1288],{"class":1275},[1050,8386,8387],{"class":1279},"Low",[1050,8389,1276],{"class":1275},[1050,8391,1296],{"class":1109},[1050,8393,8394,8396,8398,8401,8403,8405,8407,8410,8412],{"class":1052,"line":1630},[1050,8395,1272],{"class":1109},[1050,8397,1276],{"class":1275},[1050,8399,8400],{"class":1279},"medium",[1050,8402,1276],{"class":1275},[1050,8404,1285],{"class":1109},[1050,8406,1288],{"class":1275},[1050,8408,8409],{"class":1279},"Medium",[1050,8411,1276],{"class":1275},[1050,8413,1296],{"class":1109},[1050,8415,8416,8418,8420,8423,8425,8427,8429,8432,8434],{"class":1052,"line":1655},[1050,8417,1272],{"class":1109},[1050,8419,1276],{"class":1275},[1050,8421,8422],{"class":1279},"high",[1050,8424,1276],{"class":1275},[1050,8426,1285],{"class":1109},[1050,8428,1288],{"class":1275},[1050,8430,8431],{"class":1279},"High",[1050,8433,1276],{"class":1275},[1050,8435,1296],{"class":1109},[1050,8437,8438,8440,8442,8445,8447,8449,8451,8454,8456],{"class":1052,"line":1689},[1050,8439,1272],{"class":1109},[1050,8441,1276],{"class":1275},[1050,8443,8444],{"class":1279},"critical",[1050,8446,1276],{"class":1275},[1050,8448,1285],{"class":1109},[1050,8450,1288],{"class":1275},[1050,8452,8453],{"class":1279},"Critical",[1050,8455,1276],{"class":1275},[1050,8457,1296],{"class":1109},[1050,8459,8460],{"class":1052,"line":1714},[1050,8461,1371],{"class":1109},[1050,8463,8464],{"class":1052,"line":1719},[1050,8465,1253],{"class":1067},[1050,8467,8468,8471,8473,8475,8477,8479,8481,8483,8485,8488,8490,8492,8494,8497],{"class":1052,"line":1731},[1050,8469,8470],{"class":1067},"    event_type ",[1050,8472,1385],{"class":1109},[1050,8474,1388],{"class":1067},[1050,8476,1110],{"class":1109},[1050,8478,1447],{"class":1393},[1050,8480,1221],{"class":1109},[1050,8482,1452],{"class":1404},[1050,8484,1385],{"class":1109},[1050,8486,8487],{"class":1457},"50",[1050,8489,1285],{"class":1109},[1050,8491,1488],{"class":1404},[1050,8493,1385],{"class":1109},[1050,8495,8496],{"class":1493},"EVENT_TYPES",[1050,8498,1432],{"class":1109},[1050,8500,8501,8504,8506,8508,8510,8512,8514,8516,8518,8520,8522,8524,8526,8529,8531,8534,8536,8538,8540,8542],{"class":1052,"line":1761},[1050,8502,8503],{"class":1067},"    severity ",[1050,8505,1385],{"class":1109},[1050,8507,1388],{"class":1067},[1050,8509,1110],{"class":1109},[1050,8511,1447],{"class":1393},[1050,8513,1221],{"class":1109},[1050,8515,1452],{"class":1404},[1050,8517,1385],{"class":1109},[1050,8519,1483],{"class":1457},[1050,8521,1285],{"class":1109},[1050,8523,1488],{"class":1404},[1050,8525,1385],{"class":1109},[1050,8527,8528],{"class":1493},"SEVERITY_LEVELS",[1050,8530,1285],{"class":1109},[1050,8532,8533],{"class":1404}," default",[1050,8535,1385],{"class":1109},[1050,8537,1276],{"class":1275},[1050,8539,8400],{"class":1279},[1050,8541,1276],{"class":1275},[1050,8543,1432],{"class":1109},[1050,8545,8546,8548,8550,8552,8554,8556,8558,8560,8562,8564,8566,8568,8570,8573,8575,8578,8580,8582,8584,8586,8588,8590],{"class":1052,"line":1766},[1050,8547,1382],{"class":1067},[1050,8549,1385],{"class":1109},[1050,8551,1388],{"class":1067},[1050,8553,1110],{"class":1109},[1050,8555,1394],{"class":1393},[1050,8557,1221],{"class":1109},[1050,8559,1399],{"class":1393},[1050,8561,1285],{"class":1109},[1050,8563,1405],{"class":1404},[1050,8565,1385],{"class":1109},[1050,8567,1225],{"class":1393},[1050,8569,1110],{"class":1109},[1050,8571,8572],{"class":1414},"SET_NULL",[1050,8574,1285],{"class":1109},[1050,8576,8577],{"class":1404}," null",[1050,8579,1385],{"class":1109},[1050,8581,1530],{"class":1529},[1050,8583,1285],{"class":1109},[1050,8585,1524],{"class":1404},[1050,8587,1385],{"class":1109},[1050,8589,1530],{"class":1529},[1050,8591,1432],{"class":1109},[1050,8593,8594,8597,8599,8601,8603,8606],{"class":1052,"line":1784},[1050,8595,8596],{"class":1067},"    ip_address ",[1050,8598,1385],{"class":1109},[1050,8600,1388],{"class":1067},[1050,8602,1110],{"class":1109},[1050,8604,8605],{"class":1393},"GenericIPAddressField",[1050,8607,1843],{"class":1109},[1050,8609,8610,8613,8615,8617,8619,8621,8623,8625,8627,8629],{"class":1052,"line":1795},[1050,8611,8612],{"class":1067},"    user_agent ",[1050,8614,1385],{"class":1109},[1050,8616,1388],{"class":1067},[1050,8618,1110],{"class":1109},[1050,8620,4883],{"class":1393},[1050,8622,1221],{"class":1109},[1050,8624,1585],{"class":1404},[1050,8626,1385],{"class":1109},[1050,8628,1530],{"class":1529},[1050,8630,1432],{"class":1109},[1050,8632,8633,8636,8638,8640,8642,8644,8646,8648,8650,8653,8655,8657,8659,8661],{"class":1052,"line":1822},[1050,8634,8635],{"class":1067},"    session_key ",[1050,8637,1385],{"class":1109},[1050,8639,1388],{"class":1067},[1050,8641,1110],{"class":1109},[1050,8643,1447],{"class":1393},[1050,8645,1221],{"class":1109},[1050,8647,1452],{"class":1404},[1050,8649,1385],{"class":1109},[1050,8651,8652],{"class":1457},"40",[1050,8654,1285],{"class":1109},[1050,8656,1524],{"class":1404},[1050,8658,1385],{"class":1109},[1050,8660,1530],{"class":1529},[1050,8662,1432],{"class":1109},[1050,8664,8665],{"class":1052,"line":1846},[1050,8666,1253],{"class":1067},[1050,8668,8669],{"class":1052,"line":1858},[1050,8670,8671],{"class":1056},"    # Event details\n",[1050,8673,8674,8676,8678,8680,8682,8684],{"class":1052,"line":1863},[1050,8675,4874],{"class":1067},[1050,8677,1385],{"class":1109},[1050,8679,1388],{"class":1067},[1050,8681,1110],{"class":1109},[1050,8683,4883],{"class":1393},[1050,8685,1843],{"class":1109},[1050,8687,8688,8691,8693,8695,8697,8699,8701,8703,8705,8708,8710,8712,8714,8716],{"class":1052,"line":1877},[1050,8689,8690],{"class":1067},"    additional_data ",[1050,8692,1385],{"class":1109},[1050,8694,1388],{"class":1067},[1050,8696,1110],{"class":1109},[1050,8698,1606],{"class":1393},[1050,8700,1221],{"class":1109},[1050,8702,1611],{"class":1404},[1050,8704,1385],{"class":1109},[1050,8706,8707],{"class":1616},"dict",[1050,8709,1285],{"class":1109},[1050,8711,1524],{"class":1404},[1050,8713,1385],{"class":1109},[1050,8715,1530],{"class":1529},[1050,8717,1432],{"class":1109},[1050,8719,8720],{"class":1052,"line":1887},[1050,8721,1253],{"class":1067},[1050,8723,8724],{"class":1052,"line":1921},[1050,8725,8726],{"class":1056},"    # Request details\n",[1050,8728,8729,8732,8734,8736,8738,8740,8742,8744,8746,8748,8750,8752,8754,8756],{"class":1052,"line":1930},[1050,8730,8731],{"class":1067},"    request_method ",[1050,8733,1385],{"class":1109},[1050,8735,1388],{"class":1067},[1050,8737,1110],{"class":1109},[1050,8739,1447],{"class":1393},[1050,8741,1221],{"class":1109},[1050,8743,1452],{"class":1404},[1050,8745,1385],{"class":1109},[1050,8747,1483],{"class":1457},[1050,8749,1285],{"class":1109},[1050,8751,1524],{"class":1404},[1050,8753,1385],{"class":1109},[1050,8755,1530],{"class":1529},[1050,8757,1432],{"class":1109},[1050,8759,8760,8763,8765,8767,8769,8771,8773,8775,8777,8779],{"class":1052,"line":1936},[1050,8761,8762],{"class":1067},"    request_path ",[1050,8764,1385],{"class":1109},[1050,8766,1388],{"class":1067},[1050,8768,1110],{"class":1109},[1050,8770,4883],{"class":1393},[1050,8772,1221],{"class":1109},[1050,8774,1585],{"class":1404},[1050,8776,1385],{"class":1109},[1050,8778,1530],{"class":1529},[1050,8780,1432],{"class":1109},[1050,8782,8783,8786,8788,8790,8792,8794,8796,8798,8800,8802,8804,8806,8808,8810],{"class":1052,"line":1961},[1050,8784,8785],{"class":1067},"    request_params ",[1050,8787,1385],{"class":1109},[1050,8789,1388],{"class":1067},[1050,8791,1110],{"class":1109},[1050,8793,1606],{"class":1393},[1050,8795,1221],{"class":1109},[1050,8797,1611],{"class":1404},[1050,8799,1385],{"class":1109},[1050,8801,8707],{"class":1616},[1050,8803,1285],{"class":1109},[1050,8805,1524],{"class":1404},[1050,8807,1385],{"class":1109},[1050,8809,1530],{"class":1529},[1050,8811,1432],{"class":1109},[1050,8813,8814],{"class":1052,"line":1980},[1050,8815,1253],{"class":1067},[1050,8817,8818,8821,8823,8825,8827,8829,8831,8833,8835,8837],{"class":1052,"line":2001},[1050,8819,8820],{"class":1067},"    timestamp ",[1050,8822,1385],{"class":1109},[1050,8824,1388],{"class":1067},[1050,8826,1110],{"class":1109},[1050,8828,1667],{"class":1393},[1050,8830,1221],{"class":1109},[1050,8832,1705],{"class":1404},[1050,8834,1385],{"class":1109},[1050,8836,1530],{"class":1529},[1050,8838,1432],{"class":1109},[1050,8840,8841],{"class":1052,"line":2018},[1050,8842,1253],{"class":1067},[1050,8844,8845,8847,8849],{"class":1052,"line":2024},[1050,8846,1722],{"class":1213},[1050,8848,1725],{"class":1217},[1050,8850,1728],{"class":1109},[1050,8852,8853,8856,8858],{"class":1052,"line":2029},[1050,8854,8855],{"class":1067},"        indexes ",[1050,8857,1385],{"class":1109},[1050,8859,1266],{"class":1109},[1050,8861,8862,8864,8866,8869,8871,8874,8877,8879,8882,8884,8886,8888,8891,8893],{"class":1052,"line":2076},[1050,8863,6594],{"class":1067},[1050,8865,1110],{"class":1109},[1050,8867,8868],{"class":1393},"Index",[1050,8870,1221],{"class":1109},[1050,8872,8873],{"class":1404},"fields",[1050,8875,8876],{"class":1109},"=[",[1050,8878,1276],{"class":1275},[1050,8880,8881],{"class":1279},"event_type",[1050,8883,1276],{"class":1275},[1050,8885,1285],{"class":1109},[1050,8887,1288],{"class":1275},[1050,8889,8890],{"class":1279},"timestamp",[1050,8892,1276],{"class":1275},[1050,8894,8895],{"class":1109},"]),\n",[1050,8897,8898,8900,8902,8904,8906,8908,8910,8912,8914,8916,8918,8920,8922,8924],{"class":1052,"line":2093},[1050,8899,6594],{"class":1067},[1050,8901,1110],{"class":1109},[1050,8903,8868],{"class":1393},[1050,8905,1221],{"class":1109},[1050,8907,8873],{"class":1404},[1050,8909,8876],{"class":1109},[1050,8911,1276],{"class":1275},[1050,8913,1744],{"class":1279},[1050,8915,1276],{"class":1275},[1050,8917,1285],{"class":1109},[1050,8919,1288],{"class":1275},[1050,8921,8890],{"class":1279},[1050,8923,1276],{"class":1275},[1050,8925,8895],{"class":1109},[1050,8927,8928,8930,8932,8934,8936,8938,8940,8942,8945,8947,8949,8951,8953,8955],{"class":1052,"line":2114},[1050,8929,6594],{"class":1067},[1050,8931,1110],{"class":1109},[1050,8933,8868],{"class":1393},[1050,8935,1221],{"class":1109},[1050,8937,8873],{"class":1404},[1050,8939,8876],{"class":1109},[1050,8941,1276],{"class":1275},[1050,8943,8944],{"class":1279},"ip_address",[1050,8946,1276],{"class":1275},[1050,8948,1285],{"class":1109},[1050,8950,1288],{"class":1275},[1050,8952,8890],{"class":1279},[1050,8954,1276],{"class":1275},[1050,8956,8895],{"class":1109},[1050,8958,8959,8961,8963,8965,8967,8969,8971,8973,8976,8978,8980,8982,8984,8986],{"class":1052,"line":2119},[1050,8960,6594],{"class":1067},[1050,8962,1110],{"class":1109},[1050,8964,8868],{"class":1393},[1050,8966,1221],{"class":1109},[1050,8968,8873],{"class":1404},[1050,8970,8876],{"class":1109},[1050,8972,1276],{"class":1275},[1050,8974,8975],{"class":1279},"severity",[1050,8977,1276],{"class":1275},[1050,8979,1285],{"class":1109},[1050,8981,1288],{"class":1275},[1050,8983,8890],{"class":1279},[1050,8985,1276],{"class":1275},[1050,8987,8895],{"class":1109},[1050,8989,8990],{"class":1052,"line":2165},[1050,8991,8992],{"class":1109},"        ]\n",[1050,8994,8995],{"class":1052,"line":2178},[1050,8996,1253],{"class":1067},[1050,8998,8999,9001,9003,9005,9007],{"class":1052,"line":2209},[1050,9000,1769],{"class":1213},[1050,9002,4948],{"class":3101},[1050,9004,1221],{"class":1109},[1050,9006,1779],{"class":1778},[1050,9008,1233],{"class":1109},[1050,9010,9011,9013,9015,9017,9019,9021,9023,9025,9027,9030,9032,9034,9036,9038,9040,9042,9044,9046,9048,9050,9052],{"class":1052,"line":2214},[1050,9012,2217],{"class":1063},[1050,9014,2593],{"class":1213},[1050,9016,2009],{"class":1279},[1050,9018,2600],{"class":2599},[1050,9020,1779],{"class":1259},[1050,9022,1110],{"class":1109},[1050,9024,8881],{"class":1806},[1050,9026,2610],{"class":2599},[1050,9028,9029],{"class":1279}," - ",[1050,9031,2600],{"class":2599},[1050,9033,1779],{"class":1259},[1050,9035,1110],{"class":1109},[1050,9037,1744],{"class":1806},[1050,9039,2610],{"class":2599},[1050,9041,9029],{"class":1279},[1050,9043,2600],{"class":2599},[1050,9045,1779],{"class":1259},[1050,9047,1110],{"class":1109},[1050,9049,8890],{"class":1806},[1050,9051,2610],{"class":2599},[1050,9053,2015],{"class":1279},[1050,9055,9056],{"class":1052,"line":2245},[1050,9057,1207],{"emptyLinePlaceholder":1206},[1050,9059,9060,9062,9065],{"class":1052,"line":2250},[1050,9061,1214],{"class":1213},[1050,9063,9064],{"class":1217}," SecurityLogger",[1050,9066,1728],{"class":1109},[1050,9068,9069,9071,9074],{"class":1052,"line":2270},[1050,9070,1240],{"class":1239},[1050,9072,9073],{"class":1243},"Centralized security logging",[1050,9075,1247],{"class":1239},[1050,9077,9078],{"class":1052,"line":2280},[1050,9079,1253],{"class":1067},[1050,9081,9082,9084,9086,9088,9090],{"class":1052,"line":2296},[1050,9083,1769],{"class":1213},[1050,9085,4387],{"class":3101},[1050,9087,1221],{"class":1109},[1050,9089,1779],{"class":1778},[1050,9091,1233],{"class":1109},[1050,9093,9094,9096,9098,9101,9103,9106,9108,9111,9113,9115,9118,9120],{"class":1052,"line":2304},[1050,9095,3166],{"class":1259},[1050,9097,1110],{"class":1109},[1050,9099,9100],{"class":1806},"logger",[1050,9102,1263],{"class":1109},[1050,9104,9105],{"class":1067}," logging",[1050,9107,1110],{"class":1109},[1050,9109,9110],{"class":1393},"getLogger",[1050,9112,1221],{"class":1109},[1050,9114,1276],{"class":1275},[1050,9116,9117],{"class":1279},"security",[1050,9119,1276],{"class":1275},[1050,9121,1432],{"class":1109},[1050,9123,9124],{"class":1052,"line":2309},[1050,9125,1253],{"class":1067},[1050,9127,9128,9130,9133,9135,9137,9139,9142,9144,9146,9148,9150,9152,9154,9156,9158,9160,9163,9165,9167,9169,9171,9173],{"class":1052,"line":2330},[1050,9129,1769],{"class":1213},[1050,9131,9132],{"class":1772}," log_event",[1050,9134,1221],{"class":1109},[1050,9136,1779],{"class":1778},[1050,9138,1285],{"class":1109},[1050,9140,9141],{"class":2264}," event_type",[1050,9143,1285],{"class":1109},[1050,9145,3756],{"class":2264},[1050,9147,1385],{"class":1810},[1050,9149,3766],{"class":1529},[1050,9151,1285],{"class":1109},[1050,9153,3881],{"class":2264},[1050,9155,1385],{"class":1810},[1050,9157,3766],{"class":1529},[1050,9159,1285],{"class":1109},[1050,9161,9162],{"class":2264}," severity",[1050,9164,1385],{"class":1810},[1050,9166,1276],{"class":1275},[1050,9168,8400],{"class":1279},[1050,9170,1276],{"class":1275},[1050,9172,1285],{"class":1109},[1050,9174,4483],{"class":1067},[1050,9176,9177,9180,9182,9185,9187,9190,9192,9194],{"class":1052,"line":2349},[1050,9178,9179],{"class":2264},"                  description",[1050,9181,1385],{"class":1810},[1050,9183,9184],{"class":1275},"''",[1050,9186,1285],{"class":1109},[1050,9188,9189],{"class":2264}," additional_data",[1050,9191,1385],{"class":1810},[1050,9193,3766],{"class":1529},[1050,9195,1233],{"class":1109},[1050,9197,9198,9200,9203],{"class":1052,"line":2371},[1050,9199,1787],{"class":1239},[1050,9201,9202],{"class":1243},"Log security event",[1050,9204,1247],{"class":1239},[1050,9206,9207],{"class":1052,"line":2389},[1050,9208,1933],{"class":1067},[1050,9210,9211],{"class":1052,"line":2422},[1050,9212,9213],{"class":1056},"        # Extract request information\n",[1050,9215,9216,9219,9221,9223,9225,9228,9230,9232,9234,9237,9240,9243,9245,9248],{"class":1052,"line":2440},[1050,9217,9218],{"class":1067},"        ip_address ",[1050,9220,1385],{"class":1109},[1050,9222,1801],{"class":1259},[1050,9224,1110],{"class":1109},[1050,9226,9227],{"class":1393},"_get_client_ip",[1050,9229,1221],{"class":1109},[1050,9231,3851],{"class":1393},[1050,9233,2684],{"class":1109},[1050,9235,9236],{"class":1063}," if",[1050,9238,9239],{"class":1067}," request ",[1050,9241,9242],{"class":1063},"else",[1050,9244,1288],{"class":1275},[1050,9246,9247],{"class":1279},"127.0.0.1",[1050,9249,9250],{"class":1275},"'\n",[1050,9252,9253,9256,9258,9260,9262,9265,9267,9269,9271,9273,9276,9278,9280,9283,9285,9287,9289,9291],{"class":1052,"line":2445},[1050,9254,9255],{"class":1067},"        user_agent ",[1050,9257,1385],{"class":1109},[1050,9259,3756],{"class":1067},[1050,9261,1110],{"class":1109},[1050,9263,9264],{"class":1414},"META",[1050,9266,1110],{"class":1109},[1050,9268,2635],{"class":1393},[1050,9270,1221],{"class":1109},[1050,9272,1276],{"class":1275},[1050,9274,9275],{"class":1279},"HTTP_USER_AGENT",[1050,9277,1276],{"class":1275},[1050,9279,1285],{"class":1109},[1050,9281,9282],{"class":1275}," ''",[1050,9284,2684],{"class":1109},[1050,9286,9236],{"class":1063},[1050,9288,9239],{"class":1067},[1050,9290,9242],{"class":1063},[1050,9292,9293],{"class":1275}," ''\n",[1050,9295,9296,9299,9301,9303,9305,9307,9309,9312,9314,9316,9318,9321,9323,9325,9327,9329,9331,9333,9335,9338],{"class":1052,"line":2452},[1050,9297,9298],{"class":1067},"        session_key ",[1050,9300,1385],{"class":1109},[1050,9302,3756],{"class":1067},[1050,9304,1110],{"class":1109},[1050,9306,4686],{"class":1806},[1050,9308,1110],{"class":1109},[1050,9310,9311],{"class":1806},"session_key",[1050,9313,9236],{"class":1063},[1050,9315,9239],{"class":1067},[1050,9317,2964],{"class":1810},[1050,9319,9320],{"class":3101}," hasattr",[1050,9322,1221],{"class":1109},[1050,9324,3851],{"class":1393},[1050,9326,1285],{"class":1109},[1050,9328,1288],{"class":1275},[1050,9330,4686],{"class":1279},[1050,9332,1276],{"class":1275},[1050,9334,2684],{"class":1109},[1050,9336,9337],{"class":1063}," else",[1050,9339,9293],{"class":1275},[1050,9341,9342,9345,9347,9349,9351,9354,9356,9358,9360],{"class":1052,"line":2457},[1050,9343,9344],{"class":1067},"        request_method ",[1050,9346,1385],{"class":1109},[1050,9348,3756],{"class":1067},[1050,9350,1110],{"class":1109},[1050,9352,9353],{"class":1806},"method",[1050,9355,9236],{"class":1063},[1050,9357,9239],{"class":1067},[1050,9359,9242],{"class":1063},[1050,9361,9293],{"class":1275},[1050,9363,9364,9367,9369,9371,9373,9375,9377,9379,9381],{"class":1052,"line":2475},[1050,9365,9366],{"class":1067},"        request_path ",[1050,9368,1385],{"class":1109},[1050,9370,3756],{"class":1067},[1050,9372,1110],{"class":1109},[1050,9374,4573],{"class":1806},[1050,9376,9236],{"class":1063},[1050,9378,9239],{"class":1067},[1050,9380,9242],{"class":1063},[1050,9382,9293],{"class":1275},[1050,9384,9385,9388,9390,9393,9395,9397,9399,9402,9404,9406,9408,9410],{"class":1052,"line":2485},[1050,9386,9387],{"class":1067},"        request_params ",[1050,9389,1385],{"class":1109},[1050,9391,9392],{"class":1616}," dict",[1050,9394,1221],{"class":1109},[1050,9396,3851],{"class":1393},[1050,9398,1110],{"class":1109},[1050,9400,9401],{"class":1414},"GET",[1050,9403,2684],{"class":1109},[1050,9405,9236],{"class":1063},[1050,9407,9239],{"class":1067},[1050,9409,9242],{"class":1063},[1050,9411,9412],{"class":1109}," {}\n",[1050,9414,9415],{"class":1052,"line":2508},[1050,9416,1933],{"class":1067},[1050,9418,9419],{"class":1052,"line":2513},[1050,9420,9421],{"class":1056},"        # Use request user if not provided\n",[1050,9423,9424,9426,9428,9431,9433,9435,9437,9439,9441,9443,9445,9447,9449,9451,9453,9455,9457,9459,9461,9463,9465],{"class":1052,"line":2519},[1050,9425,1798],{"class":1063},[1050,9427,1910],{"class":1810},[1050,9429,9430],{"class":1067}," user ",[1050,9432,2964],{"class":1810},[1050,9434,9239],{"class":1067},[1050,9436,2964],{"class":1810},[1050,9438,9320],{"class":3101},[1050,9440,1221],{"class":1109},[1050,9442,3851],{"class":1393},[1050,9444,1285],{"class":1109},[1050,9446,1288],{"class":1275},[1050,9448,1744],{"class":1279},[1050,9450,1276],{"class":1275},[1050,9452,2684],{"class":1109},[1050,9454,4480],{"class":1810},[1050,9456,3756],{"class":1067},[1050,9458,1110],{"class":1109},[1050,9460,1744],{"class":1806},[1050,9462,1110],{"class":1109},[1050,9464,4477],{"class":1806},[1050,9466,1728],{"class":1109},[1050,9468,9469,9472,9474,9476,9478],{"class":1052,"line":2550},[1050,9470,9471],{"class":1067},"            user ",[1050,9473,1385],{"class":1109},[1050,9475,3756],{"class":1067},[1050,9477,1110],{"class":1109},[1050,9479,9480],{"class":1806},"user\n",[1050,9482,9483],{"class":1052,"line":2579},[1050,9484,1933],{"class":1067},[1050,9486,9487],{"class":1052,"line":2585},[1050,9488,9489],{"class":1056},"        # Create security event\n",[1050,9491,9492,9495,9497,9499,9501,9503,9505,9508],{"class":1052,"line":2624},[1050,9493,9494],{"class":1067},"        event ",[1050,9496,1385],{"class":1109},[1050,9498,8100],{"class":1067},[1050,9500,1110],{"class":1109},[1050,9502,4305],{"class":1806},[1050,9504,1110],{"class":1109},[1050,9506,9507],{"class":1393},"create",[1050,9509,1977],{"class":1109},[1050,9511,9512,9515,9517,9519],{"class":1052,"line":2645},[1050,9513,9514],{"class":1404},"            event_type",[1050,9516,1385],{"class":1109},[1050,9518,8881],{"class":1393},[1050,9520,1998],{"class":1109},[1050,9522,9523,9526,9528,9530],{"class":1052,"line":2653},[1050,9524,9525],{"class":1404},"            severity",[1050,9527,1385],{"class":1109},[1050,9529,8975],{"class":1393},[1050,9531,1998],{"class":1109},[1050,9533,9534,9537,9539,9541],{"class":1052,"line":2659},[1050,9535,9536],{"class":1404},"            user",[1050,9538,1385],{"class":1109},[1050,9540,1744],{"class":1393},[1050,9542,1998],{"class":1109},[1050,9544,9545,9548,9550,9552],{"class":1052,"line":2690},[1050,9546,9547],{"class":1404},"            ip_address",[1050,9549,1385],{"class":1109},[1050,9551,8944],{"class":1393},[1050,9553,1998],{"class":1109},[1050,9555,9556,9559,9561,9564],{"class":1052,"line":2713},[1050,9557,9558],{"class":1404},"            user_agent",[1050,9560,1385],{"class":1109},[1050,9562,9563],{"class":1393},"user_agent",[1050,9565,1998],{"class":1109},[1050,9567,9568,9571,9573,9575],{"class":1052,"line":2724},[1050,9569,9570],{"class":1404},"            session_key",[1050,9572,1385],{"class":1109},[1050,9574,9311],{"class":1393},[1050,9576,1998],{"class":1109},[1050,9578,9579,9582,9584,9587],{"class":1052,"line":2733},[1050,9580,9581],{"class":1404},"            description",[1050,9583,1385],{"class":1109},[1050,9585,9586],{"class":1393},"description",[1050,9588,1998],{"class":1109},[1050,9590,9591,9594,9596,9599,9602],{"class":1052,"line":2738},[1050,9592,9593],{"class":1404},"            additional_data",[1050,9595,1385],{"class":1109},[1050,9597,9598],{"class":1393},"additional_data ",[1050,9600,9601],{"class":1063},"or",[1050,9603,9604],{"class":1109}," {},\n",[1050,9606,9607,9610,9612,9615],{"class":1052,"line":2745},[1050,9608,9609],{"class":1404},"            request_method",[1050,9611,1385],{"class":1109},[1050,9613,9614],{"class":1393},"request_method",[1050,9616,1998],{"class":1109},[1050,9618,9619,9622,9624,9627],{"class":1052,"line":2750},[1050,9620,9621],{"class":1404},"            request_path",[1050,9623,1385],{"class":1109},[1050,9625,9626],{"class":1393},"request_path",[1050,9628,1998],{"class":1109},[1050,9630,9631,9634,9636],{"class":1052,"line":2769},[1050,9632,9633],{"class":1404},"            request_params",[1050,9635,1385],{"class":1109},[1050,9637,9638],{"class":1393},"request_params\n",[1050,9640,9641],{"class":1052,"line":2779},[1050,9642,2021],{"class":1109},[1050,9644,9645],{"class":1052,"line":2798},[1050,9646,1933],{"class":1067},[1050,9648,9649],{"class":1052,"line":2804},[1050,9650,9651],{"class":1056},"        # Log to file/external system\n",[1050,9653,9654,9657,9659],{"class":1052,"line":2824},[1050,9655,9656],{"class":1067},"        log_data ",[1050,9658,1385],{"class":1109},[1050,9660,9661],{"class":1109}," {\n",[1050,9663,9664,9666,9669,9671,9673,9676,9678,9680],{"class":1052,"line":2843},[1050,9665,3619],{"class":1275},[1050,9667,9668],{"class":1279},"event_id",[1050,9670,1276],{"class":1275},[1050,9672,2613],{"class":1109},[1050,9674,9675],{"class":1067}," event",[1050,9677,1110],{"class":1109},[1050,9679,2607],{"class":1806},[1050,9681,1998],{"class":1109},[1050,9683,9684,9686,9688,9690,9692,9694],{"class":1052,"line":2854},[1050,9685,3619],{"class":1275},[1050,9687,8881],{"class":1279},[1050,9689,1276],{"class":1275},[1050,9691,2613],{"class":1109},[1050,9693,9141],{"class":1067},[1050,9695,1998],{"class":1109},[1050,9697,9698,9700,9702,9704,9706,9708],{"class":1052,"line":2861},[1050,9699,3619],{"class":1275},[1050,9701,8975],{"class":1279},[1050,9703,1276],{"class":1275},[1050,9705,2613],{"class":1109},[1050,9707,9162],{"class":1067},[1050,9709,1998],{"class":1109},[1050,9711,9712,9714,9716,9718,9720,9722,9724,9726,9728,9730,9732,9735],{"class":1052,"line":2866},[1050,9713,3619],{"class":1275},[1050,9715,4319],{"class":1279},[1050,9717,1276],{"class":1275},[1050,9719,2613],{"class":1109},[1050,9721,3881],{"class":1067},[1050,9723,1110],{"class":1109},[1050,9725,2607],{"class":1806},[1050,9727,9236],{"class":1063},[1050,9729,9430],{"class":1067},[1050,9731,9242],{"class":1063},[1050,9733,9734],{"class":1529}," None",[1050,9736,1998],{"class":1109},[1050,9738,9739,9741,9743,9745,9747,9749,9751,9753,9755,9757,9759,9761],{"class":1052,"line":2873},[1050,9740,3619],{"class":1275},[1050,9742,3860],{"class":1279},[1050,9744,1276],{"class":1275},[1050,9746,2613],{"class":1109},[1050,9748,3881],{"class":1067},[1050,9750,1110],{"class":1109},[1050,9752,3860],{"class":1806},[1050,9754,9236],{"class":1063},[1050,9756,9430],{"class":1067},[1050,9758,9242],{"class":1063},[1050,9760,9734],{"class":1529},[1050,9762,1998],{"class":1109},[1050,9764,9765,9767,9769,9771,9773,9776],{"class":1052,"line":2878},[1050,9766,3619],{"class":1275},[1050,9768,8944],{"class":1279},[1050,9770,1276],{"class":1275},[1050,9772,2613],{"class":1109},[1050,9774,9775],{"class":1067}," ip_address",[1050,9777,1998],{"class":1109},[1050,9779,9780,9782,9784,9786,9788,9790,9792,9794,9797,9800],{"class":1052,"line":2896},[1050,9781,3619],{"class":1275},[1050,9783,8890],{"class":1279},[1050,9785,1276],{"class":1275},[1050,9787,2613],{"class":1109},[1050,9789,2703],{"class":1067},[1050,9791,1110],{"class":1109},[1050,9793,2708],{"class":1393},[1050,9795,9796],{"class":1109},"().",[1050,9798,9799],{"class":1393},"isoformat",[1050,9801,9802],{"class":1109},"(),\n",[1050,9804,9805,9807,9809,9811,9813,9816],{"class":1052,"line":2906},[1050,9806,3619],{"class":1275},[1050,9808,9586],{"class":1279},[1050,9810,1276],{"class":1275},[1050,9812,2613],{"class":1109},[1050,9814,9815],{"class":1067}," description",[1050,9817,1998],{"class":1109},[1050,9819,9820,9822,9825,9827,9829,9832,9834],{"class":1052,"line":2931},[1050,9821,3619],{"class":1275},[1050,9823,9824],{"class":1279},"additional_data",[1050,9826,1276],{"class":1275},[1050,9828,2613],{"class":1109},[1050,9830,9831],{"class":1067}," additional_data ",[1050,9833,9601],{"class":1810},[1050,9835,9412],{"class":1109},[1050,9837,9838],{"class":1052,"line":2951},[1050,9839,9840],{"class":1109},"        }\n",[1050,9842,9843],{"class":1052,"line":2956},[1050,9844,1933],{"class":1067},[1050,9846,9847,9849,9852,9854,9856,9858,9860,9862,9864,9866,9868,9870],{"class":1052,"line":2976},[1050,9848,1798],{"class":1063},[1050,9850,9851],{"class":1067}," severity ",[1050,9853,2528],{"class":1810},[1050,9855,1739],{"class":1109},[1050,9857,1276],{"class":1275},[1050,9859,8422],{"class":1279},[1050,9861,1276],{"class":1275},[1050,9863,1285],{"class":1109},[1050,9865,1288],{"class":1275},[1050,9867,8444],{"class":1279},[1050,9869,1276],{"class":1275},[1050,9871,2419],{"class":1109},[1050,9873,9874,9876,9878,9880,9882,9884,9886,9889,9891,9894,9896,9899],{"class":1052,"line":2993},[1050,9875,1825],{"class":1259},[1050,9877,1110],{"class":1109},[1050,9879,9100],{"class":1806},[1050,9881,1110],{"class":1109},[1050,9883,8444],{"class":1393},[1050,9885,1221],{"class":1109},[1050,9887,9888],{"class":1393},"json",[1050,9890,1110],{"class":1109},[1050,9892,9893],{"class":1393},"dumps",[1050,9895,1221],{"class":1109},[1050,9897,9898],{"class":1393},"log_data",[1050,9900,9901],{"class":1109},"))\n",[1050,9903,9904,9906,9908,9910,9912,9914,9916],{"class":1052,"line":3012},[1050,9905,2352],{"class":1063},[1050,9907,9851],{"class":1067},[1050,9909,2969],{"class":1810},[1050,9911,1288],{"class":1275},[1050,9913,8400],{"class":1279},[1050,9915,1276],{"class":1275},[1050,9917,1728],{"class":1109},[1050,9919,9920,9922,9924,9926,9928,9931,9933,9935,9937,9939,9941,9943],{"class":1052,"line":3023},[1050,9921,1825],{"class":1259},[1050,9923,1110],{"class":1109},[1050,9925,9100],{"class":1806},[1050,9927,1110],{"class":1109},[1050,9929,9930],{"class":1393},"warning",[1050,9932,1221],{"class":1109},[1050,9934,9888],{"class":1393},[1050,9936,1110],{"class":1109},[1050,9938,9893],{"class":1393},[1050,9940,1221],{"class":1109},[1050,9942,9898],{"class":1393},[1050,9944,9901],{"class":1109},[1050,9946,9947,9949],{"class":1052,"line":3030},[1050,9948,6220],{"class":1063},[1050,9950,1728],{"class":1109},[1050,9952,9953,9955,9957,9959,9961,9964,9966,9968,9970,9972,9974,9976],{"class":1052,"line":3035},[1050,9954,1825],{"class":1259},[1050,9956,1110],{"class":1109},[1050,9958,9100],{"class":1806},[1050,9960,1110],{"class":1109},[1050,9962,9963],{"class":1393},"info",[1050,9965,1221],{"class":1109},[1050,9967,9888],{"class":1393},[1050,9969,1110],{"class":1109},[1050,9971,9893],{"class":1393},[1050,9973,1221],{"class":1109},[1050,9975,9898],{"class":1393},[1050,9977,9901],{"class":1109},[1050,9979,9980],{"class":1052,"line":3042},[1050,9981,1933],{"class":1067},[1050,9983,9984],{"class":1052,"line":3047},[1050,9985,9986],{"class":1056},"        # Send alerts for critical events\n",[1050,9988,9989,9991,9993,9995,9997,9999,10001],{"class":1052,"line":3070},[1050,9990,1798],{"class":1063},[1050,9992,9851],{"class":1067},[1050,9994,2969],{"class":1810},[1050,9996,1288],{"class":1275},[1050,9998,8444],{"class":1279},[1050,10000,1276],{"class":1275},[1050,10002,1728],{"class":1109},[1050,10004,10005,10007,10009,10012,10014,10017],{"class":1052,"line":3080},[1050,10006,1825],{"class":1259},[1050,10008,1110],{"class":1109},[1050,10010,10011],{"class":1393},"_send_security_alert",[1050,10013,1221],{"class":1109},[1050,10015,10016],{"class":1393},"event",[1050,10018,1432],{"class":1109},[1050,10020,10021],{"class":1052,"line":3091},[1050,10022,1933],{"class":1067},[1050,10024,10025,10027],{"class":1052,"line":3112},[1050,10026,2217],{"class":1063},[1050,10028,10029],{"class":1067}," event\n",[1050,10031,10032],{"class":1052,"line":3141},[1050,10033,1253],{"class":1067},[1050,10035,10036,10038,10041,10043,10045,10047,10049],{"class":1052,"line":3158},[1050,10037,1769],{"class":1213},[1050,10039,10040],{"class":1772}," _get_client_ip",[1050,10042,1221],{"class":1109},[1050,10044,1779],{"class":1778},[1050,10046,1285],{"class":1109},[1050,10048,3756],{"class":2264},[1050,10050,1233],{"class":1109},[1050,10052,10053,10055,10058],{"class":1052,"line":3163},[1050,10054,1787],{"class":1239},[1050,10056,10057],{"class":1243},"Extract client IP from request",[1050,10059,1247],{"class":1239},[1050,10061,10062,10065,10067,10069,10071,10073,10075,10077,10079,10081,10084,10086],{"class":1052,"line":3178},[1050,10063,10064],{"class":1067},"        x_forwarded_for ",[1050,10066,1385],{"class":1109},[1050,10068,3756],{"class":1067},[1050,10070,1110],{"class":1109},[1050,10072,9264],{"class":1414},[1050,10074,1110],{"class":1109},[1050,10076,2635],{"class":1393},[1050,10078,1221],{"class":1109},[1050,10080,1276],{"class":1275},[1050,10082,10083],{"class":1279},"HTTP_X_FORWARDED_FOR",[1050,10085,1276],{"class":1275},[1050,10087,1432],{"class":1109},[1050,10089,10090,10092,10095],{"class":1052,"line":3189},[1050,10091,1798],{"class":1063},[1050,10093,10094],{"class":1067}," x_forwarded_for",[1050,10096,1728],{"class":1109},[1050,10098,10099,10102,10104,10106,10108,10110,10112,10114,10116,10118,10121,10123],{"class":1052,"line":3196},[1050,10100,10101],{"class":1067},"            ip ",[1050,10103,1385],{"class":1109},[1050,10105,10094],{"class":1067},[1050,10107,1110],{"class":1109},[1050,10109,6201],{"class":1393},[1050,10111,1221],{"class":1109},[1050,10113,1276],{"class":1275},[1050,10115,1285],{"class":1279},[1050,10117,1276],{"class":1275},[1050,10119,10120],{"class":1109},")[",[1050,10122,2533],{"class":1457},[1050,10124,1758],{"class":1109},[1050,10126,10127,10129],{"class":1052,"line":3201},[1050,10128,6220],{"class":1063},[1050,10130,1728],{"class":1109},[1050,10132,10133,10135,10137,10139,10141,10143,10145,10147,10149,10151,10154,10156],{"class":1052,"line":3215},[1050,10134,10101],{"class":1067},[1050,10136,1385],{"class":1109},[1050,10138,3756],{"class":1067},[1050,10140,1110],{"class":1109},[1050,10142,9264],{"class":1414},[1050,10144,1110],{"class":1109},[1050,10146,2635],{"class":1393},[1050,10148,1221],{"class":1109},[1050,10150,1276],{"class":1275},[1050,10152,10153],{"class":1279},"REMOTE_ADDR",[1050,10155,1276],{"class":1275},[1050,10157,1432],{"class":1109},[1050,10159,10160,10162],{"class":1052,"line":3225},[1050,10161,2217],{"class":1063},[1050,10163,10164],{"class":1067}," ip\n",[1050,10166,10167],{"class":1052,"line":3258},[1050,10168,1253],{"class":1067},[1050,10170,10171,10173,10176,10178,10180,10182,10184],{"class":1052,"line":3265},[1050,10172,1769],{"class":1213},[1050,10174,10175],{"class":1772}," _send_security_alert",[1050,10177,1221],{"class":1109},[1050,10179,1779],{"class":1778},[1050,10181,1285],{"class":1109},[1050,10183,9675],{"class":2264},[1050,10185,1233],{"class":1109},[1050,10187,10188,10190,10193],{"class":1052,"line":3270},[1050,10189,1787],{"class":1239},[1050,10191,10192],{"class":1243},"Send security alert for critical events",[1050,10194,1247],{"class":1239},[1050,10196,10197,10199,10201,10203,10205,10207,10209,10211],{"class":1052,"line":3276},[1050,10198,3519],{"class":1063},[1050,10200,1106],{"class":1067},[1050,10202,1110],{"class":1109},[1050,10204,1174],{"class":1067},[1050,10206,1110],{"class":1109},[1050,10208,3530],{"class":1067},[1050,10210,1064],{"class":1063},[1050,10212,3535],{"class":1067},[1050,10214,10215,10217,10219,10221,10224,10226],{"class":1052,"line":3298},[1050,10216,3519],{"class":1063},[1050,10218,1106],{"class":1067},[1050,10220,1110],{"class":1109},[1050,10222,10223],{"class":1067},"conf ",[1050,10225,1064],{"class":1063},[1050,10227,10228],{"class":1067}," settings\n",[1050,10230,10231],{"class":1052,"line":3321},[1050,10232,1933],{"class":1067},[1050,10234,10235,10238,10240,10242,10245,10247,10249,10251,10253,10255],{"class":1052,"line":3326},[1050,10236,10237],{"class":1067},"        subject ",[1050,10239,1385],{"class":1109},[1050,10241,2593],{"class":1213},[1050,10243,10244],{"class":1279},"\"CRITICAL Security Event: ",[1050,10246,2600],{"class":2599},[1050,10248,10016],{"class":1067},[1050,10250,1110],{"class":1109},[1050,10252,8881],{"class":1806},[1050,10254,2610],{"class":2599},[1050,10256,2015],{"class":1279},[1050,10258,10259,10262,10264,10266],{"class":1052,"line":3332},[1050,10260,10261],{"class":1067},"        message ",[1050,10263,1385],{"class":1109},[1050,10265,2593],{"class":1213},[1050,10267,1247],{"class":1279},[1050,10269,10270],{"class":1052,"line":3355},[1050,10271,10272],{"class":1279},"        Critical security event detected:\n",[1050,10274,10275],{"class":1052,"line":3381},[1050,10276,1933],{"class":1279},[1050,10278,10279,10282,10284,10286,10288,10290],{"class":1052,"line":3386},[1050,10280,10281],{"class":1279},"        Event Type: ",[1050,10283,2600],{"class":2599},[1050,10285,10016],{"class":1067},[1050,10287,1110],{"class":1109},[1050,10289,8881],{"class":1806},[1050,10291,10292],{"class":2599},"}\n",[1050,10294,10295,10298,10300,10302,10304,10306],{"class":1052,"line":3407},[1050,10296,10297],{"class":1279},"        User: ",[1050,10299,2600],{"class":2599},[1050,10301,10016],{"class":1067},[1050,10303,1110],{"class":1109},[1050,10305,1744],{"class":1806},[1050,10307,10292],{"class":2599},[1050,10309,10310,10313,10315,10317,10319,10321],{"class":1052,"line":3426},[1050,10311,10312],{"class":1279},"        IP Address: ",[1050,10314,2600],{"class":2599},[1050,10316,10016],{"class":1067},[1050,10318,1110],{"class":1109},[1050,10320,8944],{"class":1806},[1050,10322,10292],{"class":2599},[1050,10324,10325,10328,10330,10332,10334,10336],{"class":1052,"line":3447},[1050,10326,10327],{"class":1279},"        Timestamp: ",[1050,10329,2600],{"class":2599},[1050,10331,10016],{"class":1067},[1050,10333,1110],{"class":1109},[1050,10335,8890],{"class":1806},[1050,10337,10292],{"class":2599},[1050,10339,10340,10343,10345,10347,10349,10351],{"class":1052,"line":3465},[1050,10341,10342],{"class":1279},"        Description: ",[1050,10344,2600],{"class":2599},[1050,10346,10016],{"class":1067},[1050,10348,1110],{"class":1109},[1050,10350,9586],{"class":1806},[1050,10352,10292],{"class":2599},[1050,10354,10355],{"class":1052,"line":3470},[1050,10356,1933],{"class":1279},[1050,10358,10359,10362,10364,10366,10368,10370,10372,10374,10376,10378,10380,10383,10385,10388,10390],{"class":1052,"line":3477},[1050,10360,10361],{"class":1279},"        Additional Data: ",[1050,10363,2600],{"class":2599},[1050,10365,9888],{"class":1067},[1050,10367,1110],{"class":1109},[1050,10369,9893],{"class":1393},[1050,10371,1221],{"class":1109},[1050,10373,10016],{"class":1393},[1050,10375,1110],{"class":1109},[1050,10377,9824],{"class":1806},[1050,10379,1285],{"class":1109},[1050,10381,10382],{"class":1404}," indent",[1050,10384,1385],{"class":1109},[1050,10386,10387],{"class":1457},"2",[1050,10389,2684],{"class":1109},[1050,10391,10292],{"class":2599},[1050,10393,10394],{"class":1052,"line":3482},[1050,10395,10396],{"class":1279},"        \"\"\"\n",[1050,10398,10399],{"class":1052,"line":3500},[1050,10400,1933],{"class":1067},[1050,10402,10403,10406,10408,10411,10413,10416,10418,10420,10423,10425,10427],{"class":1052,"line":3510},[1050,10404,10405],{"class":1067},"        security_emails ",[1050,10407,1385],{"class":1109},[1050,10409,10410],{"class":3101}," getattr",[1050,10412,1221],{"class":1109},[1050,10414,10415],{"class":1393},"settings",[1050,10417,1285],{"class":1109},[1050,10419,1288],{"class":1275},[1050,10421,10422],{"class":1279},"SECURITY_ALERT_EMAILS",[1050,10424,1276],{"class":1275},[1050,10426,1285],{"class":1109},[1050,10428,10429],{"class":1109}," [])\n",[1050,10431,10432,10434,10437],{"class":1052,"line":3516},[1050,10433,1798],{"class":1063},[1050,10435,10436],{"class":1067}," security_emails",[1050,10438,1728],{"class":1109},[1050,10440,10441,10444],{"class":1052,"line":3538},[1050,10442,10443],{"class":1393},"            send_mail",[1050,10445,1977],{"class":1109},[1050,10447,10448,10451],{"class":1052,"line":3544},[1050,10449,10450],{"class":1393},"                subject",[1050,10452,1998],{"class":1109},[1050,10454,10455,10458],{"class":1052,"line":3551},[1050,10456,10457],{"class":1393},"                message",[1050,10459,1998],{"class":1109},[1050,10461,10462,10465,10467,10470],{"class":1052,"line":3556},[1050,10463,10464],{"class":1393},"                settings",[1050,10466,1110],{"class":1109},[1050,10468,10469],{"class":1414},"DEFAULT_FROM_EMAIL",[1050,10471,1998],{"class":1109},[1050,10473,10474,10477],{"class":1052,"line":3574},[1050,10475,10476],{"class":1393},"                security_emails",[1050,10478,1998],{"class":1109},[1050,10480,10481,10484,10486],{"class":1052,"line":3584},[1050,10482,10483],{"class":1404},"                fail_silently",[1050,10485,1385],{"class":1109},[1050,10487,10488],{"class":1529},"False\n",[1050,10490,10491],{"class":1052,"line":3603},[1050,10492,6524],{"class":1109},[1050,10494,10495],{"class":1052,"line":3608},[1050,10496,1207],{"emptyLinePlaceholder":1206},[1050,10498,10499],{"class":1052,"line":3616},[1050,10500,10501],{"class":1056},"# Global security logger\n",[1050,10503,10504,10507,10509,10511],{"class":1052,"line":3629},[1050,10505,10506],{"class":1067},"security_logger ",[1050,10508,1385],{"class":1109},[1050,10510,9064],{"class":1393},[1050,10512,1843],{"class":1109},[1050,10514,10515],{"class":1052,"line":3648},[1050,10516,1207],{"emptyLinePlaceholder":1206},[1050,10518,10519],{"class":1052,"line":3660},[1050,10520,10521],{"class":1056},"# Security monitoring middleware\n",[1050,10523,10524,10526,10529,10531,10534],{"class":1052,"line":3687},[1050,10525,1214],{"class":1213},[1050,10527,10528],{"class":1217}," SecurityMonitoringMiddleware",[1050,10530,1221],{"class":1109},[1050,10532,10533],{"class":1224},"MiddlewareMixin",[1050,10535,1233],{"class":1109},[1050,10537,10538,10540,10543],{"class":1052,"line":3700},[1050,10539,1240],{"class":1239},[1050,10541,10542],{"class":1243},"Middleware for security monitoring",[1050,10544,1247],{"class":1239},[1050,10546,10547],{"class":1052,"line":3705},[1050,10548,1253],{"class":1067},[1050,10550,10551,10553,10555,10557,10559,10561,10563],{"class":1052,"line":3712},[1050,10552,1769],{"class":1213},[1050,10554,4387],{"class":3101},[1050,10556,1221],{"class":1109},[1050,10558,1779],{"class":1778},[1050,10560,1285],{"class":1109},[1050,10562,4396],{"class":2264},[1050,10564,1233],{"class":1109},[1050,10566,10567,10569,10571,10573,10575],{"class":1052,"line":3717},[1050,10568,3166],{"class":1259},[1050,10570,1110],{"class":1109},[1050,10572,4408],{"class":1806},[1050,10574,1263],{"class":1109},[1050,10576,4413],{"class":1067},[1050,10578,10579,10581,10583,10586,10588],{"class":1052,"line":3727},[1050,10580,3166],{"class":1259},[1050,10582,1110],{"class":1109},[1050,10584,10585],{"class":1806},"suspicious_patterns",[1050,10587,1263],{"class":1109},[1050,10589,1266],{"class":1109},[1050,10591,10592,10594,10597,10599],{"class":1052,"line":3737},[1050,10593,3619],{"class":1275},[1050,10595,10596],{"class":1279},"union select",[1050,10598,1276],{"class":1275},[1050,10600,1998],{"class":1109},[1050,10602,10603,10605,10608,10610],{"class":1052,"line":3742},[1050,10604,3619],{"class":1275},[1050,10606,10607],{"class":1279},"drop table",[1050,10609,1276],{"class":1275},[1050,10611,1998],{"class":1109},[1050,10613,10614,10616,10619,10621],{"class":1052,"line":3797},[1050,10615,3619],{"class":1275},[1050,10617,10618],{"class":1279},"\u003Cscript",[1050,10620,1276],{"class":1275},[1050,10622,1998],{"class":1109},[1050,10624,10625,10627,10630,10632],{"class":1052,"line":3807},[1050,10626,3619],{"class":1275},[1050,10628,10629],{"class":1279},"javascript:",[1050,10631,1276],{"class":1275},[1050,10633,1998],{"class":1109},[1050,10635,10636,10638,10641,10643],{"class":1052,"line":3828},[1050,10637,3619],{"class":1275},[1050,10639,10640],{"class":1279},"../../../",[1050,10642,1276],{"class":1275},[1050,10644,1998],{"class":1109},[1050,10646,10647,10649,10652,10654],{"class":1052,"line":3833},[1050,10648,3619],{"class":1275},[1050,10650,10651],{"class":1279},"cmd.exe",[1050,10653,1276],{"class":1275},[1050,10655,1998],{"class":1109},[1050,10657,10658,10660,10663,10665],{"class":1052,"line":3839},[1050,10659,3619],{"class":1275},[1050,10661,10662],{"class":1279},"/etc/passwd",[1050,10664,1276],{"class":1275},[1050,10666,1998],{"class":1109},[1050,10668,10669],{"class":1052,"line":3874},[1050,10670,8992],{"class":1109},[1050,10672,10673],{"class":1052,"line":3886},[1050,10674,1253],{"class":1067},[1050,10676,10677,10679,10681,10683,10685,10687,10689],{"class":1052,"line":3893},[1050,10678,1769],{"class":1213},[1050,10680,4442],{"class":3101},[1050,10682,1221],{"class":1109},[1050,10684,1779],{"class":1778},[1050,10686,1285],{"class":1109},[1050,10688,3756],{"class":2264},[1050,10690,1233],{"class":1109},[1050,10692,10693],{"class":1052,"line":3898},[1050,10694,10695],{"class":1056},"        # Check for suspicious patterns\n",[1050,10697,10698,10700,10702,10705,10707,10709],{"class":1052,"line":3904},[1050,10699,3166],{"class":1259},[1050,10701,1110],{"class":1109},[1050,10703,10704],{"class":1393},"_check_suspicious_activity",[1050,10706,1221],{"class":1109},[1050,10708,3851],{"class":1393},[1050,10710,1432],{"class":1109},[1050,10712,10713],{"class":1052,"line":3924},[1050,10714,1933],{"class":1067},[1050,10716,10717],{"class":1052,"line":3932},[1050,10718,10719],{"class":1056},"        # Track failed permission checks\n",[1050,10721,10722,10724,10726,10728,10730,10732,10734,10736],{"class":1052,"line":3937},[1050,10723,4619],{"class":1067},[1050,10725,1385],{"class":1109},[1050,10727,1801],{"class":1259},[1050,10729,1110],{"class":1109},[1050,10731,4408],{"class":1393},[1050,10733,1221],{"class":1109},[1050,10735,3851],{"class":1393},[1050,10737,1432],{"class":1109},[1050,10739,10740],{"class":1052,"line":3943},[1050,10741,1933],{"class":1067},[1050,10743,10744,10746,10749,10751,10754,10756,10759],{"class":1052,"line":3954},[1050,10745,1798],{"class":1063},[1050,10747,10748],{"class":1067}," response",[1050,10750,1110],{"class":1109},[1050,10752,10753],{"class":1806},"status_code",[1050,10755,1811],{"class":1810},[1050,10757,10758],{"class":1457}," 403",[1050,10760,1728],{"class":1109},[1050,10762,10763,10766,10768,10771],{"class":1052,"line":3960},[1050,10764,10765],{"class":1067},"            security_logger",[1050,10767,1110],{"class":1109},[1050,10769,10770],{"class":1393},"log_event",[1050,10772,1977],{"class":1109},[1050,10774,10775,10778,10780,10782],{"class":1052,"line":3999},[1050,10776,10777],{"class":1275},"                '",[1050,10779,8207],{"class":1279},[1050,10781,1276],{"class":1275},[1050,10783,1998],{"class":1109},[1050,10785,10786,10789,10791,10793],{"class":1052,"line":4006},[1050,10787,10788],{"class":1404},"                request",[1050,10790,1385],{"class":1109},[1050,10792,3851],{"class":1393},[1050,10794,1998],{"class":1109},[1050,10796,10797,10800,10802,10804,10806,10808],{"class":1052,"line":4011},[1050,10798,10799],{"class":1404},"                severity",[1050,10801,1385],{"class":1109},[1050,10803,1276],{"class":1275},[1050,10805,8400],{"class":1279},[1050,10807,1276],{"class":1275},[1050,10809,1998],{"class":1109},[1050,10811,10812,10815,10817,10819,10822,10824,10826,10828,10830,10832],{"class":1052,"line":4017},[1050,10813,10814],{"class":1404},"                description",[1050,10816,1385],{"class":1109},[1050,10818,3971],{"class":1213},[1050,10820,10821],{"class":1279},"\"Permission denied for ",[1050,10823,2600],{"class":2599},[1050,10825,3851],{"class":1393},[1050,10827,1110],{"class":1109},[1050,10829,4573],{"class":1806},[1050,10831,2610],{"class":2599},[1050,10833,2015],{"class":1279},[1050,10835,10836],{"class":1052,"line":4039},[1050,10837,6524],{"class":1109},[1050,10839,10840],{"class":1052,"line":4045},[1050,10841,1933],{"class":1067},[1050,10843,10844,10846],{"class":1052,"line":4070},[1050,10845,2217],{"class":1063},[1050,10847,4641],{"class":1067},[1050,10849,10850],{"class":1052,"line":4077},[1050,10851,1253],{"class":1067},[1050,10853,10854,10856,10859,10861,10863,10865,10867],{"class":1052,"line":4082},[1050,10855,1769],{"class":1213},[1050,10857,10858],{"class":1772}," _check_suspicious_activity",[1050,10860,1221],{"class":1109},[1050,10862,1779],{"class":1778},[1050,10864,1285],{"class":1109},[1050,10866,3756],{"class":2264},[1050,10868,1233],{"class":1109},[1050,10870,10871,10873,10876],{"class":1052,"line":4089},[1050,10872,1787],{"class":1239},[1050,10874,10875],{"class":1243},"Check for suspicious activity patterns",[1050,10877,1247],{"class":1239},[1050,10879,10880],{"class":1052,"line":4094},[1050,10881,10882],{"class":1056},"        # Check query parameters\n",[1050,10884,10885,10888,10890,10892,10894,10896,10898,10900,10902,10904,10907,10909,10911,10913,10915,10918],{"class":1052,"line":4112},[1050,10886,10887],{"class":1067},"        query_string ",[1050,10889,1385],{"class":1109},[1050,10891,3756],{"class":1067},[1050,10893,1110],{"class":1109},[1050,10895,9264],{"class":1414},[1050,10897,1110],{"class":1109},[1050,10899,2635],{"class":1393},[1050,10901,1221],{"class":1109},[1050,10903,1276],{"class":1275},[1050,10905,10906],{"class":1279},"QUERY_STRING",[1050,10908,1276],{"class":1275},[1050,10910,1285],{"class":1109},[1050,10912,9282],{"class":1275},[1050,10914,3133],{"class":1109},[1050,10916,10917],{"class":1393},"lower",[1050,10919,1843],{"class":1109},[1050,10921,10922],{"class":1052,"line":4122},[1050,10923,1933],{"class":1067},[1050,10925,10926,10928,10931,10933,10935,10937,10939],{"class":1052,"line":4153},[1050,10927,2522],{"class":1063},[1050,10929,10930],{"class":1067}," pattern ",[1050,10932,2528],{"class":1063},[1050,10934,1801],{"class":1259},[1050,10936,1110],{"class":1109},[1050,10938,10585],{"class":1806},[1050,10940,1728],{"class":1109},[1050,10942,10943,10945,10947,10949,10952],{"class":1052,"line":4158},[1050,10944,2553],{"class":1063},[1050,10946,10930],{"class":1067},[1050,10948,2528],{"class":1810},[1050,10950,10951],{"class":1067}," query_string",[1050,10953,1728],{"class":1109},[1050,10955,10956,10959,10961,10963],{"class":1052,"line":4180},[1050,10957,10958],{"class":1067},"                security_logger",[1050,10960,1110],{"class":1109},[1050,10962,10770],{"class":1393},[1050,10964,1977],{"class":1109},[1050,10966,10967,10970,10972,10974],{"class":1052,"line":4190},[1050,10968,10969],{"class":1275},"                    '",[1050,10971,8229],{"class":1279},[1050,10973,1276],{"class":1275},[1050,10975,1998],{"class":1109},[1050,10977,10978,10981,10983,10985],{"class":1052,"line":4220},[1050,10979,10980],{"class":1404},"                    request",[1050,10982,1385],{"class":1109},[1050,10984,3851],{"class":1393},[1050,10986,1998],{"class":1109},[1050,10988,10989,10992,10994,10996,10998,11000],{"class":1052,"line":4239},[1050,10990,10991],{"class":1404},"                    severity",[1050,10993,1385],{"class":1109},[1050,10995,1276],{"class":1275},[1050,10997,8422],{"class":1279},[1050,10999,1276],{"class":1275},[1050,11001,1998],{"class":1109},[1050,11003,11004,11007,11009,11011,11014,11016,11019,11021,11023],{"class":1052,"line":4246},[1050,11005,11006],{"class":1404},"                    description",[1050,11008,1385],{"class":1109},[1050,11010,3971],{"class":1213},[1050,11012,11013],{"class":1279},"\"Suspicious pattern detected: ",[1050,11015,2600],{"class":2599},[1050,11017,11018],{"class":1393},"pattern",[1050,11020,2610],{"class":2599},[1050,11022,2009],{"class":1279},[1050,11024,1998],{"class":1109},[1050,11026,11027,11030,11033,11035,11037,11039,11041,11044,11046,11048,11051,11053,11055,11057],{"class":1052,"line":4253},[1050,11028,11029],{"class":1404},"                    additional_data",[1050,11031,11032],{"class":1109},"={",[1050,11034,1276],{"class":1275},[1050,11036,11018],{"class":1279},[1050,11038,1276],{"class":1275},[1050,11040,2613],{"class":1109},[1050,11042,11043],{"class":1393}," pattern",[1050,11045,1285],{"class":1109},[1050,11047,1288],{"class":1275},[1050,11049,11050],{"class":1279},"query_string",[1050,11052,1276],{"class":1275},[1050,11054,2613],{"class":1109},[1050,11056,10951],{"class":1393},[1050,11058,10292],{"class":1109},[1050,11060,11061],{"class":1052,"line":4258},[1050,11062,11063],{"class":1109},"                )\n",[1050,11065,11066],{"class":1052,"line":4277},[1050,11067,11068],{"class":1063},"                break\n",[1050,11070,11071],{"class":1052,"line":4287},[1050,11072,1933],{"class":1067},[1050,11074,11075],{"class":1052,"line":4295},[1050,11076,11077],{"class":1056},"        # Check for excessive requests from same IP\n",[1050,11079,11080,11082,11084,11087,11089,11091],{"class":1052,"line":4324},[1050,11081,3166],{"class":1259},[1050,11083,1110],{"class":1109},[1050,11085,11086],{"class":1393},"_check_rate_limiting",[1050,11088,1221],{"class":1109},[1050,11090,3851],{"class":1393},[1050,11092,1432],{"class":1109},[1050,11094,11095],{"class":1052,"line":4339},[1050,11096,1253],{"class":1067},[1050,11098,11099,11101,11104,11106,11108,11110,11112],{"class":1052,"line":4346},[1050,11100,1769],{"class":1213},[1050,11102,11103],{"class":1772}," _check_rate_limiting",[1050,11105,1221],{"class":1109},[1050,11107,1779],{"class":1778},[1050,11109,1285],{"class":1109},[1050,11111,3756],{"class":2264},[1050,11113,1233],{"class":1109},[1050,11115,11116,11118,11121],{"class":1052,"line":4351},[1050,11117,1787],{"class":1239},[1050,11119,11120],{"class":1243},"Check for potential DoS attacks",[1050,11122,1247],{"class":1239},[1050,11124,11125,11127,11129,11132,11134,11136,11138,11140],{"class":1052,"line":4357},[1050,11126,9218],{"class":1067},[1050,11128,1385],{"class":1109},[1050,11130,11131],{"class":1067}," security_logger",[1050,11133,1110],{"class":1109},[1050,11135,9227],{"class":1393},[1050,11137,1221],{"class":1109},[1050,11139,3851],{"class":1393},[1050,11141,1432],{"class":1109},[1050,11143,11144,11146,11148,11150,11153,11155,11157,11159],{"class":1052,"line":4367},[1050,11145,2909],{"class":1067},[1050,11147,1385],{"class":1109},[1050,11149,2593],{"class":1213},[1050,11151,11152],{"class":1279},"\"request_count:",[1050,11154,2600],{"class":2599},[1050,11156,8944],{"class":1067},[1050,11158,2610],{"class":2599},[1050,11160,2015],{"class":1279},[1050,11162,11163],{"class":1052,"line":4377},[1050,11164,1933],{"class":1067},[1050,11166,11167,11169,11171,11173,11175,11177,11179,11181],{"class":1052,"line":4382},[1050,11168,3519],{"class":1063},[1050,11170,1106],{"class":1067},[1050,11172,1110],{"class":1109},[1050,11174,1174],{"class":1067},[1050,11176,1110],{"class":1109},[1050,11178,1179],{"class":1067},[1050,11180,1064],{"class":1063},[1050,11182,1184],{"class":1067},[1050,11184,11185],{"class":1052,"line":4401},[1050,11186,1933],{"class":1067},[1050,11188,11189,11192,11194,11196,11198,11200,11202,11204,11206,11209],{"class":1052,"line":4416},[1050,11190,11191],{"class":1067},"        current_count ",[1050,11193,1385],{"class":1109},[1050,11195,2630],{"class":1067},[1050,11197,1110],{"class":1109},[1050,11199,2635],{"class":1393},[1050,11201,1221],{"class":1109},[1050,11203,2640],{"class":1393},[1050,11205,1285],{"class":1109},[1050,11207,11208],{"class":1457}," 0",[1050,11210,1432],{"class":1109},[1050,11212,11213,11215,11217,11219,11221,11223,11225,11228,11231,11233,11235,11237,11239],{"class":1052,"line":4432},[1050,11214,3358],{"class":1067},[1050,11216,1110],{"class":1109},[1050,11218,2667],{"class":1393},[1050,11220,1221],{"class":1109},[1050,11222,2640],{"class":1393},[1050,11224,1285],{"class":1109},[1050,11226,11227],{"class":1393}," current_count ",[1050,11229,11230],{"class":1810},"+",[1050,11232,2545],{"class":1457},[1050,11234,1285],{"class":1109},[1050,11236,2681],{"class":1457},[1050,11238,2684],{"class":1109},[1050,11240,11241],{"class":1056},"  # 1 minute window\n",[1050,11243,11244],{"class":1052,"line":4437},[1050,11245,1933],{"class":1067},[1050,11247,11248,11250,11252,11254,11257,11259],{"class":1052,"line":4455},[1050,11249,1798],{"class":1063},[1050,11251,11227],{"class":1067},[1050,11253,5989],{"class":1810},[1050,11255,11256],{"class":1457}," 100",[1050,11258,2613],{"class":1109},[1050,11260,11261],{"class":1056},"  # More than 100 requests per minute\n",[1050,11263,11264,11266,11268,11270],{"class":1052,"line":4461},[1050,11265,10765],{"class":1067},[1050,11267,1110],{"class":1109},[1050,11269,10770],{"class":1393},[1050,11271,1977],{"class":1109},[1050,11273,11274,11276,11278,11280],{"class":1052,"line":4486},[1050,11275,10777],{"class":1275},[1050,11277,8229],{"class":1279},[1050,11279,1276],{"class":1275},[1050,11281,1998],{"class":1109},[1050,11283,11284,11286,11288,11290],{"class":1052,"line":4512},[1050,11285,10788],{"class":1404},[1050,11287,1385],{"class":1109},[1050,11289,3851],{"class":1393},[1050,11291,1998],{"class":1109},[1050,11293,11294,11296,11298,11300,11302,11304],{"class":1052,"line":4532},[1050,11295,10799],{"class":1404},[1050,11297,1385],{"class":1109},[1050,11299,1276],{"class":1275},[1050,11301,8422],{"class":1279},[1050,11303,1276],{"class":1275},[1050,11305,1998],{"class":1109},[1050,11307,11308,11310,11312,11314,11317,11319,11321,11323,11325],{"class":1052,"line":4538},[1050,11309,10814],{"class":1404},[1050,11311,1385],{"class":1109},[1050,11313,3971],{"class":1213},[1050,11315,11316],{"class":1279},"\"Excessive requests from IP: ",[1050,11318,2600],{"class":2599},[1050,11320,8944],{"class":1393},[1050,11322,2610],{"class":2599},[1050,11324,2009],{"class":1279},[1050,11326,1998],{"class":1109},[1050,11328,11329,11332,11334,11336,11339,11341,11343,11346],{"class":1052,"line":4544},[1050,11330,11331],{"class":1404},"                additional_data",[1050,11333,11032],{"class":1109},[1050,11335,1276],{"class":1275},[1050,11337,11338],{"class":1279},"request_count",[1050,11340,1276],{"class":1275},[1050,11342,2613],{"class":1109},[1050,11344,11345],{"class":1393}," current_count",[1050,11347,10292],{"class":1109},[1050,11349,11350],{"class":1052,"line":4562},[1050,11351,6524],{"class":1109},[1050,11353,11354],{"class":1052,"line":4592},[1050,11355,1207],{"emptyLinePlaceholder":1206},[1050,11357,11358],{"class":1052,"line":4611},[1050,11359,11360],{"class":1056},"# Signal handlers for security events\n",[1050,11362,11363,11365,11368,11370,11373],{"class":1052,"line":4616},[1050,11364,7709],{"class":1109},[1050,11366,11367],{"class":1772},"receiver",[1050,11369,1221],{"class":1109},[1050,11371,11372],{"class":1393},"user_logged_in",[1050,11374,1432],{"class":1109},[1050,11376,11377,11379,11382,11384,11387,11389,11391,11393,11395,11397,11399,11401],{"class":1052,"line":4636},[1050,11378,7095],{"class":1213},[1050,11380,11381],{"class":1772}," log_user_login",[1050,11383,1221],{"class":1109},[1050,11385,11386],{"class":2264},"sender",[1050,11388,1285],{"class":1109},[1050,11390,3756],{"class":2264},[1050,11392,1285],{"class":1109},[1050,11394,3881],{"class":2264},[1050,11396,1285],{"class":1109},[1050,11398,3789],{"class":1810},[1050,11400,3792],{"class":2264},[1050,11402,1233],{"class":1109},[1050,11404,11405,11407,11410],{"class":1052,"line":4644},[1050,11406,1240],{"class":1239},[1050,11408,11409],{"class":1243},"Log successful user login",[1050,11411,1247],{"class":1239},[1050,11413,11414,11417,11419,11421],{"class":1052,"line":4649},[1050,11415,11416],{"class":1067},"    security_logger",[1050,11418,1110],{"class":1109},[1050,11420,10770],{"class":1393},[1050,11422,1977],{"class":1109},[1050,11424,11425,11428,11430,11432],{"class":1052,"line":4667},[1050,11426,11427],{"class":1275},"        '",[1050,11429,8141],{"class":1279},[1050,11431,1276],{"class":1275},[1050,11433,1998],{"class":1109},[1050,11435,11436,11439,11441,11443],{"class":1052,"line":4677},[1050,11437,11438],{"class":1404},"        request",[1050,11440,1385],{"class":1109},[1050,11442,3851],{"class":1393},[1050,11444,1998],{"class":1109},[1050,11446,11448,11451,11453,11455],{"class":1052,"line":11447},245,[1050,11449,11450],{"class":1404},"        user",[1050,11452,1385],{"class":1109},[1050,11454,1744],{"class":1393},[1050,11456,1998],{"class":1109},[1050,11458,11460,11463,11465,11467,11469,11471],{"class":1052,"line":11459},246,[1050,11461,11462],{"class":1404},"        severity",[1050,11464,1385],{"class":1109},[1050,11466,1276],{"class":1275},[1050,11468,8378],{"class":1279},[1050,11470,1276],{"class":1275},[1050,11472,1998],{"class":1109},[1050,11474,11476,11479,11481,11483,11486,11488,11490,11492,11494,11496],{"class":1052,"line":11475},247,[1050,11477,11478],{"class":1404},"        description",[1050,11480,1385],{"class":1109},[1050,11482,3971],{"class":1213},[1050,11484,11485],{"class":1279},"\"User ",[1050,11487,2600],{"class":2599},[1050,11489,1744],{"class":1393},[1050,11491,1110],{"class":1109},[1050,11493,3860],{"class":1806},[1050,11495,2610],{"class":2599},[1050,11497,11498],{"class":1279}," logged in successfully\"\n",[1050,11500,11502],{"class":1052,"line":11501},248,[1050,11503,5138],{"class":1109},[1050,11505,11507],{"class":1052,"line":11506},249,[1050,11508,1207],{"emptyLinePlaceholder":1206},[1050,11510,11512,11514,11516,11518,11521],{"class":1052,"line":11511},250,[1050,11513,7709],{"class":1109},[1050,11515,11367],{"class":1772},[1050,11517,1221],{"class":1109},[1050,11519,11520],{"class":1393},"user_login_failed",[1050,11522,1432],{"class":1109},[1050,11524,11526,11528,11531,11533,11535,11537,11540,11542,11544,11546,11548,11550],{"class":1052,"line":11525},251,[1050,11527,7095],{"class":1213},[1050,11529,11530],{"class":1772}," log_failed_login",[1050,11532,1221],{"class":1109},[1050,11534,11386],{"class":2264},[1050,11536,1285],{"class":1109},[1050,11538,11539],{"class":2264}," credentials",[1050,11541,1285],{"class":1109},[1050,11543,3756],{"class":2264},[1050,11545,1285],{"class":1109},[1050,11547,3789],{"class":1810},[1050,11549,3792],{"class":2264},[1050,11551,1233],{"class":1109},[1050,11553,11555,11557,11560],{"class":1052,"line":11554},252,[1050,11556,1240],{"class":1239},[1050,11558,11559],{"class":1243},"Log failed login attempt",[1050,11561,1247],{"class":1239},[1050,11563,11565,11568,11570,11572,11574,11576,11578,11580,11582,11584,11586,11588,11591,11593],{"class":1052,"line":11564},253,[1050,11566,11567],{"class":1067},"    username ",[1050,11569,1385],{"class":1109},[1050,11571,11539],{"class":1067},[1050,11573,1110],{"class":1109},[1050,11575,2635],{"class":1393},[1050,11577,1221],{"class":1109},[1050,11579,1276],{"class":1275},[1050,11581,3860],{"class":1279},[1050,11583,1276],{"class":1275},[1050,11585,1285],{"class":1109},[1050,11587,1288],{"class":1275},[1050,11589,11590],{"class":1279},"unknown",[1050,11592,1276],{"class":1275},[1050,11594,1432],{"class":1109},[1050,11596,11598],{"class":1052,"line":11597},254,[1050,11599,1253],{"class":1067},[1050,11601,11603,11605,11607,11609],{"class":1052,"line":11602},255,[1050,11604,11416],{"class":1067},[1050,11606,1110],{"class":1109},[1050,11608,10770],{"class":1393},[1050,11610,1977],{"class":1109},[1050,11612,11614,11616,11618,11620],{"class":1052,"line":11613},256,[1050,11615,11427],{"class":1275},[1050,11617,8163],{"class":1279},[1050,11619,1276],{"class":1275},[1050,11621,1998],{"class":1109},[1050,11623,11625,11627,11629,11631],{"class":1052,"line":11624},257,[1050,11626,11438],{"class":1404},[1050,11628,1385],{"class":1109},[1050,11630,3851],{"class":1393},[1050,11632,1998],{"class":1109},[1050,11634,11636,11638,11640,11642,11644,11646],{"class":1052,"line":11635},258,[1050,11637,11462],{"class":1404},[1050,11639,1385],{"class":1109},[1050,11641,1276],{"class":1275},[1050,11643,8400],{"class":1279},[1050,11645,1276],{"class":1275},[1050,11647,1998],{"class":1109},[1050,11649,11651,11653,11655,11657,11660,11662,11664,11666,11668],{"class":1052,"line":11650},259,[1050,11652,11478],{"class":1404},[1050,11654,1385],{"class":1109},[1050,11656,3971],{"class":1213},[1050,11658,11659],{"class":1279},"\"Failed login attempt for username: ",[1050,11661,2600],{"class":2599},[1050,11663,3860],{"class":1393},[1050,11665,2610],{"class":2599},[1050,11667,2009],{"class":1279},[1050,11669,1998],{"class":1109},[1050,11671,11673,11676,11678,11680,11682,11684,11686,11688],{"class":1052,"line":11672},260,[1050,11674,11675],{"class":1404},"        additional_data",[1050,11677,11032],{"class":1109},[1050,11679,1276],{"class":1275},[1050,11681,3860],{"class":1279},[1050,11683,1276],{"class":1275},[1050,11685,2613],{"class":1109},[1050,11687,3761],{"class":1393},[1050,11689,10292],{"class":1109},[1050,11691,11693],{"class":1052,"line":11692},261,[1050,11694,5138],{"class":1109},[1050,11696,11698],{"class":1052,"line":11697},262,[1050,11699,1253],{"class":1067},[1050,11701,11703],{"class":1052,"line":11702},263,[1050,11704,11705],{"class":1056},"    # Check for brute force attempts\n",[1050,11707,11709,11711,11713,11715,11717,11719,11721,11723],{"class":1052,"line":11708},264,[1050,11710,8596],{"class":1067},[1050,11712,1385],{"class":1109},[1050,11714,11131],{"class":1067},[1050,11716,1110],{"class":1109},[1050,11718,9227],{"class":1393},[1050,11720,1221],{"class":1109},[1050,11722,3851],{"class":1393},[1050,11724,1432],{"class":1109},[1050,11726,11728,11731,11733,11735,11738,11740,11742,11744],{"class":1052,"line":11727},265,[1050,11729,11730],{"class":1067},"    cache_key ",[1050,11732,1385],{"class":1109},[1050,11734,2593],{"class":1213},[1050,11736,11737],{"class":1279},"\"failed_login:",[1050,11739,2600],{"class":2599},[1050,11741,8944],{"class":1067},[1050,11743,2610],{"class":2599},[1050,11745,2015],{"class":1279},[1050,11747,11749],{"class":1052,"line":11748},266,[1050,11750,1253],{"class":1067},[1050,11752,11754,11757,11759,11761,11763,11765,11767,11769],{"class":1052,"line":11753},267,[1050,11755,11756],{"class":1063},"    from",[1050,11758,1106],{"class":1067},[1050,11760,1110],{"class":1109},[1050,11762,1174],{"class":1067},[1050,11764,1110],{"class":1109},[1050,11766,1179],{"class":1067},[1050,11768,1064],{"class":1063},[1050,11770,1184],{"class":1067},[1050,11772,11774],{"class":1052,"line":11773},268,[1050,11775,1253],{"class":1067},[1050,11777,11779,11782,11784,11786,11788,11790,11792,11794,11796,11798],{"class":1052,"line":11778},269,[1050,11780,11781],{"class":1067},"    failed_count ",[1050,11783,1385],{"class":1109},[1050,11785,2630],{"class":1067},[1050,11787,1110],{"class":1109},[1050,11789,2635],{"class":1393},[1050,11791,1221],{"class":1109},[1050,11793,2640],{"class":1393},[1050,11795,1285],{"class":1109},[1050,11797,11208],{"class":1457},[1050,11799,1432],{"class":1109},[1050,11801,11803,11806,11808,11810,11812,11814,11816,11819,11821,11823,11825,11827,11829],{"class":1052,"line":11802},270,[1050,11804,11805],{"class":1067},"    cache",[1050,11807,1110],{"class":1109},[1050,11809,2667],{"class":1393},[1050,11811,1221],{"class":1109},[1050,11813,2640],{"class":1393},[1050,11815,1285],{"class":1109},[1050,11817,11818],{"class":1393}," failed_count ",[1050,11820,11230],{"class":1810},[1050,11822,2545],{"class":1457},[1050,11824,1285],{"class":1109},[1050,11826,3376],{"class":1457},[1050,11828,2684],{"class":1109},[1050,11830,11831],{"class":1056},"  # 5 minute window\n",[1050,11833,11835],{"class":1052,"line":11834},271,[1050,11836,1253],{"class":1067},[1050,11838,11840,11843,11845,11847,11850,11852],{"class":1052,"line":11839},272,[1050,11841,11842],{"class":1063},"    if",[1050,11844,11818],{"class":1067},[1050,11846,5989],{"class":1810},[1050,11848,11849],{"class":1457}," 5",[1050,11851,2613],{"class":1109},[1050,11853,11854],{"class":1056},"  # More than 5 failed attempts\n",[1050,11856,11858,11861,11863,11865],{"class":1052,"line":11857},273,[1050,11859,11860],{"class":1067},"        security_logger",[1050,11862,1110],{"class":1109},[1050,11864,10770],{"class":1393},[1050,11866,1977],{"class":1109},[1050,11868,11870,11872,11874,11876],{"class":1052,"line":11869},274,[1050,11871,3619],{"class":1275},[1050,11873,8229],{"class":1279},[1050,11875,1276],{"class":1275},[1050,11877,1998],{"class":1109},[1050,11879,11881,11884,11886,11888],{"class":1052,"line":11880},275,[1050,11882,11883],{"class":1404},"            request",[1050,11885,1385],{"class":1109},[1050,11887,3851],{"class":1393},[1050,11889,1998],{"class":1109},[1050,11891,11893,11895,11897,11899,11901,11903],{"class":1052,"line":11892},276,[1050,11894,9525],{"class":1404},[1050,11896,1385],{"class":1109},[1050,11898,1276],{"class":1275},[1050,11900,8422],{"class":1279},[1050,11902,1276],{"class":1275},[1050,11904,1998],{"class":1109},[1050,11906,11908,11910,11912,11914,11917,11919,11921,11923,11925],{"class":1052,"line":11907},277,[1050,11909,9581],{"class":1404},[1050,11911,1385],{"class":1109},[1050,11913,3971],{"class":1213},[1050,11915,11916],{"class":1279},"\"Brute force attack detected from IP: ",[1050,11918,2600],{"class":2599},[1050,11920,8944],{"class":1393},[1050,11922,2610],{"class":2599},[1050,11924,2009],{"class":1279},[1050,11926,1998],{"class":1109},[1050,11928,11930,11932,11934,11936,11939,11941,11943,11946],{"class":1052,"line":11929},278,[1050,11931,9593],{"class":1404},[1050,11933,11032],{"class":1109},[1050,11935,1276],{"class":1275},[1050,11937,11938],{"class":1279},"failed_attempts",[1050,11940,1276],{"class":1275},[1050,11942,2613],{"class":1109},[1050,11944,11945],{"class":1393}," failed_count",[1050,11947,10292],{"class":1109},[1050,11949,11951],{"class":1052,"line":11950},279,[1050,11952,2021],{"class":1109},[1050,11954,11956],{"class":1052,"line":11955},280,[1050,11957,1207],{"emptyLinePlaceholder":1206},[1050,11959,11961,11963,11965,11967,11970],{"class":1052,"line":11960},281,[1050,11962,7709],{"class":1109},[1050,11964,11367],{"class":1772},[1050,11966,1221],{"class":1109},[1050,11968,11969],{"class":1393},"user_logged_out",[1050,11971,1432],{"class":1109},[1050,11973,11975,11977,11980,11982,11984,11986,11988,11990,11992,11994,11996,11998],{"class":1052,"line":11974},282,[1050,11976,7095],{"class":1213},[1050,11978,11979],{"class":1772}," log_user_logout",[1050,11981,1221],{"class":1109},[1050,11983,11386],{"class":2264},[1050,11985,1285],{"class":1109},[1050,11987,3756],{"class":2264},[1050,11989,1285],{"class":1109},[1050,11991,3881],{"class":2264},[1050,11993,1285],{"class":1109},[1050,11995,3789],{"class":1810},[1050,11997,3792],{"class":2264},[1050,11999,1233],{"class":1109},[1050,12001,12003,12005,12008],{"class":1052,"line":12002},283,[1050,12004,1240],{"class":1239},[1050,12006,12007],{"class":1243},"Log user logout",[1050,12009,1247],{"class":1239},[1050,12011,12013,12015,12017,12019],{"class":1052,"line":12012},284,[1050,12014,11416],{"class":1067},[1050,12016,1110],{"class":1109},[1050,12018,10770],{"class":1393},[1050,12020,1977],{"class":1109},[1050,12022,12024,12026,12028,12030],{"class":1052,"line":12023},285,[1050,12025,11427],{"class":1275},[1050,12027,8185],{"class":1279},[1050,12029,1276],{"class":1275},[1050,12031,1998],{"class":1109},[1050,12033,12035,12037,12039,12041],{"class":1052,"line":12034},286,[1050,12036,11438],{"class":1404},[1050,12038,1385],{"class":1109},[1050,12040,3851],{"class":1393},[1050,12042,1998],{"class":1109},[1050,12044,12046,12048,12050,12052],{"class":1052,"line":12045},287,[1050,12047,11450],{"class":1404},[1050,12049,1385],{"class":1109},[1050,12051,1744],{"class":1393},[1050,12053,1998],{"class":1109},[1050,12055,12057,12059,12061,12063,12065,12067],{"class":1052,"line":12056},288,[1050,12058,11462],{"class":1404},[1050,12060,1385],{"class":1109},[1050,12062,1276],{"class":1275},[1050,12064,8378],{"class":1279},[1050,12066,1276],{"class":1275},[1050,12068,1998],{"class":1109},[1050,12070,12072,12074,12076,12078,12080,12082,12084,12086,12088,12090],{"class":1052,"line":12071},289,[1050,12073,11478],{"class":1404},[1050,12075,1385],{"class":1109},[1050,12077,3971],{"class":1213},[1050,12079,11485],{"class":1279},[1050,12081,2600],{"class":2599},[1050,12083,1744],{"class":1393},[1050,12085,1110],{"class":1109},[1050,12087,3860],{"class":1806},[1050,12089,2610],{"class":2599},[1050,12091,12092],{"class":1279}," logged out\"\n",[1050,12094,12096],{"class":1052,"line":12095},290,[1050,12097,5138],{"class":1109},[1030,12099,12101],{"id":12100},"compliance-and-audit-framework","Compliance and Audit Framework",[1035,12103,12105],{"id":12104},"gdpr-compliance-implementation","GDPR Compliance Implementation",[1040,12107,12109],{"className":1042,"code":12108,"language":1044,"meta":1045,"style":1045},"# compliance/gdpr.py\nfrom django.db import models\nfrom django.contrib.auth.models import User\nfrom django.utils import timezone\nimport json\n\nclass DataProcessingPurpose(models.Model):\n    \"\"\"GDPR data processing purposes\"\"\"\n    \n    name = models.CharField(max_length=100, unique=True)\n    description = models.TextField()\n    legal_basis = models.CharField(max_length=50, choices=[\n        ('consent', 'Consent'),\n        ('contract', 'Contract'),\n        ('legal_obligation', 'Legal Obligation'),\n        ('vital_interests', 'Vital Interests'),\n        ('public_task', 'Public Task'),\n        ('legitimate_interests', 'Legitimate Interests'),\n    ])\n    retention_period = models.IntegerField(help_text=\"Retention period in days\")\n    is_active = models.BooleanField(default=True)\n    \n    def __str__(self):\n        return self.name\n\nclass ConsentRecord(models.Model):\n    \"\"\"GDPR consent tracking\"\"\"\n    \n    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='consent_records')\n    purpose = models.ForeignKey(DataProcessingPurpose, on_delete=models.CASCADE)\n    consent_given = models.BooleanField()\n    consent_date = models.DateTimeField(auto_now_add=True)\n    consent_method = models.CharField(max_length=50, choices=[\n        ('web_form', 'Web Form'),\n        ('email', 'Email'),\n        ('phone', 'Phone'),\n        ('paper', 'Paper'),\n    ])\n    ip_address = models.GenericIPAddressField(null=True, blank=True)\n    user_agent = models.TextField(blank=True)\n    \n    # Withdrawal tracking\n    withdrawn_date = models.DateTimeField(null=True, blank=True)\n    withdrawal_method = models.CharField(max_length=50, blank=True)\n    \n    class Meta:\n        unique_together = ['user', 'purpose']\n        indexes = [\n            models.Index(fields=['user', 'consent_given']),\n            models.Index(fields=['purpose', 'consent_given']),\n        ]\n    \n    def withdraw_consent(self, method='web_form'):\n        \"\"\"Withdraw consent\"\"\"\n        self.consent_given = False\n        self.withdrawn_date = timezone.now()\n        self.withdrawal_method = method\n        self.save()\n\nclass DataExportRequest(models.Model):\n    \"\"\"GDPR data export requests\"\"\"\n    \n    STATUS_CHOICES = [\n        ('pending', 'Pending'),\n        ('processing', 'Processing'),\n        ('completed', 'Completed'),\n        ('failed', 'Failed'),\n    ]\n    \n    user = models.ForeignKey(User, on_delete=models.CASCADE)\n    request_date = models.DateTimeField(auto_now_add=True)\n    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')\n    export_file = models.FileField(upload_to='gdpr_exports/', blank=True)\n    completion_date = models.DateTimeField(null=True, blank=True)\n    error_message = models.TextField(blank=True)\n    \n    def generate_export(self):\n        \"\"\"Generate user data export\"\"\"\n        try:\n            self.status = 'processing'\n            self.save()\n            \n            # Collect user data from all relevant models\n            user_data = self._collect_user_data()\n            \n            # Create export file\n            import tempfile\n            import json\n            \n            with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:\n                json.dump(user_data, f, indent=2, default=str)\n                temp_path = f.name\n            \n            # Save to model\n            from django.core.files import File\n            with open(temp_path, 'rb') as f:\n                self.export_file.save(\n                    f'user_{self.user.id}_export_{timezone.now().strftime(\"%Y%m%d_%H%M%S\")}.json',\n                    File(f)\n                )\n            \n            self.status = 'completed'\n            self.completion_date = timezone.now()\n            self.save()\n            \n            # Clean up temp file\n            import os\n            os.unlink(temp_path)\n            \n        except Exception as e:\n            self.status = 'failed'\n            self.error_message = str(e)\n            self.save()\n    \n    def _collect_user_data(self):\n        \"\"\"Collect all user data for export\"\"\"\n        from django.apps import apps\n        \n        user_data = {\n            'user_info': {\n                'id': self.user.id,\n                'username': self.user.username,\n                'email': self.user.email,\n                'first_name': self.user.first_name,\n                'last_name': self.user.last_name,\n                'date_joined': self.user.date_joined,\n                'last_login': self.user.last_login,\n            },\n            'consent_records': [],\n            'security_events': [],\n            'related_data': {}\n        }\n        \n        # Collect consent records\n        for consent in self.user.consent_records.all():\n            user_data['consent_records'].append({\n                'purpose': consent.purpose.name,\n                'consent_given': consent.consent_given,\n                'consent_date': consent.consent_date,\n                'withdrawn_date': consent.withdrawn_date,\n            })\n        \n        # Collect security events\n        for event in SecurityEvent.objects.filter(user=self.user):\n            user_data['security_events'].append({\n                'event_type': event.event_type,\n                'timestamp': event.timestamp,\n                'ip_address': event.ip_address,\n                'description': event.description,\n            })\n        \n        # Collect data from other models\n        for model in apps.get_models():\n            if hasattr(model, 'user') and model != User:\n                try:\n                    related_objects = model.objects.filter(user=self.user)\n                    if related_objects.exists():\n                        model_name = model._meta.label_lower\n                        user_data['related_data'][model_name] = []\n                        \n                        for obj in related_objects:\n                            obj_data = {}\n                            for field in model._meta.fields:\n                                if not field.name.endswith('_id'):  # Skip foreign key IDs\n                                    value = getattr(obj, field.name)\n                                    obj_data[field.name] = value\n                            user_data['related_data'][model_name].append(obj_data)\n                \n                except Exception:\n                    # Skip models that cause errors\n                    pass\n        \n        return user_data\n\nclass DataDeletionRequest(models.Model):\n    \"\"\"GDPR data deletion requests\"\"\"\n    \n    STATUS_CHOICES = [\n        ('pending', 'Pending'),\n        ('processing', 'Processing'),\n        ('completed', 'Completed'),\n        ('failed', 'Failed'),\n        ('rejected', 'Rejected'),\n    ]\n    \n    user = models.ForeignKey(User, on_delete=models.CASCADE)\n    request_date = models.DateTimeField(auto_now_add=True)\n    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')\n    reason = models.TextField(blank=True)\n    completion_date = models.DateTimeField(null=True, blank=True)\n    rejection_reason = models.TextField(blank=True)\n    \n    def process_deletion(self):\n        \"\"\"Process data deletion request\"\"\"\n        try:\n            self.status = 'processing'\n            self.save()\n            \n            # Check if deletion is allowed\n            if not self._can_delete_user_data():\n                self.status = 'rejected'\n                self.rejection_reason = \"User data cannot be deleted due to legal obligations\"\n                self.save()\n                return\n            \n            # Anonymize or delete user data\n            self._anonymize_user_data()\n            \n            self.status = 'completed'\n            self.completion_date = timezone.now()\n            self.save()\n            \n        except Exception as e:\n            self.status = 'failed'\n            self.save()\n    \n    def _can_delete_user_data(self):\n        \"\"\"Check if user data can be deleted\"\"\"\n        # Check for legal obligations that prevent deletion\n        # e.g., financial records, legal disputes, etc.\n        return True\n    \n    def _anonymize_user_data(self):\n        \"\"\"Anonymize user data\"\"\"\n        # Anonymize user record\n        self.user.username = f\"deleted_user_{self.user.id}\"\n        self.user.email = f\"deleted_{self.user.id}@example.com\"\n        self.user.first_name = \"\"\n        self.user.last_name = \"\"\n        self.user.is_active = False\n        self.user.save()\n        \n        # Anonymize related data\n        from django.apps import apps\n        \n        for model in apps.get_models():\n            if hasattr(model, 'user'):\n                try:\n                    # Instead of deleting, anonymize personal data\n                    related_objects = model.objects.filter(user=self.user)\n                    for obj in related_objects:\n                        # Anonymize personal fields\n                        for field in model._meta.fields:\n                            if field.name in ['email', 'phone', 'address', 'name']:\n                                setattr(obj, field.name, f\"[DELETED_{obj.id}]\")\n                        obj.save()\n                \n                except Exception:\n                    # Skip models that cause errors\n                    pass\n\n# GDPR compliance utilities\nclass GDPRCompliance:\n    \"\"\"GDPR compliance utilities\"\"\"\n    \n    @staticmethod\n    def check_consent(user, purpose_name):\n        \"\"\"Check if user has given consent for specific purpose\"\"\"\n        try:\n            purpose = DataProcessingPurpose.objects.get(name=purpose_name)\n            consent = ConsentRecord.objects.get(user=user, purpose=purpose)\n            return consent.consent_given and not consent.withdrawn_date\n        except (DataProcessingPurpose.DoesNotExist, ConsentRecord.DoesNotExist):\n            return False\n    \n    @staticmethod\n    def record_consent(user, purpose_name, consent_given, method='web_form', \n                      ip_address=None, user_agent=''):\n        \"\"\"Record user consent\"\"\"\n        purpose = DataProcessingPurpose.objects.get(name=purpose_name)\n        \n        consent, created = ConsentRecord.objects.update_or_create(\n            user=user,\n            purpose=purpose,\n            defaults={\n                'consent_given': consent_given,\n                'consent_method': method,\n                'ip_address': ip_address,\n                'user_agent': user_agent,\n                'withdrawn_date': None,\n                'withdrawal_method': '',\n            }\n        )\n        \n        return consent\n    \n    @staticmethod\n    def get_data_retention_date(user, purpose_name):\n        \"\"\"Get data retention date for user and purpose\"\"\"\n        try:\n            purpose = DataProcessingPurpose.objects.get(name=purpose_name)\n            consent = ConsentRecord.objects.get(user=user, purpose=purpose)\n            \n            if consent.withdrawn_date:\n                # Data should be deleted immediately after withdrawal\n                return consent.withdrawn_date\n            else:\n                # Data should be deleted after retention period\n                return consent.consent_date + timezone.timedelta(days=purpose.retention_period)\n        \n        except (DataProcessingPurpose.DoesNotExist, ConsentRecord.DoesNotExist):\n            return None\n",[1047,12110,12111,12116,12130,12152,12166,12172,12176,12193,12202,12206,12236,12250,12278,12300,12322,12344,12366,12388,12410,12415,12445,12467,12471,12483,12493,12497,12514,12523,12527,12570,12602,12617,12640,12667,12689,12709,12731,12753,12757,12787,12809,12813,12818,12849,12880,12884,12892,12917,12925,12956,12986,12990,12994,13020,13029,13041,13060,13074,13084,13088,13105,13114,13118,13127,13149,13171,13193,13215,13219,13223,13253,13276,13320,13358,13389,13412,13416,13429,13438,13444,13461,13471,13475,13480,13496,13500,13505,13513,13519,13523,13582,13620,13633,13637,13642,13662,13691,13706,13769,13780,13784,13788,13804,13823,13833,13837,13842,13849,13865,13869,13883,13899,13920,13930,13934,13947,13956,13972,13976,13985,13998,14020,14042,14064,14087,14110,14133,14156,14161,14174,14187,14200,14204,14208,14213,14240,14261,14284,14302,14321,14339,14344,14348,14353,14386,14404,14422,14440,14458,14476,14480,14484,14489,14508,14540,14547,14579,14593,14612,14638,14643,14657,14666,14688,14722,14745,14766,14794,14798,14807,14812,14817,14821,14828,14832,14849,14858,14862,14870,14890,14910,14930,14950,14972,14976,14980,15010,15032,15074,15097,15127,15150,15154,15167,15176,15182,15198,15208,15212,15217,15232,15248,15267,15277,15282,15286,15291,15302,15306,15322,15340,15350,15354,15366,15382,15392,15396,15409,15418,15423,15428,15434,15438,15451,15460,15465,15500,15536,15553,15569,15585,15599,15603,15608,15622,15626,15642,15662,15668,15673,15703,15716,15721,15741,15789,15828,15839,15843,15851,15855,15859,15863,15868,15877,15886,15890,15898,15916,15925,15931,15959,15995,16016,16038,16044,16048,16054,16090,16110,16119,16146,16150,16175,16185,16196,16204,16218,16233,16247,16261,16275,16289,16294,16298,16302,16309,16313,16319,16336,16345,16351,16378,16413,16418,16431,16437,16448,16456,16462,16499,16504,16527],{"__ignoreMap":1045},[1050,12112,12113],{"class":1052,"line":1053},[1050,12114,12115],{"class":1056},"# compliance/gdpr.py\n",[1050,12117,12118,12120,12122,12124,12126,12128],{"class":1052,"line":1060},[1050,12119,1082],{"class":1063},[1050,12121,1106],{"class":1067},[1050,12123,1110],{"class":1109},[1050,12125,1140],{"class":1067},[1050,12127,1064],{"class":1063},[1050,12129,1145],{"class":1067},[1050,12131,12132,12134,12136,12138,12140,12142,12144,12146,12148,12150],{"class":1052,"line":1071},[1050,12133,1082],{"class":1063},[1050,12135,1106],{"class":1067},[1050,12137,1110],{"class":1109},[1050,12139,1113],{"class":1067},[1050,12141,1110],{"class":1109},[1050,12143,1118],{"class":1067},[1050,12145,1110],{"class":1109},[1050,12147,1123],{"class":1067},[1050,12149,1064],{"class":1063},[1050,12151,1128],{"class":1067},[1050,12153,12154,12156,12158,12160,12162,12164],{"class":1052,"line":1079},[1050,12155,1082],{"class":1063},[1050,12157,1106],{"class":1067},[1050,12159,1110],{"class":1109},[1050,12161,1157],{"class":1067},[1050,12163,1064],{"class":1063},[1050,12165,1162],{"class":1067},[1050,12167,12168,12170],{"class":1052,"line":1093},[1050,12169,1064],{"class":1063},[1050,12171,7955],{"class":1067},[1050,12173,12174],{"class":1052,"line":1101},[1050,12175,1207],{"emptyLinePlaceholder":1206},[1050,12177,12178,12180,12183,12185,12187,12189,12191],{"class":1052,"line":1131},[1050,12179,1214],{"class":1213},[1050,12181,12182],{"class":1217}," DataProcessingPurpose",[1050,12184,1221],{"class":1109},[1050,12186,1225],{"class":1224},[1050,12188,1110],{"class":1109},[1050,12190,1230],{"class":1224},[1050,12192,1233],{"class":1109},[1050,12194,12195,12197,12200],{"class":1052,"line":1148},[1050,12196,1240],{"class":1239},[1050,12198,12199],{"class":1243},"GDPR data processing purposes",[1050,12201,1247],{"class":1239},[1050,12203,12204],{"class":1052,"line":1165},[1050,12205,1253],{"class":1067},[1050,12207,12208,12210,12212,12214,12216,12218,12220,12222,12224,12226,12228,12230,12232,12234],{"class":1052,"line":1187},[1050,12209,1438],{"class":1067},[1050,12211,1385],{"class":1109},[1050,12213,1388],{"class":1067},[1050,12215,1110],{"class":1109},[1050,12217,1447],{"class":1393},[1050,12219,1221],{"class":1109},[1050,12221,1452],{"class":1404},[1050,12223,1385],{"class":1109},[1050,12225,1458],{"class":1457},[1050,12227,1285],{"class":1109},[1050,12229,4863],{"class":1404},[1050,12231,1385],{"class":1109},[1050,12233,1530],{"class":1529},[1050,12235,1432],{"class":1109},[1050,12237,12238,12240,12242,12244,12246,12248],{"class":1052,"line":1195},[1050,12239,4874],{"class":1067},[1050,12241,1385],{"class":1109},[1050,12243,1388],{"class":1067},[1050,12245,1110],{"class":1109},[1050,12247,4883],{"class":1393},[1050,12249,1843],{"class":1109},[1050,12251,12252,12255,12257,12259,12261,12263,12265,12267,12269,12271,12273,12275],{"class":1052,"line":1203},[1050,12253,12254],{"class":1067},"    legal_basis ",[1050,12256,1385],{"class":1109},[1050,12258,1388],{"class":1067},[1050,12260,1110],{"class":1109},[1050,12262,1447],{"class":1393},[1050,12264,1221],{"class":1109},[1050,12266,1452],{"class":1404},[1050,12268,1385],{"class":1109},[1050,12270,8487],{"class":1457},[1050,12272,1285],{"class":1109},[1050,12274,1488],{"class":1404},[1050,12276,12277],{"class":1109},"=[\n",[1050,12279,12280,12282,12284,12287,12289,12291,12293,12296,12298],{"class":1052,"line":1210},[1050,12281,1272],{"class":1109},[1050,12283,1276],{"class":1275},[1050,12285,12286],{"class":1279},"consent",[1050,12288,1276],{"class":1275},[1050,12290,1285],{"class":1109},[1050,12292,1288],{"class":1275},[1050,12294,12295],{"class":1279},"Consent",[1050,12297,1276],{"class":1275},[1050,12299,1296],{"class":1109},[1050,12301,12302,12304,12306,12309,12311,12313,12315,12318,12320],{"class":1052,"line":1236},[1050,12303,1272],{"class":1109},[1050,12305,1276],{"class":1275},[1050,12307,12308],{"class":1279},"contract",[1050,12310,1276],{"class":1275},[1050,12312,1285],{"class":1109},[1050,12314,1288],{"class":1275},[1050,12316,12317],{"class":1279},"Contract",[1050,12319,1276],{"class":1275},[1050,12321,1296],{"class":1109},[1050,12323,12324,12326,12328,12331,12333,12335,12337,12340,12342],{"class":1052,"line":1250},[1050,12325,1272],{"class":1109},[1050,12327,1276],{"class":1275},[1050,12329,12330],{"class":1279},"legal_obligation",[1050,12332,1276],{"class":1275},[1050,12334,1285],{"class":1109},[1050,12336,1288],{"class":1275},[1050,12338,12339],{"class":1279},"Legal Obligation",[1050,12341,1276],{"class":1275},[1050,12343,1296],{"class":1109},[1050,12345,12346,12348,12350,12353,12355,12357,12359,12362,12364],{"class":1052,"line":1256},[1050,12347,1272],{"class":1109},[1050,12349,1276],{"class":1275},[1050,12351,12352],{"class":1279},"vital_interests",[1050,12354,1276],{"class":1275},[1050,12356,1285],{"class":1109},[1050,12358,1288],{"class":1275},[1050,12360,12361],{"class":1279},"Vital Interests",[1050,12363,1276],{"class":1275},[1050,12365,1296],{"class":1109},[1050,12367,12368,12370,12372,12375,12377,12379,12381,12384,12386],{"class":1052,"line":1269},[1050,12369,1272],{"class":1109},[1050,12371,1276],{"class":1275},[1050,12373,12374],{"class":1279},"public_task",[1050,12376,1276],{"class":1275},[1050,12378,1285],{"class":1109},[1050,12380,1288],{"class":1275},[1050,12382,12383],{"class":1279},"Public Task",[1050,12385,1276],{"class":1275},[1050,12387,1296],{"class":1109},[1050,12389,12390,12392,12394,12397,12399,12401,12403,12406,12408],{"class":1052,"line":1299},[1050,12391,1272],{"class":1109},[1050,12393,1276],{"class":1275},[1050,12395,12396],{"class":1279},"legitimate_interests",[1050,12398,1276],{"class":1275},[1050,12400,1285],{"class":1109},[1050,12402,1288],{"class":1275},[1050,12404,12405],{"class":1279},"Legitimate Interests",[1050,12407,1276],{"class":1275},[1050,12409,1296],{"class":1109},[1050,12411,12412],{"class":1052,"line":1322},[1050,12413,12414],{"class":1109},"    ])\n",[1050,12416,12417,12420,12422,12424,12426,12429,12431,12434,12436,12438,12441,12443],{"class":1052,"line":1345},[1050,12418,12419],{"class":1067},"    retention_period ",[1050,12421,1385],{"class":1109},[1050,12423,1388],{"class":1067},[1050,12425,1110],{"class":1109},[1050,12427,12428],{"class":1393},"IntegerField",[1050,12430,1221],{"class":1109},[1050,12432,12433],{"class":1404},"help_text",[1050,12435,1385],{"class":1109},[1050,12437,2009],{"class":1275},[1050,12439,12440],{"class":1279},"Retention period in days",[1050,12442,2009],{"class":1275},[1050,12444,1432],{"class":1109},[1050,12446,12447,12449,12451,12453,12455,12457,12459,12461,12463,12465],{"class":1052,"line":1368},[1050,12448,1633],{"class":1067},[1050,12450,1385],{"class":1109},[1050,12452,1388],{"class":1067},[1050,12454,1110],{"class":1109},[1050,12456,1642],{"class":1393},[1050,12458,1221],{"class":1109},[1050,12460,1611],{"class":1404},[1050,12462,1385],{"class":1109},[1050,12464,1530],{"class":1529},[1050,12466,1432],{"class":1109},[1050,12468,12469],{"class":1052,"line":1374},[1050,12470,1253],{"class":1067},[1050,12472,12473,12475,12477,12479,12481],{"class":1052,"line":1379},[1050,12474,1769],{"class":1213},[1050,12476,4948],{"class":3101},[1050,12478,1221],{"class":1109},[1050,12480,1779],{"class":1778},[1050,12482,1233],{"class":1109},[1050,12484,12485,12487,12489,12491],{"class":1052,"line":1435},[1050,12486,2217],{"class":1063},[1050,12488,1801],{"class":1259},[1050,12490,1110],{"class":1109},[1050,12492,4965],{"class":1806},[1050,12494,12495],{"class":1052,"line":1463},[1050,12496,1207],{"emptyLinePlaceholder":1206},[1050,12498,12499,12501,12504,12506,12508,12510,12512],{"class":1052,"line":1499},[1050,12500,1214],{"class":1213},[1050,12502,12503],{"class":1217}," ConsentRecord",[1050,12505,1221],{"class":1109},[1050,12507,1225],{"class":1224},[1050,12509,1110],{"class":1109},[1050,12511,1230],{"class":1224},[1050,12513,1233],{"class":1109},[1050,12515,12516,12518,12521],{"class":1052,"line":1535},[1050,12517,1240],{"class":1239},[1050,12519,12520],{"class":1243},"GDPR consent tracking",[1050,12522,1247],{"class":1239},[1050,12524,12525],{"class":1052,"line":1568},[1050,12526,1253],{"class":1067},[1050,12528,12529,12531,12533,12535,12537,12539,12541,12543,12545,12547,12549,12551,12553,12555,12557,12559,12561,12563,12566,12568],{"class":1052,"line":1594},[1050,12530,1382],{"class":1067},[1050,12532,1385],{"class":1109},[1050,12534,1388],{"class":1067},[1050,12536,1110],{"class":1109},[1050,12538,1394],{"class":1393},[1050,12540,1221],{"class":1109},[1050,12542,1399],{"class":1393},[1050,12544,1285],{"class":1109},[1050,12546,1405],{"class":1404},[1050,12548,1385],{"class":1109},[1050,12550,1225],{"class":1393},[1050,12552,1110],{"class":1109},[1050,12554,1415],{"class":1414},[1050,12556,1285],{"class":1109},[1050,12558,1420],{"class":1404},[1050,12560,1385],{"class":1109},[1050,12562,1276],{"class":1275},[1050,12564,12565],{"class":1279},"consent_records",[1050,12567,1276],{"class":1275},[1050,12569,1432],{"class":1109},[1050,12571,12572,12575,12577,12579,12581,12583,12585,12588,12590,12592,12594,12596,12598,12600],{"class":1052,"line":1630},[1050,12573,12574],{"class":1067},"    purpose ",[1050,12576,1385],{"class":1109},[1050,12578,1388],{"class":1067},[1050,12580,1110],{"class":1109},[1050,12582,1394],{"class":1393},[1050,12584,1221],{"class":1109},[1050,12586,12587],{"class":1393},"DataProcessingPurpose",[1050,12589,1285],{"class":1109},[1050,12591,1405],{"class":1404},[1050,12593,1385],{"class":1109},[1050,12595,1225],{"class":1393},[1050,12597,1110],{"class":1109},[1050,12599,1415],{"class":1414},[1050,12601,1432],{"class":1109},[1050,12603,12604,12607,12609,12611,12613,12615],{"class":1052,"line":1655},[1050,12605,12606],{"class":1067},"    consent_given ",[1050,12608,1385],{"class":1109},[1050,12610,1388],{"class":1067},[1050,12612,1110],{"class":1109},[1050,12614,1642],{"class":1393},[1050,12616,1843],{"class":1109},[1050,12618,12619,12622,12624,12626,12628,12630,12632,12634,12636,12638],{"class":1052,"line":1689},[1050,12620,12621],{"class":1067},"    consent_date ",[1050,12623,1385],{"class":1109},[1050,12625,1388],{"class":1067},[1050,12627,1110],{"class":1109},[1050,12629,1667],{"class":1393},[1050,12631,1221],{"class":1109},[1050,12633,1705],{"class":1404},[1050,12635,1385],{"class":1109},[1050,12637,1530],{"class":1529},[1050,12639,1432],{"class":1109},[1050,12641,12642,12645,12647,12649,12651,12653,12655,12657,12659,12661,12663,12665],{"class":1052,"line":1714},[1050,12643,12644],{"class":1067},"    consent_method ",[1050,12646,1385],{"class":1109},[1050,12648,1388],{"class":1067},[1050,12650,1110],{"class":1109},[1050,12652,1447],{"class":1393},[1050,12654,1221],{"class":1109},[1050,12656,1452],{"class":1404},[1050,12658,1385],{"class":1109},[1050,12660,8487],{"class":1457},[1050,12662,1285],{"class":1109},[1050,12664,1488],{"class":1404},[1050,12666,12277],{"class":1109},[1050,12668,12669,12671,12673,12676,12678,12680,12682,12685,12687],{"class":1052,"line":1719},[1050,12670,1272],{"class":1109},[1050,12672,1276],{"class":1275},[1050,12674,12675],{"class":1279},"web_form",[1050,12677,1276],{"class":1275},[1050,12679,1285],{"class":1109},[1050,12681,1288],{"class":1275},[1050,12683,12684],{"class":1279},"Web Form",[1050,12686,1276],{"class":1275},[1050,12688,1296],{"class":1109},[1050,12690,12691,12693,12695,12697,12699,12701,12703,12705,12707],{"class":1052,"line":1731},[1050,12692,1272],{"class":1109},[1050,12694,1276],{"class":1275},[1050,12696,1329],{"class":1279},[1050,12698,1276],{"class":1275},[1050,12700,1285],{"class":1109},[1050,12702,1288],{"class":1275},[1050,12704,1338],{"class":1279},[1050,12706,1276],{"class":1275},[1050,12708,1296],{"class":1109},[1050,12710,12711,12713,12715,12718,12720,12722,12724,12727,12729],{"class":1052,"line":1761},[1050,12712,1272],{"class":1109},[1050,12714,1276],{"class":1275},[1050,12716,12717],{"class":1279},"phone",[1050,12719,1276],{"class":1275},[1050,12721,1285],{"class":1109},[1050,12723,1288],{"class":1275},[1050,12725,12726],{"class":1279},"Phone",[1050,12728,1276],{"class":1275},[1050,12730,1296],{"class":1109},[1050,12732,12733,12735,12737,12740,12742,12744,12746,12749,12751],{"class":1052,"line":1766},[1050,12734,1272],{"class":1109},[1050,12736,1276],{"class":1275},[1050,12738,12739],{"class":1279},"paper",[1050,12741,1276],{"class":1275},[1050,12743,1285],{"class":1109},[1050,12745,1288],{"class":1275},[1050,12747,12748],{"class":1279},"Paper",[1050,12750,1276],{"class":1275},[1050,12752,1296],{"class":1109},[1050,12754,12755],{"class":1052,"line":1784},[1050,12756,12414],{"class":1109},[1050,12758,12759,12761,12763,12765,12767,12769,12771,12773,12775,12777,12779,12781,12783,12785],{"class":1052,"line":1795},[1050,12760,8596],{"class":1067},[1050,12762,1385],{"class":1109},[1050,12764,1388],{"class":1067},[1050,12766,1110],{"class":1109},[1050,12768,8605],{"class":1393},[1050,12770,1221],{"class":1109},[1050,12772,1672],{"class":1404},[1050,12774,1385],{"class":1109},[1050,12776,1530],{"class":1529},[1050,12778,1285],{"class":1109},[1050,12780,1524],{"class":1404},[1050,12782,1385],{"class":1109},[1050,12784,1530],{"class":1529},[1050,12786,1432],{"class":1109},[1050,12788,12789,12791,12793,12795,12797,12799,12801,12803,12805,12807],{"class":1052,"line":1822},[1050,12790,8612],{"class":1067},[1050,12792,1385],{"class":1109},[1050,12794,1388],{"class":1067},[1050,12796,1110],{"class":1109},[1050,12798,4883],{"class":1393},[1050,12800,1221],{"class":1109},[1050,12802,1585],{"class":1404},[1050,12804,1385],{"class":1109},[1050,12806,1530],{"class":1529},[1050,12808,1432],{"class":1109},[1050,12810,12811],{"class":1052,"line":1846},[1050,12812,1253],{"class":1067},[1050,12814,12815],{"class":1052,"line":1858},[1050,12816,12817],{"class":1056},"    # Withdrawal tracking\n",[1050,12819,12820,12823,12825,12827,12829,12831,12833,12835,12837,12839,12841,12843,12845,12847],{"class":1052,"line":1863},[1050,12821,12822],{"class":1067},"    withdrawn_date ",[1050,12824,1385],{"class":1109},[1050,12826,1388],{"class":1067},[1050,12828,1110],{"class":1109},[1050,12830,1667],{"class":1393},[1050,12832,1221],{"class":1109},[1050,12834,1672],{"class":1404},[1050,12836,1385],{"class":1109},[1050,12838,1530],{"class":1529},[1050,12840,1285],{"class":1109},[1050,12842,1524],{"class":1404},[1050,12844,1385],{"class":1109},[1050,12846,1530],{"class":1529},[1050,12848,1432],{"class":1109},[1050,12850,12851,12854,12856,12858,12860,12862,12864,12866,12868,12870,12872,12874,12876,12878],{"class":1052,"line":1877},[1050,12852,12853],{"class":1067},"    withdrawal_method ",[1050,12855,1385],{"class":1109},[1050,12857,1388],{"class":1067},[1050,12859,1110],{"class":1109},[1050,12861,1447],{"class":1393},[1050,12863,1221],{"class":1109},[1050,12865,1452],{"class":1404},[1050,12867,1385],{"class":1109},[1050,12869,8487],{"class":1457},[1050,12871,1285],{"class":1109},[1050,12873,1524],{"class":1404},[1050,12875,1385],{"class":1109},[1050,12877,1530],{"class":1529},[1050,12879,1432],{"class":1109},[1050,12881,12882],{"class":1052,"line":1887},[1050,12883,1253],{"class":1067},[1050,12885,12886,12888,12890],{"class":1052,"line":1921},[1050,12887,1722],{"class":1213},[1050,12889,1725],{"class":1217},[1050,12891,1728],{"class":1109},[1050,12893,12894,12896,12898,12900,12902,12904,12906,12908,12910,12913,12915],{"class":1052,"line":1930},[1050,12895,1734],{"class":1067},[1050,12897,1385],{"class":1109},[1050,12899,1739],{"class":1109},[1050,12901,1276],{"class":1275},[1050,12903,1744],{"class":1279},[1050,12905,1276],{"class":1275},[1050,12907,1285],{"class":1109},[1050,12909,1288],{"class":1275},[1050,12911,12912],{"class":1279},"purpose",[1050,12914,1276],{"class":1275},[1050,12916,1758],{"class":1109},[1050,12918,12919,12921,12923],{"class":1052,"line":1936},[1050,12920,8855],{"class":1067},[1050,12922,1385],{"class":1109},[1050,12924,1266],{"class":1109},[1050,12926,12927,12929,12931,12933,12935,12937,12939,12941,12943,12945,12947,12949,12952,12954],{"class":1052,"line":1961},[1050,12928,6594],{"class":1067},[1050,12930,1110],{"class":1109},[1050,12932,8868],{"class":1393},[1050,12934,1221],{"class":1109},[1050,12936,8873],{"class":1404},[1050,12938,8876],{"class":1109},[1050,12940,1276],{"class":1275},[1050,12942,1744],{"class":1279},[1050,12944,1276],{"class":1275},[1050,12946,1285],{"class":1109},[1050,12948,1288],{"class":1275},[1050,12950,12951],{"class":1279},"consent_given",[1050,12953,1276],{"class":1275},[1050,12955,8895],{"class":1109},[1050,12957,12958,12960,12962,12964,12966,12968,12970,12972,12974,12976,12978,12980,12982,12984],{"class":1052,"line":1980},[1050,12959,6594],{"class":1067},[1050,12961,1110],{"class":1109},[1050,12963,8868],{"class":1393},[1050,12965,1221],{"class":1109},[1050,12967,8873],{"class":1404},[1050,12969,8876],{"class":1109},[1050,12971,1276],{"class":1275},[1050,12973,12912],{"class":1279},[1050,12975,1276],{"class":1275},[1050,12977,1285],{"class":1109},[1050,12979,1288],{"class":1275},[1050,12981,12951],{"class":1279},[1050,12983,1276],{"class":1275},[1050,12985,8895],{"class":1109},[1050,12987,12988],{"class":1052,"line":2001},[1050,12989,8992],{"class":1109},[1050,12991,12992],{"class":1052,"line":2018},[1050,12993,1253],{"class":1067},[1050,12995,12996,12998,13001,13003,13005,13007,13010,13012,13014,13016,13018],{"class":1052,"line":2024},[1050,12997,1769],{"class":1213},[1050,12999,13000],{"class":1772}," withdraw_consent",[1050,13002,1221],{"class":1109},[1050,13004,1779],{"class":1778},[1050,13006,1285],{"class":1109},[1050,13008,13009],{"class":2264}," method",[1050,13011,1385],{"class":1810},[1050,13013,1276],{"class":1275},[1050,13015,12675],{"class":1279},[1050,13017,1276],{"class":1275},[1050,13019,1233],{"class":1109},[1050,13021,13022,13024,13027],{"class":1052,"line":2029},[1050,13023,1787],{"class":1239},[1050,13025,13026],{"class":1243},"Withdraw consent",[1050,13028,1247],{"class":1239},[1050,13030,13031,13033,13035,13037,13039],{"class":1052,"line":2076},[1050,13032,3166],{"class":1259},[1050,13034,1110],{"class":1109},[1050,13036,12951],{"class":1806},[1050,13038,1263],{"class":1109},[1050,13040,2301],{"class":1529},[1050,13042,13043,13045,13047,13050,13052,13054,13056,13058],{"class":1052,"line":2093},[1050,13044,3166],{"class":1259},[1050,13046,1110],{"class":1109},[1050,13048,13049],{"class":1806},"withdrawn_date",[1050,13051,1263],{"class":1109},[1050,13053,2703],{"class":1067},[1050,13055,1110],{"class":1109},[1050,13057,2708],{"class":1393},[1050,13059,1843],{"class":1109},[1050,13061,13062,13064,13066,13069,13071],{"class":1052,"line":2114},[1050,13063,3166],{"class":1259},[1050,13065,1110],{"class":1109},[1050,13067,13068],{"class":1806},"withdrawal_method",[1050,13070,1263],{"class":1109},[1050,13072,13073],{"class":1067}," method\n",[1050,13075,13076,13078,13080,13082],{"class":1052,"line":2119},[1050,13077,3166],{"class":1259},[1050,13079,1110],{"class":1109},[1050,13081,1853],{"class":1393},[1050,13083,1843],{"class":1109},[1050,13085,13086],{"class":1052,"line":2165},[1050,13087,1207],{"emptyLinePlaceholder":1206},[1050,13089,13090,13092,13095,13097,13099,13101,13103],{"class":1052,"line":2178},[1050,13091,1214],{"class":1213},[1050,13093,13094],{"class":1217}," DataExportRequest",[1050,13096,1221],{"class":1109},[1050,13098,1225],{"class":1224},[1050,13100,1110],{"class":1109},[1050,13102,1230],{"class":1224},[1050,13104,1233],{"class":1109},[1050,13106,13107,13109,13112],{"class":1052,"line":2209},[1050,13108,1240],{"class":1239},[1050,13110,13111],{"class":1243},"GDPR data export requests",[1050,13113,1247],{"class":1239},[1050,13115,13116],{"class":1052,"line":2214},[1050,13117,1253],{"class":1067},[1050,13119,13120,13123,13125],{"class":1052,"line":2245},[1050,13121,13122],{"class":1259},"    STATUS_CHOICES",[1050,13124,1263],{"class":1109},[1050,13126,1266],{"class":1109},[1050,13128,13129,13131,13133,13136,13138,13140,13142,13145,13147],{"class":1052,"line":2250},[1050,13130,1272],{"class":1109},[1050,13132,1276],{"class":1275},[1050,13134,13135],{"class":1279},"pending",[1050,13137,1276],{"class":1275},[1050,13139,1285],{"class":1109},[1050,13141,1288],{"class":1275},[1050,13143,13144],{"class":1279},"Pending",[1050,13146,1276],{"class":1275},[1050,13148,1296],{"class":1109},[1050,13150,13151,13153,13155,13158,13160,13162,13164,13167,13169],{"class":1052,"line":2270},[1050,13152,1272],{"class":1109},[1050,13154,1276],{"class":1275},[1050,13156,13157],{"class":1279},"processing",[1050,13159,1276],{"class":1275},[1050,13161,1285],{"class":1109},[1050,13163,1288],{"class":1275},[1050,13165,13166],{"class":1279},"Processing",[1050,13168,1276],{"class":1275},[1050,13170,1296],{"class":1109},[1050,13172,13173,13175,13177,13180,13182,13184,13186,13189,13191],{"class":1052,"line":2280},[1050,13174,1272],{"class":1109},[1050,13176,1276],{"class":1275},[1050,13178,13179],{"class":1279},"completed",[1050,13181,1276],{"class":1275},[1050,13183,1285],{"class":1109},[1050,13185,1288],{"class":1275},[1050,13187,13188],{"class":1279},"Completed",[1050,13190,1276],{"class":1275},[1050,13192,1296],{"class":1109},[1050,13194,13195,13197,13199,13202,13204,13206,13208,13211,13213],{"class":1052,"line":2296},[1050,13196,1272],{"class":1109},[1050,13198,1276],{"class":1275},[1050,13200,13201],{"class":1279},"failed",[1050,13203,1276],{"class":1275},[1050,13205,1285],{"class":1109},[1050,13207,1288],{"class":1275},[1050,13209,13210],{"class":1279},"Failed",[1050,13212,1276],{"class":1275},[1050,13214,1296],{"class":1109},[1050,13216,13217],{"class":1052,"line":2304},[1050,13218,1371],{"class":1109},[1050,13220,13221],{"class":1052,"line":2309},[1050,13222,1253],{"class":1067},[1050,13224,13225,13227,13229,13231,13233,13235,13237,13239,13241,13243,13245,13247,13249,13251],{"class":1052,"line":2330},[1050,13226,1382],{"class":1067},[1050,13228,1385],{"class":1109},[1050,13230,1388],{"class":1067},[1050,13232,1110],{"class":1109},[1050,13234,1394],{"class":1393},[1050,13236,1221],{"class":1109},[1050,13238,1399],{"class":1393},[1050,13240,1285],{"class":1109},[1050,13242,1405],{"class":1404},[1050,13244,1385],{"class":1109},[1050,13246,1225],{"class":1393},[1050,13248,1110],{"class":1109},[1050,13250,1415],{"class":1414},[1050,13252,1432],{"class":1109},[1050,13254,13255,13258,13260,13262,13264,13266,13268,13270,13272,13274],{"class":1052,"line":2349},[1050,13256,13257],{"class":1067},"    request_date ",[1050,13259,1385],{"class":1109},[1050,13261,1388],{"class":1067},[1050,13263,1110],{"class":1109},[1050,13265,1667],{"class":1393},[1050,13267,1221],{"class":1109},[1050,13269,1705],{"class":1404},[1050,13271,1385],{"class":1109},[1050,13273,1530],{"class":1529},[1050,13275,1432],{"class":1109},[1050,13277,13278,13281,13283,13285,13287,13289,13291,13293,13295,13297,13299,13301,13303,13306,13308,13310,13312,13314,13316,13318],{"class":1052,"line":2371},[1050,13279,13280],{"class":1067},"    status ",[1050,13282,1385],{"class":1109},[1050,13284,1388],{"class":1067},[1050,13286,1110],{"class":1109},[1050,13288,1447],{"class":1393},[1050,13290,1221],{"class":1109},[1050,13292,1452],{"class":1404},[1050,13294,1385],{"class":1109},[1050,13296,1555],{"class":1457},[1050,13298,1285],{"class":1109},[1050,13300,1488],{"class":1404},[1050,13302,1385],{"class":1109},[1050,13304,13305],{"class":1493},"STATUS_CHOICES",[1050,13307,1285],{"class":1109},[1050,13309,8533],{"class":1404},[1050,13311,1385],{"class":1109},[1050,13313,1276],{"class":1275},[1050,13315,13135],{"class":1279},[1050,13317,1276],{"class":1275},[1050,13319,1432],{"class":1109},[1050,13321,13322,13325,13327,13329,13331,13334,13336,13339,13341,13343,13346,13348,13350,13352,13354,13356],{"class":1052,"line":2389},[1050,13323,13324],{"class":1067},"    export_file ",[1050,13326,1385],{"class":1109},[1050,13328,1388],{"class":1067},[1050,13330,1110],{"class":1109},[1050,13332,13333],{"class":1393},"FileField",[1050,13335,1221],{"class":1109},[1050,13337,13338],{"class":1404},"upload_to",[1050,13340,1385],{"class":1109},[1050,13342,1276],{"class":1275},[1050,13344,13345],{"class":1279},"gdpr_exports/",[1050,13347,1276],{"class":1275},[1050,13349,1285],{"class":1109},[1050,13351,1524],{"class":1404},[1050,13353,1385],{"class":1109},[1050,13355,1530],{"class":1529},[1050,13357,1432],{"class":1109},[1050,13359,13360,13363,13365,13367,13369,13371,13373,13375,13377,13379,13381,13383,13385,13387],{"class":1052,"line":2422},[1050,13361,13362],{"class":1067},"    completion_date ",[1050,13364,1385],{"class":1109},[1050,13366,1388],{"class":1067},[1050,13368,1110],{"class":1109},[1050,13370,1667],{"class":1393},[1050,13372,1221],{"class":1109},[1050,13374,1672],{"class":1404},[1050,13376,1385],{"class":1109},[1050,13378,1530],{"class":1529},[1050,13380,1285],{"class":1109},[1050,13382,1524],{"class":1404},[1050,13384,1385],{"class":1109},[1050,13386,1530],{"class":1529},[1050,13388,1432],{"class":1109},[1050,13390,13391,13394,13396,13398,13400,13402,13404,13406,13408,13410],{"class":1052,"line":2440},[1050,13392,13393],{"class":1067},"    error_message ",[1050,13395,1385],{"class":1109},[1050,13397,1388],{"class":1067},[1050,13399,1110],{"class":1109},[1050,13401,4883],{"class":1393},[1050,13403,1221],{"class":1109},[1050,13405,1585],{"class":1404},[1050,13407,1385],{"class":1109},[1050,13409,1530],{"class":1529},[1050,13411,1432],{"class":1109},[1050,13413,13414],{"class":1052,"line":2445},[1050,13415,1253],{"class":1067},[1050,13417,13418,13420,13423,13425,13427],{"class":1052,"line":2452},[1050,13419,1769],{"class":1213},[1050,13421,13422],{"class":1772}," generate_export",[1050,13424,1221],{"class":1109},[1050,13426,1779],{"class":1778},[1050,13428,1233],{"class":1109},[1050,13430,13431,13433,13436],{"class":1052,"line":2457},[1050,13432,1787],{"class":1239},[1050,13434,13435],{"class":1243},"Generate user data export",[1050,13437,1247],{"class":1239},[1050,13439,13440,13442],{"class":1052,"line":2475},[1050,13441,4290],{"class":1063},[1050,13443,1728],{"class":1109},[1050,13445,13446,13448,13450,13453,13455,13457,13459],{"class":1052,"line":2485},[1050,13447,1825],{"class":1259},[1050,13449,1110],{"class":1109},[1050,13451,13452],{"class":1806},"status",[1050,13454,1263],{"class":1109},[1050,13456,1288],{"class":1275},[1050,13458,13157],{"class":1279},[1050,13460,9250],{"class":1275},[1050,13462,13463,13465,13467,13469],{"class":1052,"line":2508},[1050,13464,1825],{"class":1259},[1050,13466,1110],{"class":1109},[1050,13468,1853],{"class":1393},[1050,13470,1843],{"class":1109},[1050,13472,13473],{"class":1052,"line":2513},[1050,13474,4535],{"class":1067},[1050,13476,13477],{"class":1052,"line":2519},[1050,13478,13479],{"class":1056},"            # Collect user data from all relevant models\n",[1050,13481,13482,13485,13487,13489,13491,13494],{"class":1052,"line":2550},[1050,13483,13484],{"class":1067},"            user_data ",[1050,13486,1385],{"class":1109},[1050,13488,1801],{"class":1259},[1050,13490,1110],{"class":1109},[1050,13492,13493],{"class":1393},"_collect_user_data",[1050,13495,1843],{"class":1109},[1050,13497,13498],{"class":1052,"line":2579},[1050,13499,4535],{"class":1067},[1050,13501,13502],{"class":1052,"line":2585},[1050,13503,13504],{"class":1056},"            # Create export file\n",[1050,13506,13507,13510],{"class":1052,"line":2624},[1050,13508,13509],{"class":1063},"            import",[1050,13511,13512],{"class":1067}," tempfile\n",[1050,13514,13515,13517],{"class":1052,"line":2645},[1050,13516,13509],{"class":1063},[1050,13518,7955],{"class":1067},[1050,13520,13521],{"class":1052,"line":2653},[1050,13522,4535],{"class":1067},[1050,13524,13525,13528,13531,13533,13536,13538,13541,13543,13545,13548,13550,13552,13555,13557,13559,13562,13564,13566,13569,13571,13573,13575,13578,13580],{"class":1052,"line":2659},[1050,13526,13527],{"class":1063},"            with",[1050,13529,13530],{"class":1067}," tempfile",[1050,13532,1110],{"class":1109},[1050,13534,13535],{"class":1393},"NamedTemporaryFile",[1050,13537,1221],{"class":1109},[1050,13539,13540],{"class":1404},"mode",[1050,13542,1385],{"class":1109},[1050,13544,1276],{"class":1275},[1050,13546,13547],{"class":1279},"w",[1050,13549,1276],{"class":1275},[1050,13551,1285],{"class":1109},[1050,13553,13554],{"class":1404}," suffix",[1050,13556,1385],{"class":1109},[1050,13558,1276],{"class":1275},[1050,13560,13561],{"class":1279},".json",[1050,13563,1276],{"class":1275},[1050,13565,1285],{"class":1109},[1050,13567,13568],{"class":1404}," delete",[1050,13570,1385],{"class":1109},[1050,13572,3695],{"class":1529},[1050,13574,2684],{"class":1109},[1050,13576,13577],{"class":1063}," as",[1050,13579,2593],{"class":1067},[1050,13581,1728],{"class":1109},[1050,13583,13584,13587,13589,13592,13594,13597,13599,13601,13603,13605,13607,13609,13611,13613,13615,13618],{"class":1052,"line":2690},[1050,13585,13586],{"class":1067},"                json",[1050,13588,1110],{"class":1109},[1050,13590,13591],{"class":1393},"dump",[1050,13593,1221],{"class":1109},[1050,13595,13596],{"class":1393},"user_data",[1050,13598,1285],{"class":1109},[1050,13600,2593],{"class":1393},[1050,13602,1285],{"class":1109},[1050,13604,10382],{"class":1404},[1050,13606,1385],{"class":1109},[1050,13608,10387],{"class":1457},[1050,13610,1285],{"class":1109},[1050,13612,8533],{"class":1404},[1050,13614,1385],{"class":1109},[1050,13616,13617],{"class":1616},"str",[1050,13619,1432],{"class":1109},[1050,13621,13622,13625,13627,13629,13631],{"class":1052,"line":2713},[1050,13623,13624],{"class":1067},"                temp_path ",[1050,13626,1385],{"class":1109},[1050,13628,2593],{"class":1067},[1050,13630,1110],{"class":1109},[1050,13632,4965],{"class":1806},[1050,13634,13635],{"class":1052,"line":2724},[1050,13636,4535],{"class":1067},[1050,13638,13639],{"class":1052,"line":2733},[1050,13640,13641],{"class":1056},"            # Save to model\n",[1050,13643,13644,13646,13648,13650,13652,13654,13657,13659],{"class":1052,"line":2738},[1050,13645,4547],{"class":1063},[1050,13647,1106],{"class":1067},[1050,13649,1110],{"class":1109},[1050,13651,1174],{"class":1067},[1050,13653,1110],{"class":1109},[1050,13655,13656],{"class":1067},"files ",[1050,13658,1064],{"class":1063},[1050,13660,13661],{"class":1067}," File\n",[1050,13663,13664,13666,13669,13671,13674,13676,13678,13681,13683,13685,13687,13689],{"class":1052,"line":2745},[1050,13665,13527],{"class":1063},[1050,13667,13668],{"class":3101}," open",[1050,13670,1221],{"class":1109},[1050,13672,13673],{"class":1393},"temp_path",[1050,13675,1285],{"class":1109},[1050,13677,1288],{"class":1275},[1050,13679,13680],{"class":1279},"rb",[1050,13682,1276],{"class":1275},[1050,13684,2684],{"class":1109},[1050,13686,13577],{"class":1063},[1050,13688,2593],{"class":1067},[1050,13690,1728],{"class":1109},[1050,13692,13693,13695,13697,13700,13702,13704],{"class":1052,"line":2750},[1050,13694,2693],{"class":1259},[1050,13696,1110],{"class":1109},[1050,13698,13699],{"class":1806},"export_file",[1050,13701,1110],{"class":1109},[1050,13703,1853],{"class":1393},[1050,13705,1977],{"class":1109},[1050,13707,13708,13711,13714,13716,13718,13720,13722,13724,13726,13728,13731,13733,13736,13738,13740,13742,13745,13747,13749,13752,13755,13758,13760,13762,13764,13767],{"class":1052,"line":2769},[1050,13709,13710],{"class":1213},"                    f",[1050,13712,13713],{"class":1279},"'user_",[1050,13715,2600],{"class":2599},[1050,13717,1779],{"class":1259},[1050,13719,1110],{"class":1109},[1050,13721,1744],{"class":1806},[1050,13723,1110],{"class":1109},[1050,13725,2607],{"class":1806},[1050,13727,2610],{"class":2599},[1050,13729,13730],{"class":1279},"_export_",[1050,13732,2600],{"class":2599},[1050,13734,13735],{"class":1393},"timezone",[1050,13737,1110],{"class":1109},[1050,13739,2708],{"class":1393},[1050,13741,9796],{"class":1109},[1050,13743,13744],{"class":1393},"strftime",[1050,13746,1221],{"class":1109},[1050,13748,2009],{"class":1275},[1050,13750,13751],{"class":1279},"%Y%m",[1050,13753,13754],{"class":2599},"%d",[1050,13756,13757],{"class":1279},"_%H%M%S",[1050,13759,2009],{"class":1275},[1050,13761,2684],{"class":1109},[1050,13763,2610],{"class":2599},[1050,13765,13766],{"class":1279},".json'",[1050,13768,1998],{"class":1109},[1050,13770,13771,13774,13776,13778],{"class":1052,"line":2779},[1050,13772,13773],{"class":1393},"                    File",[1050,13775,1221],{"class":1109},[1050,13777,3971],{"class":1393},[1050,13779,1432],{"class":1109},[1050,13781,13782],{"class":1052,"line":2798},[1050,13783,11063],{"class":1109},[1050,13785,13786],{"class":1052,"line":2804},[1050,13787,4535],{"class":1067},[1050,13789,13790,13792,13794,13796,13798,13800,13802],{"class":1052,"line":2824},[1050,13791,1825],{"class":1259},[1050,13793,1110],{"class":1109},[1050,13795,13452],{"class":1806},[1050,13797,1263],{"class":1109},[1050,13799,1288],{"class":1275},[1050,13801,13179],{"class":1279},[1050,13803,9250],{"class":1275},[1050,13805,13806,13808,13810,13813,13815,13817,13819,13821],{"class":1052,"line":2843},[1050,13807,1825],{"class":1259},[1050,13809,1110],{"class":1109},[1050,13811,13812],{"class":1806},"completion_date",[1050,13814,1263],{"class":1109},[1050,13816,2703],{"class":1067},[1050,13818,1110],{"class":1109},[1050,13820,2708],{"class":1393},[1050,13822,1843],{"class":1109},[1050,13824,13825,13827,13829,13831],{"class":1052,"line":2854},[1050,13826,1825],{"class":1259},[1050,13828,1110],{"class":1109},[1050,13830,1853],{"class":1393},[1050,13832,1843],{"class":1109},[1050,13834,13835],{"class":1052,"line":2861},[1050,13836,4535],{"class":1067},[1050,13838,13839],{"class":1052,"line":2866},[1050,13840,13841],{"class":1056},"            # Clean up temp file\n",[1050,13843,13844,13846],{"class":1052,"line":2873},[1050,13845,13509],{"class":1063},[1050,13847,13848],{"class":1067}," os\n",[1050,13850,13851,13854,13856,13859,13861,13863],{"class":1052,"line":2878},[1050,13852,13853],{"class":1067},"            os",[1050,13855,1110],{"class":1109},[1050,13857,13858],{"class":1393},"unlink",[1050,13860,1221],{"class":1109},[1050,13862,13673],{"class":1393},[1050,13864,1432],{"class":1109},[1050,13866,13867],{"class":1052,"line":2896},[1050,13868,4535],{"class":1067},[1050,13870,13871,13873,13876,13878,13881],{"class":1052,"line":2906},[1050,13872,4327],{"class":1063},[1050,13874,13875],{"class":1616}," Exception",[1050,13877,13577],{"class":1063},[1050,13879,13880],{"class":1067}," e",[1050,13882,1728],{"class":1109},[1050,13884,13885,13887,13889,13891,13893,13895,13897],{"class":1052,"line":2931},[1050,13886,1825],{"class":1259},[1050,13888,1110],{"class":1109},[1050,13890,13452],{"class":1806},[1050,13892,1263],{"class":1109},[1050,13894,1288],{"class":1275},[1050,13896,13201],{"class":1279},[1050,13898,9250],{"class":1275},[1050,13900,13901,13903,13905,13908,13910,13913,13915,13918],{"class":1052,"line":2951},[1050,13902,1825],{"class":1259},[1050,13904,1110],{"class":1109},[1050,13906,13907],{"class":1806},"error_message",[1050,13909,1263],{"class":1109},[1050,13911,13912],{"class":1616}," str",[1050,13914,1221],{"class":1109},[1050,13916,13917],{"class":1393},"e",[1050,13919,1432],{"class":1109},[1050,13921,13922,13924,13926,13928],{"class":1052,"line":2956},[1050,13923,1825],{"class":1259},[1050,13925,1110],{"class":1109},[1050,13927,1853],{"class":1393},[1050,13929,1843],{"class":1109},[1050,13931,13932],{"class":1052,"line":2976},[1050,13933,1253],{"class":1067},[1050,13935,13936,13938,13941,13943,13945],{"class":1052,"line":2993},[1050,13937,1769],{"class":1213},[1050,13939,13940],{"class":1772}," _collect_user_data",[1050,13942,1221],{"class":1109},[1050,13944,1779],{"class":1778},[1050,13946,1233],{"class":1109},[1050,13948,13949,13951,13954],{"class":1052,"line":3012},[1050,13950,1787],{"class":1239},[1050,13952,13953],{"class":1243},"Collect all user data for export",[1050,13955,1247],{"class":1239},[1050,13957,13958,13960,13962,13964,13967,13969],{"class":1052,"line":3023},[1050,13959,3519],{"class":1063},[1050,13961,1106],{"class":1067},[1050,13963,1110],{"class":1109},[1050,13965,13966],{"class":1067},"apps ",[1050,13968,1064],{"class":1063},[1050,13970,13971],{"class":1067}," apps\n",[1050,13973,13974],{"class":1052,"line":3030},[1050,13975,1933],{"class":1067},[1050,13977,13978,13981,13983],{"class":1052,"line":3035},[1050,13979,13980],{"class":1067},"        user_data ",[1050,13982,1385],{"class":1109},[1050,13984,9661],{"class":1109},[1050,13986,13987,13989,13992,13994,13996],{"class":1052,"line":3042},[1050,13988,3619],{"class":1275},[1050,13990,13991],{"class":1279},"user_info",[1050,13993,1276],{"class":1275},[1050,13995,2613],{"class":1109},[1050,13997,9661],{"class":1109},[1050,13999,14000,14002,14004,14006,14008,14010,14012,14014,14016,14018],{"class":1052,"line":3047},[1050,14001,10777],{"class":1275},[1050,14003,2607],{"class":1279},[1050,14005,1276],{"class":1275},[1050,14007,2613],{"class":1109},[1050,14009,1801],{"class":1259},[1050,14011,1110],{"class":1109},[1050,14013,1744],{"class":1806},[1050,14015,1110],{"class":1109},[1050,14017,2607],{"class":1806},[1050,14019,1998],{"class":1109},[1050,14021,14022,14024,14026,14028,14030,14032,14034,14036,14038,14040],{"class":1052,"line":3070},[1050,14023,10777],{"class":1275},[1050,14025,3860],{"class":1279},[1050,14027,1276],{"class":1275},[1050,14029,2613],{"class":1109},[1050,14031,1801],{"class":1259},[1050,14033,1110],{"class":1109},[1050,14035,1744],{"class":1806},[1050,14037,1110],{"class":1109},[1050,14039,3860],{"class":1806},[1050,14041,1998],{"class":1109},[1050,14043,14044,14046,14048,14050,14052,14054,14056,14058,14060,14062],{"class":1052,"line":3080},[1050,14045,10777],{"class":1275},[1050,14047,1329],{"class":1279},[1050,14049,1276],{"class":1275},[1050,14051,2613],{"class":1109},[1050,14053,1801],{"class":1259},[1050,14055,1110],{"class":1109},[1050,14057,1744],{"class":1806},[1050,14059,1110],{"class":1109},[1050,14061,1329],{"class":1806},[1050,14063,1998],{"class":1109},[1050,14065,14066,14068,14071,14073,14075,14077,14079,14081,14083,14085],{"class":1052,"line":3091},[1050,14067,10777],{"class":1275},[1050,14069,14070],{"class":1279},"first_name",[1050,14072,1276],{"class":1275},[1050,14074,2613],{"class":1109},[1050,14076,1801],{"class":1259},[1050,14078,1110],{"class":1109},[1050,14080,1744],{"class":1806},[1050,14082,1110],{"class":1109},[1050,14084,14070],{"class":1806},[1050,14086,1998],{"class":1109},[1050,14088,14089,14091,14094,14096,14098,14100,14102,14104,14106,14108],{"class":1052,"line":3112},[1050,14090,10777],{"class":1275},[1050,14092,14093],{"class":1279},"last_name",[1050,14095,1276],{"class":1275},[1050,14097,2613],{"class":1109},[1050,14099,1801],{"class":1259},[1050,14101,1110],{"class":1109},[1050,14103,1744],{"class":1806},[1050,14105,1110],{"class":1109},[1050,14107,14093],{"class":1806},[1050,14109,1998],{"class":1109},[1050,14111,14112,14114,14117,14119,14121,14123,14125,14127,14129,14131],{"class":1052,"line":3141},[1050,14113,10777],{"class":1275},[1050,14115,14116],{"class":1279},"date_joined",[1050,14118,1276],{"class":1275},[1050,14120,2613],{"class":1109},[1050,14122,1801],{"class":1259},[1050,14124,1110],{"class":1109},[1050,14126,1744],{"class":1806},[1050,14128,1110],{"class":1109},[1050,14130,14116],{"class":1806},[1050,14132,1998],{"class":1109},[1050,14134,14135,14137,14140,14142,14144,14146,14148,14150,14152,14154],{"class":1052,"line":3158},[1050,14136,10777],{"class":1275},[1050,14138,14139],{"class":1279},"last_login",[1050,14141,1276],{"class":1275},[1050,14143,2613],{"class":1109},[1050,14145,1801],{"class":1259},[1050,14147,1110],{"class":1109},[1050,14149,1744],{"class":1806},[1050,14151,1110],{"class":1109},[1050,14153,14139],{"class":1806},[1050,14155,1998],{"class":1109},[1050,14157,14158],{"class":1052,"line":3163},[1050,14159,14160],{"class":1109},"            },\n",[1050,14162,14163,14165,14167,14169,14171],{"class":1052,"line":3178},[1050,14164,3619],{"class":1275},[1050,14166,12565],{"class":1279},[1050,14168,1276],{"class":1275},[1050,14170,2613],{"class":1109},[1050,14172,14173],{"class":1109}," [],\n",[1050,14175,14176,14178,14181,14183,14185],{"class":1052,"line":3189},[1050,14177,3619],{"class":1275},[1050,14179,14180],{"class":1279},"security_events",[1050,14182,1276],{"class":1275},[1050,14184,2613],{"class":1109},[1050,14186,14173],{"class":1109},[1050,14188,14189,14191,14194,14196,14198],{"class":1052,"line":3196},[1050,14190,3619],{"class":1275},[1050,14192,14193],{"class":1279},"related_data",[1050,14195,1276],{"class":1275},[1050,14197,2613],{"class":1109},[1050,14199,9412],{"class":1109},[1050,14201,14202],{"class":1052,"line":3201},[1050,14203,9840],{"class":1109},[1050,14205,14206],{"class":1052,"line":3215},[1050,14207,1933],{"class":1067},[1050,14209,14210],{"class":1052,"line":3225},[1050,14211,14212],{"class":1056},"        # Collect consent records\n",[1050,14214,14215,14217,14220,14222,14224,14226,14228,14230,14232,14234,14237],{"class":1052,"line":3258},[1050,14216,2522],{"class":1063},[1050,14218,14219],{"class":1067}," consent ",[1050,14221,2528],{"class":1063},[1050,14223,1801],{"class":1259},[1050,14225,1110],{"class":1109},[1050,14227,1744],{"class":1806},[1050,14229,1110],{"class":1109},[1050,14231,12565],{"class":1806},[1050,14233,1110],{"class":1109},[1050,14235,14236],{"class":1393},"all",[1050,14238,14239],{"class":1109},"():\n",[1050,14241,14242,14245,14247,14249,14251,14253,14256,14258],{"class":1052,"line":3265},[1050,14243,14244],{"class":1067},"            user_data",[1050,14246,7824],{"class":1109},[1050,14248,1276],{"class":1275},[1050,14250,12565],{"class":1279},[1050,14252,1276],{"class":1275},[1050,14254,14255],{"class":1109},"].",[1050,14257,3149],{"class":1393},[1050,14259,14260],{"class":1109},"({\n",[1050,14262,14263,14265,14267,14269,14271,14274,14276,14278,14280,14282],{"class":1052,"line":3270},[1050,14264,10777],{"class":1275},[1050,14266,12912],{"class":1279},[1050,14268,1276],{"class":1275},[1050,14270,2613],{"class":1109},[1050,14272,14273],{"class":1393}," consent",[1050,14275,1110],{"class":1109},[1050,14277,12912],{"class":1806},[1050,14279,1110],{"class":1109},[1050,14281,1753],{"class":1806},[1050,14283,1998],{"class":1109},[1050,14285,14286,14288,14290,14292,14294,14296,14298,14300],{"class":1052,"line":3276},[1050,14287,10777],{"class":1275},[1050,14289,12951],{"class":1279},[1050,14291,1276],{"class":1275},[1050,14293,2613],{"class":1109},[1050,14295,14273],{"class":1393},[1050,14297,1110],{"class":1109},[1050,14299,12951],{"class":1806},[1050,14301,1998],{"class":1109},[1050,14303,14304,14306,14309,14311,14313,14315,14317,14319],{"class":1052,"line":3298},[1050,14305,10777],{"class":1275},[1050,14307,14308],{"class":1279},"consent_date",[1050,14310,1276],{"class":1275},[1050,14312,2613],{"class":1109},[1050,14314,14273],{"class":1393},[1050,14316,1110],{"class":1109},[1050,14318,14308],{"class":1806},[1050,14320,1998],{"class":1109},[1050,14322,14323,14325,14327,14329,14331,14333,14335,14337],{"class":1052,"line":3321},[1050,14324,10777],{"class":1275},[1050,14326,13049],{"class":1279},[1050,14328,1276],{"class":1275},[1050,14330,2613],{"class":1109},[1050,14332,14273],{"class":1393},[1050,14334,1110],{"class":1109},[1050,14336,13049],{"class":1806},[1050,14338,1998],{"class":1109},[1050,14340,14341],{"class":1052,"line":3326},[1050,14342,14343],{"class":1109},"            })\n",[1050,14345,14346],{"class":1052,"line":3332},[1050,14347,1933],{"class":1067},[1050,14349,14350],{"class":1052,"line":3355},[1050,14351,14352],{"class":1056},"        # Collect security events\n",[1050,14354,14355,14357,14360,14362,14364,14366,14368,14370,14372,14374,14376,14378,14380,14382,14384],{"class":1052,"line":3381},[1050,14356,2522],{"class":1063},[1050,14358,14359],{"class":1067}," event ",[1050,14361,2528],{"class":1063},[1050,14363,8100],{"class":1067},[1050,14365,1110],{"class":1109},[1050,14367,4305],{"class":1806},[1050,14369,1110],{"class":1109},[1050,14371,4135],{"class":1393},[1050,14373,1221],{"class":1109},[1050,14375,1744],{"class":1404},[1050,14377,1385],{"class":1109},[1050,14379,1779],{"class":1259},[1050,14381,1110],{"class":1109},[1050,14383,1744],{"class":1806},[1050,14385,1233],{"class":1109},[1050,14387,14388,14390,14392,14394,14396,14398,14400,14402],{"class":1052,"line":3386},[1050,14389,14244],{"class":1067},[1050,14391,7824],{"class":1109},[1050,14393,1276],{"class":1275},[1050,14395,14180],{"class":1279},[1050,14397,1276],{"class":1275},[1050,14399,14255],{"class":1109},[1050,14401,3149],{"class":1393},[1050,14403,14260],{"class":1109},[1050,14405,14406,14408,14410,14412,14414,14416,14418,14420],{"class":1052,"line":3407},[1050,14407,10777],{"class":1275},[1050,14409,8881],{"class":1279},[1050,14411,1276],{"class":1275},[1050,14413,2613],{"class":1109},[1050,14415,9675],{"class":1393},[1050,14417,1110],{"class":1109},[1050,14419,8881],{"class":1806},[1050,14421,1998],{"class":1109},[1050,14423,14424,14426,14428,14430,14432,14434,14436,14438],{"class":1052,"line":3426},[1050,14425,10777],{"class":1275},[1050,14427,8890],{"class":1279},[1050,14429,1276],{"class":1275},[1050,14431,2613],{"class":1109},[1050,14433,9675],{"class":1393},[1050,14435,1110],{"class":1109},[1050,14437,8890],{"class":1806},[1050,14439,1998],{"class":1109},[1050,14441,14442,14444,14446,14448,14450,14452,14454,14456],{"class":1052,"line":3447},[1050,14443,10777],{"class":1275},[1050,14445,8944],{"class":1279},[1050,14447,1276],{"class":1275},[1050,14449,2613],{"class":1109},[1050,14451,9675],{"class":1393},[1050,14453,1110],{"class":1109},[1050,14455,8944],{"class":1806},[1050,14457,1998],{"class":1109},[1050,14459,14460,14462,14464,14466,14468,14470,14472,14474],{"class":1052,"line":3465},[1050,14461,10777],{"class":1275},[1050,14463,9586],{"class":1279},[1050,14465,1276],{"class":1275},[1050,14467,2613],{"class":1109},[1050,14469,9675],{"class":1393},[1050,14471,1110],{"class":1109},[1050,14473,9586],{"class":1806},[1050,14475,1998],{"class":1109},[1050,14477,14478],{"class":1052,"line":3470},[1050,14479,14343],{"class":1109},[1050,14481,14482],{"class":1052,"line":3477},[1050,14483,1933],{"class":1067},[1050,14485,14486],{"class":1052,"line":3482},[1050,14487,14488],{"class":1056},"        # Collect data from other models\n",[1050,14490,14491,14493,14496,14498,14501,14503,14506],{"class":1052,"line":3500},[1050,14492,2522],{"class":1063},[1050,14494,14495],{"class":1067}," model ",[1050,14497,2528],{"class":1063},[1050,14499,14500],{"class":1067}," apps",[1050,14502,1110],{"class":1109},[1050,14504,14505],{"class":1393},"get_models",[1050,14507,14239],{"class":1109},[1050,14509,14510,14512,14514,14516,14519,14521,14523,14525,14527,14529,14531,14533,14536,14538],{"class":1052,"line":3510},[1050,14511,2553],{"class":1063},[1050,14513,9320],{"class":3101},[1050,14515,1221],{"class":1109},[1050,14517,14518],{"class":1393},"model",[1050,14520,1285],{"class":1109},[1050,14522,1288],{"class":1275},[1050,14524,1744],{"class":1279},[1050,14526,1276],{"class":1275},[1050,14528,2684],{"class":1109},[1050,14530,4480],{"class":1810},[1050,14532,14495],{"class":1067},[1050,14534,14535],{"class":1810},"!=",[1050,14537,4300],{"class":1067},[1050,14539,1728],{"class":1109},[1050,14541,14542,14545],{"class":1052,"line":3516},[1050,14543,14544],{"class":1063},"                try",[1050,14546,1728],{"class":1109},[1050,14548,14549,14552,14554,14557,14559,14561,14563,14565,14567,14569,14571,14573,14575,14577],{"class":1052,"line":3538},[1050,14550,14551],{"class":1067},"                    related_objects ",[1050,14553,1385],{"class":1109},[1050,14555,14556],{"class":1067}," model",[1050,14558,1110],{"class":1109},[1050,14560,4305],{"class":1806},[1050,14562,1110],{"class":1109},[1050,14564,4135],{"class":1393},[1050,14566,1221],{"class":1109},[1050,14568,1744],{"class":1404},[1050,14570,1385],{"class":1109},[1050,14572,1779],{"class":1259},[1050,14574,1110],{"class":1109},[1050,14576,1744],{"class":1806},[1050,14578,1432],{"class":1109},[1050,14580,14581,14584,14587,14589,14591],{"class":1052,"line":3544},[1050,14582,14583],{"class":1063},"                    if",[1050,14585,14586],{"class":1067}," related_objects",[1050,14588,1110],{"class":1109},[1050,14590,4148],{"class":1393},[1050,14592,14239],{"class":1109},[1050,14594,14595,14598,14600,14602,14604,14607,14609],{"class":1052,"line":3551},[1050,14596,14597],{"class":1067},"                        model_name ",[1050,14599,1385],{"class":1109},[1050,14601,14556],{"class":1067},[1050,14603,1110],{"class":1109},[1050,14605,14606],{"class":1806},"_meta",[1050,14608,1110],{"class":1109},[1050,14610,14611],{"class":1806},"label_lower\n",[1050,14613,14614,14617,14619,14621,14623,14625,14628,14631,14634,14636],{"class":1052,"line":3556},[1050,14615,14616],{"class":1067},"                        user_data",[1050,14618,7824],{"class":1109},[1050,14620,1276],{"class":1275},[1050,14622,14193],{"class":1279},[1050,14624,1276],{"class":1275},[1050,14626,14627],{"class":1109},"][",[1050,14629,14630],{"class":1067},"model_name",[1050,14632,14633],{"class":1109},"]",[1050,14635,1263],{"class":1109},[1050,14637,3088],{"class":1109},[1050,14639,14640],{"class":1052,"line":3574},[1050,14641,14642],{"class":1067},"                        \n",[1050,14644,14645,14648,14651,14653,14655],{"class":1052,"line":3584},[1050,14646,14647],{"class":1063},"                        for",[1050,14649,14650],{"class":1067}," obj ",[1050,14652,2528],{"class":1063},[1050,14654,14586],{"class":1067},[1050,14656,1728],{"class":1109},[1050,14658,14659,14662,14664],{"class":1052,"line":3603},[1050,14660,14661],{"class":1067},"                            obj_data ",[1050,14663,1385],{"class":1109},[1050,14665,9412],{"class":1109},[1050,14667,14668,14671,14674,14676,14678,14680,14682,14684,14686],{"class":1052,"line":3608},[1050,14669,14670],{"class":1063},"                            for",[1050,14672,14673],{"class":1067}," field ",[1050,14675,2528],{"class":1063},[1050,14677,14556],{"class":1067},[1050,14679,1110],{"class":1109},[1050,14681,14606],{"class":1806},[1050,14683,1110],{"class":1109},[1050,14685,8873],{"class":1806},[1050,14687,1728],{"class":1109},[1050,14689,14690,14693,14695,14698,14700,14702,14704,14707,14709,14711,14714,14716,14719],{"class":1052,"line":3616},[1050,14691,14692],{"class":1063},"                                if",[1050,14694,1910],{"class":1810},[1050,14696,14697],{"class":1067}," field",[1050,14699,1110],{"class":1109},[1050,14701,1753],{"class":1806},[1050,14703,1110],{"class":1109},[1050,14705,14706],{"class":1393},"endswith",[1050,14708,1221],{"class":1109},[1050,14710,1276],{"class":1275},[1050,14712,14713],{"class":1279},"_id",[1050,14715,1276],{"class":1275},[1050,14717,14718],{"class":1109},"):",[1050,14720,14721],{"class":1056},"  # Skip foreign key IDs\n",[1050,14723,14724,14727,14729,14731,14733,14735,14737,14739,14741,14743],{"class":1052,"line":3629},[1050,14725,14726],{"class":1067},"                                    value ",[1050,14728,1385],{"class":1109},[1050,14730,10410],{"class":3101},[1050,14732,1221],{"class":1109},[1050,14734,6446],{"class":1393},[1050,14736,1285],{"class":1109},[1050,14738,14697],{"class":1393},[1050,14740,1110],{"class":1109},[1050,14742,1753],{"class":1806},[1050,14744,1432],{"class":1109},[1050,14746,14747,14750,14752,14755,14757,14759,14761,14763],{"class":1052,"line":3648},[1050,14748,14749],{"class":1067},"                                    obj_data",[1050,14751,7824],{"class":1109},[1050,14753,14754],{"class":1067},"field",[1050,14756,1110],{"class":1109},[1050,14758,1753],{"class":1806},[1050,14760,14633],{"class":1109},[1050,14762,1263],{"class":1109},[1050,14764,14765],{"class":1067}," value\n",[1050,14767,14768,14771,14773,14775,14777,14779,14781,14783,14785,14787,14789,14792],{"class":1052,"line":3660},[1050,14769,14770],{"class":1067},"                            user_data",[1050,14772,7824],{"class":1109},[1050,14774,1276],{"class":1275},[1050,14776,14193],{"class":1279},[1050,14778,1276],{"class":1275},[1050,14780,14627],{"class":1109},[1050,14782,14630],{"class":1067},[1050,14784,14255],{"class":1109},[1050,14786,3149],{"class":1393},[1050,14788,1221],{"class":1109},[1050,14790,14791],{"class":1393},"obj_data",[1050,14793,1432],{"class":1109},[1050,14795,14796],{"class":1052,"line":3687},[1050,14797,2656],{"class":1067},[1050,14799,14800,14803,14805],{"class":1052,"line":3700},[1050,14801,14802],{"class":1063},"                except",[1050,14804,13875],{"class":1616},[1050,14806,1728],{"class":1109},[1050,14808,14809],{"class":1052,"line":3705},[1050,14810,14811],{"class":1056},"                    # Skip models that cause errors\n",[1050,14813,14814],{"class":1052,"line":3712},[1050,14815,14816],{"class":1063},"                    pass\n",[1050,14818,14819],{"class":1052,"line":3717},[1050,14820,1933],{"class":1067},[1050,14822,14823,14825],{"class":1052,"line":3727},[1050,14824,2217],{"class":1063},[1050,14826,14827],{"class":1067}," user_data\n",[1050,14829,14830],{"class":1052,"line":3737},[1050,14831,1207],{"emptyLinePlaceholder":1206},[1050,14833,14834,14836,14839,14841,14843,14845,14847],{"class":1052,"line":3742},[1050,14835,1214],{"class":1213},[1050,14837,14838],{"class":1217}," DataDeletionRequest",[1050,14840,1221],{"class":1109},[1050,14842,1225],{"class":1224},[1050,14844,1110],{"class":1109},[1050,14846,1230],{"class":1224},[1050,14848,1233],{"class":1109},[1050,14850,14851,14853,14856],{"class":1052,"line":3797},[1050,14852,1240],{"class":1239},[1050,14854,14855],{"class":1243},"GDPR data deletion requests",[1050,14857,1247],{"class":1239},[1050,14859,14860],{"class":1052,"line":3807},[1050,14861,1253],{"class":1067},[1050,14863,14864,14866,14868],{"class":1052,"line":3828},[1050,14865,13122],{"class":1259},[1050,14867,1263],{"class":1109},[1050,14869,1266],{"class":1109},[1050,14871,14872,14874,14876,14878,14880,14882,14884,14886,14888],{"class":1052,"line":3833},[1050,14873,1272],{"class":1109},[1050,14875,1276],{"class":1275},[1050,14877,13135],{"class":1279},[1050,14879,1276],{"class":1275},[1050,14881,1285],{"class":1109},[1050,14883,1288],{"class":1275},[1050,14885,13144],{"class":1279},[1050,14887,1276],{"class":1275},[1050,14889,1296],{"class":1109},[1050,14891,14892,14894,14896,14898,14900,14902,14904,14906,14908],{"class":1052,"line":3839},[1050,14893,1272],{"class":1109},[1050,14895,1276],{"class":1275},[1050,14897,13157],{"class":1279},[1050,14899,1276],{"class":1275},[1050,14901,1285],{"class":1109},[1050,14903,1288],{"class":1275},[1050,14905,13166],{"class":1279},[1050,14907,1276],{"class":1275},[1050,14909,1296],{"class":1109},[1050,14911,14912,14914,14916,14918,14920,14922,14924,14926,14928],{"class":1052,"line":3874},[1050,14913,1272],{"class":1109},[1050,14915,1276],{"class":1275},[1050,14917,13179],{"class":1279},[1050,14919,1276],{"class":1275},[1050,14921,1285],{"class":1109},[1050,14923,1288],{"class":1275},[1050,14925,13188],{"class":1279},[1050,14927,1276],{"class":1275},[1050,14929,1296],{"class":1109},[1050,14931,14932,14934,14936,14938,14940,14942,14944,14946,14948],{"class":1052,"line":3886},[1050,14933,1272],{"class":1109},[1050,14935,1276],{"class":1275},[1050,14937,13201],{"class":1279},[1050,14939,1276],{"class":1275},[1050,14941,1285],{"class":1109},[1050,14943,1288],{"class":1275},[1050,14945,13210],{"class":1279},[1050,14947,1276],{"class":1275},[1050,14949,1296],{"class":1109},[1050,14951,14952,14954,14956,14959,14961,14963,14965,14968,14970],{"class":1052,"line":3893},[1050,14953,1272],{"class":1109},[1050,14955,1276],{"class":1275},[1050,14957,14958],{"class":1279},"rejected",[1050,14960,1276],{"class":1275},[1050,14962,1285],{"class":1109},[1050,14964,1288],{"class":1275},[1050,14966,14967],{"class":1279},"Rejected",[1050,14969,1276],{"class":1275},[1050,14971,1296],{"class":1109},[1050,14973,14974],{"class":1052,"line":3898},[1050,14975,1371],{"class":1109},[1050,14977,14978],{"class":1052,"line":3904},[1050,14979,1253],{"class":1067},[1050,14981,14982,14984,14986,14988,14990,14992,14994,14996,14998,15000,15002,15004,15006,15008],{"class":1052,"line":3924},[1050,14983,1382],{"class":1067},[1050,14985,1385],{"class":1109},[1050,14987,1388],{"class":1067},[1050,14989,1110],{"class":1109},[1050,14991,1394],{"class":1393},[1050,14993,1221],{"class":1109},[1050,14995,1399],{"class":1393},[1050,14997,1285],{"class":1109},[1050,14999,1405],{"class":1404},[1050,15001,1385],{"class":1109},[1050,15003,1225],{"class":1393},[1050,15005,1110],{"class":1109},[1050,15007,1415],{"class":1414},[1050,15009,1432],{"class":1109},[1050,15011,15012,15014,15016,15018,15020,15022,15024,15026,15028,15030],{"class":1052,"line":3932},[1050,15013,13257],{"class":1067},[1050,15015,1385],{"class":1109},[1050,15017,1388],{"class":1067},[1050,15019,1110],{"class":1109},[1050,15021,1667],{"class":1393},[1050,15023,1221],{"class":1109},[1050,15025,1705],{"class":1404},[1050,15027,1385],{"class":1109},[1050,15029,1530],{"class":1529},[1050,15031,1432],{"class":1109},[1050,15033,15034,15036,15038,15040,15042,15044,15046,15048,15050,15052,15054,15056,15058,15060,15062,15064,15066,15068,15070,15072],{"class":1052,"line":3937},[1050,15035,13280],{"class":1067},[1050,15037,1385],{"class":1109},[1050,15039,1388],{"class":1067},[1050,15041,1110],{"class":1109},[1050,15043,1447],{"class":1393},[1050,15045,1221],{"class":1109},[1050,15047,1452],{"class":1404},[1050,15049,1385],{"class":1109},[1050,15051,1555],{"class":1457},[1050,15053,1285],{"class":1109},[1050,15055,1488],{"class":1404},[1050,15057,1385],{"class":1109},[1050,15059,13305],{"class":1493},[1050,15061,1285],{"class":1109},[1050,15063,8533],{"class":1404},[1050,15065,1385],{"class":1109},[1050,15067,1276],{"class":1275},[1050,15069,13135],{"class":1279},[1050,15071,1276],{"class":1275},[1050,15073,1432],{"class":1109},[1050,15075,15076,15079,15081,15083,15085,15087,15089,15091,15093,15095],{"class":1052,"line":3943},[1050,15077,15078],{"class":1067},"    reason ",[1050,15080,1385],{"class":1109},[1050,15082,1388],{"class":1067},[1050,15084,1110],{"class":1109},[1050,15086,4883],{"class":1393},[1050,15088,1221],{"class":1109},[1050,15090,1585],{"class":1404},[1050,15092,1385],{"class":1109},[1050,15094,1530],{"class":1529},[1050,15096,1432],{"class":1109},[1050,15098,15099,15101,15103,15105,15107,15109,15111,15113,15115,15117,15119,15121,15123,15125],{"class":1052,"line":3954},[1050,15100,13362],{"class":1067},[1050,15102,1385],{"class":1109},[1050,15104,1388],{"class":1067},[1050,15106,1110],{"class":1109},[1050,15108,1667],{"class":1393},[1050,15110,1221],{"class":1109},[1050,15112,1672],{"class":1404},[1050,15114,1385],{"class":1109},[1050,15116,1530],{"class":1529},[1050,15118,1285],{"class":1109},[1050,15120,1524],{"class":1404},[1050,15122,1385],{"class":1109},[1050,15124,1530],{"class":1529},[1050,15126,1432],{"class":1109},[1050,15128,15129,15132,15134,15136,15138,15140,15142,15144,15146,15148],{"class":1052,"line":3960},[1050,15130,15131],{"class":1067},"    rejection_reason ",[1050,15133,1385],{"class":1109},[1050,15135,1388],{"class":1067},[1050,15137,1110],{"class":1109},[1050,15139,4883],{"class":1393},[1050,15141,1221],{"class":1109},[1050,15143,1585],{"class":1404},[1050,15145,1385],{"class":1109},[1050,15147,1530],{"class":1529},[1050,15149,1432],{"class":1109},[1050,15151,15152],{"class":1052,"line":3999},[1050,15153,1253],{"class":1067},[1050,15155,15156,15158,15161,15163,15165],{"class":1052,"line":4006},[1050,15157,1769],{"class":1213},[1050,15159,15160],{"class":1772}," process_deletion",[1050,15162,1221],{"class":1109},[1050,15164,1779],{"class":1778},[1050,15166,1233],{"class":1109},[1050,15168,15169,15171,15174],{"class":1052,"line":4011},[1050,15170,1787],{"class":1239},[1050,15172,15173],{"class":1243},"Process data deletion request",[1050,15175,1247],{"class":1239},[1050,15177,15178,15180],{"class":1052,"line":4017},[1050,15179,4290],{"class":1063},[1050,15181,1728],{"class":1109},[1050,15183,15184,15186,15188,15190,15192,15194,15196],{"class":1052,"line":4039},[1050,15185,1825],{"class":1259},[1050,15187,1110],{"class":1109},[1050,15189,13452],{"class":1806},[1050,15191,1263],{"class":1109},[1050,15193,1288],{"class":1275},[1050,15195,13157],{"class":1279},[1050,15197,9250],{"class":1275},[1050,15199,15200,15202,15204,15206],{"class":1052,"line":4045},[1050,15201,1825],{"class":1259},[1050,15203,1110],{"class":1109},[1050,15205,1853],{"class":1393},[1050,15207,1843],{"class":1109},[1050,15209,15210],{"class":1052,"line":4070},[1050,15211,4535],{"class":1067},[1050,15213,15214],{"class":1052,"line":4077},[1050,15215,15216],{"class":1056},"            # Check if deletion is allowed\n",[1050,15218,15219,15221,15223,15225,15227,15230],{"class":1052,"line":4082},[1050,15220,2553],{"class":1063},[1050,15222,1910],{"class":1810},[1050,15224,1801],{"class":1259},[1050,15226,1110],{"class":1109},[1050,15228,15229],{"class":1393},"_can_delete_user_data",[1050,15231,14239],{"class":1109},[1050,15233,15234,15236,15238,15240,15242,15244,15246],{"class":1052,"line":4089},[1050,15235,2693],{"class":1259},[1050,15237,1110],{"class":1109},[1050,15239,13452],{"class":1806},[1050,15241,1263],{"class":1109},[1050,15243,1288],{"class":1275},[1050,15245,14958],{"class":1279},[1050,15247,9250],{"class":1275},[1050,15249,15250,15252,15254,15257,15259,15262,15265],{"class":1052,"line":4094},[1050,15251,2693],{"class":1259},[1050,15253,1110],{"class":1109},[1050,15255,15256],{"class":1806},"rejection_reason",[1050,15258,1263],{"class":1109},[1050,15260,15261],{"class":1275}," \"",[1050,15263,15264],{"class":1279},"User data cannot be deleted due to legal obligations",[1050,15266,2015],{"class":1275},[1050,15268,15269,15271,15273,15275],{"class":1052,"line":4112},[1050,15270,2693],{"class":1259},[1050,15272,1110],{"class":1109},[1050,15274,1853],{"class":1393},[1050,15276,1843],{"class":1109},[1050,15278,15279],{"class":1052,"line":4122},[1050,15280,15281],{"class":1063},"                return\n",[1050,15283,15284],{"class":1052,"line":4153},[1050,15285,4535],{"class":1067},[1050,15287,15288],{"class":1052,"line":4158},[1050,15289,15290],{"class":1056},"            # Anonymize or delete user data\n",[1050,15292,15293,15295,15297,15300],{"class":1052,"line":4180},[1050,15294,1825],{"class":1259},[1050,15296,1110],{"class":1109},[1050,15298,15299],{"class":1393},"_anonymize_user_data",[1050,15301,1843],{"class":1109},[1050,15303,15304],{"class":1052,"line":4190},[1050,15305,4535],{"class":1067},[1050,15307,15308,15310,15312,15314,15316,15318,15320],{"class":1052,"line":4220},[1050,15309,1825],{"class":1259},[1050,15311,1110],{"class":1109},[1050,15313,13452],{"class":1806},[1050,15315,1263],{"class":1109},[1050,15317,1288],{"class":1275},[1050,15319,13179],{"class":1279},[1050,15321,9250],{"class":1275},[1050,15323,15324,15326,15328,15330,15332,15334,15336,15338],{"class":1052,"line":4239},[1050,15325,1825],{"class":1259},[1050,15327,1110],{"class":1109},[1050,15329,13812],{"class":1806},[1050,15331,1263],{"class":1109},[1050,15333,2703],{"class":1067},[1050,15335,1110],{"class":1109},[1050,15337,2708],{"class":1393},[1050,15339,1843],{"class":1109},[1050,15341,15342,15344,15346,15348],{"class":1052,"line":4246},[1050,15343,1825],{"class":1259},[1050,15345,1110],{"class":1109},[1050,15347,1853],{"class":1393},[1050,15349,1843],{"class":1109},[1050,15351,15352],{"class":1052,"line":4253},[1050,15353,4535],{"class":1067},[1050,15355,15356,15358,15360,15362,15364],{"class":1052,"line":4258},[1050,15357,4327],{"class":1063},[1050,15359,13875],{"class":1616},[1050,15361,13577],{"class":1063},[1050,15363,13880],{"class":1067},[1050,15365,1728],{"class":1109},[1050,15367,15368,15370,15372,15374,15376,15378,15380],{"class":1052,"line":4277},[1050,15369,1825],{"class":1259},[1050,15371,1110],{"class":1109},[1050,15373,13452],{"class":1806},[1050,15375,1263],{"class":1109},[1050,15377,1288],{"class":1275},[1050,15379,13201],{"class":1279},[1050,15381,9250],{"class":1275},[1050,15383,15384,15386,15388,15390],{"class":1052,"line":4287},[1050,15385,1825],{"class":1259},[1050,15387,1110],{"class":1109},[1050,15389,1853],{"class":1393},[1050,15391,1843],{"class":1109},[1050,15393,15394],{"class":1052,"line":4295},[1050,15395,1253],{"class":1067},[1050,15397,15398,15400,15403,15405,15407],{"class":1052,"line":4324},[1050,15399,1769],{"class":1213},[1050,15401,15402],{"class":1772}," _can_delete_user_data",[1050,15404,1221],{"class":1109},[1050,15406,1779],{"class":1778},[1050,15408,1233],{"class":1109},[1050,15410,15411,15413,15416],{"class":1052,"line":4339},[1050,15412,1787],{"class":1239},[1050,15414,15415],{"class":1243},"Check if user data can be deleted",[1050,15417,1247],{"class":1239},[1050,15419,15420],{"class":1052,"line":4346},[1050,15421,15422],{"class":1056},"        # Check for legal obligations that prevent deletion\n",[1050,15424,15425],{"class":1052,"line":4351},[1050,15426,15427],{"class":1056},"        # e.g., financial records, legal disputes, etc.\n",[1050,15429,15430,15432],{"class":1052,"line":4357},[1050,15431,2217],{"class":1063},[1050,15433,2730],{"class":1529},[1050,15435,15436],{"class":1052,"line":4367},[1050,15437,1253],{"class":1067},[1050,15439,15440,15442,15445,15447,15449],{"class":1052,"line":4377},[1050,15441,1769],{"class":1213},[1050,15443,15444],{"class":1772}," _anonymize_user_data",[1050,15446,1221],{"class":1109},[1050,15448,1779],{"class":1778},[1050,15450,1233],{"class":1109},[1050,15452,15453,15455,15458],{"class":1052,"line":4382},[1050,15454,1787],{"class":1239},[1050,15456,15457],{"class":1243},"Anonymize user data",[1050,15459,1247],{"class":1239},[1050,15461,15462],{"class":1052,"line":4401},[1050,15463,15464],{"class":1056},"        # Anonymize user record\n",[1050,15466,15467,15469,15471,15473,15475,15477,15479,15481,15484,15486,15488,15490,15492,15494,15496,15498],{"class":1052,"line":4416},[1050,15468,3166],{"class":1259},[1050,15470,1110],{"class":1109},[1050,15472,1744],{"class":1806},[1050,15474,1110],{"class":1109},[1050,15476,3860],{"class":1806},[1050,15478,1263],{"class":1109},[1050,15480,2593],{"class":1213},[1050,15482,15483],{"class":1279},"\"deleted_user_",[1050,15485,2600],{"class":2599},[1050,15487,1779],{"class":1259},[1050,15489,1110],{"class":1109},[1050,15491,1744],{"class":1806},[1050,15493,1110],{"class":1109},[1050,15495,2607],{"class":1806},[1050,15497,2610],{"class":2599},[1050,15499,2015],{"class":1279},[1050,15501,15502,15504,15506,15508,15510,15512,15514,15516,15519,15521,15523,15525,15527,15529,15531,15533],{"class":1052,"line":4432},[1050,15503,3166],{"class":1259},[1050,15505,1110],{"class":1109},[1050,15507,1744],{"class":1806},[1050,15509,1110],{"class":1109},[1050,15511,1329],{"class":1806},[1050,15513,1263],{"class":1109},[1050,15515,2593],{"class":1213},[1050,15517,15518],{"class":1279},"\"deleted_",[1050,15520,2600],{"class":2599},[1050,15522,1779],{"class":1259},[1050,15524,1110],{"class":1109},[1050,15526,1744],{"class":1806},[1050,15528,1110],{"class":1109},[1050,15530,2607],{"class":1806},[1050,15532,2610],{"class":2599},[1050,15534,15535],{"class":1279},"@example.com\"\n",[1050,15537,15538,15540,15542,15544,15546,15548,15550],{"class":1052,"line":4437},[1050,15539,3166],{"class":1259},[1050,15541,1110],{"class":1109},[1050,15543,1744],{"class":1806},[1050,15545,1110],{"class":1109},[1050,15547,14070],{"class":1806},[1050,15549,1263],{"class":1109},[1050,15551,15552],{"class":1275}," \"\"\n",[1050,15554,15555,15557,15559,15561,15563,15565,15567],{"class":1052,"line":4455},[1050,15556,3166],{"class":1259},[1050,15558,1110],{"class":1109},[1050,15560,1744],{"class":1806},[1050,15562,1110],{"class":1109},[1050,15564,14093],{"class":1806},[1050,15566,1263],{"class":1109},[1050,15568,15552],{"class":1275},[1050,15570,15571,15573,15575,15577,15579,15581,15583],{"class":1052,"line":4461},[1050,15572,3166],{"class":1259},[1050,15574,1110],{"class":1109},[1050,15576,1744],{"class":1806},[1050,15578,1110],{"class":1109},[1050,15580,2291],{"class":1806},[1050,15582,1263],{"class":1109},[1050,15584,2301],{"class":1529},[1050,15586,15587,15589,15591,15593,15595,15597],{"class":1052,"line":4486},[1050,15588,3166],{"class":1259},[1050,15590,1110],{"class":1109},[1050,15592,1744],{"class":1806},[1050,15594,1110],{"class":1109},[1050,15596,1853],{"class":1393},[1050,15598,1843],{"class":1109},[1050,15600,15601],{"class":1052,"line":4512},[1050,15602,1933],{"class":1067},[1050,15604,15605],{"class":1052,"line":4532},[1050,15606,15607],{"class":1056},"        # Anonymize related data\n",[1050,15609,15610,15612,15614,15616,15618,15620],{"class":1052,"line":4538},[1050,15611,3519],{"class":1063},[1050,15613,1106],{"class":1067},[1050,15615,1110],{"class":1109},[1050,15617,13966],{"class":1067},[1050,15619,1064],{"class":1063},[1050,15621,13971],{"class":1067},[1050,15623,15624],{"class":1052,"line":4544},[1050,15625,1933],{"class":1067},[1050,15627,15628,15630,15632,15634,15636,15638,15640],{"class":1052,"line":4562},[1050,15629,2522],{"class":1063},[1050,15631,14495],{"class":1067},[1050,15633,2528],{"class":1063},[1050,15635,14500],{"class":1067},[1050,15637,1110],{"class":1109},[1050,15639,14505],{"class":1393},[1050,15641,14239],{"class":1109},[1050,15643,15644,15646,15648,15650,15652,15654,15656,15658,15660],{"class":1052,"line":4592},[1050,15645,2553],{"class":1063},[1050,15647,9320],{"class":3101},[1050,15649,1221],{"class":1109},[1050,15651,14518],{"class":1393},[1050,15653,1285],{"class":1109},[1050,15655,1288],{"class":1275},[1050,15657,1744],{"class":1279},[1050,15659,1276],{"class":1275},[1050,15661,1233],{"class":1109},[1050,15663,15664,15666],{"class":1052,"line":4611},[1050,15665,14544],{"class":1063},[1050,15667,1728],{"class":1109},[1050,15669,15670],{"class":1052,"line":4616},[1050,15671,15672],{"class":1056},"                    # Instead of deleting, anonymize personal data\n",[1050,15674,15675,15677,15679,15681,15683,15685,15687,15689,15691,15693,15695,15697,15699,15701],{"class":1052,"line":4636},[1050,15676,14551],{"class":1067},[1050,15678,1385],{"class":1109},[1050,15680,14556],{"class":1067},[1050,15682,1110],{"class":1109},[1050,15684,4305],{"class":1806},[1050,15686,1110],{"class":1109},[1050,15688,4135],{"class":1393},[1050,15690,1221],{"class":1109},[1050,15692,1744],{"class":1404},[1050,15694,1385],{"class":1109},[1050,15696,1779],{"class":1259},[1050,15698,1110],{"class":1109},[1050,15700,1744],{"class":1806},[1050,15702,1432],{"class":1109},[1050,15704,15705,15708,15710,15712,15714],{"class":1052,"line":4644},[1050,15706,15707],{"class":1063},"                    for",[1050,15709,14650],{"class":1067},[1050,15711,2528],{"class":1063},[1050,15713,14586],{"class":1067},[1050,15715,1728],{"class":1109},[1050,15717,15718],{"class":1052,"line":4649},[1050,15719,15720],{"class":1056},"                        # Anonymize personal fields\n",[1050,15722,15723,15725,15727,15729,15731,15733,15735,15737,15739],{"class":1052,"line":4667},[1050,15724,14647],{"class":1063},[1050,15726,14673],{"class":1067},[1050,15728,2528],{"class":1063},[1050,15730,14556],{"class":1067},[1050,15732,1110],{"class":1109},[1050,15734,14606],{"class":1806},[1050,15736,1110],{"class":1109},[1050,15738,8873],{"class":1806},[1050,15740,1728],{"class":1109},[1050,15742,15743,15746,15748,15750,15752,15754,15756,15758,15760,15762,15764,15766,15768,15770,15772,15774,15777,15779,15781,15783,15785,15787],{"class":1052,"line":4677},[1050,15744,15745],{"class":1063},"                            if",[1050,15747,14697],{"class":1067},[1050,15749,1110],{"class":1109},[1050,15751,1753],{"class":1806},[1050,15753,2400],{"class":1810},[1050,15755,1739],{"class":1109},[1050,15757,1276],{"class":1275},[1050,15759,1329],{"class":1279},[1050,15761,1276],{"class":1275},[1050,15763,1285],{"class":1109},[1050,15765,1288],{"class":1275},[1050,15767,12717],{"class":1279},[1050,15769,1276],{"class":1275},[1050,15771,1285],{"class":1109},[1050,15773,1288],{"class":1275},[1050,15775,15776],{"class":1279},"address",[1050,15778,1276],{"class":1275},[1050,15780,1285],{"class":1109},[1050,15782,1288],{"class":1275},[1050,15784,1753],{"class":1279},[1050,15786,1276],{"class":1275},[1050,15788,2419],{"class":1109},[1050,15790,15791,15794,15796,15798,15800,15802,15804,15806,15808,15810,15813,15815,15817,15819,15821,15823,15826],{"class":1052,"line":11447},[1050,15792,15793],{"class":3101},"                                setattr",[1050,15795,1221],{"class":1109},[1050,15797,6446],{"class":1393},[1050,15799,1285],{"class":1109},[1050,15801,14697],{"class":1393},[1050,15803,1110],{"class":1109},[1050,15805,1753],{"class":1806},[1050,15807,1285],{"class":1109},[1050,15809,2593],{"class":1213},[1050,15811,15812],{"class":1279},"\"[DELETED_",[1050,15814,2600],{"class":2599},[1050,15816,6446],{"class":1393},[1050,15818,1110],{"class":1109},[1050,15820,2607],{"class":1806},[1050,15822,2610],{"class":2599},[1050,15824,15825],{"class":1279},"]\"",[1050,15827,1432],{"class":1109},[1050,15829,15830,15833,15835,15837],{"class":1052,"line":11459},[1050,15831,15832],{"class":1067},"                        obj",[1050,15834,1110],{"class":1109},[1050,15836,1853],{"class":1393},[1050,15838,1843],{"class":1109},[1050,15840,15841],{"class":1052,"line":11475},[1050,15842,2656],{"class":1067},[1050,15844,15845,15847,15849],{"class":1052,"line":11501},[1050,15846,14802],{"class":1063},[1050,15848,13875],{"class":1616},[1050,15850,1728],{"class":1109},[1050,15852,15853],{"class":1052,"line":11506},[1050,15854,14811],{"class":1056},[1050,15856,15857],{"class":1052,"line":11511},[1050,15858,14816],{"class":1063},[1050,15860,15861],{"class":1052,"line":11525},[1050,15862,1207],{"emptyLinePlaceholder":1206},[1050,15864,15865],{"class":1052,"line":11554},[1050,15866,15867],{"class":1056},"# GDPR compliance utilities\n",[1050,15869,15870,15872,15875],{"class":1052,"line":11564},[1050,15871,1214],{"class":1213},[1050,15873,15874],{"class":1217}," GDPRCompliance",[1050,15876,1728],{"class":1109},[1050,15878,15879,15881,15884],{"class":1052,"line":11597},[1050,15880,1240],{"class":1239},[1050,15882,15883],{"class":1243},"GDPR compliance utilities",[1050,15885,1247],{"class":1239},[1050,15887,15888],{"class":1052,"line":11602},[1050,15889,1253],{"class":1067},[1050,15891,15892,15895],{"class":1052,"line":11613},[1050,15893,15894],{"class":1109},"    @",[1050,15896,15897],{"class":1616},"staticmethod\n",[1050,15899,15900,15902,15905,15907,15909,15911,15914],{"class":1052,"line":11624},[1050,15901,1769],{"class":1213},[1050,15903,15904],{"class":1772}," check_consent",[1050,15906,1221],{"class":1109},[1050,15908,1744],{"class":2264},[1050,15910,1285],{"class":1109},[1050,15912,15913],{"class":2264}," purpose_name",[1050,15915,1233],{"class":1109},[1050,15917,15918,15920,15923],{"class":1052,"line":11635},[1050,15919,1787],{"class":1239},[1050,15921,15922],{"class":1243},"Check if user has given consent for specific purpose",[1050,15924,1247],{"class":1239},[1050,15926,15927,15929],{"class":1052,"line":11650},[1050,15928,4290],{"class":1063},[1050,15930,1728],{"class":1109},[1050,15932,15933,15936,15938,15940,15942,15944,15946,15948,15950,15952,15954,15957],{"class":1052,"line":11672},[1050,15934,15935],{"class":1067},"            purpose ",[1050,15937,1385],{"class":1109},[1050,15939,12182],{"class":1067},[1050,15941,1110],{"class":1109},[1050,15943,4305],{"class":1806},[1050,15945,1110],{"class":1109},[1050,15947,2635],{"class":1393},[1050,15949,1221],{"class":1109},[1050,15951,1753],{"class":1404},[1050,15953,1385],{"class":1109},[1050,15955,15956],{"class":1393},"purpose_name",[1050,15958,1432],{"class":1109},[1050,15960,15961,15964,15966,15968,15970,15972,15974,15976,15978,15980,15982,15984,15986,15989,15991,15993],{"class":1052,"line":11692},[1050,15962,15963],{"class":1067},"            consent ",[1050,15965,1385],{"class":1109},[1050,15967,12503],{"class":1067},[1050,15969,1110],{"class":1109},[1050,15971,4305],{"class":1806},[1050,15973,1110],{"class":1109},[1050,15975,2635],{"class":1393},[1050,15977,1221],{"class":1109},[1050,15979,1744],{"class":1404},[1050,15981,1385],{"class":1109},[1050,15983,1744],{"class":1393},[1050,15985,1285],{"class":1109},[1050,15987,15988],{"class":1404}," purpose",[1050,15990,1385],{"class":1109},[1050,15992,12912],{"class":1393},[1050,15994,1432],{"class":1109},[1050,15996,15997,15999,16001,16003,16005,16007,16009,16011,16013],{"class":1052,"line":11697},[1050,15998,1924],{"class":1063},[1050,16000,14273],{"class":1067},[1050,16002,1110],{"class":1109},[1050,16004,12951],{"class":1806},[1050,16006,4480],{"class":1810},[1050,16008,1910],{"class":1810},[1050,16010,14273],{"class":1067},[1050,16012,1110],{"class":1109},[1050,16014,16015],{"class":1806},"withdrawn_date\n",[1050,16017,16018,16020,16022,16024,16026,16028,16030,16032,16034,16036],{"class":1052,"line":11702},[1050,16019,4327],{"class":1063},[1050,16021,4466],{"class":1109},[1050,16023,12587],{"class":1067},[1050,16025,1110],{"class":1109},[1050,16027,4334],{"class":1806},[1050,16029,1285],{"class":1109},[1050,16031,12503],{"class":1067},[1050,16033,1110],{"class":1109},[1050,16035,4334],{"class":1806},[1050,16037,1233],{"class":1109},[1050,16039,16040,16042],{"class":1052,"line":11708},[1050,16041,1924],{"class":1063},[1050,16043,2301],{"class":1529},[1050,16045,16046],{"class":1052,"line":11727},[1050,16047,1253],{"class":1067},[1050,16049,16050,16052],{"class":1052,"line":11748},[1050,16051,15894],{"class":1109},[1050,16053,15897],{"class":1616},[1050,16055,16056,16058,16061,16063,16065,16067,16069,16071,16074,16076,16078,16080,16082,16084,16086,16088],{"class":1052,"line":11753},[1050,16057,1769],{"class":1213},[1050,16059,16060],{"class":1772}," record_consent",[1050,16062,1221],{"class":1109},[1050,16064,1744],{"class":2264},[1050,16066,1285],{"class":1109},[1050,16068,15913],{"class":2264},[1050,16070,1285],{"class":1109},[1050,16072,16073],{"class":2264}," consent_given",[1050,16075,1285],{"class":1109},[1050,16077,13009],{"class":2264},[1050,16079,1385],{"class":1810},[1050,16081,1276],{"class":1275},[1050,16083,12675],{"class":1279},[1050,16085,1276],{"class":1275},[1050,16087,1285],{"class":1109},[1050,16089,4483],{"class":1067},[1050,16091,16092,16095,16097,16099,16101,16104,16106,16108],{"class":1052,"line":11773},[1050,16093,16094],{"class":2264},"                      ip_address",[1050,16096,1385],{"class":1810},[1050,16098,3766],{"class":1529},[1050,16100,1285],{"class":1109},[1050,16102,16103],{"class":2264}," user_agent",[1050,16105,1385],{"class":1810},[1050,16107,9184],{"class":1275},[1050,16109,1233],{"class":1109},[1050,16111,16112,16114,16117],{"class":1052,"line":11778},[1050,16113,1787],{"class":1239},[1050,16115,16116],{"class":1243},"Record user consent",[1050,16118,1247],{"class":1239},[1050,16120,16121,16124,16126,16128,16130,16132,16134,16136,16138,16140,16142,16144],{"class":1052,"line":11802},[1050,16122,16123],{"class":1067},"        purpose ",[1050,16125,1385],{"class":1109},[1050,16127,12182],{"class":1067},[1050,16129,1110],{"class":1109},[1050,16131,4305],{"class":1806},[1050,16133,1110],{"class":1109},[1050,16135,2635],{"class":1393},[1050,16137,1221],{"class":1109},[1050,16139,1753],{"class":1404},[1050,16141,1385],{"class":1109},[1050,16143,15956],{"class":1393},[1050,16145,1432],{"class":1109},[1050,16147,16148],{"class":1052,"line":11834},[1050,16149,1933],{"class":1067},[1050,16151,16152,16155,16157,16160,16162,16164,16166,16168,16170,16173],{"class":1052,"line":11839},[1050,16153,16154],{"class":1067},"        consent",[1050,16156,1285],{"class":1109},[1050,16158,16159],{"class":1067}," created ",[1050,16161,1385],{"class":1109},[1050,16163,12503],{"class":1067},[1050,16165,1110],{"class":1109},[1050,16167,4305],{"class":1806},[1050,16169,1110],{"class":1109},[1050,16171,16172],{"class":1393},"update_or_create",[1050,16174,1977],{"class":1109},[1050,16176,16177,16179,16181,16183],{"class":1052,"line":11857},[1050,16178,9536],{"class":1404},[1050,16180,1385],{"class":1109},[1050,16182,1744],{"class":1393},[1050,16184,1998],{"class":1109},[1050,16186,16187,16190,16192,16194],{"class":1052,"line":11869},[1050,16188,16189],{"class":1404},"            purpose",[1050,16191,1385],{"class":1109},[1050,16193,12912],{"class":1393},[1050,16195,1998],{"class":1109},[1050,16197,16198,16201],{"class":1052,"line":11880},[1050,16199,16200],{"class":1404},"            defaults",[1050,16202,16203],{"class":1109},"={\n",[1050,16205,16206,16208,16210,16212,16214,16216],{"class":1052,"line":11892},[1050,16207,10777],{"class":1275},[1050,16209,12951],{"class":1279},[1050,16211,1276],{"class":1275},[1050,16213,2613],{"class":1109},[1050,16215,16073],{"class":1393},[1050,16217,1998],{"class":1109},[1050,16219,16220,16222,16225,16227,16229,16231],{"class":1052,"line":11907},[1050,16221,10777],{"class":1275},[1050,16223,16224],{"class":1279},"consent_method",[1050,16226,1276],{"class":1275},[1050,16228,2613],{"class":1109},[1050,16230,13009],{"class":1393},[1050,16232,1998],{"class":1109},[1050,16234,16235,16237,16239,16241,16243,16245],{"class":1052,"line":11929},[1050,16236,10777],{"class":1275},[1050,16238,8944],{"class":1279},[1050,16240,1276],{"class":1275},[1050,16242,2613],{"class":1109},[1050,16244,9775],{"class":1393},[1050,16246,1998],{"class":1109},[1050,16248,16249,16251,16253,16255,16257,16259],{"class":1052,"line":11950},[1050,16250,10777],{"class":1275},[1050,16252,9563],{"class":1279},[1050,16254,1276],{"class":1275},[1050,16256,2613],{"class":1109},[1050,16258,16103],{"class":1393},[1050,16260,1998],{"class":1109},[1050,16262,16263,16265,16267,16269,16271,16273],{"class":1052,"line":11955},[1050,16264,10777],{"class":1275},[1050,16266,13049],{"class":1279},[1050,16268,1276],{"class":1275},[1050,16270,2613],{"class":1109},[1050,16272,9734],{"class":1529},[1050,16274,1998],{"class":1109},[1050,16276,16277,16279,16281,16283,16285,16287],{"class":1052,"line":11960},[1050,16278,10777],{"class":1275},[1050,16280,13068],{"class":1279},[1050,16282,1276],{"class":1275},[1050,16284,2613],{"class":1109},[1050,16286,9282],{"class":1275},[1050,16288,1998],{"class":1109},[1050,16290,16291],{"class":1052,"line":11974},[1050,16292,16293],{"class":1109},"            }\n",[1050,16295,16296],{"class":1052,"line":12002},[1050,16297,2021],{"class":1109},[1050,16299,16300],{"class":1052,"line":12012},[1050,16301,1933],{"class":1067},[1050,16303,16304,16306],{"class":1052,"line":12023},[1050,16305,2217],{"class":1063},[1050,16307,16308],{"class":1067}," consent\n",[1050,16310,16311],{"class":1052,"line":12034},[1050,16312,1253],{"class":1067},[1050,16314,16315,16317],{"class":1052,"line":12045},[1050,16316,15894],{"class":1109},[1050,16318,15897],{"class":1616},[1050,16320,16321,16323,16326,16328,16330,16332,16334],{"class":1052,"line":12056},[1050,16322,1769],{"class":1213},[1050,16324,16325],{"class":1772}," get_data_retention_date",[1050,16327,1221],{"class":1109},[1050,16329,1744],{"class":2264},[1050,16331,1285],{"class":1109},[1050,16333,15913],{"class":2264},[1050,16335,1233],{"class":1109},[1050,16337,16338,16340,16343],{"class":1052,"line":12071},[1050,16339,1787],{"class":1239},[1050,16341,16342],{"class":1243},"Get data retention date for user and purpose",[1050,16344,1247],{"class":1239},[1050,16346,16347,16349],{"class":1052,"line":12095},[1050,16348,4290],{"class":1063},[1050,16350,1728],{"class":1109},[1050,16352,16354,16356,16358,16360,16362,16364,16366,16368,16370,16372,16374,16376],{"class":1052,"line":16353},291,[1050,16355,15935],{"class":1067},[1050,16357,1385],{"class":1109},[1050,16359,12182],{"class":1067},[1050,16361,1110],{"class":1109},[1050,16363,4305],{"class":1806},[1050,16365,1110],{"class":1109},[1050,16367,2635],{"class":1393},[1050,16369,1221],{"class":1109},[1050,16371,1753],{"class":1404},[1050,16373,1385],{"class":1109},[1050,16375,15956],{"class":1393},[1050,16377,1432],{"class":1109},[1050,16379,16381,16383,16385,16387,16389,16391,16393,16395,16397,16399,16401,16403,16405,16407,16409,16411],{"class":1052,"line":16380},292,[1050,16382,15963],{"class":1067},[1050,16384,1385],{"class":1109},[1050,16386,12503],{"class":1067},[1050,16388,1110],{"class":1109},[1050,16390,4305],{"class":1806},[1050,16392,1110],{"class":1109},[1050,16394,2635],{"class":1393},[1050,16396,1221],{"class":1109},[1050,16398,1744],{"class":1404},[1050,16400,1385],{"class":1109},[1050,16402,1744],{"class":1393},[1050,16404,1285],{"class":1109},[1050,16406,15988],{"class":1404},[1050,16408,1385],{"class":1109},[1050,16410,12912],{"class":1393},[1050,16412,1432],{"class":1109},[1050,16414,16416],{"class":1052,"line":16415},293,[1050,16417,4535],{"class":1067},[1050,16419,16421,16423,16425,16427,16429],{"class":1052,"line":16420},294,[1050,16422,2553],{"class":1063},[1050,16424,14273],{"class":1067},[1050,16426,1110],{"class":1109},[1050,16428,13049],{"class":1806},[1050,16430,1728],{"class":1109},[1050,16432,16434],{"class":1052,"line":16433},295,[1050,16435,16436],{"class":1056},"                # Data should be deleted immediately after withdrawal\n",[1050,16438,16440,16442,16444,16446],{"class":1052,"line":16439},296,[1050,16441,2727],{"class":1063},[1050,16443,14273],{"class":1067},[1050,16445,1110],{"class":1109},[1050,16447,16015],{"class":1806},[1050,16449,16451,16454],{"class":1052,"line":16450},297,[1050,16452,16453],{"class":1063},"            else",[1050,16455,1728],{"class":1109},[1050,16457,16459],{"class":1052,"line":16458},298,[1050,16460,16461],{"class":1056},"                # Data should be deleted after retention period\n",[1050,16463,16465,16467,16469,16471,16473,16476,16478,16480,16483,16485,16488,16490,16492,16494,16497],{"class":1052,"line":16464},299,[1050,16466,2727],{"class":1063},[1050,16468,14273],{"class":1067},[1050,16470,1110],{"class":1109},[1050,16472,14308],{"class":1806},[1050,16474,16475],{"class":1810}," +",[1050,16477,2703],{"class":1067},[1050,16479,1110],{"class":1109},[1050,16481,16482],{"class":1393},"timedelta",[1050,16484,1221],{"class":1109},[1050,16486,16487],{"class":1404},"days",[1050,16489,1385],{"class":1109},[1050,16491,12912],{"class":1393},[1050,16493,1110],{"class":1109},[1050,16495,16496],{"class":1806},"retention_period",[1050,16498,1432],{"class":1109},[1050,16500,16502],{"class":1052,"line":16501},300,[1050,16503,1933],{"class":1067},[1050,16505,16507,16509,16511,16513,16515,16517,16519,16521,16523,16525],{"class":1052,"line":16506},301,[1050,16508,4327],{"class":1063},[1050,16510,4466],{"class":1109},[1050,16512,12587],{"class":1067},[1050,16514,1110],{"class":1109},[1050,16516,4334],{"class":1806},[1050,16518,1285],{"class":1109},[1050,16520,12503],{"class":1067},[1050,16522,1110],{"class":1109},[1050,16524,4334],{"class":1806},[1050,16526,1233],{"class":1109},[1050,16528,16530,16532],{"class":1052,"line":16529},302,[1050,16531,1924],{"class":1063},[1050,16533,1927],{"class":1529},[1026,16535,16536],{},"Advanced security hardening requires a comprehensive approach that includes strong authentication, granular authorization, continuous monitoring, and compliance with regulatory requirements. The key is implementing defense-in-depth strategies while maintaining usability and performance. Regular security audits, penetration testing, and staying updated with the latest security best practices are essential for maintaining a secure Django application.",[16538,16539,16540],"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 .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 .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}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 .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}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 .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s6DHA, html code.shiki .s6DHA{--shiki-light:#6182B8;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}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 .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}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 .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}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);}",{"title":1045,"searchDepth":1053,"depth":1060,"links":16542},[16543,16547,16550],{"id":1032,"depth":1060,"text":1033,"children":16544},[16545,16546],{"id":1037,"depth":1071,"text":1038},{"id":4709,"depth":1071,"text":4710},{"id":7926,"depth":1060,"text":7927,"children":16548},[16549],{"id":7930,"depth":1071,"text":7931},{"id":12100,"depth":1060,"text":12101,"children":16551},[16552],{"id":12104,"depth":1071,"text":12105},"md",null,{},{"title":847,"description":1028},"HOudK7BnL0JJ7hfKnzpGfrYZOiZxrCtYsWZfwDxqVAw",[16559,16561],{"title":843,"path":844,"stem":845,"description":16560,"children":-1},"Microservices architecture breaks down monolithic applications into smaller, independent services that communicate over well-defined APIs. This guide covers strategies for integrating Django applications with microservices, including service communication patterns, data consistency, and deployment considerations.",{"title":851,"path":852,"stem":853,"description":16562,"children":-1},"Logging is essential for monitoring, debugging, and maintaining Django applications. Django's logging framework, built on Python's logging module, provides flexible and powerful tools for capturing and managing application logs across development and production environments.",1772474960335]