index.html 24.5 KB
Newer Older
1
<!DOCTYPE html>
Nathan Weber's avatar
Nathan Weber committed
2
<html ng-app="DashPlayer" lang="en">
nweber's avatar
nweber committed
3 4 5 6
<head>
    <meta charset="utf-8"/>
    <title>Dash JavaScript Player</title>
    <meta name="description" content="" />
7
    <link rel="icon" type="image/png" href="http://dashpg.com/w/2012/09/dashif.ico" />
Nathan Weber's avatar
Nathan Weber committed
8
    <meta name="viewport" content="width=device-width, height=device-height, user-scalable=no">
nweber's avatar
nweber committed
9

Nathan Weber's avatar
Nathan Weber committed
10 11 12 13
    <link rel="stylesheet" href="app/lib/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" href="app/lib/bootstrap/css/bootstrap-glyphicons.css">
    <link rel="stylesheet" href="app/lib/angular.treeview/css/angular.treeview.css">
    <link rel="stylesheet" href="app/css/main.css">
14

15
    <!-- http://jquery.com/ -->
Nathan Weber's avatar
Nathan Weber committed
16
    <script src="app/lib/jquery/jquery-1.10.2.min.js"></script>
17

Nathan Weber's avatar
Nathan Weber committed
18 19 20
    <!-- http://angularjs.org/ -->
    <script src="app/lib/angular/angular.min.js"></script>
    <script src="app/lib/angular/angular-resource.min.js"></script>
nweber's avatar
nweber committed
21

Nathan Weber's avatar
Nathan Weber committed
22 23
    <!-- http://getbootstrap.com/ -->
    <script src="app/lib/bootstrap/js/bootstrap.min.js"></script>
24 25 26 27 28 29 30

    <!-- https://github.com/kriskowal/q -->
    <script src="app/lib/q.js"></script>

    <!-- https://github.com/creynders/dijon-framework -->
    <script src="app/lib/dijon.js"></script>

31 32 33
    <!-- http://bannister.us/weblog/2007/06/09/simple-base64-encodedecode-javascript/ -->
    <script src="app/lib/base64.js"></script>

34 35 36 37 38 39
    <!-- Misc Libs -->
    <script src="app/lib/xml2json.js"></script>
    <script src="app/lib/objectiron.js"></script>
    <script src="app/lib/long.js"></script>
    <script src="app/lib/Math.js"></script>

Nathan Weber's avatar
Nathan Weber committed
40 41 42 43 44 45
    <!-- http://www.flotcharts.org/ -->
    <script src="app/lib/flot/jquery.flot.js"></script>

    <!-- https://github.com/eu81273/angular.treeview -->
    <script src="app/lib/angular.treeview/angular.treeview.min.js"></script>

46 47 48
    <!-- https://rawgithub.com/Luegg/angularjs-scroll-glue/master/src/scrollglue.js -->
    <script src="app/lib/scrollglue.js"></script>

49 50 51 52 53
    <!-- Player -->
    <script src="app/js/streaming/MediaPlayer.js"></script>
    <script src="app/js/streaming/Context.js"></script>
    <script src="app/js/streaming/ErrorHandler.js"></script>
    <script src="app/js/streaming/Capabilities.js"></script>
54
    <script src="app/js/streaming/EventBus.js"></script>
55
    <script src="app/js/streaming/Debug.js"></script>
56
    <script src="app/js/streaming/TokenAuthentication.js"></script>
57 58 59 60 61 62 63 64 65 66 67 68
    <script src="app/js/streaming/VideoModel.js"></script>
    <script src="app/js/streaming/vo/SegmentRequest.js"></script>
    <script src="app/js/streaming/ManifestLoader.js"></script>
    <script src="app/js/streaming/ManifestUpdater.js"></script>
    <script src="app/js/streaming/ManifestModel.js"></script>
    <script src="app/js/streaming/MediaSourceExtensions.js"></script>
    <script src="app/js/streaming/SourceBufferExtensions.js"></script>
    <script src="app/js/streaming/VideoModelExtensions.js"></script>
    <script src="app/js/streaming/BufferExtensions.js"></script>
    <script src="app/js/streaming/FragmentController.js"></script>
    <script src="app/js/streaming/AbrController.js"></script>
    <script src="app/js/streaming/FragmentLoader.js"></script>
