[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6G2PEE73CW4878K7GCD5RCS":3,"skill-same:01M6G2PEE73CW4878K7GCD5RCS":68},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6G2PEE73CW4878K7GCD5RCS","springboot-verification",null,"Verification loop for Spring Boot projects: build, static analysis, tests with coverage, security scans, and diff review before release or PR.","oabdelmaksoud\u002FAgention","oabdelmaksoud","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F50699149?v=4","01M6D5CVVN778ZCDP1WHS816SP","Omar Abdelmaksoud","01M6D8A4TE76V3DCSH3D94VG1V",2,"MIT","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fspringboot-verification\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"verification","springboot verification","verification loop","with","diff review","tests","build","diff","coverage","spring","projects","review","loop","analysis","spring boot","release","boot","pr","static analysis","security","2026-11-10 10:12:30",false,"---\nname: springboot-verification\ndescription: \"Verification loop for Spring Boot projects: build, static analysis, tests with coverage, security scans, and diff review before release or PR.\"\norigin: ECC\n---\n\n# Spring Boot Verification Loop\n\nRun before PRs, after major changes, and pre-deploy.\n\n## When to Activate\n\n- Before opening a pull request for a Spring Boot service\n- After major refactoring or dependency upgrades\n- Pre-deployment verification for staging or production\n- Running full build → lint → test → security scan pipeline\n- Validating test coverage meets thresholds\n\n## Phase 1: Build\n\n```bash\nmvn -T 4 clean verify -DskipTests\n# or\n.\u002Fgradlew clean assemble -x test\n```\n\nIf build fails, stop and fix.\n\n## Phase 2: Static Analysis\n\nMaven (common plugins):\n```bash\nmvn -T 4 spotbugs:check pmd:check checkstyle:check\n```\n\nGradle (if configured):\n```bash\n.\u002Fgradlew checkstyleMain pmdMain spotbugsMain\n```\n\n## Phase 3: Tests + Coverage\n\n```bash\nmvn -T 4 test\nmvn jacoco:report   # verify 80%+ coverage\n# or\n.\u002Fgradlew test jacocoTestReport\n```\n\nReport:\n- Total tests, passed\u002Ffailed\n- Coverage % (lines\u002Fbranches)\n\n### Unit Tests\n\nTest service logic in isolation with mocked dependencies:\n\n```java\n@ExtendWith(MockitoExtension.class)\nclass UserServiceTest {\n\n  @Mock private UserRepository userRepository;\n  @InjectMocks private UserService userService;\n\n  @Test\n  void createUser_validInput_returnsUser() {\n    var dto = new CreateUserDto(\"Alice\", \"alice@example.com\");\n    var expected = new User(1L, \"Alice\", \"alice@example.com\");\n    when(userRepository.save(any(User.class))).thenReturn(expected);\n\n    var result = userService.create(dto);\n\n    assertThat(result.name()).isEqualTo(\"Alice\");\n    verify(userRepository).save(any(User.class));\n  }\n\n  @Test\n  void createUser_duplicateEmail_throwsException() {\n    var dto = new CreateUserDto(\"Alice\", \"existing@example.com\");\n    when(userRepository.existsByEmail(dto.email())).thenReturn(true);\n\n    assertThatThrownBy(() -> userService.create(dto))\n        .isInstanceOf(DuplicateEmailException.class);\n  }\n}\n```\n\n### Integration Tests with Testcontainers\n\nTest against a real database instead of H2:\n\n```java\n@SpringBootTest\n@Testcontainers\nclass UserRepositoryIntegrationTest {\n\n  @Container\n  static PostgreSQLContainer\u003C?> postgres = new PostgreSQLContainer\u003C>(\"postgres:16-alpine\")\n      .withDatabaseName(\"testdb\");\n\n  @DynamicPropertySource\n  static void configureProperties(DynamicPropertyRegistry registry) {\n    registry.add(\"spring.datasource.url\", postgres::getJdbcUrl);\n    registry.add(\"spring.datasource.username\", postgres::getUsername);\n    registry.add(\"spring.datasource.password\", postgres::getPassword);\n  }\n\n  @Autowired private UserRepository userRepository;\n\n  @Test\n  void findByEmail_existingUser_returnsUser() {\n    userRepository.save(new User(\"Alice\", \"alice@example.com\"));\n\n    var found = userRepository.findByEmail(\"alice@example.com\");\n\n    assertThat(found).isPresent();\n    assertThat(found.get().getName()).isEqualTo(\"Alice\");\n  }\n}\n```\n\n### API Tests with MockMvc\n\nTest controller layer with full Spring context:\n\n```java\n@WebMvcTest(UserController.class)\nclass UserControllerTest {\n\n  @Autowired private MockMvc mockMvc;\n  @MockBean private UserService userService;\n\n  @Test\n  void createUser_validInput_returns201() throws Exception {\n    var user = new UserDto(1L, \"Alice\", \"alice@example.com\");\n    when(userService.create(any())).thenReturn(user);\n\n    mockMvc.perform(post(\"\u002Fapi\u002Fusers\")\n            .contentType(MediaType.APPLICATION_JSON)\n            .content(\"\"\"\n                {\"name\": \"Alice\", \"email\": \"alice@example.com\"}\n                \"\"\"))\n        .andExpect(status().isCreated())\n        .andExpect(jsonPath(\"$.name\").value(\"Alice\"));\n  }\n\n  @Test\n  void createUser_invalidEmail_returns400() throws Exception {\n    mockMvc.perform(post(\"\u002Fapi\u002Fusers\")\n            .contentType(MediaType.APPLICATION_JSON)\n            .content(\"\"\"\n                {\"name\": \"Alice\", \"email\": \"not-an-email\"}\n                \"\"\"))\n        .andExpect(status().isBadRequest());\n  }\n}\n```\n\n## Phase 4: Security Scan\n\n```bash\n# Dependency CVEs\nmvn org.owasp:dependency-check-maven:check\n# or\n.\u002Fgradlew dependencyCheckAnalyze\n\n# Secrets in source\ngrep -rn \"password\\s*=\\s*\\\"\" src\u002F --include=\"*.java\" --include=\"*.yml\" --include=\"*.properties\"\ngrep -rn \"sk-\\|api_key\\|secret\" src\u002F --include=\"*.java\" --include=\"*.yml\"\n\n# Secrets (git history)\ngit secrets --scan  # if configured\n```\n\n### Common Security Findings\n\n```\n# Check for System.out.println (use logger instead)\ngrep -rn \"System\\.out\\.print\" src\u002Fmain\u002F --include=\"*.java\"\n\n# Check for raw exception messages in responses\ngrep -rn \"e\\.getMessage()\" src\u002Fmain\u002F --include=\"*.java\"\n\n# Check for wildcard CORS\ngrep -rn \"allowedOrigins.*\\*\" src\u002Fmain\u002F --include=\"*.java\"\n```\n\n## Phase 5: Lint\u002FFormat (optional gate)\n\n```bash\nmvn spotless:apply   # if using Spotless plugin\n.\u002Fgradlew spotlessApply\n```\n\n## Phase 6: Diff Review\n\n```bash\ngit diff --stat\ngit diff\n```\n\nChecklist:\n- No debugging logs left (`System.out`, `log.debug` without guards)\n- Meaningful errors and HTTP statuses\n- Transactions and validation present where needed\n- Config changes documented\n\n## Output Template\n\n```\nVERIFICATION REPORT\n===================\nBuild:     [PASS\u002FFAIL]\nStatic:    [PASS\u002FFAIL] (spotbugs\u002Fpmd\u002Fcheckstyle)\nTests:     [PASS\u002FFAIL] (X\u002FY passed, Z% coverage)\nSecurity:  [PASS\u002FFAIL] (CVE findings: N)\nDiff:      [X files changed]\n\nOverall:   [READY \u002F NOT READY]\n\nIssues to Fix:\n1. ...\n2. ...\n```\n\n## Continuous Mode\n\n- Re-run phases on significant changes or every 30–60 minutes in long sessions\n- Keep a short loop: `mvn -T 4 test` + spotbugs for quick feedback\n\n**Remember**: Fast feedback beats late surprises. Keep the gate strict—treat warnings as defects in production systems.\n","# Spring Boot Verification Loop\n\nRun before PRs, after major changes, and pre-deploy.\n\n## When to Activate\n\n- Before opening a pull request for a Spring Boot service\n- After major refactoring or dependency upgrades\n- Pre-deployment verification for staging or production\n- Running full build → lint → test → security scan pipeline\n- Validating test coverage meets thresholds\n\n## Phase 1: Build\n\n```bash\nmvn -T 4 clean verify -DskipTests\n# or\n.\u002Fgradlew clean assemble -x test\n```\n\nIf build fails, stop and fix.\n\n## Phase 2: Static Analysis\n\nMaven (common plugins):\n```bash\nmvn -T 4 spotbugs:check pmd:check checkstyle:check\n```\n\nGradle (if configured):\n```bash\n.\u002Fgradlew checkstyleMain pmdMain spotbugsMain\n```\n\n## Phase 3: Tests + Coverage\n\n```bash\nmvn -T 4 test\nmvn jacoco:report   # verify 80%+ coverage\n# or\n.\u002Fgradlew test jacocoTestReport\n```\n\nReport:\n- Total tests, passed\u002Ffailed\n- Coverage % (lines\u002Fbranches)\n\n### Unit Tests\n\nTest service logic in isolation with mocked dependencies:\n\n```java\n@ExtendWith(MockitoExtension.class)\nclass UserServiceTest {\n\n  @Mock private UserRepository userRepository;\n  @InjectMocks private UserService userService;\n\n  @Test\n  void createUser_validInput_returnsUser() {\n    var dto = new CreateUserDto(\"Alice\", \"alice@example.com\");\n    var expected = new User(1L, \"Alice\", \"alice@example.com\");\n    when(userRepository.save(any(User.class))).thenReturn(expected);\n\n    var result = userService.create(dto);\n\n    assertThat(result.name()).isEqualTo(\"Alice\");\n    verify(userRepository).save(any(User.class));\n  }\n\n  @Test\n  void createUser_duplicateEmail_throwsException() {\n    var dto = new CreateUserDto(\"Alice\", \"existing@example.com\");\n    when(userRepository.existsByEmail(dto.email())).thenReturn(true);\n\n    assertThatThrownBy(() -> userService.create(dto))\n        .isInstanceOf(DuplicateEmailException.class);\n  }\n}\n```\n\n### Integration Tests with Testcontainers\n\nTest against a real database instead of H2:\n\n```java\n@SpringBootTest\n@Testcontainers\nclass UserRepositoryIntegrationTest {\n\n  @Container\n  static PostgreSQLContainer\u003C?> postgres = new PostgreSQLContainer\u003C>(\"postgres:16-alpine\")\n      .withDatabaseName(\"testdb\");\n\n  @DynamicPropertySource\n  static void configureProperties(DynamicPropertyRegistry registry) {\n    registry.add(\"spring.datasource.url\", postgres::getJdbcUrl);\n    registry.add(\"spring.datasource.username\", postgres::getUsername);\n    registry.add(\"spring.datasource.password\", postgres::getPassword);\n  }\n\n  @Autowired private UserRepository userRepository;\n\n  @Test\n  void findByEmail_existingUser_returnsUser() {\n    userRepository.save(new User(\"Alice\", \"alice@example.com\"));\n\n    var found = userRepository.findByEmail(\"alice@example.com\");\n\n    assertThat(found).isPresent();\n    assertThat(found.get().getName()).isEqualTo(\"Alice\");\n  }\n}\n```\n\n### API Tests with MockMvc\n\nTest controller layer with full Spring context:\n\n```java\n@WebMvcTest(UserController.class)\nclass UserControllerTest {\n\n  @Autowired private MockMvc mockMvc;\n  @MockBean private UserService userService;\n\n  @Test\n  void createUser_validInput_returns201() throws Exception {\n    var user = new UserDto(1L, \"Alice\", \"alice@example.com\");\n    when(userService.create(any())).thenReturn(user);\n\n    mockMvc.perform(post(\"\u002Fapi\u002Fusers\")\n            .contentType(MediaType.APPLICATION_JSON)\n            .content(\"\"\"\n                {\"name\": \"Alice\", \"email\": \"alice@example.com\"}\n                \"\"\"))\n        .andExpect(status().isCreated())\n        .andExpect(jsonPath(\"$.name\").value(\"Alice\"));\n  }\n\n  @Test\n  void createUser_invalidEmail_returns400() throws Exception {\n    mockMvc.perform(post(\"\u002Fapi\u002Fusers\")\n            .contentType(MediaType.APPLICATION_JSON)\n            .content(\"\"\"\n                {\"name\": \"Alice\", \"email\": \"not-an-email\"}\n                \"\"\"))\n        .andExpect(status().isBadRequest());\n  }\n}\n```\n\n## Phase 4: Security Scan\n\n```bash\n# Dependency CVEs\nmvn org.owasp:dependency-check-maven:check\n# or\n.\u002Fgradlew dependencyCheckAnalyze\n\n# Secrets in source\ngrep -rn \"password\\s*=\\s*\\\"\" src\u002F --include=\"*.java\" --include=\"*.yml\" --include=\"*.properties\"\ngrep -rn \"sk-\\|api_key\\|secret\" src\u002F --include=\"*.java\" --include=\"*.yml\"\n\n# Secrets (git history)\ngit secrets --scan  # if configured\n```\n\n### Common Security Findings\n\n```\n# Check for System.out.println (use logger instead)\ngrep -rn \"System\\.out\\.print\" src\u002Fmain\u002F --include=\"*.java\"\n\n# Check for raw exception messages in responses\ngrep -rn \"e\\.getMessage()\" src\u002Fmain\u002F --include=\"*.java\"\n\n# Check for wildcard CORS\ngrep -rn \"allowedOrigins.*\\*\" src\u002Fmain\u002F --include=\"*.java\"\n```\n\n## Phase 5: Lint\u002FFormat (optional gate)\n\n```bash\nmvn spotless:apply   # if using Spotless plugin\n.\u002Fgradlew spotlessApply\n```\n\n## Phase 6: Diff Review\n\n```bash\ngit diff --stat\ngit diff\n```\n\nChecklist:\n- No debugging logs left (`System.out`, `log.debug` without guards)\n- Meaningful errors and HTTP statuses\n- Transactions and validation present where needed\n- Config changes documented\n\n## Output Template\n\n```\nVERIFICATION REPORT\n===================\nBuild:     [PASS\u002FFAIL]\nStatic:    [PASS\u002FFAIL] (spotbugs\u002Fpmd\u002Fcheckstyle)\nTests:     [PASS\u002FFAIL] (X\u002FY passed, Z% coverage)\nSecurity:  [PASS\u002FFAIL] (CVE findings: N)\nDiff:      [X files changed]\n\nOverall:   [READY \u002F NOT READY]\n\nIssues to Fix:\n1. ...\n2. ...\n```\n\n## Continuous Mode\n\n- Re-run phases on significant changes or every 30–60 minutes in long sessions\n- Keep a short loop: `mvn -T 4 test` + spotbugs for quick feedback\n\n**Remember**: Fast feedback beats late surprises. Keep the gate strict—treat warnings as defects in production systems.\n",{"name":5,"origin":44,"description":7},"ECC","main","a318f48de3c5718e8ea2e9f6fae7790e8a759e85","upstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fspringboot-verification",0,"https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fo-abdelmaksoud\u002F","Full-Stack Engineer | AI Systems Architect | Building autonomous multi-agent systems","2026-03-08 21:23:03",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add oabdelmaksoud\u002FAgention --skill springboot-verification",{"tool":60,"command":61},"bunx","bunx skills add oabdelmaksoud\u002FAgention --skill springboot-verification",{"tool":63,"command":64},"pnpm","pnpm dlx skills add oabdelmaksoud\u002FAgention --skill springboot-verification","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fspringboot-verification\u002FSKILL.md",true,[],[69,92,103,134,160,180],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":80,"publishedAt":39},"01M6G2QFCBNBYAJF2KTK85G9A6","visa-doc-translate","Translate visa application documents (images) to English and create a bilingual PDF with original and translation","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fvisa-doc-translate\u002FSKILL.md",[75],{"categoryNo":76,"categoryName":77,"taxonomyType":78,"taxonomyTypeDesc":79},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[81,82,83,84,22,85,86,87,88,89,90,91],"translate","doc","visa doc translate","bilingual","english","application","PDF","translation","documents","create","images",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":39},"01M6G2QB09TSK6BY4ME5X20EVQ","verification-loop","A comprehensive verification system for Claude Code sessions.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fverification-loop\u002FSKILL.md",[],[19,31,21,99,100,101,102],"sessions","code","claude code sessions","system",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":120,"publishedAt":39},"01M6G2Q6V2F7G03VAAF27FXPJR","tdd-workflow","Use this skill when writing new features, fixing bugs, or refactoring code. Enforces test-driven development with 80%+ coverage including unit, integration, and E2E tests.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Ftdd-workflow\u002FSKILL.md",[109,112,115],{"categoryNo":110,"categoryName":111,"taxonomyType":78,"taxonomyTypeDesc":79},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":113,"categoryName":114,"taxonomyType":78,"taxonomyTypeDesc":79},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[121,122,123,124,125,27,126,127,128,100,129,130,24,131,22,132,133],"workflow","tdd","tdd workflow","use","unit","refactoring","e2e","integration","development","e2e tests","driven","test","writing",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":140,"publishedAt":39},"01M6G2Q359YJRWAR2PFCEQAXF3","swiftui-patterns","SwiftUI architecture patterns, state management with @Observable, view composition, navigation, performance optimization, and modern iOS\u002FmacOS UI best practices.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswiftui-patterns\u002FSKILL.md",[],[141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,22],"patterns","swiftui","swiftui patterns","architecture","macos","performance","state management","best practices","state","ui","Optimization","ios","architecture patterns","Composition","performance optimization","view","management","swiftui architecture","navigation",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":167,"publishedAt":39},"01M6G2PY8B2FWZTWPZ84H83Y7C","swift-protocol-di-testing","Protocol-based dependency injection for testable Swift code — mock file system, network, and external APIs using focused protocols and Swift Testing.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswift-protocol-di-testing\u002FSKILL.md",[166],{"categoryNo":110,"categoryName":111,"taxonomyType":78,"taxonomyTypeDesc":79},[168,169,170,171,100,172,173,174,175,102,176,177,178,179],"swift protocol di testing","protocol","swift","testing","protocols","file","network","injection","dependency","swift testing","dependency injection","mock",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":186,"publishedAt":39},"01M6G2PSCN2GXV9FFZDRRRWVB6","swift-concurrency-6-2","Swift 6.2 Approachable Concurrency — single-threaded by default, @concurrent for explicit background offloading, isolated conformances for main actor types.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswift-concurrency-6-2\u002FSKILL.md",[],[187,188,189,170,190,45,191],"concurrency","swift concurrency","swift concurrency 6 2","default","types"]