├── README.md ├── .firebaserc ├── public ├── 192x192.png ├── 384x384.png ├── 512x512.png ├── favicon.ico ├── index.html └── manifest.json ├── src ├── App.test.js ├── reducers │ ├── index.js │ ├── story.js │ └── comment.js ├── const │ └── index.js ├── Default.js ├── App.css ├── actions │ └── comment.js ├── components │ ├── CommentItem.js │ ├── Item.js │ └── Comment.js ├── Jobs.js ├── Ask.js ├── Show.js ├── Newest.js ├── App.js ├── utils │ └── scroll.js ├── Story.js ├── Container.js ├── registerServiceWorker.js ├── logo.svg ├── index.css ├── index.js └── public │ └── loading.js ├── firebase.json ├── .gitignore └── package.json /README.md: -------------------------------------------------------------------------------- 1 | # hackerNews-pwa 2 | hacker news pwa 3 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "hn-pwa-d8b2e" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /public/192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephenkingsley/hackerNews-pwa/HEAD/public/192x192.png -------------------------------------------------------------------------------- /public/384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephenkingsley/hackerNews-pwa/HEAD/public/384x384.png -------------------------------------------------------------------------------- /public/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephenkingsley/hackerNews-pwa/HEAD/public/512x512.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephenkingsley/hackerNews-pwa/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(, div); 8 | }); 9 | -------------------------------------------------------------------------------- /src/reducers/index.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux'; 2 | import comment from './comment'; 3 | import story from './story'; 4 | 5 | const rootReducer = combineReducers({ 6 | comment, 7 | story, 8 | }); 9 | 10 | export default rootReducer; 11 | -------------------------------------------------------------------------------- /src/const/index.js: -------------------------------------------------------------------------------- 1 | export const NEWS_LIST = 'NEWS_LIST'; 2 | export const SHOW_LIST = 'SHOW_LIST'; 3 | export const ASK_LIST = 'ASK_LIST'; 4 | export const NEWEST_LIST = 'NEWEST_LIST'; 5 | export const JOBS_LIST = 'JOBS_LIST'; 6 | 7 | export const STORY = 'STORY'; 8 | -------------------------------------------------------------------------------- /src/Default.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { Redirect } from 'react-router-dom'; 3 | 4 | class Default extends Component { 5 | render() { 6 | return 7 | } 8 | } 9 | 10 | export default Default; 11 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "build", 4 | "rewrites": [{ 5 | "source": "**", 6 | "destination": "/index.html" 7 | }], 8 | "ignore": [ 9 | "firebase.json", 10 | "**/.*", 11 | "**/node_modules/**" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/reducers/story.js: -------------------------------------------------------------------------------- 1 | import { STORY } from '../const'; 2 | 3 | const initState = {}; 4 | 5 | export default (state = initState, action) => { 6 | switch (action.type) { 7 | case STORY: 8 | return { 9 | state: action.data, 10 | }; 11 | default: 12 | return state; 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | 9 | # production 10 | /build 11 | 12 | # misc 13 | .DS_Store 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | animation: App-logo-spin infinite 20s linear; 7 | height: 80px; 8 | } 9 | 10 | .App-header { 11 | background-color: #222; 12 | height: 150px; 13 | padding: 20px; 14 | color: white; 15 | } 16 | 17 | .App-intro { 18 | font-size: large; 19 | } 20 | 21 | @keyframes App-logo-spin { 22 | from { transform: rotate(0deg); } 23 | to { transform: rotate(360deg); } 24 | } 25 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | HNPWA 10 | 11 | 12 | 15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "HN PWA", 3 | "name": "Hacker News PWA", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "384x384.png", 12 | "sizes": "384x384", 13 | "type": "image/png" 14 | }, 15 | { 16 | "src": "512x512.png", 17 | "sizes": "512x512", 18 | "type": "image/png" 19 | } 20 | ], 21 | "start_url": "./index.html", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /src/actions/comment.js: -------------------------------------------------------------------------------- 1 | export const getData = (type, page) => 2 | dispatch => { 3 | fetch(`https://node-hnapi.herokuapp.com/${type}?page=${page}`) 4 | .then(res => res.json()) 5 | .then(data => { 6 | dispatch(receiveData(`${type.toUpperCase()}_LIST`, data)); 7 | }) 8 | }; 9 | 10 | export const getItem = (id) => 11 | dispatch => { 12 | fetch(`https://node-hnapi.herokuapp.com/item/${id}`) 13 | .then(res => res.json()) 14 | .then(data => { 15 | dispatch(receiveData('STORY', data)); 16 | }) 17 | }; 18 | 19 | const receiveData = (type, data) => { 20 | return { 21 | type, data, 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hacker-news-pwa", 3 | "version": "0.1.3", 4 | "private": true, 5 | "dependencies": { 6 | "react": "^16.5.2", 7 | "react-dom": "^16.5.2", 8 | "react-redux": "^5.0.7", 9 | "react-router": "^4.3.1", 10 | "react-router-dom": "^4.3.1", 11 | "redux": "^3.6.0", 12 | "redux-thunk": "^2.3.0" 13 | }, 14 | "devDependencies": { 15 | "react-scripts": "2.0.5" 16 | }, 17 | "scripts": { 18 | "start": "react-scripts start", 19 | "build": "react-scripts build", 20 | "deploy": "firebase deploy --only hosting", 21 | "push": "npm run build && npm run deploy", 22 | "test": "react-scripts test --env=jsdom", 23 | "eject": "react-scripts eject" 24 | }, 25 | "browserslist": [ 26 | ">0.2%", 27 | "not dead", 28 | "not ie <= 11", 29 | "not op_mini all" 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /src/components/CommentItem.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | export default (props) => { 4 | return ( 5 |
reply(props.id)} 11 | > 12 | 17 | {props.user} 18 | 19 |     20 | 25 | {props.timeAgo} 26 | 27 |
30 |
31 | ); 32 | }; 33 | 34 | const reply = (id) => { 35 | window.location.href = `https://news.ycombinator.com/reply?id=${id}`; 36 | }; 37 | -------------------------------------------------------------------------------- /src/reducers/comment.js: -------------------------------------------------------------------------------- 1 | import { NEWS_LIST, SHOW_LIST, ASK_LIST, NEWEST_LIST, JOBS_LIST } from '../const'; 2 | 3 | const initState = { 4 | news: [], 5 | show: [], 6 | ask: [], 7 | newest: [], 8 | jobs: [], 9 | }; 10 | 11 | export default (state = initState, action) => { 12 | switch (action.type) { 13 | case NEWS_LIST: 14 | return { 15 | ...state, 16 | news: action.data, 17 | }; 18 | case SHOW_LIST: 19 | return { 20 | ...state, 21 | show: action.data, 22 | }; 23 | case ASK_LIST: 24 | return { 25 | ...state, 26 | ask: action.data, 27 | }; 28 | case NEWEST_LIST: 29 | return { 30 | ...state, 31 | newest: action.data, 32 | }; 33 | case JOBS_LIST: 34 | return { 35 | ...state, 36 | jobs: action.data, 37 | }; 38 | default: 39 | return state; 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /src/Jobs.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { getData } from './actions/comment'; 4 | import Scroll from './utils/scroll'; 5 | import Container from './Container'; 6 | 7 | class Jobs extends Container { 8 | componentWillMount() { 9 | const page = this.props.match.params.page; 10 | this.props.dispatch(getData('jobs', page)); 11 | } 12 | 13 | componentWillReceiveProps(nextProps) { 14 | const newPage = nextProps.match.params.page; 15 | const page = this.props.match.params.page; 16 | if (newPage !== page) { 17 | this.props.dispatch(getData('jobs', newPage)); 18 | } 19 | } 20 | 21 | render() { 22 | const { jobs } = this.props; 23 | return
24 | {this.renderList(jobs)} 25 | {this.renderPage('jobs')} 26 |
; 27 | } 28 | } 29 | 30 | const mapStateToProps = state => state.comment; 31 | 32 | export default connect(mapStateToProps)(Jobs); 33 | -------------------------------------------------------------------------------- /src/Ask.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { getData } from './actions/comment'; 4 | import Scroll from './utils/scroll'; 5 | import Container from './Container'; 6 | import Item from './components/Item'; 7 | 8 | class Ask extends Container { 9 | componentWillMount() { 10 | const page = this.props.match.params.page; 11 | this.props.dispatch(getData('ask', page)); 12 | } 13 | 14 | componentWillReceiveProps(nextProps) { 15 | const newPage = nextProps.match.params.page; 16 | const page = this.props.match.params.page; 17 | if (newPage !== page) { 18 | this.props.dispatch(getData('ask', newPage)); 19 | } 20 | } 21 | 22 | render() { 23 | const { ask } = this.props; 24 | return
25 | {this.renderList(ask)} 26 | {this.renderPage('ask')} 27 |
; 28 | } 29 | } 30 | 31 | const mapStateToProps = state => state.comment; 32 | 33 | export default connect(mapStateToProps)(Ask); 34 | -------------------------------------------------------------------------------- /src/Show.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { getData } from './actions/comment'; 4 | import Scroll from './utils/scroll'; 5 | import Container from './Container'; 6 | 7 | class Show extends Container { 8 | componentWillMount() { 9 | const page = this.props.match.params.page; 10 | this.props.dispatch(getData('show', page)); 11 | } 12 | 13 | componentWillReceiveProps(nextProps) { 14 | const newPage = nextProps.match.params.page; 15 | const page = this.props.match.params.page; 16 | if (newPage !== page) { 17 | this.props.dispatch(getData('show', newPage)); 18 | } 19 | } 20 | 21 | render() { 22 | const { show, match } = this.props; 23 | const page = Number(match.params.page); 24 | return
25 | {this.renderList(show)} 26 | {this.renderPage('show')} 27 |
; 28 | } 29 | } 30 | 31 | const mapStateToProps = state => state.comment; 32 | 33 | export default connect(mapStateToProps)(Show); 34 | -------------------------------------------------------------------------------- /src/Newest.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { getData } from './actions/comment'; 4 | import Scroll from './utils/scroll'; 5 | import Container from './Container'; 6 | 7 | class Newest extends Container { 8 | componentWillMount() { 9 | const page = this.props.match.params.page; 10 | this.props.dispatch(getData('newest', page)); 11 | } 12 | 13 | componentWillReceiveProps(nextProps) { 14 | const newPage = nextProps.match.params.page; 15 | const page = this.props.match.params.page; 16 | if (newPage !== page) { 17 | this.props.dispatch(getData('newest', newPage)); 18 | } 19 | } 20 | 21 | render() { 22 | const { newest, match } = this.props; 23 | const page = Number(match.params.page); 24 | return
25 | {this.renderList(newest)} 26 | {this.renderPage('newest')} 27 |
; 28 | } 29 | } 30 | 31 | const mapStateToProps = state => state.comment; 32 | 33 | export default connect(mapStateToProps)(Newest); 34 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import clone from 'lodash/clone'; 4 | import { getData } from './actions/comment'; 5 | import Scroll from './utils/scroll'; 6 | import Container from './Container'; 7 | import Item from './components/Item'; 8 | 9 | class App extends Container { 10 | componentWillMount() { 11 | const page = this.props.match.params.page; 12 | this.props.dispatch(getData('news', page)); 13 | } 14 | 15 | componentWillReceiveProps(nextProps, nextState, context) { 16 | const newPage = nextProps.match.params.page; 17 | const page = this.props.match.params.page; 18 | if (newPage !== page) { 19 | this.props.dispatch(getData('news', newPage)); 20 | } 21 | } 22 | 23 | render() { 24 | console.log(this.props); 25 | const { news } = this.props; 26 | return
27 | {this.renderList(news)} 28 | {this.renderPage()} 29 |
; 30 | } 31 | } 32 | 33 | const mapStateToProps = state => { 34 | console.log(state); 35 | return state.comment 36 | }; 37 | 38 | export default connect(mapStateToProps)(App); 39 | -------------------------------------------------------------------------------- /src/components/Item.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { 3 | Link, 4 | Redirect, 5 | } from 'react-router-dom' 6 | 7 | export default class Item extends Component { 8 | jumpUrl(event, url) { 9 | event.preventDefault(); 10 | try { 11 | const newUrl = new URL(url); 12 | // window.location.href = url; 13 | window.open(url); 14 | } catch (e) { 15 | const id = url.match(/id=([0-9]*)/, 'g'); 16 | } 17 | } 18 | 19 | render() { 20 | const { data, index, page } = this.props; 21 | return ( 22 |
  • 23 |
    24 | this.jumpUrl(event,data.url)} target="_blank">{index + 1 + (page - 1) * 30}.{data.title} 25 |
    26 |
    27 | 28 | 29 | { data.points ? `${data.points} by ${data.user} |` : ' ' } 30 | {' ' + data.time_ago} | 31 | {data.comments_count > 0 ? ` ${data.comments_count} comments` : ' discuss'} 32 | 33 | 34 |
    35 |
  • 36 | ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/components/Comment.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import CommentItem from './CommentItem'; 3 | 4 | export default class Comment extends Component { 5 | constructor() { 6 | super(); 7 | this.element = []; 8 | } 9 | 10 | renderChildren(data, type = 1) { 11 | if (data.comments) { 12 | data.comments.forEach((ele, key) => { 13 | this.element.push( 14 | 22 | ); 23 | this.renderChildren(ele, key + 2); 24 | }); 25 | } 26 | } 27 | 28 | renderComponent(data) { 29 | this.element = [ 30 | 37 | ]; 38 | this.renderChildren(data); 39 | return this.element; 40 | } 41 | 42 | render() { 43 | return ( 44 |
    45 | {this.renderComponent(this.props.data)} 46 |
    47 | ); 48 | } 49 | } 50 | 51 | //
    52 | -------------------------------------------------------------------------------- /src/utils/scroll.js: -------------------------------------------------------------------------------- 1 | let isRunning = false; 2 | /** 3 | * @parma {func} callback - 执行的回调,一定要是promise 4 | * @parma {object} options - 执行scroll事件的一些配置 5 | * @parma {num} options.bottom - 当滑到距离底部的距离时执行回调 6 | */ 7 | export default (cb, options = {}) => { 8 | const loadMore = () => { 9 | window.requestAnimationFrame(() => { 10 | let bottom = getWindowHeight() / 3; 11 | if (options && Object.hasOwnProperty.call(options, 'bottom')) { 12 | bottom = options.bottom; 13 | } 14 | 15 | if (getScrollTop() + getWindowHeight() >= getScrollHeight() - bottom) { 16 | cb(); 17 | } 18 | }); 19 | }; 20 | window.addEventListener('scroll', loadMore, false); 21 | }; 22 | 23 | const getScrollTop = () => { 24 | let scrollTop = 0; 25 | let bodyScrollTop = 0; 26 | let documentScrollTop = 0; 27 | if (document.body) { 28 | bodyScrollTop = document.body.scrollTop; 29 | } 30 | if (document.documentElement) { 31 | documentScrollTop = document.documentElement.scrollTop; 32 | } 33 | scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop; 34 | return scrollTop; 35 | }; 36 | 37 | const getScrollHeight = () => { 38 | let scrollHeight = 0; 39 | let bodyScrollHeight = 0; 40 | let documentScrollHeight = 0; 41 | if (document.body) { 42 | bodyScrollHeight = document.body.scrollHeight; 43 | } 44 | if (document.documentElement) { 45 | documentScrollHeight = document.documentElement.scrollHeight; 46 | } 47 | scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ? 48 | bodyScrollHeight : documentScrollHeight; 49 | return scrollHeight; 50 | }; 51 | 52 | const getWindowHeight = () => { 53 | let windowHeight = 0; 54 | if (document.compatMode === 'CSS1Compat') { 55 | windowHeight = document.documentElement.clientHeight; 56 | } else { 57 | windowHeight = document.body.clientHeight; 58 | } 59 | return windowHeight; 60 | }; 61 | -------------------------------------------------------------------------------- /src/Story.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { getItem } from './actions/comment'; 4 | import Comment from './components/Comment'; 5 | 6 | class Story extends Component { 7 | componentWillMount() { 8 | const id = this.props.match.params.id; 9 | this.props.dispatch(getItem(id)); 10 | } 11 | 12 | reply(id) { 13 | window.location.href = `https://news.ycombinator.com/item?id=${id}`; 14 | } 15 | 16 | renderDescription(data) { 17 | if (data && Object.hasOwnProperty.call(data, 'title')) { 18 | return ( 19 |
    20 |
    21 | {data.title} 22 |
    23 |
      this.reply(data.id)}> 24 |
    1. points: {data.points}
    2. 25 |
    3. comments_count: {data.comments_count}
    4. 26 |
    5. time_ago: {data.time_ago}
    6. 27 |
    7. 33 | reply 34 |
    8. 35 |
    36 |
    37 | ); 38 | } 39 | } 40 | 41 | renderComments(data) { 42 | if (data && Object.hasOwnProperty.call(data, 'comments') && data.comments.length > 0) { 43 | return ( 44 |
    45 | {data.comments.map((ele, key) => 46 | )} 47 |
    48 | ); 49 | } 50 | return null; 51 | } 52 | 53 | render() { 54 | const { state } = this.props; 55 | return ( 56 |
    57 | {this.renderDescription(state)} 58 | {this.renderComments(state)} 59 |
    60 | ); 61 | } 62 | } 63 | 64 | const mapStateToProps = state => state.story; 65 | 66 | export default connect(mapStateToProps)(Story); 67 | -------------------------------------------------------------------------------- /src/Container.js: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | import Item from './components/Item'; 4 | import { loadingPic } from './public/loading'; 5 | 6 | export default class Container extends Component { 7 | constructor() { 8 | super(); 9 | this.state = { 10 | page: 1, 11 | }; 12 | } 13 | 14 | componentDidMount() { 15 | window.scrollTo(0, 0); 16 | } 17 | 18 | scrollTop() { 19 | window.scrollTo(0, 0); 20 | } 21 | 22 | renderItem(data) { 23 | if (data && data.length > 0) { 24 | return data.map((ele, index) => ( 25 | 26 | )); 27 | } 28 | } 29 | 30 | renderLoading() { 31 | const { match } = this.props; 32 | const page = Number(match.params.page); 33 | let element; 34 | if (page > 1) { 35 | element = ( 36 |
    37 | content is null, please read prev page! 38 |
    39 | ); 40 | } else { 41 | element = ( 42 |
    43 | loading 44 |
    45 | ); 46 | } 47 | return element; 48 | } 49 | 50 | renderList(data) { 51 | return ( 52 |
    53 | { 54 | (data && data.length) > 0 ? 55 |
      56 | {this.renderItem(data)} 57 |
    : 58 | this.renderLoading() 59 | } 60 |
    61 | ); 62 | } 63 | 64 | renderPage(type) { 65 | const { match } = this.props; 66 | const page = Number(match.params.page); 67 | let newTypePrve; 68 | let newTypeNext; 69 | if (type) { 70 | newTypePrve = `/${type}/${(page - 1) > 1 ? page - 1 : 1}` 71 | newTypeNext = `/${type}/${page + 1}`; 72 | } else { 73 | newTypePrve = `/${(page - 1) > 1 ? page - 1 : 1}` 74 | newTypeNext = `/${page + 1}`; 75 | } 76 | return ( 77 |
    78 | this.scrollTop()}>{'< prev --- '} 79 | {page} 80 | this.scrollTop()}>{' --- next >'} 81 |
    82 | ); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | // In production, we register a service worker to serve assets from local cache. 2 | 3 | // This lets the app load faster on subsequent visits in production, and gives 4 | // it offline capabilities. However, it also means that developers (and users) 5 | // will only see deployed updates on the "N+1" visit to a page, since previously 6 | // cached resources are updated in the background. 7 | 8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy. 9 | // This link also includes instructions on opting out of this behavior. 10 | 11 | export default function register() { 12 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 13 | window.addEventListener('load', () => { 14 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 15 | navigator.serviceWorker 16 | .register(swUrl) 17 | .then(registration => { 18 | registration.onupdatefound = () => { 19 | const installingWorker = registration.installing; 20 | installingWorker.onstatechange = () => { 21 | if (installingWorker.state === 'installed') { 22 | if (navigator.serviceWorker.controller) { 23 | // At this point, the old content will have been purged and 24 | // the fresh content will have been added to the cache. 25 | // It's the perfect time to display a "New content is 26 | // available; please refresh." message in your web app. 27 | console.log('New content is available; please refresh.'); 28 | } else { 29 | // At this point, everything has been precached. 30 | // It's the perfect time to display a 31 | // "Content is cached for offline use." message. 32 | console.log('Content is cached for offline use.'); 33 | } 34 | } 35 | }; 36 | }; 37 | }) 38 | .catch(error => { 39 | console.error('Error during service worker registration:', error); 40 | }); 41 | }); 42 | } 43 | } 44 | 45 | export function unregister() { 46 | if ('serviceWorker' in navigator) { 47 | navigator.serviceWorker.ready.then(registration => { 48 | registration.unregister(); 49 | }); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: sans-serif; 5 | } 6 | 7 | a { 8 | text-decoration: none; 9 | max-width: 100%; 10 | word-break: break-all; 11 | } 12 | 13 | a:link { 14 | color: #333333; 15 | } 16 | a:active { 17 | color: #333333; 18 | } 19 | a:visited { 20 | color: #333333; 21 | } 22 | a:hover { 23 | color: #333333; 24 | } 25 | 26 | ul { 27 | list-style: none; 28 | } 29 | 30 | ol { 31 | display: block; 32 | list-style-type: decimal; 33 | -webkit-margin-before: 1em; 34 | -webkit-margin-after: 1em; 35 | -webkit-margin-start: 0px; 36 | -webkit-margin-end: 0px; 37 | -webkit-padding-start: 40px; 38 | } 39 | 40 | .topbar { 41 | position: fixed; 42 | width: 100%; 43 | top: 0; 44 | z-index: 100; 45 | height: 48px; 46 | padding: 0 16px; 47 | background-color: #222; 48 | display: flex; 49 | align-items: center; 50 | } 51 | 52 | .topbar > ul { 53 | list-style: none; 54 | display: flex; 55 | align-items: center; 56 | height: 100%; 57 | max-width: 1200px; 58 | overflow: hidden; 59 | margin-left: -20px; 60 | } 61 | 62 | .topbar > ul > li { 63 | margin-right: .6rem; 64 | color: #FFFFFF; 65 | } 66 | 67 | .topbar > ul > li > a { 68 | color: #FFFFFF; 69 | text-decoration: none; 70 | } 71 | 72 | .content { 73 | margin-top: 48px; 74 | } 75 | 76 | .content li { 77 | display: flex; 78 | flex-wrap: wrap; 79 | align-items: center; 80 | align-items: center; 81 | margin-left: -1.2rem; 82 | width: 100%; 83 | overflow: hidden; 84 | height: 4rem; 85 | border-bottom: 1px solid #ebebeb; 86 | padding: 0.3rem 0; 87 | } 88 | 89 | .content li div { 90 | width: 100%; 91 | } 92 | 93 | .content li > div:last-child { 94 | color: #999999; 95 | font-size: 0.8rem; 96 | } 97 | 98 | .item-footer { 99 | text-decoration: underline; 100 | } 101 | 102 | .story-top { 103 | border-bottom: 1px solid #ebebeb; 104 | } 105 | 106 | .story-title { 107 | font-size: 1.2rem; 108 | margin-left: 1.2rem; 109 | padding-top: 1rem; 110 | font-weight: bold; 111 | } 112 | 113 | .story-ol > li { 114 | height: 1.2rem; 115 | border-bottom: 0px; 116 | padding: 0px; 117 | color: #999999; 118 | } 119 | 120 | .comment-item { 121 | border-bottom: 1px solid #ebebeb; 122 | padding: 1rem; 123 | font-size: 0.8rem; 124 | max-width: 100%; 125 | } 126 | 127 | .footer-page { 128 | width: 100%; 129 | height: 32px; 130 | text-align: center; 131 | line-height: 16px; 132 | } 133 | 134 | .loading { 135 | height: 100%; 136 | width: 100%; 137 | display: flex; 138 | justify-content: center; 139 | align-items: center; 140 | } 141 | 142 | .loading > img { 143 | width: 200px; 144 | height: 200px; 145 | } 146 | 147 | .one-line-ellipsis { 148 | overflow: hidden; 149 | text-overflow: ellipsis; 150 | white-space: nowrap; 151 | } 152 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import querystring from 'querystring'; 2 | 3 | import React from 'react'; 4 | import ReactDOM from 'react-dom'; 5 | 6 | import { createStore, applyMiddleware } from 'redux' 7 | import { Provider } from 'react-redux' 8 | import thunk from 'redux-thunk' 9 | import reducer from './reducers' 10 | 11 | import { 12 | BrowserRouter as Router, 13 | Route, 14 | Link, 15 | Redirect 16 | } from 'react-router-dom' 17 | 18 | import Default from './Default'; 19 | import App from './App'; 20 | import Newest from './Newest'; 21 | import Show from './Show'; 22 | import Ask from './Ask'; 23 | import Jobs from './Jobs'; 24 | import Story from './Story'; 25 | 26 | import registerServiceWorker from './registerServiceWorker'; 27 | 28 | import './index.css'; 29 | 30 | const middleware = [ thunk ] 31 | 32 | const store = createStore( 33 | reducer, 34 | applyMiddleware(...middleware) 35 | ) 36 | 37 | const defaultChannelList = [ 38 | 'news', 'newest', 'show', 'ask', 'jobs' 39 | ]; 40 | 41 | const changeChannel = (event) => { 42 | const channelList = document.querySelectorAll('.channel > a'); 43 | if (channelList && channelList.length > 0) { 44 | for (let i = 0; i < channelList.length; i += 1) { 45 | channelList[i].setAttribute('style', ''); 46 | } 47 | } 48 | event.target.setAttribute('style', 'border-bottom: 4px solid rgb(255, 102, 0)'); 49 | }; 50 | 51 | const initChannel = () => { 52 | const path = window.location.pathname.match(/\/([a-z]*)\/([0-9]*)/, 'g'); 53 | let channel = 'news'; 54 | if (path) { 55 | channel = path[1]; 56 | } 57 | const index = defaultChannelList.indexOf(channel); 58 | const channelList = document.querySelectorAll('.channel > a'); 59 | index > -1 && channelList[index].setAttribute('style', 'border-bottom: 4px solid rgb(255, 102, 0)'); 60 | }; 61 | 62 | ReactDOM.render( 63 | 64 | 65 |
    66 |
    67 | logo 75 |
      76 |
    • changeChannel(event)}>NEWS
    • 77 |
    • changeChannel(event)}>NEW
    • 78 |
    • changeChannel(event)}>SHOW
    • 79 |
    • changeChannel(event)}>ASK
    • 80 |
    • changeChannel(event)}>JOBS
    • 81 |
    82 |
    83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 |
    91 |
    92 |
    93 | , document.getElementById('root')); 94 | 95 | window.addEventListener('popstate', () => initChannel()); 96 | 97 | initChannel(); 98 | registerServiceWorker(); 99 | -------------------------------------------------------------------------------- /src/public/loading.js: -------------------------------------------------------------------------------- 1 | export const loadingPic = 'data:image/gif;base64,R0lGODlhxgDGAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKi0sKzYxLT00L0M3MEc6MUs8Mk49M1E+M1RAM1VANFdBNFdBNFhBNFhBNFhBNFhBNFhBNFhBNFhBNFhBNFhBNFhBNFhBNFhCNFhCNFhCNFhCNFhCNFhCNFhCNFhCNFlCNVpDNlpENlpEN1pGOlhKQVZPSlRUU1JYWlBcYU1ha0lndkhqe0dsf0dtgUdtgUdtgUdtgUdtgUdtgUdtgUdtgUdtgUdtgUdtgUdtgUdugkdugkdugkdugkdugkdugkhvg0pwhExyhU50h1J2iVZ6jFx+kF+BkmGCk2OElWWFlmaGl2eHmGqHlW2GknCFjnOFinaEh3mCg3yBf39/fIN9eIZ7dYh5cZB1a5xxZKxsWrdoU8JkTMphR9NeQtpcPt5bO+BaOuFaOuFaOuFaOuFbO+FbO+FcPOFdPeFfPuFhQOBmQ+BrRt9wSt91Td56Ud1+UtuDUtiIUtWMUNOOTtKOTNKOTNKOTNKPS9KRR9KbOdKhMNKmKNKoJNKpI9KqI9KqI9OsKdWwNdiyUdivX9mybNe2fdW6kNO8mNPBodjLsd/VweLYyOXd0evn4+7r5/Lw7fTx7/b08fv59/79/P7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBADfACwAAAAAxgDGAAAI/gC/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubJlorpo0bpj5w6tW70ul6R1prTp0m5uiQ6p687p16VphV7NsZcb2Ljv0OboGjduWrsz3vLt242u4BfhEPetG3nF5b7tOKc4HDru6RNJW4eNS7KtWrFq/h3PqH376e6OebVSxb69KlizK1Y3b/pxLVbu87OydZG+6eaMvZLfgOzVYpFy/gGoWC0ENjjeRPNtZxxjvODX4ICtWNTbdsAFeGGDBlLUC4LQKajYhw1mWFFr0MnWmC4oEsgKRrTcBhscqjnGYIwD8oKRLrds1tln8TUWC48D8ocdRLYgmd+SEfHiZHszQgmRhU6+YiVEsEypSohbNtTLekjCEiZEMPLISpFnMnQfiqw82KZD6l0I35wT1fIKlq3AoiSeFfXyJ6CEFmrodLfIAkgURgiixyw+HsoQL4AYYemllj7RoaQI2cIopqAaAUiknBJ0S6ioilpqQVKkiuqm/qXK4iqqT6BX6qypyrLqqbiGKsiqtPQa6hOr6iFsqKQeKuuxmALL7KVQrIrLs5YGsuo3T1A7y7XBMgtFspwGwmyOe+VC7ky8ZNurrnn1IgssoMQLyiux5IKuILM+sW1etngi77/xwgrTLOqCKoitd8kC8MLz7oKuLbP0IYgsn+1FC8MMm3ntN7v4i/HCAkv6yscMe+JwqbuQjPG+nNqicsarzvLywlqWCu/MAK+qMM7yurJqLTzLqzGnuQQdL8ucumL0uZLeEjS7F/GSKCexzMI0ZDu/7AqbEvHCSSNgh91IJUg/1svIKntydUS1VCL2241wAq5jMn8My8kVzQL3vN6VzN1YLmj/60rIEuXi9t5wc2LZLbVYzTVFmyCOOOGF6i0539fGcjniCB8a+eZwUw4o6HvHsirpcA8t6SWoi122oV+3DvagysoOtt+E8nI46qZfW0vrl+AOO+q0l+r15pWIzmnbiG9i78YG8TILLJmMvUksykOv/fbcd+/99+CHL/745Jdv/vnop6/++uy37/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrwgAhMoAIXyMAGli8gACH5BAkEANkALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKi4sKzgxLUI2L047MVY+MlpAM11BM15CM2BCM2BCNGBCNGBCNGBCNGBCNGBCNGBCNGBCNGBCNGBCNGBDNGFDNGFDNWJENmJFN2JGOGFIPF5NRVpUUVZaXFNdY1Bhak1kcEtndkhqfEhqfEhqfEhqfEhqfEhqfEhrfEhrfEhrfUhrfUlsfkxugE5wgVVygFx1f2N3fm9+f3aDf32GfI2NcZiSaKCUYKWWV6+ZRrqeOsKjMMimKcmmKMmmKMmmKMqnKMqnK8umL82lNM6jOc+hPdGcRNGZRtKXR9KUSNORSdOQSdOPSdOOSNSKSNaDRtl3Qt1pPt9hPOBeO+BdO+BdO+BdO+BdO+BdO+BdO+BeO+BfPOBgPuBiP+FmQuFrR+FzTuF7VuOJZOSYc+ashue+lunEn+nJpOrNqOrQrOvRsOzStO3Ut+3Xu+7Yvu7awvDcyOzczfPh0vTl2PXp3/bs5fbu5/bv6vbw7Pbx7fbz7/b08Pb18vb28/b28/f4+P7+/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+ALMJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDMnRJXpSxcqW7pg2qRZ5KYsVFKrTu0FVemOqLysnp06C+nXGmXT3v0JN8ZNu4Nz8W1RFOrguy8Rp3gJOfLKqDiB2vjZOe/Il+C8UcO9DZxIGLX+WN99uzGqR9zTq4fTqSKq8bvBONbURr399JQqwqetnDGq+vcF2N5EXOy3WnmKoRdggHC4JpFuBlIhCmOXLGjhIxNlEiEVWTQGh4ULvkFRgQYimBiAIN7nYESfGOiFeSkuqAlz8GWxomKaxBgghhRlclxwXdyoGCg63tcfRaJUN1sWmURWpH3TXfTJJpd08UUmJjr24ZNqtLHcRAo+yeOXEW2pYxtCktlQJ08eqSZEkeg45psRabLdgm24SWdE56GY3iNp7ikRKJo8ckmUgiaq6KKMNuqoTKY8OpEpjnxhxA8/HPGFI5I2hEkRmIYa6hFZdiqQKV+IqmqonJpaUBj+q8b6Q6uuZrOJrLEW0ZurpoCK66pf1ErJr7KWyiisxK6an6mpJqtqGK46C6yrl0obarDMWhsqtHqFwkkkkVziSUzIamtsXJrIUce67NYBnku3aktEpHad1+69dTQybkvNSksrXajAge/AM7JkChHSYmuXIwMPLEegJsVLLBG71qVJww3/q9ImR/z6Bb12zYFxw5y8VK6oRGhMFycjN/zuS5tQEkYYlJwr1yUtD6xyo4/kjK8crjLs872uRjJ0u424evHR6875aChMr/typ0IPPUcotYYi8tB6doqzzztPtIkkm4BsmdEtOwLxQ48oAsjbbyviiNmTeSLwwHMsW1HSJ4vA7ffbidhsHiWO3D2HI49gbVElfzf+ttPQKY5RJ45XjkmtAvVdeeOJ0P3oI5tXnrSrjITueCK1ImK64xU/+snqjgu+5yawNw45o6/X7rfse6qu+9ueN1r674jUyvjvYQuvuyLBO/qJ76vzrmgl0G8uCeYEfTK844sMiD1Bkmz/NiPJf5/NlN6br/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOjiUgACH5BAkEANUALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKi4sKzYwLUM1L0w5MVQ8Mlk+Ml1AM2BBM2NCM2VCNGdDNGdDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhENGlENGlFNWpFNWpGNmpHN2pHOGpKPWVQSF9WU1xaW1VdYlFhaUxlckhoeEhoeEhoeEhoeEhoeEhoeEhpeUhpeUlqeUlqelJvfVlzgF52gWZ6gHB/fICGeJaPaaSWXqqZVbCbTredQb6gNcCiMMGiLsKiLsKiLsOhL8SgMsedNc2XPs+VQNCUQtGTRNKSRNORRdOQRdOPRdSLRNeBQtl4QNxrPt5nPd9iPN9gPN9gPN9gPN9gPN9gPN9gPN9gPN9hPd5mQd1uSdx8VduGXtqTatmedNijd9mofdmvhNq0itq2jdq5kdu/mN7Dn+HJqOPOsOLUu+raxO7gzfDj0/Ll1vPm2PTn2vTo3PXq3/Tr4PTs4vTu5vXx7Pj18/j29Pn49fn49vz8+v79/P7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AKsJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3ilqc0lRlcJ8wYLFS5hKnT17BDWatGvSXSqp5ljptW3XYVLPtlj7tu8wuy2G6uK7uGzJpCg5WqTmzaJJlzCCKV68i27Hl96o2c59+yJSFUH+Uad+vDEpR93Tb29jiWLv8bfFPEavvn50ie/hvwbj2FL9/2+AF9F0+t1mXhv//eeIRGEUaJsXjUmSYIICPpSfg8Ax1siE/933kCUOvlaeYtpxqN4kEYnCRYikgdKYifU1gh+LGTIGo3oLSkSgflxcpxhzN3JHyUShrKhfe47RF6QaHqbYIHVfuPjYJEuq0cZFlRhp24iPlXgjihiBUkklYlQi5WSbBLlIcBZJaGIbZ7I5kSUIJrhInHJOBAqQJ+ap0SaUSLLIIpJcUqGfiCaq6KKMNuroo5A6BpqPkTZEJhNFZMqEGENWupAoYmQq6qhifOIpQpUsMeqqmS7R6an+A32iKqusLmEqrAKFSiutTuBaDSS7BgsJrroGy2qvsBobLF+dUPLIIoo4MgkmLmGi7K5c0kXKI3R06223i3TCUiXX0jrsXZgo8u263YKZErnlrpptXJ2way8d7qIU76qUwkWKuveyK25KTuyr6V2RBGyvIoeWNIbBRchXFykK3/uqSaJgGu8S/b6FScX2RqISvOXOC9ckILPLyEoPXyuxXY2kzO64s9K6hMlxcSvzty2BSqsYHctFyc7ervwSJpVAQgm1fH1MNB0in0rx0zg3ivLOa/q6yM4D41pvyvl6vbXCF1sUdGWkJGwvI6FcRIkiiAAidyKQNIlZJ5VMwgjJI48sfZEoicgt+OCS+FqQJYYMrrjciGxieDWbLC45IIec7eghk0v+iK+SZD653ZEm7vniicAKyuiSIwLrJahLDmvnrSsOuqOUxK44no+ybrvchuC6O+O4xr172JFGbnvlnNvuuOGYo17449XAPrkhSEIPefOKJ2I5rKJcIskj0Fkv/vjkl2/++einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClpwIQEBACH5BAkEANQALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKi8sKzgwLUY2MFU8Ml8/M2VCNGlDNG1ENG5FNG9FNHBFNXBFNXBFNXBFNXBFNXBFNXBFNXBFNXBFNXBGNXBGNXBGNXBGNW9GNm5HOGxKPmVPRl5UUVZbX1JeZE9hakxjb0pkcUllc0llc0llc0llc0llc0llc0llc0llc0lmc0lmc0lmc0tmc05mcVZlbWZkZnhkX41jV55jUa5jTMNjRddjP9xjPd1jPd5jPd5jPd5jPd5jPd5jPd5jPd5jPd5jPd5lPd1pPdxuPth/QNaIQdSPQdOTQtOTQtOUQtOUQtKUQc+WQMeZO8CdN7ufNLqfNLqfNLqfNLufNbyfNr2fOcGgPsahSM+lWtesbtixgda0kNW4mti6oNu9puDBquPFr+PItuLNvt/Pw9/RxuLUyOnay+3fz/Dh0PPk0fPl0/Tm1fTn1fTn1vXn1/Xn2fbo2vbp3Pfs3/jt4vr07Pv17fz69/38+v79/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AKkJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3swZMihIoDqPdLQlC5XTWQw5Et3R05bTsGNvCW0ZlKREhAglkkT7oiMssYOfxrKasiE+yJMjL3TRE3DhwrF4kpxJkPLrfARlqvgaOvQtkTP+YR/PR9LEQ97TN3oMKhB57IF6P9SS3jt4x4Xej2cesX56x+LpN952Dz3in3fmMbaIgOMlApEjB0JX3GL5MXgdfw4ZGGFwjzQ2iIXXDQIRKBsG59iHICYXSESmlUiFFo4RkmJyIkKEnouHOJbIjMgZEhEoz0WYhXyKScJjeRJpGGGHj1mXoiAU3ehfjpB1AkiKBE70W3rETbajhT5aBIqUsR1CJGTHCRhmRpI4cogjCV5WHXmBZMmaRokUguIghSRy5p2ABirooIQWauihiCaq6KKMSuWJI45s0mhEm3TBBRCYAkEEFxNOmtAhRGQqKqaFTOfpQV2MqioQXEAimCf+k8hkyKqrcuEXKIkMQseudPApKUuQ0ErrmnlNIgivyO6qCEuXCrvqr3glkuy0vZp6UrDOrkpsXYpQS22NJx2S7apd4OWJt94ue9Ks445q6126okuttSQ1266od50rL7XqlsTuvZi+W1ck+1JLSLgAZ1quXd0WnCy4JGGb8LZyxeswsijZe2+nc0l7McYnOZIwhnVB8jGvEPt7r8B2bXKysippTCsRrub1Mh2xqgSqsF3QexfBHzvIUqWhisoFI355XLAgf6a0iZs1/wWKxfLmfGpBSn/r89UDTUL1roL0y3VCkyiiyCRNQ6TJInq6oVskYyP0SSFj1G133W50Eje7QZG0cfffY7QhdNyaAG74GFSO7cbhhmsy9iGMG+4G159EfvgiV0diueEkNwr55n+nzCghoAN+9SCl/33156mPIfqimrc+RueMVi475lfTnfrklC9euuNjFw564mP3bfnge899uBvA702QJrgN0sYgh8Dt/PXYZ6/99tx37/334Icv/vjkl2/++einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIQI0EBAAh+QQJBADUACwAAAAAxgDGAIcAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkuKyo4MCxFNC5PODBXOzFePjJkQDNoQTRtQzRxRDR0RTR2RjV3RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RzV3RzZ2SDhzSjtsTkRkVFBaWFlUXGFNYGlLYWtKYm1JYm5JYm5JYm5JY29JY29JY29KZG9LZHBPaHNTbHdZcXxieIJrf4ZxhIh5iomAj4qHlIuOmIuWnIyYnYugoHyooGKtn1GunUOwnT2wnTuwnDqwnDqxnDqznDu2nDu5mzzCmT7Klz/PlkDRlkHSlkHTlkHTlUHUlUHUk0HVjkHXg0DadUDcbj/daT/dZj/dZj/eZj/eZz/eaEHeakPebUbecUnfeE/fgVbei17ek2XdnWzcq3Tasnnas3vatHzatn/at4HbuYTbu4fdv4/fw5fjyKHmzKno0rXq1b7s2MPt2cfv3c3w39Hy6N3y7OPy7eXz7uby7ufz7+n19fL39vP5+PX7+/v9/f3+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gCpCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnzx8/YbKkCSSoTZtEbf60yMya16/JVNK4qQuWKbinaPkC6nIl17CDr1n0yaIoMbmT48ZyqfIi4dDXmOFEsZMW5dindJlMKXr0MqQm/m7Jnl1MZE7evUOSiJx89k6QyaT3jgkiKPfktTz+NN+7JIjt4YcdfI1p0l90i0DkhYDZZeJYdwdCB9F1DCpnXmOQRCjhQxVit11jEGr4mhkTdpjchYwZKOJrCT60oIm4OdgYKSu+RgmAMOJGYGPPrVjaQ/fBqN9+wEX4X0QBVrhJZJVoSEZ4Eo1XIYqQZdhfGdRN1MltAn44GSZFQgcJlBSJ8mJ2zF1GCiTywWbGIvVlVJtyWHjR22aaaFLcR51kssmdoAUq6KCEFmrooYgmquiijDbq6KMmkbIJJZRoEkpNmVBSyZKEbZIIHaCGSseNL1GSBBGopjoGp36RMomo/rDSoUiWKnlCRqq4pkqlXqR8GmuscaKUCRK5FksEGX018uuyZJYkyqnGFrurXZgsu2wjKI0RbbQy4mWttayOdMm20SaR1ybfLksqSWKQG60neF2S7q+KmHSru8U2d9er88Zq0hH4SouXIv36W1LAxY6BFyUFi1pvSdAijOq0clXbMKiR2Ctxqt3WFcrFoK47UrsbEwHvwCBfWtImJSOb18cNz3YSyQEfcXJelRT8MEpKICxyXgynq0izJm0S8bZh/OWptTKvJEoY2x6h71+kVKKIr7JOorJLmYxxNBljqFYYKVvTJIqfhYpGKSZ7QspQJYT8IffchATrtkGfIDL3zN5zJzLK3QVxEjffhBPS9t2jGEL44n8gArhAkjDOeNOQciI544bfXcnljNvtaCKcL/5zo4qHzrfjbg9u+tyH3H3I6nsncjclsM9NuaOY1C73j5COorrphjyuSe203h256aP3rjfnRz4+ECa/710I784PNAolhwxOyCGU/F19Qp94//345Jdv/vnop6/++uy37/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrwgAhMoAIXyMAGOvCBEIygBCdIwQpa8IIY9EhAAAAh+QQJBADVACwAAAAAxgDGAIcAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJyctKSg9MCtKNS5UOS9dPDFlPzJqQTNvQjN1RDR6RTR8RjR+RzR/RzSARzWARzWARzWARzWARzWARzWARzWARzWARzWARzWARzWARzWASDWASDWASDWASDV/SDZ+STd8STl2TD9rUUpdV1dXWl1SXWJOXmZMX2hKYGpKYGpKYGpKYGpKYGpKYGpKYGpKYWtLYmxNY21PZW9TaXJXbHRZbnRccHVgc3ZkdXVreXJ1f219hGmFiGSPjV2XkVWdlE+jl0immEOomEGpmUCpmUCpmUCpmUCqmUGsmkKumkK2mkK9mkHDmUHLmUDQmD/TmD7Ulz7Ulz7Ulz7Ulz7Vlz7Vlz7Vlj7Vkz7Xij7Ygz/ZfD/bcT/cbj/ca0DcaUDcaUDcaUDdaUDdaUDdaUDda0LdbkbedEzfeVPehF3dkGjYnHXSpXzPqoHSsInVtZDXuJTYupfZu5rZvZ3avqHUvaXTvavSv7Hbxrncy8Hg0Mbr3tXy5t/06+f28vH28/L39PP9/f3+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gCrCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPmUZ5HgqI0iY3pSZZCheZoqrTp168tmVqNERQc2LhNxxGVUdSnTqFmXx51O3duOMInihpjpblzL50suzaeexLFTs6zOw8DWjIn6uBB/kkEo728lS2qI8cBT906ROzmy29J7pg9dTgQRcWPPwZyKPvUddeQF/vFJ55j3wGYW3oMjVJgfJw8BoqCCzoEyoPmhfHYKBTi9hB8GGoHWXEdxvEQcyGK+Nh0FFLyYYrZaQEZcR0i91AoMG4XWYIKMtiQKTk2F11kLIJniURhBMmbdyQed2BEo2gB45CTibJedQJKBOKDYGBmSiibbMKJjxVxgqEXS9JWUSgEQkifmhSZwkmSz41BJpwYiRIcnnz26eefgAYq6KCEFjqUKKBcEkkklmiSpqEKmXIJH5RWSikkj0JakCiRWOoppZpoapAon5bKR6iiCmQKJKaWmilK/qBsMkknT/41aaufQvImSaOQMcSvwA4hRil+mYKrqbWStAkSwTaLhCd9kXrsp5ecNEmz2P7qnl6aTPtpJCZtku24ydp1q7eWljQKs+NimwSxeZ2LLqUlidHuuNveBcq8lYJLErv3NttfXtLyW+1IowQ8rl7G8stHuR55onC2d9LV7byQlCTuxM1CTBer6L76ESgcNwsvweiiSlIpJQOLRLTTegxSEi0PMTBfkpoKSZYlXdsytH8hqigkl4AicklllCxGqgKtOzESJ6fqCcDjJlGxl6Ec7VAp9uIbdWagQOIIImQjAols102S9K9jTCIzZaZIUvbcZDty9Y2riTI2vN18H8l0NabszTffbwtqyeCIN7IroaEg7njGoh7uOOKpQjI54ncDejniEUI6yuaDZyIq6HyLrukjpM+d+Z9yp0724oKC4joijzAdietaC2pKI6SbzjQovF/u79/VjGJ54p0TP1AmgpPdSCQ8Kz9QKJyAEr302Gev/fbcd+/99+CHL/745Jdv/vnop6/++uy37/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrwgAhMoAIXyMAGBiogACH5BAkEANcALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njg5OjxBQj9HSkFLT0NPVEVSWEZVW0dYXkhaYUlcY0lcZEldZUldZUldZUldZUldZUldZUldZUldZUpdZUpeZktfZ0peZkpdZUpdZUpdZUtdZE1cY1ZZXGFWVHFQR31MPYJLOYZJNohJNYhJNYhJNYhJNYhJNYhJNYlJNYlKNYpNNYtQNpFhO5ZzPpl9QJ2JQ5+QRKCURaCVRaCVRaCVRaCVRaGWRqKXSKOYSaSYSqWZS6eZS7CZSLmaRsCZRMeZQc6YPdOYO9SYO9SYO9SYO9SYO9WYO9WYO9WXO9WTO9aMPNiDPdl5P9txQNttQNtsQNtsQdtsQdtsQdtsQdtsQdpuRNdxSdR1Uc18XcSDa7+NebyXiLuilr6uocK3qce+rMvBrM7DrdHErdTFrNfFqtrFp93HpuHKqOXNrOnRserTtOvWuuzYv+7dyPDhzvLl1vbw6vjx7fjy7/r49/v6+fz7+v39/f7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AK8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5M2ZVpjJRmhMpE6lTnj2WktOmtevWmlJrVHXpte3WkVDLtkjptu84qnZTJOW7OCXhElXFKV6clEVTlShVMhXccm3mvuVMVDWpiffvTZj+mKocCXvx6g8tMQHPvkklyuaLl4JIqb39SZJPxfed6aEp+wC+B5l++9nWX0OqrAdge0zo9liBts3XUH0L3hdZeRC2ht5CklQIYGTXQaidQx4C6GBjpywHoXMN/Vdie5ZEJgqExznk4ovgCQhZb/EB95AqOLI3XmS0mTfHkA8pGGQTG0K2WnEHRtThkkxYpgopopF2iSgnQmTJkk3UiNxD3eFY5ZgQJfhig2hGZIqSADIRY5sRqULhfU3S6R8lU4Y3yZx6XoRkoIQWauihUaEyKKIOqQIKJH5E6gcknSzK6EGlSKqppJ9cmlAnm4YaaZ6XgiKqqJB4ShAqp54Kiqr+AkHaqqioqMrqrKJ26ikpuIraiaqf9CqqSqRUEkkklZCSSmCyCqspSpN8Ie200kqyrF+gOvtsSaeQQe23X4xhKV6iaCtpqiSZIga47LK4lynmRqrrSN6yC+4Y1+4Vrx8SihStveyiuxev2v460ikAAzyuXdkKS2pHnCRsL358qeJsv/5KzG4kfqnSMKq1lgSJxuCSAVimuaI0MsnUjjFYKaB8UkrIKEnCMrUCM0rJzdNSfCkpPEvLCawrs0xGvpeesi7LC+fXSSSPJPJIJJ10OSHLPl/WSSJcd921wRD9m7AkmZkStddoS900QqbUe6+7Vp6dNtqPPKxQJpKsDEmtJJQgbdnWc89NNqylBG74KLBGYnjgHKvayOKBq3oK5IGvTecolM+N+KWFZ442xoeq4jnadgcqt+eNJD461417esrjqFuN6Cejz6s65a3DKhDghoOt+0Bmz/0I6L8DH8rTnYRiefHMN+/889BHL/301Fdv/fXYZ6/99tx37/334Icv/vjkl2/++einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAFGBAAIfkECQQA3QAsAAAAAMYAxgCHAAAAAQEBAgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbHBwcHR0dHh4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKSkpKioqKysrLCwsLS0tLi4uLy8vMDAwMTExMjIyMzMzNDQ0NTU1NjY2Nzc3ODg4OTk5Ojo6Ozw9PkFCQEVHQkhLRk9TSFRZSVddSllfSlpgSlphSlphSlphSlphSlphSlphSlphS1phS1phS1phS1phS1phTFphTVpgT1pfWFdZZFdUclFJf09Bh008i0w5j0s3kEs2kEs2kEs2kEs2kEs2kUs2kkw3k003lk84mlA5pFU6tFw8wmM+zGg/1GxB2G1B2m5C2m5C2m9C2m9C2m9C2m9C2m9B23FD23RE2ntC2YVA2I091pQ51pk41po41ps41ps41ps51ps51ps51Zs505s5z5o6wZc/rpVFpJNIm5JLmpJLmZJLmZJLmZJMmZJMmZJMmZJMmpJNm5NOnJVQnpZUopVZo5Vir5hquJx1vJ94waR9waaEwaiJwauNw66NybCKz7GH0rKI1rSM2LWR2bia2r2i2sOp3ceu38uz4tG559e/8OLN8uXU9Oja9uzh9+/m+PLs+vXx+vXy+/Xz+/b0/Pf1/Pf2/vv5/vv6/vv6/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AuwkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezHkuqlKhQp1S1TlkKESoUyN6VKo0R1SSVMtGZOmVa4ynZuuOZPs2xVeRdOu25JuiJeHCSRWPmBu57kfLIZ52rvtUdIfHqc8eNbFVKUyRIv6FKtXqcnDtsjNFbIWpifv37jFZRj+bEsRUVODrb0IlFWVK9KkWykOl7GdgE/5JlkmAqSnXUCv5HagfFZONwiBqqDgUiYQGyhfZK48waF9DqXB4YIKQlRLgI6Q1FIqJBnInWXbaydjQhjDq5+GHAFL3CUQR5vheJJWNEuJu1kEkhZDwEVmZKqFQcmQklozSG0Q4MtnEjpepcuVE7WnZxIDXMTSKmE20ViZDQebo5JoLlSikFC3CuVCYMJJpJ0N4SsjlnguVsqSB/QEKUSuhgOdeJJjoaehysJwyyiim1PmoQ6bskcemnO5h46UJweIJp6RyykmGoB4ECyeltprHHv6mpGpQJ666ugcssg5kSq21dpKrQJry6mqssu4qrKufXlrKsa76KuuozJa6R660RltqrqNYSyonuRqrbR7OpqrKt5smOxIpoEwiySSYlIIiYNVau4elIp0CyRf45vvFGKAIpkqw0TpIEib6FoyvJO/2RYq14Y5EsMEGj1EeYNAK2wmuJJEC8caTCJYprwKP1MoYG28simCwkNIJwJ14gmpJD5ccsWGwvIySJDJvnPCjJOdscMiPpuIzxH8aKvTQBRdtaM9I43uyrDg3je/Ok5kSCieTgFKKzQ7FjPQYmJUihxtkl+3GJPTGyfTQ/Vb2SiVmx+2GHI4yFErTklj2ytkccvftCUSTDD0G1Y9x0vfhxD7oNcSQJElZKYcfPseXDImytr5KRzZ25H3XzVAromAiyRiQZO2425wfXkm3qfc9R66ftN435YbGLnvcaQMK+e1ly5ErKryX3XGuwZP9N+zBy5H7o3Tw7jmowMs+/K8CmcI355XQnuvbh8uhJvUGmfJJJXzTwUkoy4Ov/vrst+/++/DHL//89Ndv//3456///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgRCMoAQnSMEKWvCCGMygBjfIwQ568IMgDKEIKRIQACH5BAkEAOIALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODo6Oz0/QD9DREFGSENJS0VMTkdPUUhSVUpVWEtWWktXW0tYXEtYXEtYXEtYXEtYXEtYXEtYXEtYXExYXExYXExYXExYXExYXExZXU1aXU9aXVFZXFRZWllYWGFWU3FSSoBQQ4pOPpFNOpZMN5hMNplMNplMNplMNplMNplMNppMNppMNppMNptNN59QOKZUOrBaPMRlQNJtQtZvQ9hxQ9lxQ9lxQ9lxQ9lxQ9lyQ9lzQ9p2Rdp8SNuAStqHStqNSNmRRdiVQNaaOtacNtWcNtWcNtWcNtWcNtWcNtKcN82bOcaZPLyXQK2URqCSS5aQT5OPUZGPUZGOUpCOUpCOUpCOUpGNVJOLWJSKXJOKYJGJZo+IaoyHcYeGeYSHfYOJgYSLg4eNhYuQh4+SiZuZjKefkK+klLiqmr+woce3qc6+r9bEs9rKuNzPvd/Vw+Pcyebgzubi0ebj0+bj1ebk1ujl2ern2+zo3ezp3+3q4O7r4e/s5O/t5fDu5/Lx6/X18Pf28fr59vr59/v6+Pv7+f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AMUJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3tx0FStdnEfeAuVJkWlFkz7FCu2RVKTTsE2LYr3xU+zbijyBpm0xFG7cn3hXXPX7NynhEycVxx3pFnKIxJfjNvX8ISnpuENVdwgK++3g2xn+2vYeOzzD7uRPe5IoyxQoTZg4iTqF67Ko9KdBRRRVJYr//1Fcwopl0eF3nEOyYALggv7pR5kur+HnXEO49Mcgg5xUhgp+szmUyYUgUkfZeNit55ApIIJYRX2T6VKadJGs5pCFKTLoIGX3FffJbhTWCCIml61ConqoRHSKjxdWoVksppiyCkWgIHmhLOYpFKWUC1JZJUJHYgnglgnJ4uV/QIKJEI1YdmImQqKMWYWWaxqkIJajxImQLGimmIlhs6BSSh55kGJKKimxYomPnbAomC6l8OHoo47mMUtKVzJYxSmFpZIHpJw6iilKsojSCSZVYAKKKYoKNkunrPIhop3+Bm3aaqeTwkoQKbOymoetA+mSa6tF8prKr6weaKspxHa6K6+4Jsspr+I06+yj0CI7baTQDnstH8bC6uu2wfJqrbPLQiuOrMnWau6qyb5qrjia5qrHpye5Ioonk6Axyam5HKaLtJxKSukYBBdMMBruEtYnKYAKSihKrqRh8MQEe9Lvu+LQggbFHFeCsTiTcCxyh9CKIrLIaNBi7hkni2yirbS0LPIk0KIis8jQgnIzxypjBksppKgC5c4U90yZpnIkrTQe9DpkM9EFn2FZKEpXrbTFD+UCdcE0T5YLHlaHLUcdsDzE8tY3RpaH2GLj8ZApW59xcWSnsM02yQxVAnXGwo7lUofdbNviUC5ny/xyZKkAzna3C9EScstpRyaK4mJHzpAohRuchiuWgUJ52G5HRIt7lUziiSjhVrb251bnzHrV5cJKyutKaycs7UkzbqcdtNcheLa06w4r1Z/Hbu7qgOMxN8ak/H33xwXZAgrYStuRR9nQI5TKw9l37/334Icv/vjkl2/++einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBsQQEACH5BAkEAOcALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzEyMjQ1NTY4ODg7Ozo9Pj1BQkJISUVNTkhQUUlSVEpUVktVV0tVV0tVV0tVV0tVV0tVV0tVV0tVV0tVV0tVV0xWWExWWExWWExWWExWWExWWExWWExWWExWWE1XWU1XWU5YWk9ZW1BaW1FaXFJbXFJcXVNdXVRdXlVeXlZfX1dgXlliYFtkYWFqYWpyYHR7YXyCYYGGX4WJXIaLWoeLV4eLV4eLV4iMV4iMV4iMV4iMV4iMV4mMWImNWYqNWYyPXI2PXY2OXIuMWY2HVpF9UZV0TJpsSptlRZ5dQKBXPaFUO6JROqJPOKJON6JNNqJNNqJNNqJNNqJNNqNONqZQN6pTOLVbO8NlP8trQdFvQ9VyRNh0RNh0RNh0RNh0RNh1RNh1RNh1RNh1RNh3RNh5Q9h9QdiHPdePOdeXNtecNNedM9eeM9eeM9eeM9efM9efM9efM9efNNefNdefN9igO9mgPtqiRNumVtqoadiod9apg9SriNOui9Gvjs+vkMqxlciymMizm8i0nMm1ncu2nc63nNS4nNi6ndu7n9++oOPDpOTGquXKsefPu+rVxuzZzO3c0O7f0/Dj1/Hm2vTp3vft4vjw5/rz7fv28Pz38vz49P369v37+P78+v79/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AM8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sxU2C5VcNDAgcXLGOePyl6hWc16NZxfpzkKC926NppXymJjJGa7NxpVui/S9l2bV3CKu4j3hmP6eETlvmc5h8gbum3g0x3+sm4bTnaHybn+127+XWF48axzl1coDD1r7+sVKnO/Gnv8hMPFG4eobFYsMFp4AccswWS2HXpwqOeQL1oo4eCDDsaiYGWwoCfMQ8rEAuGGDnpRoGXK5EfcLhCJweGJWhBzmTKuKAfHfg7NcuKMYBgoYn3kNURMgzOeKItmwvACiyq7/JKjQxr2iOJ9CoGh5IwqMnlQFk+e6IuUBhFT5YmxYFmQMlty2KWXBFEZ5oNXEmZMMSs5eaaDE/aVzC6olALKnajowqZJSZ6ZRWDDnHLnoISSWJIyZoaZpl+6EOrooKgkU5IvZ4oB2C6PZgoKKnxumUWcehljp6aPGkpSnzRG6RcqpGZaypH+IQXjxYlZ/AiYMa1qqgtKvsgCBxhixOKLqn8Fk2umqZBJUKPHOnqKsgOx2qyj0ArE7LR3llLtObxgC+m2w3h7567bjortMNueYyy2yaZ7TirTniKpu8kImmsp6LorUDLXZnrKnvoOFOijpZAbsEHJDLOLLsHAevDDQiFjiyp0AAIIHa3gAvFAvtxh8ccf2/Hhwa2AbPLHtRzsysksA2KLvsG0zHIexEJrh8ws05FuLzi3vOhlxsxL0co9n/xyZca8kkolkURiSSq7CP1QKkWf3EpluzDd9NZNWwJMRB5XDbLOkiWTCtdob/0KRDeL/THZkZ2d9tymMqSK2x+7IpnqL3P3XYnDB9mCt8W9RJaM1n2n3S5DMQ8+smO7JJ54vgxR7bbeka0ied+FN4RM2EXbMZncm6Ody0O+iP34Y6XPvXhDwbTdssiUWdI62qtEhEzJLGNOGem3R1L3Q8j44ooqqtjyM2W5BL/119UC43wklbirefDLK5uM7a2/vi0wiCduidTpDoOK5KmQr2/zaVeS/cPG+JJLLsCov/H9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTKEKV8jCFrowXQEBACH5BAkEAOAALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHSMkJCkrKzEzMzY5Ojs/Pz9DREJGR0RJSkZLTElOT0pQUUtRUktRUkxSU0xSU0xSU0xSU0xSU0xSU0xSU0xSU01TU01TU01TU01TVE1TVE9VVlJYWVZcXFleX1xiYWFnZGdsZ2pwaW1zanF2a3V7a3d9a3h+aXmAaHqBZnyDY36FYH+HXn+HXX+HXYCHXICHXICHXICHXICHXICHXICGXIKFW4d+Vo9zT5doR55eQaRWPKdSOalPN6lPN6lPN6lPN6lPN6lPN6lPN6pPN6pPN6tQN6xRN69UObJWOrtePcVnQMxtQtJyQ9V2RdZ3Rdd3Rdd3Rdd3Rdd4Rdd4Rdd4Rdd4Rdd7RNd/QteEP9eNOteVNdecMtefMNegMNegMNegMNegMNegMNegMNegMNegMNegMNegMNehNNijO9qkRNymT92uYtaxetS1idW7lNrFodzKrODPteTSu+nXverXwurZxerayu3dzu/g1O/h1u/i2fDi2vHk2/Hk2/Hk2/Dk3PDl3PDl3fDm3vDn3vHo3/Hp3/Lp4PPq4PTr4fbs4vft4/jt4/ju5Pju5Pju5fjv5fnv5vnv5vnv5vnv5vrw5/rw5/rx6Pry6/z28vz28/z39Pz39P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AMEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNrJkkKUqNFjSCR2izyUpIoqFNHSXKJtEdHqmOjbpTLtcZFsnMvso3xUe7fj3hXnHX6t+wks4RPxG1ct3KJxZvHTvIcYi7pv2tXb3gJe+7W2xn+UvIum1J4hrPIxx59fmF09e0ZMle/O77C7uqjmLevsJF6RvwtlMt7xiWhHUSOMELEDTcAkYQjt2xGCoHHsfcQJkAwqKGGPeynGWy/OSIRIxuWqCGAm83iyCKnJbGII8lF5IiJNN6AYoAIkbJDjTRigiNCQ/BIYw8R/kgQJULWKKKRA82YpIk3AlZJJI1IQotKJD5Z4hBSIkLIl2Aa0ghKQWq54Q5+2dIImGyCmciVJZVpJoNA9GVLIm3mSYghlZSU5Zw3UMeXInrqiYgtJDkJaJR4RVJooYpwBiiDPu5lyKOF9jnSn1oKqlcqmBY6JkkZakkkX46GmmciJWGig5b+Huq1pqptGmISKaXWCESlfOFJa5socbohI0X2NeuvX7KaEiWOJPEgJcX6lSqyhETKpEC0UPvlqNeC4+uvhsDZLS2X/hpJtwRNG6qy6A507KOJINouQZV4Keq8B9kSSSLlEpKIIqnguxAtAQts8MEIJ1wXrwoPRMkidIQhcRqKBJewLYtIrPHGisgrMCZnbCyyxGZAIrAtIY88shkMd6uIyjCncdktkzSiiB2KMAKJLBRBAvPPjEJWiR1yFG100dxCNMfPMJ8x2S2MHC110Yl4ElHKTI/s8WOKTO11HdEuZEvWMMfaGCRep21tQ5SQrXLSjMlSR9ppm9wQJm6PbLfbY1HT7bUdD+UtsimQJeJ32mEntLTgEkd2eNqaMsQI42Gs3Zgnj3sNd0IoC24G4Y/JkvnUmyfUdt6lLza61JE3lDHZlj9m+OpFJ74QJGYwnTpjfa8OuES2vDxyGi1Ddsvcq09iESWNMNIIJVtTNsnqsbucOdgCQ314IjwfPPTXSyZ8SyU2J5JII5N03/D67Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEd4kYAAACH5BAkEANEALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFSMkIzU4Nj9CQUVIR0hMSktPTUxQTkxQTkxQTkxQTk1RT01RT01RT01RT05SUE9TUVFUUlJVUlVVUllVUWFVT2tUTHdTSIZSRJRSQJ5RPKhQOq5QOLFQN7FQN7FQN7JQN7JQN7JQN7NRN7ZVOLpaOsBgPcVnP85xQ9J2RdV4RtZ6RtZ6RtZ7RtZ7RtZ8RdeARdeHQtiOQNmZPtmfOtmjONmlNtmkNNikMtijMNijL9ejLtejLtejLtWiMM6gNMCbO6qURpSNU4CHXnuFYXiFYniEYniEYniEYniFY3iFY3iFY3iFY3iFY3iFY3iFZHmGZXqHZ3yIaX+KbIGMb4SOc4eReIyUf4+Wg5OYiJaai5icjZqekJ2gk6CilqKjmaSlm62pnLWsm7yvmsOzl8i1ls22ltG3ltS4lta5ltq7ltu8l929mt28nd6+oeC/pOHBp+PErOXHsOfJtOjMuOfOvOfQwOnTxOzVx+vXzO7a0e7c1O7f2O/i3fDn5PHq5vPr5vPt6vPv7PXy8Pf18/z7+v39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AKMJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmClniqTI0aXMJvGsAUO6NJ3PoD9eilO6NWk0ilJ3dITGtW0wdGRrzFT7tm08ujHO8e17UvCKjoj7bnOcoh3lvjM1l9gG+u1I0yNavw08u8NL23/+e38Y3jWi8Q7hlC+NHT3DO+tJu28YKf6c+Q3hh0cjHf/CTKNt54h/DU0SoHJ3EOhQJvrdtkZ7FUninSNwHAgGHHj0JxEebpAhwodkuLFIdpsZV1EmZXyo4opxaKigQouksOKMH6og4YsJUSIjjTSm4GJflSQSyB9LBJLIIyx5yCOPavylSSBSRClllEtUklIdS2Y5Il+PLDHll1IskQhKKmS5ZBl8VQLmmlIEYlImZi6ZAl9esgmmlSQ5EueSP9YFpZ1gLlHSHXvyOCBemgDK5pgjLVIojTfe9Yiia7o5EiWPzqjXn5RO+UdJKGT6IZp5cdqplCWpIaoIdWx66pf+JVES6qMq9EmXqad+Omimh+Y16atRWlpSG4XGwVeiwErBqEl3zMojClvyhauiS2iSEiUp0qiGrXnV2SmeKzlyRx149AqYmp0Ki+NBXSqq7roHPclmlfA2FOSQRQaCZL389uvvvwAHLPDABBf8USSOcCtwJn0QUcPDNfBghLkCO8IDxBg/3IfCkGXyCCGEHPIIxw7xkfHJEUM4mSRHDOHyy0MgYUlFg6CMcg+VHQLzzkMUcchElehgM8p+TPYHz0gDItEQQ9uscmM6I430vgs2bXPRj1lShNRIF0EyQY5YjfIQkB3NNdK6NuSH2CfrANnWZ/N8xENGsH1y1nFL/dDO2nZD7LZjjeQ9tUOL9A0x2Y5FLTjMVC9UieEP8/HYI4vvPLNDFxsebWOVv1wERJEYbkRkLXeORER8i83D14UpvngjS4utA8WOIVF52qg3PQS4kWktuNcVRVJ3xjwMclkjcHN9RKQWRWLIIAmDlonZSbO+biOA2O4yEoA0brBAl38v/vjkl2/++einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY7EhAAIfkECQQA2wAsAAAAAMYAxgCHAAAAAQEBAgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbHBwcHR0dHh4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKysrMDAwOTk4QEA+RERCR0dFSkpHTExJTU1KTU1KTU1KTU1KTU1KTU1KTU1KTU1KTk5LTk5LTk5LTk5LTk5LTk5LTk5LT09MUFBNUVFOUlJPVFRRV1dUW1tYXV5aYGJdY2ZfZWpgZm1iaXJka3hmbXtnbn1nb35ob39ob4Bob4Bob4BocIBpcIBpcIFpcIFpcIFpcIFpcIFqcYJqcoNrc4NsdYVud4Zwd4dweIdxeYhyeohze4lzfYp1f4t1gIt1got1hIt1hox1iIx0jIx0k4VtnHxiqmpPs15Et1k+uFQ6uVI4uVE3uVE3uVE3uVE3ulE3ulE3ulE3ulE3ulE3ulE3ulE3ulI3vVY4wl47yGg/znFD0XZF03pG1HxK1X1H1X5I1n5I1n5I1n5I1n9J1oFJ1oNI14pD148/15Y415wz2KAu2KIs2KMq2KMq2KMq2KQr2KQt2KUv2KYz2Kg42ao+2a1G2K9L17FS1bFi1bJx0rKA0LKJ0bWUzLmezL+qy8OxzMm50s+/19TH3trP4+Da6+ji7Ovm7+7q8fHt9/bz/vz6/vz7/v39////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AtwkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5ctqY83CjDJWqjZjtGgZ0ybVZs4hW4UWzVr0GFeoPc4y1bo2a1SxOaKyzVtLqtwZXfXu/Qq4xVmrh9duY7ziKuW9YTeXmAo6b1XTJbaxbvtU9ohiuP4v/w5xu3jWpsg/PHWe9W/1DVW1F90KfsNX88XEst9w93ns/DE0i3nWMRfgfeFBp9+BDsVCIG+mnMagQ6ok2JoY9U0oUSytpJKKK/upN4uENM3CinSEmSjKJ5m0KEopIbrEihpJ8GAjD2S0QWJfr7DY4o8tdsJKSwPeaKSNRQDYVylANvmjKDuW5EqNR1Zp4F6sOKllJqKoxESVYPLwXl6zdLKllkOedEqYYBYBi16inKllJ1GC5AqbYZJBppxbplfSmniC+eZdrvCp5SgmkREomGnaZYqhToZiEpWLGundXXFC2qRJlVapBl5MavpjJyYV0amleLUi6pOJnnqjkv51vbJqi36SBKirg95l5qrFlaSKqzwkoVehoiJ6UhuuoojXKJrSidIslAZ6qV6z+MinsiaxYmqgevY1S6hbhhJjSrAoyua0fvWoZa0tpRKtjWpg+9csr5hiiit1ypiKKvJq6O+/AAcs8MAEF2zwwQgnrPDCH7kCop2ptJIrZt+KosjFijwySqMXrXKIHiCDLMco/ULGyiMYp3wxKfk6NMsoIccsMm6UlaLyzYpA0qtErsgh8896HDJZKjjjDEnLChECNNClRBYLykXfzK5Dpiy9dIaOjRJ10SUjBIvVSw/y2CxbF00z1WAv3XVhrpSNs7EOwZz2z2MuhorbNz8C0dkgc//cdGM2460yRH3/LHRjdwuOsd4P8V14yH8z1rbiF8PdkNyP61G3YrFQfvHUC1WduR5rF2Yx5Rwz9HXmhED2CuWgMyR64aUblrjbR0+kdN+xM6Z12Y/sHJErjoN9+NBQvz2uRN9aLQe6k8VCSvIXi7J5Ra0c4nPIg4wy8WWxuLJK7RTB0korSDOs/vrst+/++/DHL//89Ndv//3456///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgRCMoAQnSMEKWvCCGMygBjfIwQ568IMgDKEIQRgQACH5BAkEANQALAAAAADGAMYAhwAAAAEBARAPDiopJkRBPUdFQEpHQkxJRExKRU1KRU1KRU1LRk1LRk5LRk5LRk5LRk5LRk5MRk9NR1BPSVJTTFVaUlliWFtnXF5tYWJ1Z2V6bGZ9bmZ9bmZ9bmZ9bmZ9bmZ9bmd9bmd9bmd9bmd9bmd+bmh+bmt/bHCBaHaDZX6GYImKWZmPT6qVRbycOcmgMdKjLNilKNilKNilKNilKNilKNilKNilKNilKNilKNilKNilKNilKNikKdihLtidMteYN9eRPtaMQ9WGTNWET9WDTtWCS9WCS9WBStSBSdSASdSASdSASdSASdSASdSASdR/SdN8SNF3Rs1tQsdgPMZbO8RXOcJUN8JSN8JSN8JSN8JSN8JSN8JSN8JSN8JSN8JSN8JSN8FSN8JVOsJZP8JdRMBiS75qU7txXLl8abGMe6+QgK2VhquajamilaqnmqysoK+xpLGzp7S2qba4qri6rLq8rry9r76/r8LAr8bCrsnErs7GrdPIq9jIqNzIpeDIoeTJnubJnOjJmerJl+rKl+rLluvNlevPluzRluzRl+zSl+zSmOzRmuzQnezPoOzOo+zOpevOquvOrerOsOrPsurRuOvUvezYw+zbyuzfz+3j1+/r6PLv7fb08vb18vf28/j39Pn49fr59vz69/78+v79+/7+/P7+/f7+/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AKkJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLaTnhieMmxRs8mzCTDDWnhOnTptlwEg1yUwrUsE3jYd2RU+zbJe7Q1hjqNe7Yq3dfLP07NhvhFkMVx60HOcVNy2/PcT7xTvTYbqhLfHM9tvaIcbr+w/4O0bp409nJO4R+vsR09Q2Vt28Ov6H57sfrO2QjPrh+hrZdp9t/6/mGGwqzEfgQabi50YlzmTyySCakYMSJHnO44UYcoCGXCRE5hCiiD48oCBEph4ioooiDeGIiQ6SAuOKMPmTyokIpzqijDxW+xMked4T21yU6FpnDIS25VoEDTDIpwh59+WBkkTaqJMeSTWbpQAou5rXJlEUuopIIWpbpQAVC3jUJmDoOkpIbZpqJQl45sqmiDyhpEmec6dk1iJ0zonTBnnFqctcigKpIxEmbEBrnG3cRmWiIbpp0h6NmpnCXJ5OGKKZJcGKq5QV4/ZmoD12WRKaoWuLliZT+gJZ40husZkkqXo8AWulJe9TapKZ0sklEqiY16qsDkOqVCaw6fqpSBsf6lxeKgzBLxCBpqmQsq8n+5UmVMNEqagY3KpQCphdkW65Bd2BpphvErnsQJykM2mQFIhgq70OaaCLtvgAHLPDABBds8MEIJ6ywX5MMogYSSKgxCCWhJLwJERBnnDER6goMicYgZxzJRptUAsglHUc2ScgsIwHJRZ6s0cXMNHexRryOXdwyyyk7dEkZNQddxiWSYbxzyItO1EbQTM/cBmSaHN2yvhBd0vTV4DK2stQhvwyRJ0BfzfQZOCM2CNch7+qQzGI3/XRjD6OtcdIPmdF202g4FrfU3BCr8fXdVzt2Nt8Qq81QJoA3nXVilhAO8SRVJ8400Yxt4jgSPSOEuOQ1Z17Y4HIb3hDnNT8WitFcE1FxRGiQ3kUakFmONtUQAeL6H5HpvDPHFaXBOeyTfcyy1xVxEvbdZfwbmSYNDzKJJqtfVMnxVw9tMCe+Xz1swpUQYffMZhBRycIDfVs2+einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOelBBAQEAIfkECQQA5wAsAAAAAMYAxgCHAAAAAQEBAgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbHBwcHR0dHh4eIiEhKCcmMC4rNjMwOzgzPzs2Qz45RUE6R0I8SUQ9S0Y+TEc/TUdATkhATkhATkhATkhATkhATkhATkhATkhATkhAT0hAT0hAT0hAT0hAT0lAT0lAT0lAT0lAUElAVklAYEo/bks+e0w9ik48nVA7t1I5wlM4xVM4x1M4yFM4yVM4yVM4yVM4yVM4yVM4yVM4ylQ4yVM4yVM4yVQ4yVQ4yVQ4yVQ4yVQ4yVQ4yVQ4yFQ4xlU5xFU7wVc9u1lAq19JlGdWgm1gdXJoa3ZtY3lyYHp0X3p0X3p0X3p0X3p0X3p0X3p0X3p0X3t0X3t1X3t1X3t1X3t1X3t1X3t1X3t1X3t1X3t1X3t1YHt0aXx1cn11e390hYF0jYJ0l4RypIVvsYdrv4hnzYlj04lg1Ydd1oZc1oZa1odZ1ohY1YhW1YhU1YdT1YdS1IZQ1IVO1IRM1IRL1IRL1IRL1IRK1IRK1IRK1IRK1IRK1IZI1IlE1ZA+15kz2KEr2KQo2KYm2Kcl2Kcl2Kcl2Kcl2Kcl2acl2ago2aks2qox26w63a9D37JP4LRX4bZe4rlp5Lxy48OJ4ceY5M604sy3386839PD5NfL59vS6N3X6uDa7OLd7eTf7+bi8Obi8efj8+fj9Ojk9enm9ern9evo9uzo9u3p9u7p+PHs+/j1+/n2/Pv5/Pz7/f39/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AzwkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5Z7GbsmKNevW5ZO69MgZTVoOH2OfRcYqzVoOHlqpP4pu3TpWbI6radPWdTujLt2686DubXEPcN2yiFs8rnuPcoq3mNPG83ziLOm0iVWPmBt7ac/bH/5G9146PERi5EnrMQ8RT3o5fdg/7O4dvPyGs7Hbvu/wN3bh/D1Ei3vH6cHbZ8TA8soqq7TyCjAXGcMHcPtddowro2SoYYarFHPRLH0Y59oesdhnGTGpbKjiKKa8otFwsRGz4oyjuBhgQynSuKJ2Nyr0io4zptJjQscASSMsQx70i5EzupKkQT8yqeIqMNkSix+x2NJXK1Ku2FIxfPAg5pg87OFhXlx2uSFLs/hA5ps+zJJXlGqOQqVKfbypp5h84LVknaM4mdIsexYqp11FAmrjScWIUeiePpxZF4ZqonJMSnk+umefiOYoJY8ohaHpnmLgJaOUi6I0aqGS1vULKv5GpnoSoavqeehdx6S5YiqgDlqrnhWa+korqaDCyiu/uGTLr2/e+qRAzJL5bEF6RMtDGNMSFIu1fmRLULW/ruftQLy4uaoPvIxLUJujxqluQcXs8age6b5r0Cx7/DDmDyTay9Asrfor8MAEF2zwwQgn3JIvsgzryiu3wEhwMa1EYvHFFstqLy2IYOxxJK0EPO4rH5eMiMjT+lLyyq3YK8jKKyOJ0S2xvOIKLLBNBgvMKyNy0StPBC100BozRjLPJZsIkTGCDO30E4MovVjFSH+cnES/PK31E8EuVnXJRTNEyNZaS6zY1x8LChHQZD8tiGMvo32xzA8Z0/bWUh/misfcF+etEC13ax12YUfzbTZDbAc+9NuMGZMI34Mn1LTiQzPi2C1yC3K42JQ7/VjhSPu9UOKdE/KYMaCXnEjOEsHSudBqXx532ps7dMvrQdN9esOtJCLIw75gNPbrtQ+ZdeddZ0t627Gru7zWmg98y/BaJ+/vK4IMz4ggrxQ/sPcKhy/++OSXb/756Kev/vrst+/++/DHL//89Ndv//3456///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgRCMoAQnSMEKxi8gACH5BAkEANAALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODhMSEhsZGCIgHSklIi4qJjMuKT03MEM8NUhAOEtDOk1EPE5FPE5FPE5FPE5FPE5FPE5FPE9GPU9GPU9GPVBHPlBHP1FIP1FJQFJJQVNLQ1RPSFVYU1VfXVZoaFZtblZwclZzdld1eVd2eld2eld2eld3eld3eld3elh3ell3elt3el54e2R3eHN2c4Rza41wZqFoWK9jT7lfScRaQcpYPc5WOtBVOdFVONFVONFVONFVONFVONFVONFWONJYOdJaOtJiPdJtQdJ0RNJ6R9KASdKEStOGS9OHTdSHUNWHVNaHV9aHV9aIVdWIUdSKSdSPQdWTPNeaM9iiK9mmJdmoI9mpItmpItqqItqqItqqItqqItqqItqqItipJ9WpLtKpOM6pRM2rUc2uYM2xctC0gdK2jdS5l9a7odi9p9K8rNzArt7BseDEtOLGuOTJu+jNwOzRxe/WyvPbz/Te0vTh1/Xl2/Xn3vTo4fTq4/Xs5vbw6ffy6/j07vn17/r27/z38Pz38fz48fz48vz48/379v389/389/389/78+P79+f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AKEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5ckRDgwxZVrmHR43Pn3ngabR5ZCLPoFPX4KG59Ec/OlTLrrHHdcdEsWfLHmR7I2rdqneQ7n3RD3DdeIhf/H08tQ7lFnM3Vz0cesRE02fzth5xUHbZybn+Q8T+PfV28Q+ll0+EHiLz7M/bP8RT/nN4+Q7fH9dRvTKkRRoZot5x50kGCSBxuHHGGW3EMQeAFhk33X2SEaLgghgu2AYgFxmiH2g7FBjZHxmWiGEckFyExw7BjVZZICbGeEYcGg2yxyD9TbZIGzLGyCF+DsXRY4xtQAikQosMKeMfRy4Eo5ImytGkQiRCWSIcUyYkpJUlZonQHFxm2IaXBz0Z5oxkGiTImQsyCdMfeNBBBx4i3sXjmYK8VEcIfPYZQgoU2mWmlTS2NAgLfiYaQg+t3bUllG2kyNIfilaaQqN1QXKhkoG0tEgKlVbaQ16QgNkjHIS41EOooQZaVyD+d5bopqGshpqCkXhBIsgffwSSKkx71lrprGkKtKqwitZRLEEqIKvoqMsK5Oyz0Ro7rZ90VAsNHdf26SqZeHTLZ51kLtLstdBqS+m0l2o7ELfOfrvsIsfWqqy7BfEBaqUskIvvInX0cC4LPsiLb0G4Hqzwwgw37PBFiQCyByCFPDyQJHZoYcXGHM8hicOCaMzxyFZo8aPCfZCs8sbZHlzIyjCfrK0cMK+sxcfa7lEzzC1XS/POKmvhLtAws3fRIH7UkcUcdwTySGSJEL2yzBIhkgUSWGeNxBN3QCaI1CrXRtEdT2htNhJZIOKYJGCTnOdEdZwt9xNPN7ZF2xzj3J3j3HwL3djPbfst0dV8y+1HY4DgbYUdE91RON9PODZH21JOpMXjfKvNmCR3S13xRIRjbvbhjQnSec1bEBuR6HLf25gkk8Msx+cTPcL62T07BsgcIluxhRx9YATF7VqLLZkkghidUejE+5tl3MRj7S4iZRPverV+EJ+Fwpez7nyaj3Rf+BOkL+xH9WdrUXfDj9xBx9VQaFEH1RbXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTOGyAgIAIfkECQQA0QAsAAAAAMYAxgCHAAAAAQEBAgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbHBwcHR0dHh4eHx8fICAgKSclMSwpNzEsPDUvQDgxQzoyRz00Sj81TEA2TUE3TkI3T0I3T0I3T0I3T0I3T0I3T0I3T0I3T0I3T0I3T0I3T0I3UEM4UEM4UkU4VUY5WEk5XEw5bVg2gmgxn34rvZUlyp8i0qUg2Kof2asf2asf2asf2asf2asf2asf2asf2aoh2agl2KMu1p041ZhD1ZVI1JNM1JBQ049R045R1I1S04xQ0otP0opO0olN0olN0ohM0oVL1HxH1m9C2GQ+2Vg52Vc42VY42VY42VY42VY42VY42VY42FY40Vg8yFpBul5IsGBNnGRXf2tncW5uZ3B0XHJ5VHN9UXN/T3SAT3SAT3SBT3SBT3SBT3SBUXWCUnaDVHeDVniEWXqFY4GLboePfI+UipaYlJycoqSfq6misqyit66hu6+gwbGfyrOdzbSd0LWd1Lib17yZ2L+Z3cWX4cqY5c+d7dqr8eK88+nP9OzX9e3c9u/k+PTw+fb0+vf1+vn3/Pr6/v39/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AowkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLkyRE2FBgW64ycQIUSWTVryc6e06dKBMoUOqWnQ6del/YBe7dE17NuXaHO0dLv3H026M2oi3fs2oeAYCxUvDhx5RdvLYed2TvFP9NuGqFO8fnuQ9oncYf4f/x5xc3jTs8k/JHTeNCb1EA2151y50iRJlTppNB8+/eNKUBQh4IBOTIJRJsRd511kkgzo4IBSvGcRItz50ZxjnQT44IZNVHLRaMsNcqFjDW5oohP6WdTabX5kF1klJsZYhCTCXZLZZ9NJxoSMMXoIn0OW8BgjjT82NImQJkpRZEMlIumgE0syJIWTG0a5UJNUFgGFlQpRkuWAkHCZECZfCkikmAdpSCUTEqJpECY7Ummgmwgd6aSSdCaEZYxQtAlTJpUQIogbhCRiSV+VxGnimTEZwgMOkEaKgxt+4tWJJFMOCEUkh8qEiRuShooDDy72ZYmPNGXyqKiijpenQf6gssoqqq8KpIissvagWq0CrYqrqKW+ismvsrrBazS3EitqD8cSoiyrxwryrKi7vorItJLycKwl2EZq7LHdQupqrc5iy0Olr76BrSLHDsTts9+2K1AlPRDrRrXyRpNJrKLywG6+BllCiBv1uiEIIvgCrPDCbm5CK8MEUeKIFFhULIUjlEAcDSaOVOzxx49ssjAlFH9sMhZS5NjuJSe3jLLI7W5SsssmOyLvIzS7nPGxM+f8sc28YuJzy3jWSsnQLR8rCdInP+zm0Ux/jK5EmFDSSBVdVNFIJQkvxnLUFmPEyBdllG12GV44rRjYFQNNESZVnC132Y50jVjHYM85UdUmXsztdxWOYdKzz0VPFLfffjPi2CRRqxwRJYgj/sXUh+Hts94T9R2534UvNsngH0uhNkSbI94FZBy3HPJFlZSO+GSVUCIJJY5XxIjrfnf66u24y617nq33fna7wpt9+rGaC995npALP7m8h+OuuLyZkO368fli0kXpdTPM+9xfjC4vJpM00kXWjVBit8bst+/++/DHL//89Ndv//3456///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgRCMoAQnSMEKWvCCGMygBjfIwQ568INICQgAIfkECQQA0wAsAAAAAMYAxgCHAAAAAQEBAgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTHhwZKCMfMCkjNy4nPDIqQDUsRDguSDowSz0xTT4yTj8zT0AzUEAzUEAzUEAzUEAzUEAzUEAzUEAzUEAzUEAzUEAzUUEzUUEzUUEzUUEzUUEzVUE0X0M0bEU0fEg1oU42uVI3x1Q31VY43Fc44Fc44Vc44Vg44Vg44Vg44Vg54Vg54Vk54Vs64F473mI922xB2HhG1n1I1YJK04ZM04lN0otO0oxO0oxO0o1O0o1P0o1O0o1O0o1N0o5M05FH1JVC1Zk716Aw2agl2qsg2qwe2q0d260d2q0d2q0d2q0d2q0d2a0e1qwg0KkkxqUrtp43lpFOd4RkYHt0T3SBSnKESHGFR3GGR3GGR3GHR3GHR3GHR3GHR3GHR3GHSHKISnOJTHWKUHeMV32RXoKVY4aYaYqccZCgeJWkepalhJijjpqjlZyjnZ+lqqWks6mivqyfy66X1a6O2rCN4LGO5LGQ57KT6LOU6bOV6rWW6riZ6r+c68Ge6sOh6sam6syt7NG17dS87drC7t3I7t/N6+DU6uHX7OPX8ezh8e7i8u/k8/Hm8/Lo9PPp9fTr9/Xt+ffw/fr0/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4ApwkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0uebJdTpkB79gTKxIkyylGA2ogeLRrQKM8kM90hzbrNnUyoQ2ZqTbsN7NgdR62uzbrOadwb/fCm3Qe4Rk3Da2syjhFTctqCmF8M/Zy1H+kW91RnvQd7xTzbSf7n8U5ReHjR18lLFHRedCDInSo9QoTo0SNLGme3v934kZb/AP6HiCgZaRded411MkWADGphxSMYcVLHdnV0xlgnDWaoBYQXsVdddI0tqGGDnWAkyIS81QEiY/6N2OAUGXECHm15LNcYKS5qKEl+mNVRh2b8NWZJjhlyqB5ELRIZYBNHRuSIkg02CdGTUAYo5UNJVsnklQ0NWeV/RnKpEI5fbihmQ1kSWQUpZzJEShVV4tcmQ14SGeacClliRY534jkmlS+W6CdEnTziyBRVOPJIJYM2uhYolARSxqSBDLKJow5dEkMLnHbK6YqYHgQKIJ6WymkZl4ZqUBmmtgoDKP6qEiRIq7SWEatAm8BAK62U3Erqrq3GcCurwLYKq6rF0nqJqpkk2yqojTbrbKnQNjptqcuqSuy1LRwb6q/XChtrrtz2euus09p6q0DbAvvqugKNWiyq8BKkqavV1gvKJZJSSkmq9S62SSSIGNKEIZHIGfBApBzSxMMQP2wIwPViEvHFEEcSsMUYd+wIvKR0LHITmKzryMgis6lqyCh3vKOqHLd88ceqRiIzxobE6vDNF8eKCM89qyoJ0BDnDDPRD9McKstEm4sRJYsYIYQQRizitGM2A230RZkQ0cPXYH9NRJCMGcwzxRQxIkTYbH/dyGOb8KzxRYy0bXcPjMBt9r/IL1vkydp3sy2EJ5BljbO3FhkRuN1GRAaKJZEYYogjkpSc0SWL351tqHVn3vYiPnveNiKxei162ETEqvjpYDeuKiKsg026qpPE/nXezNreA9mOws56EuuSMsTpQ6h8K+aib77uJcMHPoTyIPs+uvELT+MJ1ElUTQnh1Xfv/ffghy/++OSXb/756Kev/vrst+/++/DHL//89Ndv//3456///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgRsJCAAh+QQJBADfACwAAAAAxgDGAIcAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkqKiotLCs2MS09NC9DNzBHOjFLPDJOPTNRPjNUQDNVQDRXQTRXQTRYQTRYQTRYQTRYQTRYQTRYQTRYQTRYQTRYQTRYQTRYQTRYQjRYQjRYQjRYQjRYQjRYQjRYQjRYQjRZQjVaQzZaRDZaRDdaRjpYSkFWT0pUVFNSWFpQXGFNYWtJZ3ZIantHbH9HbYFHbYFHbYFHbYFHbYFHbYFHbYFHbYFHbYFHbYFHbYFHbYFHboJHboJHboJHboJHboJHboJIb4NKcIRMcoVOdIdSdolWeoxcfpBfgZJhgpNjhJVlhZZmhpdnh5hqh5VthpJwhY5zhYp2hId5goN8gX9/f3yDfXiGe3WIeXGQdWuccWSsbFq3aFPCZEzKYUfTXkLaXD7eWzvgWjrhWjrhWjrhWjrhWzvhWzvhXDzhXT3hXz7hYUDgZkPga0bfcErfdU3eelHdflLbg1LYiFLVjFDTjk7SjkzSjkzSjkzSj0vSkUfSmznSoTDSpijSqCTSqSPSqiPSqiPTrCnVsDXYslHYr1/ZsmzXtn3VupDTvJjTwaHYy7Hf1cHi2Mjl3dHr5+Pu6+fy8O308e/29PH7+ff+/fz+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gC/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubJlorpo0bpj5w6tW70ul6R1prTp0m5uiQ6p687p16VphV7NsZcb2Ljv0OboGjduWrsz3vLt242u4BfhEPetG3nF5b7tOKc4HDru6RNJW4eNS7KtWrFq/h3PqH376e6OebVSxb69KlizK1Y3b/pxLVbu87OydZG+6eaMvZLfgOzVYpFy/gGoWC0ENjjeRPNtZxxjvODX4ICtWNTbdsAFeGGDBlLUC4LQKajYhw1mWFFr0MnWmC4oEsgKRrTcBhscqjnGYIwD8oKRLrds1tln8TUWC48D8ocdRLYgmd+SEfHiZHszQgmRhU6+YiVEsEypSohbNtTLekjCEiZEMPLISpFnMnQfiqw82KZD6l0I35wT1fIKlq3AoiSeFfXyJ6CEFmrodLfIAkgURgiixyw+HsoQL4AYYemllj7RoaQI2cIopqAaAUiknBJ0S6ioilpqQVKkiuqm/qXK4iqqT6BX6qypyrLqqbiGKsiqtPQa6hOr6iFsqKQeKuuxmALL7KVQrIrLs5YGsuo3T1A7y7XBMgtFspwGwmyOe+VC7ky8ZNurrnn1IgssoMQLyiux5IKuILM+sW1etngi77/xwgrTLOqCKoitd8kC8MLz7oKuLbP0IYgsn+1FC8MMm3ntN7v4i/HCAkv6yscMe+JwqbuQjPG+nNqicsarzvLywlqWCu/MAK+qMM7yurJqLTzLqzGnuQQdL8ucumL0uZLeEjS7F/GSKCexzMI0ZDu/7AqbEvHCSSNgh91IJUg/1svIKntydUS1VCL2241wAq5jMn8My8kVzQL3vN6VzN1YLmj/60rIEuXi9t5wc2LZLbVYzTVFmyCOOOGF6i0539fGcjniCB8a+eZwUw4o6HvHsirpcA8t6SWoi122oV+3DvagysoOtt+E8nI46qZfW0vrl+AOO+q0l+r15pWIzmnbiG9i78YG8TILLJmMvUksykOv/fbcd+/99+CHL/745Jdv/vnop6/++uy37/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrwgAhMoAIXyMAGli8gADsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; 2 | --------------------------------------------------------------------------------