69
    <script src="app/js/streaming/FragmentModel.js"></script>
Kirk Shoop's avatar
Kirk Shoop committed
70
    <script src="app/js/streaming/StreamController.js"></script>
71 72 73
    <script src="app/js/streaming/RequestScheduler.js"></script>
    <script src="app/js/streaming/SchedulerExtensions.js"></script>
    <script src="app/js/streaming/SchedulerModel.js"></script>
74 75
    <script src="app/js/streaming/Stream.js"></script>
    <script src="app/js/streaming/BufferController.js"></script>
76 77 78
    <script src="app/js/streaming/ProtectionModel.js"></script>
    <script src="app/js/streaming/ProtectionController.js"></script>
    <script src="app/js/streaming/ProtectionExtensions.js"></script>
79 80 81 82 83
    <script src="app/js/streaming/rules/SwitchRequest.js"></script>
    <script src="app/js/streaming/rules/DownloadRatioRule.js"></script>
    <script src="app/js/streaming/rules/InsufficientBufferRule.js"></script>
    <script src="app/js/streaming/rules/LimitSwitchesRule.js"></script>
    <script src="app/js/streaming/rules/BaseRulesCollection.js"></script>
84
    <script src="app/js/streaming/EventController.js"></script>
85

86 87
    <!--Captioning-->
    <script src="app/js/streaming/captioning/VTTParser.js"></script>
kozhinm's avatar
kozhinm committed
88
    <script src="app/js/streaming/captioning/TTMLParser.js"></script>
89
    <script src="app/js/streaming/captioning/TextTrackExtensions.js"></script>
kozhinm's avatar
kozhinm committed
90
    <script src="app/js/streaming/captioning/TextSourceBuffer.js"></script>
91
    <script src="app/js/streaming/captioning/TextController.js"></script>
92 93 94 95 96 97 98 99 100 101 102 103 104 105

    <!-- Metrics -->
    <script src="app/js/streaming/vo/MetricsList.js"></script>
    <script src="app/js/streaming/MetricsModel.js"></script>
    <script src="app/js/streaming/vo/metrics/BufferLevel.js"></script>
    <script src="app/js/streaming/vo/metrics/HTTPRequest.js"></script>
    <script src="app/js/streaming/vo/metrics/PlayList.js"></script>
    <script src="app/js/streaming/vo/metrics/RepresentationSwitch.js"></script>
    <script src="app/js/streaming/vo/metrics/TCPConnection.js"></script>
    <script src="app/js/streaming/vo/metrics/DroppedFrames.js"></script>

    <!-- Dash -->
    <script src="app/js/dash/Dash.js"></script>
    <script src="app/js/dash/DashContext.js"></script>
106 107 108 109
    <script src="app/js/dash/vo/Mpd.js"></script>
    <script src="app/js/dash/vo/Period.js"></script>
    <script src="app/js/dash/vo/AdaptationSet.js"></script>
    <script src="app/js/dash/vo/Representation.js"></script>
110
    <script src="app/js/dash/vo/Segment.js"></script>
111 112
    <script src="app/js/dash/vo/Event.js"></script>
    <script src="app/js/dash/vo/EventStream.js"></script>
113 114 115 116 117 118
    <script src="app/js/dash/DashParser.js"></script>
    <script src="app/js/dash/DashHandler.js"></script>
    <script src="app/js/dash/BaseURLExtensions.js"></script>
    <script src="app/js/dash/FragmentExtensions.js"></script>
    <script src="app/js/dash/DashManifestExtensions.js"></script>
    <script src="app/js/dash/DashMetricsExtensions.js"></script>
119
    <script src="app/js/dash/TimelineConverter.js"></script>
120 121

    <!-- App -->
Nathan Weber's avatar
Nathan Weber committed
122
    <script src="app/metrics.js"></script>
123
    <script src="app/main.js"></script>
