From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- files/ru/web/api/mediarecorder/index.html | 185 +++++++++++++++++++++ .../web/api/mediarecorder/mediarecorder/index.html | 157 +++++++++++++++++ .../api/mediarecorder/ondataavailable/index.html | 81 +++++++++ .../web/api/mediarecorder/requestdata/index.html | 123 ++++++++++++++ files/ru/web/api/mediarecorder/start/index.html | 80 +++++++++ files/ru/web/api/mediarecorder/state/index.html | 84 ++++++++++ 6 files changed, 710 insertions(+) create mode 100644 files/ru/web/api/mediarecorder/index.html create mode 100644 files/ru/web/api/mediarecorder/mediarecorder/index.html create mode 100644 files/ru/web/api/mediarecorder/ondataavailable/index.html create mode 100644 files/ru/web/api/mediarecorder/requestdata/index.html create mode 100644 files/ru/web/api/mediarecorder/start/index.html create mode 100644 files/ru/web/api/mediarecorder/state/index.html (limited to 'files/ru/web/api/mediarecorder') diff --git a/files/ru/web/api/mediarecorder/index.html b/files/ru/web/api/mediarecorder/index.html new file mode 100644 index 0000000000..4957359f56 --- /dev/null +++ b/files/ru/web/api/mediarecorder/index.html @@ -0,0 +1,185 @@ +--- +title: MediaRecorder +slug: Web/API/MediaRecorder +translation_of: Web/API/MediaRecorder +--- +

{{APIRef("Media Recorder API")}}

+ +

The MediaRecorder это интерфейс MediaStream Recording API представляющий функциональность для простой записи медиа. Создается с использованием {{domxref("MediaRecorder.MediaRecorder", "MediaRecorder()")}} конструктора.

+ +

Конструктор

+ +
+
{{domxref("MediaRecorder.MediaRecorder", "MediaRecorder()")}}
+
Создает новый объект MediaRecorder, получающий {{domxref("MediaStream")}} для записи. Доступны такие параметры, как установка типа MIME контейнера ("video/webm","video/mp4" и другие) и скорости передачи аудио-и видеодорожек или одной общей скорости.
+
+ +

Свойства

+ +
+
{{domxref("MediaRecorder.mimeType")}} {{readonlyInline}}
+
Возвращает тип MIME, который был выбран в качестве контейнера записи для объекта MediaRecorder при его создании. 
+
{{domxref("MediaRecorder.state")}} {{readonlyInline}}
+
Возвращает текущее состояние объекта MediaRecorder (inactive, recording, или paused.)
+
{{domxref("MediaRecorder.stream")}} {{readonlyInline}}
+
Возвращает поток который был передан конструктору при создании объекта MediaRecorder
+
{{domxref("MediaRecorder.ignoreMutedMedia")}}
+
Показывает записывает ли MediaRecorder дорожку {{domxref("MediaStreamTrack")}} если она отключена. Если аттрибут равен false, MediaRecorder будет записывать тишину для аудио и черные кадры для видео. По умолчанию равно false
+
{{domxref("MediaRecorder.videoBitsPerSecond")}} {{readonlyInline}}
+
Возвращает скорость кодирования видео. Она может отличаться от скорости, определенной в конструкторе (если была предоставлена).
+
{{domxref("MediaRecorder.audioBitsPerSecond;")}} {{readonlyInline}}
+
Возвращает скорость кодирования аудио. Она может отличаться от скорости, определенной в конструкторе (если была предоставлена).
+
+ +

Методы

+ +
+
{{domxref("MediaRecorder.canRecordMimeType()", "MediaRecorder.isTypeSupported()")}}
+
Возвращает {{domxref("Boolean")}} значение показывающее поддерживается ли MIME тип текущим user agent.
+
{{domxref("MediaRecorder.pause()")}}
+
Приостанавливает запись медиа.
+
{{domxref("MediaRecorder.requestData()")}}
+
Запрашивает {{domxref("Blob")}} содержащий сохраненные данные полученные  с начала записи (или с последнего вызова requestData()). После вызова этого метода, запись продолжается, но в новый Blob.
+
{{domxref("MediaRecorder.resume()")}}
+
Возобновляет запись медиа после паузы.
+
{{domxref("MediaRecorder.start()")}}
+
Начинает запись медиа. В этот метод можно передать аргумент timeslice со значением в миллисекундах. Если он определен, то медиа будет записываться в отдельные блоки заданной продолжительности, вместо записи в один большой блок.
+
{{domxref("MediaRecorder.stop()")}}
+
Останавливает запись, после чего запускается событие {{event("dataavailable")}}, содержащее последний Blob сохраненных данных.
+
+ +

Обработчики событий

+ +
+
{{domxref("MediaRecorder.ondataavailable")}}
+
Вызывает обработчик {{event("dataavailable")}} события, которое запускается раз в timeslice миллисекунд (или, если timeslice не был задан - по окончанию записи). Событие типа {{domxref("BlobEvent")}}, сдержит записанное медиа в {{domxref("BlobEvent.data", "data")}}.  Вы можете использовать обработчик для сбора и других действий в зависимости от полученных данных.
+
{{domxref("MediaRecorder.onerror")}}
+
{{domxref("EventHandler")}} вызывается для обработки события {{event("recordingerror")}}, включающего отчет об ошибках во время записи. Это фатальные ошибки, приводящие к остановке записи. Полученное событие основано на интерфейсе {{domxref("MediaRecorderErrorEvent")}}, свойство которого {{domxref("MediaRecorderErrorEvent.error", "error")}} содержит {{domxref("DOMException")}} описывающие произошедшие ошибки.
+
{{domxref("MediaRecorder.onpause")}}
+
{{domxref("EventHandler")}} вызывается для обработки события {{event("pause")}}, случившегося во время приостановки медиа.
+
{{domxref("MediaRecorder.onresume")}}
+
{{domxref("EventHandler")}} вызывается для обработки события {{event("resume")}}, случившегося во время возбновления записи.
+
{{domxref("MediaRecorder.onstart")}}
+
{{domxref("EventHandler")}}вызывается для обработки события {{event("start")}}, случившегося во время начала записи.
+
{{domxref("MediaRecorder.onstop")}}
+
{{domxref("EventHandler")}} вызывается для обработки события {{event("stop")}}, случившегося во время завершения записи, а так же при окончании {{domxref("MediaStream")}} — или после вызова {{domxref("MediaRecorder.stop()")}}
+
+ +

Пример

+ +
navigator.getUserMedia = (navigator.getUserMedia ||
+                          navigator.mozGetUserMedia ||
+                          navigator.msGetUserMedia ||
+                          navigator.webkitGetUserMedia);
+
+
+if (navigator.getUserMedia) {
+  console.log('getUserMedia supported.');
+
+  var constraints = { audio: true };
+  var chunks = [];
+
+  var onSuccess = function(stream) {
+    var mediaRecorder = new MediaRecorder(stream);
+
+    visualize(stream);
+
+    record.onclick = function() {
+      mediaRecorder.start();
+      console.log(mediaRecorder.state);
+      console.log("recorder started");
+      record.style.background = "red";
+      record.style.color = "black";
+    }
+
+    stop.onclick = function() {
+      mediaRecorder.stop();
+      console.log(mediaRecorder.state);
+      console.log("recorder stopped");
+      record.style.background = "";
+      record.style.color = "";
+      // mediaRecorder.requestData();
+    }
+
+    mediaRecorder.onstop = function(e) {
+      console.log("data available after MediaRecorder.stop() called.");
+
+      var clipName = prompt('Enter a name for your sound clip');
+
+      var clipContainer = document.createElement('article');
+      var clipLabel = document.createElement('p');
+      var audio = document.createElement('audio');
+      var deleteButton = document.createElement('button');
+
+      clipContainer.classList.add('clip');
+      audio.setAttribute('controls', '');
+      deleteButton.innerHTML = "Delete";
+      clipLabel.innerHTML = clipName;
+
+      clipContainer.appendChild(audio);
+      clipContainer.appendChild(clipLabel);
+      clipContainer.appendChild(deleteButton);
+      soundClips.appendChild(clipContainer);
+
+      audio.controls = true;
+      var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
+      chunks = [];
+      var audioURL = window.URL.createObjectURL(blob);
+      audio.src = audioURL;
+      console.log("recorder stopped");
+
+      deleteButton.onclick = function(e) {
+        evtTgt = e.target;
+        evtTgt.parentNode.parentNode.removeChild(evtTgt.parentNode);
+      }
+    }
+
+    mediaRecorder.ondataavailable = function(e) {
+      chunks.push(e.data);
+    }
+  }
+
+  var onError = function(err) {
+    console.log('The following error occured: ' + err);
+  }
+
+  navigator.getUserMedia(constraints, onSuccess, onError);
+} else {
+   console.log('getUserMedia not supported on your browser!');
+}
+ +
+

