{
  "status": "rendered and verified",
  "output_file": "08-explainer-video.mp4",
  "output_sha256": "528f7685037f26673dce2dcbfd60fff7f7889ee0af8e999d334b1e589dd967d1",
  "output_bytes": 12705326,
  "output_duration_seconds": 251.033333,
  "native_resolution": [
    1920,
    1080
  ],
  "upscaled": false,
  "frame_rate": "30/1",
  "frame_count": 7531,
  "video_stream": {
    "index": 0,
    "codec_name": "h264",
    "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
    "profile": "High",
    "codec_type": "video",
    "codec_tag_string": "avc1",
    "codec_tag": "0x31637661",
    "width": 1920,
    "height": 1080,
    "coded_width": 1920,
    "coded_height": 1080,
    "has_b_frames": 0,
    "sample_aspect_ratio": "1:1",
    "display_aspect_ratio": "16:9",
    "pix_fmt": "yuv420p",
    "level": 50,
    "color_range": "tv",
    "color_space": "bt709",
    "color_transfer": "bt709",
    "color_primaries": "bt709",
    "chroma_location": "left",
    "field_order": "progressive",
    "refs": 1,
    "is_avc": "true",
    "nal_length_size": "4",
    "id": "0x1",
    "r_frame_rate": "30/1",
    "avg_frame_rate": "30/1",
    "time_base": "1/15360",
    "start_pts": 0,
    "start_time": "0.000000",
    "duration_ts": 3855872,
    "duration": "251.033333",
    "bit_rate": "205544",
    "bits_per_raw_sample": "8",
    "nb_frames": "7531",
    "extradata_size": 50,
    "disposition": {
      "default": 1,
      "dub": 0,
      "original": 0,
      "comment": 0,
      "lyrics": 0,
      "karaoke": 0,
      "forced": 0,
      "hearing_impaired": 0,
      "visual_impaired": 0,
      "clean_effects": 0,
      "attached_pic": 0,
      "timed_thumbnails": 0,
      "non_diegetic": 0,
      "captions": 0,
      "descriptions": 0,
      "metadata": 0,
      "dependent": 0,
      "still_image": 0,
      "multilayer": 0
    },
    "tags": {
      "language": "und",
      "handler_name": "VideoHandler",
      "vendor_id": "[0][0][0][0]",
      "encoder": "Lavc62.11.100 libx264"
    }
  },
  "audio_stream": {
    "index": 1,
    "codec_name": "aac",
    "codec_long_name": "AAC (Advanced Audio Coding)",
    "profile": "LC",
    "codec_type": "audio",
    "codec_tag_string": "mp4a",
    "codec_tag": "0x6134706d",
    "sample_fmt": "fltp",
    "sample_rate": "48000",
    "channels": 2,
    "channel_layout": "stereo",
    "bits_per_sample": 0,
    "initial_padding": 0,
    "id": "0x2",
    "r_frame_rate": "0/0",
    "avg_frame_rate": "0/0",
    "time_base": "1/48000",
    "start_pts": 0,
    "start_time": "0.000000",
    "duration_ts": 12049584,
    "duration": "251.033000",
    "bit_rate": "192376",
    "nb_frames": "11769",
    "extradata_size": 2,
    "disposition": {
      "default": 1,
      "dub": 0,
      "original": 0,
      "comment": 0,
      "lyrics": 0,
      "karaoke": 0,
      "forced": 0,
      "hearing_impaired": 0,
      "visual_impaired": 0,
      "clean_effects": 0,
      "attached_pic": 0,
      "timed_thumbnails": 0,
      "non_diegetic": 0,
      "captions": 0,
      "descriptions": 0,
      "metadata": 0,
      "dependent": 0,
      "still_image": 0,
      "multilayer": 0
    },
    "tags": {
      "language": "und",
      "handler_name": "SoundHandler",
      "vendor_id": "[0][0][0][0]"
    }
  },
  "production_start_utc": "2026-10-27T21:03:51.576937+00:00",
  "verification_end_utc": "2026-10-27T22:00:46.288292+00:00",
  "production_elapsed_seconds": 3414.711355,
  "elapsed_definition": "Video script and asset preparation through finished-file verification; book reading and later archive packaging excluded.",
  "render": {
    "started_at_utc": "2026-10-27T21:50:31.040403+00:00",
    "finished_at_utc": "2026-10-27T21:53:51.720562+00:00",
    "wall_seconds": 200.68015779199777,
    "exit_code": 0,
    "command": [
      "node",
      "/home/albert/.npm/_npx/d5029dd092d313d5/node_modules/hyperframes/bin/hyperframes.mjs",
      "render",
      "--quality",
      "delivery",
      "--fps",
      "30",
      "--workers",
      "2",
      "--no-browser-gpu",
      "--output",
      "renders/pragma-feedback-explainer.mp4"
    ],
    "definition": "Full local HyperFrames render process, including validation, browser setup, capture, encoding and audio mux. Not pure GPU compute time.",
    "render_jobs_completed": 1,
    "render_jobs_failed": 0,
    "render_jobs_retried": 0,
    "browser_gpu": false,
    "workers_requested": 2
  },
  "render_pipeline_seconds": 199.378,
  "render_phase_seconds": {
    "compile": 0.204,
    "browser_probe": 0.053,
    "video_extract": 0.001,
    "audio_process": 7.892,
    "file_server": 0.006,
    "capture_disk": 189.713,
    "encode": 1.068,
    "assemble": 0.397
  },
  "summed_render_processing_seconds": 200.68015779199777,
  "scene_times": [
    {
      "scene": 1,
      "title": "Almost ready, still waiting",
      "start_seconds": 0,
      "end_seconds": 26.72133,
      "output_seconds": 26.72133,
      "voice_generation_seconds": 3.4154622554779053,
      "separate_render_time_seconds": null,
      "render_note": "One continuous render; individual scene render times are not exposed."
    },
    {
      "scene": 2,
      "title": "Waiting has more than one cost",
      "start_seconds": 26.72133,
      "end_seconds": 51.70667,
      "output_seconds": 24.985340000000004,
      "voice_generation_seconds": 3.0638835430145264,
      "separate_render_time_seconds": null,
      "render_note": "One continuous render; individual scene render times are not exposed."
    },
    {
      "scene": 3,
      "title": "Choose a result that can finish",
      "start_seconds": 51.70667,
      "end_seconds": 80.40533,
      "output_seconds": 28.698660000000004,
      "voice_generation_seconds": 3.5069332122802734,
      "separate_render_time_seconds": null,
      "render_note": "One continuous render; individual scene render times are not exposed."
    },
    {
      "scene": 4,
      "title": "Work on what limits the result",
      "start_seconds": 80.40533,
      "end_seconds": 107.368,
      "output_seconds": 26.96266999999999,
      "voice_generation_seconds": 3.2730164527893066,
      "separate_render_time_seconds": null,
      "render_note": "One continuous render; individual scene render times are not exposed."
    },
    {
      "scene": 5,
      "title": "Protect room for the difficult case",
      "start_seconds": 107.368,
      "end_seconds": 137.79467,
      "output_seconds": 30.42667,
      "voice_generation_seconds": 3.7798404693603516,
      "separate_render_time_seconds": null,
      "render_note": "One continuous render; individual scene render times are not exposed."
    },
    {
      "scene": 6,
      "title": "Improve the next attempt",
      "start_seconds": 137.79467,
      "end_seconds": 165.68133,
      "output_seconds": 27.886660000000006,
      "voice_generation_seconds": 3.4717729091644287,
      "separate_render_time_seconds": null,
      "render_note": "One continuous render; individual scene render times are not exposed."
    },
    {
      "scene": 7,
      "title": "Let the work test the description",
      "start_seconds": 165.68133,
      "end_seconds": 195.624,
      "output_seconds": 29.942669999999993,
      "voice_generation_seconds": 3.7129263877868652,
      "separate_render_time_seconds": null,
      "render_note": "One continuous render; individual scene render times are not exposed."
    },
    {
      "scene": 8,
      "title": "Leave room for the answer to change",
      "start_seconds": 195.624,
      "end_seconds": 224.70667,
      "output_seconds": 29.082670000000007,
      "voice_generation_seconds": 3.679827928543091,
      "separate_render_time_seconds": null,
      "render_note": "One continuous render; individual scene render times are not exposed."
    },
    {
      "scene": 9,
      "title": "The next complete result",
      "start_seconds": 224.70667,
      "end_seconds": 251.03333,
      "output_seconds": 26.326660000000004,
      "voice_generation_seconds": 3.1999900341033936,
      "separate_render_time_seconds": null,
      "render_note": "One continuous render; individual scene render times are not exposed."
    }
  ],
  "voice": {
    "software": {
      "kokoro_onnx": "0.4.7",
      "onnxruntime": "1.30.0"
    },
    "provider": "local Kokoro ONNX",
    "model": "Kokoro v1.0 82M",
    "model_sha256": "7d5df8ecf7d4b1878015a32686053fd0eebe2bc377234608764cc0ef3636a6c5",
    "model_bytes": 325532387,
    "voice": "bm_george",
    "speed": 1.0,
    "language": "en-gb",
    "device": "CPUExecutionProvider",
    "threads": 4,
    "sample_rate": 24000,
    "format": "WAV PCM signed 16-bit mono",
    "wall_seconds": 31.83724284172058,
    "sum_paragraph_generation_seconds": 31.10365319252014,
    "completed_jobs": 18,
    "failed_jobs": 0,
    "retried_jobs": 0,
    "clips": [
      {
        "scene": 1,
        "paragraph": 1,
        "text": "You have done most of the work. The project looks almost finished. Yet it still cannot tell you whether the idea works.",
        "start": 0.6,
        "end": 7.768,
        "duration": 7.168,
        "generation_seconds": 1.0706980228424072,
        "path": "assets/voice/01-01.wav"
      },
      {
        "scene": 1,
        "paragraph": 2,
        "text": "In PRAGMA, Sebastian Marshall describes an advertising experiment he prepared with Kai Zau. After several days of setup, the nearly completed experiment sat for another five days. It kept returning to mind, while the market feedback had not arrived.",
        "start": 8.128,
        "end": 24.66133,
        "duration": 16.533333333333335,
        "generation_seconds": 2.344764232635498,
        "path": "assets/voice/01-02.wav"
      },
      {
        "scene": 2,
        "paragraph": 1,
        "text": "Marshall separates two problems. Unfinished work keeps claiming attention. And, over time, the context needed to resume it can fade.",
        "start": 27.32133,
        "end": 36.23867,
        "duration": 8.917333333333334,
        "generation_seconds": 1.2270872592926025,
        "path": "assets/voice/02-01.wav"
      },
      {
        "scene": 2,
        "paragraph": 2,
        "text": "This does not make every pause a mistake. Incubation can help a difficult question, and some work must wait for other people. His target is a known next step that repeatedly waits without a useful reason.",
        "start": 36.59867,
        "end": 49.84667,
        "duration": 13.248,
        "generation_seconds": 1.8367962837219238,
        "path": "assets/voice/02-02.wav"
      },
      {
        "scene": 3,
        "paragraph": 1,
        "text": "The useful response is to define a stage that can actually be completed. For an essay, that might be an outline. For an experiment, it might be the setup that lets the test begin.",
        "start": 52.30667,
        "end": 63.93333,
        "duration": 11.626666666666667,
        "generation_seconds": 1.5621240139007568,
        "path": "assets/voice/03-01.wav"
      },
      {
        "scene": 3,
        "paragraph": 2,
        "text": "Here is our visual metaphor: fitting the final connector turns a nearly complete object into a working test. The remaining work can be small while its consequence is large. The point is what completion makes possible.",
        "start": 64.29333,
        "end": 78.24533,
        "duration": 13.952,
        "generation_seconds": 1.9448091983795166,
        "path": "assets/voice/03-02.wav"
      },
      {
        "scene": 4,
        "paragraph": 1,
        "text": "But completion alone is not a sufficient goal. The result must matter. Marshall uses a burger stand to explain a constraint: if the grill limits output, taking orders faster only builds a longer queue.",
        "start": 81.00533,
        "end": 94.552,
        "duration": 13.546666666666667,
        "generation_seconds": 1.865055799484253,
        "path": "assets/voice/04-01.wav"
      },
      {
        "scene": 4,
        "paragraph": 2,
        "text": "Ask which step currently prevents the outcome you want. Improve that step, then look again. Once the constraint moves, repeating the old improvement may stop helping.",
        "start": 94.912,
        "end": 105.408,
        "duration": 10.496,
        "generation_seconds": 1.4079606533050537,
        "path": "assets/voice/04-02.wav"
      },
      {
        "scene": 5,
        "paragraph": 1,
        "text": "A plan can also fail because every available hour is already promised. One unexpectedly difficult task then pushes the whole result beyond its deadline.",
        "start": 107.968,
        "end": 118.61333,
        "duration": 10.645333333333333,
        "generation_seconds": 1.44389009475708,
        "path": "assets/voice/05-01.wav"
      },
      {
        "scene": 5,
        "paragraph": 2,
        "text": "Marshall recommends fewer active commitments and spare capacity for important work. In our illustration, a difficult component uses the reserved space. The deadline stays where it was. A reserve improves resilience; it does not guarantee success.",
        "start": 118.97333,
        "end": 135.63467,
        "duration": 16.661333333333335,
        "generation_seconds": 2.3359503746032715,
        "path": "assets/voice/05-02.wav"
      },
      {
        "scene": 6,
        "paragraph": 1,
        "text": "Repeated work offers another opportunity. Marshall describes a progression from one-off effort toward a repeatable process, and sometimes automation.",
        "start": 138.39467,
        "end": 148.80533,
        "duration": 10.410666666666666,
        "generation_seconds": 1.413851022720337,
        "path": "assets/voice/06-01.wav"
      },
      {
        "scene": 6,
        "paragraph": 2,
        "text": "The aim is a useful result with less avoidable friction. Capture the steps that worked. Review what caused trouble. Make the next attempt easier. Keep judgment in the process: a smoothly repeated mistake is still a mistake.",
        "start": 149.16533,
        "end": 163.82133,
        "duration": 14.656,
        "generation_seconds": 2.057921886444092,
        "path": "assets/voice/06-02.wav"
      },
      {
        "scene": 7,
        "paragraph": 1,
        "text": "PRAGMA also asks us to inspect the language around our work. A label such as productive can conceal the question of what was produced. A confident identity can drift away from the conduct meant to support it.",
        "start": 166.28133,
        "end": 180.212,
        "duration": 13.930666666666667,
        "generation_seconds": 1.922039270401001,
        "path": "assets/voice/07-01.wav"
      },
      {
        "scene": 7,
        "paragraph": 2,
        "text": "This connection is our editorial synthesis: let a description answer to observable action. A polished plan or an impressive name should invite examination of the result, rather than replace it.",
        "start": 180.572,
        "end": 193.564,
        "duration": 12.992,
        "generation_seconds": 1.7908871173858643,
        "path": "assets/voice/07-02.wav"
      },
      {
        "scene": 8,
        "paragraph": 1,
        "text": "Even a clear, meaningful claim can be false. Marshall distinguishes understanding a representation from discovering whether the world matches it.",
        "start": 196.224,
        "end": 205.99467,
        "duration": 9.770666666666667,
        "generation_seconds": 1.3956730365753174,
        "path": "assets/voice/08-01.wav"
      },
      {
        "scene": 8,
        "paragraph": 2,
        "text": "Before a test, write down what you expect to happen. Afterwards, compare that expectation with the result. One outcome will not settle every question, but a record makes it harder to quietly rewrite what you expected. That last application is ours.",
        "start": 206.35467,
        "end": 222.54667,
        "duration": 16.192,
        "generation_seconds": 2.2841548919677734,
        "path": "assets/voice/08-02.wav"
      },
      {
        "scene": 9,
        "paragraph": 1,
        "text": "These ideas give one practical question for an open project: what is the next complete result that will let us find something out?",
        "start": 225.30667,
        "end": 233.81867,
        "duration": 8.512,
        "generation_seconds": 1.151954174041748,
        "path": "assets/voice/09-01.wav"
      },
      {
        "scene": 9,
        "paragraph": 2,
        "text": "Name it. Locate the step preventing it. Leave enough room to finish it. Then let the answer change what you do next. That is one route through PRAGMA: making work answerable to results, and our descriptions answerable to evidence.",
        "start": 234.17867,
        "end": 248.17333,
        "duration": 13.994666666666667,
        "generation_seconds": 2.0480358600616455,
        "path": "assets/voice/09-02.wav"
      }
    ],
    "peak_vram": "not applicable, CPU inference",
    "energy": "not recorded",
    "adapters": "none",
    "seed": "not exposed by API",
    "diffusion_settings": "not applicable"
  },
  "sound": {
    "source": "Original procedural score and sound cues; no external music or sampled effects",
    "seed": 27102026,
    "sample_rate": 48000,
    "stereo": true,
    "score_rhythm": "one three-note chord every 5 seconds with sparse delayed upper notes",
    "score_frequencies_hz": [
      [
        146.832,
        220,
        293.665
      ],
      [
        130.813,
        195.998,
        261.626
      ],
      [
        164.814,
        220,
        329.628
      ],
      [
        146.832,
        195.998,
        293.665
      ]
    ],
    "score_target_lufs": -36,
    "voice_target_lufs": -18,
    "speech_carve": "Dynamic HyperFrames voiceover carve applied after stem preparation; see index.html and qa/carve.json",
    "voice_processing": "65 Hz highpass; loudness normalization -18 LUFS, -2 dBTP, LRA9",
    "sfx_events": 17,
    "wall_seconds": 6.975289583206177,
    "completed": true,
    "generated_models": "None for score/SFX (deterministic DSP)",
    "audio_listened_to": false
  },
  "voice_quantization": "not independently verified; hash and bytes recorded",
  "render_model": "Authored vector animation; no generative video model",
  "software": {
    "hyperframes": "0.8.200",
    "gsap": "3.15.0",
    "node": "v24.20.0",
    "ffmpeg_verification": "ffmpeg version 8.0.1-3ubuntu2 Copyright (c) 2000-2025 the FFmpeg developers",
    "kokoro_onnx": "0.4.7",
    "onnxruntime": "1.30.0"
  },
  "audio_preparation_attempts": {
    "completed": 1,
    "failed": 0,
    "retried": 0
  },
  "peak_vram": "not recorded",
  "energy": "not recorded",
  "steps_sampler_scheduler_guidance_denoise": "not applicable",
  "captions": "Measured paragraph boundaries; approximate sentence positions",
  "verification": {
    "decode": "pass, all audio and video frames decoded without errors",
    "metadata_assertions": "pass",
    "loudness": {
      "input_i": "-15.05",
      "input_tp": "-1.84",
      "input_lra": "3.50",
      "input_thresh": "-25.79",
      "output_i": "-18.00",
      "output_tp": "-4.40",
      "output_lra": "3.50",
      "output_thresh": "-28.69",
      "normalization_type": "dynamic",
      "target_offset": "-0.00"
    },
    "audio_listened_to": false,
    "wall_seconds": 6.274051719999989,
    "sampled_decoded_frames": 9,
    "frame_review": "pass \u2014 nine decoded scene frames inspected; connector contact precedes feedback, fixed deadline preserved, prediction retained beside observation, and same test object remains continuous.",
    "preview_review": "Eighteen source snapshots plus actual Studio preview at 67 s, 73 s and a backward seek to 6 s; initial positioning defect corrected before render.",
    "verification_attempts": {
      "completed": 1,
      "failed": 2,
      "reason": "Two verification wrappers reached decode and frame extraction but failed at contact-sheet creation because the narration virtual environment lacks Pillow. Completed using system Python with Pillow."
    }
  },
  "warnings": {
    "lint": 0,
    "runtime": 0,
    "layout": 0,
    "motion": 0,
    "contrast": 0,
    "craft": 21
  },
  "readable_stats": [
    [
      "Output",
      "251.033 s \u00b7 1920 \u00d7 1080 native \u00b7 30 fps \u00b7 7531 frames \u00b7 no upscaling"
    ],
    [
      "File",
      "MP4 \u00b7 H.264 High \u00b7 yuv420p \u00b7 AAC 48000 Hz stereo \u00b7 12,705,326 bytes (12.12 MiB)"
    ],
    [
      "Elapsed",
      "3414.711 s from 2026-10-27T21:03:51.576937+00:00 to 2026-10-27T22:00:46.288292+00:00; narration/asset preparation through final render verification, including authoring/review. Excludes prior book reading/writing and later packaging."
    ],
    [
      "Render processing",
      "One successful job \u00b7 200.680 s process wall time \u00b7 internal pipeline 199.378 s. Not pure GPU compute time."
    ],
    [
      "Render stages",
      "compile: 0.204 s \u00b7 browser_probe: 0.053 s \u00b7 video_extract: 0.001 s \u00b7 audio_process: 7.892 s \u00b7 file_server: 0.006 s \u00b7 capture_disk: 189.713 s \u00b7 encode: 1.068 s \u00b7 assemble: 0.397 s"
    ],
    [
      "Animation",
      "Authored SVG/GSAP 3.15.0 \u00b7 HyperFrames 0.8.200 \u00b7 Node v24.20.0 \u00b7 two software Chromium capture workers \u00b7 no generative video model or GPU encoder"
    ],
    [
      "Narration",
      "Local synthetic Kokoro v1.0 82M ONNX \u00b7 bm_george \u00b7 en-gb \u00b7 speed 1.0 \u00b7 CPUExecutionProvider, four threads \u00b7 kokoro-onnx 0.4.7 / ONNX Runtime 1.30.0 \u00b7 24 kHz mono PCM16 source. Quantization unverified; model SHA-256 and bytes saved; no adapters or exposed seed."
    ],
    [
      "Voice generation",
      "18 successful paragraph jobs \u00b7 0 failed/retried \u00b7 31.837 s elapsed \u00b7 31.104 s summed inference calls"
    ],
    [
      "Music and effects",
      "Original procedural DSP \u00b7 seed 27102026 \u00b7 17 cues \u00b7 48 kHz stereo stems \u00b7 6.975 s successful audio preparation \u00b7 0 failed/retried"
    ],
    [
      "Audio",
      "Finished mix -15.05 LUFS integrated, -1.84 dBTP, 3.50 LU range \u00b7 voice target \u221218 LUFS, score target \u221236 LUFS \u00b7 measured, not auditioned"
    ],
    [
      "Settings",
      "Delivery quality, 30 fps, software capture. No upscaling, interpolation or ComfyUI jobs. Diffusion steps, sampler, scheduler, guidance, denoise and adapters do not apply to authored vector animation."
    ],
    [
      "Resources",
      "CPU narration and software browser capture. Peak VRAM and energy not recorded."
    ],
    [
      "Verification",
      "Full decode passed; 9 decoded frames visually checked; zero validation/layout/runtime errors. 21 intentional narration/reading-hold warnings. Captions use measured paragraphs with approximate sentence timing."
    ],
    [
      "Scene 1 timing",
      "26.721 s output \u00b7 3.415 s voice generation. Separate scene render time not exposed."
    ],
    [
      "Scene 2 timing",
      "24.985 s output \u00b7 3.064 s voice generation. Separate scene render time not exposed."
    ],
    [
      "Scene 3 timing",
      "28.699 s output \u00b7 3.507 s voice generation. Separate scene render time not exposed."
    ],
    [
      "Scene 4 timing",
      "26.963 s output \u00b7 3.273 s voice generation. Separate scene render time not exposed."
    ],
    [
      "Scene 5 timing",
      "30.427 s output \u00b7 3.780 s voice generation. Separate scene render time not exposed."
    ],
    [
      "Scene 6 timing",
      "27.887 s output \u00b7 3.472 s voice generation. Separate scene render time not exposed."
    ],
    [
      "Scene 7 timing",
      "29.943 s output \u00b7 3.713 s voice generation. Separate scene render time not exposed."
    ],
    [
      "Scene 8 timing",
      "29.083 s output \u00b7 3.680 s voice generation. Separate scene render time not exposed."
    ],
    [
      "Scene 9 timing",
      "26.327 s output \u00b7 3.200 s voice generation. Separate scene render time not exposed."
    ]
  ],
  "editable_project": "/home/albert/Documents/ChatGPT/Codex/videos/pragma-feedback",
  "local_only": true,
  "preparation_attempts": {
    "audio_carve": {
      "completed": 5,
      "failed": 1,
      "failure": "Initial sandbox denied ffmpeg child-process execution; approved local execution succeeded. Subsequent runs updated the mix after authored changes.",
      "per_call_elapsed": "not recorded"
    },
    "verification": {
      "completed": 1,
      "failed": 2,
      "reason": "Two verification wrappers reached decode and frame extraction but failed at contact-sheet creation because the narration virtual environment lacks Pillow. Completed using system Python with Pillow."
    },
    "render": {
      "completed": 1,
      "failed": 0,
      "retried": 0
    }
  }
}
