[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MJ06XAJS71MCTGVRN88MHQ":3,"skill-same:01M6MJ06XAJS71MCTGVRN88MHQ":65},{"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":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":46,"ownerHtmlUrl":47,"ownerBlogUrl":48,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6MJ06XAJS71MCTGVRN88MHQ","presigned-uploads",null,"Use when the user has files larger than ~50 MB to extract via the cloud, or when base64-encoding the body would be wasteful. Covers the three-step presign \u002F PUT \u002F confirm flow against POST \u002Fv1\u002Fuploads\u002Fpresign and POST \u002Fv1\u002Fuploads\u002Fconfirm.","hashgraph-online\u002Fawesome-codex-plugins","hashgraph-online","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160371962?v=4","01M6CNB6NRJVNNGN14TR01Q6D3","HOL (Hashgraph Online)","01M6JT1HSKKG9V68KQAQGBA7XP",1554,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fkreuzberg-dev\u002Fplugins\u002Fplugins\u002Fkreuzberg-cloud\u002Fskills\u002Fpresigned-uploads\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"presigned uploads","uploads","when","encoding","body","presign","v1","post","via","three","files","use","extract","user","base64","flow","cloud","2026-11-10 10:12:30",false,"---\nname: presigned-uploads\ndescription: Use when the user has files larger than ~50 MB to extract via the cloud, or when base64-encoding the body would be wasteful. Covers the three-step presign \u002F PUT \u002F confirm flow against POST \u002Fv1\u002Fuploads\u002Fpresign and POST \u002Fv1\u002Fuploads\u002Fconfirm.\n---\n\n# Presigned uploads\n\nFor files larger than about 50 MB, skip the base64-in-JSON body of\n`POST \u002Fv1\u002Fextract` and use the three-step presigned-upload flow instead.\nThe client uploads bytes directly to object storage, then tells the API to\nstart processing.\n\n## When to reach for this\n\n- Single file > 50 MB.\n- Batch with aggregate body size > 100 MB.\n- Bandwidth-constrained environments where double-encoding (base64 + TLS\n  - worker) wastes throughput.\n- File already lives in S3 \u002F GCS and you can stream rather than buffer.\n\n## The three steps\n\n```text\n1. POST \u002Fv1\u002Fuploads\u002Fpresign  → batch_id + per-file presigned PUT URLs\n2. PUT \u003Cupload_url>          → upload each file's bytes directly\n3. POST \u002Fv1\u002Fuploads\u002Fconfirm  → start extraction, returns job_ids\n```\n\nStep 1 returns one `upload_url` per document. Step 3 cannot run until\nevery PUT in step 2 succeeds.\n\n## Step 1 — presign\n\n```bash\ncurl -X POST https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fuploads\u002Fpresign \\\n  -H \"Authorization: Bearer $KREUZBERG_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"documents\": [\n      {\"filename\": \"scan.pdf\", \"mime_type\": \"application\u002Fpdf\"},\n      {\"filename\": \"report.docx\", \"mime_type\": \"application\u002Fvnd.openxmlformats-officedocument.wordprocessingml.document\"}\n    ],\n    \"config\": {\"output_format\": \"markdown\"},\n    \"webhook\": {\"url\": \"https:\u002F\u002Fhooks.example.com\u002Fx\"}\n  }'\n```\n\n### Response\n\n```json\n{\n  \"batch_id\": \"batch_550e8400-e29b-41d4-a716\",\n  \"uploads\": [\n    {\n      \"job_id\": \"550e8400-...\",\n      \"upload_url\": \"https:\u002F\u002Fstorage.googleapis.com\u002Fkreuzberg-dev-uploads\u002F...\",\n      \"object_key\": \"projects\u002Fabc123\u002Fuploads\u002F550e8400-...\",\n      \"method\": \"PUT\",\n      \"expires_in_secs\": 3600\n    },\n    {\n      \"job_id\": \"660e9400-...\",\n      \"upload_url\": \"https:\u002F\u002Fstorage.googleapis.com\u002Fkreuzberg-dev-uploads\u002F...\",\n      \"object_key\": \"projects\u002Fabc123\u002Fuploads\u002F660e9400-...\",\n      \"method\": \"PUT\",\n      \"expires_in_secs\": 3600\n    }\n  ]\n}\n```\n\nKeep the `batch_id` — you need it for step 3. URLs expire in 3600 seconds\n(1 hour); upload before then.\n\n## Step 2 — PUT to each upload URL\n\nThe presigned URL is signed by Google Cloud Storage; PUT directly to it,\n**without** an `Authorization` header. Set `Content-Type` to match the\n`mime_type` declared in step 1:\n\n```bash\ncurl -X PUT \"\u003Cupload_url>\" \\\n  -H \"Content-Type: application\u002Fpdf\" \\\n  --data-binary @scan.pdf\n```\n\nA successful upload returns `200 OK` with no body. Do this for every\nentry in `uploads` before moving on.\n\n## Step 3 — confirm\n\n```bash\ncurl -X POST https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fuploads\u002Fconfirm \\\n  -H \"Authorization: Bearer $KREUZBERG_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"batch_id\": \"batch_550e8400-e29b-41d4-a716\"}'\n```\n\n### Response (202)\n\n```json\n{\n  \"job_ids\": [\"550e8400-...\", \"660e9400-...\"],\n  \"status\": \"processing\"\n}\n```\n\nThese are the same `job_id` values returned in step 1's `uploads` array.\nFrom here, the flow is identical to `offloading-extraction` — poll\n`GET \u002Fv1\u002Fjobs\u002F{id}` or wait for the webhook.\n\n## End-to-end curl example\n\n```bash\n#!\u002Fusr\u002Fbin\u002Fenv bash\nset -euo pipefail\nAPI=\"https:\u002F\u002Fapi.kreuzberg.dev\"\nKEY=\"$KREUZBERG_API_KEY\"\nFILE=\"scan.pdf\"\n\n# 1. Presign\nresp=$(curl -fsS -X POST \"$API\u002Fv1\u002Fuploads\u002Fpresign\" \\\n  -H \"Authorization: Bearer $KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"documents\":[{\"filename\":\"'\"$FILE\"'\",\"mime_type\":\"application\u002Fpdf\"}]}')\n\nbatch_id=$(echo \"$resp\" | jq -r .batch_id)\nupload_url=$(echo \"$resp\" | jq -r '.uploads[0].upload_url')\n\n# 2. PUT\ncurl -fsS -X PUT \"$upload_url\" \\\n  -H \"Content-Type: application\u002Fpdf\" \\\n  --data-binary \"@$FILE\"\n\n# 3. Confirm\ncurl -fsS -X POST \"$API\u002Fv1\u002Fuploads\u002Fconfirm\" \\\n  -H \"Authorization: Bearer $KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"batch_id\":\"'\"$batch_id\"'\"}' | jq .\n```\n\n## Errors\n\n| Status | Where | Cause |\n|---|---|---|\n| `400` | presign | Empty `documents`, bad MIME, missing `filename`. |\n| `403` | PUT | URL expired (>1h since presign) or `Content-Type` mismatch. |\n| `400` | confirm | One or more uploads missing in storage. |\n| `401` | presign\u002Fconfirm | Bad Bearer token. |\n\nIf `confirm` returns `400` complaining about a missing upload, retry the\nPUT for that specific `object_key` — confirmation requires every file to\nbe present in storage first.\n\n## When not to use this\n\nFor files under ~5 MB, the JSON `data` field is simpler and lower-latency\n(one round trip instead of three). See the `offloading-extraction` skill.\n","# Presigned uploads\n\nFor files larger than about 50 MB, skip the base64-in-JSON body of\n`POST \u002Fv1\u002Fextract` and use the three-step presigned-upload flow instead.\nThe client uploads bytes directly to object storage, then tells the API to\nstart processing.\n\n## When to reach for this\n\n- Single file > 50 MB.\n- Batch with aggregate body size > 100 MB.\n- Bandwidth-constrained environments where double-encoding (base64 + TLS\n  - worker) wastes throughput.\n- File already lives in S3 \u002F GCS and you can stream rather than buffer.\n\n## The three steps\n\n```text\n1. POST \u002Fv1\u002Fuploads\u002Fpresign  → batch_id + per-file presigned PUT URLs\n2. PUT \u003Cupload_url>          → upload each file's bytes directly\n3. POST \u002Fv1\u002Fuploads\u002Fconfirm  → start extraction, returns job_ids\n```\n\nStep 1 returns one `upload_url` per document. Step 3 cannot run until\nevery PUT in step 2 succeeds.\n\n## Step 1 — presign\n\n```bash\ncurl -X POST https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fuploads\u002Fpresign \\\n  -H \"Authorization: Bearer $KREUZBERG_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"documents\": [\n      {\"filename\": \"scan.pdf\", \"mime_type\": \"application\u002Fpdf\"},\n      {\"filename\": \"report.docx\", \"mime_type\": \"application\u002Fvnd.openxmlformats-officedocument.wordprocessingml.document\"}\n    ],\n    \"config\": {\"output_format\": \"markdown\"},\n    \"webhook\": {\"url\": \"https:\u002F\u002Fhooks.example.com\u002Fx\"}\n  }'\n```\n\n### Response\n\n```json\n{\n  \"batch_id\": \"batch_550e8400-e29b-41d4-a716\",\n  \"uploads\": [\n    {\n      \"job_id\": \"550e8400-...\",\n      \"upload_url\": \"https:\u002F\u002Fstorage.googleapis.com\u002Fkreuzberg-dev-uploads\u002F...\",\n      \"object_key\": \"projects\u002Fabc123\u002Fuploads\u002F550e8400-...\",\n      \"method\": \"PUT\",\n      \"expires_in_secs\": 3600\n    },\n    {\n      \"job_id\": \"660e9400-...\",\n      \"upload_url\": \"https:\u002F\u002Fstorage.googleapis.com\u002Fkreuzberg-dev-uploads\u002F...\",\n      \"object_key\": \"projects\u002Fabc123\u002Fuploads\u002F660e9400-...\",\n      \"method\": \"PUT\",\n      \"expires_in_secs\": 3600\n    }\n  ]\n}\n```\n\nKeep the `batch_id` — you need it for step 3. URLs expire in 3600 seconds\n(1 hour); upload before then.\n\n## Step 2 — PUT to each upload URL\n\nThe presigned URL is signed by Google Cloud Storage; PUT directly to it,\n**without** an `Authorization` header. Set `Content-Type` to match the\n`mime_type` declared in step 1:\n\n```bash\ncurl -X PUT \"\u003Cupload_url>\" \\\n  -H \"Content-Type: application\u002Fpdf\" \\\n  --data-binary @scan.pdf\n```\n\nA successful upload returns `200 OK` with no body. Do this for every\nentry in `uploads` before moving on.\n\n## Step 3 — confirm\n\n```bash\ncurl -X POST https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fuploads\u002Fconfirm \\\n  -H \"Authorization: Bearer $KREUZBERG_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"batch_id\": \"batch_550e8400-e29b-41d4-a716\"}'\n```\n\n### Response (202)\n\n```json\n{\n  \"job_ids\": [\"550e8400-...\", \"660e9400-...\"],\n  \"status\": \"processing\"\n}\n```\n\nThese are the same `job_id` values returned in step 1's `uploads` array.\nFrom here, the flow is identical to `offloading-extraction` — poll\n`GET \u002Fv1\u002Fjobs\u002F{id}` or wait for the webhook.\n\n## End-to-end curl example\n\n```bash\n#!\u002Fusr\u002Fbin\u002Fenv bash\nset -euo pipefail\nAPI=\"https:\u002F\u002Fapi.kreuzberg.dev\"\nKEY=\"$KREUZBERG_API_KEY\"\nFILE=\"scan.pdf\"\n\n# 1. Presign\nresp=$(curl -fsS -X POST \"$API\u002Fv1\u002Fuploads\u002Fpresign\" \\\n  -H \"Authorization: Bearer $KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"documents\":[{\"filename\":\"'\"$FILE\"'\",\"mime_type\":\"application\u002Fpdf\"}]}')\n\nbatch_id=$(echo \"$resp\" | jq -r .batch_id)\nupload_url=$(echo \"$resp\" | jq -r '.uploads[0].upload_url')\n\n# 2. PUT\ncurl -fsS -X PUT \"$upload_url\" \\\n  -H \"Content-Type: application\u002Fpdf\" \\\n  --data-binary \"@$FILE\"\n\n# 3. Confirm\ncurl -fsS -X POST \"$API\u002Fv1\u002Fuploads\u002Fconfirm\" \\\n  -H \"Authorization: Bearer $KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"batch_id\":\"'\"$batch_id\"'\"}' | jq .\n```\n\n## Errors\n\n| Status | Where | Cause |\n|---|---|---|\n| `400` | presign | Empty `documents`, bad MIME, missing `filename`. |\n| `403` | PUT | URL expired (>1h since presign) or `Content-Type` mismatch. |\n| `400` | confirm | One or more uploads missing in storage. |\n| `401` | presign\u002Fconfirm | Bad Bearer token. |\n\nIf `confirm` returns `400` complaining about a missing upload, retry the\nPUT for that specific `object_key` — confirmation requires every file to\nbe present in storage first.\n\n## When not to use this\n\nFor files under ~5 MB, the JSON `data` field is simpler and lower-latency\n(one round trip instead of three). See the `offloading-extraction` skill.\n",{"name":5,"description":7},"main","2b63f856ce19c2a797929cacabd9e0fc936812fa","plugins\u002Fkreuzberg-dev\u002Fplugins\u002Fplugins\u002Fkreuzberg-cloud\u002Fskills\u002Fpresigned-uploads",468,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins","https:\u002F\u002Fhol.org\u002Fplugins\u002Fbest-codex-plugins","https:\u002F\u002Fgithub.com\u002Fhashgraph-online","https:\u002F\u002Fhol.org","Open-source standards and developer tools for interoperable AI agents: discovery, identity, communication, payments, privacy and security.","2026-11-11 02:22:54",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add hashgraph-online\u002Fawesome-codex-plugins --skill presigned-uploads",{"tool":57,"command":58},"bunx","bunx skills add hashgraph-online\u002Fawesome-codex-plugins --skill presigned-uploads",{"tool":60,"command":61},"pnpm","pnpm dlx skills add hashgraph-online\u002Fawesome-codex-plugins --skill presigned-uploads","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fkreuzberg-dev\u002Fplugins\u002Fplugins\u002Fkreuzberg-cloud\u002Fskills\u002Fpresigned-uploads\u002FSKILL.md",true,[],[66,92,117,151,171,185],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":36},"01M716A6ETNB9B1SQ3GXZC75VR","deja-search","deja-vu memory — search the user's past AI coding sessions with the deja CLI. Holds what they already settled and never wrote into the repo (naming rules, banned or already-tried tools, required checks before merge, preferred values, who owns what). Use before your first edit in a task, before you call a change done or ready to merge, before you recommend a tool, library, design or reviewer, before re-debugging an error that may already be solved, when they say 'didn't we fix this before', 'what did we decide about X' or 'I already have that', and before telling them something on this machine does not exist.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-search\u002FSKILL.md",[],[73,74,75,76,77,78,79,80,81,82,83,21,84,85,86,87,88,89,90,91],"search","deja search","error","ready","never","memory","re","decide","fix","design","debugging","you","done","reviewer","io","change","cli","merge","past",{"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":36},"01M716A3J2W5SENSE9VGMXB375","deja-reflect","End-of-session reflection and memory curation with deja-vu. Review what was decided, what commands broke and what repaired them, and record durable project rules or decisions with deja remember so the next session starts with them.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-reflect\u002FSKILL.md",[],[99,100,101,102,78,103,104,105,106,107,108,109,110,87,111,112,113,114,115,116],"reflect","deja reflect","brew","remember","project rules","project","session","end","reflection","Rules","decisions","review","with","record","github","next","https","node",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":134,"publishedAt":36},"01M715T3RR4BAYSR57HPPTJ0PF","revid","Make, edit, export and post AI videos with Revid (revid.ai) through the Revid MCP server. Use whenever the user wants a short-form or long-form video made (from an idea, a script, a URL, an article, a PDF, a tweet, a product page, their own clips, or a song), wants to find what is going viral on TikTok, YouTube, Instagram or X before making something, wants to edit or re-export an existing Revid project, generate a standalone AI image or clip, make a series episode, or publish and schedule a finished video to connected social accounts. Covers setup (hosted MCP with OAuth, or an API key), the 36 tools, credits, polling and the rules for publishing. Routes to the more specific revid-* skills when one fits.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftmakersas\u002Frevid-skills\u002Fskills\u002Frevid\u002FSKILL.md",[123,128,131],{"categoryNo":124,"categoryName":125,"taxonomyType":126,"taxonomyTypeDesc":127},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":129,"categoryName":130,"taxonomyType":126,"taxonomyTypeDesc":127},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":132,"categoryName":133,"taxonomyType":126,"taxonomyTypeDesc":127},"01JBSEEDCAT000000000000023","Skill与智能体开发",[119,135,136,137,138,139,104,140,79,141,142,143,144,21,145,146,147,148,149,150],"Video","short-form","standalone","PDF","viral","tiktok","short","social","MCP","song","URL","image","mcp server","schedule","api","publish",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":157,"publishedAt":36},"01M71569ZM2X3H5RBFK8PVKMK2","review-study","Review a QuestionPunk survey before launch for wording, answer choices, branching, and missing settings. Use for check my survey or review this draft before publishing.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fquestionpunk\u002Fcodex-plugin\u002Fskills\u002Freview-study\u002FSKILL.md",[],[158,159,110,160,161,162,163,164,30,165,166,167,168,169,170],"study","review study","for","answer","missing","survey","publishing","check","draft","settings","launch","my","branching",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":36},"01M71567GV0C35YQBY0DPGR86B","manage-study","Find QuestionPunk studies, check status, publish an explicitly requested draft, or retrieve its participant link. Use for find my survey, publish this study, or how many people responded.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fquestionpunk\u002Fcodex-plugin\u002Fskills\u002Fmanage-study\u002FSKILL.md",[],[178,158,179,160,163,30,180,165,166,150,181,182,183,184,169],"manage study","manage","people","how","find","link","status",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":191,"publishedAt":36},"01M71565A8TCA01AZQZRGRYMFZ","create-study","Create a saved QuestionPunk survey draft from a research brief or edit specified questions. Use for requests such as make a customer feedback survey or shorten my onboarding study.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fquestionpunk\u002Fcodex-plugin\u002Fskills\u002Fcreate-study\u002FSKILL.md",[],[192,158,193,194,195,196,160,197,163,198,30,199,200,166,201,202,203,204,205,169],"create study","create","brief","as","feedback","customer feedback","research brief","shorten","saved","research","requests","customer","questions","edit"]