Код выше был взят из демо Web Dictaphone. Некоторые строчки были пропущены для краткости. Полный код смотрите здесь

+
+ +

Спецификации

+ + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName("MediaStream Recording", "#MediaRecorderAPI")}}{{Spec2("MediaStream Recording")}}Initial definition
+ +

Совместимоть с браузерами

+ + + +

{{Compat("api.MediaRecorder")}}

+ +

Еще по теме

+ + diff --git a/files/ru/web/api/mediarecorder/mediarecorder/index.html b/files/ru/web/api/mediarecorder/mediarecorder/index.html new file mode 100644 index 0000000000..eaae4075bc --- /dev/null +++ b/files/ru/web/api/mediarecorder/mediarecorder/index.html @@ -0,0 +1,157 @@ +--- +title: MediaRecorder.MediaRecorder() +slug: Web/API/MediaRecorder/MediaRecorder +translation_of: Web/API/MediaRecorder/MediaRecorder +--- +
{{APIRef("MediaStream Recording")}}
+ +

MediaRecorder() конструктор {{domxref("MediaRecorder")}} объекта который будет делать запись переданного {{domxref("MediaStream")}}.

+ +

Синтаксис

+ +
var mediaRecorder = new MediaRecorder(stream[, options]);
+ +

Параметры

+ +
+
stream
+
Объект потока {{domxref("MediaStream")}} источника из которого будет производиться запись. Может быть потоком, созданным {{domxref("MediaDevices.getUserMedia", "navigator.mediaDevices.getUserMedia()")}} или {{HTMLElement("audio")}}, {{HTMLElement("video")}} или {{HTMLElement("canvas")}} элементами.
+
+

options {{optional_inline}}

+
+
+

Объект, содержащий следующие свойства:

+ +
    +
  • mimeType:  mime тип, определяет формат результата записи, который нужно использовать в качестве контейнера для создаваемого объекта MediaRecorder. Можно просто указать формат контейнера, а браузер сам выберет нужный кодек для записи аудио/видео, или испоьзуйте параметр codecs или параметр profiles для расширения информации об использовании и тонкой конфигурации кодеков. Приложения, предварительно, могут проверять поддержку браузерами определенного типа из свойства mimeType , вызывая метод {{domxref("MediaRecorder.isTypeSupported()")}}.
  • +
  • audioBitsPerSecond: Скорость записи медиа данных аудио.
  • +
  • videoBitsPerSecond: Скорость записи медиа данных видео.
  • +
  • bitsPerSecond: Скорость записи медиаданных аудио и видео. Может определяться вместо верхних двух. Если определяется вместе с одним из свойств выше, имеет меньший приоритет, и используется  вместо отсутствующей настройки выше..
  • +
+ +
+

 Если значения битов в секунду не указаны для видео и / или аудио, для видео по умолчанию принимается значение 2,5 Мбит / с, а для аудио по умолчанию используется адаптивный режим, в зависимости от частоты дискретизации и количества каналов.

+
+
+
+ +

Исключения

+ +
+
NotSupportedError
+
Определяет MIME тип, не поддерживающийся браузером.
+
+ +

