shaka-player 4.8.0 → 4.8.2

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 (38) hide show
  1. package/AUTHORS +1 -0
  2. package/CONTRIBUTORS +1 -0
  3. package/dist/deps.js +3 -3
  4. package/dist/locales.js +33 -33
  5. package/dist/shaka-player.compiled.d.ts +3 -2
  6. package/dist/shaka-player.compiled.debug.d.ts +3 -2
  7. package/dist/shaka-player.compiled.debug.externs.js +8 -2
  8. package/dist/shaka-player.compiled.debug.js +208 -199
  9. package/dist/shaka-player.compiled.debug.map +3 -3
  10. package/dist/shaka-player.compiled.externs.js +8 -2
  11. package/dist/shaka-player.compiled.js +1017 -1016
  12. package/dist/shaka-player.compiled.map +3 -3
  13. package/dist/shaka-player.ui.d.ts +3 -2
  14. package/dist/shaka-player.ui.debug.d.ts +3 -2
  15. package/dist/shaka-player.ui.debug.externs.js +8 -2
  16. package/dist/shaka-player.ui.debug.js +149 -140
  17. package/dist/shaka-player.ui.debug.map +3 -3
  18. package/dist/shaka-player.ui.externs.js +8 -2
  19. package/dist/shaka-player.ui.js +1282 -1281
  20. package/dist/shaka-player.ui.map +3 -3
  21. package/lib/dash/dash_parser.js +9 -3
  22. package/lib/dash/mpd_utils.js +0 -6
  23. package/lib/dash/segment_template.js +24 -1
  24. package/lib/media/playhead.js +3 -3
  25. package/lib/media/segment_index.js +54 -18
  26. package/lib/media/segment_prefetch.js +20 -4
  27. package/lib/media/segment_reference.js +12 -0
  28. package/lib/media/streaming_engine.js +41 -3
  29. package/lib/mss/mss_parser.js +7 -2
  30. package/lib/player.js +2 -1
  31. package/lib/text/ui_text_displayer.js +12 -1
  32. package/lib/util/cmcd_manager.js +3 -2
  33. package/lib/util/platform.js +21 -0
  34. package/lib/util/player_configuration.js +28 -20
  35. package/lib/util/stream_utils.js +6 -2
  36. package/lib/util/tXml.js +1 -1
  37. package/package.json +1 -1
  38. package/ui/resolution_selection.js +1 -0
package/AUTHORS CHANGED
@@ -28,6 +28,7 @@ Bonnier Broadcasting <*@bonnierbroadcasting.com>
28
28
  Bryan Huh <bhh1988@gmail.com>
29
29
  Charter Communications Inc <*@charter.com>
30
30
  Code It <*@code-it.fr>
31
+ Cristian Atehortua <cristian25a32@gmail.com>
31
32
  Damien Deis <developer.deis@gmail.com>
32
33
  Dany L'Hébreux <danylhebreux@gmail.com>
33
34
  Dave Nicholas <davenicholasuk@gmail.com>
package/CONTRIBUTORS CHANGED
@@ -44,6 +44,7 @@ Casey Occhialini <casey.occhialini@gmail.com>
44
44
  Chad Assareh <assareh@google.com>
45
45
  Chris Fillmore <fillmore.chris@gmail.com>
46
46
  Costel Madalin Grecu <madalin.grecu@adswizz.com>
47
+ Cristian Atehortua <cristian25a32@gmail.com>
47
48
  Damien Deis <developer.deis@gmail.com>
48
49
  Dany L'Hébreux <danylhebreux@gmail.com>
49
50
  Dave Nicholas <davenicholasuk@gmail.com>
