{"componentChunkName":"component---gatsby-theme-spaceout-src-templates-article-template-tsx","path":"/advanced-typescript-patterns-and-architectures","result":{"pageContext":{"article":{"id":"ef8cfe57-c190-545c-be72-6a7441988d53","slug":"/advanced-typescript-patterns-and-architectures","secret":false,"title":"Advanced TypeScript Patterns and Architectures","author":"Luke Celitan","date":"June 28th, 2025","dateForSEO":"2025-06-28T00:00:00.000Z","timeToRead":4,"excerpt":"A comprehensive deep-dive into advanced TypeScript patterns, type-level programming, generics, decorators, performance optimization, and scalable enterprise architecture.","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"Advanced TypeScript Patterns and Architectures\",\n  \"excerpt\": \"A comprehensive deep-dive into advanced TypeScript patterns, type-level programming, generics, decorators, performance optimization, and scalable enterprise architecture.\",\n  \"date\": \"2025-06-28T00:00:00.000Z\",\n  \"hero\": \"tsCover.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"Nodejs\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"advanced-typescript-patterns-and-architecture\"\n  }, \"Advanced TypeScript Patterns and Architecture\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"TypeScript has rapidly evolved from a simple type-checking layer for JavaScript into a powerful language for building robust, scalable, and maintainable applications. As projects grow in complexity and scale, leveraging advanced TypeScript patterns becomes essential for enforcing contracts, improving developer productivity, and catching bugs at compile time. In this deep-dive, I\\u2019ll walk you through the most advanced features of TypeScript\\u2014type-level programming, generics, conditional and mapped types, decorators, performance optimization, and architectural patterns for enterprise-scale applications. Whether you\\u2019re a seasoned TypeScript developer or looking to level up your skills, this post will serve as a definitive reference for mastering TypeScript at scale.\"), mdx(\"p\", null, \"Ill focus on the following topics:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The theory and motivation behind advanced type system features\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Step-by-step code examples, from basics to real-world scenarios\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Best practices, common pitfalls, and troubleshooting tips\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Performance and architectural considerations\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"How to build robust, maintainable, and scalable TypeScript codebases\")), mdx(\"h2\", {\n    \"id\": \"type-level-programming-in-typescript\"\n  }, \"Type-Level Programming in TypeScript\"), mdx(\"h3\", {\n    \"id\": \"what-is-type-level-programming\"\n  }, \"What is Type-Level Programming?\"), mdx(\"p\", null, \"Type-level programming is the art of using TypeScript\\u2019s type system as a compile-time programming language. This allows you to encode logic, constraints, and computations in types, enabling powerful static analysis and type-safe APIs.\"), mdx(\"h4\", {\n    \"id\": \"why-type-level-programming\"\n  }, \"Why Type-Level Programming?\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Catch errors early:\"), \" Enforce invariants and contracts at compile time.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Expressiveness:\"), \" Model complex data structures and APIs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Maintainability:\"), \" Reduce runtime checks and boilerplate.\")), mdx(\"h3\", {\n    \"id\": \"type-inference-and-manipulation\"\n  }, \"Type Inference and Manipulation\"), mdx(\"p\", null, \"TypeScript\\u2019s type inference is powerful, but sometimes you need to guide or manipulate types explicitly.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// Basic inference\\nconst num = 42; // type: number\\n\\n// Explicit type annotation\\nconst str: string = 'hello';\\n\\n// Type manipulation with utility types\\ntype User = { id: number; name: string };\\ntype UserId = User['id']; // type: number\\n\")), mdx(\"h4\", {\n    \"id\": \"practical-use-case-type-safe-api-responses\"\n  }, \"Practical Use Case: Type-Safe API Responses\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type ApiResponse<T> = {\\n  status: 'success' | 'error';\\n  data: T;\\n  error?: string;\\n};\\n\\nfunction fetchUser(): ApiResponse<{ id: number; name: string }> {\\n  // ...\\n  return { status: 'success', data: { id: 1, name: 'Alice' } };\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"advanced-type-utilities-and-custom-type-functions\"\n  }, \"Advanced Type Utilities and Custom Type Functions\"), mdx(\"p\", null, \"TypeScript provides built-in utility types (Partial, Pick, Omit, etc.), but you can create your own for more advanced scenarios.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// Custom type: DeepReadonly\\n\\n// Recursive mapped type\\nexport type DeepReadonly<T> = {\\n  readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];\\n};\\n\\nconst config: DeepReadonly<{ a: { b: number } }> = {\\n  a: { b: 42 },\\n};\\n// config.a.b = 10; // Error: Cannot assign to 'b' because it is a read-only property.\\n\")), mdx(\"h4\", {\n    \"id\": \"edge-case-handling-arrays-and-functions\"\n  }, \"Edge Case: Handling Arrays and Functions\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"export type DeepReadonly2<T> =\\n  T extends (infer R)[] ? ReadonlyArray<DeepReadonly2<R>> :\\n  T extends Function ? T :\\n  T extends object ? { readonly [K in keyof T]: DeepReadonly2<T[K]> } :\\n  T;\\n\")), mdx(\"h3\", {\n    \"id\": \"compile-time-validation\"\n  }, \"Compile-Time Validation\"), mdx(\"p\", null, \"Type-level programming enables compile-time validation, such as ensuring only valid keys are used.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type ValidKeys = 'id' | 'name';\\nfunction getValue<T extends ValidKeys>(key: T) {\\n  // ...\\n}\\n// getValue('age'); // Error: Argument of type 'age' is not assignable to parameter of type 'id' | 'name'.\\n\")), mdx(\"h2\", {\n    \"id\": \"advanced-generics\"\n  }, \"Advanced Generics\"), mdx(\"h3\", {\n    \"id\": \"generic-constraints-and-defaults\"\n  }, \"Generic Constraints and Defaults\"), mdx(\"p\", null, \"Generics allow you to write reusable, type-safe code. Constraints and defaults make them even more powerful.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"function identity<T>(value: T): T {\\n  return value;\\n}\\n\\n// Constraint: T must have a length property\\nfunction logLength<T extends { length: number }>(value: T): void {\\n  console.log(value.length);\\n}\\n\\n// Default generic type\\nfunction createMap<K extends string = string, V = any>(): Record<K, V> {\\n  return {} as Record<K, V>;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"higher-order-generics-and-variance\"\n  }, \"Higher-Order Generics and Variance\"), mdx(\"p\", null, \"TypeScript supports higher-order generics (generics of generics) and variance (covariance, contravariance).\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// Higher-order generic\\nfunction mapValues<T, U>(obj: Record<string, T>, fn: (value: T) => U): Record<string, U> {\\n  const result: Record<string, U> = {};\\n  for (const key in obj) {\\n    result[key] = fn(obj[key]);\\n  }\\n  return result;\\n}\\n\\n// Variance example\\ninterface Covariant<out T> {}\\ninterface Contravariant<in T> {}\\n// Note: TypeScript does not have explicit 'in'/'out' keywords, but variance is inferred from usage.\\n\")), mdx(\"h3\", {\n    \"id\": \"recursive-generics-and-utility-types\"\n  }, \"Recursive Generics and Utility Types\"), mdx(\"p\", null, \"Recursive generics enable deep transformations and type-safe builders.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// Recursive generic: Flatten nested arrays\\n\\ntype Flatten<T> = T extends (infer R)[] ? Flatten<R> : T;\\n\\ntype A = Flatten<number[][][]>; // number\\n\")), mdx(\"h4\", {\n    \"id\": \"best-practice-avoid-overly-complex-generics\"\n  }, \"Best Practice: Avoid Overly Complex Generics\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep generics readable and document intent.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use type aliases for clarity.\")), mdx(\"h4\", {\n    \"id\": \"common-pitfall-type-inference-failures\"\n  }, \"Common Pitfall: Type Inference Failures\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Sometimes TypeScript cannot infer types for deeply nested generics. Use explicit annotations when needed.\")), mdx(\"h2\", {\n    \"id\": \"conditional-types\"\n  }, \"Conditional Types\"), mdx(\"h3\", {\n    \"id\": \"syntax-and-use-cases\"\n  }, \"Syntax and Use Cases\"), mdx(\"p\", null, \"Conditional types allow you to express logic at the type level.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type IsString<T> = T extends string ? true : false;\\ntype A = IsString<'hello'>; // true\\ntype B = IsString<42>; // false\\n\")), mdx(\"h3\", {\n    \"id\": \"distributive-conditional-types\"\n  }, \"Distributive Conditional Types\"), mdx(\"p\", null, \"Conditional types distribute over unions by default.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type ToArray<T> = T extends any ? T[] : never;\\ntype A = ToArray<string | number>; // string[] | number[]\\n\")), mdx(\"h4\", {\n    \"id\": \"edge-case-preventing-distribution\"\n  }, \"Edge Case: Preventing Distribution\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type NoDistribute<T> = [T] extends [any] ? T[] : never;\\ntype B = NoDistribute<string | number>; // (string | number)[]\\n\")), mdx(\"h3\", {\n    \"id\": \"combining-with-mapped-and-template-literal-types\"\n  }, \"Combining with Mapped and Template Literal Types\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type EventName<T extends string> = `on${Capitalize<T>}`;\\ntype ClickEvent = EventName<'click'>; // 'onClick'\\n\")), mdx(\"h4\", {\n    \"id\": \"real-world-example-type-safe-event-handlers\"\n  }, \"Real-World Example: Type-Safe Event Handlers\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type Events = 'click' | 'hover';\\ntype EventHandlers = {\\n  [K in Events as `on${Capitalize<K>}`]: (event: Event) => void;\\n};\\n\\nconst handlers: EventHandlers = {\\n  onClick: (e) => {},\\n  onHover: (e) => {},\\n};\\n\")), mdx(\"h2\", {\n    \"id\": \"template-literal-types\"\n  }, \"Template Literal Types\"), mdx(\"h3\", {\n    \"id\": \"string-manipulation-at-the-type-level\"\n  }, \"String Manipulation at the Type Level\"), mdx(\"p\", null, \"Template literal types allow you to construct and match string types.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type Route = `/api/${string}`;\\nconst route: Route = '/api/users'; // OK\\n// const badRoute: Route = '/users'; // Error\\n\")), mdx(\"h3\", {\n    \"id\": \"pattern-matching-and-type-safe-string-apis\"\n  }, \"Pattern Matching and Type-Safe String APIs\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type CSSLength = `${number}px` | `${number}em` | `${number}%`;\\nconst width: CSSLength = '100px'; // OK\\n\")), mdx(\"h3\", {\n    \"id\": \"real-world-applications\"\n  }, \"Real-World Applications\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Event names (as above)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"CSS-in-JS property names\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Type-safe query keys\")), mdx(\"h4\", {\n    \"id\": \"advanced-extracting-parts-of-strings\"\n  }, \"Advanced: Extracting Parts of Strings\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type ExtractId<T> = T extends `/api/user/${infer Id}` ? Id : never;\\ntype UserId = ExtractId<'/api/user/42'>; // '42'\\n\")), mdx(\"h2\", {\n    \"id\": \"mapped-types\"\n  }, \"Mapped Types\"), mdx(\"h3\", {\n    \"id\": \"built-in-mapped-types\"\n  }, \"Built-In Mapped Types\"), mdx(\"p\", null, \"TypeScript provides several built-in mapped types:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Partial<T>\"), \": All properties optional\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Required<T>\"), \": All properties required\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Readonly<T>\"), \": All properties readonly\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Pick<T, K>\"), \": Select a subset of properties\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Omit<T, K>\"), \": Exclude a subset of properties\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type User = { id: number; name: string; email?: string };\\ntype ReadonlyUser = Readonly<User>;\\ntype UserWithoutEmail = Omit<User, 'email'>;\\n\")), mdx(\"h3\", {\n    \"id\": \"custom-mapped-types-for-deep-transformations\"\n  }, \"Custom Mapped Types for Deep Transformations\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// DeepPartial: recursively make all properties optional\\nexport type DeepPartial<T> = {\\n  [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\\n};\\n\")), mdx(\"h3\", {\n    \"id\": \"combining-with-conditional-and-template-literal-types\"\n  }, \"Combining with Conditional and Template Literal Types\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type EventMap<T extends string> = {\\n  [K in T as `on${Capitalize<K>}`]: (event: Event) => void;\\n};\\n\")), mdx(\"h4\", {\n    \"id\": \"best-practice-use-mapped-types-for-dry-code\"\n  }, \"Best Practice: Use Mapped Types for DRY Code\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Avoid repetitive type definitions by leveraging mapped types.\")), mdx(\"h4\", {\n    \"id\": \"common-pitfall-excessive-recursion\"\n  }, \"Common Pitfall: Excessive Recursion\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Deeply recursive mapped types can slow down type checking. Limit recursion depth where possible.\")), mdx(\"h2\", {\n    \"id\": \"decorators\"\n  }, \"Decorators\"), mdx(\"h3\", {\n    \"id\": \"what-are-decorators\"\n  }, \"What Are Decorators?\"), mdx(\"p\", null, \"Decorators are special annotations for classes, methods, properties, or parameters. They enable meta-programming and are widely used in frameworks like Angular and NestJS.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Note:\"), \" Decorators are a stage 3 ECMAScript proposal and require \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"experimentalDecorators\"), \" in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"tsconfig.json\"), \".\")), mdx(\"h3\", {\n    \"id\": \"class-method-property-and-parameter-decorators\"\n  }, \"Class, Method, Property, and Parameter Decorators\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"function Controller(prefix: string) {\\n  return function (target: Function) {\\n    Reflect.defineMetadata('prefix', prefix, target);\\n  };\\n}\\n\\n@Controller('/api')\\nclass UserController {}\\n\\nfunction Log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {\\n  const original = descriptor.value;\\n  descriptor.value = function (...args: any[]) {\\n    console.log(`Calling ${propertyKey} with`, args);\\n    return original.apply(this, args);\\n  };\\n}\\n\\nclass Service {\\n  @Log\\n  doSomething(a: number, b: number) {\\n    return a + b;\\n  }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"metadata-reflection-and-advanced-patterns\"\n  }, \"Metadata Reflection and Advanced Patterns\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"import 'reflect-metadata';\\n\\nfunction Inject(token: string) {\\n  return function (target: any, propertyKey: string) {\\n    Reflect.defineMetadata('inject', token, target, propertyKey);\\n  };\\n}\\n\\nclass MyService {\\n  @Inject('Logger')\\n  logger: any;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"use-in-frameworks-nestjs-angular\"\n  }, \"Use in Frameworks (NestJS, Angular)\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"NestJS:\"), \" Uses decorators for controllers, services, dependency injection.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Angular:\"), \" Uses decorators for components, modules, services.\")), mdx(\"h4\", {\n    \"id\": \"best-practice-keep-decorators-pure\"\n  }, \"Best Practice: Keep Decorators Pure\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Avoid side effects in decorators; use them for metadata and wiring, not business logic.\")), mdx(\"h4\", {\n    \"id\": \"common-pitfall-decorator-order\"\n  }, \"Common Pitfall: Decorator Order\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The order of decorator application matters. Document and test decorator stacks.\")), mdx(\"h2\", {\n    \"id\": \"performance-optimization\"\n  }, \"Performance Optimization\"), mdx(\"h3\", {\n    \"id\": \"type-system-performance-compile-time-vs-runtime\"\n  }, \"Type System Performance: Compile-Time vs. Runtime\"), mdx(\"p\", null, \"TypeScript\\u2019s type system only exists at compile time, but complex types can slow down builds.\"), mdx(\"h4\", {\n    \"id\": \"reducing-type-complexity\"\n  }, \"Reducing Type Complexity\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Avoid deeply recursive types unless necessary.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Split large types into smaller, composable pieces.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use type aliases to simplify complex expressions.\")), mdx(\"h4\", {\n    \"id\": \"performance-benchmark-example\"\n  }, \"Performance Benchmark Example\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// Deeply nested recursive types can slow down type checking\\nexport type DeepNest<T> = { next: DeepNest<T> };\\n// Use with caution!\\n\")), mdx(\"h3\", {\n    \"id\": \"runtime-performance-type-driven-code-generation\"\n  }, \"Runtime Performance: Type-Driven Code Generation\"), mdx(\"p\", null, \"TypeScript types are erased at runtime, but you can use them to drive code generation (e.g., with codegen tools or schema validation libraries).\"), mdx(\"h4\", {\n    \"id\": \"avoiding-type-bloat\"\n  }, \"Avoiding Type Bloat\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Don\\u2019t overuse type unions or intersections with hundreds of members.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Prefer enums or string literal types for finite sets.\")), mdx(\"h2\", {\n    \"id\": \"enterprise-scale-architecture\"\n  }, \"Enterprise-Scale Architecture\"), mdx(\"h3\", {\n    \"id\": \"modular-type-definitions-and-scalable-type-systems\"\n  }, \"Modular Type Definitions and Scalable Type Systems\"), mdx(\"p\", null, \"Organize types into modules for maintainability.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// types/user.ts\\nexport type User = { id: number; name: string };\\n\\n// types/api.ts\\nimport { User } from './user';\\nexport type ApiResponse<T> = { status: string; data: T };\\n\")), mdx(\"h3\", {\n    \"id\": \"enforcing-contracts-and-invariants-at-scale\"\n  }, \"Enforcing Contracts and Invariants at Scale\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use branded types for nominal typing (e.g., UserId vs. ProductId).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use type guards and assertion functions for runtime validation.\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// Type branding\\nexport type UserId = string & { readonly brand: unique symbol };\\nfunction createUserId(id: string): UserId {\\n  return id as UserId;\\n}\\n\\nfunction isUserId(id: string): id is UserId {\\n  // runtime check if needed\\n  return true;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"patterns-for-maintainable-robust-and-testable-codebases\"\n  }, \"Patterns for Maintainable, Robust, and Testable Codebases\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use interfaces for public APIs, types for internal logic.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Prefer composition over inheritance.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrate with linters (ESLint), formatters (Prettier), and CI/CD for type checks.\")), mdx(\"h3\", {\n    \"id\": \"integration-with-build-tools-linters-and-cicd\"\n  }, \"Integration with Build Tools, Linters, and CI/CD\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"tsc --noEmit\"), \" in CI to enforce type safety.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"ts-prune\"), \" to find unused types.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"typescript-eslint\"), \" for linting type-aware code.\")), mdx(\"h2\", {\n    \"id\": \"advanced-concepts\"\n  }, \"Advanced Concepts\"), mdx(\"h3\", {\n    \"id\": \"type-recursion-and-fixed-point-types\"\n  }, \"Type Recursion and Fixed-Point Types\"), mdx(\"p\", null, \"Recursive types can model complex data structures, but beware of type system limits.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type JSONValue = string | number | boolean | null | JSONObject | JSONArray;\\ninterface JSONObject { [key: string]: JSONValue; }\\ninterface JSONArray extends Array<JSONValue> {}\\n\")), mdx(\"h3\", {\n    \"id\": \"type-branding-and-nominal-typing\"\n  }, \"Type Branding and Nominal Typing\"), mdx(\"p\", null, \"TypeScript is structurally typed, but branding enables nominal typing.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"type USD = number & { readonly brand: unique symbol };\\nfunction asUSD(n: number): USD {\\n  return n as USD;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"type-safe-builder-patterns\"\n  }, \"Type-Safe Builder Patterns\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class UserBuilder {\\n  private user: Partial<User> = {};\\n  setId(id: number): this {\\n    this.user.id = id;\\n    return this;\\n  }\\n  setName(name: string): this {\\n    this.user.name = name;\\n    return this;\\n  }\\n  build(): User {\\n    if (!this.user.id || !this.user.name) throw new Error('Missing fields');\\n    return this.user as User;\\n  }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"type-driven-api-design\"\n  }, \"Type-Driven API Design\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use generics and mapped types to create type-safe APIs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Example: GraphQL codegen, REST API clients.\")), mdx(\"h3\", {\n    \"id\": \"integration-with-third-party-libraries-and-frameworks\"\n  }, \"Integration with Third-Party Libraries and Frameworks\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use type definitions from DefinitelyTyped (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"@types/*\"), \").\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Extend or augment types for custom use cases.\")), mdx(\"h3\", {\n    \"id\": \"type-testing-and-validation-tools\"\n  }, \"Type Testing and Validation Tools\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"tsd\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"expect-type\"), \" for type-level tests.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"zod\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"io-ts\"), \", or \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"runtypes\"), \" for runtime validation with type inference.\")), mdx(\"h2\", {\n    \"id\": \"troubleshooting-and-debugging-advanced-types\"\n  }, \"Troubleshooting and Debugging Advanced Types\"), mdx(\"h3\", {\n    \"id\": \"common-errors\"\n  }, \"Common Errors\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\u201CType instantiation is excessively deep and possibly infinite\\u201D\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\u201CType \\u2018X\\u2019 is not assignable to type \\u2018Y\\u2019\\u201D\")), mdx(\"h3\", {\n    \"id\": \"debugging-tips\"\n  }, \"Debugging Tips\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use type aliases to break down complex types.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"as const\"), \" for literal inference.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"// @ts-expect-error\"), \" to document intentional type violations.\")), mdx(\"h2\", {\n    \"id\": \"conclusion\"\n  }, \"Conclusion\"), mdx(\"p\", null, \"Advanced TypeScript patterns unlock a new level of expressiveness, safety, and maintainability for your codebase. By mastering type-level programming, generics, conditional and mapped types, decorators, and scalable architecture, you can build robust enterprise applications with confidence. Remember to balance type complexity with performance, document your advanced types, and leverage the ecosystem of tools for testing and validation.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Further Reading:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.typescriptlang.org/docs/handbook/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"TypeScript Handbook\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.typescriptlang.org/docs/handbook/advanced-types.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Advanced Types\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/type-challenges/type-challenges\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Type Challenges\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/SamVerschueren/tsd\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"tsd (TypeScript type tests)\"))), mdx(\"p\", null, \"Happy typing!\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","Nodejs"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEZklEQVQ4y3VUWUxbRxQ1CEMklpIKsQgoIpRNYCBgA2JpBY1U+gnGbgJIlFLshlaQEEJapDZhNVVoRZevEjAxJYlqSqBSMMsXH4TVAQlCKKExlMWAzWb2FHM6M9ggVOVao3nPd+55Z+45M5yjoyMcAWDzyTh+N8e/h4fY2dmFXq/Hik4HI8lNvphEX28fe378uA0rKzo0yO+DYzQDmn40jCawQwK0trYGnV6H5eVlbGxsYGZmBtpFLZaWlqDRzKC3txf9ff1QtaswODB0DAgzQ5wy2z84wCuNhgEevH6NQ6MRO7u7rHh2dhZarRaLi4uYnPwLQ0PDUDQoWN1ZQNMzZUK/bDBsnbA1GAzQvNKQ4iFMTExgb28P+/v7GB8fR3lZOebm5jA1NXUW0EhY0OhQdUAqkWBzcxNjY2PY2t5mucGBQfT395Piedy5fQfZ2dnIvZoLYYoQKlLT97TPDHjKjoJUVlaiu7ubva+vrzNR6BYHBgYw8XwC9fVyJCQk4qtbX0Ms/hjx8e+hoeE+5ucXTKJQdibArq4uFBbehFwuJ1t7QXp3RMQxQq1+RnLdmJ7+Gx0dnYiLi0dmZiZSU1OR85mEKN0KmazqGNAMRpWUVVahrk6OtrY/UVZSiueE0caGgeRW8ODBQ9STnEqlQnp6BgNL+jAJkhwpamvvQSr93ARo6p1arUbel3mMvkrViW+/uY0bNwrxu7IZpSVluJZ/nW0xKioavn5+CAwMRHJyMtLT0lFRUYmRkdGzgFSAvLxrqP31Hjo7u1BdXY20K2m4W3UXLc0taPqtCfkkHx0dDe8LF+Dt7c0ApRIpnhJBtra2TntIY5f4jG75h+9r0NbaxgAKrhfgyZN2YuhZNCv/QG7uFxBERkIoFCI0NBReXl4IDw9HQUEBenp6TgEPT1iOo6rqOwZYV1ePRkUjlMoWFBFFsz7JQlbWp0hMTERERAQCAgLg7+9PWOdjdXXt2NgUyGga9KjRGB0dZQ0WicV49PAR2onHamp+ZL6LiYlBUFAQIgnLd319IRBEkjPcwOq2iV85eEPIZDJWVFxcjJvERjk5EsKKj3PnbODm5oZLlz5g/yuVSuK/eXYM1cPD4IiI9GKxiA1RqhAiUSquXL6Mj5KSwOMF4x1PD/CCg+Hu7g4bG2twrazA5VqxXAoRJCMjnfQzBYkJCYiOigKHBOuDj48Pa7CrqytTz8ODAPF4rPF09iXbo33jcrm06M2DLoiNjSXOj2MFwYSNH/FYWFgYLl4MY9sOCQkBn89nMwWm/qMfsba2PgGysLBgg2Nv7wAXFxfGiG7L1dUNTk5OcHZ2hqOjI2P8FpnPn38bnp6ebA3N0Wd7BwfY2dnB1tYWlpaWsCLt4Kzo9OSyXCZN1UK/ukoaq0ZFeQWKim6hsbGJqH0VJaXl7AguLCzi5ctptBJL0cuVvs/+M8cOg4AfCb5A8H+Vh4lSCoWCKUZv4Z9/+oXdOGY7DQ0Onlk/8mwE75PbJp5cFtRG/wGBYGS4hAlHKQAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/a1946/tsCover.png","srcSet":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/5b37e/tsCover.png 236w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/49058/tsCover.png 472w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/a1946/tsCover.png 944w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/6050d/tsCover.png 1200w","srcWebp":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/99fbb/tsCover.webp","srcSetWebp":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/77392/tsCover.webp 236w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/1f177/tsCover.webp 472w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/99fbb/tsCover.webp 944w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/9000d/tsCover.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M311%206l-2%206-1%202-1%201v1l-1%201v3c0%203%200%203-2%202l-9-3%201-1c0-3%202-7%203-6s1%201%201-1V9l-1-2-3%206c-2%205-4%207-4%206%200-2%200-2-1-1h-12c-7-2-11-2-11-1a172%20172%200%200134%207c9%202%2010%203%2016%209%206%205%207%206%206%207-1%202-2%202-3%200-3-2-2%200%200%203l2%201c0-2%200-2%202-1%202%203%201%203-8%202-8-2-19-3-18-1l7%201c18%201%2028%205%2026%2010l1%201%202%201-1%201h-1v1c3%200%204%201%206%207l2%205h-5c-6-1-7%201-5%209%201%208%201%209-2%207l-6-2-4-1c-3-3-20-4-18-2v1c-1-1-2%200-3%201h-2v-1c1-1%200-1-2-1l-3%201-1%201h-1l1%202c2%201-1%206-3%206l-2-1-1-1-3-3-3-2v3l1%202c1%201%201%201-1%203l-5%203c-1%200-7%206-7%208l2%201%201-3h2l2-1h1v1c-2%202-1%205%201%203h1l1%202c1-1%201%200%200%200%200%202%200%202%201%201l2%201c1%201%200%201-1%201v6l-1%2010-1%206-1%202c1%201%201%201%202-1l2%205%204%2011%202%204-4%203c-4%204-8%205-6%203l-1-1c-1%201-3%200-4-1l-2-2-4-1-5-1-1-1c1-1-2-2-5-2l-4-3-5-2-10-3c-6-3-8-4-8-6-1-9%2013-41%2017-41l1%201%201%201%201-1h2c2%202%203%202%203%201l1-2%201%201c-1%201%200%201%201%201s2%200%201-1c-1%200-1-1%201-2l2-2h-12c-2%201-7%200-7-1h-2c-2%202-2%202%200%202l-2%204c-6%207-12%2024-13%2034v8l3%202%203%202h1c3-1%203%202%200%207-2%204-3%205-6%206-4%201-4%201-2%202h-2c-3%200-3%200-2%201s1%201-1%201h-2l-9%204c-12%204-13%205-12%203l-1-1-3%201%202%201c1%201%201%201-1%201-2-1-3%200-3%201l-3%201-8%202-6%201-1-2c-1-2%202-4%208-6%204%200%206-2%203-2l-1-2c0-2-4-3-5-1l-3%201c-2%200-3%201-1%203v2c-2%201-2%200-3-2-3-9-5-12-11-18l-5-8v-1h-2v-3h-2l-4-2-3-5v-3l-2-2-1%202c-2%202-2%202-3%200-1-3-13-8-19-9-5-1-5-1-2-1%209-3%2021-8%2023-11%204-4%204-6%201-3-2%201-3%202-4%201h-1l1%201c2%201-1%203-6%205l-5%201v-3l3-1h1l-2-1h-3l2-1v-2c-2-2-2-2%201-2l7-3%204-1c-1%202%200%202%201%202%202%200%202-1%202-3v-4c3-4%201-14-2-13h-3l-7%201c-7%203-7%202%200-5a192%20192%200%2001106-54l-8%201a190%20190%200%2000-113%2067h-1l-2-1c-2%200%204%207%208%2010%203%202%202%203-1%202-2%200-3-1-3-2l-2%202c-7%2011-10%2018-7%2024%201%203%201%203-2%202h-4c-2%201-2%201-2-1s0-3-1-2v2l-3%2010c-2%201%201%203%203%202l-3%204c-5%205-7%208-7%2010l-1%202c-1%201-5%2013-6%2020%200%207-1%208-3%204-1-4-1-9%201-16v-7l-3%205c-2%202-2%201%200%2022%203%2020%2013%2046%2016%2042h1c-1%201%200%204%201%205%202%204%207%209%207%207h2l1%202h-3c0%201%207%208%2013%2011l6%206%2014%2024c2%203%202%203%200%206l-1%204H0v75h93v9l-3%2011-1%202%202-1%201%203%201%205v-6c0-3%200-5%202-6%203-2%203-1%202%205%200%204-1%205-2%206l-2%202c0%202%200%202-1%201-1-2-1-2-1%201l-1%205c0%202%201%202%2010%202l11-1h2l1-1-2-1h-1l-4-1c-4%201-5%200-6-1h-4l-1-2-1%202-1%202c-1%200-1-2%201-6h15l-2-1-6-1-4-1h8l-4-1-2-1%202-1h8l5%202%202%201%204%202c0%202%205%200%208-3l4-3%201-3c-1-1%200-1%202-1s2%200%201-1-1-1%201-1l5-2%206-4c3-2%204-3%203-4h3c1-1%200-2-2-4l-3-3h8c6%200%207%200%205%201s-2%201-1%202l3-1h1l1%201c1-1%201%200%201%201l-1%204v-2c0-2%200-2-4%202l-5%205-4%205c-3%202-4%204-3%205l-1%201-1%202c-1%202-1%202-2%201s-1-1-1%201l-1%202-2%201-3%201-3%206%205%201%204-1v-1c2%201%2010-4%209-5l1-1h4c2-1%203-1%203%201h1c1-1%201-1%201%201-1%202-1%203%201%203l1-1h1c1%202%201%202%202-1%201-2%201-2%201%200%200%203%201%202%202-1l2-6c1-3%201-3%201-1l-1%205c-1%201-1%202%201%202%201%200%202-1%201-2h1c1%201%201%201%201-1l2-3%201-3%201-4c1-2%201-2%201%200s0%202%201%201l1-2v-2l1-1h1l4-1%204-2h1l3-1c3-2%204-3%204-6-1-3-1-3%201-1%201%201%201%201%200%200%200-2%200-2%201-1h1v-2h1c1-1%201%200%201%202v3l1-4c1-3%201-3%203-2h1l27-1c20%200%2026%200%2025%201h1l4-1v2c-3%201-6%204-5%205l-1%201v1h-1c-1-1-1-1-3%202s-2%204-1%205c3%201%209-1%207-2v-1h2l4-5c5-5%205-6%201-7a572%20572%200%200173-1c2%201-5%2017-7%2018v1l-2%203v-1l2-7c3-6%202-6-2%200-3%204-3%206-3%208v5c-2%201-2%205-1%205l1%201h-1l-2%201%201%201c1-1%201%200%201%201%200%202%200%202-1%201h-1c0%202%202%202%2021%202%2025%200%2022%201%2023-8%201-3%201-2%201%202v6h23V285c-1%201-3%200-5-1-3-2-2-2%203%200%201%200%202%200%202-3%200-2-1-3-2-3-4%200-9-2-8-3l-3-4c-2-2-2-2-1-3l1-2-2%201c-2%202-2%203-1%203%202%202%202%204%201%204l-4-3c-1-2-1-1-1%203l2%205h3v-1l1%202%204%203%206%203h-17c-15%200-17%200-17-2l1-1%202-3c0-1%200-2%201-1h1l1-4-3%203-4%205c0%203%201%203-40%203h-40l18-6a379%20379%200%200140-14c0-1%201-2%203-2%203-1%205-4%207-14%204-25%204-25%2017-32%2014-7%2020-12%2021-15%202-5%201-5-5-5-7%201-6%200%202-1%205-1%205-1%202-1-6%200-16%203-11%203%202%200%202%200-3%202l-8%201c-2-1-8%201-8%202l-1%201-2-1%202-2%201-3%204-7%202-4c3-6%207-9%2014-13l11-6%208-6%205-3v-50l-3%209-3%208-1%202v4l-1%201v1c1%202-2%2010-3%209v2c0%201%200%202-1%201s-3%206-3%2010c1%202%200%202-1%202l-1%203c0%202-1%203-2%202l-1%201c0%203%200%205-1%204l-1%201-1%203v-2l1-3%201-4c0-2%200-3-1-2v-3c1-1%201-1%201%201l1-3v-7c-1-2-1-2-1%201%200%202%200%203-1%202l-2-2c-1%201-1%200-1-5l1-8v-6l-1-6-1-8a118%20118%200%2000-9-35l-1-1h-1l-2-4-4-3a148%20148%200%200114-22l5-8c15-23%2024-38%2024-42%200-3-2-4-4-2h-7l-1%201-1%201c-1-1-1%200-1%202l-1%201-1%202c0%201%200%202-1%201l-2%201%201%201c2-1%201%201%200%202h-2v1c0%201%200%202-1%201l-2%201%201%201h1l-1%202-1-1h-1l-1%201%201%201h1l-1%202-1-1h-1l-1%201%201%201c2-2%201%201-1%203l-2%201-2%201%201%201c2-2%201%201-3%206l-4%204-2%201%201%201c3-2%201%201-14%2023l-11%2016%203-6c2-2%203-5%202-5l-2-4c-2-7-8-17-9-17l-3-5c-1-3-3-6-7-9-6-6-6-6-2-5l3%202%201%201h1l1%201a101%20101%200%200133%2013v-2l-7-3-6-4%207-13c11-23%2011-24%203-24-3%200-4%201-5%203l-2%201c0-2%200-2-1-1v3l1-1-13%2028-11-4-14-4c-4-1-4%200%201-12%204-12%205-13%203-13l-3%206m-60%2034v2l-2%201c-2%200-6%204-6%206%200%203%201%205%202%205l1-1c-1-2%200-1%202%201s5-1%204-5c0-2%202-4%204-2v1l-2-1%201%204%202%204%202-2%202-2c1%201%201%200%201-1%200-3-1-4-5-6-3-1-5-3-5-4h-1m31%2013c1%204%201%205-2%205l-11%205-8%204-4-3c-2-3-5-4-5-2l3%202%202%203-4%204-6%208c0%202-2%203-2%203-3%201-2%203%201%203%203-1%204-2%206-5l7-8c1%200%205%203%209%208l8%206-1-2v-1l-1-3h-2l-7-5-4-6%202%202%203%201-1-2c-3-3%202-6%2015-10l6-2-2-3-3-4%201%202m100%2029l-2%203h-2c0%203%209%206%2014%205l4-2c1-5-10-10-14-6m-211%209c-4%203-4%205-1%208%202%202%205%203%207%200%202-2%203-4%201-4v-4c-1-2-5-2-7%200m98%2017v3l1%201v1h1c1-1%201-1%201%201l-1%203-1%201-2%201c-3%202-3%200%200-2v-2h-1v-1l-1%202-1%201s-2%200-3%202h-1c1-2-1-3-1%200l-2%201c-1-1%201-4%203-4l2-1%201-3-1-1v-1h-2c0-1-2%200-4%203l-3%205v2l-1%201-1%201-2%206-2%205%202-2c2-4%203-4%204%200%200%202%201%203%202%201h3c1%200%202%200%203-2l1-1h1v2c-1%201-1%202%201%202h1v-2l1-3v-2h2c1-1%202-2%201-3%200-2%202-5%204-5%201%200%200-4-2-6v-3c2-3-1-4-3-1m-145%2022c-3%202-3%202%202%204l4%203-6-2-6-2-1-2c0-2-11-1-17%202-4%202-4%202-1%201%209-2%2015-1%2015%202l1%203v-3c0-2%202-3%202-1l7%204c9%205%2020%2015%2019%2019v22l1-12c0-14%202-14%207-1l4%209c-1-11-11-28-19-34-6-4-7-7-2-3%203%202%206%203%205%201l1-2c2%200-2-4-7-6l-6-3-3%201m-6%2011v2l-1%206v2l1-2v2l-1%203v4c0%202-1%201-1-2l-2-6-1%208-1%2012%201-2v2c0%202%200%202%201%201v6l-1%205%201-2v3c0%203%200%203%201%201v2c0%203%200%204%201%203v1l1%206c1%201%201%201%201-2l-1-4%202%205c3%204%203%204%202%201l1-7c0-2%201-3%201-1h1c1-1%201-1%201%201v3l2%202%201%202%201%202c0%202-2%203-2%201v3c0%203%200%203-1%201l-1-6v-1l-1%203v-3c0-5-2-5-2%200l1%205%201-1a158%20158%200%200013%2039l2%205c1%203%201%203%203%201%202-1%202-2%201-4v-3c1%201%201%201%201-1h2v-11c1-3%201-3%201%205l2%204c2%202%202%202%202%200l-1-2-1-3%202%201c1%202%201%202%202%201v5l-1%202%201-2c3-3%205-13%205-16v-4c2-1%202-2%201-3v-7c0-4%200-5-1-4l-1%208c0%205%200%206-2%204v2c1%202%200%204-1%207l-1%203-1-4%201-2v-3l1-6v-3c-1-1-1-1-1%201h-1l-1-2-1-2c0-2%200-2%201%200h2l-1-2v-7c0-6%200-7-1-6l-1-2c2-7%202-10%201-8-1%201-1%201-1-2v-2l-1%205v10l-1-4v-6l-1-3-1%204v5l-1-4c0-2-1-3-1-1l-1%204c0%202%200%202%201%201l1%201-1%204-3-11v-6l-2%205-1%206%201-5c0-3%200-5-1-4l-1-1c0-1%201-2%202-1l1-3c0-2%200-2-1-1-1%203-2-4-1-8l-1-6-2-6c0-4-1-6-2-3v1l1%205v4c1-2%201-2%201%202%200%203%200%203-1%202-1-2-1-2-1%200l-1-7c-1-10-3-16-4-11-1%202-1%202-1%200%200-4-2-4-3%200%200%205-1%206-1%203l-1-6v11l-1-7-2-7-1%202m127%2039l-9%204a315%20315%200%2000-35%2013%20338%20338%200%2000-20%208c-4%201-7%204-6%205a155%20155%200%200041%204l5-1%203-1%203-2c1-1%201-1%201%201v2l2-2c3-2%204-5%202-3l-1-1c0-1-1-1-1%201-3%203-2%200%200-5%203-5%203-13%200-12l-1-2c0-1%201-2%203-2l3-1%203%201%202-1%204-2c3%200%207-4%206-5-2-1-2-1-5%201m-71%2038l-2%2016-2%2011%204%206%204%205c1-1%203%201%202%202%200%202%203%205%204%204-1%201%202%205%203%205l1-1%204-5%202-2h-2c-2%200-2%200-1-1v-3c-2%200-2-1-1-2%202-2%202-15%200-14-1%202-2%200-1-5%200-5%200-5-3-9l-3-6-2-1-2-2-1-1h-2c-2-2-2-1-2%203m-47%2013l-1%203h-2l-1%203h1l1%204v4h1l2-1%201-3-1%202%201%203h2l1%201%201%201v1h2v-2c-2-1-2-2-1-3l1%201%202%203-1-5c-1-4-2-4-2-2-1%203-3%201-2-3%200-2%200-2-1%200-1%201-1%201-1-1s0-2-1%200c-1%201-1%200-1-4%201-6%200-6-1-2m-83%2073c0%203%200%203-2%202-2-2-6%200-6%205s1%206%206%206h4v-8l-1-8-1%203m107%2024c0%203%200%203-2%202-2-2-6%200-6%205s1%206%206%206h4v-8l-1-8-1%203m83%2055l1%201-1%201c-1%201-3%202-3%204v1c1-1%202%200%204%202l7%204%205%203%203-3%204-3-2-2-4-2h-3l-1-1c1-1%200-2-4-4-5-2-6-2-6-1'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEZklEQVQ4y3VUWUxbRxQ1CEMklpIKsQgoIpRNYCBgA2JpBY1U+gnGbgJIlFLshlaQEEJapDZhNVVoRZevEjAxJYlqSqBSMMsXH4TVAQlCKKExlMWAzWb2FHM6M9ggVOVao3nPd+55Z+45M5yjoyMcAWDzyTh+N8e/h4fY2dmFXq/Hik4HI8lNvphEX28fe378uA0rKzo0yO+DYzQDmn40jCawQwK0trYGnV6H5eVlbGxsYGZmBtpFLZaWlqDRzKC3txf9ff1QtaswODB0DAgzQ5wy2z84wCuNhgEevH6NQ6MRO7u7rHh2dhZarRaLi4uYnPwLQ0PDUDQoWN1ZQNMzZUK/bDBsnbA1GAzQvNKQ4iFMTExgb28P+/v7GB8fR3lZOebm5jA1NXUW0EhY0OhQdUAqkWBzcxNjY2PY2t5mucGBQfT395Piedy5fQfZ2dnIvZoLYYoQKlLT97TPDHjKjoJUVlaiu7ubva+vrzNR6BYHBgYw8XwC9fVyJCQk4qtbX0Ms/hjx8e+hoeE+5ucXTKJQdibArq4uFBbehFwuJ1t7QXp3RMQxQq1+RnLdmJ7+Gx0dnYiLi0dmZiZSU1OR85mEKN0KmazqGNAMRpWUVVahrk6OtrY/UVZSiueE0caGgeRW8ODBQ9STnEqlQnp6BgNL+jAJkhwpamvvQSr93ARo6p1arUbel3mMvkrViW+/uY0bNwrxu7IZpSVluJZ/nW0xKioavn5+CAwMRHJyMtLT0lFRUYmRkdGzgFSAvLxrqP31Hjo7u1BdXY20K2m4W3UXLc0taPqtCfkkHx0dDe8LF+Dt7c0ApRIpnhJBtra2TntIY5f4jG75h+9r0NbaxgAKrhfgyZN2YuhZNCv/QG7uFxBERkIoFCI0NBReXl4IDw9HQUEBenp6TgEPT1iOo6rqOwZYV1ePRkUjlMoWFBFFsz7JQlbWp0hMTERERAQCAgLg7+9PWOdjdXXt2NgUyGga9KjRGB0dZQ0WicV49PAR2onHamp+ZL6LiYlBUFAQIgnLd319IRBEkjPcwOq2iV85eEPIZDJWVFxcjJvERjk5EsKKj3PnbODm5oZLlz5g/yuVSuK/eXYM1cPD4IiI9GKxiA1RqhAiUSquXL6Mj5KSwOMF4x1PD/CCg+Hu7g4bG2twrazA5VqxXAoRJCMjnfQzBYkJCYiOigKHBOuDj48Pa7CrqytTz8ODAPF4rPF09iXbo33jcrm06M2DLoiNjSXOj2MFwYSNH/FYWFgYLl4MY9sOCQkBn89nMwWm/qMfsba2PgGysLBgg2Nv7wAXFxfGiG7L1dUNTk5OcHZ2hqOjI2P8FpnPn38bnp6ebA3N0Wd7BwfY2dnB1tYWlpaWsCLt4Kzo9OSyXCZN1UK/ukoaq0ZFeQWKim6hsbGJqH0VJaXl7AguLCzi5ctptBJL0cuVvs/+M8cOg4AfCb5A8H+Vh4lSCoWCKUZv4Z9/+oXdOGY7DQ0Onlk/8mwE75PbJp5cFtRG/wGBYGS4hAlHKQAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/3ddd4/tsCover.png","srcSet":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/078a8/tsCover.png 163w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/e56da/tsCover.png 327w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/3ddd4/tsCover.png 653w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/c5cc7/tsCover.png 980w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/6050d/tsCover.png 1200w","srcWebp":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/0acdf/tsCover.webp","srcSetWebp":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/ac59e/tsCover.webp 163w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/7660b/tsCover.webp 327w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/0acdf/tsCover.webp 653w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/75470/tsCover.webp 980w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/9000d/tsCover.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M311%206l-2%206-1%202-1%201v1l-1%201v3c0%203%200%203-2%202l-9-3%201-1c0-3%202-7%203-6s1%201%201-1V9l-1-2-3%206c-2%205-4%207-4%206%200-2%200-2-1-1h-12c-7-2-11-2-11-1a172%20172%200%200134%207c9%202%2010%203%2016%209%206%205%207%206%206%207-1%202-2%202-3%200-3-2-2%200%200%203l2%201c0-2%200-2%202-1%202%203%201%203-8%202-8-2-19-3-18-1l7%201c18%201%2028%205%2026%2010l1%201%202%201-1%201h-1v1c3%200%204%201%206%207l2%205h-5c-6-1-7%201-5%209%201%208%201%209-2%207l-6-2-4-1c-3-3-20-4-18-2v1c-1-1-2%200-3%201h-2v-1c1-1%200-1-2-1l-3%201-1%201h-1l1%202c2%201-1%206-3%206l-2-1-1-1-3-3-3-2v3l1%202c1%201%201%201-1%203l-5%203c-1%200-7%206-7%208l2%201%201-3h2l2-1h1v1c-2%202-1%205%201%203h1l1%202c1-1%201%200%200%200%200%202%200%202%201%201l2%201c1%201%200%201-1%201v6l-1%2010-1%206-1%202c1%201%201%201%202-1l2%205%204%2011%202%204-4%203c-4%204-8%205-6%203l-1-1c-1%201-3%200-4-1l-2-2-4-1-5-1-1-1c1-1-2-2-5-2l-4-3-5-2-10-3c-6-3-8-4-8-6-1-9%2013-41%2017-41l1%201%201%201%201-1h2c2%202%203%202%203%201l1-2%201%201c-1%201%200%201%201%201s2%200%201-1c-1%200-1-1%201-2l2-2h-12c-2%201-7%200-7-1h-2c-2%202-2%202%200%202l-2%204c-6%207-12%2024-13%2034v8l3%202%203%202h1c3-1%203%202%200%207-2%204-3%205-6%206-4%201-4%201-2%202h-2c-3%200-3%200-2%201s1%201-1%201h-2l-9%204c-12%204-13%205-12%203l-1-1-3%201%202%201c1%201%201%201-1%201-2-1-3%200-3%201l-3%201-8%202-6%201-1-2c-1-2%202-4%208-6%204%200%206-2%203-2l-1-2c0-2-4-3-5-1l-3%201c-2%200-3%201-1%203v2c-2%201-2%200-3-2-3-9-5-12-11-18l-5-8v-1h-2v-3h-2l-4-2-3-5v-3l-2-2-1%202c-2%202-2%202-3%200-1-3-13-8-19-9-5-1-5-1-2-1%209-3%2021-8%2023-11%204-4%204-6%201-3-2%201-3%202-4%201h-1l1%201c2%201-1%203-6%205l-5%201v-3l3-1h1l-2-1h-3l2-1v-2c-2-2-2-2%201-2l7-3%204-1c-1%202%200%202%201%202%202%200%202-1%202-3v-4c3-4%201-14-2-13h-3l-7%201c-7%203-7%202%200-5a192%20192%200%2001106-54l-8%201a190%20190%200%2000-113%2067h-1l-2-1c-2%200%204%207%208%2010%203%202%202%203-1%202-2%200-3-1-3-2l-2%202c-7%2011-10%2018-7%2024%201%203%201%203-2%202h-4c-2%201-2%201-2-1s0-3-1-2v2l-3%2010c-2%201%201%203%203%202l-3%204c-5%205-7%208-7%2010l-1%202c-1%201-5%2013-6%2020%200%207-1%208-3%204-1-4-1-9%201-16v-7l-3%205c-2%202-2%201%200%2022%203%2020%2013%2046%2016%2042h1c-1%201%200%204%201%205%202%204%207%209%207%207h2l1%202h-3c0%201%207%208%2013%2011l6%206%2014%2024c2%203%202%203%200%206l-1%204H0v75h93v9l-3%2011-1%202%202-1%201%203%201%205v-6c0-3%200-5%202-6%203-2%203-1%202%205%200%204-1%205-2%206l-2%202c0%202%200%202-1%201-1-2-1-2-1%201l-1%205c0%202%201%202%2010%202l11-1h2l1-1-2-1h-1l-4-1c-4%201-5%200-6-1h-4l-1-2-1%202-1%202c-1%200-1-2%201-6h15l-2-1-6-1-4-1h8l-4-1-2-1%202-1h8l5%202%202%201%204%202c0%202%205%200%208-3l4-3%201-3c-1-1%200-1%202-1s2%200%201-1-1-1%201-1l5-2%206-4c3-2%204-3%203-4h3c1-1%200-2-2-4l-3-3h8c6%200%207%200%205%201s-2%201-1%202l3-1h1l1%201c1-1%201%200%201%201l-1%204v-2c0-2%200-2-4%202l-5%205-4%205c-3%202-4%204-3%205l-1%201-1%202c-1%202-1%202-2%201s-1-1-1%201l-1%202-2%201-3%201-3%206%205%201%204-1v-1c2%201%2010-4%209-5l1-1h4c2-1%203-1%203%201h1c1-1%201-1%201%201-1%202-1%203%201%203l1-1h1c1%202%201%202%202-1%201-2%201-2%201%200%200%203%201%202%202-1l2-6c1-3%201-3%201-1l-1%205c-1%201-1%202%201%202%201%200%202-1%201-2h1c1%201%201%201%201-1l2-3%201-3%201-4c1-2%201-2%201%200s0%202%201%201l1-2v-2l1-1h1l4-1%204-2h1l3-1c3-2%204-3%204-6-1-3-1-3%201-1%201%201%201%201%200%200%200-2%200-2%201-1h1v-2h1c1-1%201%200%201%202v3l1-4c1-3%201-3%203-2h1l27-1c20%200%2026%200%2025%201h1l4-1v2c-3%201-6%204-5%205l-1%201v1h-1c-1-1-1-1-3%202s-2%204-1%205c3%201%209-1%207-2v-1h2l4-5c5-5%205-6%201-7a572%20572%200%200173-1c2%201-5%2017-7%2018v1l-2%203v-1l2-7c3-6%202-6-2%200-3%204-3%206-3%208v5c-2%201-2%205-1%205l1%201h-1l-2%201%201%201c1-1%201%200%201%201%200%202%200%202-1%201h-1c0%202%202%202%2021%202%2025%200%2022%201%2023-8%201-3%201-2%201%202v6h23V285c-1%201-3%200-5-1-3-2-2-2%203%200%201%200%202%200%202-3%200-2-1-3-2-3-4%200-9-2-8-3l-3-4c-2-2-2-2-1-3l1-2-2%201c-2%202-2%203-1%203%202%202%202%204%201%204l-4-3c-1-2-1-1-1%203l2%205h3v-1l1%202%204%203%206%203h-17c-15%200-17%200-17-2l1-1%202-3c0-1%200-2%201-1h1l1-4-3%203-4%205c0%203%201%203-40%203h-40l18-6a379%20379%200%200140-14c0-1%201-2%203-2%203-1%205-4%207-14%204-25%204-25%2017-32%2014-7%2020-12%2021-15%202-5%201-5-5-5-7%201-6%200%202-1%205-1%205-1%202-1-6%200-16%203-11%203%202%200%202%200-3%202l-8%201c-2-1-8%201-8%202l-1%201-2-1%202-2%201-3%204-7%202-4c3-6%207-9%2014-13l11-6%208-6%205-3v-50l-3%209-3%208-1%202v4l-1%201v1c1%202-2%2010-3%209v2c0%201%200%202-1%201s-3%206-3%2010c1%202%200%202-1%202l-1%203c0%202-1%203-2%202l-1%201c0%203%200%205-1%204l-1%201-1%203v-2l1-3%201-4c0-2%200-3-1-2v-3c1-1%201-1%201%201l1-3v-7c-1-2-1-2-1%201%200%202%200%203-1%202l-2-2c-1%201-1%200-1-5l1-8v-6l-1-6-1-8a118%20118%200%2000-9-35l-1-1h-1l-2-4-4-3a148%20148%200%200114-22l5-8c15-23%2024-38%2024-42%200-3-2-4-4-2h-7l-1%201-1%201c-1-1-1%200-1%202l-1%201-1%202c0%201%200%202-1%201l-2%201%201%201c2-1%201%201%200%202h-2v1c0%201%200%202-1%201l-2%201%201%201h1l-1%202-1-1h-1l-1%201%201%201h1l-1%202-1-1h-1l-1%201%201%201c2-2%201%201-1%203l-2%201-2%201%201%201c2-2%201%201-3%206l-4%204-2%201%201%201c3-2%201%201-14%2023l-11%2016%203-6c2-2%203-5%202-5l-2-4c-2-7-8-17-9-17l-3-5c-1-3-3-6-7-9-6-6-6-6-2-5l3%202%201%201h1l1%201a101%20101%200%200133%2013v-2l-7-3-6-4%207-13c11-23%2011-24%203-24-3%200-4%201-5%203l-2%201c0-2%200-2-1-1v3l1-1-13%2028-11-4-14-4c-4-1-4%200%201-12%204-12%205-13%203-13l-3%206m-60%2034v2l-2%201c-2%200-6%204-6%206%200%203%201%205%202%205l1-1c-1-2%200-1%202%201s5-1%204-5c0-2%202-4%204-2v1l-2-1%201%204%202%204%202-2%202-2c1%201%201%200%201-1%200-3-1-4-5-6-3-1-5-3-5-4h-1m31%2013c1%204%201%205-2%205l-11%205-8%204-4-3c-2-3-5-4-5-2l3%202%202%203-4%204-6%208c0%202-2%203-2%203-3%201-2%203%201%203%203-1%204-2%206-5l7-8c1%200%205%203%209%208l8%206-1-2v-1l-1-3h-2l-7-5-4-6%202%202%203%201-1-2c-3-3%202-6%2015-10l6-2-2-3-3-4%201%202m100%2029l-2%203h-2c0%203%209%206%2014%205l4-2c1-5-10-10-14-6m-211%209c-4%203-4%205-1%208%202%202%205%203%207%200%202-2%203-4%201-4v-4c-1-2-5-2-7%200m98%2017v3l1%201v1h1c1-1%201-1%201%201l-1%203-1%201-2%201c-3%202-3%200%200-2v-2h-1v-1l-1%202-1%201s-2%200-3%202h-1c1-2-1-3-1%200l-2%201c-1-1%201-4%203-4l2-1%201-3-1-1v-1h-2c0-1-2%200-4%203l-3%205v2l-1%201-1%201-2%206-2%205%202-2c2-4%203-4%204%200%200%202%201%203%202%201h3c1%200%202%200%203-2l1-1h1v2c-1%201-1%202%201%202h1v-2l1-3v-2h2c1-1%202-2%201-3%200-2%202-5%204-5%201%200%200-4-2-6v-3c2-3-1-4-3-1m-145%2022c-3%202-3%202%202%204l4%203-6-2-6-2-1-2c0-2-11-1-17%202-4%202-4%202-1%201%209-2%2015-1%2015%202l1%203v-3c0-2%202-3%202-1l7%204c9%205%2020%2015%2019%2019v22l1-12c0-14%202-14%207-1l4%209c-1-11-11-28-19-34-6-4-7-7-2-3%203%202%206%203%205%201l1-2c2%200-2-4-7-6l-6-3-3%201m-6%2011v2l-1%206v2l1-2v2l-1%203v4c0%202-1%201-1-2l-2-6-1%208-1%2012%201-2v2c0%202%200%202%201%201v6l-1%205%201-2v3c0%203%200%203%201%201v2c0%203%200%204%201%203v1l1%206c1%201%201%201%201-2l-1-4%202%205c3%204%203%204%202%201l1-7c0-2%201-3%201-1h1c1-1%201-1%201%201v3l2%202%201%202%201%202c0%202-2%203-2%201v3c0%203%200%203-1%201l-1-6v-1l-1%203v-3c0-5-2-5-2%200l1%205%201-1a158%20158%200%200013%2039l2%205c1%203%201%203%203%201%202-1%202-2%201-4v-3c1%201%201%201%201-1h2v-11c1-3%201-3%201%205l2%204c2%202%202%202%202%200l-1-2-1-3%202%201c1%202%201%202%202%201v5l-1%202%201-2c3-3%205-13%205-16v-4c2-1%202-2%201-3v-7c0-4%200-5-1-4l-1%208c0%205%200%206-2%204v2c1%202%200%204-1%207l-1%203-1-4%201-2v-3l1-6v-3c-1-1-1-1-1%201h-1l-1-2-1-2c0-2%200-2%201%200h2l-1-2v-7c0-6%200-7-1-6l-1-2c2-7%202-10%201-8-1%201-1%201-1-2v-2l-1%205v10l-1-4v-6l-1-3-1%204v5l-1-4c0-2-1-3-1-1l-1%204c0%202%200%202%201%201l1%201-1%204-3-11v-6l-2%205-1%206%201-5c0-3%200-5-1-4l-1-1c0-1%201-2%202-1l1-3c0-2%200-2-1-1-1%203-2-4-1-8l-1-6-2-6c0-4-1-6-2-3v1l1%205v4c1-2%201-2%201%202%200%203%200%203-1%202-1-2-1-2-1%200l-1-7c-1-10-3-16-4-11-1%202-1%202-1%200%200-4-2-4-3%200%200%205-1%206-1%203l-1-6v11l-1-7-2-7-1%202m127%2039l-9%204a315%20315%200%2000-35%2013%20338%20338%200%2000-20%208c-4%201-7%204-6%205a155%20155%200%200041%204l5-1%203-1%203-2c1-1%201-1%201%201v2l2-2c3-2%204-5%202-3l-1-1c0-1-1-1-1%201-3%203-2%200%200-5%203-5%203-13%200-12l-1-2c0-1%201-2%203-2l3-1%203%201%202-1%204-2c3%200%207-4%206-5-2-1-2-1-5%201m-71%2038l-2%2016-2%2011%204%206%204%205c1-1%203%201%202%202%200%202%203%205%204%204-1%201%202%205%203%205l1-1%204-5%202-2h-2c-2%200-2%200-1-1v-3c-2%200-2-1-1-2%202-2%202-15%200-14-1%202-2%200-1-5%200-5%200-5-3-9l-3-6-2-1-2-2-1-1h-2c-2-2-2-1-2%203m-47%2013l-1%203h-2l-1%203h1l1%204v4h1l2-1%201-3-1%202%201%203h2l1%201%201%201v1h2v-2c-2-1-2-2-1-3l1%201%202%203-1-5c-1-4-2-4-2-2-1%203-3%201-2-3%200-2%200-2-1%200-1%201-1%201-1-1s0-2-1%200c-1%201-1%200-1-4%201-6%200-6-1-2m-83%2073c0%203%200%203-2%202-2-2-6%200-6%205s1%206%206%206h4v-8l-1-8-1%203m107%2024c0%203%200%203-2%202-2-2-6%200-6%205s1%206%206%206h4v-8l-1-8-1%203m83%2055l1%201-1%201c-1%201-3%202-3%204v1c1-1%202%200%204%202l7%204%205%203%203-3%204-3-2-2-4-2h-3l-1-1c1-1%200-2-4-4-5-2-6-2-6-1'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEZklEQVQ4y3VUWUxbRxQ1CEMklpIKsQgoIpRNYCBgA2JpBY1U+gnGbgJIlFLshlaQEEJapDZhNVVoRZevEjAxJYlqSqBSMMsXH4TVAQlCKKExlMWAzWb2FHM6M9ggVOVao3nPd+55Z+45M5yjoyMcAWDzyTh+N8e/h4fY2dmFXq/Hik4HI8lNvphEX28fe378uA0rKzo0yO+DYzQDmn40jCawQwK0trYGnV6H5eVlbGxsYGZmBtpFLZaWlqDRzKC3txf9ff1QtaswODB0DAgzQ5wy2z84wCuNhgEevH6NQ6MRO7u7rHh2dhZarRaLi4uYnPwLQ0PDUDQoWN1ZQNMzZUK/bDBsnbA1GAzQvNKQ4iFMTExgb28P+/v7GB8fR3lZOebm5jA1NXUW0EhY0OhQdUAqkWBzcxNjY2PY2t5mucGBQfT395Piedy5fQfZ2dnIvZoLYYoQKlLT97TPDHjKjoJUVlaiu7ubva+vrzNR6BYHBgYw8XwC9fVyJCQk4qtbX0Ms/hjx8e+hoeE+5ucXTKJQdibArq4uFBbehFwuJ1t7QXp3RMQxQq1+RnLdmJ7+Gx0dnYiLi0dmZiZSU1OR85mEKN0KmazqGNAMRpWUVVahrk6OtrY/UVZSiueE0caGgeRW8ODBQ9STnEqlQnp6BgNL+jAJkhwpamvvQSr93ARo6p1arUbel3mMvkrViW+/uY0bNwrxu7IZpSVluJZ/nW0xKioavn5+CAwMRHJyMtLT0lFRUYmRkdGzgFSAvLxrqP31Hjo7u1BdXY20K2m4W3UXLc0taPqtCfkkHx0dDe8LF+Dt7c0ApRIpnhJBtra2TntIY5f4jG75h+9r0NbaxgAKrhfgyZN2YuhZNCv/QG7uFxBERkIoFCI0NBReXl4IDw9HQUEBenp6TgEPT1iOo6rqOwZYV1ePRkUjlMoWFBFFsz7JQlbWp0hMTERERAQCAgLg7+9PWOdjdXXt2NgUyGga9KjRGB0dZQ0WicV49PAR2onHamp+ZL6LiYlBUFAQIgnLd319IRBEkjPcwOq2iV85eEPIZDJWVFxcjJvERjk5EsKKj3PnbODm5oZLlz5g/yuVSuK/eXYM1cPD4IiI9GKxiA1RqhAiUSquXL6Mj5KSwOMF4x1PD/CCg+Hu7g4bG2twrazA5VqxXAoRJCMjnfQzBYkJCYiOigKHBOuDj48Pa7CrqytTz8ODAPF4rPF09iXbo33jcrm06M2DLoiNjSXOj2MFwYSNH/FYWFgYLl4MY9sOCQkBn89nMwWm/qMfsba2PgGysLBgg2Nv7wAXFxfGiG7L1dUNTk5OcHZ2hqOjI2P8FpnPn38bnp6ebA3N0Wd7BwfY2dnB1tYWlpaWsCLt4Kzo9OSyXCZN1UK/ukoaq0ZFeQWKim6hsbGJqH0VJaXl7AguLCzi5ctptBJL0cuVvs/+M8cOg4AfCb5A8H+Vh4lSCoWCKUZv4Z9/+oXdOGY7DQ0Onlk/8mwE75PbJp5cFtRG/wGBYGS4hAlHKQAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/502b1/tsCover.png","srcSet":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/f2e6d/tsCover.png 114w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/4ddba/tsCover.png 229w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/502b1/tsCover.png 457w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/7ddc2/tsCover.png 686w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/435bf/tsCover.png 914w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/6050d/tsCover.png 1200w","srcWebp":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/15384/tsCover.webp","srcSetWebp":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/31fce/tsCover.webp 114w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/e3e25/tsCover.webp 229w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/15384/tsCover.webp 457w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/0258d/tsCover.webp 686w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/64ea2/tsCover.webp 914w,\n/static/7cf73ed072b7ab211d6b4d4ebeabd422/9000d/tsCover.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M311%206l-2%206-1%202-1%201v1l-1%201v3c0%203%200%203-2%202l-9-3%201-1c0-3%202-7%203-6s1%201%201-1V9l-1-2-3%206c-2%205-4%207-4%206%200-2%200-2-1-1h-12c-7-2-11-2-11-1a172%20172%200%200134%207c9%202%2010%203%2016%209%206%205%207%206%206%207-1%202-2%202-3%200-3-2-2%200%200%203l2%201c0-2%200-2%202-1%202%203%201%203-8%202-8-2-19-3-18-1l7%201c18%201%2028%205%2026%2010l1%201%202%201-1%201h-1v1c3%200%204%201%206%207l2%205h-5c-6-1-7%201-5%209%201%208%201%209-2%207l-6-2-4-1c-3-3-20-4-18-2v1c-1-1-2%200-3%201h-2v-1c1-1%200-1-2-1l-3%201-1%201h-1l1%202c2%201-1%206-3%206l-2-1-1-1-3-3-3-2v3l1%202c1%201%201%201-1%203l-5%203c-1%200-7%206-7%208l2%201%201-3h2l2-1h1v1c-2%202-1%205%201%203h1l1%202c1-1%201%200%200%200%200%202%200%202%201%201l2%201c1%201%200%201-1%201v6l-1%2010-1%206-1%202c1%201%201%201%202-1l2%205%204%2011%202%204-4%203c-4%204-8%205-6%203l-1-1c-1%201-3%200-4-1l-2-2-4-1-5-1-1-1c1-1-2-2-5-2l-4-3-5-2-10-3c-6-3-8-4-8-6-1-9%2013-41%2017-41l1%201%201%201%201-1h2c2%202%203%202%203%201l1-2%201%201c-1%201%200%201%201%201s2%200%201-1c-1%200-1-1%201-2l2-2h-12c-2%201-7%200-7-1h-2c-2%202-2%202%200%202l-2%204c-6%207-12%2024-13%2034v8l3%202%203%202h1c3-1%203%202%200%207-2%204-3%205-6%206-4%201-4%201-2%202h-2c-3%200-3%200-2%201s1%201-1%201h-2l-9%204c-12%204-13%205-12%203l-1-1-3%201%202%201c1%201%201%201-1%201-2-1-3%200-3%201l-3%201-8%202-6%201-1-2c-1-2%202-4%208-6%204%200%206-2%203-2l-1-2c0-2-4-3-5-1l-3%201c-2%200-3%201-1%203v2c-2%201-2%200-3-2-3-9-5-12-11-18l-5-8v-1h-2v-3h-2l-4-2-3-5v-3l-2-2-1%202c-2%202-2%202-3%200-1-3-13-8-19-9-5-1-5-1-2-1%209-3%2021-8%2023-11%204-4%204-6%201-3-2%201-3%202-4%201h-1l1%201c2%201-1%203-6%205l-5%201v-3l3-1h1l-2-1h-3l2-1v-2c-2-2-2-2%201-2l7-3%204-1c-1%202%200%202%201%202%202%200%202-1%202-3v-4c3-4%201-14-2-13h-3l-7%201c-7%203-7%202%200-5a192%20192%200%2001106-54l-8%201a190%20190%200%2000-113%2067h-1l-2-1c-2%200%204%207%208%2010%203%202%202%203-1%202-2%200-3-1-3-2l-2%202c-7%2011-10%2018-7%2024%201%203%201%203-2%202h-4c-2%201-2%201-2-1s0-3-1-2v2l-3%2010c-2%201%201%203%203%202l-3%204c-5%205-7%208-7%2010l-1%202c-1%201-5%2013-6%2020%200%207-1%208-3%204-1-4-1-9%201-16v-7l-3%205c-2%202-2%201%200%2022%203%2020%2013%2046%2016%2042h1c-1%201%200%204%201%205%202%204%207%209%207%207h2l1%202h-3c0%201%207%208%2013%2011l6%206%2014%2024c2%203%202%203%200%206l-1%204H0v75h93v9l-3%2011-1%202%202-1%201%203%201%205v-6c0-3%200-5%202-6%203-2%203-1%202%205%200%204-1%205-2%206l-2%202c0%202%200%202-1%201-1-2-1-2-1%201l-1%205c0%202%201%202%2010%202l11-1h2l1-1-2-1h-1l-4-1c-4%201-5%200-6-1h-4l-1-2-1%202-1%202c-1%200-1-2%201-6h15l-2-1-6-1-4-1h8l-4-1-2-1%202-1h8l5%202%202%201%204%202c0%202%205%200%208-3l4-3%201-3c-1-1%200-1%202-1s2%200%201-1-1-1%201-1l5-2%206-4c3-2%204-3%203-4h3c1-1%200-2-2-4l-3-3h8c6%200%207%200%205%201s-2%201-1%202l3-1h1l1%201c1-1%201%200%201%201l-1%204v-2c0-2%200-2-4%202l-5%205-4%205c-3%202-4%204-3%205l-1%201-1%202c-1%202-1%202-2%201s-1-1-1%201l-1%202-2%201-3%201-3%206%205%201%204-1v-1c2%201%2010-4%209-5l1-1h4c2-1%203-1%203%201h1c1-1%201-1%201%201-1%202-1%203%201%203l1-1h1c1%202%201%202%202-1%201-2%201-2%201%200%200%203%201%202%202-1l2-6c1-3%201-3%201-1l-1%205c-1%201-1%202%201%202%201%200%202-1%201-2h1c1%201%201%201%201-1l2-3%201-3%201-4c1-2%201-2%201%200s0%202%201%201l1-2v-2l1-1h1l4-1%204-2h1l3-1c3-2%204-3%204-6-1-3-1-3%201-1%201%201%201%201%200%200%200-2%200-2%201-1h1v-2h1c1-1%201%200%201%202v3l1-4c1-3%201-3%203-2h1l27-1c20%200%2026%200%2025%201h1l4-1v2c-3%201-6%204-5%205l-1%201v1h-1c-1-1-1-1-3%202s-2%204-1%205c3%201%209-1%207-2v-1h2l4-5c5-5%205-6%201-7a572%20572%200%200173-1c2%201-5%2017-7%2018v1l-2%203v-1l2-7c3-6%202-6-2%200-3%204-3%206-3%208v5c-2%201-2%205-1%205l1%201h-1l-2%201%201%201c1-1%201%200%201%201%200%202%200%202-1%201h-1c0%202%202%202%2021%202%2025%200%2022%201%2023-8%201-3%201-2%201%202v6h23V285c-1%201-3%200-5-1-3-2-2-2%203%200%201%200%202%200%202-3%200-2-1-3-2-3-4%200-9-2-8-3l-3-4c-2-2-2-2-1-3l1-2-2%201c-2%202-2%203-1%203%202%202%202%204%201%204l-4-3c-1-2-1-1-1%203l2%205h3v-1l1%202%204%203%206%203h-17c-15%200-17%200-17-2l1-1%202-3c0-1%200-2%201-1h1l1-4-3%203-4%205c0%203%201%203-40%203h-40l18-6a379%20379%200%200140-14c0-1%201-2%203-2%203-1%205-4%207-14%204-25%204-25%2017-32%2014-7%2020-12%2021-15%202-5%201-5-5-5-7%201-6%200%202-1%205-1%205-1%202-1-6%200-16%203-11%203%202%200%202%200-3%202l-8%201c-2-1-8%201-8%202l-1%201-2-1%202-2%201-3%204-7%202-4c3-6%207-9%2014-13l11-6%208-6%205-3v-50l-3%209-3%208-1%202v4l-1%201v1c1%202-2%2010-3%209v2c0%201%200%202-1%201s-3%206-3%2010c1%202%200%202-1%202l-1%203c0%202-1%203-2%202l-1%201c0%203%200%205-1%204l-1%201-1%203v-2l1-3%201-4c0-2%200-3-1-2v-3c1-1%201-1%201%201l1-3v-7c-1-2-1-2-1%201%200%202%200%203-1%202l-2-2c-1%201-1%200-1-5l1-8v-6l-1-6-1-8a118%20118%200%2000-9-35l-1-1h-1l-2-4-4-3a148%20148%200%200114-22l5-8c15-23%2024-38%2024-42%200-3-2-4-4-2h-7l-1%201-1%201c-1-1-1%200-1%202l-1%201-1%202c0%201%200%202-1%201l-2%201%201%201c2-1%201%201%200%202h-2v1c0%201%200%202-1%201l-2%201%201%201h1l-1%202-1-1h-1l-1%201%201%201h1l-1%202-1-1h-1l-1%201%201%201c2-2%201%201-1%203l-2%201-2%201%201%201c2-2%201%201-3%206l-4%204-2%201%201%201c3-2%201%201-14%2023l-11%2016%203-6c2-2%203-5%202-5l-2-4c-2-7-8-17-9-17l-3-5c-1-3-3-6-7-9-6-6-6-6-2-5l3%202%201%201h1l1%201a101%20101%200%200133%2013v-2l-7-3-6-4%207-13c11-23%2011-24%203-24-3%200-4%201-5%203l-2%201c0-2%200-2-1-1v3l1-1-13%2028-11-4-14-4c-4-1-4%200%201-12%204-12%205-13%203-13l-3%206m-60%2034v2l-2%201c-2%200-6%204-6%206%200%203%201%205%202%205l1-1c-1-2%200-1%202%201s5-1%204-5c0-2%202-4%204-2v1l-2-1%201%204%202%204%202-2%202-2c1%201%201%200%201-1%200-3-1-4-5-6-3-1-5-3-5-4h-1m31%2013c1%204%201%205-2%205l-11%205-8%204-4-3c-2-3-5-4-5-2l3%202%202%203-4%204-6%208c0%202-2%203-2%203-3%201-2%203%201%203%203-1%204-2%206-5l7-8c1%200%205%203%209%208l8%206-1-2v-1l-1-3h-2l-7-5-4-6%202%202%203%201-1-2c-3-3%202-6%2015-10l6-2-2-3-3-4%201%202m100%2029l-2%203h-2c0%203%209%206%2014%205l4-2c1-5-10-10-14-6m-211%209c-4%203-4%205-1%208%202%202%205%203%207%200%202-2%203-4%201-4v-4c-1-2-5-2-7%200m98%2017v3l1%201v1h1c1-1%201-1%201%201l-1%203-1%201-2%201c-3%202-3%200%200-2v-2h-1v-1l-1%202-1%201s-2%200-3%202h-1c1-2-1-3-1%200l-2%201c-1-1%201-4%203-4l2-1%201-3-1-1v-1h-2c0-1-2%200-4%203l-3%205v2l-1%201-1%201-2%206-2%205%202-2c2-4%203-4%204%200%200%202%201%203%202%201h3c1%200%202%200%203-2l1-1h1v2c-1%201-1%202%201%202h1v-2l1-3v-2h2c1-1%202-2%201-3%200-2%202-5%204-5%201%200%200-4-2-6v-3c2-3-1-4-3-1m-145%2022c-3%202-3%202%202%204l4%203-6-2-6-2-1-2c0-2-11-1-17%202-4%202-4%202-1%201%209-2%2015-1%2015%202l1%203v-3c0-2%202-3%202-1l7%204c9%205%2020%2015%2019%2019v22l1-12c0-14%202-14%207-1l4%209c-1-11-11-28-19-34-6-4-7-7-2-3%203%202%206%203%205%201l1-2c2%200-2-4-7-6l-6-3-3%201m-6%2011v2l-1%206v2l1-2v2l-1%203v4c0%202-1%201-1-2l-2-6-1%208-1%2012%201-2v2c0%202%200%202%201%201v6l-1%205%201-2v3c0%203%200%203%201%201v2c0%203%200%204%201%203v1l1%206c1%201%201%201%201-2l-1-4%202%205c3%204%203%204%202%201l1-7c0-2%201-3%201-1h1c1-1%201-1%201%201v3l2%202%201%202%201%202c0%202-2%203-2%201v3c0%203%200%203-1%201l-1-6v-1l-1%203v-3c0-5-2-5-2%200l1%205%201-1a158%20158%200%200013%2039l2%205c1%203%201%203%203%201%202-1%202-2%201-4v-3c1%201%201%201%201-1h2v-11c1-3%201-3%201%205l2%204c2%202%202%202%202%200l-1-2-1-3%202%201c1%202%201%202%202%201v5l-1%202%201-2c3-3%205-13%205-16v-4c2-1%202-2%201-3v-7c0-4%200-5-1-4l-1%208c0%205%200%206-2%204v2c1%202%200%204-1%207l-1%203-1-4%201-2v-3l1-6v-3c-1-1-1-1-1%201h-1l-1-2-1-2c0-2%200-2%201%200h2l-1-2v-7c0-6%200-7-1-6l-1-2c2-7%202-10%201-8-1%201-1%201-1-2v-2l-1%205v10l-1-4v-6l-1-3-1%204v5l-1-4c0-2-1-3-1-1l-1%204c0%202%200%202%201%201l1%201-1%204-3-11v-6l-2%205-1%206%201-5c0-3%200-5-1-4l-1-1c0-1%201-2%202-1l1-3c0-2%200-2-1-1-1%203-2-4-1-8l-1-6-2-6c0-4-1-6-2-3v1l1%205v4c1-2%201-2%201%202%200%203%200%203-1%202-1-2-1-2-1%200l-1-7c-1-10-3-16-4-11-1%202-1%202-1%200%200-4-2-4-3%200%200%205-1%206-1%203l-1-6v11l-1-7-2-7-1%202m127%2039l-9%204a315%20315%200%2000-35%2013%20338%20338%200%2000-20%208c-4%201-7%204-6%205a155%20155%200%200041%204l5-1%203-1%203-2c1-1%201-1%201%201v2l2-2c3-2%204-5%202-3l-1-1c0-1-1-1-1%201-3%203-2%200%200-5%203-5%203-13%200-12l-1-2c0-1%201-2%203-2l3-1%203%201%202-1%204-2c3%200%207-4%206-5-2-1-2-1-5%201m-71%2038l-2%2016-2%2011%204%206%204%205c1-1%203%201%202%202%200%202%203%205%204%204-1%201%202%205%203%205l1-1%204-5%202-2h-2c-2%200-2%200-1-1v-3c-2%200-2-1-1-2%202-2%202-15%200-14-1%202-2%200-1-5%200-5%200-5-3-9l-3-6-2-1-2-2-1-1h-2c-2-2-2-1-2%203m-47%2013l-1%203h-2l-1%203h1l1%204v4h1l2-1%201-3-1%202%201%203h2l1%201%201%201v1h2v-2c-2-1-2-2-1-3l1%201%202%203-1-5c-1-4-2-4-2-2-1%203-3%201-2-3%200-2%200-2-1%200-1%201-1%201-1-1s0-2-1%200c-1%201-1%200-1-4%201-6%200-6-1-2m-83%2073c0%203%200%203-2%202-2-2-6%200-6%205s1%206%206%206h4v-8l-1-8-1%203m107%2024c0%203%200%203-2%202-2-2-6%200-6%205s1%206%206%206h4v-8l-1-8-1%203m83%2055l1%201-1%201c-1%201-3%202-3%204v1c1-1%202%200%204%202l7%204%205%203%203-3%204-3-2-2-4-2h-3l-1-1c1-1%200-2-4-4-5-2-6-2-6-1'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/7cf73ed072b7ab211d6b4d4ebeabd422/6050d/tsCover.png"}}},"authors":[{"authorsPage":true,"bio":"Hello everybody 👋 !  My name is Luke and I am the creator and owner of the spaceout.pl. Personally, I am a big geek with huge love for Star Wars, Marvel and DC comic books, Funk and 80s music. I take most of my design inspiration from offline experiences like going to art museums, galleries and working with other creative people on various projects. I also work with various Activist and NGO groups as a pro-bono designer and developer.\n","id":"f69d27c7-7f9a-5fbd-b05d-1a324fd10c0a","name":"Luke Celitan","featured":true,"social":[{"url":"https://www.facebook.com/spaceout/"},{"url":"https://twitter.com/spaceout.pl"},{"url":"https://www.instagram.com/spaceout.pl/"},{"url":"https://huggingface.co/MassivDash"},{"url":"https://bsky.app/profile/lukecelitan.bsky.social"}],"slug":"/authors/luke-celitan","avatar":{"small":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/afb2b/spaceghost.jpg 13w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/7c20e/spaceghost.jpg 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/03612/spaceghost.jpg 75w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/58718/spaceghost.webp 13w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/74aad/spaceghost.webp 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/ed320/spaceghost.webp 75w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 50px) 100vw, 50px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"medium":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/7c20e/spaceghost.jpg 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/59538/spaceghost.jpg 150w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fd013/spaceghost.jpg 200w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/74aad/spaceghost.webp 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/d9b14/spaceghost.webp 150w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/6b183/spaceghost.webp 200w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 100px) 100vw, 100px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"large":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/a2637/spaceghost.jpg 82w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/15203/spaceghost.jpg 164w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/2d087/spaceghost.webp 82w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/29d87/spaceghost.webp 164w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 305px) 100vw, 305px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"}}}],"basePath":"/","tech":["TS","Nodejs"],"category":"Post","slug":"/advanced-typescript-patterns-and-architectures","id":"ef8cfe57-c190-545c-be72-6a7441988d53","title":"Advanced TypeScript Patterns and Architectures","appDescription":null,"mailchimp":false,"next":[{"id":"bb165c56-4e9e-55de-a594-ca23a30a8a69","slug":"/mastering-agile-estimation","secret":false,"title":"Mastering Agile Estimation","author":"Luke Celitan","date":"March 14th, 2025","dateForSEO":"2025-03-14T00:00:00.000Z","timeToRead":4,"excerpt":"A Deep Dive into Scrum Poker estimation method","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"Mastering Agile Estimation\",\n  \"excerpt\": \"A Deep Dive into Scrum Poker estimation method\",\n  \"date\": \"2025-03-14T00:00:00.000Z\",\n  \"hero\": \"scrumpoker.jpg\",\n  \"author\": \"Luke Celitan\",\n  \"appDescription\": \"Estimation app for agile teams\",\n  \"category\": \"Project\",\n  \"tech\": [\"Rust\", \"Astro\", \"Actix\", \"ReactIcon\", \"TS\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h2\", {\n    \"id\": \"a-deep-dive-into-scrum-poker-estimation-method\"\n  }, \"A Deep Dive into Scrum Poker estimation method\"), mdx(\"h3\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"Hey there, fellow Agile practitioners! I\\u2019m an engineering manager who\\u2019s\\nconstantly juggling the demands of development teams and business stakeholders.\\nOne of my key responsibilities is providing accurate estimates to the\\n\\u201Cbusiness\\u201D - you know, those folks who always want to know \\u201Chow long will it\\ntake?\\u201D and \\u201Chow much will it cost?\\u201D\"), mdx(\"p\", null, \"Here\\u2019s the thing: I never make these estimates alone. It\\u2019s always a team effort,\\nand for good reason. That\\u2019s where Scrum Poker comes in - it\\u2019s been my go-to\\nmethod for validating how much time and work a project really needs. Let me walk\\nyou through how I use this powerful technique and introduce you to my\\nopen-source app that\\u2019s making the process even smoother.\"), mdx(\"h3\", {\n    \"id\": \"1-understanding-scrum-poker\"\n  }, \"1. Understanding Scrum Poker\"), mdx(\"p\", null, \"Scrum Poker, also known as Planning Poker, is a consensus-based estimation\\ntechnique that I\\u2019ve found invaluable in my role. It\\u2019s not just about throwing\\nnumbers around; it\\u2019s about fostering collaboration, reducing bias, and tackling\\ncomplex tasks with confidence.\"), mdx(\"p\", null, \"Why is it crucial? Simple:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"It enhances sprint planning accuracy\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"It improves team communication\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"It boosts overall project predictability\")), mdx(\"p\", null, \"By tapping into the team\\u2019s collective expertise, we\\u2019re able to overcome\\nindividual biases and get a more holistic view of the work ahead.\"), mdx(\"p\", null, \"For a deeper understanding, check out\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.mountaingoatsoftware.com/agile/planning-poker\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Mike Cohn\\u2019s original concept\"), \" -\\nhe\\u2019s the brains behind this brilliant idea.\"), mdx(\"h3\", {\n    \"id\": \"2-the-benefits-of-scrum-poker\"\n  }, \"2. The Benefits of Scrum Poker\"), mdx(\"p\", null, \"Let me break down why Scrum Poker is my MVP of estimation techniques:\"), mdx(\"h4\", {\n    \"id\": \"promoting-team-collaboration-and-consensus\"\n  }, \"Promoting Team Collaboration and Consensus\"), mdx(\"p\", null, \"It\\u2019s like a team-building exercise disguised as work. Everyone gets a say,\\nfostering a sense of shared ownership and responsibility. This open dialogue\\noften uncovers hidden insights and concerns.\"), mdx(\"h4\", {\n    \"id\": \"reducing-bias-and-improving-accuracy\"\n  }, \"Reducing Bias and Improving Accuracy\"), mdx(\"p\", null, \"By revealing estimates simultaneously, we kick the anchoring bias to the curb.\\nNo more piggybacking on the tech lead\\u2019s estimate - this approach promotes\\nindependent thinking and often leads to more accurate estimations.\"), mdx(\"h4\", {\n    \"id\": \"handling-complex-or-uncertain-tasks\"\n  }, \"Handling Complex or Uncertain Tasks\"), mdx(\"p\", null, \"Got a story that\\u2019s as clear as mud? Perfect. Scrum Poker thrives on uncertainty.\\nThe discussions arising from differing estimates often uncover hidden\\ncomplexities or risks, leading to more realistic planning.\"), mdx(\"p\", null, \"For more on these benefits, check out\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.agilealliance.org/glossary/planning-poker/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Agile Alliance\\u2019s deep dive into Planning Poker\"), \".\"), mdx(\"h3\", {\n    \"id\": \"3-my-approach-to-scrum-poker-sessions\"\n  }, \"3. My Approach to Scrum Poker Sessions\"), mdx(\"p\", null, \"Here\\u2019s how I run my Scrum Poker sessions:\"), mdx(\"h4\", {\n    \"id\": \"preparation-phase\"\n  }, \"Preparation Phase:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"I use a custom deck with values: 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 40, 100.\\nThese represent hours needed to complete a task.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"We align on what each value means in terms of effort and complexity.\")), mdx(\"h4\", {\n    \"id\": \"estimation-process\"\n  }, \"Estimation Process:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"I present a user story to the team.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Team members silently select their estimate.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Everyone reveals their cards simultaneously.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"We discuss estimates, focusing on outliers.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Re-estimate if necessary, aiming for consensus.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Record the final estimate and move to the next item.\")), mdx(\"p\", null, \"This process helps me validate the time and work needed for each client request,\\nensuring I\\u2019m providing accurate estimates to the business.\"), mdx(\"h3\", {\n    \"id\": \"4-best-practices-and-common-pitfalls\"\n  }, \"4. Best Practices and Common Pitfalls\"), mdx(\"h4\", {\n    \"id\": \"effective-facilitation-tips\"\n  }, \"Effective Facilitation Tips:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep discussions time-boxed to maintain momentum.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Encourage participation from all team members, especially the quiet ones.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use a reference story to calibrate the team\\u2019s understanding of story points.\")), mdx(\"h4\", {\n    \"id\": \"handling-outliers-and-disagreements\"\n  }, \"Handling Outliers and Disagreements:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Focus on understanding the reasoning behind divergent estimates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Avoid averaging; instead, work towards a shared understanding.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Consider breaking down stories that consistently lead to wide estimation\\nranges.\")), mdx(\"h4\", {\n    \"id\": \"potential-challenges-and-solutions\"\n  }, \"Potential Challenges and Solutions:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Dominant personalities influencing estimates: Use silent voting and enforce\\nequal speaking time.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Estimation fatigue: Take regular breaks and limit session duration.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Lack of domain knowledge: Involve subject matter experts or defer estimation\\nwhen necessary.\")), mdx(\"h3\", {\n    \"id\": \"5-digital-implementation-my-open-source-scrum-poker-project\"\n  }, \"5. Digital Implementation: My Open-Source Scrum Poker Project\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"3840px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"52.6%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABkUlEQVQoz52SS0vDQBSF+4PFjWhrVVQQ6hMsiBtBXYitgis3bkRxI/4CER9tkmoDNc1kMjNpUtrjvVNbERQfA4cLc+755k4mubXiEZbzh6QKStP7KM1vozS3jcVCGQtTm1jID7RoVR5pqVjG+uweVvJVrBYqWJ85xmqxihx+XH38fnWR08pAxRpSxoiEhAgF2u0QwWuAiPYSajO2FZBKISRPiAgykohjBc4bnSBNMwRBG7k0TdHpdGCMgdaamggcRYgp7D/VcLuzD2djC271BK3nZ2ijocjj/iRhUIosy9Dr9Wzua6AQMN0Md+cXuBqfxMvuAS7HJvB4fYOk27U9fwJKKa0pSYrAMV1XU4g91p8nHAGp8r5KjK3/BrIRiQFQBgGC+wfEYUjf9QPIvd8C2RgC7UQUUBTUnQSR48I/PYN8acKkdPA7iIcY1k/AocEg3vA8D47joE7i6tLLeq0W3EYDrutan9VsNm2G8zwUA0O6xWhClqDXrdVqAxCFR6rX4VFtEHQo3/c/Xbnf79P/28YbfVgwSfQTLK0AAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/f3743b18200fabb5aad38ed8147b5b27/a3bc4/scrumpoker-1.webp 2500w\", \"/static/f3743b18200fabb5aad38ed8147b5b27/e3ad8/scrumpoker-1.webp 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/f3743b18200fabb5aad38ed8147b5b27/412e4/scrumpoker-1.png 2500w\", \"/static/f3743b18200fabb5aad38ed8147b5b27/353b0/scrumpoker-1.png 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/f3743b18200fabb5aad38ed8147b5b27/353b0/scrumpoker-1.png\",\n    \"alt\": \"Scrum Poker app main screen\",\n    \"title\": \"Scrum Poker app main screen\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \"), \"\\n\", mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"3840px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"54.68000000000001%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABrklEQVQoz5WSzSuEcRDHnz/NYffZQg7S1paDtCcHFxdulOLEQSm5KXHgQNIeJCdKuVCUskK7ep5nH8/z/J63fV6/fjP2QSQcvjXTzHxmmhmlWq2iXq+jVquhUqm8S1XVnj7bKsqlEkpfpKpl9PcPoDw4DEXXdXieB8dxWLZtw7IsmKbJovhds4l7qWbznn2KkyifctrtFvSOifOHGEqe50iSBFEUIQxDBEHADVzXZXmekBBNykRHFgnXlzk+53a7Xa7NsgzEAXIoBKIAJfi+zzAhBGzZ3RU2bh4dPOsGnNtp3F1MoKs3ILyMG1HzAhzHMeIkhULG1+mEoMlcaHKqsclDLC4dYHV5HqPjC3i43kcY5RwvYFRPk6bpL8D2cwfqyBamZrYxO7eGvqEN3F41EMXZ/4Bv+xNy4RZ29q5wfHKJ06N17G6uQH86gx8m8P8LpAvSLrM0lIqQxg6Qvsg9U9zjff8JSIkEJNjbGzkwjA5eLGk7PsM8vv4HlBg/Aot3ISBfW/5l8ZOaprEoj2r4sr364n2+AYMgfH9a8skmsGEYaLVaDCzehHyqI1gBfAWArhgpkvPffgAAAABJRU5ErkJggg==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/7b459940b13a67bbd34c5d779d5204c4/a3bc4/scrumpoker-2.webp 2500w\", \"/static/7b459940b13a67bbd34c5d779d5204c4/e3ad8/scrumpoker-2.webp 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/7b459940b13a67bbd34c5d779d5204c4/412e4/scrumpoker-2.png 2500w\", \"/static/7b459940b13a67bbd34c5d779d5204c4/353b0/scrumpoker-2.png 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/7b459940b13a67bbd34c5d779d5204c4/353b0/scrumpoker-2.png\",\n    \"alt\": \"Scrum Poker app room screen\",\n    \"title\": \"Scrum Poker app room screen\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \"), \"\\n\", mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"3840px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"52.6%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABiklEQVQoz32SSU/DMBCF+78REi2QVtANxAHxHzhyQULckRAXkNoeadlKYsd2Vmd5zKRYKhQa6cnbzDdvHLfG41OMRieN+v0hPK+HbreHQxq93hl6R+fY6xzjoNNGp72P9reOvC6GFD8YjNAnjU/O4B16aGHbF98iCS6BegJd/RdkkUQCaW4hI4NWHMeIogjGGCilEEoJIULIYAEz3cXH4w7s4gLP7zVEECAMw0Za6ybP/1xi8faKt8kMs+sbtPI8R5ZlSJIEDGew1jGUnKMQT0AK5PKe3GYoyIEhCIM4Pk3TVTzJCIn5ZLoN+AL7cYVKPiBfXsMSODOqOV8Hcm5OKusais7+AWpqP0Tk3yFe3lD1GTljN3oDyPnWWlRVBUVXsQWoqGJGsoioXaNXsK1AytkAcjADWUYrGlXjls9cjJtzHmsDyJXWgxnGa3bjXPu+34jXZVnCGSmKopkzUNIL+eGQK3EAF+AkBrli7mnxOYv3AnpGDl7TTxFC/A10d8V7rn3n/ne7rmUH/AIoOTbJqMMlAwAAAABJRU5ErkJggg==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/e557c216b492ad51fe373498cab599c2/a3bc4/scrumpoker-3.webp 2500w\", \"/static/e557c216b492ad51fe373498cab599c2/e3ad8/scrumpoker-3.webp 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/e557c216b492ad51fe373498cab599c2/412e4/scrumpoker-3.png 2500w\", \"/static/e557c216b492ad51fe373498cab599c2/353b0/scrumpoker-3.png 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/e557c216b492ad51fe373498cab599c2/353b0/scrumpoker-3.png\",\n    \"alt\": \"Scrum Poker app room screen  card revealed \",\n    \"title\": \"Scrum Poker app room screen  card revealed \",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(\"p\", null, \"To facilitate remote estimations, I\\u2019ve developed an open-source Scrum Poker\\napplication that bridges the gap between traditional methods and modern,\\ndistributed teams.\"), mdx(\"h4\", {\n    \"id\": \"key-features\"\n  }, \"Key Features:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Real-time WebSocket communication for instant updates\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Create custom estimation rooms\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Invite team members via simple links\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Unlimited estimation questions per room\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ad-free and open-source experience\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Cross-device compatibility\")), mdx(\"h4\", {\n    \"id\": \"why-my-app-is-perfect-for-scrum-poker\"\n  }, \"Why My App is Perfect for Scrum Poker:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Remote-Friendly\"), \": Brings distributed teams together in a virtual\\nestimation space.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Real-time Collaboration\"), \": WebSocket technology ensures everyone\\u2019s in sync.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Flexibility\"), \": Create rooms on the fly for impromptu estimation sessions.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Transparency\"), \": Simultaneous result viewing maintains Scrum Poker\\nprinciples.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Ease of Use\"), \": No physical cards needed - just click and estimate.\")), mdx(\"h4\", {\n    \"id\": \"tech-stack\"\n  }, \"Tech Stack:\"), mdx(\"p\", null, \"Built on the AstroX template, my app combines Rust\\u2019s Actix framework with\\nAstro\\u2019s frontend capabilities, delivering a powerhouse of performance and\\nusability.\"), mdx(\"p\", null, \"Check out the demo at\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://scrum-poker.spaceout.pl\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"scrum-poker.spaceout.pl\"), \".\"), mdx(\"p\", null, \"For developers looking to contribute or self-host:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Ensure you have Rust (rustc > 1.74) and Node.js (> 18.14) installed.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Clone the project from my\\n\", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/yourusername/scrum-poker-app\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"GitHub repo\"), \".\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Run \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"cargo run\"), \" and follow the interactive CLI for setup.\")), mdx(\"h3\", {\n    \"id\": \"wrapping-up\"\n  }, \"Wrapping Up\"), mdx(\"p\", null, \"As an engineering manager, I\\u2019ve found Scrum Poker to be an invaluable tool for\\nproviding accurate estimates to the business. Whether used with physical cards\\nor my digital app, it remains a cornerstone of effective Agile estimation. It\\u2019s\\nabout more than just numbers - it\\u2019s about fostering collaboration, leveraging\\ncollective wisdom, and continuously improving our estimation skills.\"), mdx(\"p\", null, \"Remember, the key principles remain constant:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Always estimate as a team, never alone\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Encourage open discussion\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Respect diverse perspectives\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Aim for consensus, not compromise\")), mdx(\"p\", null, \"By combining time-tested Scrum Poker methods with modern technology, we\\u2019re\\nsetting the stage for more accurate, efficient, and enjoyable estimation\\nsessions. Give my app a try, and let\\u2019s make those sprint plannings smoother than\\never!\"), mdx(\"p\", null, \"Happy estimating, folks!\"), mdx(\"hr\", null), mdx(\"p\", null, \"Sources:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.mountaingoatsoftware.com/agile/planning-poker\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Mountain Goat Software - Planning Poker\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.atlassian.com/agile/project-management/estimation\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Atlassian - Agile Estimation\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.scrum.org/resources/blog/what-planning-poker\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Scrum.org - What is Planning Poker?\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.agilealliance.org/glossary/planning-poker/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Agile Alliance - Planning Poker\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://scrum-poker.spaceout.pl\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Scrum Poker App Demo\"))));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["Rust","Astro","Actix","ReactIcon","TS"],"category":"Project","appDescription":"Estimation app for agile teams","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMEAf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHJWdJeIjXMXKD/xAAbEAADAAMBAQAAAAAAAAAAAAAAAQIDERITIv/aAAgBAQABBQKEV9ndI62doetzjn0zSpR//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAESUf/aAAgBAwEBPwGWSymU9P/EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwFcj//EABwQAAICAgMAAAAAAAAAAAAAAAABECERYQIxUf/aAAgBAQAGPwLcYLeNDs7OK9RUf//EAB0QAAIDAAIDAAAAAAAAAAAAAAERACExQVFhcYH/2gAIAQEAAT8hBovyyIVaNMJjFqsgaCgOAjgFDrPMP3OoUU003AxFa2fJ/9oADAMBAAIAAwAAABBv/wCC/8QAFhEBAQEAAAAAAAAAAAAAAAAAAGEB/9oACAEDAQE/EI6jqurn/8QAFxEBAQEBAAAAAAAAAAAAAAAAABEBUf/aAAgBAgEBPxC4hMRx/8QAHhAAAgICAgMAAAAAAAAAAAAAAREAITFxQVFhofD/2gAIAQEAAT8QEIEgpBlxqN0YsKH24VdjFoAq84XqMgjFBFUwR35hREGcqNe45qpPlQwHtIMWtxi6T//Z","aspectRatio":1,"src":"/static/e1b0c4b179faa72db32da6b7efb166c0/58fe7/scrumpoker.jpg","srcSet":"/static/e1b0c4b179faa72db32da6b7efb166c0/e0f30/scrumpoker.jpg 236w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/86afd/scrumpoker.jpg 472w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/58fe7/scrumpoker.jpg 944w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/0ff54/scrumpoker.jpg 1200w","srcWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/99fbb/scrumpoker.webp","srcSetWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/77392/scrumpoker.webp 236w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/1f177/scrumpoker.webp 472w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/99fbb/scrumpoker.webp 944w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/9000d/scrumpoker.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2076a387%20387%200%20003%2074c-1-4%202-3%203%200v3l-1%202c0%202%200%202%201%201l2-1%203%202%201%201c-1%201%200%204%202%204l2%202%202%202%204%201v1l1%201h-1c-2-1-2-1-2%201l1%202v2c-1%202%200%205%201%203%201-1%201-1%201%201v2h3l22-11a4484%204484%200%200141-25l-2-2v-2l2%202c2%202%202%202%204%201%203-1%206%200%204%201v1c2-1%204%201%202%201-1%201-1%201%201%201%201%200%202%200%202%203%201%209%201%2011%203%2011%203-2%201%202-3%203-2%201-3%202-2%203l-1%202v-1c0-1-1-1-4%201-5%202-6%203-5%204s1%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%202c-3%201-4%201-2-1%202%200%202-1%201-1v-5l-2%203c-2%203-2%203-5-3l-3-4%202%206%202%206%201%201%201%201-2%201v-1l-1-1-1%202c1%201%200%201-1%201h-1l-1%202v-1h-3c-2%201-2%201-1%202s1%201-1%202h-2l1-1-1-2h-1c1%201-1%203-6%205-5%203-6%204-5%205v1c-3-1-9%202-7%203v1c-1%200-1%201%201%206l-1%201-2%201h-1v-2c-2%200-2%200-1-1v-1l-2-1-2-1-2%202h-2v1c1%201%201%201-1%201h-1c1%201-12%209-15%208l-1%201h-1l-1%201v1c-1%200-3-1-3-3-1-1-1-2-2-1v5l1%202v3c-1%200-2-1-2-3l-2-5-2-3c-1-5-2-2-2%206l1%208%201%201h2l3-2%202-1c1-1%201-1%201%201l-3%204c-3%202-3%202-1%202%203%200%203%201%201%203-2%201-4%200-4-2%201-1%201-1-1-1l-2%201a2685%202685%200%20000%20154v13h5l5-1h2c1%201%202-1%202-3l2-4c1-2%202-4%201-5v-3c2-1%200-4-1-3-2%200-4-4-2-5%201-1%200-4-1-5v-2c-1%200-1-1%201-3s2-2%203%200c0%202%205%202%207-1%202-2%203-2%202%202%200%203%200%203%201%202s1-1%201%201v2l1-2c1-2%201-2%201%200%200%201%200%202%201%201%202%200%205%202%205%203l3%204%203%203%202-2c2-2%203-4%202-5%200-1%202-2%203%200%200%202%203-3%203-5l-3-1c-3%200-6-2-6-3%200-2%204-2%206%200h2l1%201-1%201c2-1%205%201%204%202l2%203v3l4%201c2%200%203-1%203-2h2c1%201%202%202%203%201%202%200%202%200%201%202v4c1%202%200%203-3%201-2-1-3-1-3%201v2l-1%201-1%201%202%201c3%200%204%202%202%204-3%201-2%202%200%202%202-1%202-1%202%201l-1%202-2%202c-1%201%200%201%206%201l6-1h5c1%202%206-1%207-4l4-3v1l-1%204v3h7l7-1c-1-2%201-5%206-8l3-3-1-1h3l-1-1%201-2c2-2%202-2%201-3s-2-2-1-3l-1-1c-2%201-2%201-2-1%201-1%200-1-1-1-2%201-2-4%201-6l1-3%201-2%201-2c1-2%203-2%206-1h1l18%201h2a495%20495%200%200187%201l2%203%201%203%201%204%201%203v5c2%201%2010%200%2012-2%203-2%205%200%203%203-2%202-2%202%200%202%202%201%202%201%201%202s-1%201%201%201c2%201%202%201%202%205-1%205-1%206-4%203l-2-1-1%202c-2%201-2%204%200%204l1-1h1c0%202%205%201%205%200h2l72%201h72v-14c0-7%200-13-1-12-1%202-1%202-2%201l-1-3-1-1v-6l-1-2c-1-1-1-1%201-2%203-2%204-1%204%204a3201%203201%200%20000-159l1-103V0h-21l4%204c12%2010%2016%2030%209%2044-2%204-5%204-8%201%200-2-2-3-2-2l-4-3-9-7-2-1c-1-2-18-9-19-8l-4-2h-5l-2-1c1-1-3-2-6-1h-3c0-2-1-2-1-1h-3l-2-1c-2%202-1-3%201-8l7-9%205-5h-17l-17%201h-16v2l1%201c-1%201-7-2-7-3l-7-1c-8%200-10%201-6%203%202%200%202%200%201%201-2%201-3%200-5-2-2-3-4-2-2%201%202%202-2%205-6%204-4-2-5-4-2-4l4-2c2-1-1-1-27-1-27%200-34%201-31%202h2c2%200%202%200%201%202v4l-1%201h-2l-2%201c-1-1-2%200-2%201l-2%201%201%201c1%201%202%201%201%202-2%200-1%202%201%202l3-3c1-1%202-2%204-1%202%200%203%200%203-2l3-2c2-1%202%200%202%203l-1%204-1%202%203%201c2%200%204%200%207%203%202%202%203%203%204%202h2c1%201%202%202%203%201%202%200%201%201-1%203-1%201-1%201%201%201s5%202%205%203l-2%201%202%202c2%201%203%202%203%204l3%206c3%204%204%206%201%206l-1%201%203%201%204%201h4c3-1%203-1%204%202%202%203%200%208-3%206h-4%201c2%200%206%205%206%208%200%202-1%203-2%201-1-1-1%200-1%201%200%202-1%203-3%204s-3%203-2%203c0%201-1%202-3%202l-3%202-1%201c-1-1-8%204-9%205l-2%201-3%201c-2%202-6%200-5-2l-1-1v3l-1%203v2c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-5%202-4%203h-2v1c1%201%201%201-1%201h-1v2l5%201c3-1%204%200%204%207%200%205%201%206%202%206%202%200%203%200%203%202s0%202-1%201c-1-3-3%201-3%206%200%203%201%204%204%206%204%203%205%207%202%208v-1l-2-2-2%201c0%203-3%203-5%202v-2c2%200%202-1%202-9-2-23-2-23-5-23l-2%201%201%201h1c0%203-3%202-4-1%200-2-1-3-2-3h-4c-2%200-2%200-1%201v1c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%201%201%201-1%202h-2l-5%201-2%203c1%201%201%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%200%201%201-1%202-2%202-3%200-4-7v-5l-1%205c-1%207-1%207-12%2014l-9%205-12%201c-12%200-16-1-16-4h2c1%202%203%202%2013%201h11l9-6%2010-7c0-2%200-2-3%200l-6%203-3%203-1%201-3%201c-4%202-23%203-25%201l6-1c1%200%202%200%201-1l1-1%201%201h1l2-1%202-1%202-2c3%200%209-4%2010-7l2-4%201-2c0-2%200-2-2-1-3%203-8%205-11%205h-3l3-1%205-2v-1c-2%200-2%200%201-2s5-4%205-6c0-3-2-2-2%201-1%203-1%203-3%202l-1-1-1%202h-7v-1l-2-2c1-2%202-4%202-2s1%203%202%201l-1-4-2-7c0-2%200-2-2-1l-2-1%202-1v-1l2-2h-4c-5%200-6%200-4-1l2-2%202-1h3l1-2%202-4v-1l2-6%201-2c0-3-2-2-3%201l-1%201c0-3%201-5%203-5l1-1c1-1%201%200%201%202%200%205%201%206%204%2010%203%203%204%204%204%209v5l1%204%202%206%201%203c-1%201%200%202%202%201h4l-2%202a1067%201067%200%200145-24c16-9%2016-8%2010-8-4%201-5%201-7-1h-3c-1%202-1%202-3%201v-1l1-1h-1c-2%201-4%200-2-2l-1-1-1%201-2%203v-1l-1-3-1-2v-5c-2-4-2-4-4-2-1%202-2%202-2%201-1-2-3%200-2%204l-1%203v2c0%202-1%203-4%201-2-2-4-2-4%200h-2c-2-1-1-2%201-4l3-3h-3l-3-2-1-1-2%201c0%202-2%201-4-1s-2-2-3%200c-2%201-2%201-3-2s-1-3-3-1c-1%201-1%201-2-1l-4-9h-2c-1%200-1-1%201-2v-1h-2l1-1%201-2c-1-3-5-5-6-3l-2%201-1%201v1c-2%200-2-2-1-3%202%200%202-4%200-5l-1%202c1%201%200%202-2%203-4%202-4%203%200%202h3l-3%201c-3%202-5%202-4-1l-1-1v-4l2-3%203-1h-3l-2-1v-4c0-2%201-3%202-3l1-2c1-1%200-1-1-1-4%200-5%200-3-1l-1-2h-1l-1%202-2%201c-1%201-6%200-6-2l1-2%203-2c2-2%204-2%204-1h3c2%200%203%201%204%203%202%205%203%206%206%205%202-1%203%200%205%202s3%202%205%202h7c2-1%204%200%202%201v1l3-1v-4l-1-4-1-2v-1l-1-1%201-2%201-1-1-1c-2%200-2-2-1-4h10l2-2c4%200%205-2%203-4-2-1-1-4%201-3l1-1h5l1%202-1%201%202%201%203%201c1%201%201%200%201-2%200-5%200-6%203-4%201%201%202%201%203-1%201-1-1-1-15-1-16%200-17%200-16%202%201%201%201%201-1%202l-2%202h-4c-1-1-1-1%201-3%204-2%204-3%201-3-1%200-2%200-1%201l-1%201-3%201-2%202-3-2-3-3H0v76m0%201c0%2047%201%2057%201%2024%200-46%200-52%202-51l1-1-1-1c-3%200-3-30-1-32v-2L1%207%200%2077m325-36c-2%200-1%203%201%203l2%201%203%203%205%202c2%201%202%201%202-1l2%201c2%203%206%203%208%200l3-2%201-1-1-1c-3%201-8-1-8-3l-2-1-1%202c1%202-5%201-8-1-2-2-5-3-7-2M122%2052c-1%201-2%204-1%207%200%202%200%203-1%202%200-2-2-1-2%201l-1%201c-2%200-1%202%202%203%202%201%203%201%208-2l5-3c0-2-3-3-4-2l-3%201c-2%201-2%201-1-1V49l-2%203M53%2062l-9%206-3%203%202%202h3c1-1%201-1%201%201h1l1-1v1c0%202%202%204%204%203v1c0%202-1%202-4%200l-2-1%203%203c1%201%202%202%201%203l1%201h1v4l1%202%201-3c0-1%200-2%201-1%202%200%201-1-1-3-1-1-1-1%201-2s2-1%201-3c0-2%200-2%201-1l1-2c-1-4%200-4%201%200%201%202%201%202%202%201l-2-4v-2l1%201h1l1-2c0-3%200-5%201-3h1l3-1v1l-1%203-1%204c-1%201%200%202%201%204%202%201%203%203%201%203h-3l-3%201%202%202c2%202%202%203%200%204h-2l-1%201%201%201%201%201h-1c-1-1-5%202-4%203h1l2-1-1%203v2c1%201%201%201%202-1%201-3%206-8%207-7v-1c-1-1-1-1%200%200l1-1v-1c2%202%202-1%200-2l-1-2%203%201c0%202%204%201%207-1h8c8%202%2010%203%203%202-7%200-11%200-16%204-6%204-8%206-6%208v2l-1%202c1%202%203%201%203%200-1-3%201-2%206%204l4%205c-2-1-3%201%200%201h2c-2-2%201-1%204%202l1%203c-3-1-3%200-1%201l3%201%205%203c5%204%205%205%202%2011l1%202%202-3c0-2%201-3%202-3v-2h2l4-1c1-3%200-7-2-7l-2%201v2c0%203-1%204-2%203l-1-5c0-2%200-3-2-4-3-2-1-4%202-3%202%200%202%200%201-2-2-2-4-3-6-1-1%201-2%200-5-2l-4-3%205-2c4-2%204-2%205-1l2%202%201%201c1%202%202%203%204%203%204%200%206-2%203-2l-3-2v-2l1-1%201-1c4%200%204-1%201-4l-9-8h-1l-1-1c1-1%200-2-1-4l-2-2%207-4c9-4%209-4%205-7l-3-2-8%204c-8%204-12%205-9%201%202-1%200-3-1-1-1%201-3%200-6-2-5-5-6-5-10-4h-3l2-1%202-1h-1l-3-1c-1-3-5-2-11%201m259%2030l-2%202h-4c-2%200-2%202%201%204%202%202%202%202%203%201h1c1%202%200%205-1%203l-2-1v1l-1%201h-1c0%201%202%203%204%203s2%200%200%203l-2%203%202%201%202%202%201%201h1l-1%202h-2c1-2%200-3-2-2s-2%201-1%202c2%201%201%202-3%204-5%202-5%203-3%204l1%202-4-2-4-2h-1l-3-1c-4%201-3%203%201%203%201-1%202%200%203%201s2%202%203%201l2%201-1%201c-2%200-1%203%201%205l3%205%201%202v2c0%201%202%202%203%200h1c1%202%201%203-1%202-2%200-2%200-1%202l1%203v1l1%201%202-1-1-1c-1%200-1-1%201-1%202-2%203-2%203%200h3c3-2%204-3%201-3l-1-1v-5l3-7c1-3%202-5%201-7s-1-2-4%200h-3c-1-1%205-4%208-4v2h1c1-2%205%207%205%2011%200%203%202%205%205%204l1-6c-1-6-1-6%201-5l1%201c0-1%200-2%201-1l1-4c0-3%200-3%201-1%202%206%200%2014-3%2012-1-1-1-1-1%201%201%204-6%208-8%204%200-2-2-3-3-3l-1%202h-2c-2%200-3%201%200%203h2l1-1h2v2h-1v1h-2v1l-4%204c-6%204-6%204-6%201-1-2-1-2-1%200l-1%203c-2%200%200%201%203%202l2-1c0-2%204%203%204%205s-4%206-10%208c-4%202-9%202-13%201-3-2-3-2-6%201l-4%201-2-1%201%202-5%205c-6%204-7%205-6%203l-1-2-1%202c1%201%200%202-1%203-3%202-2%203%201%203%208-2%209-2%208%201l1%203%201-1h1v3l1%202%201%201%201%201h-1l-2%201%202%201%201%202h2c4-3%204-2%203%201%200%203%202%206%204%204%201-4%205%200%204%203v4l-4%201-2%202-1%201-2%201%202%201%201-1h3l2-1c0-3%202-2%204%200l4%202%202%201c0%202%201%202%203%201h1c0%202-1%202-3%202l-1%201c-1%201%201%204%203%204l1%201c1%201%201%200%201-1-1-2%201-2%205%202l2%201%201%201c1%201%201%201%204-1%202-3%203-3%204-2h4c1-1%202%200%203%202l1%202h-4l-2%201-3%202c-4%202-2%206%201%204l2%201-3%201c-2%200-4%202-2%202v1l-1%202-2%201h-1c3%200%202%203-1%204-4%202-2%203%203%203l4-1v8l-1%207c-1%207-1%207%201%205%202-1%202-1%202%203v3l-2-2-3-1%202%203%201%202h-5c-3%202-2%203%201%202%203%200%203%200%202%201l1%201h2l15%201c15%200%2016%200%2018-2s2-3%201-3c-3-1-2-3%200-3s5-2%204-3l1-2%201-1h-1l-1-2%201-4%202-1%201%204%202%201v2l-2%202c1%201%2021-18%2021-21%200-2-8-9-12-10-2-1-3%200-29%2023l-13%2012-3-2-3-1v-10c0-9%201-13%204-13%201%200%205-5%204-6l1-1c1%201%201%200%201-2s0-3%202-5c3-2%204-6%202-6v-1l1-2%205-1c6%200%206-1%200-4l-6-3h-2c-2%200-2%200-1-2l-1-3-1%201-1%202c-3%201-6-1-4-4h5c-1-1%200-1%201-1%202%200%201-5-2-8v-2c2-1%203-3%201-3-3%200-5%200-3-1s2-1%201-3v-1l3%201h3l-3-1-2-1%202-2c2-1%202-1%201-2l-2-3h-1l-2%202%201-2c2-2%203-3%201-3-2-1-2-1-2%201h-1c-2%200-3%201-2%203l-1%201c-2-1-2-5-1-6l1%201h2l1-3v-1l1%201%201%201v-11c1-3%200-5-1-4-2%201-2%200-1-6v-8l-4%203c-5%204-5%205-5%203l1-2c2%200%204-3%204-4l2-1c2%200%203%201%203%202h3l-1-2-2-1%203-1%204-12v-10l-4-14-2-3v-2c1-1%201-1-1-1l-1-2-1-1h-1c-1%201-4%200-4-1h1l1-1%201-1v-1l-1-1-1-2-1%202c0%202%200%202-1%201v-2l-2-1v-3h1c1%201%201%201%201-1l-1-2h-2c-1-1-2-1-3%201l-2%203v-3l-1-2c-3-1-5%201-5%203h-3v-2l1-1-1-1-1%201M29%20104l-8%205h-2l2%203c3%203%204%204%205%203l6-6c-2%200-2-3%201-4%203-2%207-1%205%201h3c2-1%202-2-1-4l-2-3-9%205m245-1l-5%205-2%201-1%201h-1l-1%201c-2-1-4%200-3%201l-1%201h-1l-2%202-1%201c1%201%201%208-1%208-2%201-2%201-2%203h3l-1%203h-2l-2%202v11c-2%202-2%202%200%202v7l4-2%204-2-4%204a244%20244%200%2000-18%2011l-4-2c-5-3-6-3-13%202-5%203-6%204-7%202l-3-1v4c-2%202%200%205%201%203%202-1%203%200%202%202v2l1%201v1c1%201%201%201-1%201h-1c1%201-3%203-6%203v2c-1%201%200%201%201%201%204%200%209-4%209-6v-3l1%201c0%201%203%202%204%201s3%200%206%203c2%202%205%203%207%203%203%200%203%201%203%206h4c2%200%203%200%202%201-1%203%203%205%204%202%202-1%202-1%202%203%200%202%200%203-1%201l-1-1c-2%200-1%207%201%208%203%203%200%202-4-1-3-2-4-4-3-5l-1-2-1%201c1%201%200%202-1%202l-1-1-9-9c-8-7-9-7-11-6l-5%203a1094%201094%200%20018-1l13%2011-1%201-1%202h-2l-1%201v1c-1-1-6%201-7%203l-4-2-4-3-3%202c-2%203-2%203-5%201l-4-4-6-4-2-2-1-1-1%201c0%201-3%202-4%201h-2v1l2%201-4%201c-4%200-2-3%205-8%204-3%205-4%204-6l1-2c1-1%201%200%201%201%200%202%200%202%201%201%202-1%202-1%200-3l-1-4-3-4c-4-3-5-6-3-8l-6-7c-7-6-7-6-10-4-2%201-2%201-5-1l-4-4c0-2-2-4-4-6l-3-5-1-2c-2%200-2%201-1%202l-1%202c-1-1-21%2010-20%2012h-1l-1%201%202%201c1-3%208%206%208%2010%201%203%204%2010%205%208l5%205c3%202%206%206%209%207l10%209c5%206%206%206%205%209-1%202-1%203%204%208l6%205%203%203%202%202v-3l2%201c0%202%203%202%205%201l5-1c2%201%202%201%200%202l-2%202h3l-2%203c-2%201-2%203-2%204v4l-1%201-2%203c0%204%200%204%201%203%203-2%203-1%202%202l-1%203h-1l-1%201v1l-1%201%203-1c2-2%203-4%204-12l2-11%2010%208c4%205%209%208%209%208l1%202c0%202%200%202%201%201%202-1%202-1%202%201l2%201%201%201v2c-2%202-1%203%201%201%203-2%203-7%201-5v-2h-3l1-2h4a153%20153%200%200021%2020%202598%202598%200%200036%2029c5%200%206%200%207-2s1-2%203-1c2%202%207-1%206-4l2-2v-3l1-3h1l-1-2v-7l-1-2c-1-1-1-1-1%202v3l-5-4c-4-3-5-5-5-7h-1c0%202%200%202-2%200s-2-5%201-3h1l-9-10c-9-7-9-7-13-6-4%200-4%200-10-5l-9-7-2-4%201-2%201-3%201-1%201-1h1v8l5-4%205-4%202%202%202%202-1-3c-2-2-2-2-1-3l2-2h-1l-1-1c1-1-1-1-4%201-5%202-4%201%200-3l5-3-3-2-7-6c-4-3-8-3-5%200%202%202%202%204%201%204l-2-1-3-1c-3%201-3%200-3-3%200-2%201-3%202-3%202-1%202-2%202-4l1-1%201%201%203-1c4-3%206-4%206-1l1%201v-3c-1-1%202-3%207-6%208-5%208-5%208-9l1-4v3l1%203%206-4%208-4v-1l1-1%201-1-1-8v-3l1-1-2-1h-2l1-1%201-1h-3c0-1-1-2-2-1v-1c3-2%202-3%200-2-3%202-3%201-1-1v-3h-3c1-3-3-3-6%200h-4c1%201-1%203-4%205-6%202-6%202-8%201-3-2-3-2-2-5v-4c0-1%201-2%203-1%203%200%203%200%202%201l-1%201h2l3-3h2l1%201c2%200%203-2%204-4l4-6%205-3%202-1h1l1%201v2l-1%201c1%201%209-3%209-4l-2-1%201-1%201-2v-1l1-9-1%201v1l-1-1-4-1h-3c0-1-6-1-7%201l-1-1-2-1-2%201h-7m-119%2056l-6%203%204%203c4%202%205%203%209%201%201-1%203-2%204-1%203%200%203-2%200-4l-4-4c0-2-1-2-7%202m172%207l-1%203v2c0%202-1%203-3%202l-1%201v3l-1%202-1-1v4l-1%205-3%203-3%202h5c-1%201%200%202%201%203%201%202-1%204-4%203l1%201%201%203%202%202c4%201%204%202%201%201-4%200-5%201-3%203%201%201%202%202%201%203h1c2-2%201%201-3%204-3%203-4%204-3%206l1%203%204%201c4%202%208%202%209%200h2l1%201v-4l-2%201c-2%202-3%201-3-4%201-4%201-5-1-5-1-1-1-1%201-1s4-2%202-2v-5c-1-2-1-3%201-3h4c1%200%202%200%201-2l-1-1-1-1c-1-1%200-3%203-5l2-4-5%204-4%203%201-8c1-2%200-13-1-14v-2c2-1%203-10%201-10l-1%203M1%20178c0%2011%200%2012%202%2012%203%201%205%200%203-1-1-1%200-2%204-4l5-3h2v-1c-1-1-1-1%201-1h1l-1-1-3-5c-3-3-4-5-3-6H9c-2%202-3%202-3%201l-1-2v2H4l-1-1-1-1c-1-1-1%203-1%2011m109%201l1%203c2%201%202%202%201%202l2%205%204%202c0-2%201-2%204-2l4%201%201%201v-1c0-1%201-2%203-2%204%200%205-1%205-3-1-2-2-2-9-2-8%201-8%201-11-3-3-3-4-4-5-1m31%201l-3%203%203%202a243%20243%200%200116%2014l3-3%203-2-3%201-4%202-4-4c-4-3-5-5-3-5%204%201%204%200%202-3s-4-4-6-1c-2%202-3%201-2-1l2-1v-4l-1-1-3%203m3%2023l3%204%203%203-5%203c-5%203-7%206-3%204l1%201-1%201c-1-1-1%200%200%200%200%202%200%202-1%201-2%200-2%201%200%203h2c0-1%206%203%206%205l-9%207c-1-2-10-2-10-1l5%201c6%200%206-1-14%2012l-19%2013H90l1-1-4-7-6-6c-1%201-4-2-6-5l-5-6-3%202c-2%201-3%203-2%204h1l2%203c0%202%201%203%202%203v-3l1%202v2l2%202%209%2014%201%201-1%201-3%201-3%202c-2%200-10%206-9%207l-1%201v1h-1c-1-1-2%200-4%202-3%203-4%204-1%204%201-1%202%200%202%201l7%201c7%200%207%200%206-2l-1-4c0-2%201-1%203%202%203%205%206%205%207%201l2-3v-1c0-2%205-7%206-7l3%203%202%203v2c-1%201-1%201%201%201%203-1%204-1%208%202s15%204%2019%201h4v-1l-2-3h1c1%201%202%202%203%201v1h1l1%201v1l2-1h1l1-2h-1l-2%201c-2%200%203-4%204-4v2l1%201%202-1%201-1%201-1h1l1-1h3v-2c2%200%2011-7%2011-8%200-2%200-2-3-1l-3%202%205-5%206-3%202%202c0%202%201%202%201%201v-2c-2-2-2-2%201-4%203-3%203-3%203%201%201%202%201%202%201-1v-4l2%203c1%205%201%205-1%205v1h2l1%201v1h1v1h1v1h2l1%201v1l1%201v1h1l3%201c2%200%202%200%200%202-1%201-2%202-1%204%201%203-1%203-5-2l-4-3c-1%200%201%203%204%205l5%205%209-7c6-3%209-7%209-7l-1-2-2-1c-4%201-5-1-2-2%202-1%202-1%201-2v-1c3%201%205%200%203-1v-1c3%201%202-3-1-5l-3-5c0-2%200-2-1-1v3c1%202-1%206-3%206l-2-1-1-2h-2c-3%201-4%200-5-4v-1h1l-1-2v-1c2%200-2-13-5-16v-1l-1-1v-1c3-2-1-1-4%201-3%201-4%202-5%201v-1a339%20339%200%20018-6l-1-2c-3-3-3-5-1-5v-1l-4%201c-3%202-5%202-3%200%203-2%202-3%200-3-2-1-2%200-2%201v3c1%201%201%202-1%203-2%202-2%201-7-4l-6-5-4-4-4-2m-109%204l-1%201-15%209%207%2012%2010%2015c2%204%202%204%204%203a435%20435%200%200112-9c-2%201-2%200-2-1%200-2%202-3%202%200h4c1-1-3-8-6-11l-7-10c-6-9-8-12-8-9m66%20112c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m31%200c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m121%2047c3%204%206%206%207%206%202%200%205-3%209-6l6-5h-28l6%205'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMEAf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHJWdJeIjXMXKD/xAAbEAADAAMBAQAAAAAAAAAAAAAAAQIDERITIv/aAAgBAQABBQKEV9ndI62doetzjn0zSpR//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAESUf/aAAgBAwEBPwGWSymU9P/EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwFcj//EABwQAAICAgMAAAAAAAAAAAAAAAABECERYQIxUf/aAAgBAQAGPwLcYLeNDs7OK9RUf//EAB0QAAIDAAIDAAAAAAAAAAAAAAERACExQVFhcYH/2gAIAQEAAT8hBovyyIVaNMJjFqsgaCgOAjgFDrPMP3OoUU003AxFa2fJ/9oADAMBAAIAAwAAABBv/wCC/8QAFhEBAQEAAAAAAAAAAAAAAAAAAGEB/9oACAEDAQE/EI6jqurn/8QAFxEBAQEBAAAAAAAAAAAAAAAAABEBUf/aAAgBAgEBPxC4hMRx/8QAHhAAAgICAgMAAAAAAAAAAAAAAREAITFxQVFhofD/2gAIAQEAAT8QEIEgpBlxqN0YsKH24VdjFoAq84XqMgjFBFUwR35hREGcqNe45qpPlQwHtIMWtxi6T//Z","aspectRatio":1,"src":"/static/e1b0c4b179faa72db32da6b7efb166c0/1dc0b/scrumpoker.jpg","srcSet":"/static/e1b0c4b179faa72db32da6b7efb166c0/3a5ce/scrumpoker.jpg 163w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/05730/scrumpoker.jpg 327w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/1dc0b/scrumpoker.jpg 653w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/f72c7/scrumpoker.jpg 980w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/0ff54/scrumpoker.jpg 1200w","srcWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/0acdf/scrumpoker.webp","srcSetWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/ac59e/scrumpoker.webp 163w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/7660b/scrumpoker.webp 327w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/0acdf/scrumpoker.webp 653w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/75470/scrumpoker.webp 980w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/9000d/scrumpoker.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2076a387%20387%200%20003%2074c-1-4%202-3%203%200v3l-1%202c0%202%200%202%201%201l2-1%203%202%201%201c-1%201%200%204%202%204l2%202%202%202%204%201v1l1%201h-1c-2-1-2-1-2%201l1%202v2c-1%202%200%205%201%203%201-1%201-1%201%201v2h3l22-11a4484%204484%200%200141-25l-2-2v-2l2%202c2%202%202%202%204%201%203-1%206%200%204%201v1c2-1%204%201%202%201-1%201-1%201%201%201%201%200%202%200%202%203%201%209%201%2011%203%2011%203-2%201%202-3%203-2%201-3%202-2%203l-1%202v-1c0-1-1-1-4%201-5%202-6%203-5%204s1%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%202c-3%201-4%201-2-1%202%200%202-1%201-1v-5l-2%203c-2%203-2%203-5-3l-3-4%202%206%202%206%201%201%201%201-2%201v-1l-1-1-1%202c1%201%200%201-1%201h-1l-1%202v-1h-3c-2%201-2%201-1%202s1%201-1%202h-2l1-1-1-2h-1c1%201-1%203-6%205-5%203-6%204-5%205v1c-3-1-9%202-7%203v1c-1%200-1%201%201%206l-1%201-2%201h-1v-2c-2%200-2%200-1-1v-1l-2-1-2-1-2%202h-2v1c1%201%201%201-1%201h-1c1%201-12%209-15%208l-1%201h-1l-1%201v1c-1%200-3-1-3-3-1-1-1-2-2-1v5l1%202v3c-1%200-2-1-2-3l-2-5-2-3c-1-5-2-2-2%206l1%208%201%201h2l3-2%202-1c1-1%201-1%201%201l-3%204c-3%202-3%202-1%202%203%200%203%201%201%203-2%201-4%200-4-2%201-1%201-1-1-1l-2%201a2685%202685%200%20000%20154v13h5l5-1h2c1%201%202-1%202-3l2-4c1-2%202-4%201-5v-3c2-1%200-4-1-3-2%200-4-4-2-5%201-1%200-4-1-5v-2c-1%200-1-1%201-3s2-2%203%200c0%202%205%202%207-1%202-2%203-2%202%202%200%203%200%203%201%202s1-1%201%201v2l1-2c1-2%201-2%201%200%200%201%200%202%201%201%202%200%205%202%205%203l3%204%203%203%202-2c2-2%203-4%202-5%200-1%202-2%203%200%200%202%203-3%203-5l-3-1c-3%200-6-2-6-3%200-2%204-2%206%200h2l1%201-1%201c2-1%205%201%204%202l2%203v3l4%201c2%200%203-1%203-2h2c1%201%202%202%203%201%202%200%202%200%201%202v4c1%202%200%203-3%201-2-1-3-1-3%201v2l-1%201-1%201%202%201c3%200%204%202%202%204-3%201-2%202%200%202%202-1%202-1%202%201l-1%202-2%202c-1%201%200%201%206%201l6-1h5c1%202%206-1%207-4l4-3v1l-1%204v3h7l7-1c-1-2%201-5%206-8l3-3-1-1h3l-1-1%201-2c2-2%202-2%201-3s-2-2-1-3l-1-1c-2%201-2%201-2-1%201-1%200-1-1-1-2%201-2-4%201-6l1-3%201-2%201-2c1-2%203-2%206-1h1l18%201h2a495%20495%200%200187%201l2%203%201%203%201%204%201%203v5c2%201%2010%200%2012-2%203-2%205%200%203%203-2%202-2%202%200%202%202%201%202%201%201%202s-1%201%201%201c2%201%202%201%202%205-1%205-1%206-4%203l-2-1-1%202c-2%201-2%204%200%204l1-1h1c0%202%205%201%205%200h2l72%201h72v-14c0-7%200-13-1-12-1%202-1%202-2%201l-1-3-1-1v-6l-1-2c-1-1-1-1%201-2%203-2%204-1%204%204a3201%203201%200%20000-159l1-103V0h-21l4%204c12%2010%2016%2030%209%2044-2%204-5%204-8%201%200-2-2-3-2-2l-4-3-9-7-2-1c-1-2-18-9-19-8l-4-2h-5l-2-1c1-1-3-2-6-1h-3c0-2-1-2-1-1h-3l-2-1c-2%202-1-3%201-8l7-9%205-5h-17l-17%201h-16v2l1%201c-1%201-7-2-7-3l-7-1c-8%200-10%201-6%203%202%200%202%200%201%201-2%201-3%200-5-2-2-3-4-2-2%201%202%202-2%205-6%204-4-2-5-4-2-4l4-2c2-1-1-1-27-1-27%200-34%201-31%202h2c2%200%202%200%201%202v4l-1%201h-2l-2%201c-1-1-2%200-2%201l-2%201%201%201c1%201%202%201%201%202-2%200-1%202%201%202l3-3c1-1%202-2%204-1%202%200%203%200%203-2l3-2c2-1%202%200%202%203l-1%204-1%202%203%201c2%200%204%200%207%203%202%202%203%203%204%202h2c1%201%202%202%203%201%202%200%201%201-1%203-1%201-1%201%201%201s5%202%205%203l-2%201%202%202c2%201%203%202%203%204l3%206c3%204%204%206%201%206l-1%201%203%201%204%201h4c3-1%203-1%204%202%202%203%200%208-3%206h-4%201c2%200%206%205%206%208%200%202-1%203-2%201-1-1-1%200-1%201%200%202-1%203-3%204s-3%203-2%203c0%201-1%202-3%202l-3%202-1%201c-1-1-8%204-9%205l-2%201-3%201c-2%202-6%200-5-2l-1-1v3l-1%203v2c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-5%202-4%203h-2v1c1%201%201%201-1%201h-1v2l5%201c3-1%204%200%204%207%200%205%201%206%202%206%202%200%203%200%203%202s0%202-1%201c-1-3-3%201-3%206%200%203%201%204%204%206%204%203%205%207%202%208v-1l-2-2-2%201c0%203-3%203-5%202v-2c2%200%202-1%202-9-2-23-2-23-5-23l-2%201%201%201h1c0%203-3%202-4-1%200-2-1-3-2-3h-4c-2%200-2%200-1%201v1c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%201%201%201-1%202h-2l-5%201-2%203c1%201%201%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%200%201%201-1%202-2%202-3%200-4-7v-5l-1%205c-1%207-1%207-12%2014l-9%205-12%201c-12%200-16-1-16-4h2c1%202%203%202%2013%201h11l9-6%2010-7c0-2%200-2-3%200l-6%203-3%203-1%201-3%201c-4%202-23%203-25%201l6-1c1%200%202%200%201-1l1-1%201%201h1l2-1%202-1%202-2c3%200%209-4%2010-7l2-4%201-2c0-2%200-2-2-1-3%203-8%205-11%205h-3l3-1%205-2v-1c-2%200-2%200%201-2s5-4%205-6c0-3-2-2-2%201-1%203-1%203-3%202l-1-1-1%202h-7v-1l-2-2c1-2%202-4%202-2s1%203%202%201l-1-4-2-7c0-2%200-2-2-1l-2-1%202-1v-1l2-2h-4c-5%200-6%200-4-1l2-2%202-1h3l1-2%202-4v-1l2-6%201-2c0-3-2-2-3%201l-1%201c0-3%201-5%203-5l1-1c1-1%201%200%201%202%200%205%201%206%204%2010%203%203%204%204%204%209v5l1%204%202%206%201%203c-1%201%200%202%202%201h4l-2%202a1067%201067%200%200145-24c16-9%2016-8%2010-8-4%201-5%201-7-1h-3c-1%202-1%202-3%201v-1l1-1h-1c-2%201-4%200-2-2l-1-1-1%201-2%203v-1l-1-3-1-2v-5c-2-4-2-4-4-2-1%202-2%202-2%201-1-2-3%200-2%204l-1%203v2c0%202-1%203-4%201-2-2-4-2-4%200h-2c-2-1-1-2%201-4l3-3h-3l-3-2-1-1-2%201c0%202-2%201-4-1s-2-2-3%200c-2%201-2%201-3-2s-1-3-3-1c-1%201-1%201-2-1l-4-9h-2c-1%200-1-1%201-2v-1h-2l1-1%201-2c-1-3-5-5-6-3l-2%201-1%201v1c-2%200-2-2-1-3%202%200%202-4%200-5l-1%202c1%201%200%202-2%203-4%202-4%203%200%202h3l-3%201c-3%202-5%202-4-1l-1-1v-4l2-3%203-1h-3l-2-1v-4c0-2%201-3%202-3l1-2c1-1%200-1-1-1-4%200-5%200-3-1l-1-2h-1l-1%202-2%201c-1%201-6%200-6-2l1-2%203-2c2-2%204-2%204-1h3c2%200%203%201%204%203%202%205%203%206%206%205%202-1%203%200%205%202s3%202%205%202h7c2-1%204%200%202%201v1l3-1v-4l-1-4-1-2v-1l-1-1%201-2%201-1-1-1c-2%200-2-2-1-4h10l2-2c4%200%205-2%203-4-2-1-1-4%201-3l1-1h5l1%202-1%201%202%201%203%201c1%201%201%200%201-2%200-5%200-6%203-4%201%201%202%201%203-1%201-1-1-1-15-1-16%200-17%200-16%202%201%201%201%201-1%202l-2%202h-4c-1-1-1-1%201-3%204-2%204-3%201-3-1%200-2%200-1%201l-1%201-3%201-2%202-3-2-3-3H0v76m0%201c0%2047%201%2057%201%2024%200-46%200-52%202-51l1-1-1-1c-3%200-3-30-1-32v-2L1%207%200%2077m325-36c-2%200-1%203%201%203l2%201%203%203%205%202c2%201%202%201%202-1l2%201c2%203%206%203%208%200l3-2%201-1-1-1c-3%201-8-1-8-3l-2-1-1%202c1%202-5%201-8-1-2-2-5-3-7-2M122%2052c-1%201-2%204-1%207%200%202%200%203-1%202%200-2-2-1-2%201l-1%201c-2%200-1%202%202%203%202%201%203%201%208-2l5-3c0-2-3-3-4-2l-3%201c-2%201-2%201-1-1V49l-2%203M53%2062l-9%206-3%203%202%202h3c1-1%201-1%201%201h1l1-1v1c0%202%202%204%204%203v1c0%202-1%202-4%200l-2-1%203%203c1%201%202%202%201%203l1%201h1v4l1%202%201-3c0-1%200-2%201-1%202%200%201-1-1-3-1-1-1-1%201-2s2-1%201-3c0-2%200-2%201-1l1-2c-1-4%200-4%201%200%201%202%201%202%202%201l-2-4v-2l1%201h1l1-2c0-3%200-5%201-3h1l3-1v1l-1%203-1%204c-1%201%200%202%201%204%202%201%203%203%201%203h-3l-3%201%202%202c2%202%202%203%200%204h-2l-1%201%201%201%201%201h-1c-1-1-5%202-4%203h1l2-1-1%203v2c1%201%201%201%202-1%201-3%206-8%207-7v-1c-1-1-1-1%200%200l1-1v-1c2%202%202-1%200-2l-1-2%203%201c0%202%204%201%207-1h8c8%202%2010%203%203%202-7%200-11%200-16%204-6%204-8%206-6%208v2l-1%202c1%202%203%201%203%200-1-3%201-2%206%204l4%205c-2-1-3%201%200%201h2c-2-2%201-1%204%202l1%203c-3-1-3%200-1%201l3%201%205%203c5%204%205%205%202%2011l1%202%202-3c0-2%201-3%202-3v-2h2l4-1c1-3%200-7-2-7l-2%201v2c0%203-1%204-2%203l-1-5c0-2%200-3-2-4-3-2-1-4%202-3%202%200%202%200%201-2-2-2-4-3-6-1-1%201-2%200-5-2l-4-3%205-2c4-2%204-2%205-1l2%202%201%201c1%202%202%203%204%203%204%200%206-2%203-2l-3-2v-2l1-1%201-1c4%200%204-1%201-4l-9-8h-1l-1-1c1-1%200-2-1-4l-2-2%207-4c9-4%209-4%205-7l-3-2-8%204c-8%204-12%205-9%201%202-1%200-3-1-1-1%201-3%200-6-2-5-5-6-5-10-4h-3l2-1%202-1h-1l-3-1c-1-3-5-2-11%201m259%2030l-2%202h-4c-2%200-2%202%201%204%202%202%202%202%203%201h1c1%202%200%205-1%203l-2-1v1l-1%201h-1c0%201%202%203%204%203s2%200%200%203l-2%203%202%201%202%202%201%201h1l-1%202h-2c1-2%200-3-2-2s-2%201-1%202c2%201%201%202-3%204-5%202-5%203-3%204l1%202-4-2-4-2h-1l-3-1c-4%201-3%203%201%203%201-1%202%200%203%201s2%202%203%201l2%201-1%201c-2%200-1%203%201%205l3%205%201%202v2c0%201%202%202%203%200h1c1%202%201%203-1%202-2%200-2%200-1%202l1%203v1l1%201%202-1-1-1c-1%200-1-1%201-1%202-2%203-2%203%200h3c3-2%204-3%201-3l-1-1v-5l3-7c1-3%202-5%201-7s-1-2-4%200h-3c-1-1%205-4%208-4v2h1c1-2%205%207%205%2011%200%203%202%205%205%204l1-6c-1-6-1-6%201-5l1%201c0-1%200-2%201-1l1-4c0-3%200-3%201-1%202%206%200%2014-3%2012-1-1-1-1-1%201%201%204-6%208-8%204%200-2-2-3-3-3l-1%202h-2c-2%200-3%201%200%203h2l1-1h2v2h-1v1h-2v1l-4%204c-6%204-6%204-6%201-1-2-1-2-1%200l-1%203c-2%200%200%201%203%202l2-1c0-2%204%203%204%205s-4%206-10%208c-4%202-9%202-13%201-3-2-3-2-6%201l-4%201-2-1%201%202-5%205c-6%204-7%205-6%203l-1-2-1%202c1%201%200%202-1%203-3%202-2%203%201%203%208-2%209-2%208%201l1%203%201-1h1v3l1%202%201%201%201%201h-1l-2%201%202%201%201%202h2c4-3%204-2%203%201%200%203%202%206%204%204%201-4%205%200%204%203v4l-4%201-2%202-1%201-2%201%202%201%201-1h3l2-1c0-3%202-2%204%200l4%202%202%201c0%202%201%202%203%201h1c0%202-1%202-3%202l-1%201c-1%201%201%204%203%204l1%201c1%201%201%200%201-1-1-2%201-2%205%202l2%201%201%201c1%201%201%201%204-1%202-3%203-3%204-2h4c1-1%202%200%203%202l1%202h-4l-2%201-3%202c-4%202-2%206%201%204l2%201-3%201c-2%200-4%202-2%202v1l-1%202-2%201h-1c3%200%202%203-1%204-4%202-2%203%203%203l4-1v8l-1%207c-1%207-1%207%201%205%202-1%202-1%202%203v3l-2-2-3-1%202%203%201%202h-5c-3%202-2%203%201%202%203%200%203%200%202%201l1%201h2l15%201c15%200%2016%200%2018-2s2-3%201-3c-3-1-2-3%200-3s5-2%204-3l1-2%201-1h-1l-1-2%201-4%202-1%201%204%202%201v2l-2%202c1%201%2021-18%2021-21%200-2-8-9-12-10-2-1-3%200-29%2023l-13%2012-3-2-3-1v-10c0-9%201-13%204-13%201%200%205-5%204-6l1-1c1%201%201%200%201-2s0-3%202-5c3-2%204-6%202-6v-1l1-2%205-1c6%200%206-1%200-4l-6-3h-2c-2%200-2%200-1-2l-1-3-1%201-1%202c-3%201-6-1-4-4h5c-1-1%200-1%201-1%202%200%201-5-2-8v-2c2-1%203-3%201-3-3%200-5%200-3-1s2-1%201-3v-1l3%201h3l-3-1-2-1%202-2c2-1%202-1%201-2l-2-3h-1l-2%202%201-2c2-2%203-3%201-3-2-1-2-1-2%201h-1c-2%200-3%201-2%203l-1%201c-2-1-2-5-1-6l1%201h2l1-3v-1l1%201%201%201v-11c1-3%200-5-1-4-2%201-2%200-1-6v-8l-4%203c-5%204-5%205-5%203l1-2c2%200%204-3%204-4l2-1c2%200%203%201%203%202h3l-1-2-2-1%203-1%204-12v-10l-4-14-2-3v-2c1-1%201-1-1-1l-1-2-1-1h-1c-1%201-4%200-4-1h1l1-1%201-1v-1l-1-1-1-2-1%202c0%202%200%202-1%201v-2l-2-1v-3h1c1%201%201%201%201-1l-1-2h-2c-1-1-2-1-3%201l-2%203v-3l-1-2c-3-1-5%201-5%203h-3v-2l1-1-1-1-1%201M29%20104l-8%205h-2l2%203c3%203%204%204%205%203l6-6c-2%200-2-3%201-4%203-2%207-1%205%201h3c2-1%202-2-1-4l-2-3-9%205m245-1l-5%205-2%201-1%201h-1l-1%201c-2-1-4%200-3%201l-1%201h-1l-2%202-1%201c1%201%201%208-1%208-2%201-2%201-2%203h3l-1%203h-2l-2%202v11c-2%202-2%202%200%202v7l4-2%204-2-4%204a244%20244%200%2000-18%2011l-4-2c-5-3-6-3-13%202-5%203-6%204-7%202l-3-1v4c-2%202%200%205%201%203%202-1%203%200%202%202v2l1%201v1c1%201%201%201-1%201h-1c1%201-3%203-6%203v2c-1%201%200%201%201%201%204%200%209-4%209-6v-3l1%201c0%201%203%202%204%201s3%200%206%203c2%202%205%203%207%203%203%200%203%201%203%206h4c2%200%203%200%202%201-1%203%203%205%204%202%202-1%202-1%202%203%200%202%200%203-1%201l-1-1c-2%200-1%207%201%208%203%203%200%202-4-1-3-2-4-4-3-5l-1-2-1%201c1%201%200%202-1%202l-1-1-9-9c-8-7-9-7-11-6l-5%203a1094%201094%200%20018-1l13%2011-1%201-1%202h-2l-1%201v1c-1-1-6%201-7%203l-4-2-4-3-3%202c-2%203-2%203-5%201l-4-4-6-4-2-2-1-1-1%201c0%201-3%202-4%201h-2v1l2%201-4%201c-4%200-2-3%205-8%204-3%205-4%204-6l1-2c1-1%201%200%201%201%200%202%200%202%201%201%202-1%202-1%200-3l-1-4-3-4c-4-3-5-6-3-8l-6-7c-7-6-7-6-10-4-2%201-2%201-5-1l-4-4c0-2-2-4-4-6l-3-5-1-2c-2%200-2%201-1%202l-1%202c-1-1-21%2010-20%2012h-1l-1%201%202%201c1-3%208%206%208%2010%201%203%204%2010%205%208l5%205c3%202%206%206%209%207l10%209c5%206%206%206%205%209-1%202-1%203%204%208l6%205%203%203%202%202v-3l2%201c0%202%203%202%205%201l5-1c2%201%202%201%200%202l-2%202h3l-2%203c-2%201-2%203-2%204v4l-1%201-2%203c0%204%200%204%201%203%203-2%203-1%202%202l-1%203h-1l-1%201v1l-1%201%203-1c2-2%203-4%204-12l2-11%2010%208c4%205%209%208%209%208l1%202c0%202%200%202%201%201%202-1%202-1%202%201l2%201%201%201v2c-2%202-1%203%201%201%203-2%203-7%201-5v-2h-3l1-2h4a153%20153%200%200021%2020%202598%202598%200%200036%2029c5%200%206%200%207-2s1-2%203-1c2%202%207-1%206-4l2-2v-3l1-3h1l-1-2v-7l-1-2c-1-1-1-1-1%202v3l-5-4c-4-3-5-5-5-7h-1c0%202%200%202-2%200s-2-5%201-3h1l-9-10c-9-7-9-7-13-6-4%200-4%200-10-5l-9-7-2-4%201-2%201-3%201-1%201-1h1v8l5-4%205-4%202%202%202%202-1-3c-2-2-2-2-1-3l2-2h-1l-1-1c1-1-1-1-4%201-5%202-4%201%200-3l5-3-3-2-7-6c-4-3-8-3-5%200%202%202%202%204%201%204l-2-1-3-1c-3%201-3%200-3-3%200-2%201-3%202-3%202-1%202-2%202-4l1-1%201%201%203-1c4-3%206-4%206-1l1%201v-3c-1-1%202-3%207-6%208-5%208-5%208-9l1-4v3l1%203%206-4%208-4v-1l1-1%201-1-1-8v-3l1-1-2-1h-2l1-1%201-1h-3c0-1-1-2-2-1v-1c3-2%202-3%200-2-3%202-3%201-1-1v-3h-3c1-3-3-3-6%200h-4c1%201-1%203-4%205-6%202-6%202-8%201-3-2-3-2-2-5v-4c0-1%201-2%203-1%203%200%203%200%202%201l-1%201h2l3-3h2l1%201c2%200%203-2%204-4l4-6%205-3%202-1h1l1%201v2l-1%201c1%201%209-3%209-4l-2-1%201-1%201-2v-1l1-9-1%201v1l-1-1-4-1h-3c0-1-6-1-7%201l-1-1-2-1-2%201h-7m-119%2056l-6%203%204%203c4%202%205%203%209%201%201-1%203-2%204-1%203%200%203-2%200-4l-4-4c0-2-1-2-7%202m172%207l-1%203v2c0%202-1%203-3%202l-1%201v3l-1%202-1-1v4l-1%205-3%203-3%202h5c-1%201%200%202%201%203%201%202-1%204-4%203l1%201%201%203%202%202c4%201%204%202%201%201-4%200-5%201-3%203%201%201%202%202%201%203h1c2-2%201%201-3%204-3%203-4%204-3%206l1%203%204%201c4%202%208%202%209%200h2l1%201v-4l-2%201c-2%202-3%201-3-4%201-4%201-5-1-5-1-1-1-1%201-1s4-2%202-2v-5c-1-2-1-3%201-3h4c1%200%202%200%201-2l-1-1-1-1c-1-1%200-3%203-5l2-4-5%204-4%203%201-8c1-2%200-13-1-14v-2c2-1%203-10%201-10l-1%203M1%20178c0%2011%200%2012%202%2012%203%201%205%200%203-1-1-1%200-2%204-4l5-3h2v-1c-1-1-1-1%201-1h1l-1-1-3-5c-3-3-4-5-3-6H9c-2%202-3%202-3%201l-1-2v2H4l-1-1-1-1c-1-1-1%203-1%2011m109%201l1%203c2%201%202%202%201%202l2%205%204%202c0-2%201-2%204-2l4%201%201%201v-1c0-1%201-2%203-2%204%200%205-1%205-3-1-2-2-2-9-2-8%201-8%201-11-3-3-3-4-4-5-1m31%201l-3%203%203%202a243%20243%200%200116%2014l3-3%203-2-3%201-4%202-4-4c-4-3-5-5-3-5%204%201%204%200%202-3s-4-4-6-1c-2%202-3%201-2-1l2-1v-4l-1-1-3%203m3%2023l3%204%203%203-5%203c-5%203-7%206-3%204l1%201-1%201c-1-1-1%200%200%200%200%202%200%202-1%201-2%200-2%201%200%203h2c0-1%206%203%206%205l-9%207c-1-2-10-2-10-1l5%201c6%200%206-1-14%2012l-19%2013H90l1-1-4-7-6-6c-1%201-4-2-6-5l-5-6-3%202c-2%201-3%203-2%204h1l2%203c0%202%201%203%202%203v-3l1%202v2l2%202%209%2014%201%201-1%201-3%201-3%202c-2%200-10%206-9%207l-1%201v1h-1c-1-1-2%200-4%202-3%203-4%204-1%204%201-1%202%200%202%201l7%201c7%200%207%200%206-2l-1-4c0-2%201-1%203%202%203%205%206%205%207%201l2-3v-1c0-2%205-7%206-7l3%203%202%203v2c-1%201-1%201%201%201%203-1%204-1%208%202s15%204%2019%201h4v-1l-2-3h1c1%201%202%202%203%201v1h1l1%201v1l2-1h1l1-2h-1l-2%201c-2%200%203-4%204-4v2l1%201%202-1%201-1%201-1h1l1-1h3v-2c2%200%2011-7%2011-8%200-2%200-2-3-1l-3%202%205-5%206-3%202%202c0%202%201%202%201%201v-2c-2-2-2-2%201-4%203-3%203-3%203%201%201%202%201%202%201-1v-4l2%203c1%205%201%205-1%205v1h2l1%201v1h1v1h1v1h2l1%201v1l1%201v1h1l3%201c2%200%202%200%200%202-1%201-2%202-1%204%201%203-1%203-5-2l-4-3c-1%200%201%203%204%205l5%205%209-7c6-3%209-7%209-7l-1-2-2-1c-4%201-5-1-2-2%202-1%202-1%201-2v-1c3%201%205%200%203-1v-1c3%201%202-3-1-5l-3-5c0-2%200-2-1-1v3c1%202-1%206-3%206l-2-1-1-2h-2c-3%201-4%200-5-4v-1h1l-1-2v-1c2%200-2-13-5-16v-1l-1-1v-1c3-2-1-1-4%201-3%201-4%202-5%201v-1a339%20339%200%20018-6l-1-2c-3-3-3-5-1-5v-1l-4%201c-3%202-5%202-3%200%203-2%202-3%200-3-2-1-2%200-2%201v3c1%201%201%202-1%203-2%202-2%201-7-4l-6-5-4-4-4-2m-109%204l-1%201-15%209%207%2012%2010%2015c2%204%202%204%204%203a435%20435%200%200112-9c-2%201-2%200-2-1%200-2%202-3%202%200h4c1-1-3-8-6-11l-7-10c-6-9-8-12-8-9m66%20112c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m31%200c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m121%2047c3%204%206%206%207%206%202%200%205-3%209-6l6-5h-28l6%205'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMEAf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHJWdJeIjXMXKD/xAAbEAADAAMBAQAAAAAAAAAAAAAAAQIDERITIv/aAAgBAQABBQKEV9ndI62doetzjn0zSpR//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAESUf/aAAgBAwEBPwGWSymU9P/EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwFcj//EABwQAAICAgMAAAAAAAAAAAAAAAABECERYQIxUf/aAAgBAQAGPwLcYLeNDs7OK9RUf//EAB0QAAIDAAIDAAAAAAAAAAAAAAERACExQVFhcYH/2gAIAQEAAT8hBovyyIVaNMJjFqsgaCgOAjgFDrPMP3OoUU003AxFa2fJ/9oADAMBAAIAAwAAABBv/wCC/8QAFhEBAQEAAAAAAAAAAAAAAAAAAGEB/9oACAEDAQE/EI6jqurn/8QAFxEBAQEBAAAAAAAAAAAAAAAAABEBUf/aAAgBAgEBPxC4hMRx/8QAHhAAAgICAgMAAAAAAAAAAAAAAREAITFxQVFhofD/2gAIAQEAAT8QEIEgpBlxqN0YsKH24VdjFoAq84XqMgjFBFUwR35hREGcqNe45qpPlQwHtIMWtxi6T//Z","aspectRatio":1,"src":"/static/e1b0c4b179faa72db32da6b7efb166c0/eaa58/scrumpoker.jpg","srcSet":"/static/e1b0c4b179faa72db32da6b7efb166c0/5a3ee/scrumpoker.jpg 114w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/41f8f/scrumpoker.jpg 229w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/eaa58/scrumpoker.jpg 457w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/c309b/scrumpoker.jpg 686w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/e3008/scrumpoker.jpg 914w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/0ff54/scrumpoker.jpg 1200w","srcWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/15384/scrumpoker.webp","srcSetWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/31fce/scrumpoker.webp 114w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/e3e25/scrumpoker.webp 229w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/15384/scrumpoker.webp 457w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/0258d/scrumpoker.webp 686w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/64ea2/scrumpoker.webp 914w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/9000d/scrumpoker.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2076a387%20387%200%20003%2074c-1-4%202-3%203%200v3l-1%202c0%202%200%202%201%201l2-1%203%202%201%201c-1%201%200%204%202%204l2%202%202%202%204%201v1l1%201h-1c-2-1-2-1-2%201l1%202v2c-1%202%200%205%201%203%201-1%201-1%201%201v2h3l22-11a4484%204484%200%200141-25l-2-2v-2l2%202c2%202%202%202%204%201%203-1%206%200%204%201v1c2-1%204%201%202%201-1%201-1%201%201%201%201%200%202%200%202%203%201%209%201%2011%203%2011%203-2%201%202-3%203-2%201-3%202-2%203l-1%202v-1c0-1-1-1-4%201-5%202-6%203-5%204s1%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%202c-3%201-4%201-2-1%202%200%202-1%201-1v-5l-2%203c-2%203-2%203-5-3l-3-4%202%206%202%206%201%201%201%201-2%201v-1l-1-1-1%202c1%201%200%201-1%201h-1l-1%202v-1h-3c-2%201-2%201-1%202s1%201-1%202h-2l1-1-1-2h-1c1%201-1%203-6%205-5%203-6%204-5%205v1c-3-1-9%202-7%203v1c-1%200-1%201%201%206l-1%201-2%201h-1v-2c-2%200-2%200-1-1v-1l-2-1-2-1-2%202h-2v1c1%201%201%201-1%201h-1c1%201-12%209-15%208l-1%201h-1l-1%201v1c-1%200-3-1-3-3-1-1-1-2-2-1v5l1%202v3c-1%200-2-1-2-3l-2-5-2-3c-1-5-2-2-2%206l1%208%201%201h2l3-2%202-1c1-1%201-1%201%201l-3%204c-3%202-3%202-1%202%203%200%203%201%201%203-2%201-4%200-4-2%201-1%201-1-1-1l-2%201a2685%202685%200%20000%20154v13h5l5-1h2c1%201%202-1%202-3l2-4c1-2%202-4%201-5v-3c2-1%200-4-1-3-2%200-4-4-2-5%201-1%200-4-1-5v-2c-1%200-1-1%201-3s2-2%203%200c0%202%205%202%207-1%202-2%203-2%202%202%200%203%200%203%201%202s1-1%201%201v2l1-2c1-2%201-2%201%200%200%201%200%202%201%201%202%200%205%202%205%203l3%204%203%203%202-2c2-2%203-4%202-5%200-1%202-2%203%200%200%202%203-3%203-5l-3-1c-3%200-6-2-6-3%200-2%204-2%206%200h2l1%201-1%201c2-1%205%201%204%202l2%203v3l4%201c2%200%203-1%203-2h2c1%201%202%202%203%201%202%200%202%200%201%202v4c1%202%200%203-3%201-2-1-3-1-3%201v2l-1%201-1%201%202%201c3%200%204%202%202%204-3%201-2%202%200%202%202-1%202-1%202%201l-1%202-2%202c-1%201%200%201%206%201l6-1h5c1%202%206-1%207-4l4-3v1l-1%204v3h7l7-1c-1-2%201-5%206-8l3-3-1-1h3l-1-1%201-2c2-2%202-2%201-3s-2-2-1-3l-1-1c-2%201-2%201-2-1%201-1%200-1-1-1-2%201-2-4%201-6l1-3%201-2%201-2c1-2%203-2%206-1h1l18%201h2a495%20495%200%200187%201l2%203%201%203%201%204%201%203v5c2%201%2010%200%2012-2%203-2%205%200%203%203-2%202-2%202%200%202%202%201%202%201%201%202s-1%201%201%201c2%201%202%201%202%205-1%205-1%206-4%203l-2-1-1%202c-2%201-2%204%200%204l1-1h1c0%202%205%201%205%200h2l72%201h72v-14c0-7%200-13-1-12-1%202-1%202-2%201l-1-3-1-1v-6l-1-2c-1-1-1-1%201-2%203-2%204-1%204%204a3201%203201%200%20000-159l1-103V0h-21l4%204c12%2010%2016%2030%209%2044-2%204-5%204-8%201%200-2-2-3-2-2l-4-3-9-7-2-1c-1-2-18-9-19-8l-4-2h-5l-2-1c1-1-3-2-6-1h-3c0-2-1-2-1-1h-3l-2-1c-2%202-1-3%201-8l7-9%205-5h-17l-17%201h-16v2l1%201c-1%201-7-2-7-3l-7-1c-8%200-10%201-6%203%202%200%202%200%201%201-2%201-3%200-5-2-2-3-4-2-2%201%202%202-2%205-6%204-4-2-5-4-2-4l4-2c2-1-1-1-27-1-27%200-34%201-31%202h2c2%200%202%200%201%202v4l-1%201h-2l-2%201c-1-1-2%200-2%201l-2%201%201%201c1%201%202%201%201%202-2%200-1%202%201%202l3-3c1-1%202-2%204-1%202%200%203%200%203-2l3-2c2-1%202%200%202%203l-1%204-1%202%203%201c2%200%204%200%207%203%202%202%203%203%204%202h2c1%201%202%202%203%201%202%200%201%201-1%203-1%201-1%201%201%201s5%202%205%203l-2%201%202%202c2%201%203%202%203%204l3%206c3%204%204%206%201%206l-1%201%203%201%204%201h4c3-1%203-1%204%202%202%203%200%208-3%206h-4%201c2%200%206%205%206%208%200%202-1%203-2%201-1-1-1%200-1%201%200%202-1%203-3%204s-3%203-2%203c0%201-1%202-3%202l-3%202-1%201c-1-1-8%204-9%205l-2%201-3%201c-2%202-6%200-5-2l-1-1v3l-1%203v2c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-5%202-4%203h-2v1c1%201%201%201-1%201h-1v2l5%201c3-1%204%200%204%207%200%205%201%206%202%206%202%200%203%200%203%202s0%202-1%201c-1-3-3%201-3%206%200%203%201%204%204%206%204%203%205%207%202%208v-1l-2-2-2%201c0%203-3%203-5%202v-2c2%200%202-1%202-9-2-23-2-23-5-23l-2%201%201%201h1c0%203-3%202-4-1%200-2-1-3-2-3h-4c-2%200-2%200-1%201v1c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%201%201%201-1%202h-2l-5%201-2%203c1%201%201%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%200%201%201-1%202-2%202-3%200-4-7v-5l-1%205c-1%207-1%207-12%2014l-9%205-12%201c-12%200-16-1-16-4h2c1%202%203%202%2013%201h11l9-6%2010-7c0-2%200-2-3%200l-6%203-3%203-1%201-3%201c-4%202-23%203-25%201l6-1c1%200%202%200%201-1l1-1%201%201h1l2-1%202-1%202-2c3%200%209-4%2010-7l2-4%201-2c0-2%200-2-2-1-3%203-8%205-11%205h-3l3-1%205-2v-1c-2%200-2%200%201-2s5-4%205-6c0-3-2-2-2%201-1%203-1%203-3%202l-1-1-1%202h-7v-1l-2-2c1-2%202-4%202-2s1%203%202%201l-1-4-2-7c0-2%200-2-2-1l-2-1%202-1v-1l2-2h-4c-5%200-6%200-4-1l2-2%202-1h3l1-2%202-4v-1l2-6%201-2c0-3-2-2-3%201l-1%201c0-3%201-5%203-5l1-1c1-1%201%200%201%202%200%205%201%206%204%2010%203%203%204%204%204%209v5l1%204%202%206%201%203c-1%201%200%202%202%201h4l-2%202a1067%201067%200%200145-24c16-9%2016-8%2010-8-4%201-5%201-7-1h-3c-1%202-1%202-3%201v-1l1-1h-1c-2%201-4%200-2-2l-1-1-1%201-2%203v-1l-1-3-1-2v-5c-2-4-2-4-4-2-1%202-2%202-2%201-1-2-3%200-2%204l-1%203v2c0%202-1%203-4%201-2-2-4-2-4%200h-2c-2-1-1-2%201-4l3-3h-3l-3-2-1-1-2%201c0%202-2%201-4-1s-2-2-3%200c-2%201-2%201-3-2s-1-3-3-1c-1%201-1%201-2-1l-4-9h-2c-1%200-1-1%201-2v-1h-2l1-1%201-2c-1-3-5-5-6-3l-2%201-1%201v1c-2%200-2-2-1-3%202%200%202-4%200-5l-1%202c1%201%200%202-2%203-4%202-4%203%200%202h3l-3%201c-3%202-5%202-4-1l-1-1v-4l2-3%203-1h-3l-2-1v-4c0-2%201-3%202-3l1-2c1-1%200-1-1-1-4%200-5%200-3-1l-1-2h-1l-1%202-2%201c-1%201-6%200-6-2l1-2%203-2c2-2%204-2%204-1h3c2%200%203%201%204%203%202%205%203%206%206%205%202-1%203%200%205%202s3%202%205%202h7c2-1%204%200%202%201v1l3-1v-4l-1-4-1-2v-1l-1-1%201-2%201-1-1-1c-2%200-2-2-1-4h10l2-2c4%200%205-2%203-4-2-1-1-4%201-3l1-1h5l1%202-1%201%202%201%203%201c1%201%201%200%201-2%200-5%200-6%203-4%201%201%202%201%203-1%201-1-1-1-15-1-16%200-17%200-16%202%201%201%201%201-1%202l-2%202h-4c-1-1-1-1%201-3%204-2%204-3%201-3-1%200-2%200-1%201l-1%201-3%201-2%202-3-2-3-3H0v76m0%201c0%2047%201%2057%201%2024%200-46%200-52%202-51l1-1-1-1c-3%200-3-30-1-32v-2L1%207%200%2077m325-36c-2%200-1%203%201%203l2%201%203%203%205%202c2%201%202%201%202-1l2%201c2%203%206%203%208%200l3-2%201-1-1-1c-3%201-8-1-8-3l-2-1-1%202c1%202-5%201-8-1-2-2-5-3-7-2M122%2052c-1%201-2%204-1%207%200%202%200%203-1%202%200-2-2-1-2%201l-1%201c-2%200-1%202%202%203%202%201%203%201%208-2l5-3c0-2-3-3-4-2l-3%201c-2%201-2%201-1-1V49l-2%203M53%2062l-9%206-3%203%202%202h3c1-1%201-1%201%201h1l1-1v1c0%202%202%204%204%203v1c0%202-1%202-4%200l-2-1%203%203c1%201%202%202%201%203l1%201h1v4l1%202%201-3c0-1%200-2%201-1%202%200%201-1-1-3-1-1-1-1%201-2s2-1%201-3c0-2%200-2%201-1l1-2c-1-4%200-4%201%200%201%202%201%202%202%201l-2-4v-2l1%201h1l1-2c0-3%200-5%201-3h1l3-1v1l-1%203-1%204c-1%201%200%202%201%204%202%201%203%203%201%203h-3l-3%201%202%202c2%202%202%203%200%204h-2l-1%201%201%201%201%201h-1c-1-1-5%202-4%203h1l2-1-1%203v2c1%201%201%201%202-1%201-3%206-8%207-7v-1c-1-1-1-1%200%200l1-1v-1c2%202%202-1%200-2l-1-2%203%201c0%202%204%201%207-1h8c8%202%2010%203%203%202-7%200-11%200-16%204-6%204-8%206-6%208v2l-1%202c1%202%203%201%203%200-1-3%201-2%206%204l4%205c-2-1-3%201%200%201h2c-2-2%201-1%204%202l1%203c-3-1-3%200-1%201l3%201%205%203c5%204%205%205%202%2011l1%202%202-3c0-2%201-3%202-3v-2h2l4-1c1-3%200-7-2-7l-2%201v2c0%203-1%204-2%203l-1-5c0-2%200-3-2-4-3-2-1-4%202-3%202%200%202%200%201-2-2-2-4-3-6-1-1%201-2%200-5-2l-4-3%205-2c4-2%204-2%205-1l2%202%201%201c1%202%202%203%204%203%204%200%206-2%203-2l-3-2v-2l1-1%201-1c4%200%204-1%201-4l-9-8h-1l-1-1c1-1%200-2-1-4l-2-2%207-4c9-4%209-4%205-7l-3-2-8%204c-8%204-12%205-9%201%202-1%200-3-1-1-1%201-3%200-6-2-5-5-6-5-10-4h-3l2-1%202-1h-1l-3-1c-1-3-5-2-11%201m259%2030l-2%202h-4c-2%200-2%202%201%204%202%202%202%202%203%201h1c1%202%200%205-1%203l-2-1v1l-1%201h-1c0%201%202%203%204%203s2%200%200%203l-2%203%202%201%202%202%201%201h1l-1%202h-2c1-2%200-3-2-2s-2%201-1%202c2%201%201%202-3%204-5%202-5%203-3%204l1%202-4-2-4-2h-1l-3-1c-4%201-3%203%201%203%201-1%202%200%203%201s2%202%203%201l2%201-1%201c-2%200-1%203%201%205l3%205%201%202v2c0%201%202%202%203%200h1c1%202%201%203-1%202-2%200-2%200-1%202l1%203v1l1%201%202-1-1-1c-1%200-1-1%201-1%202-2%203-2%203%200h3c3-2%204-3%201-3l-1-1v-5l3-7c1-3%202-5%201-7s-1-2-4%200h-3c-1-1%205-4%208-4v2h1c1-2%205%207%205%2011%200%203%202%205%205%204l1-6c-1-6-1-6%201-5l1%201c0-1%200-2%201-1l1-4c0-3%200-3%201-1%202%206%200%2014-3%2012-1-1-1-1-1%201%201%204-6%208-8%204%200-2-2-3-3-3l-1%202h-2c-2%200-3%201%200%203h2l1-1h2v2h-1v1h-2v1l-4%204c-6%204-6%204-6%201-1-2-1-2-1%200l-1%203c-2%200%200%201%203%202l2-1c0-2%204%203%204%205s-4%206-10%208c-4%202-9%202-13%201-3-2-3-2-6%201l-4%201-2-1%201%202-5%205c-6%204-7%205-6%203l-1-2-1%202c1%201%200%202-1%203-3%202-2%203%201%203%208-2%209-2%208%201l1%203%201-1h1v3l1%202%201%201%201%201h-1l-2%201%202%201%201%202h2c4-3%204-2%203%201%200%203%202%206%204%204%201-4%205%200%204%203v4l-4%201-2%202-1%201-2%201%202%201%201-1h3l2-1c0-3%202-2%204%200l4%202%202%201c0%202%201%202%203%201h1c0%202-1%202-3%202l-1%201c-1%201%201%204%203%204l1%201c1%201%201%200%201-1-1-2%201-2%205%202l2%201%201%201c1%201%201%201%204-1%202-3%203-3%204-2h4c1-1%202%200%203%202l1%202h-4l-2%201-3%202c-4%202-2%206%201%204l2%201-3%201c-2%200-4%202-2%202v1l-1%202-2%201h-1c3%200%202%203-1%204-4%202-2%203%203%203l4-1v8l-1%207c-1%207-1%207%201%205%202-1%202-1%202%203v3l-2-2-3-1%202%203%201%202h-5c-3%202-2%203%201%202%203%200%203%200%202%201l1%201h2l15%201c15%200%2016%200%2018-2s2-3%201-3c-3-1-2-3%200-3s5-2%204-3l1-2%201-1h-1l-1-2%201-4%202-1%201%204%202%201v2l-2%202c1%201%2021-18%2021-21%200-2-8-9-12-10-2-1-3%200-29%2023l-13%2012-3-2-3-1v-10c0-9%201-13%204-13%201%200%205-5%204-6l1-1c1%201%201%200%201-2s0-3%202-5c3-2%204-6%202-6v-1l1-2%205-1c6%200%206-1%200-4l-6-3h-2c-2%200-2%200-1-2l-1-3-1%201-1%202c-3%201-6-1-4-4h5c-1-1%200-1%201-1%202%200%201-5-2-8v-2c2-1%203-3%201-3-3%200-5%200-3-1s2-1%201-3v-1l3%201h3l-3-1-2-1%202-2c2-1%202-1%201-2l-2-3h-1l-2%202%201-2c2-2%203-3%201-3-2-1-2-1-2%201h-1c-2%200-3%201-2%203l-1%201c-2-1-2-5-1-6l1%201h2l1-3v-1l1%201%201%201v-11c1-3%200-5-1-4-2%201-2%200-1-6v-8l-4%203c-5%204-5%205-5%203l1-2c2%200%204-3%204-4l2-1c2%200%203%201%203%202h3l-1-2-2-1%203-1%204-12v-10l-4-14-2-3v-2c1-1%201-1-1-1l-1-2-1-1h-1c-1%201-4%200-4-1h1l1-1%201-1v-1l-1-1-1-2-1%202c0%202%200%202-1%201v-2l-2-1v-3h1c1%201%201%201%201-1l-1-2h-2c-1-1-2-1-3%201l-2%203v-3l-1-2c-3-1-5%201-5%203h-3v-2l1-1-1-1-1%201M29%20104l-8%205h-2l2%203c3%203%204%204%205%203l6-6c-2%200-2-3%201-4%203-2%207-1%205%201h3c2-1%202-2-1-4l-2-3-9%205m245-1l-5%205-2%201-1%201h-1l-1%201c-2-1-4%200-3%201l-1%201h-1l-2%202-1%201c1%201%201%208-1%208-2%201-2%201-2%203h3l-1%203h-2l-2%202v11c-2%202-2%202%200%202v7l4-2%204-2-4%204a244%20244%200%2000-18%2011l-4-2c-5-3-6-3-13%202-5%203-6%204-7%202l-3-1v4c-2%202%200%205%201%203%202-1%203%200%202%202v2l1%201v1c1%201%201%201-1%201h-1c1%201-3%203-6%203v2c-1%201%200%201%201%201%204%200%209-4%209-6v-3l1%201c0%201%203%202%204%201s3%200%206%203c2%202%205%203%207%203%203%200%203%201%203%206h4c2%200%203%200%202%201-1%203%203%205%204%202%202-1%202-1%202%203%200%202%200%203-1%201l-1-1c-2%200-1%207%201%208%203%203%200%202-4-1-3-2-4-4-3-5l-1-2-1%201c1%201%200%202-1%202l-1-1-9-9c-8-7-9-7-11-6l-5%203a1094%201094%200%20018-1l13%2011-1%201-1%202h-2l-1%201v1c-1-1-6%201-7%203l-4-2-4-3-3%202c-2%203-2%203-5%201l-4-4-6-4-2-2-1-1-1%201c0%201-3%202-4%201h-2v1l2%201-4%201c-4%200-2-3%205-8%204-3%205-4%204-6l1-2c1-1%201%200%201%201%200%202%200%202%201%201%202-1%202-1%200-3l-1-4-3-4c-4-3-5-6-3-8l-6-7c-7-6-7-6-10-4-2%201-2%201-5-1l-4-4c0-2-2-4-4-6l-3-5-1-2c-2%200-2%201-1%202l-1%202c-1-1-21%2010-20%2012h-1l-1%201%202%201c1-3%208%206%208%2010%201%203%204%2010%205%208l5%205c3%202%206%206%209%207l10%209c5%206%206%206%205%209-1%202-1%203%204%208l6%205%203%203%202%202v-3l2%201c0%202%203%202%205%201l5-1c2%201%202%201%200%202l-2%202h3l-2%203c-2%201-2%203-2%204v4l-1%201-2%203c0%204%200%204%201%203%203-2%203-1%202%202l-1%203h-1l-1%201v1l-1%201%203-1c2-2%203-4%204-12l2-11%2010%208c4%205%209%208%209%208l1%202c0%202%200%202%201%201%202-1%202-1%202%201l2%201%201%201v2c-2%202-1%203%201%201%203-2%203-7%201-5v-2h-3l1-2h4a153%20153%200%200021%2020%202598%202598%200%200036%2029c5%200%206%200%207-2s1-2%203-1c2%202%207-1%206-4l2-2v-3l1-3h1l-1-2v-7l-1-2c-1-1-1-1-1%202v3l-5-4c-4-3-5-5-5-7h-1c0%202%200%202-2%200s-2-5%201-3h1l-9-10c-9-7-9-7-13-6-4%200-4%200-10-5l-9-7-2-4%201-2%201-3%201-1%201-1h1v8l5-4%205-4%202%202%202%202-1-3c-2-2-2-2-1-3l2-2h-1l-1-1c1-1-1-1-4%201-5%202-4%201%200-3l5-3-3-2-7-6c-4-3-8-3-5%200%202%202%202%204%201%204l-2-1-3-1c-3%201-3%200-3-3%200-2%201-3%202-3%202-1%202-2%202-4l1-1%201%201%203-1c4-3%206-4%206-1l1%201v-3c-1-1%202-3%207-6%208-5%208-5%208-9l1-4v3l1%203%206-4%208-4v-1l1-1%201-1-1-8v-3l1-1-2-1h-2l1-1%201-1h-3c0-1-1-2-2-1v-1c3-2%202-3%200-2-3%202-3%201-1-1v-3h-3c1-3-3-3-6%200h-4c1%201-1%203-4%205-6%202-6%202-8%201-3-2-3-2-2-5v-4c0-1%201-2%203-1%203%200%203%200%202%201l-1%201h2l3-3h2l1%201c2%200%203-2%204-4l4-6%205-3%202-1h1l1%201v2l-1%201c1%201%209-3%209-4l-2-1%201-1%201-2v-1l1-9-1%201v1l-1-1-4-1h-3c0-1-6-1-7%201l-1-1-2-1-2%201h-7m-119%2056l-6%203%204%203c4%202%205%203%209%201%201-1%203-2%204-1%203%200%203-2%200-4l-4-4c0-2-1-2-7%202m172%207l-1%203v2c0%202-1%203-3%202l-1%201v3l-1%202-1-1v4l-1%205-3%203-3%202h5c-1%201%200%202%201%203%201%202-1%204-4%203l1%201%201%203%202%202c4%201%204%202%201%201-4%200-5%201-3%203%201%201%202%202%201%203h1c2-2%201%201-3%204-3%203-4%204-3%206l1%203%204%201c4%202%208%202%209%200h2l1%201v-4l-2%201c-2%202-3%201-3-4%201-4%201-5-1-5-1-1-1-1%201-1s4-2%202-2v-5c-1-2-1-3%201-3h4c1%200%202%200%201-2l-1-1-1-1c-1-1%200-3%203-5l2-4-5%204-4%203%201-8c1-2%200-13-1-14v-2c2-1%203-10%201-10l-1%203M1%20178c0%2011%200%2012%202%2012%203%201%205%200%203-1-1-1%200-2%204-4l5-3h2v-1c-1-1-1-1%201-1h1l-1-1-3-5c-3-3-4-5-3-6H9c-2%202-3%202-3%201l-1-2v2H4l-1-1-1-1c-1-1-1%203-1%2011m109%201l1%203c2%201%202%202%201%202l2%205%204%202c0-2%201-2%204-2l4%201%201%201v-1c0-1%201-2%203-2%204%200%205-1%205-3-1-2-2-2-9-2-8%201-8%201-11-3-3-3-4-4-5-1m31%201l-3%203%203%202a243%20243%200%200116%2014l3-3%203-2-3%201-4%202-4-4c-4-3-5-5-3-5%204%201%204%200%202-3s-4-4-6-1c-2%202-3%201-2-1l2-1v-4l-1-1-3%203m3%2023l3%204%203%203-5%203c-5%203-7%206-3%204l1%201-1%201c-1-1-1%200%200%200%200%202%200%202-1%201-2%200-2%201%200%203h2c0-1%206%203%206%205l-9%207c-1-2-10-2-10-1l5%201c6%200%206-1-14%2012l-19%2013H90l1-1-4-7-6-6c-1%201-4-2-6-5l-5-6-3%202c-2%201-3%203-2%204h1l2%203c0%202%201%203%202%203v-3l1%202v2l2%202%209%2014%201%201-1%201-3%201-3%202c-2%200-10%206-9%207l-1%201v1h-1c-1-1-2%200-4%202-3%203-4%204-1%204%201-1%202%200%202%201l7%201c7%200%207%200%206-2l-1-4c0-2%201-1%203%202%203%205%206%205%207%201l2-3v-1c0-2%205-7%206-7l3%203%202%203v2c-1%201-1%201%201%201%203-1%204-1%208%202s15%204%2019%201h4v-1l-2-3h1c1%201%202%202%203%201v1h1l1%201v1l2-1h1l1-2h-1l-2%201c-2%200%203-4%204-4v2l1%201%202-1%201-1%201-1h1l1-1h3v-2c2%200%2011-7%2011-8%200-2%200-2-3-1l-3%202%205-5%206-3%202%202c0%202%201%202%201%201v-2c-2-2-2-2%201-4%203-3%203-3%203%201%201%202%201%202%201-1v-4l2%203c1%205%201%205-1%205v1h2l1%201v1h1v1h1v1h2l1%201v1l1%201v1h1l3%201c2%200%202%200%200%202-1%201-2%202-1%204%201%203-1%203-5-2l-4-3c-1%200%201%203%204%205l5%205%209-7c6-3%209-7%209-7l-1-2-2-1c-4%201-5-1-2-2%202-1%202-1%201-2v-1c3%201%205%200%203-1v-1c3%201%202-3-1-5l-3-5c0-2%200-2-1-1v3c1%202-1%206-3%206l-2-1-1-2h-2c-3%201-4%200-5-4v-1h1l-1-2v-1c2%200-2-13-5-16v-1l-1-1v-1c3-2-1-1-4%201-3%201-4%202-5%201v-1a339%20339%200%20018-6l-1-2c-3-3-3-5-1-5v-1l-4%201c-3%202-5%202-3%200%203-2%202-3%200-3-2-1-2%200-2%201v3c1%201%201%202-1%203-2%202-2%201-7-4l-6-5-4-4-4-2m-109%204l-1%201-15%209%207%2012%2010%2015c2%204%202%204%204%203a435%20435%200%200112-9c-2%201-2%200-2-1%200-2%202-3%202%200h4c1-1-3-8-6-11l-7-10c-6-9-8-12-8-9m66%20112c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m31%200c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m121%2047c3%204%206%206%207%206%202%200%205-3%209-6l6-5h-28l6%205'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/e1b0c4b179faa72db32da6b7efb166c0/0ff54/scrumpoker.jpg"}}},{"id":"def77ef4-19fa-52e0-aeee-70b25b5d28ca","slug":"/flipper-postman-esp32s2","secret":false,"title":"Flipper postman esp32s2","author":"Luke Celitan","date":"November 10th, 2024","dateForSEO":"2024-11-10T00:00:00.000Z","timeToRead":4,"excerpt":"Custom flash software for Flipper Dev Board exposing the WIFI and HTTP methods via serial (UART) that can be picked up by the flipper zero device for building web enabled applications.","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"Flipper postman esp32s2\",\n  \"excerpt\": \"Custom flash software for Flipper Dev Board exposing the WIFI and HTTP methods via serial (UART) that can be picked up by the flipper zero device for building web enabled applications.\",\n  \"date\": \"2024-11-10T00:00:00.000Z\",\n  \"hero\": \"foldersCover.jpg\",\n  \"author\": \"Luke Celitan\",\n  \"appDescription\": \"Productivity\",\n  \"category\": \"Project\",\n  \"tech\": [\"C\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h2\", {\n    \"id\": \"project-overview\"\n  }, \"Project Overview\"), mdx(\"p\", null, \"Hey there, fellow tinkerers and security enthusiasts! SpaceGhost here, and I\\u2019ve got an exciting project to share with you. My recent adventures with Flipper device programming have led me down another fascinating rabbit hole. This time, I\\u2019ve embarked on a mission to bring network capabilities to the Flipper Zero by developing custom firmware for the official ESP32 chip board.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1280px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"42.578125%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/webp;base64,UklGRl4AAABXRUJQVlA4IFIAAACQAwCdASoUAAkAPtFUo0uoJKMhsAgBABoJZwDImB7A9pIx27MAAP72EzwBsBK2dDkVYXITtKAnRPgPfbSEjF0SSWKtnbbnyTLVuY2NsFHQ4gAA')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/92290f2c14160787412489f9ff0a712d/4b075/schematics.webp 1280w\"],\n    \"sizes\": \"(max-width: 1280px) 100vw, 1280px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/92290f2c14160787412489f9ff0a712d/4b075/schematics.webp 1280w\"],\n    \"sizes\": \"(max-width: 1280px) 100vw, 1280px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/92290f2c14160787412489f9ff0a712d/4b075/schematics.webp\",\n    \"alt\": \"Flipper Dev Board\",\n    \"title\": \"Flipper Dev Board\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \"), \"\\n\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Image source: \", mdx(\"a\", {\n    parentName: \"em\",\n    \"href\": \"https://docs.flipper.net/development/hardware/wifi-developer-board/schematics\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://docs.flipper.net/development/hardware/wifi-developer-board/schematics\"))), mdx(\"h2\", {\n    \"id\": \"the-power-of-esp32\"\n  }, \"The Power of ESP32\"), mdx(\"p\", null, \"Before we dive into the project details, let\\u2019s take a moment to appreciate the ESP32 chip. Developed by Espressif Systems, this little powerhouse has become a favorite in the IoT and embedded systems world. Here\\u2019s a quick rundown of its impressive capabilities:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Dual-core processor running at up to 240 MHz\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Wi-Fi and Bluetooth connectivity\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Robust security features\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"A plethora of peripherals and interfaces\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Low power modes for energy-efficient operation\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Extensive development support\")), mdx(\"p\", null, \"With these features, the ESP32 is perfectly suited for our goal of enhancing the Flipper Zero\\u2019s capabilities.\"), mdx(\"h2\", {\n    \"id\": \"project-flipper-postman-esp32-s2\"\n  }, \"Project: Flipper Postman ESP32-S2\"), mdx(\"p\", null, \"Our project, which I\\u2019ve dubbed \\u201CFlipper Postman ESP32-S2,\\u201D aims to create custom flash software for the Flipper Dev Board. This software exposes WiFi and HTTP methods via serial (UART), allowing the Flipper Zero to pick them up and build web-enabled applications.\"), mdx(\"h3\", {\n    \"id\": \"key-features\"\n  }, \"Key Features\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"WiFi network management (connect, disconnect, list networks)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"HTTP requests (GET, POST, PATCH, STREAM)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Custom HTTP request builder\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"UDP communication\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"LED indicators for various states\")), mdx(\"h3\", {\n    \"id\": \"how-it-works\"\n  }, \"How It Works\"), mdx(\"p\", null, \"The custom firmware acts as a bridge between the Flipper Zero and the internet. Here\\u2019s a simplified workflow:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Flash the custom firmware onto the ESP32-S2 board.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Connect the board to the Flipper Zero.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Use UART commands to control WiFi connections and make HTTP requests.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"The ESP32-S2 handles the network operations and returns the results to the Flipper Zero.\")), mdx(\"p\", null, \"This setup essentially turns your Flipper Zero into a pocket-sized web client, opening up a world of possibilities for security testing, IoT experimentation, and more.\"), mdx(\"h2\", {\n    \"id\": \"potential-applications\"\n  }, \"Potential Applications\"), mdx(\"p\", null, \"With this new capability, we can explore several exciting avenues:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"WiFi Penetration Testing\"), \": Create portable tools for network scanning, deauthentication attacks, and security audits.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"IoT Device Emulation\"), \": Simulate various IoT devices to test network security or set up honeypots.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Remote Control and Monitoring\"), \": Implement web interfaces or mobile apps to control your Flipper Zero remotely.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Mesh Networking\"), \": Develop networks of multiple Flipper devices for distributed tasks or long-range communication.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Signal Processing and SDR\"), \": Implement basic software-defined radio functionalities or create spectrum analyzers.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Network Protocol Analysis\"), \": Build portable packet sniffers, protocol analyzers, and debugging tools.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Environmental Sensing\"), \": Integrate various sensors for portable weather stations or environmental monitoring.\"))), mdx(\"h2\", {\n    \"id\": \"project-information\"\n  }, \"Project Information\"), mdx(\"p\", null, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/MassivDash/flipper-postman-esp32s2\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Github repo\")), mdx(\"p\", null, \"Custom flash software for Flipper Dev Board exposing the WIFI and HTTP methods via serial (UART) that can be picked up by the flipper zero device for building web enabled applications.\"), mdx(\"h2\", {\n    \"id\": \"features\"\n  }, \"Features\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Connect / Disonnect to WiFi networks\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"List available WiFi networks\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Make HTTP GET, POST, PATCH and STREAM requests\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Custom HTTP request builder with all the methods GET, POST, HEAD, DELETE, PATCH, PUT, attach custom headers (Authorization), show and hide response headers\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Stream serial responses for large payloads.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"UDP communication, send commands and messages over the network via UDP packets\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"LED indicators for different states\")), mdx(\"h2\", {\n    \"id\": \"udp--network-communication\"\n  }, \"UDP / Network communication\"), mdx(\"p\", null, \"After you establish wifi the board listens to UDP packets you can use mobile apps (with TCP/UDP) or use cmd line tools like \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"echo -n \\\"GET https://api.spacexdata.com/v3/rockets\\\" | nc -u 192.168.0.115 1234\"), \".\"), mdx(\"p\", null, \"The board will transmit the local port and into the serial\"), mdx(\"p\", null, \"You can also send custom messages to the flipper, type MESSAGE: {your text} for transmitting whatever you want to your flipper device.\"), mdx(\"h2\", {\n    \"id\": \"flipper-zero-uart-terminal\"\n  }, \"Flipper Zero Uart Terminal\"), mdx(\"p\", null, \"You can use the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/cool4uma/UART_Terminal\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://github.com/cool4uma/UART_Terminal\"), \" to communicate directly with the board. You don\\u2019t have to write \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"https://\"), \" it will be auto added by the board.\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"/af0d09d1c03730a10a6c6f5d9351680d/flipper-uart-terminal.gif\",\n    \"alt\": \"Flipper UART Terminal\"\n  })), mdx(\"h2\", {\n    \"id\": \"arduino-ide-serial-monitor\"\n  }, \"Arduino Ide Serial Monitor\"), mdx(\"p\", null, \"Communication via usb to flipperzero (GPIO->USB-UART Bridge) with Arduino Ide Serial Monitor\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"/5c5f39e655c45932a093b9de52a5fc6c/flipper-board-serial-monitor.gif\",\n    \"alt\": \"Arduino Ide SerialMonitor\"\n  })), mdx(\"h2\", {\n    \"id\": \"installation-build-from-source\"\n  }, \"Installation (Build from source)\"), mdx(\"ol\", {\n    \"start\": 0\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Git clone the project\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Install \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.arduino.cc/en/software\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Arduino IDE\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Arduino IDE -> Settings (Preferences)\")), mdx(\"p\", null, \"Copy and paste the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json\")), mdx(\"ol\", {\n    \"start\": 3\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Wait for installation\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Arduino IDE -> Tools -> Board -> Board Manager -> look for \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"esp32 by Expressif systems\"), \" and install\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Arduino IDE -> Tools -> Manage Libraries -> find ArduinoJSON package and install\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Arduino IDE -> Select Board -> choose esp32s2 dev board\")), mdx(\"p\", null, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/cool4uma/UART_Terminal\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"UART Terminal Application\"), \". You can also connect flipper to your computer via usb cable then enter GPIO and enable the UART-USB Bridge to communicate directly to board via Arduino IDE Serial Monitor or \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://wiki.emacinc.com/wiki/Getting_Started_With_Minicom\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"minicom\"), \" cmd line program\"), mdx(\"ol\", {\n    \"start\": 7\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Set the SSID and password for the WiFi connection using the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"SET_SSID\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"SET_PASSWORD\"), \" commands.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Activate the WiFi connection using the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"ACTIVATE_WIFI\"), \" command.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Use the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"GET\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"POST\"), \", or \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"GET_STREAM\"), \" commands to make HTTP requests.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Build custom HTTP requests using the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"BUILD_HTTP_*\"), \" commands.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Execute custom HTTP requests using the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"EXECUTE_HTTP_CALL\"), \" command.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Use the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"?\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"HELP\"), \" commands to print help information.\")), mdx(\"h2\", {\n    \"id\": \"serial-api-documentation\"\n  }, \"SERIAL API Documentation\"), mdx(\"p\", null, \"This section provides detailed information about the available commands, their descriptions, arguments, responses, and response types. It also includes the possible serial responses that the receiver can expect.\"), mdx(\"h3\", {\n    \"id\": \"commands\"\n  }, \"Commands\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Command\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Arguments\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Response Type\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Response Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"VERSION\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Get board version\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"VERSION: <version>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_CONNECT <SSID> <password>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Connect to a WiFi network\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<SSID> <password>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_SSID: <SSID><br>WIFI_PASSWORD: <password><br>WIFI_CONNECT: Connecting to WiFi...\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_SET_SSID <ssid>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set the SSID for WiFi connection\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<ssid>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_SSID: <ssid>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_SET_PASSWORD <password>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set the password for WiFi connection\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<password>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_PASSWORD: <password>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_ACTIVATE\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Activate the WiFi connection\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_CONNECT: Connecting to WiFi...\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_DEACTIVATE\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Disconnect from the WiFi network\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_DISCONNECT: Wifi disconnected\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_LIST\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"List available WiFi networks\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_LIST: <list>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_STATUS\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Show WiFi status\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_STATUS: CONNECTED\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_STATUS: DISCONNECTED\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_GET_ACTIVE_SSID\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Get the name of the connected SSID\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_GET_ACTIVE_SSID: <ssid>\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_GET_ACTIVE_SSID: Not connected\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_GET_LOCAL_IP\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Get the local IP address\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<ip_address>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"GET <url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Make an HTTP GET request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"GET: <url><br>STATUS: <number><br>RESPONSE:<br><response><br>RESPONSE_END\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"GET_STREAM <url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Make an HTTP GET request and stream the response\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Stream\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"GET_STREAM: <url><br>STATUS: <number><br>STREAM: <br><streamed data><br>STREAM_END\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"FILE_STREAM <url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Direct stream, no messages\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<stream>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"POST <url> <json_payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Make an HTTP POST request with JSON payload\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url> <json_payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"POST: <url><br>Payload: <json_payload><br>STATUS: <number><br>RESPONSE:<br><response><br>RESPONSE_END\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"POST_STREAM <url> <json_payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Make an HTTP POST request and stream the response\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url> <json_payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Stream\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"POST_STREAM: <url><br>STATUS: <number><br>STREAM: <br><streamed data><br>STREAM_END\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_METHOD <method>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set the HTTP method for custom request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<method>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_SET_METHOD: <method>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_URL <url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set the URL for custom HTTP request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_URL: <url>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_HEADER <key:value>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Add a header to custom HTTP request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<key:value>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_ADD_HEADER: <key:value>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_PAYLOAD <payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set the payload for custom HTTP request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_SET_PAYLOAD: <payload>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"REMOVE_HTTP_HEADER <key>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Remove a header from custom HTTP request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<key>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_REMOVE_HEADER: <key>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"RESET_HTTP_CONFIG\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Reset custom HTTP request configuration\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_CONFIG_RESET: All configurations reset\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_SHOW_RESPONSE_HEADERS <true/false>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Show or hide HTTP response headers\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<true/false>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_BUILDER_SHOW_RESPONSE_HEADERS: <true/false>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_IMPLEMENTATION <STREAM/CALL>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set HTTP implementation type\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<STREAM/CALL>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_SET_IMPLEMENTATION: <STREAM/CALL>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"EXECUTE_HTTP_CALL\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Execute the custom HTTP request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text/Stream\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Depends on implementation type\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_SHOW_CONFIG\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Show current HTTP configuration\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_BUILDER_CONFIG: <current configuration>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"MESSAGE_UDP <message> <remoteIP> <remotePort>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Send UDP message\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<message> <remoteIP> <remotePort>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"UDP message sent: <message><br>To IP: <remoteIP>, Port: <remotePort>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"?\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Print help information\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"Available Commands: <list of commands>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HELP\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Print help information\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"Available Commands: <list of commands>\"))))), mdx(\"h4\", {\n    \"id\": \"sending-commands\"\n  }, \"Sending Commands\"), mdx(\"p\", null, \"To set the SSID for the WiFi connection:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"SET_SSID MyWiFiNetwork\\n\")), mdx(\"p\", null, \"To make an HTTP GET request:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"GET https://api.example.com/data\\n\")), mdx(\"p\", null, \"To make an HTTP GET request and stream the response:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"GET_STREAM https://api.example.com/data\\n\")), mdx(\"p\", null, \"To make an HTTP POST request with a JSON payload:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"POST https://api.example.com/data {\\\"key\\\":\\\"value\\\"}\\n\")), mdx(\"h2\", {\n    \"id\": \"http-builder\"\n  }, \"HTTP Builder\"), mdx(\"p\", null, \"The firmware holds a http config you can manipulate and then execute the call.\\nCheck the flags in the table above.\"), mdx(\"h4\", {\n    \"id\": \"show-response-headers\"\n  }, \"Show response headers\"), mdx(\"p\", null, \"HTTP builder if set for showing headers will only transmit the headers from this list \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"\\\"Content-Type\\\", \\\"Content-Length\\\", \\\"Connection\\\",\\n                                \\\"Date\\\", \\\"Server\\\"\")), mdx(\"h4\", {\n    \"id\": \"simple-build-call\"\n  }, \"Simple Build call\"), mdx(\"p\", null, \"BUILD_HTTP_METHOD HEAD\\nBUILD_HTTP_URL \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://api.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://api.com/\"), \"\\nEXECUTE_HTTP_CALL\"), mdx(\"h4\", {\n    \"id\": \"receiving-responses\"\n  }, \"Receiving Responses\"), mdx(\"p\", null, \"When you send a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"GET_STREAM\"), \" command, you will receive the following responses:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"GET_STREAM request to: https://api.example.com/data\\nSTREAM:\\n<streamed data>\\nSTREAM_END\\n\")), mdx(\"p\", null, \"When you list available WiFi networks:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"WIFI_LIST: Available WiFi networks: <list>\\n\")), mdx(\"h2\", {\n    \"id\": \"notes\"\n  }, \"Notes\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The firmware currently follow strict redirects (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"HTTPC_STRICT_FOLLOW_REDIRECTS\"), \" - strict RFC2616, only requests using GET or HEAD methods will be redirected (using the same method), since the RFC requires end-user confirmation in other cases.)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Website crawls will print html only on smaller websites.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"You should be able to stream files and images to flipper via stream (untested)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Simple get call will make a head call first and determine the possible size of the content, that will not always be possible, if the content length is unknown, firmware will choose safer stream method\")), mdx(\"h2\", {\n    \"id\": \"esp32-links\"\n  }, \"ESP32 links\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"ESP32 Arduino Setup \")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://docs.espressif.com/projects/esp-idf/en/v4.3/esp32s2/api-guides/tools/idf-tools.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"ESP-IDF\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"ESP32S2 Specs\"))), mdx(\"p\", null, \"Author: SpaceGhost @ spaceout.pl\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["C"],"category":"Project","appDescription":"Productivity","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQFA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHKrn6kgNKgWQH/xAAaEAACAwEBAAAAAAAAAAAAAAABAgADEhEE/9oACAEBAAEFAkCknzrmFeSlsNyBRpq1WMoB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEQ/9oACAEDAQE/AUyv/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/AYirr//EAB4QAAEDBAMAAAAAAAAAAAAAAAABETECAxASIkGh/9oACAEBAAY/AuSshtbq2bpSRpyzEekH/8QAGxABAQEBAQADAAAAAAAAAAAAAREAIVFBcaH/2gAIAQEAAT8h/I5cxqQrycgSB5goPDxPnPRsNfm8u+3Qpd9WlTP/2gAMAwEAAgADAAAAEN/wAv/EABcRAAMBAAAAAAAAAAAAAAAAAAABEVH/2gAIAQMBAT8QjwrCso//xAAXEQADAQAAAAAAAAAAAAAAAAAAEVFh/9oACAECAQE/EGg0Gpof/8QAHhABAQACAgIDAAAAAAAAAAAAAREAMSFxQVFhkfD/2gAIAQEAAT8Qi+nsvxiOZBCE2JubmcU1CoPD6yZoSJg8OBx2rH6xqyD1kFVafhwajbyJ1zi0M7c//9k=","aspectRatio":1,"src":"/static/6025f105ff999e2f85121bab83df7fd7/58fe7/foldersCover.jpg","srcSet":"/static/6025f105ff999e2f85121bab83df7fd7/e0f30/foldersCover.jpg 236w,\n/static/6025f105ff999e2f85121bab83df7fd7/86afd/foldersCover.jpg 472w,\n/static/6025f105ff999e2f85121bab83df7fd7/58fe7/foldersCover.jpg 944w,\n/static/6025f105ff999e2f85121bab83df7fd7/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/6025f105ff999e2f85121bab83df7fd7/99fbb/foldersCover.webp","srcSetWebp":"/static/6025f105ff999e2f85121bab83df7fd7/77392/foldersCover.webp 236w,\n/static/6025f105ff999e2f85121bab83df7fd7/1f177/foldersCover.webp 472w,\n/static/6025f105ff999e2f85121bab83df7fd7/99fbb/foldersCover.webp 944w,\n/static/6025f105ff999e2f85121bab83df7fd7/9000d/foldersCover.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%20200v200h52a241%20241%200%200064-2h2l1-2%205-4c6-3%206-5-1-5l-4-1h-3c-3%202-7%202-7%200l3-2%204-2c1-2-9%200-12%202l-5%203c-3%200-8%205-6%205l4-2%203-1%202%201c2%201%201%201-2%202-9%203-12%203-14%201l-4-1h-5l-2%201c-1-1-10%201-13%203l-4%202c-1-1%202-4%207-5l4-2h-8l-10%201c-2%201-5%202-7%201-4%200-5-1-2-1l4-1c0-1-12-1-23%201l-14%201-7%201-1-6v-6h12a732%20732%200%200126%204c0%202%200%202%201%201s9-3%209-1h4l7%201c1%201%200%201-5%201l-7-1h-6l3%201%2014%201c11%201%2015%201%2012-1-1-1%201-1%204-1%208%200%207-1%200-1l-6%201-2%201-3-1%201-1%203-1-1-1h-1l-3-1-14-2c-10-2-10-2-3-1l16%201a231%20231%200%200054-1c11%200%2012-1%203-3-7-2-12-2-41-2l-8-1-6-2c-3-1-3-1-1-2l1-1c-10%200-46-6-47-8h15c14%200%2018%200%2031%203%2016%203%2034%205%2034%203l-7-1-12-2-10-1c-10-1-11-1-4-2a76%2076%200%200126%201c1-1%2033-2%2035-1%201%200%201%201-1%201l18%201c18%200%2046%203%2048%204l-1%206c-3%206-3%206%201%206s10-2%2010-3h-1c-2%200-2%200-1-3%201-4%202-4%205-4s4%201%203%202h3c2%200%203%200%206%204l4%204%201-4%202-4v-1c-1-1-1-1%201-3l2-2h-2c-2-1-2-1%200-1l5-2c3-3%2010-3%2013%200l4%202h1c-1%202%205%200%208-2s5-2%2053-2a1733%201733%200%200158%203c-2%201-2%201%200%201l3-1c1-1%206-2%2017-2%2014%200%2015%200%2015%202%200%203-8%204-23%202-3-1-5%200-7%201l-7%204-4%202-3%201h-2l3%201%203%201h-8c0-3-30-2-34%200h16a433%20433%200%2000-50%207c-13%200-11%201%209%203%207%201%207%201%202%201l-12-1c-7-1-7%200-1%202a346%20346%200%200079-1%20547%20547%200%200024-1l4%201-6%201a421%20421%200%2000-40%203h-11l5%202%2017%201%2012%201c1%201%2021%204%2029%204l6%201V0H0v200m0%201c0%20110%200%20199%201%20198%200-2%201-2%206-2l8-1H1v-17h4c3%200%203%200%201-1l-2-1c2%200%201-2-1-2l-2-1%202-1c18%204%2025%204%2011%200l-6-2%205%201%2010%202%209%201%2010%201%2019%201c7-3-15-7-28-5l-12-1-7-2%206%201a15090%2015090%200%2000-14-4l-5-1v-84l2%202%202%203h38l-6-7c-11-11-21-24-28-35l-8-12V116c0-63-1-25-1%2085M131%2039l-3%201%203%202c3%203%203%207%202%2010-3%204%204%205%208%200%207-7-1-18-10-13m162%208c-12%206-8%2023%205%2023l7-1c1-2%201-2-2-2-4%200-5-2-6-7%200-6%202-10%205-11%202-1%202-1%200-2h-9M167%2069c-37%206-69%2024-90%2051-6%208-6%208%201%202l6-4%201-1%201-1%203-1%204-1%201-1c-1-1-1-1%200%200l2-1%203-1c1%201%203%200%206-1%204-3%206-2%202%201-5%203-4%204%202%201%205-2%207-2%207%201h2c3-1%204-1%202%202-1%201-1%201%202%201a509%20509%200%200119-3c-2%201-2%201%203%201l2%202%203-1c1-1%202%200%205%202l3%202%201-1c3%201%209-1%208-2h-9l-4-2%204-2c6-3%2015-3%2012-1s-2%203%200%202h2l2%201%203%201h2c2%200%203-2%201-2l-1-2%202%201h2c2%200%202%200%202%202l-2%201-2%202c0%203%203%204%205%202l1-1%201%201v1l1-1h2c2%202%205%202%203%200l1-1%201%201%203%203%202%201-6%203c-3-1-6%200-6%201l1%201h3c2%201%203%202%203%206l-1%206%201%202%201%201a321%20321%200%20002-17c1%200%203%205%203%208%200%202%200%202%202%201v3c-2%202%200%206%202%205l2%201c1%201%201%201%201-1s0-3-1-2c-2%201-3-2-1-5s0-7-3-7l-2-3-1-6v-1c1-2%202-1%202%201l1-1c2-4%207-6%209-3%201%202-3%206-6%206-2%200-2%200-1%201h3c2%200%202%200%201%201s-2%202-3%201l-2%201%201%202%203%201c0%202%200%202%201%201h2l-1%203%201%202c1%201%203%200%202-2h2c1%201%201%201%201-1-1-1%200-2%201-2h1l1%201h1l-1%202-1%201-1%201c-2%201-1%203%201%202l1-2c0-1%201-1%201%201%201%202%201%202%202%201l1-2v2h1v-3h-2c-1-2%203-7%206-7%205-1%204%205%200%207-2%201-2%201%201%201%203%201%205%204%203%204v2l3%201v5c0%204%200%205%201%204s1-1%202%201c0%202%200%202%201%201s1-1%201%201h2l1%202%202%203c1%202%201%202%201%200l2-2c2%200%203%202%201%202v2l1%202%201%201v1c-1%202-1%206%201%206v-4h1l2-1c2%200%202%200%201-1-1%200-2-1-1-2%201-3%203%201%202%205%200%203%200%203%202%202%203%200%203%200%202%202l1%202%201%202-2%202c-3%200-3%200-2%201%202%202%206%203%206%201l1-1%203-2h2l2%201h2v1l-1%201v7l-2%202-1%202v1l-2%201c-2%200-2%200-1%201l1%202h-1l-1%202%201%201h1l-1%201v3l2%205v5c0%202%200%202-2%201v-3c2%200%201-2-1-1-2%200-3%200-3-6l-4-9-1-3c0-4-4-9-6-9s-4-3-8-8h-1l5%209%203%204h1v-1l1-1c1%200%203%204%202%205l-1-1c0-1-2%200-2%202l1%201c1-1%203%202%202%203l2%202c2%201%204%203%203%205v3l2%201-1%202h-1l1%201%201%202%201%201%207%206v4l-3%202c-2%202-2%202%200%202%201%201%202%200%202-1l2-1c2%200%203-3%201-5-3-2-2-4%200-4%202-1%206%203%204%204v1l1%203v2l1%203v2h2l1%201c-3%204-2%209%201%208%202%200%202-1%201-2v-4c1-3%201-4-1-7a321%20321%200%2001-4-8l-4-9h1c0-1-1-2-3-2-1%200-2%200-1-1v-7l1-6c1-1%202-2%201-3%200-2%200-2%201-1%202%202%205%203%204%201l1-2h1l2%201c2-1%203%200%201%201l-2%202%202%202%201%201-1%201-2%201%201%201c2%200%201%204-2%205-2%200-2%200-1%201v2l-1%202%201%202c3-1%205%201%204%204l1%203%201-1h1l1-1v-1c3%200%206%204%206%207l1%202h1c0%202-3%202-4%200l-1-2c-2%200-3-2-2-3%201-2%200-3-2-1s-1%206%201%206c1%200%202%202%200%202-1%201-1%205%201%205v4l-1%202-2%203v2c2%200%202%201%201%203v8l-3%2013c-1%203-1%203%201%203l1-1v-3c2-3%202-3%202-12l3-9c2-1%202%201%201%203l-2%203v3c-1%202%200%205%203%205l-1%204c-1%202-2%204-1%205h-1l-1%201c1%201%200%202-1%203l-1%204-1%203h-2l-1-2-1-2c0-4-1-4-4%200l-3%202h-1c-1%200-2%201-1%202v3h2l2-3%202-3h2l-1%203-2%202%201%201c2-1%201%200-1%202l-4%201-2%201%2011%201h11l2-3A135%20135%200%2000167%2069m189%2017c-11%204-18%2017-15%2027%202%209%2011%2017%2019%2017%203%200%203%200%201-2-6-5-7-18-2-29%204-8%204-9%207-11l2-2h-12m-72%2090c-4%205-1%2011%204%209%204%200%205-2%205-5%201-6-5-8-9-4M94%20322l1%208h3c3%201%206-2%206-5%200-5-2-7-6-7-2%201-2%201-2-1l-1-3-1%208m51-7l-1%202c0%202%200%202-2%202-2-1-6%202-6%206%200%203%204%206%206%205h3l1-8c0-8%200-9-1-7m125%207l1%208%201-3c0-3%200-3%203-3s7-3%207-5-4-5-8-5h-4v8m-222-3c-2%200-2%201-2%208l1%208%201-3c0-2%200-2%202-2%202%201%206-2%206-5s-3-7-5-7l-3%201m13%200h-3c-1%200-2%2014%200%2016l1-3c0-2%200-2%202-2%204%201%206-1%206-5%200-5-3-8-6-6m47%201c-4%203-1%2011%203%2011%202%200%205-4%205-6%200-6-5-9-8-5m263%2054l-19%203-18%203-3%201%203%201c3%201%201%201-8%201a229%20229%200%2000-22%201c-3%200-3%200%202%201h13l13-1h21a406%20406%200%200125-4h-21c-3-1%2016-2%2023-2%207%201%2020%200%2020-1l-3-1c-10%201-18%200-17-1%200-1-8-2-9-1m-225%2012l-4%201-4%202-5%201c-4%201-12%206-11%207l1%202c-1%201%200%201%202%201%203%200%204-1%207-3l5-4c2-1%202-1%201-2v-1l2%201c1%201%209-3%209-4l-3-1m83%202l3%203%206%203%206%203%204%201-6-1-13-2-5-2c-4%200-2%202%203%205%204%202%205%202%2027%202h24l-5-2-15-4a750%20750%200%2001-29-6m19%202a263%20263%200%200030%208l24%202h19l-9-2-18-2c-9%200-13-1-29-5l-17-1'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQFA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHKrn6kgNKgWQH/xAAaEAACAwEBAAAAAAAAAAAAAAABAgADEhEE/9oACAEBAAEFAkCknzrmFeSlsNyBRpq1WMoB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEQ/9oACAEDAQE/AUyv/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/AYirr//EAB4QAAEDBAMAAAAAAAAAAAAAAAABETECAxASIkGh/9oACAEBAAY/AuSshtbq2bpSRpyzEekH/8QAGxABAQEBAQADAAAAAAAAAAAAAREAIVFBcaH/2gAIAQEAAT8h/I5cxqQrycgSB5goPDxPnPRsNfm8u+3Qpd9WlTP/2gAMAwEAAgADAAAAEN/wAv/EABcRAAMBAAAAAAAAAAAAAAAAAAABEVH/2gAIAQMBAT8QjwrCso//xAAXEQADAQAAAAAAAAAAAAAAAAAAEVFh/9oACAECAQE/EGg0Gpof/8QAHhABAQACAgIDAAAAAAAAAAAAAREAMSFxQVFhkfD/2gAIAQEAAT8Qi+nsvxiOZBCE2JubmcU1CoPD6yZoSJg8OBx2rH6xqyD1kFVafhwajbyJ1zi0M7c//9k=","aspectRatio":1,"src":"/static/6025f105ff999e2f85121bab83df7fd7/1dc0b/foldersCover.jpg","srcSet":"/static/6025f105ff999e2f85121bab83df7fd7/3a5ce/foldersCover.jpg 163w,\n/static/6025f105ff999e2f85121bab83df7fd7/05730/foldersCover.jpg 327w,\n/static/6025f105ff999e2f85121bab83df7fd7/1dc0b/foldersCover.jpg 653w,\n/static/6025f105ff999e2f85121bab83df7fd7/f72c7/foldersCover.jpg 980w,\n/static/6025f105ff999e2f85121bab83df7fd7/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/6025f105ff999e2f85121bab83df7fd7/0acdf/foldersCover.webp","srcSetWebp":"/static/6025f105ff999e2f85121bab83df7fd7/ac59e/foldersCover.webp 163w,\n/static/6025f105ff999e2f85121bab83df7fd7/7660b/foldersCover.webp 327w,\n/static/6025f105ff999e2f85121bab83df7fd7/0acdf/foldersCover.webp 653w,\n/static/6025f105ff999e2f85121bab83df7fd7/75470/foldersCover.webp 980w,\n/static/6025f105ff999e2f85121bab83df7fd7/9000d/foldersCover.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%20200v200h52a241%20241%200%200064-2h2l1-2%205-4c6-3%206-5-1-5l-4-1h-3c-3%202-7%202-7%200l3-2%204-2c1-2-9%200-12%202l-5%203c-3%200-8%205-6%205l4-2%203-1%202%201c2%201%201%201-2%202-9%203-12%203-14%201l-4-1h-5l-2%201c-1-1-10%201-13%203l-4%202c-1-1%202-4%207-5l4-2h-8l-10%201c-2%201-5%202-7%201-4%200-5-1-2-1l4-1c0-1-12-1-23%201l-14%201-7%201-1-6v-6h12a732%20732%200%200126%204c0%202%200%202%201%201s9-3%209-1h4l7%201c1%201%200%201-5%201l-7-1h-6l3%201%2014%201c11%201%2015%201%2012-1-1-1%201-1%204-1%208%200%207-1%200-1l-6%201-2%201-3-1%201-1%203-1-1-1h-1l-3-1-14-2c-10-2-10-2-3-1l16%201a231%20231%200%200054-1c11%200%2012-1%203-3-7-2-12-2-41-2l-8-1-6-2c-3-1-3-1-1-2l1-1c-10%200-46-6-47-8h15c14%200%2018%200%2031%203%2016%203%2034%205%2034%203l-7-1-12-2-10-1c-10-1-11-1-4-2a76%2076%200%200126%201c1-1%2033-2%2035-1%201%200%201%201-1%201l18%201c18%200%2046%203%2048%204l-1%206c-3%206-3%206%201%206s10-2%2010-3h-1c-2%200-2%200-1-3%201-4%202-4%205-4s4%201%203%202h3c2%200%203%200%206%204l4%204%201-4%202-4v-1c-1-1-1-1%201-3l2-2h-2c-2-1-2-1%200-1l5-2c3-3%2010-3%2013%200l4%202h1c-1%202%205%200%208-2s5-2%2053-2a1733%201733%200%200158%203c-2%201-2%201%200%201l3-1c1-1%206-2%2017-2%2014%200%2015%200%2015%202%200%203-8%204-23%202-3-1-5%200-7%201l-7%204-4%202-3%201h-2l3%201%203%201h-8c0-3-30-2-34%200h16a433%20433%200%2000-50%207c-13%200-11%201%209%203%207%201%207%201%202%201l-12-1c-7-1-7%200-1%202a346%20346%200%200079-1%20547%20547%200%200024-1l4%201-6%201a421%20421%200%2000-40%203h-11l5%202%2017%201%2012%201c1%201%2021%204%2029%204l6%201V0H0v200m0%201c0%20110%200%20199%201%20198%200-2%201-2%206-2l8-1H1v-17h4c3%200%203%200%201-1l-2-1c2%200%201-2-1-2l-2-1%202-1c18%204%2025%204%2011%200l-6-2%205%201%2010%202%209%201%2010%201%2019%201c7-3-15-7-28-5l-12-1-7-2%206%201a15090%2015090%200%2000-14-4l-5-1v-84l2%202%202%203h38l-6-7c-11-11-21-24-28-35l-8-12V116c0-63-1-25-1%2085M131%2039l-3%201%203%202c3%203%203%207%202%2010-3%204%204%205%208%200%207-7-1-18-10-13m162%208c-12%206-8%2023%205%2023l7-1c1-2%201-2-2-2-4%200-5-2-6-7%200-6%202-10%205-11%202-1%202-1%200-2h-9M167%2069c-37%206-69%2024-90%2051-6%208-6%208%201%202l6-4%201-1%201-1%203-1%204-1%201-1c-1-1-1-1%200%200l2-1%203-1c1%201%203%200%206-1%204-3%206-2%202%201-5%203-4%204%202%201%205-2%207-2%207%201h2c3-1%204-1%202%202-1%201-1%201%202%201a509%20509%200%200119-3c-2%201-2%201%203%201l2%202%203-1c1-1%202%200%205%202l3%202%201-1c3%201%209-1%208-2h-9l-4-2%204-2c6-3%2015-3%2012-1s-2%203%200%202h2l2%201%203%201h2c2%200%203-2%201-2l-1-2%202%201h2c2%200%202%200%202%202l-2%201-2%202c0%203%203%204%205%202l1-1%201%201v1l1-1h2c2%202%205%202%203%200l1-1%201%201%203%203%202%201-6%203c-3-1-6%200-6%201l1%201h3c2%201%203%202%203%206l-1%206%201%202%201%201a321%20321%200%20002-17c1%200%203%205%203%208%200%202%200%202%202%201v3c-2%202%200%206%202%205l2%201c1%201%201%201%201-1s0-3-1-2c-2%201-3-2-1-5s0-7-3-7l-2-3-1-6v-1c1-2%202-1%202%201l1-1c2-4%207-6%209-3%201%202-3%206-6%206-2%200-2%200-1%201h3c2%200%202%200%201%201s-2%202-3%201l-2%201%201%202%203%201c0%202%200%202%201%201h2l-1%203%201%202c1%201%203%200%202-2h2c1%201%201%201%201-1-1-1%200-2%201-2h1l1%201h1l-1%202-1%201-1%201c-2%201-1%203%201%202l1-2c0-1%201-1%201%201%201%202%201%202%202%201l1-2v2h1v-3h-2c-1-2%203-7%206-7%205-1%204%205%200%207-2%201-2%201%201%201%203%201%205%204%203%204v2l3%201v5c0%204%200%205%201%204s1-1%202%201c0%202%200%202%201%201s1-1%201%201h2l1%202%202%203c1%202%201%202%201%200l2-2c2%200%203%202%201%202v2l1%202%201%201v1c-1%202-1%206%201%206v-4h1l2-1c2%200%202%200%201-1-1%200-2-1-1-2%201-3%203%201%202%205%200%203%200%203%202%202%203%200%203%200%202%202l1%202%201%202-2%202c-3%200-3%200-2%201%202%202%206%203%206%201l1-1%203-2h2l2%201h2v1l-1%201v7l-2%202-1%202v1l-2%201c-2%200-2%200-1%201l1%202h-1l-1%202%201%201h1l-1%201v3l2%205v5c0%202%200%202-2%201v-3c2%200%201-2-1-1-2%200-3%200-3-6l-4-9-1-3c0-4-4-9-6-9s-4-3-8-8h-1l5%209%203%204h1v-1l1-1c1%200%203%204%202%205l-1-1c0-1-2%200-2%202l1%201c1-1%203%202%202%203l2%202c2%201%204%203%203%205v3l2%201-1%202h-1l1%201%201%202%201%201%207%206v4l-3%202c-2%202-2%202%200%202%201%201%202%200%202-1l2-1c2%200%203-3%201-5-3-2-2-4%200-4%202-1%206%203%204%204v1l1%203v2l1%203v2h2l1%201c-3%204-2%209%201%208%202%200%202-1%201-2v-4c1-3%201-4-1-7a321%20321%200%2001-4-8l-4-9h1c0-1-1-2-3-2-1%200-2%200-1-1v-7l1-6c1-1%202-2%201-3%200-2%200-2%201-1%202%202%205%203%204%201l1-2h1l2%201c2-1%203%200%201%201l-2%202%202%202%201%201-1%201-2%201%201%201c2%200%201%204-2%205-2%200-2%200-1%201v2l-1%202%201%202c3-1%205%201%204%204l1%203%201-1h1l1-1v-1c3%200%206%204%206%207l1%202h1c0%202-3%202-4%200l-1-2c-2%200-3-2-2-3%201-2%200-3-2-1s-1%206%201%206c1%200%202%202%200%202-1%201-1%205%201%205v4l-1%202-2%203v2c2%200%202%201%201%203v8l-3%2013c-1%203-1%203%201%203l1-1v-3c2-3%202-3%202-12l3-9c2-1%202%201%201%203l-2%203v3c-1%202%200%205%203%205l-1%204c-1%202-2%204-1%205h-1l-1%201c1%201%200%202-1%203l-1%204-1%203h-2l-1-2-1-2c0-4-1-4-4%200l-3%202h-1c-1%200-2%201-1%202v3h2l2-3%202-3h2l-1%203-2%202%201%201c2-1%201%200-1%202l-4%201-2%201%2011%201h11l2-3A135%20135%200%2000167%2069m189%2017c-11%204-18%2017-15%2027%202%209%2011%2017%2019%2017%203%200%203%200%201-2-6-5-7-18-2-29%204-8%204-9%207-11l2-2h-12m-72%2090c-4%205-1%2011%204%209%204%200%205-2%205-5%201-6-5-8-9-4M94%20322l1%208h3c3%201%206-2%206-5%200-5-2-7-6-7-2%201-2%201-2-1l-1-3-1%208m51-7l-1%202c0%202%200%202-2%202-2-1-6%202-6%206%200%203%204%206%206%205h3l1-8c0-8%200-9-1-7m125%207l1%208%201-3c0-3%200-3%203-3s7-3%207-5-4-5-8-5h-4v8m-222-3c-2%200-2%201-2%208l1%208%201-3c0-2%200-2%202-2%202%201%206-2%206-5s-3-7-5-7l-3%201m13%200h-3c-1%200-2%2014%200%2016l1-3c0-2%200-2%202-2%204%201%206-1%206-5%200-5-3-8-6-6m47%201c-4%203-1%2011%203%2011%202%200%205-4%205-6%200-6-5-9-8-5m263%2054l-19%203-18%203-3%201%203%201c3%201%201%201-8%201a229%20229%200%2000-22%201c-3%200-3%200%202%201h13l13-1h21a406%20406%200%200125-4h-21c-3-1%2016-2%2023-2%207%201%2020%200%2020-1l-3-1c-10%201-18%200-17-1%200-1-8-2-9-1m-225%2012l-4%201-4%202-5%201c-4%201-12%206-11%207l1%202c-1%201%200%201%202%201%203%200%204-1%207-3l5-4c2-1%202-1%201-2v-1l2%201c1%201%209-3%209-4l-3-1m83%202l3%203%206%203%206%203%204%201-6-1-13-2-5-2c-4%200-2%202%203%205%204%202%205%202%2027%202h24l-5-2-15-4a750%20750%200%2001-29-6m19%202a263%20263%200%200030%208l24%202h19l-9-2-18-2c-9%200-13-1-29-5l-17-1'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQFA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHKrn6kgNKgWQH/xAAaEAACAwEBAAAAAAAAAAAAAAABAgADEhEE/9oACAEBAAEFAkCknzrmFeSlsNyBRpq1WMoB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEQ/9oACAEDAQE/AUyv/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/AYirr//EAB4QAAEDBAMAAAAAAAAAAAAAAAABETECAxASIkGh/9oACAEBAAY/AuSshtbq2bpSRpyzEekH/8QAGxABAQEBAQADAAAAAAAAAAAAAREAIVFBcaH/2gAIAQEAAT8h/I5cxqQrycgSB5goPDxPnPRsNfm8u+3Qpd9WlTP/2gAMAwEAAgADAAAAEN/wAv/EABcRAAMBAAAAAAAAAAAAAAAAAAABEVH/2gAIAQMBAT8QjwrCso//xAAXEQADAQAAAAAAAAAAAAAAAAAAEVFh/9oACAECAQE/EGg0Gpof/8QAHhABAQACAgIDAAAAAAAAAAAAAREAMSFxQVFhkfD/2gAIAQEAAT8Qi+nsvxiOZBCE2JubmcU1CoPD6yZoSJg8OBx2rH6xqyD1kFVafhwajbyJ1zi0M7c//9k=","aspectRatio":1,"src":"/static/6025f105ff999e2f85121bab83df7fd7/eaa58/foldersCover.jpg","srcSet":"/static/6025f105ff999e2f85121bab83df7fd7/5a3ee/foldersCover.jpg 114w,\n/static/6025f105ff999e2f85121bab83df7fd7/41f8f/foldersCover.jpg 229w,\n/static/6025f105ff999e2f85121bab83df7fd7/eaa58/foldersCover.jpg 457w,\n/static/6025f105ff999e2f85121bab83df7fd7/c309b/foldersCover.jpg 686w,\n/static/6025f105ff999e2f85121bab83df7fd7/e3008/foldersCover.jpg 914w,\n/static/6025f105ff999e2f85121bab83df7fd7/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/6025f105ff999e2f85121bab83df7fd7/15384/foldersCover.webp","srcSetWebp":"/static/6025f105ff999e2f85121bab83df7fd7/31fce/foldersCover.webp 114w,\n/static/6025f105ff999e2f85121bab83df7fd7/e3e25/foldersCover.webp 229w,\n/static/6025f105ff999e2f85121bab83df7fd7/15384/foldersCover.webp 457w,\n/static/6025f105ff999e2f85121bab83df7fd7/0258d/foldersCover.webp 686w,\n/static/6025f105ff999e2f85121bab83df7fd7/64ea2/foldersCover.webp 914w,\n/static/6025f105ff999e2f85121bab83df7fd7/9000d/foldersCover.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%20200v200h52a241%20241%200%200064-2h2l1-2%205-4c6-3%206-5-1-5l-4-1h-3c-3%202-7%202-7%200l3-2%204-2c1-2-9%200-12%202l-5%203c-3%200-8%205-6%205l4-2%203-1%202%201c2%201%201%201-2%202-9%203-12%203-14%201l-4-1h-5l-2%201c-1-1-10%201-13%203l-4%202c-1-1%202-4%207-5l4-2h-8l-10%201c-2%201-5%202-7%201-4%200-5-1-2-1l4-1c0-1-12-1-23%201l-14%201-7%201-1-6v-6h12a732%20732%200%200126%204c0%202%200%202%201%201s9-3%209-1h4l7%201c1%201%200%201-5%201l-7-1h-6l3%201%2014%201c11%201%2015%201%2012-1-1-1%201-1%204-1%208%200%207-1%200-1l-6%201-2%201-3-1%201-1%203-1-1-1h-1l-3-1-14-2c-10-2-10-2-3-1l16%201a231%20231%200%200054-1c11%200%2012-1%203-3-7-2-12-2-41-2l-8-1-6-2c-3-1-3-1-1-2l1-1c-10%200-46-6-47-8h15c14%200%2018%200%2031%203%2016%203%2034%205%2034%203l-7-1-12-2-10-1c-10-1-11-1-4-2a76%2076%200%200126%201c1-1%2033-2%2035-1%201%200%201%201-1%201l18%201c18%200%2046%203%2048%204l-1%206c-3%206-3%206%201%206s10-2%2010-3h-1c-2%200-2%200-1-3%201-4%202-4%205-4s4%201%203%202h3c2%200%203%200%206%204l4%204%201-4%202-4v-1c-1-1-1-1%201-3l2-2h-2c-2-1-2-1%200-1l5-2c3-3%2010-3%2013%200l4%202h1c-1%202%205%200%208-2s5-2%2053-2a1733%201733%200%200158%203c-2%201-2%201%200%201l3-1c1-1%206-2%2017-2%2014%200%2015%200%2015%202%200%203-8%204-23%202-3-1-5%200-7%201l-7%204-4%202-3%201h-2l3%201%203%201h-8c0-3-30-2-34%200h16a433%20433%200%2000-50%207c-13%200-11%201%209%203%207%201%207%201%202%201l-12-1c-7-1-7%200-1%202a346%20346%200%200079-1%20547%20547%200%200024-1l4%201-6%201a421%20421%200%2000-40%203h-11l5%202%2017%201%2012%201c1%201%2021%204%2029%204l6%201V0H0v200m0%201c0%20110%200%20199%201%20198%200-2%201-2%206-2l8-1H1v-17h4c3%200%203%200%201-1l-2-1c2%200%201-2-1-2l-2-1%202-1c18%204%2025%204%2011%200l-6-2%205%201%2010%202%209%201%2010%201%2019%201c7-3-15-7-28-5l-12-1-7-2%206%201a15090%2015090%200%2000-14-4l-5-1v-84l2%202%202%203h38l-6-7c-11-11-21-24-28-35l-8-12V116c0-63-1-25-1%2085M131%2039l-3%201%203%202c3%203%203%207%202%2010-3%204%204%205%208%200%207-7-1-18-10-13m162%208c-12%206-8%2023%205%2023l7-1c1-2%201-2-2-2-4%200-5-2-6-7%200-6%202-10%205-11%202-1%202-1%200-2h-9M167%2069c-37%206-69%2024-90%2051-6%208-6%208%201%202l6-4%201-1%201-1%203-1%204-1%201-1c-1-1-1-1%200%200l2-1%203-1c1%201%203%200%206-1%204-3%206-2%202%201-5%203-4%204%202%201%205-2%207-2%207%201h2c3-1%204-1%202%202-1%201-1%201%202%201a509%20509%200%200119-3c-2%201-2%201%203%201l2%202%203-1c1-1%202%200%205%202l3%202%201-1c3%201%209-1%208-2h-9l-4-2%204-2c6-3%2015-3%2012-1s-2%203%200%202h2l2%201%203%201h2c2%200%203-2%201-2l-1-2%202%201h2c2%200%202%200%202%202l-2%201-2%202c0%203%203%204%205%202l1-1%201%201v1l1-1h2c2%202%205%202%203%200l1-1%201%201%203%203%202%201-6%203c-3-1-6%200-6%201l1%201h3c2%201%203%202%203%206l-1%206%201%202%201%201a321%20321%200%20002-17c1%200%203%205%203%208%200%202%200%202%202%201v3c-2%202%200%206%202%205l2%201c1%201%201%201%201-1s0-3-1-2c-2%201-3-2-1-5s0-7-3-7l-2-3-1-6v-1c1-2%202-1%202%201l1-1c2-4%207-6%209-3%201%202-3%206-6%206-2%200-2%200-1%201h3c2%200%202%200%201%201s-2%202-3%201l-2%201%201%202%203%201c0%202%200%202%201%201h2l-1%203%201%202c1%201%203%200%202-2h2c1%201%201%201%201-1-1-1%200-2%201-2h1l1%201h1l-1%202-1%201-1%201c-2%201-1%203%201%202l1-2c0-1%201-1%201%201%201%202%201%202%202%201l1-2v2h1v-3h-2c-1-2%203-7%206-7%205-1%204%205%200%207-2%201-2%201%201%201%203%201%205%204%203%204v2l3%201v5c0%204%200%205%201%204s1-1%202%201c0%202%200%202%201%201s1-1%201%201h2l1%202%202%203c1%202%201%202%201%200l2-2c2%200%203%202%201%202v2l1%202%201%201v1c-1%202-1%206%201%206v-4h1l2-1c2%200%202%200%201-1-1%200-2-1-1-2%201-3%203%201%202%205%200%203%200%203%202%202%203%200%203%200%202%202l1%202%201%202-2%202c-3%200-3%200-2%201%202%202%206%203%206%201l1-1%203-2h2l2%201h2v1l-1%201v7l-2%202-1%202v1l-2%201c-2%200-2%200-1%201l1%202h-1l-1%202%201%201h1l-1%201v3l2%205v5c0%202%200%202-2%201v-3c2%200%201-2-1-1-2%200-3%200-3-6l-4-9-1-3c0-4-4-9-6-9s-4-3-8-8h-1l5%209%203%204h1v-1l1-1c1%200%203%204%202%205l-1-1c0-1-2%200-2%202l1%201c1-1%203%202%202%203l2%202c2%201%204%203%203%205v3l2%201-1%202h-1l1%201%201%202%201%201%207%206v4l-3%202c-2%202-2%202%200%202%201%201%202%200%202-1l2-1c2%200%203-3%201-5-3-2-2-4%200-4%202-1%206%203%204%204v1l1%203v2l1%203v2h2l1%201c-3%204-2%209%201%208%202%200%202-1%201-2v-4c1-3%201-4-1-7a321%20321%200%2001-4-8l-4-9h1c0-1-1-2-3-2-1%200-2%200-1-1v-7l1-6c1-1%202-2%201-3%200-2%200-2%201-1%202%202%205%203%204%201l1-2h1l2%201c2-1%203%200%201%201l-2%202%202%202%201%201-1%201-2%201%201%201c2%200%201%204-2%205-2%200-2%200-1%201v2l-1%202%201%202c3-1%205%201%204%204l1%203%201-1h1l1-1v-1c3%200%206%204%206%207l1%202h1c0%202-3%202-4%200l-1-2c-2%200-3-2-2-3%201-2%200-3-2-1s-1%206%201%206c1%200%202%202%200%202-1%201-1%205%201%205v4l-1%202-2%203v2c2%200%202%201%201%203v8l-3%2013c-1%203-1%203%201%203l1-1v-3c2-3%202-3%202-12l3-9c2-1%202%201%201%203l-2%203v3c-1%202%200%205%203%205l-1%204c-1%202-2%204-1%205h-1l-1%201c1%201%200%202-1%203l-1%204-1%203h-2l-1-2-1-2c0-4-1-4-4%200l-3%202h-1c-1%200-2%201-1%202v3h2l2-3%202-3h2l-1%203-2%202%201%201c2-1%201%200-1%202l-4%201-2%201%2011%201h11l2-3A135%20135%200%2000167%2069m189%2017c-11%204-18%2017-15%2027%202%209%2011%2017%2019%2017%203%200%203%200%201-2-6-5-7-18-2-29%204-8%204-9%207-11l2-2h-12m-72%2090c-4%205-1%2011%204%209%204%200%205-2%205-5%201-6-5-8-9-4M94%20322l1%208h3c3%201%206-2%206-5%200-5-2-7-6-7-2%201-2%201-2-1l-1-3-1%208m51-7l-1%202c0%202%200%202-2%202-2-1-6%202-6%206%200%203%204%206%206%205h3l1-8c0-8%200-9-1-7m125%207l1%208%201-3c0-3%200-3%203-3s7-3%207-5-4-5-8-5h-4v8m-222-3c-2%200-2%201-2%208l1%208%201-3c0-2%200-2%202-2%202%201%206-2%206-5s-3-7-5-7l-3%201m13%200h-3c-1%200-2%2014%200%2016l1-3c0-2%200-2%202-2%204%201%206-1%206-5%200-5-3-8-6-6m47%201c-4%203-1%2011%203%2011%202%200%205-4%205-6%200-6-5-9-8-5m263%2054l-19%203-18%203-3%201%203%201c3%201%201%201-8%201a229%20229%200%2000-22%201c-3%200-3%200%202%201h13l13-1h21a406%20406%200%200125-4h-21c-3-1%2016-2%2023-2%207%201%2020%200%2020-1l-3-1c-10%201-18%200-17-1%200-1-8-2-9-1m-225%2012l-4%201-4%202-5%201c-4%201-12%206-11%207l1%202c-1%201%200%201%202%201%203%200%204-1%207-3l5-4c2-1%202-1%201-2v-1l2%201c1%201%209-3%209-4l-3-1m83%202l3%203%206%203%206%203%204%201-6-1-13-2-5-2c-4%200-2%202%203%205%204%202%205%202%2027%202h24l-5-2-15-4a750%20750%200%2001-29-6m19%202a263%20263%200%200030%208l24%202h19l-9-2-18-2c-9%200-13-1-29-5l-17-1'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/6025f105ff999e2f85121bab83df7fd7/0ff54/foldersCover.jpg"}}}]}},"staticQueryHashes":["1609575157","2068910035","2361467917","2361467917","3838421970","500183989","5650841"]}