rtsp 0.4.0 → 0.4.1

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 (181) hide show
  1. data/ChangeLog.rdoc +17 -12
  2. data/Gemfile +2 -0
  3. data/lib/ext/time_ext.rb +7 -0
  4. data/lib/rtsp/client.rb +1 -1
  5. data/lib/rtsp/presentation.rb +160 -0
  6. data/lib/rtsp/response.rb +6 -6
  7. data/lib/rtsp/session.rb +65 -0
  8. data/lib/rtsp/transport_parser.rb +2 -2
  9. data/lib/rtsp/version.rb +1 -1
  10. data/rtsp.gemspec +0 -2
  11. data/spec/integration/coverage/assets/0.7.1/application.css +1110 -0
  12. data/spec/integration/coverage/assets/0.7.1/application.js +626 -0
  13. data/spec/integration/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  14. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  15. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  16. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  17. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  18. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  19. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  20. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  21. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  22. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  23. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  24. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  25. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  26. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  27. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  28. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  29. data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  30. data/spec/integration/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  31. data/spec/integration/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  32. data/spec/integration/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  33. data/spec/integration/coverage/assets/0.7.1/favicon_green.png +0 -0
  34. data/spec/integration/coverage/assets/0.7.1/favicon_red.png +0 -0
  35. data/spec/integration/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  36. data/spec/integration/coverage/assets/0.7.1/loading.gif +0 -0
  37. data/spec/integration/coverage/assets/0.7.1/magnify.png +0 -0
  38. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  39. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  40. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  41. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  42. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  43. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  44. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  45. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  46. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  47. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  48. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  49. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  50. data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  51. data/spec/integration/coverage/index.html +72 -0
  52. data/spec/rtsp/client_spec.rb +1 -1
  53. data/spec/rtsp/coverage/assets/0.7.1/application.css +1110 -0
  54. data/spec/rtsp/coverage/assets/0.7.1/application.js +626 -0
  55. data/spec/rtsp/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  56. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  57. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  58. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  59. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  60. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  61. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  62. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  63. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  64. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  65. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  66. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  67. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  68. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  69. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  70. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  71. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  72. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  73. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  74. data/spec/rtsp/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  75. data/spec/rtsp/coverage/assets/0.7.1/favicon_green.png +0 -0
  76. data/spec/rtsp/coverage/assets/0.7.1/favicon_red.png +0 -0
  77. data/spec/rtsp/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  78. data/spec/rtsp/coverage/assets/0.7.1/loading.gif +0 -0
  79. data/spec/rtsp/coverage/assets/0.7.1/magnify.png +0 -0
  80. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  81. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  82. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  83. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  84. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  85. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  86. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  87. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  88. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  89. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  90. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  91. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  92. data/spec/rtsp/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  93. data/spec/rtsp/coverage/index.html +72 -0
  94. data/spec/rtsp/message_spec.rb +5 -5
  95. data/spec/rtsp/response_spec.rb +34 -4
  96. data/spec/unit/ext/coverage/assets/0.7.1/application.css +1110 -0
  97. data/spec/unit/ext/coverage/assets/0.7.1/application.js +626 -0
  98. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  99. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  100. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  101. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  102. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  103. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  104. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  105. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  106. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  107. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  108. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  109. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  110. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  111. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  112. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  113. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  114. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  115. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  116. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  117. data/spec/unit/ext/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  118. data/spec/unit/ext/coverage/assets/0.7.1/favicon_green.png +0 -0
  119. data/spec/unit/ext/coverage/assets/0.7.1/favicon_red.png +0 -0
  120. data/spec/unit/ext/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  121. data/spec/unit/ext/coverage/assets/0.7.1/loading.gif +0 -0
  122. data/spec/unit/ext/coverage/assets/0.7.1/magnify.png +0 -0
  123. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  124. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  125. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  126. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  127. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  128. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  129. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  130. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  131. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  132. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  133. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  134. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  135. data/spec/unit/ext/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  136. data/spec/unit/ext/coverage/index.html +72 -0
  137. data/spec/unit/rtsp/coverage/assets/0.7.1/application.css +1110 -0
  138. data/spec/unit/rtsp/coverage/assets/0.7.1/application.js +626 -0
  139. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  140. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  141. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  142. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  143. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  144. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  145. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  146. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  147. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  148. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  149. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  150. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  151. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  152. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  153. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  154. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  155. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  156. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  157. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  158. data/spec/unit/rtsp/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  159. data/spec/unit/rtsp/coverage/assets/0.7.1/favicon_green.png +0 -0
  160. data/spec/unit/rtsp/coverage/assets/0.7.1/favicon_red.png +0 -0
  161. data/spec/unit/rtsp/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  162. data/spec/unit/rtsp/coverage/assets/0.7.1/loading.gif +0 -0
  163. data/spec/unit/rtsp/coverage/assets/0.7.1/magnify.png +0 -0
  164. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  165. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  166. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  167. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  168. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  169. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  170. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  171. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  172. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  173. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  174. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  175. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  176. data/spec/unit/rtsp/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  177. data/spec/unit/rtsp/coverage/index.html +72 -0
  178. metadata +390 -39
  179. data/tasks/roodi.rake +0 -9
  180. data/tasks/roodi_config.yaml +0 -14
  181. data/tasks/stats.rake +0 -12
@@ -1,21 +1,26 @@
1
+ === 0.4.1 / 2012-11-14
2
+
3
+ * gh-16: Can now parse Session IDs to be alpha characters. Thanks @greywolf-colorado!
4
+ * gh-17: Responses now handle HTTP responses.
5
+
1
6
  === 0.4.0 / 2012-03-08
2
7
 
3
8
  * gh-11: Transport header parser bolstering:
4
9
  * values that should be caps, will parse OK as lowercase now.
5
- * :broadcast_type now parses 'multicast'.
6
- * :destination now returns the value of the destination instead of
7
- "destination=x.x.x.x"
8
- * :source now returns the value of the source instead of "source=x.x.x.x"
9
- * Added parsing for fields:
10
- * ttl
11
- * port
12
- * ssrc
13
- * channel
14
- * address
15
- * mode
10
+ * :broadcast_type now parses 'multicast'.
11
+ * :destination now returns the value of the destination instead of
12
+ "destination=x.x.x.x"
13
+ * :source now returns the value of the source instead of "source=x.x.x.x"
14
+ * Added parsing for fields:
15
+ * ttl
16
+ * port
17
+ * ssrc
18
+ * channel
19
+ * address
20
+ * mode
16
21
  * gh-10: Session header now detects timeout value. This means that where use
17
22
  of the value extracted from this header used to be a simple Integer, now you
18
- have a session Hash with :session_id and :timeout keys.
23
+ have a session Hash with :session_id and :timeout keys.
19
24
 
20
25
  === 0.3.0 / 2012-03-02
21
26
 
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
1
  source :rubygems
2
2
 
3
+ #gem 'rtp', path: '../rtp'
3
4
  gemspec
5
+
@@ -0,0 +1,7 @@
1
+ class Time
2
+ def to_ntp
3
+ # To convert Unix time to NTP time, add this.
4
+ ntp_to_unix_time_diff = 2208988800
5
+ self.to_i + ntp_to_unix_time_diff
6
+ end
7
+ end
@@ -438,7 +438,7 @@ module RTSP
438
438
  #