Пример

+ +

В этом примере показано, как создать медиа рекордер для указанного потока, чья скорость передачи звука составляет 128 Кбит / с, а скорость передачи видео - 2,5 Мбит / с. Записанные мультимедийные данные будут храниться в контейнере MP4 (поэтому, если вы соберете порции мультимедийных данных и сохраните их на диск, они будут в файле с разрешением MP4).

+ +
...
+
+
+if (navigator.mediaDevices.getUserMedia) {
+  var constraints = { audio: true, video: true };
+  var chunks = [];
+
+  var onSuccess = function(stream) {
+    var options = {
+      audioBitsPerSecond : 128000,
+      videoBitsPerSecond : 2500000,
+      mimeType : 'video/mp4'
+    }
+    var mediaRecorder = new MediaRecorder(stream,options);
+    m = mediaRecorder;
+
+...
+ +

Спецификации

+ + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName("MediaStream Recording")}}{{Spec2("MediaStream Recording")}}Initial definition
+ +

Совместимость с браузерами

+ +

{{CompatibilityTable}}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Basic support{{CompatChrome(47)}}{{CompatGeckoDesktop("25.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
options object{{CompatNo}}{{CompatGeckoDesktop("43.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureAndroidAndroid WebviewFirefox Mobile (Gecko)Firefox OSIE PhoneOpera MobileSafari MobileChrome for Android
Basic support{{CompatNo}}{{CompatChrome(47)}}{{CompatGeckoDesktop("25.0")}}1.3[1]{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatChrome(47)}}
+
+ +

[1] The initial Firefox OS implementation only supported audio recording.

+ +

Смотри так же

+ + diff --git a/files/ru/web/api/mediarecorder/ondataavailable/index.html b/files/ru/web/api/mediarecorder/ondataavailable/index.html new file mode 100644 index 0000000000..e84e622f74 --- /dev/null +++ b/files/ru/web/api/mediarecorder/ondataavailable/index.html @@ -0,0 +1,81 @@ +--- +title: MediaRecorder.ondataavailable +slug: Web/API/MediaRecorder/ondataavailable +translation_of: Web/API/MediaRecorder/ondataavailable +--- +

{{APIRef("MediaStream Recording")}}

+ +

MediaRecorder.ondataavailable обработчик события (часть MediaStream Recording API) обрабатывает {{event("dataavailable")}} событие, позволяет выполнить код, когда тип данных  {{domxref("Blob")}}, представляющий обработанные данные становиться доступным для использования.

+ +

Событие dataavailable вызывается когда MediaRecorder доставляет медиа данные в ваше приложение для использования. Они представляются в виде объекта типа  {{domxref("Blob")}}, содержащего данные. Это происходит в четырёх ситуациях:

+ + + +
+

Медиаданные, содержащиеся в объекте типа {{domxref("Blob")}} доступны в свойстве data , возвращаемого в параметре объекта события {{event("dataavailable")}}.

+
+ +

Синтаксис

+ +
MediaRecorder.ondataavailable = function(event) { ... }
+MediaRecorder.addEventListener('dataavailable', function(event) { ... })
+
+ +

Пример

+ +
...
+
+  mediaRecorder.onstop = function(e) {
+    console.log("data available after MediaRecorder.stop() called.");
+
+    var audio = document.createElement('audio');
+    audio.controls = true;
+    var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
+    var audioURL = window.URL.createObjectURL(blob);
+    audio.src = audioURL;
+    console.log("recorder stopped");
+  }
+
+  mediaRecorder.ondataavailable = function(e) {
+    chunks.push(e.data);
+  }
+
+...
+
+ +

Спецификации

+ + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName("MediaStream Recording", "#widl-MediaRecorder-ondataavailable", "MediaRecorder.ondataavailable")}}{{Spec2("MediaStream Recording")}}Initial definition
+ +

Совместимость с браузерами

+ + + +

{{Compat("api.MediaRecorder.ondataavailable")}}

+ +

Смотри так же

+ + diff --git a/files/ru/web/api/mediarecorder/requestdata/index.html b/files/ru/web/api/mediarecorder/requestdata/index.html new file mode 100644 index 0000000000..07fb15a876 --- /dev/null +++ b/files/ru/web/api/mediarecorder/requestdata/index.html @@ -0,0 +1,123 @@ +--- +title: MediaRecorder.requestData() +slug: Web/API/MediaRecorder/requestData +translation_of: Web/API/MediaRecorder/requestData +--- +

{{APIRef("MediaStream Recording")}}

+ +

Метод MediaRecorder.requestData() (часть MediaRecorder API) используется, чтобы поднять {{domxref("dataavailable")}} событие содержащее {{domxref("Blob")}} объект захваченных медиа-данных как это было когда метод был вызван. This can then be grabbed и маниулировать как необходимо.

+ +

When the requestData() method is invoked, the browser queues a task that runs the following steps:

+ +
    +
  1. If {{domxref("MediaRecorder.state")}} is not "recording", raise a DOM InvalidState error and terminate these steps. If {{domxref("MediaRecorder.state")}} is "recording", continue to the next step.
  2. +
  3. Raise a {{domxref("dataavailable")}} event containing a {{domxref("Blob")}} of the currently captured data (the Blob is available under the event's data attribute.)
  4. +
  5. Create a new Blob and place subsequently captured data into it.
  6. +
+ +

Syntax

+ +
MediaRecorder.requestData()
+ +

Errors

+ +

An InvalidState error is raised if the requestData() method is called while the MediaRecorder object’s {{domxref("MediaRecorder.state")}} is not "recording" — the media cannot be captured if recording is not occurring.

+ +

Example

+ +
...
+
+  captureMedia.onclick = function() {
+    mediaRecorder.requestData();
+    // makes snapshot available of data so far
+    // ondataavailable fires, then capturing continues
+    // in new Blob
+  }
+
+...
+ +

Specifications

+ + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName("MediaStream Recording", "#widl-MediaRecorder-requestData-void", "MediaRecorder.requestData()")}}{{Spec2("MediaStream Recording")}}Initial definition
+ +

Browser compatibility

+ +

{{CompatibilityTable}}

+ +
+ + + + + + + + + + + + + + + + + + + +
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Basic support{{CompatChrome(47)}}[2]{{CompatGeckoDesktop("25.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureAndroidAndroid WebviewFirefox Mobile (Gecko)Firefox OSIE PhoneOpera MobileSafari MobileChrome for Android
Basic support{{CompatNo}}{{CompatNo}}{{CompatGeckoDesktop("25.0")}}1.3[1]{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
+
+ +

[1] The intial Firefox OS implementation only supported audio recording.

+ +

[2] To try this feature on Chrome, enable Experimental Web Platform features from chrome://flags . Currently only video is supported, not audio.

+ +

See also

+ + diff --git a/files/ru/web/api/mediarecorder/start/index.html b/files/ru/web/api/mediarecorder/start/index.html new file mode 100644 index 0000000000..c86d17137e --- /dev/null +++ b/files/ru/web/api/mediarecorder/start/index.html @@ -0,0 +1,80 @@ +--- +title: MediaRecorder.start() +slug: Web/API/MediaRecorder/start +translation_of: Web/API/MediaRecorder/start +--- +
{{APIRef("Media Recorder API")}}
+ +

Метод MediaRecorder.start() (часть MediaRecorder API) используется для начала захвата медиа {{domxref("Blob")}}.

+ +

When the start() method is invoked, the UA queues a task that runs the following steps:

+ +
    +
  1. If the {{domxref("MediaRecorder.state")}} is not "inactive", raise a DOM InvalidState error and terminate these steps. if the {{domxref("MediaRecorder.state")}} is "inactive", continue on to the next step.
  2. +
  3. Set the {{domxref("MediaRecorder.state")}} to "recording" and wait until media becomes available from the stream passed into {{domxref("Navigator.getUserMedia")}}.
  4. +
  5. Once data becomes available, raise a {{domxref("MediaRecorder.start")}} event and start gathering the data into a {{domxref("Blob")}} (see FILE-API).
  6. +
  7. If the timeSlice argument has been provided, once that many milliseconds of data have been collected — or a minimum time slice imposed by the UA, whichever is greater — raise a {{domxref("MediaRecorder.dataavailable")}} event containing the Blob of collected data, and start gathering a new Blob of data. If timeSlice has not been provided, continue gathering data into the original Blob.
  8. +
  9. When the stream is ended, set {{domxref("MediaRecorder.state")}} to "inactive" and stop gathering data.
  10. +
  11. Raise a {{domxref("MediaRecorder.dataavailable")}} event containing the Blob of data.
  12. +
  13. Raise a {{domxref("MediaRecorder.stop")}} event.
  14. +
+ +
+

Note: If the browser is unable to start recording or continue recording, it will raise a {{domxref("DOMError")}} event, followed by a {{domxref("MediaRecorder.dataavailable")}} event containing the Blob it has gathered, followed by the {{domxref("MediaRecorder.stop")}} event.

+
+ +

Синтаксис

+ +
MediaRecorder.start(timeslice)
+ +

Параметры

+ +
+
timeslice {{optional_inline}}
+
Этот параметр принимает значение в миллисекундах, и переопределяет длину куска захвата медиа для возвращения в каждом Blob. Если не указан, то все медиа данные будут занесены в один Blob, только если не был вызван метод {{domxref("MediaRecorder.requestData")}}.
+
+ +

Ошибки

+ +

An InvalidState error is raised if the start() method is called while the MediaRecorder object’s {{domxref("MediaRecorder.state")}} is not "inactive" — it makes no sense to start media capture if it is already happening.

+ +

Пример

+ +
...
+
+  record.onclick = function() {
+    mediaRecorder.start();
+    console.log("рекордер запущен");
+  }
+
+...
+ +

Specifications

+ + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName("MediaStream Recording", "#widl-MediaRecorder-start-void-long-timeslice", "MediaRecorder.start()")}}{{Spec2("MediaStream Recording")}}Initial definition
+ +

Совместимость с браузерами

+ +

{{Compat("api.MediaRecorder.start")}}

+ +

Смотрите также

+ + diff --git a/files/ru/web/api/mediarecorder/state/index.html b/files/ru/web/api/mediarecorder/state/index.html new file mode 100644 index 0000000000..b153d0d1ae --- /dev/null +++ b/files/ru/web/api/mediarecorder/state/index.html @@ -0,0 +1,84 @@ +--- +title: MediaRecorder.state +slug: Web/API/MediaRecorder/state +translation_of: Web/API/MediaRecorder/state +--- +
{{APIRef("MediaStream Recording")}}
+ +

Свойство только для чтения MediaRecorder.state возвращает текущее состояние определённого объекта MediaRecorder.

+ +

Синтаксис

+ +
var state = MediaRecorder.state
+ +

Значения

+ +

Объект AnimationPlayState содержит одно из нижеперечисленных значений:

+ + + + + + + + + + + + + + + + + + + + + + +
ЗначениеОписание
inactiveЗапись не ведётся — она ещё не была начата или уже была осуществлена и остановлена.
recordingЗапись начата и UA собирает данные.
pausedЗапись была начата, но поставлена на паузу, не остановлена и ещё не возобновлена.
+ +

Пример

+ +
...
+
+  record.onclick = function() {
+    mediaRecorder.start();
+    console.log(mediaRecorder.state);
+    // Должно вернуть "recording"
+    console.log("захват начат");
+  }
+
+...
+ +

Спецификации

+ + + + + + + + + + + + + + +
SpecificationСтатусКомментарий
{{SpecName("MediaStream Recording", "#widl-MediaRecorder-state", "MediaRecorder.state")}}{{Spec2("MediaStream Recording")}}Определена
+ +

Совместимость с браузерами

+ + + +

{{Compat("api.MediaRecorder.state")}}

+ +

Смотрите также

+ + -- cgit v1.2.3-54-g00ecf