mirror of https://github.com/Ombi-app/Ombi
parent
8f0ca3d1c4
commit
448cd8d92e
Binary file not shown.
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Nancy" version="1.4.3" targetFramework="net452" />
|
||||
<package id="Nancy.Authentication.Forms" version="1.4.1" targetFramework="net452" />
|
||||
</packages>
|
@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="SqlTables" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>sqltables.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
</root>
|
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Dapper" version="1.42" targetFramework="net452" />
|
||||
<package id="Dapper.Contrib" version="1.42" targetFramework="net452" />
|
||||
</packages>
|
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 16 KiB |
@ -1,12 +0,0 @@
|
||||
using Nancy;
|
||||
|
||||
namespace RequestPlex.UI.Modules
|
||||
{
|
||||
public class ManageModule : NancyModule
|
||||
{
|
||||
public ManageModule()
|
||||
{
|
||||
Get["manage/"] = _ => "Hello!";
|
||||
}
|
||||
}
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
using Nancy;
|
||||
using Nancy.ModelBinding;
|
||||
using Nancy.Responses.Negotiation;
|
||||
|
||||
using RequestPlex.Api;
|
||||
|
||||
namespace RequestPlex.UI.Modules
|
||||
{
|
||||
public class RequestModule : NancyModule
|
||||
{
|
||||
public RequestModule()
|
||||
{
|
||||
Get["request/"] = parameters => RequestLoad();
|
||||
|
||||
Get["request/movie/{searchTerm}"] = parameters =>
|
||||
{
|
||||
var search = (string)parameters.searchTerm;
|
||||
return SearchMovie(search);
|
||||
};
|
||||
|
||||
Get["request/tv/{searchTerm}"] = parameters =>
|
||||
{
|
||||
var search = (string)parameters.searchTerm;
|
||||
return SearchTvShow(search);
|
||||
};
|
||||
}
|
||||
|
||||
private Negotiator RequestLoad()
|
||||
{
|
||||
return View["Request/Index"];
|
||||
}
|
||||
|
||||
private Response SearchMovie(string searchTerm)
|
||||
{
|
||||
var api = new TheMovieDbApi();
|
||||
var movies = api.SearchMovie(searchTerm);
|
||||
var result = movies.Result;
|
||||
return Response.AsJson(result);
|
||||
}
|
||||
|
||||
private Response SearchTvShow(string searchTerm)
|
||||
{
|
||||
var api = new TheMovieDbApi();
|
||||
var tvShow = api.SearchTv(searchTerm);
|
||||
var result = tvShow.Result;
|
||||
return Response.AsJson(result);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
using Nancy;
|
||||
|
||||
namespace RequestPlex.UI.Modules
|
||||
{
|
||||
public class RequestsModule : NancyModule
|
||||
{
|
||||
public RequestsModule()
|
||||
{
|
||||
Get["requests/"] = _ => "Hello!";
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,90 @@
|
||||
using Nancy;
|
||||
using Nancy.Responses.Negotiation;
|
||||
|
||||
using RequestPlex.Api;
|
||||
|
||||
namespace RequestPlex.UI.Modules
|
||||
{
|
||||
public class SearchModule : NancyModule
|
||||
{
|
||||
public SearchModule()
|
||||
{
|
||||
Get["search/"] = parameters => RequestLoad();
|
||||
|
||||
Get["search/movie/{searchTerm}"] = parameters =>
|
||||
{
|
||||
var search = (string)parameters.searchTerm;
|
||||
return SearchMovie(search);
|
||||
};
|
||||
|
||||
Get["search/tv/{searchTerm}"] = parameters =>
|
||||
{
|
||||
var search = (string)parameters.searchTerm;
|
||||
return SearchTvShow(search);
|
||||
};
|
||||
|
||||
Get["search/movie/upcoming"] = parameters => UpcomingMovies();
|
||||
Get["search/movie/playing"] = parameters => CurrentlyPlayingMovies();
|
||||
|
||||
Post["search/request/movie"] = parameters =>
|
||||
{
|
||||
var movieId = (int)Request.Form.movieId;
|
||||
return RequestMovie(movieId);
|
||||
};
|
||||
|
||||
Post["search/request/tv"] = parameters =>
|
||||
{
|
||||
var tvShowId = (int)Request.Form.showId;
|
||||
var latest = (bool)Request.Form.latestSeason;
|
||||
return RequestTvShow(tvShowId, latest);
|
||||
};
|
||||
}
|
||||
|
||||
private Negotiator RequestLoad()
|
||||
{
|
||||
return View["Search/Index"];
|
||||
}
|
||||
|
||||
private Response SearchMovie(string searchTerm)
|
||||
{
|
||||
var api = new TheMovieDbApi();
|
||||
var movies = api.SearchMovie(searchTerm);
|
||||
var result = movies.Result;
|
||||
return Response.AsJson(result);
|
||||
}
|
||||
|
||||
private Response SearchTvShow(string searchTerm)
|
||||
{
|
||||
var api = new TheMovieDbApi();
|
||||
var tvShow = api.SearchTv(searchTerm);
|
||||
var result = tvShow.Result;
|
||||
return Response.AsJson(result);
|
||||
}
|
||||
|
||||
private Response UpcomingMovies()
|
||||
{
|
||||
var api = new TheMovieDbApi();
|
||||
var movies = api.GetUpcomingMovies();
|
||||
var result = movies.Result;
|
||||
return Response.AsJson(result);
|
||||
}
|
||||
|
||||
private Response CurrentlyPlayingMovies()
|
||||
{
|
||||
var api = new TheMovieDbApi();
|
||||
var movies = api.GetCurrentPlayingMovies();
|
||||
var result = movies.Result;
|
||||
return Response.AsJson(result);
|
||||
}
|
||||
|
||||
private Response RequestMovie(int movieId)
|
||||
{
|
||||
return Response.AsJson("");
|
||||
}
|
||||
|
||||
private Response RequestTvShow(int showId, bool latest)
|
||||
{
|
||||
return Response.AsJson("");
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
@Html.Partial("/Admin/_Sidebar")
|
||||
@{
|
||||
var port = Model.Port ?? 0;
|
||||
}
|
||||
<div class="col-sm-8">
|
||||
<form class="form-horizontal" method="POST">
|
||||
<fieldset>
|
||||
<legend>Request Plex Settings</legend>
|
||||
<div class="form-group">
|
||||
<label for="portNumber" class="col-lg-2 control-label">Port</label>
|
||||
<div class="col-lg-10">
|
||||
<input type="text" class="form-control" id="portNumber" name="portNumber" placeholder="Port Number" value="@port">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-lg-10 col-lg-offset-2">
|
||||
<button type="reset" class="btn btn-default">Cancel</button>
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
@if (Model.Errored)
|
||||
{
|
||||
<div class="alert alert-dismissible alert-danger">
|
||||
<button type="button" class="close" data-dismiss="alert"><i class="fa fa-times"></i></button>
|
||||
Please enter in a correct port number
|
||||
</div>
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
<div class="col-lg-3 col-md-3 col-sm-4">
|
||||
<div class="list-group table-of-contents">
|
||||
<a class="list-group-item" href="/admin">Request Plex Settings</a>
|
||||
<a class="list-group-item" href="/couchpotato">CouchPotato Settings</a>
|
||||
<a class="list-group-item" href="/sonarr">Sonarr Settings</a>
|
||||
<a class="list-group-item" href="/sickbeard">Sickbeard Settings</a>
|
||||
<a class="list-group-item" href="/userauth">Authentication</a>
|
||||
</div>
|
||||
</div>
|
@ -1 +1,2 @@
|
||||
BODY
|
||||
Home
|
||||
|
@ -0,0 +1,15 @@
|
||||
<form method="POST">
|
||||
Username <input class="form-control" type="text" name="Username" />
|
||||
<br />
|
||||
Password <input class="form-control" name="Password" type="password" />
|
||||
<br />
|
||||
<br />
|
||||
<input class="btn btn-success" type="submit" value="Create User" />
|
||||
</form>
|
||||
@if (Model.Errored)
|
||||
{
|
||||
<div class="alert alert-dismissible alert-danger">
|
||||
<button type="button" class="close" data-dismiss="alert"><i class="fa fa-times"></i></button>
|
||||
An admin account already exists!
|
||||
</div>
|
||||
}
|
@ -1,126 +0,0 @@
|
||||
<div>
|
||||
<h2>Search</h2>
|
||||
<!-- Nav tabs -->
|
||||
<ul id="nav-tabs" class="nav nav-tabs" role="tablist">
|
||||
<li role="presentation" class="active"><a href="#MoviesTab" aria-controls="home" role="tab" data-toggle="tab">Movies</a></li>
|
||||
<li role="presentation"><a href="#TvShowTab" aria-controls="profile" role="tab" data-toggle="tab">TV Shows</a></li>
|
||||
|
||||
</ul>
|
||||
|
||||
<!-- Tab panes -->
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane active" id="MoviesTab">
|
||||
<div class="input-group">
|
||||
<input id="movieSearchContent" type="text" class="form-control">
|
||||
<div class="input-group-addon">
|
||||
<i class="fa fa-search"></i>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<br />
|
||||
<br />
|
||||
<div id="movieList">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="TvShowTab">
|
||||
|
||||
<div class="input-group">
|
||||
<input id="tvSearchContent" type="text" class="form-control">
|
||||
<div class="input-group-addon">
|
||||
<i class="fa fa-search"></i>
|
||||
</div>
|
||||
<span class="input-group-btn">
|
||||
<button class="btn btn-default" type="button" id="tvSearchButton">Search</button>
|
||||
</span>
|
||||
</div>
|
||||
<div id="tvList">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<script id="movie-template" type="text/x-handlebars-template">
|
||||
<div class="row">
|
||||
<div class="col-sm-2">
|
||||
<img src="http://image.tmdb.org/t/p/w150/{{posterPath}}" alt="poster">
|
||||
</div>
|
||||
<div class="col-sm-5">
|
||||
<div id="{{id}}">
|
||||
<a href="https://www.themoviedb.org/movie/{{id}}">
|
||||
<h4>{{title}} ({{year}})</h4>
|
||||
</a>
|
||||
</div>
|
||||
<p>{{overview}}.</p>
|
||||
</div>
|
||||
<div class="col-sm-5">
|
||||
|
||||
<small>Vote Average: {{voteAverage}}</small>
|
||||
<small>Vote Count: {{voteCount}}</small>
|
||||
<button style="text-align: right" class="btn btn-primary bottom-align-text">
|
||||
<i class="fa fa-plus"></i>Request
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<hr />
|
||||
</script>
|
||||
|
||||
|
||||
<script>
|
||||
$(function () {
|
||||
|
||||
var movieSource = $("#movie-template").html();
|
||||
var movieTemplate = Handlebars.compile(movieSource);
|
||||
var movieTimer = 0;
|
||||
var tvimer = 0;
|
||||
|
||||
$('#movieSearchContent').on('keyup', function (e) {
|
||||
if (movieTimer) {
|
||||
clearTimeout(movieTimer);
|
||||
}
|
||||
movieTimer = setTimeout(movieSearch, 400);
|
||||
});
|
||||
|
||||
$('#tvSearchContent').on('keyup', function (e) {
|
||||
if (tvimer) {
|
||||
clearTimeout(tvimer);
|
||||
}
|
||||
tvimer = setTimeout(tvSearch(), 400);
|
||||
});
|
||||
|
||||
function movieSearch() {
|
||||
$('#movieList').html("");
|
||||
var query = $('#movieSearchContent').val();
|
||||
|
||||
$.ajax("/request/movie/" + query).success(function (results) {
|
||||
results.forEach(function (result) {
|
||||
var date = new Date(result.releaseDate);
|
||||
var year = date.getFullYear();
|
||||
var context = { posterPath: result.posterPath, id: result.id, title: result.title, overview: result.overview, voteCount: result.voteCount, voteAverage: result.voteAverage, year: year };
|
||||
var html = movieTemplate(context);
|
||||
$('#movieList').append(html);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
function tvSearch() {
|
||||
$('#tvList').html("");
|
||||
var query = $('#tvSearchContent').val();
|
||||
|
||||
$.ajax("/request/tv/" + query).success(function (results) {
|
||||
results.forEach(function (result) {
|
||||
var date = new Date(result.airDate);
|
||||
var year = date.getFullYear();
|
||||
var context = { posterPath: result.posterPath, id: result.id, title: result.title, overview: result.overview, voteCount: result.voteCount, voteAverage: result.voteAverage, year : year };
|
||||
var html = movieTemplate(context);
|
||||
$('#tvList').append(html);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
});
|
||||
</script>
|
@ -0,0 +1,75 @@
|
||||
<div>
|
||||
<h2>Search</h2>
|
||||
<!-- Nav tabs -->
|
||||
<ul id="nav-tabs" class="nav nav-tabs" role="tablist">
|
||||
<li role="presentation" class="active"><a href="#MoviesTab" aria-controls="home" role="tab" data-toggle="tab">Movies</a></li>
|
||||
<li role="presentation"><a href="#TvShowTab" aria-controls="profile" role="tab" data-toggle="tab">TV Shows</a></li>
|
||||
|
||||
</ul>
|
||||
|
||||
<!-- Tab panes -->
|
||||
<div class="tab-content">
|
||||
|
||||
<!-- Movie tab -->
|
||||
<div role="tabpanel" class="tab-pane active" id="MoviesTab">
|
||||
<div class="input-group">
|
||||
<input id="movieSearchContent" type="text" class="form-control">
|
||||
<div class="input-group-addon">
|
||||
<i class="fa fa-search"></i>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<br />
|
||||
<!-- Movie content -->
|
||||
<div id="movieList">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- TV tab -->
|
||||
<div role="tabpanel" class="tab-pane" id="TvShowTab">
|
||||
<div class="input-group">
|
||||
<input id="tvSearchContent" type="text" class="form-control">
|
||||
<div class="input-group-addon">
|
||||
<i class="fa fa-search"></i>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<br />
|
||||
<!-- TV content -->
|
||||
<div id="tvList">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<script id="search-template" type="text/x-handlebars-template">
|
||||
<div class="row">
|
||||
<div class="col-sm-2">
|
||||
{{#if posterPath}}
|
||||
<img src="http://image.tmdb.org/t/p/w150/{{posterPath}}" alt="poster">
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="col-sm-5">
|
||||
<div id="{{id}}">
|
||||
<a href="https://www.themoviedb.org/{{type}}/{{id}}">
|
||||
<h4>{{title}} ({{year}})</h4>
|
||||
</a>
|
||||
</div>
|
||||
<p>{{overview}}.</p>
|
||||
</div>
|
||||
<div class="col-sm-5">
|
||||
<small>Vote Average: {{voteAverage}}</small>
|
||||
<small>Vote Count: {{voteCount}}</small>
|
||||
<button style="text-align: right" class="btn btn-primary bottom-align-text">
|
||||
<i class="fa fa-plus"></i>Request
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<hr />
|
||||
</script>
|
||||
|
||||
|
||||
<script src="/Content/search.js" type="text/javascript"></script>
|
@ -1,25 +0,0 @@
|
||||
@Model string;
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>RequestPlex.UI</title>
|
||||
|
||||
<style type="text/css">
|
||||
|
||||
body {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<img src="~/Content/nancy-logo.png" alt="Nancy logo" /><br />
|
||||
This view was rendered using the Nancy Razor view engine
|
||||
@if (1 == 1)
|
||||
{
|
||||
<div>@Model</div>
|
||||
}
|
||||
</body>
|
||||
</html>
|
Binary file not shown.
Loading…
Reference in new issue