nweber's avatar
nweber committed
124
</head>
Nathan Weber's avatar
Nathan Weber committed
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
<body ng-controller="DashController">
    <div class="modal fade" id="streamModal">
        <div class="modal-dialog">
            <div class="list-group modal-list">
                <a
                   ng-repeat="item in availableStreams"
                   href="#"
                   class="list-group-item"
                   ng-click="setStream(item)"
                   data-dismiss="modal"
                   ng-show="isStreamAvailable(item.browsers)">
                    {{item.name}}
                </a>
            </div>
        </div>
    </div>
Nathan Weber's avatar
Nathan Weber committed
141

142
    <div class="container">
nweber's avatar
nweber committed
143
        <div class="row title-header">
nweber's avatar
nweber committed
144
            <a href="http://dashif.org/" target="_blank"><img class="image" src="app/img/if.png"/></a>
Nathan Weber's avatar
Nathan Weber committed
145 146
            <span id="big-title">Reference Client</span>
            <span>{{version}}</span>
147 148 149 150 151 152 153 154 155 156

            <div class="github">
                <iframe
                    id="star-button"
                    src="http://ghbtns.com/github-btn.html?user=Dash-Industry-Forum&repo=dash.js&type=watch&count=true&size=large"
                    height="30"
                    width="170"
                    frameborder="0"
                    scrolling="0"
                    allowTransparency="true"
157
                    class="hidden-xs github-button">
158 159 160 161 162 163 164 165
                </iframe>
                <iframe
                    id="fork-button"
                    src="http://ghbtns.com/github-btn.html?user=Dash-Industry-Forum&repo=dash.js&type=fork&count=true&size=large"
                    height="30"
                    width="170"
                    frameborder="0"
                    scrolling="0"
166
                    allowTransparency="true github-button">
167 168
                </iframe>
            </div>
nweber's avatar
nweber committed
169
        </div>
nweber's avatar
nweber committed
170

171
        <div class="row">
Nathan Weber's avatar
Nathan Weber committed
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
            <div class="input-group">
                <div id="desktop-streams" class="input-group-btn">
                    <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
                        Stream <span class="caret"></span>
                    </button>
                    <ul class="dropdown-menu">
                        <li
                            ng-repeat="item in availableStreams"
                            ng-click="setStream(item)"
                            ng-show="isStreamAvailable(item.browsers)">
                            <a>{{item.name}}</a>
                        </li>
                    </ul>
                </div>
                <div id="mobile-streams" class="input-group-btn">
                    <button type="button" class="btn btn-primary" data-toggle="modal" href="#streamModal">
                        Stream <span class="caret"></span>
                    </button>
                </div>
                <input type="text" class="form-control" placeholder="manifest" ng-model="selectedItem.url">
                <span class="input-group-btn">
                    <button class="btn btn-primary" type="button" ng-click="doLoad()">Load</button>
                </span>
195
            </div>
nweber's avatar
nweber committed
196
        </div>
nweber's avatar
nweber committed
197

nweber's avatar
nweber committed
198
        <div class="row">
Nathan Weber's avatar
Nathan Weber committed
199 200
            <div class="dash-video-player col-md-9">
                <video controls="true"></video>
201
            </div>
Nathan Weber's avatar
Nathan Weber committed
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
            <div class="col-md-3">
                <div class="panel">
                    <div class="panel-heading panel-top">
                        <span class="panel-title">ABR</span>
                        <div class="btn-group">
                            <button
                                type="button"
                                class="btn btn-default"
                                ng-class="{active:abrEnabled == false}"
                                ng-click="setAbrEnabled(false)">
                                <span>Off</span>
                            </button>
                            <button
                                type="button"
                                class="btn btn-default active"
                                ng-class="{active:abrEnabled == true}"
                                ng-click="setAbrEnabled(true)">
                                <span>On</span>
                            </button>
                        </div>
222
                    </div>
nweber's avatar
nweber committed
223
                </div>
Nathan Weber's avatar
Nathan Weber committed
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
                <div class="panel">
                    <div class="panel-heading panel-top">
                        <span class="panel-title">Video</span>
                        <div class="btn-group">
                            <button
                                type="button"
                                class="btn btn-default"
                                ng-click="abrDown('video')">
                                <span class="glyphicon glyphicon-minus"></span>
                            </button>
                            <button
                                type="button"
                                class="btn btn-default"
                                ng-click="abrUp('video')">
                                <span class="glyphicon glyphicon-plus"></span>
                            </button>
240 241
                        </div>
                    </div>
Nathan Weber's avatar
Nathan Weber committed
242 243 244 245
                    <div class="panel-body panel-stats">
                        <p class="text-warning">{{videoBitrate}} kbps</p>
                        <p class="text-primary">Rep Index: <span class="text-success">{{videoIndex}}</span><span class="text-warning">{{videoPendingIndex}}</span>/<span class="text-success">{{videoMaxIndex}}</span></p>
                        <p class="text-primary">Buffer Length: <span class="text-success">{{videoBufferLength}}</span></p>
nwebber's avatar
nwebber committed
246 247 248 249 250 251
                        <p class="text-primary">Latency: <span class="text-success">last {{videoRatioCount}} segments</span></p>
                        <p class="text-success" title="[low] < [average] < [high]">{{videoLatency}}</p>
                        <p class="text-primary">Download: <span class="text-success">last {{videoRatioCount}} segments</span></p>
                        <p class="text-success" title="[low] < [average] < [high]">{{videoDownload}}</p>
                        <p class="text-primary">Ratio: <span class="text-success">last {{videoRatioCount}} segments</span></p>
                        <p class="text-success" title="[low] < [average] < [high]">{{videoRatio}}</p>
252
                        <p class="text-primary">Dropped Frames: <span class="text-success">{{videoDroppedFrames}}</span></p>
nweber's avatar
nweber committed
253
                    </div>
254
                </div>
Nathan Weber's avatar
Nathan Weber committed
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
                <div class="panel">
                    <div class="panel-heading panel-top">
                        <span class="panel-title">Audio</span>
                        <div class="btn-group">
                            <button
                                type="button"
                                class="btn btn-default"
                                ng-click="abrDown('audio')">
                                <span class="glyphicon glyphicon-minus"></span>
                            </button>
                            <button
                                type="button"
                                class="btn btn-default"
                                ng-click="abrUp('audio')">
                                <span class="glyphicon glyphicon-plus"></span>
                            </button>
271 272
                        </div>
                    </div>
Nathan Weber's avatar
Nathan Weber committed
273 274 275 276
                    <div class="panel-body panel-stats">
                        <p class="text-warning">{{audioBitrate}} kbps</p>
                        <p class="text-primary">Rep Index: <span class="text-success">{{audioIndex}}</span><span class="text-warning">{{audioPendingIndex}}</span>/<span class="text-success">{{audioMaxIndex}}</span></p>
                        <p class="text-primary">Buffer Length: <span class="text-success">{{audioBufferLength}}</span></p>
nwebber's avatar
nwebber committed
277 278 279 280 281 282
                        <p class="text-primary">Latency: <span class="text-success">last {{audioLatencyCount}} segments</span></p>
                        <p class="text-success" title="[low] < [average] < [high]">{{audioLatency}}</p>
                        <p class="text-primary">Download: <span class="text-success">last {{audioDownloadCount}} segments</span></p>
                        <p class="text-success" title="[low] < [average] < [high]">{{audioDownload}}</p>
                        <p class="text-primary">Ratio: <span class="text-success">last {{audioRatioCount}} segments</span></p>
                        <p class="text-success" title="[low] < [average] < [high]">{{audioRatio}}</p>
283
                    </div>
nweber's avatar
nweber committed
284
                </div>
nweber's avatar
nweber committed
285
            </div>
nweber's avatar
nweber committed
286
        </div>
nweber's avatar
nweber committed
287

288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
        <div class="row">
            <div class="panel">
                <div class="panel-heading panel-top">
                    <span class="panel-title">Encrypted Media Extensions</span>
                    <div class="btn-group">
                        <button
                                type="button"
                                class="btn btn-default"
                                ng-class="{active:showEME == false}"
                                ng-click="setEMEDebug(false)">
                            Hide
                        </button>
                        <button
                                type="button"
                                class="btn btn-default"
                                ng-class="{active:showEME == true}"
                                ng-click="setEMEDebug(true)">
                            Show
                        </button>
                    </div>
                </div>
                <div ng-switch on="showEME">
310
                    <div scroll-glue id="emeDebug" class="panel-body panel-stats" ng-switch-when="true">
311 312 313 314 315
                        <span class="panel-title player-text">[J] = Javascript Player</span>
                        <span class="panel-title video-text">[V] = Video Element</span>
                        <span class="panel-title cdm-text">[C] = Content Decryption Module (CDM)</span>
                        <hr>
                        <p ng-repeat="debug_message in emeDebugData" class="{{debug_message.type}}">{{debug_message.message}}</p>
316 317 318 319 320
                    </div>
                </div>
            </div>
        </div>

Nathan Weber's avatar
Nathan Weber committed
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
        <div class="row">
            <div class="panel">
                <div class="panel-heading panel-top">
                    <span class="panel-title">Charts</span>
                    <div class="btn-group">
                        <button
                            type="button"
                            class="btn btn-default"
                            ng-class="{active:showCharts == false}"
                            ng-click="setCharts(false)">
                            Hide
                        </button>
                        <button
                            type="button"
                            class="btn btn-default"
                            ng-class="{active:showCharts == true}"
                            ng-click="setCharts(true)">
                            Show
                        </button>
                    </div>
                </div>
                <div ng-switch on="showCharts">
                    <div class="panel-body panel-stats" ng-switch-when="true">
                        <chart ng-model="bufferData"></chart>
nweber's avatar
nweber committed
345
                    </div>
346
                </div>
nweber's avatar
nweber committed
347
            </div>
nweber's avatar
nweber committed
348
        </div>
nweber's avatar
nweber committed
349

Nathan Weber's avatar
Nathan Weber committed
350 351 352 353
        <div class="row">
            <div class="panel">
                <div class="panel-heading panel-top">
                    <span class="panel-title">Debug</span>
nweber's avatar
0.2.1  
nweber committed
354
                    <div class="btn-group">
Nathan Weber's avatar
Nathan Weber committed
355 356 357 358 359 360 361 362 363 364 365 366 367 368
                        <button
                            type="button"
                            class="btn btn-default"
                            ng-class="{active:showDebug == false}"
                            ng-click="setDebug(false)">
                            Hide
                        </button>
                        <button
                            type="button"
                            class="btn btn-default"
                            ng-class="{active:showDebug == true}"
                            ng-click="setDebug(true)">
                            Show
                        </button>
369
                    </div>
370
                </div>
Nathan Weber's avatar
Nathan Weber committed
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
                <div ng-switch on="showDebug">
                    <div class="panel-body panel-stats" ng-switch-when="true">
                        <ul class="nav nav-tabs">
                            <li class="dropdown">
                                <a href="#" id="metricsDropdown" class="dropdown-toggle" data-toggle="dropdown">Metrics <b class="caret"></b></a>
                                <ul class="dropdown-menu" role="menu" aria-labelledby="metricsDropdown">
                                    <li><a href="#video-metrics" tabindex="-1" data-toggle="tab">Video</a></li>
                                    <li><a href="#audio-metrics" tabindex="-1" data-toggle="tab">Audio</a></li>
                                </ul>
                            </li>
                            <li><a href="#notes" data-toggle="tab">Release Notes</a></li>
                        </ul>
                        <div id="debugTabContent" class="tab-content">
                            <div class="tab-pane" id="video-metrics">
                                <button
                                    type="button"
                                    class="btn btn-default"
                                    ng-click="getVideoTreeMetrics()">
                                    Video - Update
                                </button>
                                <div
                                    class="tree"
                                    data-angular-treeview="true"
                                    data-tree-model="videoMetrics"
                                    data-node-label="text"
                                    data-node-children="items">
                                </div>
                            </div>
                            <div class="tab-pane" id="audio-metrics">
                                <button
                                    type="button"
                                    class="btn btn-default"
                                    ng-click="getAudioTreeMetrics()">
                                    Audio - Update
                                </button>
                                <div
                                    class="tree"
                                    data-angular-treeview="true"
                                    data-tree-model="audioMetrics"
                                    data-node-label="text"
                                    data-node-children="items">
                                </div>
                            </div>
                            <div class="tab-pane" id="notes">
                                <div ng-repeat="note in releaseNotes" class="note-box">
                                    <span><b>{{note.title}}</b></span><br/>
                                    <span ng-repeat="text in note.items">
                                        {{text}}<br/>
                                    </span>
                                </div>
                            </div>
                        </div>