439
439
  # @raise [RTSP::Error] Raises if @session isn't set.
440
440
  def ensure_session
441
- if @session.empty? || @session[:session_id] <= 0
441
+ if @session.empty?
442
442
  raise RTSP::Error, "Session number not retrieved from server yet. Run SETUP first."
443
443
  end
444
444
  end
@@ -0,0 +1,160 @@
1
+ require_relative '../ext/time_ext'
2
+ require_relative 'logger'
3
+ require 'sdp'
4
+ require 'etc'
5
+ require 'socket'
6
+
7
+ module RTSP
8
+ # Per the RFC definition:
9
+ # A set of one or more streams presented to the client as a complete media
10
+ # feed, using a presentation description [...]. In most cases in the RTSP
11
+ # context, this implies aggregate control of those streams, but does not
12
+ # have to.
13
+ class Presentation
14
+ include LogSwitch::Mixin
15
+
16
+ # The list of stream objects that a server controls.
17
+ attr_reader :streams
18
+
19
+ # The SDP description that describes all of the streams. Per the RFC
20
+ # definition:
21
+ # A presentation description contains information about one or more media
22
+ # streams within a presentation, such as the set of encodings, network
23
+ # addresses and information about the content.
24
+ attr_reader :description
25
+
26
+ attr_accessor :url
27
+
28
+ def initialize(base_url)
29
+ @base_url = base_url
30
+ @streams = []
31
+ @description = default_description
32
+
33
+ yield self if block_given?
34
+ end
35
+
36
+ # @param [RTSP::Stream] stream
37
+ def add_stream(&block)
38
+ stream = RTSP::Stream.new
39
+ yield stream
40
+
41
+ log "Adding stream: #{stream}"
42
+
43
+ @description.media_sections << {
44
+ media: stream.media_type,
45
+ port: stream.client_rtp_port,
46
+ format: stream.format,
47
+ protocol: stream.protocol,
48
+ attributes: stream.attributes
49
+ }
50
+
51
+ @streams << stream
52
+ end
53
+
54
+ # @param [String] new_url
55
+ def url=(new_url)
56
+ @url = new_url
57
+ @description.attributes.delete_if { |a| a[:attribute] == "control" }
58
+
59
+ @description.attributes << {
60
+ attribute: "control",
61
+ value: new_url
62
+ }
63
+ end
64
+
65
+ # @return [Array] The list of URLs that make up all of the media streams for
66
+ # this presentation.
67
+ def media_urls
68
+ @streams.map do |stream|
69
+ "#{@base_url}#{stream.uri}"
70
+ end
71
+ end
72
+
73
+ # @param [String] uri
74
+ # @return [RTSP::Stream] The stream that's identified by the URI.
75
+ def stream_at(uri)
76
+ puts "looking for stream at #{uri}"
77
+
78
+ streams.find do |stream|
79
+ log "Checking stream match on #{stream.uri}"
80
+
81
+ if URI(uri).absolute?
82
+ @base_url + stream.uri == uri
83
+ else
84
+ stream.uri == uri
85
+ end
86
+ end
87
+ end
88
+
89
+ # @return [SDP::Description]
90
+ def default_description
91
+ sdp = SDP::Description.new
92
+ sdp.username = Etc.getlogin
93
+ sdp.id = Time.now.to_ntp
94
+ sdp.version = sdp.id
95
+ sdp.network_type = "IN"
96
+ sdp.address_type = "IP4"
97
+
98
+ sdp.unicast_address = UDPSocket.open do |s|
99
+ s.connect('64.233.187.99', 1); s.addr.last
100
+ end
101
+
102
+ sdp.name = "Ruby RTSP Stream"
103
+ sdp.information = "This is a Ruby RTSP stream"
104
+ sdp.connection_network_type = "IN"
105
+ sdp.connection_address_type = "IP4"
106
+ sdp.connection_address = sdp.unicast_address
107
+ sdp.start_time = 0
108
+ sdp.stop_time = 0
109
+
110
+ sdp.attributes << { tool: "RubyRTSP #{RTSP::VERSION}" }
111
+ sdp.attributes << { control: "*" }
112
+ # User must still define media section.
113
+
114
+ sdp
115
+ end
116
+
117
+ def setup_rtp_sender(type)
118
+ case type
119
+ when :socat
120
+ @rtp_sender = RTP::Sender.instance
121
+ @rtp_sender.stream_module = RTP::Senders::Socat
122
+
123
+ yield @rtp_sender if block_given?
124
+
125
+
126
+ when :indirection
127
+ # Get remote server's URL
128
+ server_url = yield()
129
+
130
+ # Get description from the remote RTSP server
131
+ require_relative 'client'
132
+ client = RTSP::Client.new(server_url)
133
+ response = client.describe
134
+ @description = response.body
135
+
136
+ # Get the control URL for the main remote presentation and set that for
137
+ # this URL
138
+ control = @description.attributes.find { |a| a[:attribute] == "control" }
139
+ self.url = control[:value]
140
+
141
+ # Get the control URL for the first media section so we can get the
142
+ # Stream object that was setup in configuration.
143
+ media_control =
144
+ @description.media_sections.first[:attributes].find { |a| a[:attribute] == "control" }
145
+ redirected_stream = stream_at(media_control[:value])
146
+
147
+ # Create a socket to redirect the RTP data that we'll start receiving.
148
+ redirected_socket = UDPSocket.new
149
+ redirected_socket.bind('0.0.0.0', redirected_stream.client_rtp_port)
150
+ client.capturer.rtp_file = redirected_socket
151
+
152
+ # Setup
153
+ media_track = client.media_control_tracks.first
154
+ aggregate_track = client.aggregate_control_track
155
+ client.setup media_track
156
+ client.play aggregate_track
157
+ end
158
+ end
159
+ end
160
+ end
@@ -68,10 +68,10 @@ module RTSP
68
68
  #
69
69
  # @param [String] line The String containing the status line info.
70
70
  def extract_status_line(line)
71
- line =~ /RTSP\/(\d\.\d) (\d\d\d) ([^\r\n]+)/
72
- @rtsp_version = $1
73
- @code = $2.to_i
74
- @message = $3
71
+ line =~ /(RTSP|HTTP)\/(\d\.\d) (\d\d\d) ([^\r\n]+)/
72
+ @rtsp_version = $2
73
+ @code = $3.to_i
74
+ @message = $4
75
75
 
76
76
  if @rtsp_version.nil?
77
77
  raise RTSP::Error, "Status line corrupted: #{line}"
@@ -94,8 +94,8 @@ module RTSP
94
94
 
95
95
  if line.include? "Session: "
96
96
  value = {}
97
- line =~ /Session: (\d+)/
98
- value[:session_id] = $1.to_i
97
+ line =~ /Session: ([\w\\$\-\.\+]+)/
98
+ value[:session_id] = $1
99
99
 
100
100
  if line =~ /timeout=(.+)/
101
101
  value[:timeout] = $1.to_i
