@remotion/cli 3.0.22 → 3.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/chalk/index.d.ts +58 -0
  2. package/dist/chalk/index.js +138 -0
  3. package/dist/chalk/symbols.d.ts +111 -0
  4. package/dist/chalk/symbols.js +75 -0
  5. package/dist/chalk/utilities.d.ts +2 -0
  6. package/dist/chalk/utilities.js +37 -0
  7. package/dist/code-frame.d.ts +1 -1
  8. package/dist/code-frame.js +5 -8
  9. package/dist/download-progress.d.ts +1 -1
  10. package/dist/editor/components/CompositionSelectorItem.d.ts +1 -1
  11. package/dist/editor/components/FramePersistor.d.ts +1 -1
  12. package/dist/editor/components/GlobalKeybindings.d.ts +1 -1
  13. package/dist/editor/components/InitialCompositionLoader.d.ts +2 -2
  14. package/dist/editor/components/Menu/MenuItem.d.ts +1 -1
  15. package/dist/editor/components/Menu/MenuSubItem.d.ts +1 -1
  16. package/dist/editor/components/Menu/SubMenu.d.ts +2 -2
  17. package/dist/editor/components/NewComposition/CancelButton.d.ts +2 -1
  18. package/dist/editor/components/NewComposition/InputDragger.d.ts +2 -1
  19. package/dist/editor/components/NewComposition/MenuContent.d.ts +1 -1
  20. package/dist/editor/components/NewComposition/NewComposition.d.ts +1 -1
  21. package/dist/editor/components/NewComposition/new-comp-layout.d.ts +1 -1
  22. package/dist/editor/components/PlaybackKeyboardShortcutsManager.d.ts +1 -1
  23. package/dist/editor/components/PlaybackRatePersistor.d.ts +1 -1
  24. package/dist/editor/components/Preview.d.ts +1 -1
  25. package/dist/editor/components/SizeSelector.d.ts +1 -1
  26. package/dist/editor/components/Splitter/SplitterContainer.d.ts +1 -1
  27. package/dist/editor/components/Thumbnail.d.ts +1 -1
  28. package/dist/editor/components/Timeline/TimelineList.d.ts +2 -2
  29. package/dist/editor/components/Timeline/TimelineListItem.d.ts +2 -2
  30. package/dist/editor/components/Timeline/TimelineSequence.d.ts +1 -1
  31. package/dist/editor/components/Timeline/TimelineTracks.d.ts +2 -2
  32. package/dist/editor/components/Timeline/is-collapsed.d.ts +2 -2
  33. package/dist/editor/components/UpdateCheck.d.ts +1 -1
  34. package/dist/editor/components/UpdateModal/UpdateModal.d.ts +1 -1
  35. package/dist/editor/helpers/calculate-timeline.d.ts +2 -2
  36. package/dist/editor/helpers/create-folder-tree.d.ts +2 -2
  37. package/dist/editor/helpers/get-sequence-visible-range.d.ts +1 -1
  38. package/dist/editor/helpers/get-timeline-nestedness.d.ts +1 -1
  39. package/dist/editor/helpers/get-timeline-sequence-hash.d.ts +1 -1
  40. package/dist/editor/helpers/get-timeline-sequence-layout.d.ts +1 -1
  41. package/dist/editor/helpers/get-timeline-sequence-sort-key.d.ts +1 -1
  42. package/dist/editor/helpers/is-composition-still.d.ts +1 -1
  43. package/dist/editor/helpers/use-keybinding.d.ts +1 -1
  44. package/dist/editor/helpers/validate-new-comp-data.d.ts +1 -1
  45. package/dist/editor/icons/film.d.ts +2 -1
  46. package/dist/editor/icons/folder.d.ts +2 -1
  47. package/dist/editor/icons/jump-to-start.d.ts +1 -1
  48. package/dist/editor/icons/lock.d.ts +2 -1
  49. package/dist/editor/icons/pause.d.ts +2 -1
  50. package/dist/editor/icons/play.d.ts +2 -1
  51. package/dist/editor/icons/step-back.d.ts +2 -1
  52. package/dist/editor/icons/step-forward.d.ts +2 -1
  53. package/dist/editor/icons/still.d.ts +2 -1
  54. package/dist/editor/icons/timeline.d.ts +2 -1
  55. package/dist/editor/icons/timelineInOutPointer.d.ts +2 -1
  56. package/dist/editor/state/folders.d.ts +1 -1
  57. package/dist/editor/state/modals.d.ts +2 -2
  58. package/dist/editor/state/preview-size.d.ts +1 -1
  59. package/dist/get-cli-options.d.ts +2 -2
  60. package/dist/get-composition-id.d.ts +1 -1
  61. package/dist/get-filename.d.ts +1 -1
  62. package/dist/image-formats.d.ts +2 -1
  63. package/dist/index.d.ts +52 -11
  64. package/dist/index.js +2 -5
  65. package/dist/log.js +4 -7
  66. package/dist/parse-command-line.d.ts +1 -1
  67. package/dist/preview-server/dev-middleware/compatible-api.d.ts +2 -2
  68. package/dist/preview-server/dev-middleware/get-paths.d.ts +1 -1
  69. package/dist/preview-server/dev-middleware/index.d.ts +2 -2
  70. package/dist/preview-server/dev-middleware/middleware.d.ts +2 -2
  71. package/dist/preview-server/dev-middleware/ready.d.ts +2 -2
  72. package/dist/preview-server/dev-middleware/setup-hooks.d.ts +1 -1
  73. package/dist/preview-server/dev-middleware/setup-output-filesystem.d.ts +1 -1
  74. package/dist/preview-server/dev-middleware/types.d.ts +1 -1
  75. package/dist/preview-server/error-overlay/react-overlay/effects/format-warning.d.ts +1 -1
  76. package/dist/preview-server/error-overlay/react-overlay/effects/resolve-file-source.d.ts +2 -2
  77. package/dist/preview-server/error-overlay/react-overlay/listen-to-runtime-errors.d.ts +1 -1
  78. package/dist/preview-server/error-overlay/react-overlay/utils/get-lines-around.d.ts +1 -1
  79. package/dist/preview-server/error-overlay/react-overlay/utils/get-source-map.d.ts +0 -6
  80. package/dist/preview-server/error-overlay/react-overlay/utils/get-source-map.js +0 -8
  81. package/dist/preview-server/error-overlay/react-overlay/utils/open-in-editor.js +0 -9
  82. package/dist/preview-server/error-overlay/react-overlay/utils/parser.d.ts +1 -1
  83. package/dist/preview-server/error-overlay/react-overlay/utils/unmapper.d.ts +1 -1
  84. package/dist/preview-server/error-overlay/remotion-overlay/AskOnDiscord.js +1 -1
  85. package/dist/preview-server/error-overlay/remotion-overlay/CodeFrame.d.ts +1 -1
  86. package/dist/preview-server/error-overlay/remotion-overlay/ErrorDisplay.d.ts +1 -1
  87. package/dist/preview-server/error-overlay/remotion-overlay/OpenInEditor.d.ts +1 -1
  88. package/dist/preview-server/error-overlay/remotion-overlay/StackFrame.d.ts +1 -1
  89. package/dist/preview-server/hot-middleware/client.d.ts +1 -1
  90. package/dist/preview-server/hot-middleware/index.d.ts +2 -2
  91. package/dist/preview-server/hot-middleware/process-update.d.ts +1 -1
  92. package/dist/preview-server/hot-middleware/types.d.ts +1 -1
  93. package/dist/preview-server/routes.d.ts +1 -1
  94. package/dist/preview-server/serve-static.d.ts +1 -1
  95. package/dist/preview-server/start-server.d.ts +1 -1
  96. package/dist/preview-server/update-available.d.ts +1 -1
  97. package/dist/print-error.js +5 -8
  98. package/dist/print-help.js +8 -11
  99. package/dist/progress-bar.d.ts +2 -2
  100. package/dist/progress-bar.js +4 -7
  101. package/dist/render.js +4 -4
  102. package/dist/setup-cache.d.ts +1 -1
  103. package/dist/still.js +3 -3
  104. package/dist/warn-about-ffmpeg-version.d.ts +1 -1
  105. package/package.json +8 -9