423 424 425
                    </div>
                </div>
            </div>
nweber's avatar
nweber committed
426 427
        </div>
    </div>
nweber's avatar
nweber committed
428

Nathan Weber's avatar
Nathan Weber committed
429
    <div class="footer-area">
nweber's avatar
nweber committed
430 431
        <div class="container">
            <div class="row">
Nathan Weber's avatar
Nathan Weber committed
432 433 434
                <div class="compat-box col-md-5">
                    <h3>Compatibility Notes:</h3>
                    <ul class="list-group">
Nathan Weber's avatar
Nathan Weber committed
435 436
                        <li class="list-group-item"><a href="https://github.com/Dash-Industry-Forum/dash.js">This project can be forked on GitHub.</a></li>
                        <li class="list-group-item">Use your browser's JavaScript console to view detailed information about stream playback.</li>
Nathan Weber's avatar
Nathan Weber committed
437 438 439 440 441 442 443 444 445 446 447
                        <li class="list-group-item"><a href="baseline.html">See a base implementation here.</a></li>
                        <li class="list-group-item">A browser that supports MSE (Media Source Extensions) is required.</li>
                        <li class="list-group-item">As of 8/30/13, Desktop Chrome, Desktop Internet Explorer 11, and Mobile Chrome Beta for Android are the only browsers supported.</li>
                        <li class="list-group-item">Use the most up-to-date version of your browser for the best compatibility.</li>
                        <li class="list-group-item">Many of the streams in the dropdown box (with ?version=all) only work in the developer channel or Canary version of Chrome.</li>
                        <li class="list-group-item"><a href="index.html?version=stable">Stable Chrome Streams</a></li>
                        <li class="list-group-item"><a href="index.html?version=beta">Beta Chrome Streams</a></li>
                        <li class="list-group-item"><a href="index.html?version=dev">Dev Chrome Streams</a></li>
                        <li class="list-group-item"><a href="index.html?version=canary">Canary Chrome Streams</a></li>
                        <li class="list-group-item"><a href="index.html?version=explorer">Internet Explorer 11 Streams</a></li>
                    </ul>
nweber's avatar
nweber committed
448
                </div>
Nathan Weber's avatar
Nathan Weber committed
449 450 451 452 453 454 455 456
                <div class="col-md-3">
                    <h3 class="footer-text">Player Libraries:</h3>
                    <a
                        ng-repeat="item in playerLibraries"
                        class="footer-text"
                        href="{{item.link}}"
                        target="_blank">
                        {{item.name}}
nweber's avatar
nweber committed
457
                    </a>
Nathan Weber's avatar
Nathan Weber committed
458 459 460 461 462 463 464
                    <h3 class="footer-text">Showcase Libraries:</h3>
                    <a
                        ng-repeat="item in showcaseLibraries"
                        class="footer-text"
                        href="{{item.link}}"
                        target="_blank">
                        {{item.name}}
nweber's avatar
nweber committed
465 466
                    </a>
                </div>
Nathan Weber's avatar
Nathan Weber committed
467 468 469 470 471 472 473
                <div class="col-md-4">
                    <h3 class="footer-text">Contributors:</h3>
                    <a
                        ng-repeat="item in contributors"
                        class="footer-text"
                        href="{{item.link}}"
                        target="_blank">
Nathan Weber's avatar
Nathan Weber committed
474 475
                        <img ng-show="hasLogo(item)" ng-src="{{item.logo}}" alt="{{item.link}}"/>
                        <span class="contributor" ng-show="!hasLogo(item)">{{item.name}}</span>
nweber's avatar
nweber committed
476
                    </a>
nweber's avatar
nweber committed
477 478 479
                </div>
            </div>
        </div>
Nathan Weber's avatar
Nathan Weber committed
480
    </div>
nweber's avatar
nweber committed
481
</body>
Nathan Weber's avatar
Nathan Weber committed
482
</html>