@@ -0,0 +1,65 @@
1
+ require_relative '../ext/time_ext'
2
+ require_relative 'error'
3
+
4
+
5
+ module RTSP
6
+
7
+ # Because RTSP does not use a persistent connection to communicate over, it
8
+ # must maintain state of its streams and the clients using them via different
9
+ # means; it uses sessions for this. This differs from HTTP, which is a
10
+ # stateless protocol.
11
+ #
12
+ # The RFC describes this as:
13
+ # A complete RTSP "transaction", e.g., the viewing of a movie. A session
14
+ # typically consists of a client setting up a transport mechanism for the
15
+ # continuous media stream (SETUP), starting the stream with PLAY or RECORD,
16
+ # and closing the stream with TEARDOWN.
17
+ #
18
+ # Objects of this type are used by RTSP::Servers and RTSP::Clients to keep
19
+ # track of their session state and manage the resources associated to them.
20
+ class Session
21
+
22
+ # The identifier that labels this session.
23
+ attr_reader :session_id
24
+
25
+ attr_reader :stream
26
+
27
+ # A session's state indicates where it's at in the process of sending or
28
+ # receiving a stream. Can be:
29
+ # * :init
30
+ # * "The initial state, no valid SETUP has been received yet."
31
+ # * :ready
32
+ # * "Last SETUP received was successful, reply sent or after playing, last
33
+ # PAUSE received was successful, reply sent.""
34
+ # * :playing
35
+ # * "Last PLAY received was successful, reply sent. Data is being sent.
36
+ # * :recording
37
+ # * "The server is recording media data."
38
+ attr_accessor :state
39
+
40
+ # @param [RTSP::Stream]
41
+ def initialize(stream)
42
+ @stream = stream
43
+ @session_id = Time.now.to_ntp
44
+ @state = :init
45
+ end
46
+
47
+ def setup(broadcast_type, send_on_port)
48
+ if @state == :init
49
+ @state = :ready
50
+ end
51
+
52
+ @stream.broadcast_type = broadcast_type
53
+ @stream.client_rtp_port = send_on_port
54
+ @stream.rtp_sender.setup_streamer
55
+ end
56
+
57
+ def play
58
+ unless @state == :ready
59
+ return false
60
+ end
61
+
62
+ @stream.rtp_sender.start_streaming
63
+ end
64
+ end
65
+ end
@@ -43,7 +43,7 @@ module RTSP
43
43
 
44
44
  rule(:port) do
45
45
  str('port=') >> match('[\d]').repeat(1,5).as(:rtp) >>
46
- dash.maybe >> match('[\d]').repeat(1,5).as(:rtcp).maybe
46
+ dash.maybe >> match('[\d]').repeat(1,5).as(:rtcp).maybe
47
47
  end
48
48
 
49
49
  rule(:ssrc) do
@@ -60,7 +60,7 @@ module RTSP
60
60
 
61
61
  rule(:mode) do
62
62
  str('mode=') >> str('"').maybe >> match('[A-Za-z]').repeat.as(:mode) >>
63
- str('"').maybe
63
+ str('"').maybe
64
64
  end
65
65
 
66
66
  rule(:ip_address) do
@@ -1,4 +1,4 @@
1
1
  module RTSP
2
2
  # rtsp version
3
- VERSION = "0.4.0"
3
+ VERSION = "0.4.1"
4
4
  end
@@ -31,9 +31,7 @@ For more information see: http://www.ietf.org/rfc/rfc2326.txt}
31
31
  s.add_runtime_dependency(%q<sdp>, ["~> 0.2.6"])
32
32
 
33
33
  s.add_development_dependency(%q<bundler>)
34
- s.add_development_dependency(%q<code_statistics>, ["~> 0.2.13"])
35
34
  s.add_development_dependency(%q<cucumber>, [">= 1.1.0"])
36
- s.add_development_dependency(%q<roodi>, [">= 2.1.0"])
37
35
  s.add_development_dependency(%q<rake>, [">= 0.8.7"])
38
36
  s.add_development_dependency(%q<rspec>, [">= 2.5.0"])
39
37
  s.add_development_dependency(%q<simplecov>, [">= 0.4.0"])