@@ -1,4 +1,4 @@
1
- import { WebpackOverrideFn } from 'remotion';
1
+ import type { WebpackOverrideFn } from 'remotion';
2
2
  export declare const startServer: (entry: string, userDefinedComponent: string, options?: {
3
3
  webpackOverride?: WebpackOverrideFn;
4
4
  inputProps?: object;
@@ -1,4 +1,4 @@
1
- import { PackageManager } from './get-package-manager';
1
+ import type { PackageManager } from './get-package-manager';
2
2
  declare type Info = {
3
3
  currentVersion: string;
4
4
  latestVersion: string;
@@ -1,30 +1,27 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.printError = void 0;
7
4
  const renderer_1 = require("@remotion/renderer");
8
- const chalk_1 = __importDefault(require("chalk"));
5
+ const chalk_1 = require("./chalk");
9
6
  const code_frame_1 = require("./code-frame");
10
7
  const log_1 = require("./log");
11
8
  const progress_bar_1 = require("./progress-bar");
12
9
  const printError = async (err) => {
13
10
  if (err instanceof renderer_1.RenderInternals.SymbolicateableError) {
14
11
  const output = (0, progress_bar_1.createOverwriteableCliOutput)(false);
15
- output.update(chalk_1.default.red('Symbolicating minified error message...\n' + err.message));
12
+ output.update(chalk_1.chalk.red('Symbolicating minified error message...\n' + err.message));
16
13
  try {
17
14
  const symbolicated = await renderer_1.RenderInternals.symbolicateError(err);
18
15
  if (symbolicated.frame === null) {
19
- output.update(chalk_1.default.red('An error occurred:\n'));
16
+ output.update(chalk_1.chalk.red('An error occurred:\n'));
20
17
  }
21
18
  else {
22
- output.update(chalk_1.default.red(`An error occurred while rendering frame ${err.frame}:\n`));
19
+ output.update(chalk_1.chalk.red(`An error occurred while rendering frame ${err.frame}:\n`));
23
20
  }
24
21
  (0, code_frame_1.printCodeFrameAndStack)(symbolicated);
25
22
  }
26
23
  catch (e) {
27
- output.update(chalk_1.default.red('(Error occurred symbolicating stack trace - printing minified stack trace)\n'));
24
+ output.update(chalk_1.chalk.red('(Error occurred symbolicating stack trace - printing minified stack trace)\n'));
28
25
  log_1.Log.error();
29
26
  log_1.Log.error(err.stack || err);
30
27
  }
@@ -1,16 +1,13 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.printHelp = void 0;
7
- const chalk_1 = __importDefault(require("chalk"));
4
+ const chalk_1 = require("./chalk");
8
5
  const log_1 = require("./log");
9
6
  const versions_1 = require("./versions");
10
7
  const packagejson = require('../package.json');
11
8
  const printFlags = (flags) => {
12
9
  flags.forEach(([flag, description]) => {
13
- log_1.Log.info(chalk_1.default.blue(`${flag.padEnd(22, ' ')} ${description}`));
10
+ log_1.Log.info(chalk_1.chalk.blue(`${flag.padEnd(22, ' ')} ${description}`));
14
11
  });
15
12
  };
16
13
  const printHelp = () => {
@@ -19,11 +16,11 @@ const printHelp = () => {
19
16
  log_1.Log.info('Available commands:');
20
17
  log_1.Log.info('');
21
18
  log_1.Log.info('remotion preview <entry-point.ts>');
22
- log_1.Log.info(chalk_1.default.gray('Start the preview server.'));
19
+ log_1.Log.info(chalk_1.chalk.gray('Start the preview server.'));
23
20
  printFlags([['--props', 'Pass input props as filename or as JSON']]);
24
21
  log_1.Log.info();
25
22
  log_1.Log.info('remotion render <entry-point.ts> <comp-name> <output-file.mp4>');
26
- log_1.Log.info(chalk_1.default.gray('Render video, audio or an image sequence.'));
23
+ log_1.Log.info(chalk_1.chalk.gray('Render video, audio or an image sequence.'));
27
24
  printFlags([
28
25
  ['--props', 'Pass input props as filename or as JSON'],
29
26
  ['--concurrency', 'How many frames to render in parallel'],
@@ -44,7 +41,7 @@ const printHelp = () => {
44
41
  ]);
45
42
  log_1.Log.info();
46
43
  log_1.Log.info('remotion still <entry-point.ts> <comp-name> <still.png>');
47
- log_1.Log.info(chalk_1.default.gray('Render a still frame and save it as an image.'));
44
+ log_1.Log.info(chalk_1.chalk.gray('Render a still frame and save it as an image.'));
48
45
  printFlags([
49
46
  ['--frame', 'Which frame to render (default 0)'],
50
47
  ['--image-format', 'Format to render the frames in, "jpeg" or "png"'],
@@ -60,13 +57,13 @@ const printHelp = () => {
60
57
  ]);
61
58
  log_1.Log.info();
62
59
  log_1.Log.info('remotion compositions <index-file.ts>');
63
- log_1.Log.info(chalk_1.default.gray('Prints the available compositions.'));
60
+ log_1.Log.info(chalk_1.chalk.gray('Prints the available compositions.'));
64
61
  log_1.Log.info();
65
62
  log_1.Log.info('remotion ' + versions_1.VERSIONS_COMMAND);
66
- log_1.Log.info(chalk_1.default.gray('Prints and validates versions of all Remotion packages.'));
63
+ log_1.Log.info(chalk_1.chalk.gray('Prints and validates versions of all Remotion packages.'));
67
64
  log_1.Log.info();
68
65
  log_1.Log.info('remotion upgrade');
69
- log_1.Log.info(chalk_1.default.gray('Ensure Remotion is on the newest version.'));
66
+ log_1.Log.info(chalk_1.chalk.gray('Ensure Remotion is on the newest version.'));
70
67
  log_1.Log.info();
71
68
  log_1.Log.info('Visit https://www.remotion.dev/docs/cli for browsable CLI documentation.');
72
69
  };
@@ -1,5 +1,5 @@
1
- import { StitchingState } from '@remotion/renderer';
2
- import { RenderStep } from './step';
1
+ import type { StitchingState } from '@remotion/renderer';
2
+ import type { RenderStep } from './step';
3
3
  export declare const createProgressBar: (quiet: boolean) => {
4
4
  update: (str: string) => boolean;
5
5
  };
@@ -1,12 +1,9 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.makeRenderingAndStitchingProgress = exports.makeStitchingProgress = exports.makeRenderingProgress = exports.makeBundlingProgress = exports.createOverwriteableCliOutput = exports.createProgressBar = void 0;
7
- const chalk_1 = __importDefault(require("chalk"));
8
4
  const remotion_1 = require("remotion");
9
5
  const ansi_diff_1 = require("./ansi/ansi-diff");
6
+ const chalk_1 = require("./chalk");
10
7
  const download_progress_1 = require("./download-progress");
11
8
  const make_progress_bar_1 = require("./make-progress-bar");
12
9
  const createProgressBar = (quiet) => {
@@ -34,7 +31,7 @@ const makeBundlingProgress = ({ progress, steps, doneIn, }) => [
34
31
  `${doneIn ? 'Bundled' : 'Bundling'} code`,
35
32
  doneIn === null
36
33
  ? (progress * 100).toFixed(0) + '%'
37
- : chalk_1.default.gray(`${doneIn}ms`),
34
+ : chalk_1.chalk.gray(`${doneIn}ms`),
38
35
  ].join(' ');
39
36
  exports.makeBundlingProgress = makeBundlingProgress;
40
37
  const makeRenderingProgress = ({ frames, totalFrames, steps, concurrency, doneIn, }) => {
@@ -45,7 +42,7 @@ const makeRenderingProgress = ({ frames, totalFrames, steps, concurrency, doneIn
45
42
  [doneIn ? 'Rendered' : 'Rendering', `frames (${concurrency}x)`]
46
43
  .filter(remotion_1.Internals.truthy)
47
44
  .join(' '),
48
- doneIn === null ? `${frames}/${totalFrames}` : chalk_1.default.gray(`${doneIn}ms`),
45
+ doneIn === null ? `${frames}/${totalFrames}` : chalk_1.chalk.gray(`${doneIn}ms`),
49
46
  ].join(' ');
50
47
  };
51
48
  exports.makeRenderingProgress = makeRenderingProgress;
@@ -57,7 +54,7 @@ const makeStitchingProgress = ({ frames, totalFrames, steps, doneIn, stage, }) =
57
54
  stage === 'muxing'
58
55
  ? `${doneIn ? 'Muxed' : 'Muxing'} audio`
59
56
  : `${doneIn ? 'Encoded' : 'Encoding'} video`,
60
- doneIn === null ? `${frames}/${totalFrames}` : chalk_1.default.gray(`${doneIn}ms`),
57
+ doneIn === null ? `${frames}/${totalFrames}` : chalk_1.chalk.gray(`${doneIn}ms`),
61
58
  ].join(' ');
62
59
  };
63
60
  exports.makeStitchingProgress = makeStitchingProgress;
package/dist/render.js CHANGED
@@ -5,11 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.render = void 0;
7
7
  const renderer_1 = require("@remotion/renderer");
8
- const chalk_1 = __importDefault(require("chalk"));
9
8
  const fs_1 = __importDefault(require("fs"));
10
9
  const os_1 = __importDefault(require("os"));
11
10
  const path_1 = __importDefault(require("path"));
12
11
  const remotion_1 = require("remotion");
12
+ const chalk_1 = require("./chalk");
13
13
  const get_cli_options_1 = require("./get-cli-options");
14
14
  const get_composition_id_1 = require("./get-composition-id");
15
15
  const initialize_render_cli_1 = require("./initialize-render-cli");
@@ -172,7 +172,7 @@ const render = async () => {
172
172
  updateRenderProgress();
173
173
  log_1.Log.info();
174
174
  log_1.Log.info();
175
- log_1.Log.info(chalk_1.default.green('\nYour image sequence is ready!'));
175
+ log_1.Log.info(chalk_1.chalk.green('\nYour image sequence is ready!'));
176
176
  return;
177
177
  }
178
178
  await (0, renderer_1.renderMedia)({
@@ -220,7 +220,7 @@ const render = async () => {
220
220
  seconds === 1 ? 'second' : 'seconds',
221
221
  ].join(' '));
222
222
  log_1.Log.info('-', 'Output can be found at:');
223
- log_1.Log.info(chalk_1.default.cyan(`▶ ${absoluteOutputFile}`));
223
+ log_1.Log.info(chalk_1.chalk.cyan(`▶ ${absoluteOutputFile}`));
224
224
  log_1.Log.verbose('Cleaning up...');
225
225
  try {
226
226
  await renderer_1.RenderInternals.deleteDirectory(urlOrBundle);
@@ -230,7 +230,7 @@ const render = async () => {
230
230
  log_1.Log.warn(err);
231
231
  log_1.Log.warn('Do you have minimum required Node.js version?');
232
232
  }
233
- log_1.Log.info(chalk_1.default.green('\nYour video is ready!'));
233
+ log_1.Log.info(chalk_1.chalk.green('\nYour video is ready!'));
234
234
  if (remotion_1.Internals.Logging.isEqualOrBelowLogLevel(remotion_1.Internals.Logging.getLogLevel(), 'verbose')) {
235
235
  remotion_1.Internals.perf.logPerf();
236
236
  }
@@ -1,2 +1,2 @@
1
- import { RenderStep } from './step';
1
+ import type { RenderStep } from './step';
2
2
  export declare const bundleOnCli: (fullPath: string, steps: RenderStep[]) => Promise<string>;
package/dist/still.js CHANGED
@@ -5,10 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.still = void 0;
7
7
  const renderer_1 = require("@remotion/renderer");
8
- const chalk_1 = __importDefault(require("chalk"));
9
8
  const fs_1 = require("fs");
10
9
  const path_1 = __importDefault(require("path"));
11
10
  const remotion_1 = require("remotion");
11
+ const chalk_1 = require("./chalk");
12
12
  const get_cli_options_1 = require("./get-cli-options");
13
13
  const get_composition_id_1 = require("./get-composition-id");
14
14
  const initialize_render_cli_1 = require("./initialize-render-cli");
@@ -135,7 +135,7 @@ const still = async () => {
135
135
  updateProgress();
136
136
  log_1.Log.info();
137
137
  const closeBrowserPromise = puppeteerInstance.close();
138
- log_1.Log.info(chalk_1.default.green('\nYour still frame is ready!'));
138
+ log_1.Log.info(chalk_1.chalk.green('\nYour still frame is ready!'));
139
139
  const seconds = Math.round((Date.now() - startTime) / 1000);
140
140
  log_1.Log.info([
141
141
  '- Total render time:',
@@ -143,7 +143,7 @@ const still = async () => {
143
143
  seconds === 1 ? 'second' : 'seconds',
144
144
  ].join(' '));
145
145
  log_1.Log.info('-', 'Output can be found at:');
146
- log_1.Log.info(chalk_1.default.cyan(`▶️ ${userOutput}`));
146
+ log_1.Log.info(chalk_1.chalk.cyan(`▶️ ${userOutput}`));
147
147
  await closeBrowserPromise;
148
148
  };
149
149
  exports.still = still;
@@ -1,4 +1,4 @@
1
- import { FfmpegVersion } from '@remotion/renderer';
1
+ import type { FfmpegVersion } from '@remotion/renderer';
2
2
  export declare const warnAboutFfmpegVersion: ({ ffmpegVersion, buildConf, }: {
3
3
  ffmpegVersion: FfmpegVersion;
4
4
  buildConf: string | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/cli",
3
- "version": "3.0.22",
3
+ "version": "3.0.25",
4
4
  "description": "CLI for Remotion",
5
5
  "main": "dist/index.js",
6
6
  "sideEffects": false,
@@ -23,16 +23,15 @@
23
23
  "author": "Jonny Burger <jonny@remotion.dev>",
24
24
  "license": "SEE LICENSE IN LICENSE.md",
25
25
  "dependencies": {
26
- "@remotion/bundler": "3.0.22",
27
- "@remotion/media-utils": "3.0.22",
28
- "@remotion/player": "3.0.22",
29
- "@remotion/renderer": "3.0.22",
26
+ "@remotion/bundler": "3.0.25",
27
+ "@remotion/media-utils": "3.0.25",
28
+ "@remotion/player": "3.0.25",
29
+ "@remotion/renderer": "3.0.25",
30
30
  "better-opn": "2.1.1",
31
- "chalk": "4.1.2",
32
31
  "dotenv": "9.0.2",
33
32
  "memfs": "3.4.3",
34
33
  "minimist": "1.2.6",
35
- "remotion": "3.0.22",
34
+ "remotion": "3.0.25",
36
35
  "semver": "7.3.5",
37
36
  "source-map": "0.6.1"
38
37
  },
@@ -41,7 +40,7 @@
41
40
  "react-dom": ">=16.8.0"
42
41
  },
43
42
  "devDependencies": {
44
- "@jonny/eslint-config": "3.0.259",
43
+ "@jonny/eslint-config": "3.0.266",
45
44
  "@types/jest": "^27.4.0",
46
45
  "@types/minimist": "^1.2.2",
47
46
  "@types/node": "^16.7.5",
@@ -74,5 +73,5 @@
74
73
  "publishConfig": {
75
74
  "access": "public"
76
75
  },
77
- "gitHead": "e79cfa299f58a26c84a637174875941898cdab97"
76
+ "gitHead": "27ec369ebe9cf3d063095383c1e30dc83c60f010"
78
77
  }