package/dist/deps.js CHANGED
@@ -48,7 +48,7 @@ goog.addDependency('../../../../lib/cea/ts_cea_parser.js', ['shaka.cea.TsCeaPars
48
48
  goog.addDependency('../../../../lib/config/auto_show_text.js', ['shaka.config.AutoShowText'], [], {'lang': 'es5'});
49
49
  goog.addDependency('../../../../lib/config/codec_switching_strategy.js', ['shaka.config.CodecSwitchingStrategy'], [], {'lang': 'es5'});
50
50
  goog.addDependency('../../../../lib/dash/content_protection.js', ['shaka.dash.ContentProtection'], ['goog.asserts', 'shaka.log', 'shaka.util.BufferUtils', 'shaka.util.Error', 'shaka.util.ManifestParserUtils', 'shaka.util.Pssh', 'shaka.util.StringUtils', 'shaka.util.TXml', 'shaka.util.Uint8ArrayUtils'], {'lang': 'es8'});
51
- goog.addDependency('../../../../lib/dash/dash_parser.js', ['shaka.dash.DashParser'], ['goog.asserts', 'shaka.Deprecate', 'shaka.abr.Ewma', 'shaka.dash.ContentProtection', 'shaka.dash.MpdUtils', 'shaka.dash.SegmentBase', 'shaka.dash.SegmentList', 'shaka.dash.SegmentTemplate', 'shaka.log', 'shaka.media.Capabilities', 'shaka.media.ManifestParser', 'shaka.media.PresentationTimeline', 'shaka.media.SegmentIndex', 'shaka.net.NetworkingEngine', 'shaka.text.TextEngine', 'shaka.util.ContentSteeringManager', 'shaka.util.Error', 'shaka.util.Functional', 'shaka.util.LanguageUtils', 'shaka.util.ManifestParserUtils', 'shaka.util.MimeUtils', 'shaka.util.Networking', 'shaka.util.OperationManager', 'shaka.util.PeriodCombiner', 'shaka.util.StringUtils', 'shaka.util.TXml', 'shaka.util.Timer', 'shaka.util.XmlUtils'], {'lang': 'es8'});
51
+ goog.addDependency('../../../../lib/dash/dash_parser.js', ['shaka.dash.DashParser'], ['goog.asserts', 'shaka.Deprecate', 'shaka.abr.Ewma', 'shaka.dash.ContentProtection', 'shaka.dash.MpdUtils', 'shaka.dash.SegmentBase', 'shaka.dash.SegmentList', 'shaka.dash.SegmentTemplate', 'shaka.log', 'shaka.media.Capabilities', 'shaka.media.ManifestParser', 'shaka.media.PresentationTimeline', 'shaka.media.SegmentIndex', 'shaka.net.NetworkingEngine', 'shaka.text.TextEngine', 'shaka.util.ContentSteeringManager', 'shaka.util.Error', 'shaka.util.Functional', 'shaka.util.LanguageUtils', 'shaka.util.ManifestParserUtils', 'shaka.util.MimeUtils', 'shaka.util.Networking', 'shaka.util.OperationManager', 'shaka.util.PeriodCombiner', 'shaka.util.PlayerConfiguration', 'shaka.util.StringUtils', 'shaka.util.TXml', 'shaka.util.Timer', 'shaka.util.XmlUtils'], {'lang': 'es8'});
52
52
  goog.addDependency('../../../../lib/dash/mpd_utils.js', ['shaka.dash.MpdUtils'], ['goog.asserts', 'shaka.log', 'shaka.net.NetworkingEngine', 'shaka.util.AbortableOperation', 'shaka.util.Error', 'shaka.util.Functional', 'shaka.util.ManifestParserUtils', 'shaka.util.TXml'], {'lang': 'es8'});
53
53
  goog.addDependency('../../../../lib/dash/segment_base.js', ['shaka.dash.SegmentBase'], ['goog.asserts', 'shaka.dash.MpdUtils', 'shaka.log', 'shaka.media.InitSegmentReference', 'shaka.media.Mp4SegmentIndexParser', 'shaka.media.SegmentIndex', 'shaka.media.WebmSegmentIndexParser', 'shaka.util.Error', 'shaka.util.ManifestParserUtils', 'shaka.util.ObjectUtils', 'shaka.util.StringUtils', 'shaka.util.TXml'], {'lang': 'es8'});
54
54
  goog.addDependency('../../../../lib/dash/segment_list.js', ['shaka.dash.SegmentList'], ['goog.asserts', 'shaka.dash.MpdUtils', 'shaka.dash.SegmentBase', 'shaka.log', 'shaka.media.InitSegmentReference', 'shaka.media.SegmentIndex', 'shaka.media.SegmentReference', 'shaka.util.Error', 'shaka.util.Functional', 'shaka.util.ManifestParserUtils', 'shaka.util.StringUtils', 'shaka.util.TXml'], {'lang': 'es6'});
@@ -94,7 +94,7 @@ goog.addDependency('../../../../lib/media/time_ranges_utils.js', ['shaka.media.T
94
94
  goog.addDependency('../../../../lib/media/video_wrapper.js', ['shaka.media.VideoWrapper', 'shaka.media.VideoWrapper.PlayheadMover'], ['goog.asserts', 'shaka.log', 'shaka.util.EventManager', 'shaka.util.IReleasable', 'shaka.util.MediaReadyState', 'shaka.util.Timer'], {'lang': 'es6'});
95
95
  goog.addDependency('../../../../lib/media/webm_segment_index_parser.js', ['shaka.media.WebmSegmentIndexParser'], ['goog.asserts', 'shaka.log', 'shaka.media.InitSegmentReference', 'shaka.media.SegmentReference', 'shaka.util.EbmlElement', 'shaka.util.EbmlParser', 'shaka.util.Error'], {'lang': 'es6'});
96
96
  goog.addDependency('../../../../lib/mss/content_protection.js', ['shaka.mss.ContentProtection'], ['shaka.log', 'shaka.util.BufferUtils', 'shaka.util.ManifestParserUtils', 'shaka.util.Pssh', 'shaka.util.StringUtils', 'shaka.util.TXml', 'shaka.util.Uint8ArrayUtils'], {'lang': 'es6'});
97
- goog.addDependency('../../../../lib/mss/mss_parser.js', ['shaka.mss.MssParser'], ['goog.asserts', 'shaka.Deprecate', 'shaka.abr.Ewma', 'shaka.log', 'shaka.media.InitSegmentReference', 'shaka.media.ManifestParser', 'shaka.media.PresentationTimeline', 'shaka.media.SegmentIndex', 'shaka.media.SegmentReference', 'shaka.mss.ContentProtection', 'shaka.net.NetworkingEngine', 'shaka.util.Error', 'shaka.util.LanguageUtils', 'shaka.util.ManifestParserUtils', 'shaka.util.MimeUtils', 'shaka.util.Mp4Generator', 'shaka.util.OperationManager', 'shaka.util.TXml', 'shaka.util.Timer', 'shaka.util.XmlUtils'], {'lang': 'es8'});
97
+ goog.addDependency('../../../../lib/mss/mss_parser.js', ['shaka.mss.MssParser'], ['goog.asserts', 'shaka.Deprecate', 'shaka.abr.Ewma', 'shaka.log', 'shaka.media.InitSegmentReference', 'shaka.media.ManifestParser', 'shaka.media.PresentationTimeline', 'shaka.media.SegmentIndex', 'shaka.media.SegmentReference', 'shaka.mss.ContentProtection', 'shaka.net.NetworkingEngine', 'shaka.util.Error', 'shaka.util.LanguageUtils', 'shaka.util.ManifestParserUtils', 'shaka.util.MimeUtils', 'shaka.util.Mp4Generator', 'shaka.util.OperationManager', 'shaka.util.PlayerConfiguration', 'shaka.util.TXml', 'shaka.util.Timer', 'shaka.util.XmlUtils'], {'lang': 'es8'});
98
98
  goog.addDependency('../../../../lib/net/backoff.js', ['shaka.net.Backoff'], ['goog.asserts', 'shaka.util.Error', 'shaka.util.Timer'], {'lang': 'es8'});
99
99
  goog.addDependency('../../../../lib/net/data_uri_plugin.js', ['shaka.net.DataUriPlugin'], ['shaka.log', 'shaka.net.NetworkingEngine', 'shaka.util.AbortableOperation', 'shaka.util.Error', 'shaka.util.StringUtils', 'shaka.util.Uint8ArrayUtils'], {'lang': 'es6'});
100
100
  goog.addDependency('../../../../lib/net/http_fetch_plugin.js', ['shaka.net.HttpFetchPlugin'], ['goog.asserts', 'shaka.log', 'shaka.net.HttpPluginUtils', 'shaka.net.NetworkingEngine', 'shaka.util.AbortableOperation', 'shaka.util.Error', 'shaka.util.MapUtils', 'shaka.util.Timer'], {'lang': 'es8'});
@@ -152,7 +152,7 @@ goog.addDependency('../../../../lib/text/stub_text_displayer.js', ['shaka.text.S
152
152
  goog.addDependency('../../../../lib/text/text_engine.js', ['shaka.text.TextEngine'], ['goog.asserts', 'shaka.Deprecate', 'shaka.media.ClosedCaptionParser', 'shaka.text.Cue', 'shaka.util.BufferUtils', 'shaka.util.IDestroyable', 'shaka.util.MimeUtils'], {'lang': 'es8'});
153
153
  goog.addDependency('../../../../lib/text/text_utils.js', ['shaka.text.Utils'], ['shaka.text.Cue'], {'lang': 'es6'});
154
154
  goog.addDependency('../../../../lib/text/ttml_text_parser.js', ['shaka.text.TtmlTextParser'], ['goog.Uri', 'goog.asserts', 'shaka.log', 'shaka.text.Cue', 'shaka.text.CueRegion', 'shaka.text.TextEngine', 'shaka.util.ArrayUtils', 'shaka.util.Error', 'shaka.util.StringUtils', 'shaka.util.TXml'], {'lang': 'es8'});
155
- goog.addDependency('../../../../lib/text/ui_text_displayer.js', ['shaka.text.UITextDisplayer'], ['goog.asserts', 'shaka.text.Cue', 'shaka.text.CueRegion', 'shaka.util.Dom', 'shaka.util.EventManager', 'shaka.util.Timer'], {'lang': 'es6'});
155
+ goog.addDependency('../../../../lib/text/ui_text_displayer.js', ['shaka.text.UITextDisplayer'], ['goog.asserts', 'shaka.Deprecate', 'shaka.text.Cue', 'shaka.text.CueRegion', 'shaka.util.Dom', 'shaka.util.EventManager', 'shaka.util.Timer'], {'lang': 'es6'});
156
156
  goog.addDependency('../../../../lib/text/vtt_text_parser.js', ['shaka.text.VttTextParser'], ['goog.asserts', 'shaka.log', 'shaka.media.ManifestParser', 'shaka.text.Cue', 'shaka.text.CueRegion', 'shaka.text.TextEngine', 'shaka.util.Error', 'shaka.util.StringUtils', 'shaka.util.TXml', 'shaka.util.TextParser'], {'lang': 'es6'});
157
157
  goog.addDependency('../../../../lib/text/web_vtt_generator.js', ['shaka.text.WebVttGenerator'], ['shaka.text.Cue', 'shaka.text.Utils'], {'lang': 'es6'});
158
158
  goog.addDependency('../../../../lib/transmuxer/aac_transmuxer.js', ['shaka.transmuxer.AacTransmuxer'], ['shaka.media.Capabilities', 'shaka.transmuxer.ADTS', 'shaka.transmuxer.TransmuxerEngine', 'shaka.util.BufferUtils', 'shaka.util.Error', 'shaka.util.Id3Utils', 'shaka.util.ManifestParserUtils', 'shaka.util.MimeUtils', 'shaka.util.Mp4Generator', 'shaka.util.Uint8ArrayUtils'], {'lang': 'es6'});
package/dist/locales.js CHANGED
@@ -732,48 +732,48 @@ shaka.ui.Locales.addTo = function(localization) {
732
732
  * @const
733
733
  */
734
734
  shaka.ui.Locales.Ids = {
735
+ LOOP: 'LOOP',
736
+ MULTIPLE_LANGUAGES: 'MULTIPLE_LANGUAGES',
737
+ SEEK: 'SEEK',
738
+ NOT_APPLICABLE: 'NOT_APPLICABLE',
735
739
  ON: 'ON',
736
- VOLUME: 'VOLUME',
737
- LANGUAGE: 'LANGUAGE',
738
- LIVE: 'LIVE',
739
- PICTURE_IN_PICTURE: 'PICTURE_IN_PICTURE',
740
- AIRPLAY: 'AIRPLAY',
741
- STATISTICS: 'STATISTICS',
742
- TOGGLE_STEREOSCOPIC: 'TOGGLE_STEREOSCOPIC',
743
740
  QUALITY: 'QUALITY',
744
- SUBTITLE_FORCED: 'SUBTITLE_FORCED',
745
- AUTO_QUALITY: 'AUTO_QUALITY',
746
- UNMUTE: 'UNMUTE',
741
+ AIRPLAY: 'AIRPLAY',
742
+ PICTURE_IN_PICTURE: 'PICTURE_IN_PICTURE',
743
+ EXIT_PICTURE_IN_PICTURE: 'EXIT_PICTURE_IN_PICTURE',
747
744
  ENTER_LOOP_MODE: 'ENTER_LOOP_MODE',
748
- FAST_FORWARD: 'FAST_FORWARD',
749
- REWIND: 'REWIND',
750
- PLAYBACK_RATE: 'PLAYBACK_RATE',
751
- UNRECOGNIZED_LANGUAGE: 'UNRECOGNIZED_LANGUAGE',
752
- AD_PROGRESS: 'AD_PROGRESS',
753
- REPLAY: 'REPLAY',
754
- CAST: 'CAST',
755
- SEEK: 'SEEK',
756
- RECENTER_VR: 'RECENTER_VR',
757
- EXIT_LOOP_MODE: 'EXIT_LOOP_MODE',
745
+ MUTE: 'MUTE',
758
746
  EXIT_FULL_SCREEN: 'EXIT_FULL_SCREEN',
759
- ENTER_PICTURE_IN_PICTURE: 'ENTER_PICTURE_IN_PICTURE',
747
+ SURROUND: 'SURROUND',
748
+ UNRECOGNIZED_LANGUAGE: 'UNRECOGNIZED_LANGUAGE',
760
749
  CAPTIONS: 'CAPTIONS',
761
- LOOP: 'LOOP',
762
- BACK: 'BACK',
763
- AD_TIME: 'AD_TIME',
750
+ PLAY: 'PLAY',
751
+ PLAYBACK_RATE: 'PLAYBACK_RATE',
752
+ REPLAY: 'REPLAY',
753
+ UNMUTE: 'UNMUTE',
754
+ SUBTITLE_FORCED: 'SUBTITLE_FORCED',
755
+ AUTO_QUALITY: 'AUTO_QUALITY',
764
756
  SKIP_AD: 'SKIP_AD',
757
+ LIVE: 'LIVE',
758
+ VOLUME: 'VOLUME',
759
+ EXIT_LOOP_MODE: 'EXIT_LOOP_MODE',
760
+ PAUSE: 'PAUSE',
761
+ AD_PROGRESS: 'AD_PROGRESS',
762
+ LANGUAGE: 'LANGUAGE',
763
+ STATISTICS: 'STATISTICS',
764
+ TOGGLE_STEREOSCOPIC: 'TOGGLE_STEREOSCOPIC',
765
765
  FULL_SCREEN: 'FULL_SCREEN',
766
- MULTIPLE_LANGUAGES: 'MULTIPLE_LANGUAGES',
767
- SURROUND: 'SURROUND',
768
- NOT_APPLICABLE: 'NOT_APPLICABLE',
769
766
  AD_DURATION: 'AD_DURATION',
770
- PLAY: 'PLAY',
767
+ ENTER_PICTURE_IN_PICTURE: 'ENTER_PICTURE_IN_PICTURE',
768
+ AD_TIME: 'AD_TIME',
771
769
  SKIP_TO_LIVE: 'SKIP_TO_LIVE',
772
- OFF: 'OFF',
773
- RESOLUTION: 'RESOLUTION',
774
770
  MORE_SETTINGS: 'MORE_SETTINGS',
775
- PAUSE: 'PAUSE',
771
+ RECENTER_VR: 'RECENTER_VR',
772
+ CAST: 'CAST',
773
+ FAST_FORWARD: 'FAST_FORWARD',
774
+ RESOLUTION: 'RESOLUTION',
775
+ OFF: 'OFF',
776
+ BACK: 'BACK',
776
777
  UNDETERMINED_LANGUAGE: 'UNDETERMINED_LANGUAGE',
777
- MUTE: 'MUTE',
778
- EXIT_PICTURE_IN_PICTURE: 'EXIT_PICTURE_IN_PICTURE',
778
+ REWIND: 'REWIND',
779
779
  };
@@ -1294,7 +1294,7 @@ declare namespace shaka.media {
1294
1294
  * RFC 8216 rev 13, section 8.1: "Each (non-Partial) Media Segment in a Media
1295
1295
  * Playlist will contain at least one independent frame."
1296
1296
  */
1297
- getIteratorForTime (time : number , allowNonIndepedent ? : boolean ) : shaka.media.SegmentIterator | null ;
1297
+ getIteratorForTime (time : number , allowNonIndepedent ? : boolean , reverse ? : boolean ) : shaka.media.SegmentIterator | null ;
1298
1298
  getNumEvicted ( ) : any ;
1299
1299
  getNumReferences ( ) : any ;
1300
1300
  /**
@@ -1344,10 +1344,11 @@ declare namespace shaka.media {
1344
1344
  /**
1345
1345
  * An iterator over a SegmentIndex's references.
1346
1346
  */
1347
- constructor (segmentIndex : shaka.media.SegmentIndex | null , index : number , partialSegmentIndex : number ) ;
1347
+ constructor (segmentIndex : shaka.media.SegmentIndex | null , index : number , partialSegmentIndex : number , reverse : boolean ) ;
1348
1348
  current ( ) : shaka.media.SegmentReference | null ;
1349
1349
  currentPosition ( ) : number ;
1350
1350
  next ( ) : any ;
1351
+ setReverse (reverse : boolean ) : any ;
1351
1352
  }
1352
1353
  }
1353
1354
  // Generated from /home/runner/work/shaka-player/shaka-player/dist/shaka-player.compiled.externs.js
@@ -1294,7 +1294,7 @@ declare namespace shaka.media {
1294
1294
  * RFC 8216 rev 13, section 8.1: "Each (non-Partial) Media Segment in a Media
1295
1295
  * Playlist will contain at least one independent frame."
1296
1296
  */
1297
- getIteratorForTime (time : number , allowNonIndepedent ? : boolean ) : shaka.media.SegmentIterator | null ;
1297
+ getIteratorForTime (time : number , allowNonIndepedent ? : boolean , reverse ? : boolean ) : shaka.media.SegmentIterator | null ;
1298
1298
  getNumEvicted ( ) : any ;
1299
1299
  getNumReferences ( ) : any ;
1300
1300
  /**
@@ -1344,10 +1344,11 @@ declare namespace shaka.media {
1344
1344
  /**
1345
1345
  * An iterator over a SegmentIndex's references.
1346
1346
  */
1347
- constructor (segmentIndex : shaka.media.SegmentIndex | null , index : number , partialSegmentIndex : number ) ;
1347
+ constructor (segmentIndex : shaka.media.SegmentIndex | null , index : number , partialSegmentIndex : number , reverse : boolean ) ;
1348
1348
  current ( ) : shaka.media.SegmentReference | null ;
1349
1349
  currentPosition ( ) : number ;
1350
1350
  next ( ) : any ;
1351
+ setReverse (reverse : boolean ) : any ;
1351
1352
  }
1352
1353
  }
1353
1354
  // Generated from /home/runner/work/shaka-player/shaka-player/dist/shaka-player.compiled.debug.externs.js
@@ -2703,9 +2703,10 @@ shaka.media.SegmentIndex = class {
2703
2703
  * Playlist will contain at least one independent frame."
2704
2704
  * @param {number} time
2705
2705
  * @param {boolean=} allowNonIndepedent
2706
+ * @param {boolean=} reverse
2706
2707
  * @return {?shaka.media.SegmentIterator}
2707
2708
  */
2708
- getIteratorForTime(time, allowNonIndepedent) {}
2709
+ getIteratorForTime(time, allowNonIndepedent, reverse) {}
2709
2710
  /**
2710
2711
  * Create a SegmentIndex for a single segment of the given start time and
2711
2712
  * duration at the given URIs.
@@ -2725,8 +2726,13 @@ shaka.media.SegmentIterator = class {
2725
2726
  * @param {shaka.media.SegmentIndex} segmentIndex
2726
2727
  * @param {number} index
2727
2728
  * @param {number} partialSegmentIndex
2729
+ * @param {boolean} reverse
2728
2730
  */
2729
- constructor(segmentIndex, index, partialSegmentIndex) {}
2731
+ constructor(segmentIndex, index, partialSegmentIndex, reverse) {}
2732
+ /**
2733
+ * @param {boolean} reverse
2734
+ */
2735
+ setReverse(reverse) {}
2730
2736
  /**
2731
2737
  * @return {number}
2732
2738
  */