@@ -0,0 +1,1110 @@
1
+ /* -----------------------------------------------------------------------
2
+
3
+
4
+ Blueprint CSS Framework 0.9
5
+ http://blueprintcss.org
6
+
7
+ * Copyright (c) 2007-Present. See LICENSE for more info.
8
+ * See README for instructions on how to use Blueprint.
9
+ * For credits and origins, see AUTHORS.
10
+ * This is a compressed file. See the sources in the 'src' directory.
11
+
12
+ ----------------------------------------------------------------------- */
13
+
14
+ /* reset.css */
15
+
16
+ html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
17
+ article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;}
18
+ body {line-height:1.5;}
19
+ table {border-collapse:separate;border-spacing:0;}
20
+ caption, th, td {text-align:left;font-weight:normal;}
21
+ table, td, th {vertical-align:middle;}
22
+ blockquote:before, blockquote:after, q:before, q:after {content:"";}
23
+ blockquote, q {quotes:"" "";}
24
+ a img {border:none;}
25
+
26
+ /* typography.css */
27
+ html {font-size:100.01%;}
28
+ body {font-size:82%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;}
29
+ h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;}
30
+ h1 {font-size:3em;line-height:1;margin-bottom:0.5em;}
31
+ h2 {font-size:2em;margin-bottom:0.75em;}
32
+ h3 {font-size:1.5em;line-height:1;margin-bottom:1em;}
33
+ h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;}
34
+ h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;}
35
+ h6 {font-size:1em;font-weight:bold;}
36
+ h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;}
37
+ p {margin:0 0 1.5em;}
38
+ p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;}
39
+ p img.right {float:right;margin:1.5em 0 1.5em 1.5em;}
40
+ a:focus, a:hover {color:#000;}
41
+ a {color:#009;text-decoration:underline;}
42
+ blockquote {margin:1.5em;color:#666;font-style:italic;}
43
+ strong {font-weight:bold;}
44
+ em, dfn {font-style:italic;}
45
+ dfn {font-weight:bold;}
46
+ sup, sub {line-height:0;}
47
+ abbr, acronym {border-bottom:1px dotted #666;}
48
+ address {margin:0 0 1.5em;font-style:italic;}
49
+ del {color:#666;}
50
+ pre {margin:1.5em 0;white-space:pre;}
51
+ pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;}
52
+ li ul, li ol {margin:0;}
53
+ ul, ol {margin:0 1.5em 1.5em 0;padding-left:3.333em;}
54
+ ul {list-style-type:disc;}
55
+ ol {list-style-type:decimal;}
56
+ dl {margin:0 0 1.5em 0;}
57
+ dl dt {font-weight:bold;}
58
+ dd {margin-left:1.5em;}
59
+ table {margin-bottom:1.4em;width:100%;}
60
+ th {font-weight:bold;}
61
+ thead th {background:#c3d9ff;}
62
+ th, td, caption {padding:4px 10px 4px 5px;}
63
+ tr.even td {background:#efefef;}
64
+ tfoot {font-style:italic;}
65
+ caption {background:#eee;}
66
+ .small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
67
+ .large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
68
+ .hide {display:none;}
69
+ .quiet {color:#666;}
70
+ .loud {color:#000;}
71
+ .highlight {background:#ff0;}
72
+ .added {background:#060;color:#fff;}
73
+ .removed {background:#900;color:#fff;}
74
+ .first {margin-left:0;padding-left:0;}
75
+ .last {margin-right:0;padding-right:0;}
76
+ .top {margin-top:0;padding-top:0;}
77
+ .bottom {margin-bottom:0;padding-bottom:0;}
78
+
79
+ /* forms.css */
80
+ label {font-weight:bold;}
81
+ fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;}
82
+ legend {font-weight:bold;font-size:1.2em;}
83
+ input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;}
84
+ input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;}
85
+ input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;}
86
+ input.text, input.title {width:300px;padding:5px;}
87
+ input.title {font-size:1.5em;}
88
+ textarea {width:390px;height:250px;padding:5px;}
89
+ input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;}
90
+ form.inline {line-height:3;}
91
+ form.inline p {margin-bottom:0;}
92
+ .error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;}
93
+ .error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;}
94
+ .notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
95
+ .success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
96
+ .error a {color:#8a1f11;}
97
+ .notice a {color:#514721;}
98
+ .success a {color:#264409;}
99
+ .box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;}
100
+ hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;}
101
+ hr.space {background:#fff;color:#fff;visibility:hidden;}
102
+ .clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;}
103
+ .clearfix, .container {display:block;}
104
+ .clear {clear:both;}
105
+ /*
106
+ github.com style (c) Vasily Polovnyov <vast@whiteants.net>
107
+ */
108
+
109
+
110
+ pre code {
111
+ }
112
+
113
+ pre .comment,
114
+ pre .template_comment,
115
+ pre .diff .header,
116
+ pre .javadoc {
117
+ color: #998;
118
+ font-style: italic
119
+ }
120
+
121
+ pre .keyword,
122
+ pre .css .rule .keyword,
123
+ pre .winutils,
124
+ pre .javascript .title,
125
+ pre .lisp .title {
126
+ color: #000;
127
+ font-weight: bold
128
+ }
129
+
130
+ pre .number,
131
+ pre .hexcolor {
132
+ color: #458
133
+ }
134
+
135
+
136
+ pre .string,
137
+ pre .tag .value,
138
+ pre .phpdoc,
139
+ pre .tex .formula {
140
+ color: #d14
141
+ }
142
+
143
+ pre .subst {
144
+ color: #712;
145
+ }
146
+
147
+ pre .constant,
148
+ pre .title,
149
+ pre .id {
150
+ color: #900;
151
+ font-weight: bold
152
+ }
153
+
154
+ pre .javascript .title,
155
+ pre .lisp .title,
156
+ pre .subst {
157
+ font-weight: normal
158
+ }
159
+
160
+ pre .class .title,
161
+ pre .haskell .label,
162
+ pre .tex .command {
163
+ color: #458;
164
+ font-weight: bold
165
+ }
166
+
167
+ pre .tag,
168
+ pre .tag .title,
169
+ pre .rules .property,
170
+ pre .django .tag .keyword {
171
+ color: #000080;
172
+ font-weight: normal
173
+ }
174
+
175
+ pre .attribute,
176
+ pre .variable,
177
+ pre .instancevar,
178
+ pre .lisp .body {
179
+ color: #008080
180
+ }
181
+
182
+ pre .regexp {
183
+ color: #009926
184
+ }
185
+
186
+ pre .class {
187
+ color: #458;
188
+ font-weight: bold
189
+ }
190
+
191
+ pre .symbol,
192
+ pre .ruby .symbol .string,
193
+ pre .ruby .symbol .keyword,
194
+ pre .ruby .symbol .keymethods,
195
+ pre .lisp .keyword,
196
+ pre .tex .special,
197
+ pre .input_number {
198
+ color: #990073
199
+ }
200
+
201
+ pre .builtin,
202
+ pre .built_in,
203
+ pre .lisp .title {
204
+ color: #0086b3
205
+ }
206
+
207
+ pre .preprocessor,
208
+ pre .pi,
209
+ pre .doctype,
210
+ pre .shebang,
211
+ pre .cdata {
212
+ color: #999;
213
+ font-weight: bold
214
+ }
215
+
216
+ pre .deletion {
217
+ background: #fdd
218
+ }
219
+
220
+ pre .addition {
221
+ background: #dfd
222
+ }
223
+
224
+ pre .diff .change {
225
+ background: #0086b3
226
+ }
227
+
228
+ pre .chunk {
229
+ color: #aaa
230
+ }
231
+
232
+ pre .tex .formula {
233
+ opacity: 0.5;
234
+ }
235
+ /*
236
+ * jQuery UI CSS Framework @VERSION
237
+ *
238
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
239
+ * Dual licensed under the MIT or GPL Version 2 licenses.
240
+ * http://jquery.org/license
241
+ *
242
+ * http://docs.jquery.com/UI/Theming/API
243
+ */
244
+
245
+ /* Layout helpers
246
+ ----------------------------------*/
247
+
248
+ .ui-helper-hidden { display: none; }
249
+ .ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
250
+ .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
251
+ .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
252
+ .ui-helper-clearfix { display: inline-block; }
253
+ /* required comment for clearfix to work in Opera \*/
254
+ * html .ui-helper-clearfix { height:1%; }
255
+ .ui-helper-clearfix { display:block; }
256
+ /* end clearfix */
257
+ .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
258
+
259
+
260
+ /* Interaction Cues
261
+ ----------------------------------*/
262
+ .ui-state-disabled { cursor: default !important; }
263
+
264
+
265
+ /* Icons
266
+ ----------------------------------*/
267
+
268
+ /* states and images */
269
+ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
270
+
271
+
272
+ /* Misc visuals
273
+ ----------------------------------*/
274
+
275
+ /* Overlays */
276
+ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
277
+
278
+
279
+ /*
280
+ * jQuery UI CSS Framework @VERSION
281
+ *
282
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
283
+ * Dual licensed under the MIT or GPL Version 2 licenses.
284
+ * http://jquery.org/license
285
+ *
286
+ * http://docs.jquery.com/UI/Theming/API
287
+ *
288
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
289
+ */
290
+
291
+
292
+ /* Component containers
293
+ ----------------------------------*/
294
+ .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
295
+ .ui-widget .ui-widget { font-size: 1em; }
296
+ .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
297
+ .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
298
+ .ui-widget-content a { color: #222222; }
299
+ .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
300
+ .ui-widget-header a { color: #222222; }
301
+
302
+ /* Interaction states
303
+ ----------------------------------*/
304
+ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
305
+ .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
306
+ .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
307
+ .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
308
+ .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
309
+ .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
310
+ .ui-widget :active { outline: none; }
311
+
312
+ /* Interaction Cues
313
+ ----------------------------------*/
314
+ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
315
+ .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
316
+ .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
317
+ .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
318
+ .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
319
+ .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
320
+ .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
321
+ .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
322
+
323
+ /* Icons
324
+ ----------------------------------*/
325
+
326
+ /* states and images */
327
+ .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
328
+ .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
329
+ .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
330
+ .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
331
+ .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
332
+ .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
333
+ .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
334
+ .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
335
+
336
+ /* positioning */
337
+ .ui-icon-carat-1-n { background-position: 0 0; }
338
+ .ui-icon-carat-1-ne { background-position: -16px 0; }
339
+ .ui-icon-carat-1-e { background-position: -32px 0; }
340
+ .ui-icon-carat-1-se { background-position: -48px 0; }
341
+ .ui-icon-carat-1-s { background-position: -64px 0; }
342
+ .ui-icon-carat-1-sw { background-position: -80px 0; }
343
+ .ui-icon-carat-1-w { background-position: -96px 0; }
344
+ .ui-icon-carat-1-nw { background-position: -112px 0; }
345
+ .ui-icon-carat-2-n-s { background-position: -128px 0; }
346
+ .ui-icon-carat-2-e-w { background-position: -144px 0; }
347
+ .ui-icon-triangle-1-n { background-position: 0 -16px; }
348
+ .ui-icon-triangle-1-ne { background-position: -16px -16px; }
349
+ .ui-icon-triangle-1-e { background-position: -32px -16px; }
350
+ .ui-icon-triangle-1-se { background-position: -48px -16px; }
351
+ .ui-icon-triangle-1-s { background-position: -64px -16px; }
352
+ .ui-icon-triangle-1-sw { background-position: -80px -16px; }
353
+ .ui-icon-triangle-1-w { background-position: -96px -16px; }
354
+ .ui-icon-triangle-1-nw { background-position: -112px -16px; }
355
+ .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
356
+ .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
357
+ .ui-icon-arrow-1-n { background-position: 0 -32px; }
358
+ .ui-icon-arrow-1-ne { background-position: -16px -32px; }
359
+ .ui-icon-arrow-1-e { background-position: -32px -32px; }
360
+ .ui-icon-arrow-1-se { background-position: -48px -32px; }
361
+ .ui-icon-arrow-1-s { background-position: -64px -32px; }
362
+ .ui-icon-arrow-1-sw { background-position: -80px -32px; }
363
+ .ui-icon-arrow-1-w { background-position: -96px -32px; }
364
+ .ui-icon-arrow-1-nw { background-position: -112px -32px; }
365
+ .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
366
+ .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
367
+ .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
368
+ .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
369
+ .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
370
+ .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
371
+ .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
372
+ .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
373
+ .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
374
+ .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
375
+ .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
376
+ .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
377
+ .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
378
+ .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
379
+ .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
380
+ .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
381
+ .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
382
+ .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
383
+ .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
384
+ .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
385
+ .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
386
+ .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
387
+ .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
388
+ .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
389
+ .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
390
+ .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
391
+ .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
392
+ .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
393
+ .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
394
+ .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
395
+ .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
396
+ .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
397
+ .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
398
+ .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
399
+ .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
400
+ .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
401
+ .ui-icon-arrow-4 { background-position: 0 -80px; }
402
+ .ui-icon-arrow-4-diag { background-position: -16px -80px; }
403
+ .ui-icon-extlink { background-position: -32px -80px; }
404
+ .ui-icon-newwin { background-position: -48px -80px; }
405
+ .ui-icon-refresh { background-position: -64px -80px; }
406
+ .ui-icon-shuffle { background-position: -80px -80px; }
407
+ .ui-icon-transfer-e-w { background-position: -96px -80px; }
408
+ .ui-icon-transferthick-e-w { background-position: -112px -80px; }
409
+ .ui-icon-folder-collapsed { background-position: 0 -96px; }
410
+ .ui-icon-folder-open { background-position: -16px -96px; }
411
+ .ui-icon-document { background-position: -32px -96px; }
412
+ .ui-icon-document-b { background-position: -48px -96px; }
413
+ .ui-icon-note { background-position: -64px -96px; }
414
+ .ui-icon-mail-closed { background-position: -80px -96px; }
415
+ .ui-icon-mail-open { background-position: -96px -96px; }
416
+ .ui-icon-suitcase { background-position: -112px -96px; }
417
+ .ui-icon-comment { background-position: -128px -96px; }
418
+ .ui-icon-person { background-position: -144px -96px; }
419
+ .ui-icon-print { background-position: -160px -96px; }
420
+ .ui-icon-trash { background-position: -176px -96px; }
421
+ .ui-icon-locked { background-position: -192px -96px; }
422
+ .ui-icon-unlocked { background-position: -208px -96px; }
423
+ .ui-icon-bookmark { background-position: -224px -96px; }
424
+ .ui-icon-tag { background-position: -240px -96px; }
425
+ .ui-icon-home { background-position: 0 -112px; }
426
+ .ui-icon-flag { background-position: -16px -112px; }
427
+ .ui-icon-calendar { background-position: -32px -112px; }
428
+ .ui-icon-cart { background-position: -48px -112px; }
429
+ .ui-icon-pencil { background-position: -64px -112px; }
430
+ .ui-icon-clock { background-position: -80px -112px; }
431
+ .ui-icon-disk { background-position: -96px -112px; }
432
+ .ui-icon-calculator { background-position: -112px -112px; }
433
+ .ui-icon-zoomin { background-position: -128px -112px; }
434
+ .ui-icon-zoomout { background-position: -144px -112px; }
435
+ .ui-icon-search { background-position: -160px -112px; }
436
+ .ui-icon-wrench { background-position: -176px -112px; }
437
+ .ui-icon-gear { background-position: -192px -112px; }
438
+ .ui-icon-heart { background-position: -208px -112px; }
439
+ .ui-icon-star { background-position: -224px -112px; }
440
+ .ui-icon-link { background-position: -240px -112px; }
441
+ .ui-icon-cancel { background-position: 0 -128px; }
442
+ .ui-icon-plus { background-position: -16px -128px; }
443
+ .ui-icon-plusthick { background-position: -32px -128px; }
444
+ .ui-icon-minus { background-position: -48px -128px; }
445
+ .ui-icon-minusthick { background-position: -64px -128px; }
446
+ .ui-icon-close { background-position: -80px -128px; }
447
+ .ui-icon-closethick { background-position: -96px -128px; }
448
+ .ui-icon-key { background-position: -112px -128px; }
449
+ .ui-icon-lightbulb { background-position: -128px -128px; }
450
+ .ui-icon-scissors { background-position: -144px -128px; }
451
+ .ui-icon-clipboard { background-position: -160px -128px; }
452
+ .ui-icon-copy { background-position: -176px -128px; }
453
+ .ui-icon-contact { background-position: -192px -128px; }
454
+ .ui-icon-image { background-position: -208px -128px; }
455
+ .ui-icon-video { background-position: -224px -128px; }
456
+ .ui-icon-script { background-position: -240px -128px; }
457
+ .ui-icon-alert { background-position: 0 -144px; }
458
+ .ui-icon-info { background-position: -16px -144px; }
459
+ .ui-icon-notice { background-position: -32px -144px; }
460
+ .ui-icon-help { background-position: -48px -144px; }
461
+ .ui-icon-check { background-position: -64px -144px; }
462
+ .ui-icon-bullet { background-position: -80px -144px; }
463
+ .ui-icon-radio-off { background-position: -96px -144px; }
464
+ .ui-icon-radio-on { background-position: -112px -144px; }
465
+ .ui-icon-pin-w { background-position: -128px -144px; }
466
+ .ui-icon-pin-s { background-position: -144px -144px; }
467
+ .ui-icon-play { background-position: 0 -160px; }
468
+ .ui-icon-pause { background-position: -16px -160px; }
469
+ .ui-icon-seek-next { background-position: -32px -160px; }
470
+ .ui-icon-seek-prev { background-position: -48px -160px; }
471
+ .ui-icon-seek-end { background-position: -64px -160px; }
472
+ .ui-icon-seek-start { background-position: -80px -160px; }
473
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
474
+ .ui-icon-seek-first { background-position: -80px -160px; }
475
+ .ui-icon-stop { background-position: -96px -160px; }
476
+ .ui-icon-eject { background-position: -112px -160px; }
477
+ .ui-icon-volume-off { background-position: -128px -160px; }
478
+ .ui-icon-volume-on { background-position: -144px -160px; }
479
+ .ui-icon-power { background-position: 0 -176px; }
480
+ .ui-icon-signal-diag { background-position: -16px -176px; }
481
+ .ui-icon-signal { background-position: -32px -176px; }
482
+ .ui-icon-battery-0 { background-position: -48px -176px; }
483
+ .ui-icon-battery-1 { background-position: -64px -176px; }
484
+ .ui-icon-battery-2 { background-position: -80px -176px; }
485
+ .ui-icon-battery-3 { background-position: -96px -176px; }
486
+ .ui-icon-circle-plus { background-position: 0 -192px; }
487
+ .ui-icon-circle-minus { background-position: -16px -192px; }
488
+ .ui-icon-circle-close { background-position: -32px -192px; }
489
+ .ui-icon-circle-triangle-e { background-position: -48px -192px; }
490
+ .ui-icon-circle-triangle-s { background-position: -64px -192px; }
491
+ .ui-icon-circle-triangle-w { background-position: -80px -192px; }
492
+ .ui-icon-circle-triangle-n { background-position: -96px -192px; }
493
+ .ui-icon-circle-arrow-e { background-position: -112px -192px; }
494
+ .ui-icon-circle-arrow-s { background-position: -128px -192px; }
495
+ .ui-icon-circle-arrow-w { background-position: -144px -192px; }
496
+ .ui-icon-circle-arrow-n { background-position: -160px -192px; }
497
+ .ui-icon-circle-zoomin { background-position: -176px -192px; }
498
+ .ui-icon-circle-zoomout { background-position: -192px -192px; }
499
+ .ui-icon-circle-check { background-position: -208px -192px; }
500
+ .ui-icon-circlesmall-plus { background-position: 0 -208px; }
501
+ .ui-icon-circlesmall-minus { background-position: -16px -208px; }
502
+ .ui-icon-circlesmall-close { background-position: -32px -208px; }
503
+ .ui-icon-squaresmall-plus { background-position: -48px -208px; }
504
+ .ui-icon-squaresmall-minus { background-position: -64px -208px; }
505
+ .ui-icon-squaresmall-close { background-position: -80px -208px; }
506
+ .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
507
+ .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
508
+ .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
509
+ .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
510
+ .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
511
+ .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
512
+
513
+
514
+ /* Misc visuals
515
+ ----------------------------------*/
516
+
517
+ /* Corner radius */
518
+ .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
519
+ .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
520
+ .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
521
+ .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
522
+ .ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
523
+ .ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
524
+ .ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
525
+ .ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
526
+ .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
527
+
528
+ /* Overlays */
529
+ .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
530
+ .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
531
+ /*
532
+ * FancyBox - jQuery Plugin
533
+ * Simple and fancy lightbox alternative
534
+ *
535
+ * Examples and documentation at: http://fancybox.net
536
+ *
537
+ * Copyright (c) 2008 - 2010 Janis Skarnelis
538
+ *
539
+ * Version: 1.3.1 (05/03/2010)
540
+ * Requires: jQuery v1.3+
541
+ *
542
+ * Dual licensed under the MIT and GPL licenses:
543
+ * http://www.opensource.org/licenses/mit-license.php
544
+ * http://www.gnu.org/licenses/gpl.html
545
+ */
546
+
547
+ #fancybox-loading {
548
+ position: fixed;
549
+ top: 50%;
550
+ left: 50%;
551
+ height: 40px;
552
+ width: 40px;
553
+ margin-top: -20px;
554
+ margin-left: -20px;
555
+ cursor: pointer;
556
+ overflow: hidden;
557
+ z-index: 1104;
558
+ display: none;
559
+ }
560
+
561
+ * html #fancybox-loading { /* IE6 */
562
+ position: absolute;
563
+ margin-top: 0;
564
+ }
565
+
566
+ #fancybox-loading div {
567
+ position: absolute;
568
+ top: 0;
569
+ left: 0;
570
+ width: 40px;
571
+ height: 480px;
572
+ background-image: url('fancybox.png');
573
+ }
574
+
575
+ #fancybox-overlay {
576
+ position: fixed;
577
+ top: 0;
578
+ left: 0;
579
+ bottom: 0;
580
+ right: 0;
581
+ background: #000;
582
+ z-index: 1100;
583
+ display: none;
584
+ }
585
+
586
+ * html #fancybox-overlay { /* IE6 */
587
+ position: absolute;
588
+ width: 100%;
589
+ }
590
+
591
+ #fancybox-tmp {
592
+ padding: 0;
593
+ margin: 0;
594
+ border: 0;
595
+ overflow: auto;
596
+ display: none;
597
+ }
598
+
599
+ #fancybox-wrap {
600
+ position: absolute;
601
+ top: 0;
602
+ left: 0;
603
+ margin: 0;
604
+ padding: 20px;
605
+ z-index: 1101;
606
+ display: none;
607
+ }
608
+
609
+ #fancybox-outer {
610
+ position: relative;
611
+ width: 100%;
612
+ height: 100%;
613
+ background: #FFF;
614
+ }
615
+
616
+ #fancybox-inner {
617
+ position: absolute;
618
+ top: 0;
619
+ left: 0;
620
+ width: 1px;
621
+ height: 1px;
622
+ padding: 0;
623
+ margin: 0;
624
+ outline: none;
625
+ overflow: hidden;
626
+ }
627
+
628
+ #fancybox-hide-sel-frame {
629
+ position: absolute;
630
+ top: 0;
631
+ left: 0;
632
+ width: 100%;
633
+ height: 100%;
634
+ background: transparent;
635
+ }
636
+
637
+ #fancybox-close {
638
+ position: absolute;
639
+ top: -15px;
640
+ right: -15px;
641
+ width: 30px;
642
+ height: 30px;
643
+ background-image: url('fancybox.png');
644
+ background-position: -40px 0px;
645
+ cursor: pointer;
646
+ z-index: 1103;
647
+ display: none;
648
+ }
649
+
650
+ #fancybox_error {
651
+ color: #444;
652
+ font: normal 12px/20px Arial;
653
+ padding: 7px;
654
+ margin: 0;
655
+ }
656
+
657
+ #fancybox-content {
658
+ height: auto;
659
+ width: auto;
660
+ padding: 0;
661
+ margin: 0;
662
+ }
663
+
664
+ #fancybox-img {
665
+ width: 100%;
666
+ height: 100%;
667
+ padding: 0;
668
+ margin: 0;
669
+ border: none;
670
+ outline: none;
671
+ line-height: 0;
672
+ vertical-align: top;
673
+ -ms-interpolation-mode: bicubic;
674
+ }
675
+
676
+ #fancybox-frame {
677
+ position: relative;
678
+ width: 100%;
679
+ height: 100%;
680
+ border: none;
681
+ display: block;
682
+ }
683
+
684
+ #fancybox-title {
685
+ position: absolute;
686
+ bottom: 0;
687
+ left: 0;
688
+ font-family: Arial;
689
+ font-size: 12px;
690
+ z-index: 1102;
691
+ }
692
+
693
+ .fancybox-title-inside {
694
+ padding: 10px 0;
695
+ text-align: center;
696
+ color: #333;
697
+ }
698
+
699
+ .fancybox-title-outside {
700
+ padding-top: 5px;
701
+ color: #FFF;
702
+ text-align: center;
703
+ font-weight: bold;
704
+ }
705
+
706
+ .fancybox-title-over {
707
+ color: #FFF;
708
+ text-align: left;
709
+ }
710
+
711
+ #fancybox-title-over {
712
+ padding: 10px;
713
+ background-image: url('fancy_title_over.png');
714
+ display: block;
715
+ }
716
+
717
+ #fancybox-title-wrap {
718
+ display: inline-block;
719
+ }
720
+
721
+ #fancybox-title-wrap span {
722
+ height: 32px;
723
+ float: left;
724
+ }
725
+
726
+ #fancybox-title-left {
727
+ padding-left: 15px;
728
+ background-image: url('fancybox.png');
729
+ background-position: -40px -90px;
730
+ background-repeat: no-repeat;
731
+ }
732
+
733
+ #fancybox-title-main {
734
+ font-weight: bold;
735
+ line-height: 29px;
736
+ background-image: url('fancybox-x.png');
737
+ background-position: 0px -40px;
738
+ color: #FFF;
739
+ }
740
+
741
+ #fancybox-title-right {
742
+ padding-left: 15px;
743
+ background-image: url('fancybox.png');
744
+ background-position: -55px -90px;
745
+ background-repeat: no-repeat;
746
+ }
747
+
748
+ #fancybox-left, #fancybox-right {
749
+ position: absolute;
750
+ bottom: 0px;
751
+ height: 100%;
752
+ width: 35%;
753
+ cursor: pointer;
754
+ outline: none;
755
+ background-image: url('blank.gif');
756
+ z-index: 1102;
757
+ display: none;
758
+ }
759
+
760
+ #fancybox-left {
761
+ left: 0px;
762
+ }
763
+
764
+ #fancybox-right {
765
+ right: 0px;
766
+ }
767
+
768
+ #fancybox-left-ico, #fancybox-right-ico {
769
+ position: absolute;
770
+ top: 50%;
771
+ left: -9999px;
772
+ width: 30px;
773
+ height: 30px;
774
+ margin-top: -15px;
775
+ cursor: pointer;
776
+ z-index: 1102;
777
+ display: block;
778
+ }
779
+
780
+ #fancybox-left-ico {
781
+ background-image: url('fancybox.png');
782
+ background-position: -40px -30px;
783
+ }
784
+
785
+ #fancybox-right-ico {
786
+ background-image: url('fancybox.png');
787
+ background-position: -40px -60px;
788
+ }
789
+
790
+ #fancybox-left:hover, #fancybox-right:hover {
791
+ visibility: visible; /* IE6 */
792
+ }
793
+
794
+ #fancybox-left:hover span {
795
+ left: 20px;
796
+ }
797
+
798
+ #fancybox-right:hover span {
799
+ left: auto;
800
+ right: 20px;
801
+ }
802
+
803
+ .fancy-bg {
804
+ position: absolute;
805
+ padding: 0;
806
+ margin: 0;
807
+ border: 0;
808
+ width: 20px;
809
+ height: 20px;
810
+ z-index: 1001;
811
+ }
812
+
813
+ #fancy-bg-n {
814
+ top: -20px;
815
+ left: 0;
816
+ width: 100%;
817
+ background-image: url('fancybox-x.png');
818
+ }
819
+
820
+ #fancy-bg-ne {
821
+ top: -20px;
822
+ right: -20px;
823
+ background-image: url('fancybox.png');
824
+ background-position: -40px -162px;
825
+ }
826
+
827
+ #fancy-bg-e {
828
+ top: 0;
829
+ right: -20px;
830
+ height: 100%;
831
+ background-image: url('fancybox-y.png');
832
+ background-position: -20px 0px;
833
+ }
834
+
835
+ #fancy-bg-se {
836
+ bottom: -20px;
837
+ right: -20px;
838
+ background-image: url('fancybox.png');
839
+ background-position: -40px -182px;
840
+ }
841
+
842
+ #fancy-bg-s {
843
+ bottom: -20px;
844
+ left: 0;
845
+ width: 100%;
846
+ background-image: url('fancybox-x.png');
847
+ background-position: 0px -20px;
848
+ }
849
+
850
+ #fancy-bg-sw {
851
+ bottom: -20px;
852
+ left: -20px;
853
+ background-image: url('fancybox.png');
854
+ background-position: -40px -142px;
855
+ }
856
+
857
+ #fancy-bg-w {
858
+ top: 0;
859
+ left: -20px;
860
+ height: 100%;
861
+ background-image: url('fancybox-y.png');
862
+ }
863
+
864
+ #fancy-bg-nw {
865
+ top: -20px;
866
+ left: -20px;
867
+ background-image: url('fancybox.png');
868
+ background-position: -40px -122px;
869
+ }
870
+
871
+ /* IE */
872
+
873
+ #fancybox-loading.fancybox-ie div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_loading.png', sizingMethod='scale'); }
874
+ .fancybox-ie #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_close.png', sizingMethod='scale'); }
875
+
876
+ .fancybox-ie #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; }
877
+ .fancybox-ie #fancybox-title-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_left.png', sizingMethod='scale'); }
878
+ .fancybox-ie #fancybox-title-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_main.png', sizingMethod='scale'); }
879
+ .fancybox-ie #fancybox-title-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_right.png', sizingMethod='scale'); }
880
+
881
+ .fancybox-ie #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_left.png', sizingMethod='scale'); }
882
+ .fancybox-ie #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_right.png', sizingMethod='scale'); }
883
+
884
+ .fancybox-ie .fancy-bg { background: transparent !important; }
885
+
886
+ .fancybox-ie #fancy-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_n.png', sizingMethod='scale'); }
887
+ .fancybox-ie #fancy-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_ne.png', sizingMethod='scale'); }
888
+ .fancybox-ie #fancy-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_e.png', sizingMethod='scale'); }
889
+ .fancybox-ie #fancy-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_se.png', sizingMethod='scale'); }
890
+ .fancybox-ie #fancy-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_s.png', sizingMethod='scale'); }
891
+ .fancybox-ie #fancy-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_sw.png', sizingMethod='scale'); }
892
+ .fancybox-ie #fancy-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_w.png', sizingMethod='scale'); }
893
+ .fancybox-ie #fancy-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_nw.png', sizingMethod='scale'); }
894
+ #loading {
895
+ position: fixed;
896
+ left: 40%;
897
+ top: 50%; }
898
+
899
+ a {
900
+ color: #333333;
901
+ text-decoration: none; }
902
+ a:hover {
903
+ color: black;
904
+ text-decoration: underline; }
905
+
906
+ body {
907
+ font-family: "Lucida Grande", Helvetica, "Helvetica Neue", Arial, sans-serif;
908
+ padding: 12px;
909
+ background-color: #333333; }
910
+
911
+ h1, h2, h3, h4 {
912
+ color: #1c2324;
913
+ margin: 0;
914
+ padding: 0;
915
+ margin-bottom: 12px; }
916
+
917
+ table {
918
+ width: 100%; }
919
+
920
+ #content {
921
+ clear: left;
922
+ background-color: white;
923
+ border: 2px solid #dddddd;
924
+ border-top: 8px solid #dddddd;
925
+ padding: 18px;
926
+ -webkit-border-bottom-left-radius: 5px;
927
+ -webkit-border-bottom-right-radius: 5px;
928
+ -webkit-border-top-right-radius: 5px;
929
+ -moz-border-radius-bottomleft: 5px;
930
+ -moz-border-radius-bottomright: 5px;
931
+ -moz-border-radius-topright: 5px;
932
+ border-bottom-left-radius: 5px;
933
+ border-bottom-right-radius: 5px;
934
+ border-top-right-radius: 5px; }
935
+
936
+ .dataTables_filter, .dataTables_info {
937
+ padding: 2px 6px; }
938
+
939
+ abbr.timeago {
940
+ text-decoration: none;
941
+ border: none;
942
+ font-weight: bold; }
943
+
944
+ .timestamp {
945
+ float: right;
946
+ color: #dddddd; }
947
+
948
+ .group_tabs {
949
+ list-style: none;
950
+ float: left;
951
+ margin: 0;
952
+ padding: 0; }
953
+ .group_tabs li {
954
+ display: inline;
955
+ float: left; }
956
+ .group_tabs li a {
957
+ font-family: Helvetica, Arial, sans-serif;
958
+ display: block;
959
+ float: left;
960
+ text-decoration: none;
961
+ padding: 4px 8px;
962
+ background-color: #aaaaaa;
963
+ background: -webkit-gradient(linear, 0 0, 0 bottom, from(#dddddd), to(#aaaaaa));
964
+ background: -moz-linear-gradient(#dddddd, #aaaaaa);
965
+ background: linear-gradient(#dddddd, #aaaaaa);
966
+ text-shadow: #e5e5e5 1px 1px 0px;
967
+ border-bottom: none;
968
+ color: #333333;
969
+ font-weight: bold;
970
+ margin-right: 8px;
971
+ border-top: 1px solid #efefef;
972
+ -webkit-border-top-left-radius: 2px;
973
+ -webkit-border-top-right-radius: 2px;
974
+ -moz-border-radius-topleft: 2px;
975
+ -moz-border-radius-topright: 2px;
976
+ border-top-left-radius: 2px;
977
+ border-top-right-radius: 2px; }
978
+ .group_tabs li a:hover {
979
+ background-color: #cccccc;
980
+ background: -webkit-gradient(linear, 0 0, 0 bottom, from(#eeeeee), to(#aaaaaa));
981
+ background: -moz-linear-gradient(#eeeeee, #aaaaaa);
982
+ background: linear-gradient(#eeeeee, #aaaaaa); }
983
+ .group_tabs li a:active {
984
+ padding-top: 5px;
985
+ padding-bottom: 3px; }
986
+ .group_tabs li.active a {
987
+ color: black;
988
+ text-shadow: white 1px 1px 0px;
989
+ background-color: #dddddd;
990
+ background: -webkit-gradient(linear, 0 0, 0 bottom, from(white), to(#dddddd));
991
+ background: -moz-linear-gradient(white, #dddddd);
992
+ background: linear-gradient(white, #dddddd); }
993
+
994
+ .file_list {
995
+ margin-bottom: 18px; }
996
+
997
+ a.src_link {
998
+ background: url("./magnify.png") no-repeat left 50%;
999
+ padding-left: 18px; }
1000
+
1001
+ tr, td {
1002
+ margin: 0;
1003
+ padding: 0; }
1004
+
1005
+ th {
1006
+ white-space: nowrap; }
1007
+ th.ui-state-default {
1008
+ cursor: pointer; }
1009
+ th span.ui-icon {
1010
+ float: left; }
1011
+
1012
+ td {
1013
+ padding: 4px 8px; }
1014
+ td.strong {
1015
+ font-weight: bold; }
1016
+
1017
+ .source_table h3, .source_table h4 {
1018
+ padding: 0;
1019
+ margin: 0;
1020
+ margin-bottom: 4px; }
1021
+ .source_table .header {
1022
+ padding: 10px; }
1023
+ .source_table pre {
1024
+ margin: 0;
1025
+ padding: 0;
1026
+ white-space: normal;
1027
+ color: black;
1028
+ font-family: "Monaco", "Inconsolata", "Consolas", monospace; }
1029
+ .source_table code {
1030
+ color: black;
1031
+ font-family: "Monaco", "Inconsolata", "Consolas", monospace; }
1032
+ .source_table pre {
1033
+ background-color: #333333; }
1034
+ .source_table pre ol {
1035
+ margin: 0px;
1036
+ padding: 0px;
1037
+ margin-left: 45px;
1038
+ font-size: 12px;
1039
+ color: white; }
1040
+ .source_table pre li {
1041
+ margin: 0px;
1042
+ padding: 2px 6px;
1043
+ border-left: 5px solid white; }
1044
+ .source_table pre li code {
1045
+ white-space: pre;
1046
+ white-space: pre-wrap; }
1047
+ .source_table pre .hits {
1048
+ float: right;
1049
+ margin-left: 10px;
1050
+ padding: 2px 4px;
1051
+ background-color: #444444;
1052
+ background: -webkit-gradient(linear, 0 0, 0 bottom, from(#222222), to(#666666));
1053
+ background: -moz-linear-gradient(#222222, #666666);
1054
+ background: linear-gradient(#222222, #666666);
1055
+ color: white;
1056
+ font-family: Helvetica, "Helvetica Neue", Arial, sans-serif;
1057
+ font-size: 10px;
1058
+ font-weight: bold;
1059
+ text-align: center;
1060
+ border-radius: 6px; }
1061
+
1062
+ #footer {
1063
+ color: #dddddd;
1064
+ font-size: 12px;
1065
+ font-weight: bold;
1066
+ margin-top: 12px;
1067
+ text-align: right; }
1068
+ #footer a {
1069
+ color: #eeeeee;
1070
+ text-decoration: underline; }
1071
+ #footer a:hover {
1072
+ color: white;
1073
+ text-decoration: none; }
1074
+
1075
+ .green {
1076
+ color: #009900; }
1077
+
1078
+ .red {
1079
+ color: #990000; }
1080
+
1081
+ .yellow {
1082
+ color: #ddaa00; }
1083
+
1084
+ .source_table .covered {
1085
+ border-color: #009900; }
1086
+ .source_table .missed {
1087
+ border-color: #990000; }
1088
+ .source_table .never {
1089
+ border-color: black; }
1090
+ .source_table .skipped {
1091
+ border-color: #ffcc00; }
1092
+ .source_table .covered:nth-child(odd) {
1093
+ background-color: #cdf2cd; }
1094
+ .source_table .covered:nth-child(even) {
1095
+ background-color: #dbf2db; }
1096
+ .source_table .missed:nth-child(odd) {
1097
+ background-color: #f7c0c0; }
1098
+ .source_table .missed:nth-child(even) {
1099
+ background-color: #f7cfcf; }
1100
+ .source_table .never:nth-child(odd) {
1101
+ background-color: #efefef; }
1102
+ .source_table .never:nth-child(even) {
1103
+ background-color: #f4f4f4; }
1104
+ .source_table .skipped:nth-child(odd) {
1105
+ background-color: #fbf0c0; }
1106
+ .source_table .skipped:nth-child(even) {
1107
+ background-color: #fbffcf; }
1108
+
1109
+
1110
+