Commit e0bbc0d6 authored by tywldx's avatar tywldx

准备切换分枝

parent 5b4c96c1
...@@ -10,7 +10,10 @@ exports.save_by_key.__method__ = 'POST'; ...@@ -10,7 +10,10 @@ exports.save_by_key.__method__ = 'POST';
exports.query = async function () { exports.query = async function () {
await this.bindDefault(); await this.bindDefault();
this.body = await this.mongo("Tag").findByProjectId(this.request.query._id); let data = {};
data.project = await this.mongo("Project").findById(this.request.query._id);
data.data = await this.mongo("Tag").findByProjectId(this.request.query._id);
this.body = data
return return
} }
exports.query.__method__ = 'GET'; exports.query.__method__ = 'GET';
......
...@@ -76,6 +76,9 @@ exports.methods = { ...@@ -76,6 +76,9 @@ exports.methods = {
}) })
} }
}, },
findById: async function(_id){
return await this.model("Project").findOne({"_id":_id})
},
addUrl: async function () { addUrl: async function () {
}, },
......
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"project": {
"name": "default"
},
"apps": [
{
"root": "src",
"outDir": "dist",
"assets": [
"assets",
"favicon.ico"
],
"index": "index.html",
"main": "main.ts",
"polyfills": "polyfills.ts",
"test": "test.ts",
"tsconfig": "tsconfig.app.json",
"testTsconfig": "tsconfig.spec.json",
"prefix": "app",
"styles": [
"styles.scss"
],
"scripts": [],
"environmentSource": "environments/environment.ts",
"environments": {
"dev": "environments/environment.ts",
"prod": "environments/environment.prod.ts"
}
}
],
"e2e": {
"protractor": {
"config": "./protractor.conf.js"
}
},
"lint": [
{
"project": "src/tsconfig.app.json",
"exclude": "**/node_modules/**"
},
{
"project": "src/tsconfig.spec.json",
"exclude": "**/node_modules/**"
},
{
"project": "e2e/tsconfig.e2e.json",
"exclude": "**/node_modules/**"
}
],
"test": {
"karma": {
"config": "./karma.conf.js"
}
},
"defaults": {
"styleExt": "scss",
"class": {
"spec": false
},
"component": {
"inlineStyle": true,
"inlineTemplate": true,
"spec": false
},
"directive": {
"spec": false
},
"guard": {
"spec": false
},
"module": {
"spec": false
},
"pipe": {
"spec": false
},
"service": {
"spec": false
}
}
}
{
"name": "default",
"version": "0.0.0",
"license": "MIT",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"postinstall": "npm run tsformat",
"tsformat": "tsfmt -r"
},
"private": true,
"dependencies": {
"@angular/animations": "^5.0.0",
"@angular/common": "^5.0.0",
"@angular/compiler": "^5.0.0",
"@angular/core": "^5.0.0",
"@angular/forms": "^5.0.0",
"@angular/http": "^5.0.0",
"@angular/platform-browser": "^5.0.0",
"@angular/platform-browser-dynamic": "^5.0.0",
"@angular/router": "^5.0.0",
"core-js": "^2.4.1",
"rxjs": "^5.5.2",
"zone.js": "^0.8.14",
"jquery": "^3.2.1",
"@types/jquery": "^3.2.6",
"enhanced-resolve": "^3.3.0",
"classlist.js": "^1.1.20150312",
"@ng-bootstrap/ng-bootstrap": "^1.0.0-beta.3",
"primeng": "^4.1.3",
"ng-recaptcha": "^3.0.0",
"typescript-formatter": "^5.2.0"
},
"devDependencies": {
"@angular/cli": "1.5.0",
"@angular/compiler-cli": "^5.0.0",
"@angular/language-service": "^5.0.0",
"typescript": "~2.4.2"
}
}
\ No newline at end of file
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'isDefaultPipe'
})
export class IsDefaultPipe implements PipeTransform {
transform(value: any, args?: any): any {
switch(value){
case 0 : return "";
case 1 : return "";
}
}
}
import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core';
@Directive({
selector: "[href]",
host: { '(click)': 'preventDefault($event)' },
})
export class HrefPreventDefaultDirective implements AfterViewInit {
@Input() href: string;
constructor(private el: ElementRef) {
}
ngAfterViewInit() {
}
preventDefault(event) {
if (this.href.length === 0 || this.href === '#') {
event.preventDefault();
}
}
}
\ No newline at end of file
import { AfterViewInit, Directive, ElementRef } from '@angular/core';
import { Helpers } from '../helpers';
@Directive({
selector: "[appunwraptag]",
})
export class UnwrapTagDirective implements AfterViewInit {
constructor(private el: ElementRef) {
}
ngAfterViewInit() {
let nativeElement: HTMLElement = this.el.nativeElement;
Helpers.unwrapTag(nativeElement);
}
}
\ No newline at end of file
import { Injectable, ErrorHandler } from "@angular/core";
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
constructor() {
}
handleError(error: any): void {
}
}
\ No newline at end of file
import { Injectable } from '@angular/core';
@Injectable()
export class GlobalService {
bpServerHost: String = "127.0.0.1:10084";
}
\ No newline at end of file
import { Injectable } from "@angular/core";
import * as $ from 'jquery';
declare let document: any;
interface Script {
src: string;
loaded: boolean;
}
@Injectable()
export class ScriptLoaderService {
private _scripts: Script[] = [];
private tag: any;
load(tag, ...scripts: string[]) {
this.tag = tag;
scripts.forEach((script: string) => this._scripts[script] = { src: script, loaded: false });
let promises: any[] = [];
scripts.forEach((script) => promises.push(this.loadScript(script)));
return Promise.all(promises);
}
loadScript(src: string) {
return new Promise((resolve, reject) => {
//resolve if already loaded
if (this._scripts[src].loaded) {
resolve({ script: src, loaded: true, status: 'Already Loaded' });
}
else {
//load script
let script = $('<script/>')
.attr('type', 'text/javascript')
.attr('src', this._scripts[src].src);
$(this.tag).append(script);
resolve({ script: src, loaded: true, status: 'Loaded' });
}
});
}
}
\ No newline at end of file
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { LogoutComponent } from "./auth/logout/logout.component";
const routes: Routes = [
{ path: 'login', loadChildren: './auth/auth.module#AuthModule' },
{ path: 'logout', component: LogoutComponent },
{ path: '', redirectTo: 'index', pathMatch: 'full' },
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
\ No newline at end of file
<!-- begin::Page loader -->
<div class="m-page-loader m-page-loader--non-block" style="margin-left: -80px; margin-top: -20px;">
<div class="m-blockui">
<span>
Please wait...
</span>
<span>
<div class="m-loader m-loader--brand"></div>
</span>
</div>
</div>
<!-- end::Page loader -->
<!-- begin:: Page -->
<router-outlet></router-outlet>
<!-- end:: Page -->
<!-- <app-quick-sidebar></app-quick-sidebar> -->
<!-- <app-scroll-top></app-scroll-top> -->
<!-- <app-tooltips></app-tooltips> -->
<!--begin::Base Scripts -->
<!--end::Base Scripts -->
<!--begin::Page Vendors -->
<!--end::Page Vendors -->
<!--begin::Page Snippets -->
<!--end::Page Snippets -->
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Router, NavigationStart, NavigationEnd } from '@angular/router';
import { Helpers } from "./helpers";
@Component({
selector: 'body',
templateUrl: './app.component.html',
encapsulation: ViewEncapsulation.None,
})
export class AppComponent implements OnInit {
title = 'app';
globalBodyClass = 'm-page--loading-non-block m-page--fluid m--skin- m-content--skin-light2 m-header--fixed m-header--fixed-mobile m-aside-left--enabled m-aside-left--skin-dark m-aside-left--offcanvas m-footer--push m-aside--offcanvas-default';
constructor(private _router: Router) {
}
ngOnInit() {
this._router.events.subscribe((route) => {
if (route instanceof NavigationStart) {
Helpers.setLoading(true);
Helpers.bodyClass(this.globalBodyClass);
}
if (route instanceof NavigationEnd) {
Helpers.setLoading(false);
}
});
}
}
\ No newline at end of file
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { ThemeComponent } from './theme/theme.component';
import { LayoutModule } from './theme/layouts/layout.module';
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { ScriptLoaderService } from "./_services/script-loader.service";
import { ThemeRoutingModule } from "./theme/theme-routing.module";
import { AuthModule } from "./auth/auth.module";
import { GlobalService } from './_services/global.service';
@NgModule({
declarations: [
ThemeComponent,
AppComponent
],
imports: [
HttpClientModule,
LayoutModule,
BrowserModule,
BrowserAnimationsModule,
AppRoutingModule,
ThemeRoutingModule,
AuthModule
],
providers: [
ScriptLoaderService,
GlobalService
],
bootstrap: [AppComponent]
})
export class AppModule { }
\ No newline at end of file
<div *ngIf="message" class="m-alert m-alert--outline alert alert-{{message.type}} alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"></button>
<span>{{message.text}}</span>
</div>
\ No newline at end of file
import { Component, OnInit } from "@angular/core";
import { AlertService } from "../_services/index";
@Component({
selector: 'app-alert',
templateUrl: './alert.component.html'
})
export class AlertComponent implements OnInit {
message: any;
constructor(private _alertService: AlertService) {
}
ngOnInit() {
this._alertService.getMessage().subscribe(message => {
this.message = message;
});
}
}
\ No newline at end of file
import { Injectable } from "@angular/core";
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from "@angular/router";
import { UserService } from "../_services/user.service";
import { Observable } from "rxjs/Rx";
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private _router: Router, private _userService: UserService) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
let currentUser = JSON.parse(localStorage.getItem('currentUser'));
return this._userService.verify().map(
data => {
if (data !== null) {
// logged in so return true
return true;
}
// error when verify so redirect to login page with the return url
this._router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
return false;
},
error => {
// error when verify so redirect to login page with the return url
this._router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
return false;
});
}
}
\ No newline at end of file
import { BaseRequestOptions, Http, RequestMethod, RequestOptions, Response, ResponseOptions, XHRBackend } from "@angular/http";
import { MockBackend, MockConnection } from "@angular/http/testing";
export function mockBackEndFactory(backend: MockBackend, options: BaseRequestOptions, realBackend: XHRBackend) {
// array in local storage for registered users
let users: any[] = JSON.parse(localStorage.getItem('users')) || [];
// fake token
let token: string = 'fake-jwt-token';
// configure fake backend
backend.connections.subscribe((connection: MockConnection) => {
// wrap in timeout to simulate server api call
setTimeout(() => {
// authenticate
if (connection.request.url.endsWith('/api/authenticate') && connection.request.method === RequestMethod.Post) {
// get parameters from post request
let params = JSON.parse(connection.request.getBody());
// find if any user matches login credentials
let filteredUsers = users.filter(user => {
return user.email === params.email && user.password === params.password;
});
// default account
if (params.email === 'demo@demo.com' && params.password === 'demo') {
filteredUsers[0] = {
fullName: 'Demo',
email: 'demo@demo.com',
password: 'demo',
};
}
if (filteredUsers.length) {
// if login details are valid return 200 OK with user details and fake jwt token
let user = filteredUsers[0];
connection.mockRespond(new Response(new ResponseOptions({
status: 200,
body: {
id: user.id,
fullName: user.fullName,
email: user.email,
token: token
}
})));
} else {
// else return 400 bad request
connection.mockError(new Error('Email or password is incorrect'));
}
return;
}
// get users
if (connection.request.url.endsWith('/api/users') && connection.request.method === RequestMethod.Get) {
// check for fake auth token in header and return users if valid, this security
// is implemented server side in a real application
if (connection.request.headers.get('Authorization') === 'Bearer ' + token) {
connection.mockRespond(new Response(new ResponseOptions({ status: 200, body: users })));
} else {
// return 401 not authorised if token is null or invalid
connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
}
return;
}
// get user by id
if (connection.request.url.match(/\/api\/users\/\d+$/) && connection.request.method === RequestMethod.Get) {
// check for fake auth token in header and return user if valid, this security is implemented server side in a real application
if (connection.request.headers.get('Authorization') === 'Bearer ' + token) {
// find user by id in users array
let urlParts = connection.request.url.split('/');
let id = parseInt(urlParts[urlParts.length - 1]);
let matchedUsers = users.filter(user => {
return user.id === id;
});
let user = matchedUsers.length ? matchedUsers[0] : null;
// respond 200 OK with user
connection.mockRespond(new Response(new ResponseOptions({ status: 200, body: user })));
} else {
// return 401 not authorised if token is null or invalid
connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
}
return;
}
// create user
if (connection.request.url.endsWith('/api/users') && connection.request.method === RequestMethod.Post) {
// get new user object from post body
let newUser = JSON.parse(connection.request.getBody());
// validation
let duplicateUser = users.filter(user => {
return user.email === newUser.email;
}).length;
if (duplicateUser) {
return connection.mockError(new Error('Email "' + newUser.email + '" is already registered'));
}
// save new user
newUser.id = users.length + 1;
users.push(newUser);
localStorage.setItem('users', JSON.stringify(users));
// respond 200 OK
connection.mockRespond(new Response(new ResponseOptions({ status: 200 })));
return;
}
// delete user
if (connection.request.url.match(/\/api\/users\/\d+$/) && connection.request.method === RequestMethod.Delete) {
// check for fake auth token in header and return user if valid, this security is implemented server side in a real application
if (connection.request.headers.get('Authorization') === 'Bearer ' + token) {
// find user by id in users array
let urlParts = connection.request.url.split('/');
let id = parseInt(urlParts[urlParts.length - 1]);
for (let i = 0; i < users.length; i++) {
let user = users[i];
if (user.id === id) {
// delete user
users.splice(i, 1);
localStorage.setItem('users', JSON.stringify(users));
break;
}
}
// respond 200 OK
connection.mockRespond(new Response(new ResponseOptions({ status: 200 })));
} else {
// return 401 not authorised if token is null or invalid
connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
}
return;
}
// token verify
if (connection.request.url.endsWith('/api/verify') && connection.request.method === RequestMethod.Get) {
// check for fake auth token in header and return users if valid, this security
// is implemented server side in a real application
if (connection.request.headers.get('Authorization') === 'Bearer ' + token) {
connection.mockRespond(new Response(new ResponseOptions({ status: 200, body: { status: 'ok' } })));
} else {
// return 401 not authorised if token is null or invalid
connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
}
return;
}
// forgot password
if (connection.request.url.endsWith('/api/forgot-password') && connection.request.method === RequestMethod.Post) {
// get parameters from post request
let params = JSON.parse(connection.request.getBody());
// find if any user matches login credentials
let filteredUsers = users.filter(user => {
return user.email === params.email;
});
if (filteredUsers.length) {
// in real world, if email is valid, send email change password link
let user = filteredUsers[0];
connection.mockRespond(new Response(new ResponseOptions({ status: 200 })));
} else {
// else return 400 bad request
connection.mockError(new Error('User with this email does not exist'));
}
return;
}
// pass through any requests not handled above
let realHttp = new Http(realBackend, options);
let requestOptions = new RequestOptions({
method: connection.request.method,
headers: connection.request.headers,
body: connection.request.getBody(),
url: connection.request.url,
withCredentials: connection.request.withCredentials,
responseType: connection.request.responseType
});
realHttp.request(connection.request.url, requestOptions)
.subscribe((response: Response) => {
connection.mockRespond(response);
},
(error: any) => {
connection.mockError(error);
});
}, 500);
});
return new Http(backend, options);
}
export let fakeBackendProvider = {
// use fake backend in place of Http service for backend-less development
provide: Http,
deps: [MockBackend, BaseRequestOptions, XHRBackend],
useFactory: mockBackEndFactory
};
\ No newline at end of file
export class LoginCustom {
static handleSignInFormSubmit() {
$('#m_login_signin_submit').click(function(e) {
let form = $(this).closest('form');
form.validate({
rules: {
email: {
required: true,
email: true
},
password: {
required: true
}
}
});
if (!form.valid()) {
e.preventDefault();
return;
}
});
}
static displaySignUpForm() {
let login = $('#m_login');
login.removeClass('m-login--forget-password');
login.removeClass('m-login--signin');
login.addClass('m-login--signup');
(<any>login.find('.m-login__signup')).animateClass('flipInX animated');
}
static displaySignInForm() {
let login = $('#m_login');
login.removeClass('m-login--forget-password');
login.removeClass('m-login--signup');
try {
$('form').data('validator').resetForm();
} catch (e) {
}
login.addClass('m-login--signin');
(<any>login.find('.m-login__signin')).animateClass('flipInX animated');
}
static displayForgetPasswordForm() {
let login = $('#m_login');
login.removeClass('m-login--signin');
login.removeClass('m-login--signup');
login.addClass('m-login--forget-password');
(<any>login.find('.m-login__forget-password')).animateClass('flipInX animated');
}
static handleFormSwitch() {
$('#m_login_forget_password').click(function(e) {
e.preventDefault();
LoginCustom.displayForgetPasswordForm();
});
$('#m_login_forget_password_cancel').click(function(e) {
e.preventDefault();
LoginCustom.displaySignInForm();
});
$('#m_login_signup').click(function(e) {
e.preventDefault();
LoginCustom.displaySignUpForm();
});
$('#m_login_signup_cancel').click(function(e) {
e.preventDefault();
LoginCustom.displaySignInForm();
});
}
static handleSignUpFormSubmit() {
$('#m_login_signup_submit').click(function(e) {
let btn = $(this);
let form = $(this).closest('form');
form.validate({
rules: {
fullname: {
required: true
},
email: {
required: true,
email: true
},
password: {
required: true
},
rpassword: {
required: true
},
agree: {
required: true
}
}
});
if (!form.valid()) {
e.preventDefault();
return;
}
});
}
static handleForgetPasswordFormSubmit() {
$('#m_login_forget_password_submit').click(function(e) {
let btn = $(this);
let form = $(this).closest('form');
form.validate({
rules: {
email: {
required: true,
email: true
}
}
});
if (!form.valid()) {
e.preventDefault();
return;
}
});
}
static init() {
LoginCustom.handleFormSwitch();
LoginCustom.handleSignInFormSubmit();
LoginCustom.handleSignUpFormSubmit();
LoginCustom.handleForgetPasswordFormSubmit();
}
}
\ No newline at end of file
export class User {
id: number;
email: string;
password: string;
fullName: string;
}
\ No newline at end of file
import { Injectable } from "@angular/core";
import { NavigationStart, Router } from "@angular/router";
import { Observable } from "rxjs";
import { Subject } from "rxjs/Subject";
@Injectable()
export class AlertService {
private subject = new Subject<any>();
private keepAfterNavigationChange = false;
constructor(private _router: Router) {
// clear alert message on route change
_router.events.subscribe(event => {
if (event instanceof NavigationStart) {
if (this.keepAfterNavigationChange) {
// only keep for a single location change
this.keepAfterNavigationChange = false;
} else {
// clear alert
this.subject.next();
}
}
});
}
success(message: string, keepAfterNavigationChange = false) {
this.keepAfterNavigationChange = keepAfterNavigationChange;
this.subject.next({ type: 'success', text: message });
}
error(message: string, keepAfterNavigationChange = false) {
this.keepAfterNavigationChange = keepAfterNavigationChange;
this.subject.next({ type: 'danger', text: message });
}
getMessage(): Observable<any> {
return this.subject.asObservable();
}
}
\ No newline at end of file
import { Injectable } from "@angular/core";
import { Http, Response } from "@angular/http";
import "rxjs/add/operator/map";
@Injectable()
export class AuthenticationService {
constructor(private http: Http) {
}
login(email: string, password: string) {
return this.http.post('/api/authenticate', JSON.stringify({ email: email, password: password }))
.map((response: Response) => {
// login successful if there's a jwt token in the response
let user = response.json();
if (user && user.token) {
// store user details and jwt token in local storage to keep user logged in between page refreshes
localStorage.setItem('currentUser', JSON.stringify(user));
}
});
}
logout() {
// remove user from local storage to log user out
localStorage.removeItem('currentUser');
}
}
\ No newline at end of file
export * from './alert.service';
export * from './authentication.service';
export * from './user.service';
\ No newline at end of file
import { Injectable } from "@angular/core";
import { Headers, Http, RequestOptions, Response } from "@angular/http";
import { User } from "../_models/index";
@Injectable()
export class UserService {
constructor(private http: Http) {
}
verify() {
return this.http.get('/api/verify', this.jwt()).map((response: Response) => response.json());
}
forgotPassword(email: string) {
return this.http.post('/api/forgot-password', JSON.stringify({ email }), this.jwt()).map((response: Response) => response.json());
}
getAll() {
return this.http.get('/api/users', this.jwt()).map((response: Response) => response.json());
}
getById(id: number) {
return this.http.get('/api/users/' + id, this.jwt()).map((response: Response) => response.json());
}
create(user: User) {
return this.http.post('/api/users', user, this.jwt()).map((response: Response) => response.json());
}
update(user: User) {
return this.http.put('/api/users/' + user.id, user, this.jwt()).map((response: Response) => response.json());
}
delete(id: number) {
return this.http.delete('/api/users/' + id, this.jwt()).map((response: Response) => response.json());
}
// private helper methods
private jwt() {
// create authorization header with jwt token
let currentUser = JSON.parse(localStorage.getItem('currentUser'));
if (currentUser && currentUser.token) {
let headers = new Headers({ 'Authorization': 'Bearer ' + currentUser.token });
return new RequestOptions({ headers: headers });
}
}
}
\ No newline at end of file
import { NgModule } from "@angular/core";
import { RouterModule, Routes } from "@angular/router";
import { AuthComponent } from "./auth.component";
const routes: Routes = [
{ path: '', component: AuthComponent }
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class AuthRoutingModule {
}
\ No newline at end of file
import { Component, ComponentFactoryResolver, OnInit, ViewChild, ViewContainerRef, ViewEncapsulation } from "@angular/core";
import { ActivatedRoute, Router } from "@angular/router";
import { ScriptLoaderService } from "../_services/script-loader.service";
import { AuthenticationService } from "./_services/authentication.service";
import { AlertService } from "./_services/alert.service";
import { UserService } from "./_services/user.service";
import { AlertComponent } from "./_directives/alert.component";
import { LoginCustom } from "./_helpers/login-custom";
import { Helpers } from "../helpers";
@Component({
selector: ".m-grid.m-grid--hor.m-grid--root.m-page",
templateUrl: './templates/login-1.component.html',
encapsulation: ViewEncapsulation.None
})
export class AuthComponent implements OnInit {
model: any = {};
loading = false;
returnUrl: string;
@ViewChild('alertSignin', { read: ViewContainerRef }) alertSignin: ViewContainerRef;
@ViewChild('alertSignup', { read: ViewContainerRef }) alertSignup: ViewContainerRef;
@ViewChild('alertForgotPass', { read: ViewContainerRef }) alertForgotPass: ViewContainerRef;
constructor(private _router: Router,
private _script: ScriptLoaderService,
private _userService: UserService,
private _route: ActivatedRoute,
private _authService: AuthenticationService,
private _alertService: AlertService,
private cfr: ComponentFactoryResolver) {
}
ngOnInit() {
this.model.remember = true;
// get return url from route parameters or default to '/'
this.returnUrl = this._route.snapshot.queryParams['returnUrl'] || '/';
this._router.navigate([this.returnUrl]);
this._script.load('body', 'assets/vendors/base/vendors.bundle.js', 'assets/demo/default/base/scripts.bundle.js')
.then(() => {
Helpers.setLoading(false);
LoginCustom.init();
});
}
signin() {
this.loading = true;
this._authService.login(this.model.email, this.model.password)
.subscribe(
data => {
this._router.navigate([this.returnUrl]);
},
error => {
this.showAlert('alertSignin');
this._alertService.error(error);
this.loading = false;
});
}
signup() {
this.loading = true;
this._userService.create(this.model)
.subscribe(
data => {
this.showAlert('alertSignin');
this._alertService.success('Thank you. To complete your registration please check your email.', true);
this.loading = false;
LoginCustom.displaySignInForm();
this.model = {};
},
error => {
this.showAlert('alertSignup');
this._alertService.error(error);
this.loading = false;
});
}
forgotPass() {
this.loading = true;
this._userService.forgotPassword(this.model.email)
.subscribe(
data => {
this.showAlert('alertSignin');
this._alertService.success('Cool! Password recovery instruction has been sent to your email.', true);
this.loading = false;
LoginCustom.displaySignInForm();
this.model = {};
},
error => {
this.showAlert('alertForgotPass');
this._alertService.error(error);
this.loading = false;
});
}
showAlert(target) {
this[target].clear();
let factory = this.cfr.resolveComponentFactory(AlertComponent);
let ref = this[target].createComponent(factory);
ref.changeDetectorRef.detectChanges();
}
}
\ No newline at end of file
import { NgModule } from "@angular/core";
import { CommonModule } from "@angular/common";
import { FormsModule } from "@angular/forms";
import { BaseRequestOptions, HttpModule } from "@angular/http";
import { MockBackend } from "@angular/http/testing";
import { AuthRoutingModule } from "./auth-routing.routing";
import { AuthComponent } from "./auth.component";
import { AlertComponent } from "./_directives/alert.component";
import { LogoutComponent } from "./logout/logout.component";
import { AuthGuard } from "./_guards/auth.guard";
import { AlertService } from "./_services/alert.service";
import { AuthenticationService } from "./_services/authentication.service";
import { UserService } from "./_services/user.service";
import { fakeBackendProvider } from "./_helpers/index";
@NgModule({
declarations: [
AuthComponent,
AlertComponent,
LogoutComponent,
],
imports: [
CommonModule,
FormsModule,
HttpModule,
AuthRoutingModule,
],
providers: [
AuthGuard,
AlertService,
AuthenticationService,
UserService,
// api backend simulation
fakeBackendProvider,
MockBackend,
BaseRequestOptions,
],
entryComponents: [AlertComponent]
})
export class AuthModule {
}
\ No newline at end of file
import { Component, OnInit, ViewEncapsulation } from "@angular/core";
import { Router } from "@angular/router";
import { AuthenticationService } from "../_services/authentication.service";
import { Helpers } from "../../helpers";
@Component({
selector: 'app-logout',
templateUrl: './logout.component.html',
encapsulation: ViewEncapsulation.None,
})
export class LogoutComponent implements OnInit {
constructor(private _router: Router,
private _authService: AuthenticationService) {
}
ngOnInit(): void {
Helpers.setLoading(true);
// reset login status
this._authService.logout();
this._router.navigate(['/login']);
}
}
\ No newline at end of file
<div class="m-grid__item m-grid__item--fluid m-grid m-grid--ver-desktop m-grid--desktop m-grid--tablet-and-mobile m-grid--hor-tablet-and-mobile m-login m-login--1 m-login--singin" id="m_login">
<div class="m-grid__item m-grid__item--order-tablet-and-mobile-2 m-login__aside">
<div class="m-stack m-stack--hor m-stack--desktop">
<div class="m-stack__item m-stack__item--fluid">
<div class="m-login__wrapper">
<div class="m-login__logo">
<a href="#">
<img src="./assets/app/media/img//logos/logo-2.png">
</a>
</div>
<div class="m-login__signin">
<div class="m-login__head">
<h3 class="m-login__title">
Sign In To Admin
</h3>
<div class="m--margin-top-40 m-alert m-alert--outline m-alert--outline-2x alert alert-success fade show" role="alert">
Use username
<span style="font-weight: 500;">
demo@demo.com
</span>
and password
<span style="font-weight: 500;">
demo
</span>
to continue or singup.
</div>
</div>
<form (ngSubmit)="f.form.valid && signin()" #f="ngForm" class="m-login__form m-form" action="">
<ng-template #alertSignin></ng-template>
<div class="form-group m-form__group">
<input class="form-control m-input" type="text" placeholder="Email" name="email" [(ngModel)]="model.email" #email="ngModel" autocomplete="off">
</div>
<div class="form-group m-form__group">
<input class="form-control m-input m-login__form-input--last" type="password" placeholder="Password" name="password" [(ngModel)]="model.password" #password="ngModel">
</div>
<div class="row m-login__form-sub">
<div class="col m--align-left">
<label class="m-checkbox m-checkbox--focus">
<input type="checkbox" name="remember" [(ngModel)]="model.remember" #remember="ngModel">
Remember me
<span></span>
</label>
</div>
<div class="col m--align-right">
<a href="javascript:;" id="m_login_forget_password" class="m-link">
Forget Password ?
</a>
</div>
</div>
<div class="m-login__form-action">
<button [disabled]="loading" [ngClass]="{'m-loader m-loader--right m-loader--light': loading}" id="m_login_signin_submit" class="btn btn-focus m-btn m-btn--pill m-btn--custom m-btn--air">
Sign In
</button>
</div>
</form>
</div>
<div class="m-login__signup">
<div class="m-login__head">
<h3 class="m-login__title">
Sign Up
</h3>
<div class="m-login__desc">
Enter your details to create your account:
</div>
</div>
<form (ngSubmit)="f.form.valid && signup()" #f="ngForm" class="m-login__form m-form" action="">
<ng-template #alertSignup></ng-template>
<div class="form-group m-form__group">
<input class="form-control m-input" type="text" placeholder="Fullname" name="fullname" [(ngModel)]="model.fullname" #fullname="ngModel">
</div>
<div class="form-group m-form__group">
<input class="form-control m-input" type="text" placeholder="Email" name="email" [(ngModel)]="model.email" #email="ngModel" autocomplete="off">
</div>
<div class="form-group m-form__group">
<input class="form-control m-input" type="password" placeholder="Password" name="password" [(ngModel)]="model.password" #password="ngModel">
</div>
<div class="form-group m-form__group">
<input class="form-control m-input m-login__form-input--last" type="password" placeholder="Confirm Password" name="rpassword" [(ngModel)]="model.rpassword" #rpassword="ngModel">
</div>
<div class="row form-group m-form__group m-login__form-sub">
<div class="col m--align-left">
<label class="m-checkbox m-checkbox--focus">
<input type="checkbox" name="agree" [(ngModel)]="model.agree" #agree="ngModel">
I Agree the
<a href="#" class="m-link m-link--focus">
terms and conditions
</a>
.
<span></span>
</label>
<span class="m-form__help"></span>
</div>
</div>
<div class="m-login__form-action">
<button [disabled]="loading" [ngClass]="{'m-loader m-loader--right m-loader--light': loading}" id="m_login_signup_submit" class="btn btn-focus m-btn m-btn--pill m-btn--custom m-btn--air">
Sign Up
</button>
<button [disabled]="loading" id="m_login_signup_cancel" class="btn btn-outline-focus m-btn m-btn--pill m-btn--custom">
Cancel
</button>
</div>
</form>
</div>
<div class="m-login__forget-password">
<div class="m-login__head">
<h3 class="m-login__title">
Forgotten Password ?
</h3>
<div class="m-login__desc">
Enter your email to reset your password:
</div>
</div>
<form (ngSubmit)="f.form.valid && forgotPass()" #f="ngForm" class="m-login__form m-form" action="">
<ng-template #alertForgotPass></ng-template>
<div class="form-group m-form__group">
<input class="form-control m-input" type="text" placeholder="Email" name="email" [(ngModel)]="model.email" #email="ngModel" id="m_email" autocomplete="off">
</div>
<div class="m-login__form-action">
<button [disabled]="loading" [ngClass]="{'m-loader m-loader--right m-loader--light': loading}" id="m_login_forget_password_submit" class="btn btn-focus m-btn m-btn--pill m-btn--custom m-btn--air">
Request
</button>
<button [disabled]="loading" id="m_login_forget_password_cancel" class="btn btn-outline-focus m-btn m-btn--pill m-btn--custom">
Cancel
</button>
</div>
</form>
</div>
</div>
</div>
<div class="m-stack__item m-stack__item--center">
<div class="m-login__account">
<span class="m-login__account-msg">
Don't have an account yet ?
</span>
&nbsp;&nbsp;
<a href="javascript:;" id="m_login_signup" class="m-link m-link--focus m-login__account-link">
Sign Up
</a>
</div>
</div>
</div>
</div>
<div class="m-grid__item m-grid__item--fluid m-grid m-grid--center m-grid--hor m-grid__item--order-tablet-and-mobile-1 m-login__content" style="background-image: url(./assets/app/media/img//bg/bg-4.jpg)">
<div class="m-grid__item m-grid__item--middle">
<h3 class="m-login__welcome">
Join Our Community
</h3>
<p class="m-login__msg">
Lorem ipsum dolor sit amet, coectetuer adipiscing
<br>
elit sed diam nonummy et nibh euismod
</p>
</div>
</div>
</div>
import * as $ from "jquery";
export class Helpers {
static loadStyles(tag, src) {
if (Array.isArray(src)) {
$.each(src, function(k, s) {
$(tag).append($('<link/>').attr('href', s).attr('rel', 'stylesheet').attr('type', 'text/css'));
});
} else {
$(tag).append($('<link/>').attr('href', src).attr('rel', 'stylesheet').attr('type', 'text/css'));
}
}
static unwrapTag(element) {
$(element).removeAttr('appunwraptag').unwrap();
}
/**
* Set title markup
* @param title
*/
static setTitle(title) {
$('.m-subheader__title').text(title);
}
/**
* Breadcrumbs markup
* @param breadcrumbs
*/
static setBreadcrumbs(breadcrumbs) {
if (breadcrumbs) $('.m-subheader__title').addClass('m-subheader__title--separator');
let ul = $('.m-subheader__breadcrumbs');
if ($(ul).length === 0) {
ul = $('<ul/>').addClass('m-subheader__breadcrumbs m-nav m-nav--inline')
.append($('<li/>').addClass('m-nav__item')
.append($('<a/>').addClass('m-nav__link m-nav__link--icon')
.append($('<i/>').addClass('m-nav__link-icon la la-home'))));
}
$(ul).find('li:not(:first-child)').remove();
$.each(breadcrumbs, function(k, v) {
let li = $('<li/>').addClass('m-nav__item')
.append($('<a/>').addClass('m-nav__link m-nav__link--icon').attr('routerLink', v.href).attr('title', v.title)
.append($('<span/>').addClass('m-nav__link-text').text(v.text)));
$(ul).append($('<li/>').addClass('m-nav__separator').text('-')).append(li);
});
$('.m-subheader .m-stack__item:first-child').append(ul);
}
static setLoading(enable) {
let body = $('body');
if (enable) {
$(body).addClass('m-page--loading-non-block')
} else {
$(body).removeClass('m-page--loading-non-block')
}
}
static bodyClass(strClass) {
$('body').attr('class', strClass);
}
}
\ No newline at end of file
<!-- BEGIN: Left Aside -->
<button class="m-aside-left-close m-aside-left-close--skin-dark" id="m_aside_left_close_btn" appunwraptag="">
<i class="la la-close"></i>
</button>
<div id="m_aside_left" class="m-grid__item m-aside-left m-aside-left--skin-dark">
<!-- BEGIN: Aside Menu -->
<div id="m_ver_menu" class="m-aside-menu m-aside-menu--skin-dark m-aside-menu--submenu-skin-dark" data-menu-vertical="true" data-menu-scrollable="false" data-menu-dropdown-timeout="500" >
<ul class="m-menu__nav m-menu__nav--dropdown-submenu-arrow">
<!-- <li class="m-menu__item " routerLinkActive="m-menu__item--active" routerLinkActiveOptions="{ exact: true }" aria-haspopup="true" >
<a routerLink="/index" class="m-menu__link">
<i class="m-menu__link-icon flaticon-line-graph"></i>
<span class="m-menu__link-title">
<span class="m-menu__link-wrap">
<span class="m-menu__link-text">
数据平台
</span>
</span>
</span>
</a>
</li>
<li class="m-menu__section">
<h4 class="m-menu__section-text">
Angular
</h4>
<i class="m-menu__section-icon flaticon-more-v3"></i>
</li> -->
<li *ngFor="let _menu of meuns" class="m-menu__item m-menu__item--submenu" routerLinkActive="m-menu__item--active" routerLinkActiveOptions="{ exact: true }"
aria-haspopup="true" data-menu-submenu-toggle="hover" >
<a href="#" class="m-menu__link m-menu__toggle">
<i class="{{_menu.icon}}"></i>
<span class="m-menu__link-text">
{{_menu.title}}
</span>
<i class="m-menu__ver-arrow la la-angle-right"></i>
</a>
<div class="m-menu__submenu">
<span class="m-menu__arrow"></span>
<ul class="m-menu__subnav">
<li class="m-menu__item m-menu__item--parent" routerLinkActive="m-menu__item--active" routerLinkActiveOptions="{ exact: true }"
aria-haspopup="true">
<a href="#" class="m-menu__link">
<span class="m-menu__link-text">
{{_menu.title}}
</span>
</a>
</li>
<li *ngFor="let _chilMenu of _menu.childrens " class="m-menu__item" routerLinkActive="m-menu__item--active" routerLinkActiveOptions="{ exact: true }" aria-haspopup="true">
<a [routerLink]="_chilMenu.path" class="m-menu__link">
<i class="m-menu__link-bullet m-menu__link-bullet--dot">
<span></span>
</i>
<span class="m-menu__link-text">
{{ _chilMenu.title }}
</span>
</a>
</li>
</ul>
</div>
</li>
</ul>
</div>
<!-- END: Aside Menu -->
</div>
<!-- END: Left Aside -->
import { Component, OnInit, ViewEncapsulation, AfterViewInit } from '@angular/core';
import { Helpers } from '../../../helpers';
declare let mLayout: any;
// 具体的侧边栏导航的menu在这里配置
@Component({
selector: "app-aside-nav",
templateUrl: "./aside-nav.component.html",
encapsulation: ViewEncapsulation.None,
})
export class AsideNavComponent implements OnInit, AfterViewInit {
meuns = [];
constructor() {
}
ngOnInit() {
var menu = function(title, icon, path, children) {
this.title = title || "";
this.icon = icon || "";
this.path = path || "";
this.childrens = children || [];
}
menu.prototype = {
addChildren: function(item) {
this.childrens.push(item);
}
}
let _MainMenus = [];
let _ControlMenus = new menu("控制台", "m-menu__link-icon flaticon-diagram", null, null);
let _OptionMenus = new menu("MOCK管理", "m-menu__link-icon flaticon-interface-7", null, null);
_MainMenus.push(_ControlMenus);
_ControlMenus.addChildren(new menu("设备视角", null, "/control/device", null));
// _ControlMenus.addChildren(new menu("设备视角", null, "/manager/project", null));
_MainMenus.push(_OptionMenus);
_OptionMenus.addChildren(new menu("项目管理", null, "/manager/project", null));
_OptionMenus.addChildren(new menu("加密管理", null, "/manager/endecode", null));
_OptionMenus.addChildren(new menu("设备管理", null, "/manager/device", null));
_OptionMenus.addChildren(new menu("require管理", null, "/manager/require", null));
this.meuns = _MainMenus;
}
ngAfterViewInit() {
mLayout.initAside();
let menu = mLayout.getAsideMenu(); let item = $(menu).find('a[href="' + window.location.pathname + '"]').parent('.m-menu__item'); (<any>$(menu).data('menu')).setActiveItem(item);
}
}
\ No newline at end of file
<!-- begin::Footer -->
<footer class="m-grid__item m-footer" appunwraptag="">
<div class="m-container m-container--fluid m-container--full-height m-page__container">
<div class="m-stack m-stack--flex-tablet-and-mobile m-stack--ver m-stack--desktop">
<div class="m-stack__item m-stack__item--left m-stack__item--middle m-stack__item--last">
<span class="m-footer__copyright">
2017 &copy; Metronic theme by
<a href="#" class="m-link">
Keenthemes
</a>
</span>
</div>
<div class="m-stack__item m-stack__item--right m-stack__item--middle m-stack__item--first">
<ul class="m-footer__nav m-nav m-nav--inline m--pull-right">
<li class="m-nav__item">
<a href="#" class="m-nav__link">
<span class="m-nav__link-text">
About
</span>
</a>
</li>
<li class="m-nav__item">
<a href="#" class="m-nav__link">
<span class="m-nav__link-text">
Privacy
</span>
</a>
</li>
<li class="m-nav__item">
<a href="#" class="m-nav__link">
<span class="m-nav__link-text">
T&C
</span>
</a>
</li>
<li class="m-nav__item">
<a href="#" class="m-nav__link">
<span class="m-nav__link-text">
Purchase
</span>
</a>
</li>
<li class="m-nav__item m-nav__item">
<a href="#" class="m-nav__link" data-toggle="m-tooltip" title="Support Center" data-placement="left">
<i class="m-nav__link-icon flaticon-info m--icon-font-size-lg3"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
</footer>
<!-- end::Footer -->
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Helpers } from '../../../helpers';
@Component({
selector: "app-footer",
templateUrl: "./footer.component.html",
encapsulation: ViewEncapsulation.None,
})
export class FooterComponent implements OnInit {
constructor() {
}
ngOnInit() {
}
}
\ No newline at end of file
import { Component, OnInit, ViewEncapsulation, AfterViewInit } from '@angular/core';
import { Helpers } from '../../../helpers';
declare let mLayout: any;
@Component({
selector: "app-header-nav",
templateUrl: "./header-nav.component.html",
encapsulation: ViewEncapsulation.None,
})
export class HeaderNavComponent implements OnInit, AfterViewInit {
constructor() {
}
ngOnInit() {
}
ngAfterViewInit() {
mLayout.initHeader();
}
}
\ No newline at end of file
import { NgModule } from '@angular/core';
import { LayoutComponent } from './layout/layout.component';
// import { AsideLeftMinimizeDefaultEnabledComponent } from '../pages/aside-left-minimize-default-enabled/aside-left-minimize-default-enabled.component';
import { HeaderNavComponent } from './header-nav/header-nav.component';
import { PagesComponent } from '../pages/pages.component';
import { AsideNavComponent } from './aside-nav/aside-nav.component';
import { FooterComponent } from './footer/footer.component';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { HrefPreventDefaultDirective } from '../../_directives/href-prevent-default.directive';
import { UnwrapTagDirective } from '../../_directives/unwrap-tag.directive';
@NgModule({
declarations: [
LayoutComponent,
HeaderNavComponent,
// AsideLeftMinimizeDefaultEnabledComponent,
PagesComponent,
AsideNavComponent,
FooterComponent,
HrefPreventDefaultDirective,
UnwrapTagDirective,
],
exports: [
LayoutComponent,
HeaderNavComponent,
// AsideLeftMinimizeDefaultEnabledComponent,
PagesComponent,
AsideNavComponent,
FooterComponent,
HrefPreventDefaultDirective,
],
imports: [
CommonModule,
RouterModule,
]
})
export class LayoutModule {
}
\ No newline at end of file
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Helpers } from '../../../helpers';
@Component({
selector: ".m-grid.m-grid--hor.m-grid--root.m-page",
templateUrl: "./layout.component.html",
encapsulation: ViewEncapsulation.None,
})
export class LayoutComponent implements OnInit {
constructor() {
}
ngOnInit() {
}
}
\ No newline at end of file
<!-- BEGIN: Subheader -->
<div class="m-subheader">
<div class="d-flex align-items-center">
<div class="mr-auto">
<h3 class="m-subheader__title m-subheader__title--separator">
项目管理
</h3>
<ul class="m-subheader__breadcrumbs m-nav m-nav--inline">
<li class="m-nav__item m-nav__item--home">
<a href="#" class="m-nav__link m-nav__link--icon">
<i class="m-nav__link-icon la la-home"></i>
</a>
</li>
<li class="m-nav__separator">
-
</li>
<li class="m-nav__item">
<a href="" class="m-nav__link">
<span class="m-nav__link-text">
MOCK管理
</span>
</a>
</li>
<li class="m-nav__separator">
-
</li>
<li class="m-nav__item">
<a href="" class="m-nav__link">
<span class="m-nav__link-text">
项目管理
</span>
</a>
</li>
</ul>
</div>
<div>
<div class="m-dropdown m-dropdown--inline m-dropdown--arrow m-dropdown--align-right m-dropdown--align-push" data-dropdown-toggle="hover"
aria-expanded="true">
<a href="#" class="m-portlet__nav-link btn btn-lg btn-secondary m-btn m-btn--outline-2x m-btn--air m-btn--icon m-btn--icon-only m-btn--pill m-dropdown__toggle">
<i class="la la-plus m--hide"></i>
<i class="la la-ellipsis-h"></i>
</a>
<div class="m-dropdown__wrapper">
<span class="m-dropdown__arrow m-dropdown__arrow--right m-dropdown__arrow--adjust"></span>
<div class="m-dropdown__inner">
<div class="m-dropdown__body">
<div class="m-dropdown__content">
<ul class="m-nav">
<li class="m-nav__section m-nav__section--first m--hide">
<span class="m-nav__section-text">
Quick Actions
</span>
</li>
<li class="m-nav__item">
<a href="" class="m-nav__link">
<i class="m-nav__link-icon flaticon-share"></i>
<span class="m-nav__link-text">
创建项目
</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="m-content">
<div class="row">
<div class="col-xl-12">
<div class="m-portlet">
<div class="m-section">
<div class="m-section__content">
<table class="table m-table m-table--head-separator-primary">
<thead>
<tr>
<th>
#
</th>
<th>
项目名称
</th>
<th style="width:7em">
默认项目
</th>
<th style="width:7em">
删除项目
</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let pro of projects; let i = index;">
<th scope="row">
{{i}}
</th>
<td>
<span class="m-list-timeline__text">
<a href="#" class="m-link" [routerLink]="['/manager/url', pro._id ]">
{{pro.name}}
</a>
</span>
</td>
<td>
{{pro.is_default | isDefaultPipe}}
</td>
<td>
<a href="#" class="btn btn-outline-danger m-btn btn-sm m-btn--icon m-btn--outline-2x" (click)="onSelectPro(pro)" data-target="#deleteProject">
<span>
<i class="fa fa-warning"></i>
<span>
删除
</span>
</span>
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<!--end::Modal-->
<!--begin::Modal-->
<div class="modal fade" id="deleteProject" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-sm" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">
删除项目
</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">
&times;
</span>
</button>
</div>
<div class="modal-body">
<div class="alert alert-danger" role="alert">
<strong>
警告!
</strong>
危险操作,请输入密码确认删除
</div>
<div class="form-group">
<label for="pwd" class="form-control-label">
Key:
</label>
<input class="form-control form-control-lg m-input" id="pwd" placeholder="删除码" [(ngModel)]="pwd">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">
取消
</button>
<button type="button" class="btn btn-primary" (click)="onDeleteProject(pwd)">
确认删除
</button>
</div>
</div>
</div>
</div>
<!--end::Modal-->
\ No newline at end of file
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Helpers } from '../../../../helpers';
import { HttpClient } from '@angular/common/http';
import { GlobalService } from '../../../../_services/global.service';
@Component({
selector: '.m-grid__item.m-grid__item--fluid.m-wrapper',
templateUrl: './project.component.html',
encapsulation: ViewEncapsulation.None,
providers: [GlobalService],
styles: []
})
export class ProjectComponent implements OnInit {
constructor(private http: HttpClient, private global: GlobalService) { }
public projects: any;
public pwd: String;
currentProject: any;
onSelectProject(pro){
}
onSelectPro(pro){
this.currentProject = pro;
}
onDeleteProject(pwd){
console.log(this.currentProject, pwd);
}
ngOnInit() {
console.log( this.global.bpServerHost );
this.http.get(`http://${this.global.bpServerHost}/project/server/query`).subscribe(
data => {
this.projects = data;
// console.log(data);
},
err => {
console.log("Error occured.")
}
);
}
}
\ No newline at end of file
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Routes, RouterModule } from '@angular/router';
import { LayoutModule } from '../../../layouts/layout.module';
import { PagesComponent } from '../../pages.component';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { IsDefaultPipe } from '../../../../_c_pipes/is-default.pipe';
import { ProjectComponent } from './project.component';
const routes: Routes = [
{
"path": "",
"component": PagesComponent,
"children": [
{
"path": "",
"component": ProjectComponent
}
]
}
];
@NgModule({
imports: [
CommonModule,
RouterModule.forChild(routes),
LayoutModule,
FormsModule,
ReactiveFormsModule
], exports: [
RouterModule
], declarations: [
ProjectComponent,
IsDefaultPipe
]
})
export class ProjectModule {
}
\ No newline at end of file
import { Component, OnInit, ViewEncapsulation} from '@angular/core';
import { Helpers } from '../../../../helpers';
import { HttpClient, HttpParams } from '@angular/common/http';
import { GlobalService } from '../../../../_services/global.service';
import { ScriptLoaderService } from '../../../../_services/script-loader.service';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: '.m-grid__item.m-grid__item--fluid.m-wrapper',
templateUrl: './url.component.html',
providers: [GlobalService],
styles: []
})
export class UrlComponent implements OnInit {
constructor(
private http: HttpClient,
private global: GlobalService,
private route: ActivatedRoute,
private _script: ScriptLoaderService
) { }
tags: any;
urls: any;
projectId: any;
pwd: String;
onSelectUrl(url){
}
onDeleteUrl(pwd){
}
ngOnInit() {
let projectId = this.route.snapshot.params['_id'];
console.log(projectId);
let params = new HttpParams();
params = params.append('_id', projectId);
this.http.get(`http://${this.global.bpServerHost}/tag/server/query`, { params: params }).subscribe(
data => {
this.tags = data;
// console.log(data);
},
err => {
console.log("Error occured.")
}
);
}
onOpenIde(url) {
}
ngAfterViewInit() {
this._script.load('.m-grid__item.m-grid__item--fluid.m-wrapper',
'assets/demo/default/custom/components/datatables/child/data-ajax.js');
}
}
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Routes, RouterModule } from '@angular/router';
import { UrlComponent } from './url.component';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { PagesComponent } from '../../pages.component';
import { LayoutModule } from '../../../layouts/layout.module';
const routes: Routes = [
{
"path": "",
"component": PagesComponent,
"children": [
{
"path": "",
"component": UrlComponent
}
]
}
];
@NgModule({
imports: [
CommonModule,
RouterModule.forChild(routes),
LayoutModule,
FormsModule,
ReactiveFormsModule
], exports: [
RouterModule
], declarations: [
UrlComponent
]
})
export class UrlModule { }
import { Component, OnInit, ViewEncapsulation, AfterViewInit } from '@angular/core';
import { Helpers } from '../../../helpers';
import { ScriptLoaderService } from '../../../_services/script-loader.service';
@Component({
selector: ".m-grid__item.m-grid__item--fluid.m-wrapper",
templateUrl: "./home.component.html",
encapsulation: ViewEncapsulation.None,
})
export class HomeComponent implements OnInit, AfterViewInit {
constructor(private _script: ScriptLoaderService) {
}
ngOnInit() {
}
ngAfterViewInit() {
this._script.load('.m-grid__item.m-grid__item--fluid.m-wrapper',
'assets/app/js/dashboard.js');
}
}
\ No newline at end of file
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './home.component';
import { LayoutModule } from '../../layouts/layout.module';
import { PagesComponent } from '../pages.component';
const routes: Routes = [
{
"path": "",
"component": PagesComponent,
"children": [
{
"path": "",
"component": HomeComponent
}
]
}
];
@NgModule({
imports: [
CommonModule, RouterModule.forChild(routes), LayoutModule
], exports: [
RouterModule
], declarations: [
HomeComponent
]
})
export class HomeModule {
}
\ No newline at end of file
<div class="m-subheader">
<div class="d-flex align-items-center">
<div class="mr-auto">
<h3 class="m-subheader__title m-subheader__title--separator">
Dashboard
</h3>
<ul class="m-subheader__breadcrumbs m-nav m-nav--inline">
<li class="m-nav__item m-nav__item--home">
<a href="#" class="m-nav__link m-nav__link--icon">
<i class="m-nav__link-icon la la-home"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<!-- END: Subheader -->
<div class="m-content">
<div>
404 Not Found!
</div>
</div>
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
@Component({
selector: '.m-wrapper',
templateUrl: './not-found.component.html',
encapsulation: ViewEncapsulation.None,
})
export class NotFoundComponent implements OnInit {
constructor() {
}
ngOnInit() {
}
}
\ No newline at end of file
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Routes, RouterModule } from '@angular/router';
import { LayoutModule } from '../../layouts/layout.module';
import { PagesComponent } from '../pages.component';
import { NotFoundComponent } from './not-found.component';
const routes: Routes = [
{
'path': '',
'component': PagesComponent,
'children': [
{
'path': '',
'component': NotFoundComponent,
},
],
},
];
@NgModule({
imports: [
CommonModule, RouterModule.forChild(routes), LayoutModule,
], exports: [
RouterModule,
], declarations: [
NotFoundComponent,
],
})
export class NotFoundModule {
}
\ No newline at end of file
<app-aside-nav></app-aside-nav>
<router-outlet></router-outlet>
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Helpers } from '../../helpers';
import { ScriptLoaderService } from '../../_services/script-loader.service';
@Component({
selector: ".m-grid__item.m-grid__item--fluid.m-grid.m-grid--ver-desktop.m-grid--desktop.m-body",
templateUrl: "./pages.component.html",
encapsulation: ViewEncapsulation.None,
})
export class PagesComponent implements OnInit {
constructor() {
}
ngOnInit() {
}
}
\ No newline at end of file
import { NgModule } from '@angular/core';
import { ThemeComponent } from './theme.component';
import { Routes, RouterModule } from '@angular/router';
import { AuthGuard } from "../auth/_guards/auth.guard";
const routes: Routes = [
{
"path": "",
"component": ThemeComponent,
"canActivate": [AuthGuard],
"children": [
{
"path": "home",
"loadChildren": ".\/pages\/home/home.module#HomeModule"
},
{
"path": "manager\/project",
"loadChildren": ".\/pages\/components\/project/project.module#ProjectModule"
},
{
"path": "manager\/url\/:_id",
"loadChildren": ".\/pages\/components\/url/url.module#UrlModule"
},
{
"path": "404",
"loadChildren": ".\/pages\/not-found\/not-found.module#NotFoundModule"
},
{
"path": "",
"redirectTo": "home",
"pathMatch": "full"
}
]
},
{
"path": "**",
"redirectTo": "404",
"pathMatch": "full"
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class ThemeRoutingModule { }
\ No newline at end of file
<app-header-nav></app-header-nav>
<!-- begin::Body -->
<router-outlet></router-outlet>
<!-- end:: Body -->
<app-footer></app-footer>
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Router, NavigationStart, NavigationEnd } from '@angular/router';
import { Helpers } from '../helpers';
import { ScriptLoaderService } from '../_services/script-loader.service';
declare let mApp: any;
declare let mUtil: any;
declare let mLayout: any;
@Component({
selector: ".m-grid.m-grid--hor.m-grid--root.m-page",
templateUrl: "./theme.component.html",
encapsulation: ViewEncapsulation.None,
})
export class ThemeComponent implements OnInit {
constructor(private _script: ScriptLoaderService, private _router: Router) {
}
ngOnInit() {
this._script.load('body', 'assets/vendors/base/vendors.bundle.js', 'assets/demo/default/base/scripts.bundle.js')
.then(result => {
Helpers.setLoading(false);
// optional js to be loaded once
this._script.load('head', 'assets/vendors/custom/fullcalendar/fullcalendar.bundle.js');
});
this._router.events.subscribe((route) => {
if (route instanceof NavigationStart) {
(<any>mLayout).closeMobileAsideMenuOffcanvas();
(<any>mLayout).closeMobileHorMenuOffcanvas();
(<any>mApp).scrollTop();
Helpers.setLoading(true);
// hide visible popover
(<any>$('[data-toggle="m-popover"]')).popover('hide');
}
if (route instanceof NavigationEnd) {
// init required js
(<any>mApp).init();
(<any>mUtil).init();
Helpers.setLoading(false);
// content m-wrapper animation
let animation = 'm-animate-fade-in-up';
$('.m-wrapper').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(e) {
$('.m-wrapper').removeClass(animation);
}).removeClass(animation).addClass(animation);
}
});
}
}
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 56 56" style="enable-background:new 0 0 56 56;" xml:space="preserve">
<g>
<path style="fill:#E9E9E0;" d="M36.985,0H7.963C7.155,0,6.5,0.655,6.5,1.926V55c0,0.345,0.655,1,1.463,1h40.074
c0.808,0,1.463-0.655,1.463-1V12.978c0-0.696-0.093-0.92-0.257-1.085L37.607,0.257C37.442,0.093,37.218,0,36.985,0z"/>
<polygon style="fill:#D9D7CA;" points="37.5,0.151 37.5,12 49.349,12 "/>
<path style="fill:#0096E6;" d="M48.037,56H7.963C7.155,56,6.5,55.345,6.5,54.537V39h43v15.537C49.5,55.345,48.845,56,48.037,56z"/>
<g>
<path style="fill:#FFFFFF;" d="M23.58,51.975c-0.374,0.364-0.798,0.638-1.271,0.82s-0.984,0.273-1.531,0.273
c-0.602,0-1.155-0.109-1.661-0.328s-0.948-0.542-1.326-0.971s-0.675-0.966-0.889-1.613c-0.214-0.647-0.321-1.395-0.321-2.242
s0.107-1.593,0.321-2.235c0.214-0.643,0.511-1.178,0.889-1.606s0.822-0.754,1.333-0.978s1.062-0.335,1.654-0.335
c0.547,0,1.058,0.091,1.531,0.273s0.897,0.456,1.271,0.82l-1.135,1.012c-0.228-0.265-0.48-0.456-0.759-0.574
s-0.567-0.178-0.868-0.178c-0.337,0-0.658,0.063-0.964,0.191s-0.579,0.344-0.82,0.649s-0.431,0.699-0.567,1.183
s-0.21,1.075-0.219,1.777c0.009,0.684,0.08,1.267,0.212,1.75s0.314,0.877,0.547,1.183s0.497,0.528,0.793,0.67
s0.608,0.212,0.937,0.212s0.636-0.06,0.923-0.178s0.549-0.31,0.786-0.574L23.58,51.975z"/>
<path style="fill:#FFFFFF;" d="M31.633,50.238c0,0.364-0.075,0.718-0.226,1.06s-0.362,0.643-0.636,0.902s-0.61,0.467-1.012,0.622
s-0.856,0.232-1.367,0.232c-0.219,0-0.444-0.012-0.677-0.034s-0.467-0.062-0.704-0.116s-0.463-0.13-0.677-0.226
s-0.398-0.212-0.554-0.349l0.287-1.176c0.128,0.073,0.289,0.144,0.485,0.212s0.398,0.132,0.608,0.191s0.419,0.107,0.629,0.144
s0.405,0.055,0.588,0.055c0.556,0,0.982-0.13,1.278-0.39s0.444-0.645,0.444-1.155c0-0.31-0.104-0.574-0.314-0.793
s-0.472-0.417-0.786-0.595s-0.654-0.355-1.019-0.533s-0.706-0.388-1.025-0.629s-0.583-0.526-0.793-0.854s-0.314-0.738-0.314-1.23
c0-0.446,0.082-0.843,0.246-1.189s0.385-0.641,0.663-0.882s0.602-0.426,0.971-0.554s0.759-0.191,1.169-0.191
c0.419,0,0.843,0.039,1.271,0.116s0.774,0.203,1.039,0.376c-0.055,0.118-0.118,0.248-0.191,0.39s-0.142,0.273-0.205,0.396
c-0.063,0.123-0.118,0.226-0.164,0.308s-0.073,0.128-0.082,0.137c-0.055-0.027-0.116-0.063-0.185-0.109s-0.166-0.091-0.294-0.137
s-0.296-0.077-0.506-0.096s-0.479-0.014-0.807,0.014c-0.183,0.019-0.355,0.07-0.52,0.157s-0.31,0.193-0.438,0.321
s-0.228,0.271-0.301,0.431s-0.109,0.313-0.109,0.458c0,0.364,0.104,0.658,0.314,0.882s0.47,0.419,0.779,0.588
s0.647,0.333,1.012,0.492s0.704,0.354,1.019,0.581s0.576,0.513,0.786,0.854S31.633,49.7,31.633,50.238z"/>
<path style="fill:#FFFFFF;" d="M39.043,50.238c0,0.364-0.075,0.718-0.226,1.06s-0.362,0.643-0.636,0.902s-0.61,0.467-1.012,0.622
s-0.856,0.232-1.367,0.232c-0.219,0-0.444-0.012-0.677-0.034s-0.467-0.062-0.704-0.116s-0.463-0.13-0.677-0.226
s-0.398-0.212-0.554-0.349l0.287-1.176c0.128,0.073,0.289,0.144,0.485,0.212s0.398,0.132,0.608,0.191s0.419,0.107,0.629,0.144
s0.405,0.055,0.588,0.055c0.556,0,0.982-0.13,1.278-0.39s0.444-0.645,0.444-1.155c0-0.31-0.104-0.574-0.314-0.793
s-0.472-0.417-0.786-0.595s-0.654-0.355-1.019-0.533s-0.706-0.388-1.025-0.629s-0.583-0.526-0.793-0.854s-0.314-0.738-0.314-1.23
c0-0.446,0.082-0.843,0.246-1.189s0.385-0.641,0.663-0.882s0.602-0.426,0.971-0.554s0.759-0.191,1.169-0.191
c0.419,0,0.843,0.039,1.271,0.116s0.774,0.203,1.039,0.376c-0.055,0.118-0.118,0.248-0.191,0.39s-0.142,0.273-0.205,0.396
s-0.118,0.226-0.164,0.308s-0.073,0.128-0.082,0.137c-0.055-0.027-0.116-0.063-0.185-0.109s-0.166-0.091-0.294-0.137
s-0.296-0.077-0.506-0.096s-0.479-0.014-0.807,0.014c-0.183,0.019-0.355,0.07-0.52,0.157s-0.31,0.193-0.438,0.321
s-0.228,0.271-0.301,0.431s-0.109,0.313-0.109,0.458c0,0.364,0.104,0.658,0.314,0.882s0.47,0.419,0.779,0.588
s0.647,0.333,1.012,0.492s0.704,0.354,1.019,0.581s0.576,0.513,0.786,0.854S39.043,49.7,39.043,50.238z"/>
</g>
<g>
<path style="fill:#0096E6;" d="M19.5,19v-4c0-0.551,0.448-1,1-1c0.553,0,1-0.448,1-1s-0.447-1-1-1c-1.654,0-3,1.346-3,3v4
c0,1.103-0.897,2-2,2c-0.553,0-1,0.448-1,1s0.447,1,1,1c1.103,0,2,0.897,2,2v4c0,1.654,1.346,3,3,3c0.553,0,1-0.448,1-1
s-0.447-1-1-1c-0.552,0-1-0.449-1-1v-4c0-1.2-0.542-2.266-1.382-3C18.958,21.266,19.5,20.2,19.5,19z"/>
<path style="fill:#0096E6;" d="M39.5,21c-1.103,0-2-0.897-2-2v-4c0-1.654-1.346-3-3-3c-0.553,0-1,0.448-1,1s0.447,1,1,1
c0.552,0,1,0.449,1,1v4c0,1.2,0.542,2.266,1.382,3c-0.84,0.734-1.382,1.8-1.382,3v4c0,0.551-0.448,1-1,1c-0.553,0-1,0.448-1,1
s0.447,1,1,1c1.654,0,3-1.346,3-3v-4c0-1.103,0.897-2,2-2c0.553,0,1-0.448,1-1S40.053,21,39.5,21z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 56 56" style="enable-background:new 0 0 56 56;" xml:space="preserve">
<g>
<path style="fill:#E9E9E0;" d="M36.985,0H7.963C7.155,0,6.5,0.655,6.5,1.926V55c0,0.345,0.655,1,1.463,1h40.074
c0.808,0,1.463-0.655,1.463-1V12.978c0-0.696-0.093-0.92-0.257-1.085L37.607,0.257C37.442,0.093,37.218,0,36.985,0z"/>
<polygon style="fill:#D9D7CA;" points="37.5,0.151 37.5,12 49.349,12 "/>
<path style="fill:#F36FA0;" d="M48.037,56H7.963C7.155,56,6.5,55.345,6.5,54.537V39h43v15.537C49.5,55.345,48.845,56,48.037,56z"/>
<g>
<path style="fill:#FFFFFF;" d="M21.58,51.975c-0.374,0.364-0.798,0.638-1.271,0.82c-0.474,0.183-0.984,0.273-1.531,0.273
c-0.602,0-1.155-0.109-1.661-0.328s-0.948-0.542-1.326-0.971c-0.378-0.429-0.675-0.966-0.889-1.613
c-0.214-0.647-0.321-1.395-0.321-2.242s0.107-1.593,0.321-2.235c0.214-0.643,0.51-1.178,0.889-1.606
c0.378-0.429,0.822-0.754,1.333-0.978c0.51-0.224,1.062-0.335,1.654-0.335c0.547,0,1.057,0.091,1.531,0.273
c0.474,0.183,0.897,0.456,1.271,0.82l-1.135,1.012c-0.228-0.265-0.481-0.456-0.759-0.574c-0.278-0.118-0.567-0.178-0.868-0.178
c-0.337,0-0.659,0.063-0.964,0.191c-0.306,0.128-0.579,0.344-0.82,0.649c-0.242,0.306-0.431,0.699-0.567,1.183
s-0.21,1.075-0.219,1.777c0.009,0.684,0.08,1.267,0.212,1.75c0.132,0.483,0.314,0.877,0.547,1.183s0.497,0.528,0.793,0.67
c0.296,0.142,0.608,0.212,0.937,0.212s0.636-0.06,0.923-0.178s0.549-0.31,0.786-0.574L21.58,51.975z"/>
<path style="fill:#FFFFFF;" d="M29.633,50.238c0,0.364-0.075,0.718-0.226,1.06s-0.362,0.643-0.636,0.902s-0.611,0.467-1.012,0.622
c-0.401,0.155-0.857,0.232-1.367,0.232c-0.219,0-0.444-0.012-0.677-0.034s-0.467-0.062-0.704-0.116
c-0.237-0.055-0.463-0.13-0.677-0.226c-0.214-0.096-0.399-0.212-0.554-0.349l0.287-1.176c0.127,0.073,0.289,0.144,0.485,0.212
c0.196,0.068,0.398,0.132,0.608,0.191c0.209,0.06,0.419,0.107,0.629,0.144c0.209,0.036,0.405,0.055,0.588,0.055
c0.556,0,0.982-0.13,1.278-0.39c0.296-0.26,0.444-0.645,0.444-1.155c0-0.31-0.105-0.574-0.314-0.793
c-0.21-0.219-0.472-0.417-0.786-0.595s-0.654-0.355-1.019-0.533c-0.365-0.178-0.707-0.388-1.025-0.629
c-0.319-0.241-0.583-0.526-0.793-0.854c-0.21-0.328-0.314-0.738-0.314-1.23c0-0.446,0.082-0.843,0.246-1.189
s0.385-0.641,0.663-0.882c0.278-0.241,0.602-0.426,0.971-0.554s0.759-0.191,1.169-0.191c0.419,0,0.843,0.039,1.271,0.116
c0.428,0.077,0.774,0.203,1.039,0.376c-0.055,0.118-0.119,0.248-0.191,0.39c-0.073,0.142-0.142,0.273-0.205,0.396
c-0.064,0.123-0.119,0.226-0.164,0.308c-0.046,0.082-0.073,0.128-0.082,0.137c-0.055-0.027-0.116-0.063-0.185-0.109
s-0.167-0.091-0.294-0.137c-0.128-0.046-0.296-0.077-0.506-0.096c-0.21-0.019-0.479-0.014-0.807,0.014
c-0.183,0.019-0.355,0.07-0.52,0.157s-0.31,0.193-0.438,0.321c-0.128,0.128-0.228,0.271-0.301,0.431
c-0.073,0.159-0.109,0.313-0.109,0.458c0,0.364,0.104,0.658,0.314,0.882c0.209,0.224,0.469,0.419,0.779,0.588
c0.31,0.169,0.647,0.333,1.012,0.492c0.364,0.159,0.704,0.354,1.019,0.581s0.576,0.513,0.786,0.854
C29.528,49.261,29.633,49.7,29.633,50.238z"/>
<path style="fill:#FFFFFF;" d="M34.035,53.055l-3.131-10.131h1.873l2.338,8.695l2.475-8.695h1.859l-3.281,10.131H34.035z"/>
</g>
<path style="fill:#C8BDB8;" d="M23.5,16v-4h-12v4v2v2v2v2v2v2v2v4h10h2h21v-4v-2v-2v-2v-2v-2v-4H23.5z M13.5,14h8v2h-8V14z
M13.5,18h8v2h-8V18z M13.5,22h8v2h-8V22z M13.5,26h8v2h-8V26z M21.5,32h-8v-2h8V32z M42.5,32h-19v-2h19V32z M42.5,28h-19v-2h19V28
z M42.5,24h-19v-2h19V24z M23.5,20v-2h19v2H23.5z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 56 56" style="enable-background:new 0 0 56 56;" xml:space="preserve">
<g>
<path style="fill:#E9E9E0;" d="M36.985,0H7.963C7.155,0,6.5,0.655,6.5,1.926V55c0,0.345,0.655,1,1.463,1h40.074
c0.808,0,1.463-0.655,1.463-1V12.978c0-0.696-0.093-0.92-0.257-1.085L37.607,0.257C37.442,0.093,37.218,0,36.985,0z"/>
<polygon style="fill:#D9D7CA;" points="37.5,0.151 37.5,12 49.349,12 "/>
<path style="fill:#8697CB;" d="M18.5,13h-6c-0.552,0-1-0.448-1-1s0.448-1,1-1h6c0.552,0,1,0.448,1,1S19.052,13,18.5,13z"/>
<path style="fill:#8697CB;" d="M21.5,18h-9c-0.552,0-1-0.448-1-1s0.448-1,1-1h9c0.552,0,1,0.448,1,1S22.052,18,21.5,18z"/>
<path style="fill:#8697CB;" d="M25.5,18c-0.26,0-0.52-0.11-0.71-0.29c-0.18-0.19-0.29-0.45-0.29-0.71c0-0.26,0.11-0.52,0.29-0.71
c0.37-0.37,1.05-0.37,1.42,0c0.18,0.19,0.29,0.45,0.29,0.71c0,0.26-0.11,0.52-0.29,0.71C26.02,17.89,25.76,18,25.5,18z"/>
<path style="fill:#8697CB;" d="M37.5,18h-8c-0.552,0-1-0.448-1-1s0.448-1,1-1h8c0.552,0,1,0.448,1,1S38.052,18,37.5,18z"/>
<path style="fill:#8697CB;" d="M12.5,33c-0.26,0-0.52-0.11-0.71-0.29c-0.18-0.19-0.29-0.45-0.29-0.71c0-0.26,0.11-0.52,0.29-0.71
c0.37-0.37,1.05-0.37,1.42,0c0.18,0.19,0.29,0.44,0.29,0.71c0,0.26-0.11,0.52-0.29,0.71C13.02,32.89,12.76,33,12.5,33z"/>
<path style="fill:#8697CB;" d="M24.5,33h-8c-0.552,0-1-0.448-1-1s0.448-1,1-1h8c0.552,0,1,0.448,1,1S25.052,33,24.5,33z"/>
<path style="fill:#8697CB;" d="M43.5,18h-2c-0.552,0-1-0.448-1-1s0.448-1,1-1h2c0.552,0,1,0.448,1,1S44.052,18,43.5,18z"/>
<path style="fill:#8697CB;" d="M34.5,23h-22c-0.552,0-1-0.448-1-1s0.448-1,1-1h22c0.552,0,1,0.448,1,1S35.052,23,34.5,23z"/>
<path style="fill:#8697CB;" d="M43.5,23h-6c-0.552,0-1-0.448-1-1s0.448-1,1-1h6c0.552,0,1,0.448,1,1S44.052,23,43.5,23z"/>
<path style="fill:#8697CB;" d="M16.5,28h-4c-0.552,0-1-0.448-1-1s0.448-1,1-1h4c0.552,0,1,0.448,1,1S17.052,28,16.5,28z"/>
<path style="fill:#8697CB;" d="M30.5,28h-10c-0.552,0-1-0.448-1-1s0.448-1,1-1h10c0.552,0,1,0.448,1,1S31.052,28,30.5,28z"/>
<path style="fill:#8697CB;" d="M43.5,28h-9c-0.552,0-1-0.448-1-1s0.448-1,1-1h9c0.552,0,1,0.448,1,1S44.052,28,43.5,28z"/>
<path style="fill:#0096E6;" d="M48.037,56H7.963C7.155,56,6.5,55.345,6.5,54.537V39h43v15.537C49.5,55.345,48.845,56,48.037,56z"/>
<g>
<path style="fill:#FFFFFF;" d="M23.5,47.682c0,0.829-0.089,1.538-0.267,2.126s-0.403,1.08-0.677,1.477s-0.581,0.709-0.923,0.937
s-0.672,0.398-0.991,0.513c-0.319,0.114-0.611,0.187-0.875,0.219C19.503,52.984,19.307,53,19.18,53h-3.814V42.924H18.4
c0.848,0,1.593,0.135,2.235,0.403s1.176,0.627,1.6,1.073s0.74,0.955,0.95,1.524C23.395,46.494,23.5,47.08,23.5,47.682z
M18.633,51.797c1.112,0,1.914-0.355,2.406-1.066s0.738-1.741,0.738-3.09c0-0.419-0.05-0.834-0.15-1.244
c-0.101-0.41-0.294-0.781-0.581-1.114s-0.677-0.602-1.169-0.807s-1.13-0.308-1.914-0.308h-0.957v7.629H18.633z"/>
<path style="fill:#FFFFFF;" d="M33.475,47.914c0,0.848-0.107,1.595-0.321,2.242c-0.214,0.647-0.511,1.185-0.889,1.613
c-0.378,0.429-0.82,0.752-1.326,0.971s-1.06,0.328-1.661,0.328s-1.155-0.109-1.661-0.328s-0.948-0.542-1.326-0.971
c-0.378-0.429-0.675-0.966-0.889-1.613c-0.214-0.647-0.321-1.395-0.321-2.242s0.107-1.593,0.321-2.235
c0.214-0.643,0.51-1.178,0.889-1.606c0.378-0.429,0.82-0.754,1.326-0.978s1.06-0.335,1.661-0.335s1.155,0.111,1.661,0.335
s0.948,0.549,1.326,0.978c0.378,0.429,0.674,0.964,0.889,1.606C33.367,46.321,33.475,47.066,33.475,47.914z M29.236,51.729
c0.337,0,0.658-0.066,0.964-0.198c0.305-0.132,0.579-0.349,0.82-0.649c0.241-0.301,0.431-0.695,0.567-1.183
s0.209-1.082,0.219-1.784c-0.009-0.684-0.08-1.265-0.212-1.743c-0.132-0.479-0.314-0.873-0.547-1.183s-0.497-0.533-0.793-0.67
c-0.296-0.137-0.608-0.205-0.937-0.205c-0.337,0-0.659,0.063-0.964,0.191c-0.306,0.128-0.579,0.344-0.82,0.649
c-0.242,0.306-0.431,0.699-0.567,1.183s-0.21,1.075-0.219,1.777c0.009,0.684,0.08,1.267,0.212,1.75
c0.132,0.483,0.314,0.877,0.547,1.183s0.497,0.528,0.793,0.67C28.596,51.658,28.908,51.729,29.236,51.729z"/>
<path style="fill:#FFFFFF;" d="M42.607,51.975c-0.374,0.364-0.798,0.638-1.271,0.82c-0.474,0.183-0.984,0.273-1.531,0.273
c-0.602,0-1.155-0.109-1.661-0.328s-0.948-0.542-1.326-0.971c-0.378-0.429-0.675-0.966-0.889-1.613
c-0.214-0.647-0.321-1.395-0.321-2.242s0.107-1.593,0.321-2.235c0.214-0.643,0.51-1.178,0.889-1.606
c0.378-0.429,0.822-0.754,1.333-0.978c0.51-0.224,1.062-0.335,1.654-0.335c0.547,0,1.057,0.091,1.531,0.273
c0.474,0.183,0.897,0.456,1.271,0.82l-1.135,1.012c-0.228-0.265-0.481-0.456-0.759-0.574c-0.278-0.118-0.567-0.178-0.868-0.178
c-0.337,0-0.659,0.063-0.964,0.191c-0.306,0.128-0.579,0.344-0.82,0.649c-0.242,0.306-0.431,0.699-0.567,1.183
s-0.21,1.075-0.219,1.777c0.009,0.684,0.08,1.267,0.212,1.75c0.132,0.483,0.314,0.877,0.547,1.183s0.497,0.528,0.793,0.67
c0.296,0.142,0.608,0.212,0.937,0.212s0.636-0.06,0.923-0.178s0.549-0.31,0.786-0.574L42.607,51.975z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 56 56" style="enable-background:new 0 0 56 56;" xml:space="preserve">
<g>
<path style="fill:#E9E9E0;" d="M36.985,0H7.963C7.155,0,6.5,0.655,6.5,1.926V55c0,0.345,0.655,1,1.463,1h40.074
c0.808,0,1.463-0.655,1.463-1V12.978c0-0.696-0.093-0.92-0.257-1.085L37.607,0.257C37.442,0.093,37.218,0,36.985,0z"/>
<polygon style="fill:#D9D7CA;" points="37.5,0.151 37.5,12 49.349,12 "/>
<path style="fill:#EC6630;" d="M48.037,56H7.963C7.155,56,6.5,55.345,6.5,54.537V39h43v15.537C49.5,55.345,48.845,56,48.037,56z"/>
<g>
<path style="fill:#FFFFFF;" d="M17.455,42.924V53h-1.641v-4.539h-4.361V53H9.785V42.924h1.668v4.416h4.361v-4.416H17.455z"/>
<path style="fill:#FFFFFF;" d="M27.107,42.924v1.121H24.1V53h-1.654v-8.955h-3.008v-1.121H27.107z"/>
<path style="fill:#FFFFFF;" d="M36.705,42.924h1.668V53h-1.668v-6.932l-2.256,5.605H33l-2.27-5.605V53h-1.668V42.924h1.668
l2.994,6.891L36.705,42.924z"/>
<path style="fill:#FFFFFF;" d="M42.57,42.924v8.832h4.635V53h-6.303V42.924H42.57z"/>
</g>
<g>
<path style="fill:#EC6630;" d="M23.207,16.293c-0.391-0.391-1.023-0.391-1.414,0l-6,6c-0.391,0.391-0.391,1.023,0,1.414l6,6
C21.988,29.902,22.244,30,22.5,30s0.512-0.098,0.707-0.293c0.391-0.391,0.391-1.023,0-1.414L17.914,23l5.293-5.293
C23.598,17.316,23.598,16.684,23.207,16.293z"/>
<path style="fill:#EC6630;" d="M41.207,22.293l-6-6c-0.391-0.391-1.023-0.391-1.414,0s-0.391,1.023,0,1.414L39.086,23
l-5.293,5.293c-0.391,0.391-0.391,1.023,0,1.414C33.988,29.902,34.244,30,34.5,30s0.512-0.098,0.707-0.293l6-6
C41.598,23.316,41.598,22.684,41.207,22.293z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 56 56" style="enable-background:new 0 0 56 56;" xml:space="preserve">
<g>
<path style="fill:#E9E9E0;" d="M36.985,0H7.963C7.155,0,6.5,0.655,6.5,1.926V55c0,0.345,0.655,1,1.463,1h40.074
c0.808,0,1.463-0.655,1.463-1V12.978c0-0.696-0.093-0.92-0.257-1.085L37.607,0.257C37.442,0.093,37.218,0,36.985,0z"/>
<polygon style="fill:#D9D7CA;" points="37.5,0.151 37.5,12 49.349,12 "/>
<path style="fill:#EEAF4B;" d="M48.037,56H7.963C7.155,56,6.5,55.345,6.5,54.537V39h43v15.537C49.5,55.345,48.845,56,48.037,56z"/>
<g>
<path style="fill:#FFFFFF;" d="M26.021,42.719v7.848c0,0.474-0.087,0.873-0.26,1.196c-0.174,0.323-0.406,0.583-0.697,0.779
c-0.292,0.196-0.627,0.333-1.005,0.41s-0.769,0.116-1.169,0.116c-0.201,0-0.436-0.021-0.704-0.062s-0.547-0.104-0.834-0.191
s-0.563-0.185-0.827-0.294c-0.265-0.109-0.488-0.232-0.67-0.369l0.697-1.107c0.091,0.063,0.221,0.13,0.39,0.198
s0.353,0.132,0.554,0.191c0.2,0.06,0.41,0.111,0.629,0.157s0.424,0.068,0.615,0.068c0.482,0,0.868-0.094,1.155-0.28
s0.439-0.504,0.458-0.95v-7.711H26.021z"/>
<path style="fill:#FFFFFF;" d="M34.184,50.238c0,0.364-0.075,0.718-0.226,1.06s-0.362,0.643-0.636,0.902s-0.611,0.467-1.012,0.622
c-0.401,0.155-0.857,0.232-1.367,0.232c-0.219,0-0.444-0.012-0.677-0.034s-0.468-0.062-0.704-0.116
c-0.237-0.055-0.463-0.13-0.677-0.226s-0.399-0.212-0.554-0.349l0.287-1.176c0.127,0.073,0.289,0.144,0.485,0.212
s0.398,0.132,0.608,0.191c0.209,0.06,0.419,0.107,0.629,0.144c0.209,0.036,0.405,0.055,0.588,0.055c0.556,0,0.982-0.13,1.278-0.39
s0.444-0.645,0.444-1.155c0-0.31-0.105-0.574-0.314-0.793c-0.21-0.219-0.472-0.417-0.786-0.595s-0.654-0.355-1.019-0.533
c-0.365-0.178-0.707-0.388-1.025-0.629c-0.319-0.241-0.584-0.526-0.793-0.854c-0.21-0.328-0.314-0.738-0.314-1.23
c0-0.446,0.082-0.843,0.246-1.189s0.385-0.641,0.663-0.882s0.602-0.426,0.971-0.554s0.759-0.191,1.169-0.191
c0.419,0,0.843,0.039,1.271,0.116c0.428,0.077,0.774,0.203,1.039,0.376c-0.055,0.118-0.119,0.248-0.191,0.39
c-0.073,0.142-0.142,0.273-0.205,0.396c-0.064,0.123-0.119,0.226-0.164,0.308c-0.046,0.082-0.073,0.128-0.082,0.137
c-0.055-0.027-0.116-0.063-0.185-0.109s-0.167-0.091-0.294-0.137c-0.128-0.046-0.297-0.077-0.506-0.096
c-0.21-0.019-0.479-0.014-0.807,0.014c-0.183,0.019-0.355,0.07-0.52,0.157s-0.311,0.193-0.438,0.321
c-0.128,0.128-0.229,0.271-0.301,0.431c-0.073,0.159-0.109,0.313-0.109,0.458c0,0.364,0.104,0.658,0.314,0.882
c0.209,0.224,0.469,0.419,0.779,0.588c0.31,0.169,0.646,0.333,1.012,0.492c0.364,0.159,0.704,0.354,1.019,0.581
s0.576,0.513,0.786,0.854C34.078,49.261,34.184,49.7,34.184,50.238z"/>
</g>
<g>
<path style="fill:#EEAF4B;" d="M19.5,19v-4c0-0.551,0.448-1,1-1c0.553,0,1-0.448,1-1s-0.447-1-1-1c-1.654,0-3,1.346-3,3v4
c0,1.103-0.897,2-2,2c-0.553,0-1,0.448-1,1s0.447,1,1,1c1.103,0,2,0.897,2,2v4c0,1.654,1.346,3,3,3c0.553,0,1-0.448,1-1
s-0.447-1-1-1c-0.552,0-1-0.449-1-1v-4c0-1.2-0.542-2.266-1.382-3C18.958,21.266,19.5,20.2,19.5,19z"/>
<circle style="fill:#EEAF4B;" cx="27.5" cy="18.5" r="1.5"/>
<path style="fill:#EEAF4B;" d="M39.5,21c-1.103,0-2-0.897-2-2v-4c0-1.654-1.346-3-3-3c-0.553,0-1,0.448-1,1s0.447,1,1,1
c0.552,0,1,0.449,1,1v4c0,1.2,0.542,2.266,1.382,3c-0.84,0.734-1.382,1.8-1.382,3v4c0,0.551-0.448,1-1,1c-0.553,0-1,0.448-1,1
s0.447,1,1,1c1.654,0,3-1.346,3-3v-4c0-1.103,0.897-2,2-2c0.553,0,1-0.448,1-1S40.053,21,39.5,21z"/>
<path style="fill:#EEAF4B;" d="M27.5,24c-0.553,0-1,0.448-1,1v3c0,0.552,0.447,1,1,1s1-0.448,1-1v-3
C28.5,24.448,28.053,24,27.5,24z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 56 56" style="enable-background:new 0 0 56 56;" xml:space="preserve">
<g>
<path style="fill:#E9E9E0;" d="M36.985,0H7.963C7.155,0,6.5,0.655,6.5,1.926V55c0,0.345,0.655,1,1.463,1h40.074
c0.808,0,1.463-0.655,1.463-1V12.978c0-0.696-0.093-0.92-0.257-1.085L37.607,0.257C37.442,0.093,37.218,0,36.985,0z"/>
<polygon style="fill:#D9D7CA;" points="37.5,0.151 37.5,12 49.349,12 "/>
<circle style="fill:#F3D55B;" cx="18.931" cy="14.431" r="4.569"/>
<polygon style="fill:#26B99A;" points="6.5,39 17.5,39 49.5,39 49.5,28 39.5,18.5 29,30 23.517,24.517 "/>
<path style="fill:#14A085;" d="M48.037,56H7.963C7.155,56,6.5,55.345,6.5,54.537V39h43v15.537C49.5,55.345,48.845,56,48.037,56z"/>
<g>
<path style="fill:#FFFFFF;" d="M21.426,42.65v7.848c0,0.474-0.087,0.873-0.26,1.196c-0.173,0.323-0.406,0.583-0.697,0.779
c-0.292,0.196-0.627,0.333-1.005,0.41C19.085,52.961,18.696,53,18.295,53c-0.201,0-0.436-0.021-0.704-0.062
c-0.269-0.041-0.547-0.104-0.834-0.191s-0.563-0.185-0.827-0.294c-0.265-0.109-0.488-0.232-0.67-0.369l0.697-1.107
c0.091,0.063,0.221,0.13,0.39,0.198c0.168,0.068,0.353,0.132,0.554,0.191c0.2,0.06,0.41,0.111,0.629,0.157
s0.424,0.068,0.615,0.068c0.483,0,0.868-0.094,1.155-0.28s0.439-0.504,0.458-0.95V42.65H21.426z"/>
<path style="fill:#FFFFFF;" d="M25.514,52.932h-1.641V42.855h2.898c0.428,0,0.852,0.068,1.271,0.205
c0.419,0.137,0.795,0.342,1.128,0.615c0.333,0.273,0.602,0.604,0.807,0.991s0.308,0.822,0.308,1.306
c0,0.511-0.087,0.973-0.26,1.388c-0.173,0.415-0.415,0.764-0.725,1.046c-0.31,0.282-0.684,0.501-1.121,0.656
s-0.921,0.232-1.449,0.232h-1.217V52.932z M25.514,44.1v3.992h1.504c0.2,0,0.398-0.034,0.595-0.103
c0.196-0.068,0.376-0.18,0.54-0.335s0.296-0.371,0.396-0.649c0.1-0.278,0.15-0.622,0.15-1.032c0-0.164-0.023-0.354-0.068-0.567
c-0.046-0.214-0.139-0.419-0.28-0.615c-0.142-0.196-0.34-0.36-0.595-0.492C27.5,44.166,27.163,44.1,26.744,44.1H25.514z"/>
<path style="fill:#FFFFFF;" d="M39.5,47.736v3.896c-0.21,0.265-0.444,0.48-0.704,0.649s-0.533,0.308-0.82,0.417
s-0.583,0.187-0.889,0.232C36.781,52.978,36.479,53,36.178,53c-0.602,0-1.155-0.109-1.661-0.328s-0.948-0.542-1.326-0.971
c-0.378-0.429-0.675-0.966-0.889-1.613c-0.214-0.647-0.321-1.395-0.321-2.242s0.107-1.593,0.321-2.235
c0.214-0.643,0.51-1.178,0.889-1.606c0.378-0.429,0.822-0.754,1.333-0.978c0.51-0.224,1.062-0.335,1.654-0.335
c0.547,0,1.057,0.091,1.531,0.273c0.474,0.183,0.897,0.456,1.271,0.82l-1.135,1.012c-0.219-0.265-0.47-0.456-0.752-0.574
c-0.283-0.118-0.574-0.178-0.875-0.178c-0.337,0-0.659,0.063-0.964,0.191c-0.306,0.128-0.579,0.344-0.82,0.649
c-0.242,0.306-0.431,0.699-0.567,1.183s-0.21,1.075-0.219,1.777c0.009,0.684,0.08,1.276,0.212,1.777
c0.132,0.501,0.314,0.911,0.547,1.23s0.497,0.556,0.793,0.711c0.296,0.155,0.608,0.232,0.937,0.232c0.1,0,0.234-0.007,0.403-0.021
c0.168-0.014,0.337-0.036,0.506-0.068c0.168-0.032,0.33-0.075,0.485-0.13c0.155-0.055,0.269-0.132,0.342-0.232v-2.488h-1.709
v-1.121H39.5z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#5D9BEB;" d="M512,256.006C512,397.402,397.394,512.004,256.004,512C114.606,512.004,0,397.402,0,256.006
C-0.007,114.61,114.606,0,256.004,0C397.394,0,512,114.614,512,256.006z"/>
<path style="fill:#4988DB;" d="M510.768,280.99c-0.112-0.111-0.222-0.224-0.334-0.335c-0.542-0.548-138.178-138.186-138.725-138.725
C342.203,112.003,301.25,93.391,256,93.391c-89.665,0-162.609,72.946-162.609,162.609c0,45.246,18.611,86.197,48.537,115.705
c0.542,0.549,138.179,138.187,138.73,138.73c0.112,0.113,0.224,0.224,0.336,0.336C402.427,499.007,499.005,402.43,510.768,280.99z"
/>
<g>
<path style="fill:#F4F6F9;" d="M277.21,305.489h-96.051l30.351-30.351c2.762-2.762,2.762-7.235,0-9.997
c-2.762-2.762-7.235-2.762-9.997,0l-42.419,42.419c-2.762,2.762-2.762,7.235,0,9.997l42.419,42.419
c1.381,1.381,3.189,2.071,4.998,2.071c1.809,0,3.618-0.69,4.998-2.071c2.762-2.762,2.762-7.235,0-9.997l-30.351-30.351h96.051
c3.908,0,7.07-3.166,7.07-7.07C284.279,308.655,281.118,305.489,277.21,305.489z"/>
<path style="fill:#F4F6F9;" d="M310.489,152.022c-2.762-2.762-7.235-2.762-9.997,0c-2.762,2.762-2.762,7.235,0,9.997l30.351,30.351
h-96.051c-3.908,0-7.07,3.166-7.07,7.07s3.162,7.07,7.07,7.07h96.051l-30.351,30.351c-2.762,2.762-2.762,7.235,0,9.997
c1.381,1.381,3.189,2.071,4.998,2.071s3.618-0.69,4.998-2.071l42.419-42.419c2.762-2.762,2.762-7.235,0-9.997L310.489,152.022z"/>
<path style="fill:#F4F6F9;" d="M256,93.392c-89.665,0-162.608,72.946-162.608,162.608S166.335,418.608,256,418.608
S418.608,345.662,418.608,256S345.665,93.392,256,93.392z M256,404.468c-81.863,0-148.468-66.602-148.468-148.468
S174.137,107.532,256,107.532S404.468,174.133,404.468,256S337.863,404.468,256,404.468z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment