├── packages
└── meteor-postgres
│ ├── minisql
│ ├── minisql_tests.js
│ ├── minisql.js
│ └── alasql.js.map
│ ├── collection
│ ├── collection_tests.js
│ └── collection.js
│ ├── README.md
│ ├── package.js
│ └── postgres
│ ├── sqlserver_tests.js
│ └── serversql.js
├── .gitignore
├── simple-todos.html
├── README.md
├── simple-todos.css
├── LICENSE
└── simple-todos.js
/packages/meteor-postgres/minisql/minisql_tests.js:
--------------------------------------------------------------------------------
1 | var MiniSqlStub = function(name) {
2 | var stub = miniSQL();
3 | stub.table = name;
4 | stub.conString = 'postgres://postgres:1234@localhost/postgres';
5 | stub.wrapSave = Meteor.wrapAsync(stub.save.bind(stub));
6 | stub.wrapFetch = Meteor.wrapAsync(stub.fetch.bind(stub));
7 | return stub;
8 | };
9 |
10 | Tinytest.add('miniSQL - test - basic', function(test) {
11 | //TODO
12 | });
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.*~
2 | *.swp
3 | *.swo
4 | .build*
5 | .npm
6 | settings.json
7 | .DS_Store
8 | /.meteor
9 | *~
10 | /dev_bundle
11 | /dev_bundle*.tar.gz
12 | /android_bundle
13 | /android_bundle*.tar.gz
14 | /node_*.tar.gz
15 | /mongo_*.tar.gz
16 | /dist
17 | \#*\#
18 | .\#*
19 | .idea
20 | *.iml
21 | *.sublime-project
22 | *.sublime-workspace
23 | TAGS
24 | *.log
25 | *.out
26 | npm-debug.log
27 | universe
28 | .floo
29 | .flooignore
30 | .gitconfig
31 | 'postgres://meteor:Meteor1234@191.238.146.165/meteor'
--------------------------------------------------------------------------------
/packages/meteor-postgres/collection/collection_tests.js:
--------------------------------------------------------------------------------
1 | Tinytest.add(
2 | 'SQL.collection - SQL.Collection instantiation',
3 | function (test) {
4 | test.throws(
5 | function () {
6 | SQL.Collection(null);
7 | },
8 | /Use new to construct a SQLCollection/
9 | );
10 |
11 | test.throws(
12 | function() {
13 | var test1 = new SQL.Collection();
14 | },
15 | /First argument to new SQLCollection must exist/
16 | );
17 |
18 | test.throws(
19 | function() {
20 | var test2 = new SQL.Collection(1234);
21 | },
22 | /First argument to new SQLCollection must be a string or null/
23 | );
24 |
25 | }
26 | );
27 |
28 | Tinytest.add('Livedata - server method - tests', function (test) {
29 | // var testCollection = new SQL.Collection('test');
30 | //no event name error handle
31 | });
--------------------------------------------------------------------------------
/simple-todos.html:
--------------------------------------------------------------------------------
1 |
2 | Todo List
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | Todo List
11 |
16 |
26 |
27 |
28 |
29 | {{#each tasks}}
30 | {{> task}}
31 | {{/each}}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | {{text}} - {{name}}
44 |
45 |
46 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/README.md:
--------------------------------------------------------------------------------
1 | # [Meteor-Postgres](http://www.meteorpostgres.com/)
2 |
3 |
4 | 
5 |
6 | ### Installation
7 |
8 | Run the following from a command line.
9 |
10 | meteor add meteorsteam:meteor-postgres
11 |
12 | If you had previously downloaded the unstable pre-release, please remove and re-add the package.
13 |
14 | ### Usage
15 |
16 | * [Getting Started](https://github.com/meteor-stream/meteor-postgres/wiki/Getting-Started)
17 | * [Full List of Database Methods](https://github.com/meteor-stream/meteor-postgres/wiki/Database-Methods)
18 | * [Demo Todo App](http://todopostgres.meteor.com/)
19 | * [Refactor from Mongo to PostgreSQL](https://www.youtube.com/watch?v=JwHfxJnD0Yc)
20 |
21 | ### Implementation
22 |
23 | We used [Node-Postgres](https://github.com/brianc/node-postgres) on the server and [AlaSQL](https://github.com/agershun/alasql) on the client.
24 |
25 | ### Contribution Guidelines
26 |
27 | Coming soon.
28 |
29 | If you want to make modifications to our package for your project, clone this repo and include the /packages/meteor-postgres folder in your /packages. You will need to add the package to your packages file in .meteor.
30 |
31 | ### License
32 |
33 | Released under the MIT license. See the LICENSE file for more info.
34 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### As Meteor has announced that they will be providing native SQL support in the future, we are no longer maintaining this repo. But you can find an maintained version [here](https://github.com/storeness/meteor-postgres).
2 |
3 | # [Meteor-Postgres](http://www.meteorpostgres.com/)
4 |
5 |
6 | 
7 |
8 | ### Installation
9 |
10 | Run the following from a command line.
11 |
12 | meteor add meteorsteam:meteor-postgres
13 |
14 | If you had previously downloaded the unstable pre-release, please remove and re-add the package.
15 |
16 | ### Usage
17 |
18 | * [Getting Started](https://github.com/meteor-stream/meteor-postgres/wiki/Getting-Started)
19 | * [Full List of Database Methods](https://github.com/meteor-stream/meteor-postgres/wiki/Database-Methods)
20 | * [Refactor from Mongo to PostgreSQL](https://www.youtube.com/watch?v=JwHfxJnD0Yc)
21 |
22 | ### Implementation
23 |
24 | We used [Node-Postgres](https://github.com/brianc/node-postgres) on the server and [AlaSQL](https://github.com/agershun/alasql) on the client.
25 |
26 | ### Contribution Guidelines
27 |
28 | Coming soon.
29 |
30 | If you want to make modifications to our package for your project, clone this repo and include the /packages/meteor-postgres folder in your /packages. You will need to add the package to your packages file in .meteor.
31 |
32 | ### License
33 |
34 | Released under the MIT license. See the LICENSE file for more info.
35 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/package.js:
--------------------------------------------------------------------------------
1 | Package.describe({
2 | name: 'meteorsteam:meteor-postgres',
3 | version: '0.1.4',
4 | // Brief, one-line summary of the package.
5 | summary: 'PostgreSQL support for Meteor',
6 | // URL to the Git repository containing the source code for this package.
7 | git: 'https://github.com/meteor-stream/meteor-postgres',
8 | // By default, Meteor will default to using README.md for documentation.
9 | // To avoid submitting documentation, set this field to null.
10 | documentation: 'README.md'
11 | });
12 |
13 | Npm.depends({
14 | 'pg': '4.3.0'
15 | });
16 |
17 | Package.onUse(function (api) {
18 | // The order these files are imported is very important
19 | api.versionsFrom('1.1.0.1');
20 | api.use('underscore');
21 | api.use('tracker');
22 | api.use('ddp');
23 |
24 | // minisql
25 | api.addFiles(['minisql/alasql.js', 'minisql/alasql.js.map', 'minisql/minisql.js'], 'client');
26 | api.export('miniSQL', 'client');
27 |
28 | api.addFiles('postgres/serversql.js', 'server');
29 | api.export('serverSQL', 'server');
30 |
31 | api.addFiles('collection/collection.js');
32 | api.export('SQL');
33 |
34 | });
35 |
36 | Package.onTest(function (api) {
37 | api.versionsFrom('1.1');
38 | api.use(['spacebars', 'tinytest', 'test-helpers', 'underscore', 'tracker', 'ddp']);
39 | api.addFiles('postgres/serversql.js', 'server');
40 | api.export('serverSQL', 'server');
41 | api.addFiles('collection/collection.js', ['server', 'client']);
42 | api.export('SQL', ['server', 'client']);
43 | api.addFiles('collection/collection_tests.js');
44 | api.addFiles('postgres/sqlserver_tests.js', 'server');
45 | });
46 |
47 |
--------------------------------------------------------------------------------
/simple-todos.css:
--------------------------------------------------------------------------------
1 | /* CSS declarations go here */
2 | body {
3 | font-family: sans-serif;
4 | background-color: #315481;
5 | background-image: linear-gradient(to bottom, #315481, #918e82 100%);
6 | background-attachment: fixed;
7 |
8 | position: absolute;
9 | top: 0;
10 | bottom: 0;
11 | left: 0;
12 | right: 0;
13 |
14 | padding: 0;
15 | margin: 0;
16 |
17 | font-size: 14px;
18 | }
19 |
20 | .container {
21 | max-width: 600px;
22 | margin: 0 auto;
23 | min-height: 100%;
24 | background: white;
25 | }
26 |
27 | header {
28 | background: #d2edf4;
29 | background-image: linear-gradient(to bottom, #d0edf5, #e1e5f0 100%);
30 | padding: 20px 15px 15px 15px;
31 | position: relative;
32 | }
33 |
34 | #login-buttons {
35 | display: block;
36 | }
37 |
38 | h1 {
39 | font-size: 1.5em;
40 | margin: 0;
41 | margin-bottom: 10px;
42 | display: inline-block;
43 | margin-right: 1em;
44 | }
45 |
46 | form {
47 | margin-top: 10px;
48 | margin-bottom: -10px;
49 | position: relative;
50 | }
51 |
52 | .new-user input {
53 | box-sizing: border-box;
54 | padding: 10px 0;
55 | background: transparent;
56 | border: none;
57 | width: 100%;
58 | padding-right: 80px;
59 | font-size: 1em;
60 | }
61 |
62 | .new-user input:focus{
63 | outline: 0;
64 | }
65 |
66 | .new-task input {
67 | box-sizing: border-box;
68 | padding: 10px 0;
69 | background: transparent;
70 | border: none;
71 | width: 100%;
72 | padding-right: 80px;
73 | font-size: 1em;
74 | }
75 |
76 | .new-task input:focus{
77 | outline: 0;
78 | }
79 |
80 | ul {
81 | margin: 0;
82 | padding: 0;
83 | background: white;
84 | }
85 |
86 | .delete {
87 | float: right;
88 | font-weight: bold;
89 | background: none;
90 | font-size: 1em;
91 | border: none;
92 | position: relative;
93 | }
94 |
95 | li {
96 | position: relative;
97 | list-style: none;
98 | padding: 15px;
99 | border-bottom: #eee solid 1px;
100 | }
101 |
102 | li .text {
103 | margin-left: 10px;
104 | }
105 |
106 | li.checked {
107 | color: #888;
108 | }
109 |
110 | li.checked .text {
111 | text-decoration: line-through;
112 | }
113 |
114 | li.private {
115 | background: #eee;
116 | border-color: #ddd;
117 | }
118 |
119 | header .hide-completed {
120 | float: right;
121 | }
122 |
123 | .toggle-private {
124 | margin-left: 5px;
125 | }
126 |
127 | @media (max-width: 600px) {
128 | li {
129 | padding: 12px 15px;
130 | }
131 |
132 | .search {
133 | width: 150px;
134 | clear: both;
135 | }
136 |
137 | .new-task input {
138 | padding-bottom: 5px;
139 | }
140 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014-2015 Andrey Gershun (agershun@gmail.com)
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 | The MIT License (MIT)
24 |
25 | Copyright (c) 2015 ben@latenightsketches.com
26 |
27 | Permission is hereby granted, free of charge, to any person obtaining a copy
28 | of this software and associated documentation files (the "Software"), to deal
29 | in the Software without restriction, including without limitation the rights
30 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
31 | copies of the Software, and to permit persons to whom the Software is
32 | furnished to do so, subject to the following conditions:
33 |
34 | The above copyright notice and this permission notice shall be included in all
35 | copies or substantial portions of the Software.
36 |
37 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
38 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
39 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
40 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
41 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
42 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
43 | SOFTWARE.
44 |
45 | The MIT License (MIT)
46 |
47 | Copyright (c) 2015 Space Elephant
48 |
49 | Permission is hereby granted, free of charge, to any person obtaining a copy
50 | of this software and associated documentation files (the "Software"), to deal
51 | in the Software without restriction, including without limitation the rights
52 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
53 | copies of the Software, and to permit persons to whom the Software is
54 | furnished to do so, subject to the following conditions:
55 |
56 | The above copyright notice and this permission notice shall be included in all
57 | copies or substantial portions of the Software.
58 |
59 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
60 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
61 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
62 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
63 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
64 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
65 | SOFTWARE.
66 |
--------------------------------------------------------------------------------
/simple-todos.js:
--------------------------------------------------------------------------------
1 | // Defining 2 SQL collections. The additional paramater is the postgres connection string which will only run on the server
2 | tasks = new SQL.Collection('tasks');
3 | username = new SQL.Collection('username');
4 |
5 | if (Meteor.isClient) {
6 | var newUser = 'all';
7 | var taskTable = {
8 | id: ['$number'],
9 | text: ['$string', '$notnull'],
10 | checked: ['$bool'],
11 | usernameid: ['$number']
12 | };
13 |
14 | tasks.createTable(taskTable);
15 |
16 | var usersTable = {
17 | id: ['$number'],
18 | name: ['$string', '$notnull']
19 | };
20 | username.createTable(usersTable);
21 |
22 |
23 | Template.body.helpers({
24 | usernames: function () {
25 | return username.select()
26 | .fetch();
27 | },
28 | tasks: function () {
29 | if (newUser === 'all'){
30 | return tasks.select('tasks.id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.name')
31 | .join(['OUTER JOIN'], ['usernameid'], [['username', ['id']]])
32 | .fetch();
33 | }
34 | else {
35 | return tasks.select('tasks.id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.name')
36 | .join(['OUTER JOIN'], ['usernameid'], [['username', ['id']]])
37 | .where("name = ?", newUser)
38 | .fetch();
39 | }
40 | }
41 | });
42 |
43 |
44 | Template.body.events({
45 | "submit .new-task": function (event) {
46 | if (event.target.category.value){
47 | var user = username.select('id')
48 | .where("name = ?", event.target.category.value)
49 | .fetch();
50 | user = user[0].id;
51 | var text = event.target.text.value;
52 | tasks.insert({
53 | text:text,
54 | checked:false,
55 | usernameid: user
56 | }).save();
57 | event.target.text.value = "";
58 | } else{
59 | alert("please add a user first");
60 | }
61 | return false;
62 | },
63 | "submit .new-user": function (event) {
64 | var text = event.target.text.value;
65 | username.insert({
66 | name:text
67 | }).save();
68 | event.target.text.value = "";
69 |
70 | return false;
71 | },
72 | "click .toggle-checked": function () {
73 | tasks.update({id: this.id, "checked": !this.checked})
74 | .where("id = ?", this.id)
75 | .save();
76 | },
77 | "click .delete": function () {
78 | tasks.remove()
79 | .where("id = ?", this.id)
80 | .save();
81 | },
82 | "change .catselect": function(event){
83 | newUser = event.target.value;
84 | tasks.reactiveData.changed();
85 | }
86 | });
87 | }
88 |
89 | if (Meteor.isServer) {
90 | //tasks.createTable({text: ['$string'], checked: ["$bool", {$default: false}]}).save();
91 | //username.createTable({name: ['$string', '$unique']}).save();
92 | //tasks.createRelationship('username', '$onetomany').save();
93 |
94 |
95 | username.insert({name:'all'}).save();
96 | // Publishing the collections
97 | tasks.publish('tasks', function(){
98 | return tasks.select('tasks.id as id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.id as usernameid', 'username.name')
99 | .join(['INNER JOIN'], ["usernameid"], [["username", 'id']])
100 | .order('createdat DESC')
101 | .limit(100);
102 | });
103 |
104 | username.publish('username', function(){
105 | return username.select('id', 'name')
106 | .order('createdat DESC')
107 | .limit(100);
108 | });
109 | }
110 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/collection/collection.js:
--------------------------------------------------------------------------------
1 |
2 | var buffer = [];
3 | /**
4 | * @summary Namespace for SQL-related items
5 | * @namespace
6 | */
7 | SQL = {};
8 |
9 | SQL.Collection = function(connection) {
10 | var self = this;
11 | this.unvalidated = false;
12 | this.reactiveData = new Tracker.Dependency;
13 | this.tableName = connection;
14 | this.saveMethod = this.tableName + 'save';
15 | this.fetchMethod = this.tableName + 'fetch';
16 |
17 | if (!(self instanceof SQL.Collection)) {
18 | throw new Error('Use new to construct a SQLCollection');
19 | }
20 |
21 | // boolean to keep track of whether the local DB has an unvalidated entry
22 | self._events = [];
23 |
24 | if (!this.tableName) {
25 | throw new Error('First argument to new SQLCollection must exist');
26 | }
27 |
28 | if (this.tableName !== null && typeof this.tableName !== "string") {
29 | throw new Error('First argument to new SQLCollection must be a string or null');
30 | }
31 |
32 | if (Meteor.isClient) {
33 | // Sets certain properties used for miniSQL
34 | miniSQL(this);
35 | }
36 |
37 | if (Meteor.isServer){
38 | // Sets certain properties used for serverSQL
39 | serverSQL(this);
40 | }
41 |
42 | // initialize class
43 | this.table = connection;
44 |
45 | if (Meteor.isClient) {
46 | // Added will only be triggered on the initial population of the database client side.
47 | // Data added to any client while the page is already loaded will trigger a 'changed event'
48 | this.addEventListener('added', function(index, msg, name) {
49 | this.remove().save('client');
50 | for (var x = msg.results.length - 1; x >= 0; x--) {
51 | this.insert(msg.results[x]).save('client');
52 | }
53 | // Triggering Meteor's reactive data to allow for full stack reactivity
54 | });
55 | // Changed will be triggered whenever the server database changed while the client has the page open.
56 | // This could happen from an addition, an update, or a removal, from that specific client, or another client
57 | this.addEventListener('changed', function(index, msg, name) {
58 | // Checking to see if event is a removal from the DB
59 | if (msg.removed) {
60 | var tableId = msg.tableId;
61 | // For the client that triggered the removal event, the data will have
62 | // already been removed and this is redundant, but it would be inefficient to fix.
63 | this.remove().where("id = ?", tableId).save('client');
64 | }
65 | // Checking to see if event is a modification of the DB
66 | else if (msg.modified) {
67 | // For the client that triggered the removal event, the data will have
68 | // already been removed and this is redundant.
69 | this.update(msg.results).where("id = ?", msg.results.id).save('client');
70 | }
71 | else {
72 | // The message is a new insertion of a message
73 | // If the message was submitted by this client then the insert message triggered
74 | // by the server should be an update rather than an insert
75 | // We use the unvalidated boolean variabe to keep track of this
76 | if (this.unvalidated) {
77 | this.update(msg.results).where("id = ?", -1).save('client');
78 | this.unvalidated = false;
79 | }
80 | else {
81 | // The data was added by another client so just a regular insert
82 | this.insert(msg.results).save('client');
83 | }
84 | }
85 | });
86 | }
87 | // setting up the connection between server and client
88 | var selfConnection;
89 | var subscribeArgs;
90 | if (typeof connection === 'string') {
91 | // Using default connection
92 | subscribeArgs = Array.prototype.slice.call(arguments, 0);
93 | name = connection;
94 | if (Meteor.isClient) {
95 | connection = Meteor.connection;
96 | } else if (Meteor.isServer) {
97 | if (!selfConnection) {
98 | selfConnection = DDP.connect(Meteor.absoluteUrl());
99 | }
100 | connection = selfConnection;
101 | }
102 | } else {
103 | // SQLCollection arguments does not use the first argument (the connection)
104 | subscribeArgs = Array.prototype.slice.call(arguments, 1);
105 | }
106 |
107 | var subsBefore = _.keys(connection._subscriptions);
108 | _.extend(self, connection.subscribe.apply(connection, subscribeArgs));
109 | var subsNew = _.difference(_.keys(connection._subscriptions), subsBefore);
110 | if (subsNew.length !== 1) throw new Error('Subscription failed!');
111 | self.subscriptionId = subsNew[0];
112 |
113 | buffer.push({
114 | connection: connection,
115 | name: name,
116 | subscriptionId: self.subscriptionId,
117 | instance: self
118 | });
119 |
120 | // If first store for this subscription name, register it!
121 | if (_.filter(buffer, function(sub) {
122 | return sub.name === name && sub.connection === connection;
123 | }).length === 1) {
124 | registerStore(connection, name);
125 | }
126 | };
127 |
128 | //The code below is originally from Numtel's meteor-mysql but adapted for the purposes of this project (https://github.com/numtel/meteor-mysql/blob/8d7ce8458892f6b255618d884fcde0ec4d04039b/lib/MysqlSubscription.js)
129 | var registerStore = function(connection, name) {
130 | connection.registerStore(name, {
131 | beginUpdate: function(batchSize, reset) {
132 | },
133 | update: function(msg) {
134 | var idSplit = msg.id.split(':');
135 | var sub = _.filter(buffer, function(sub) {
136 | return sub.subscriptionId === idSplit[0];
137 | })[0].instance;
138 | if (idSplit.length === 1 && msg.msg === 'added' &&
139 | msg.fields && msg.fields.reset === true) {
140 | // This message indicates a reset of a result set
141 | sub.dispatchEvent('reset', msg);
142 | sub.splice(0, sub.length);
143 | } else {
144 | var index = parseInt(idSplit[1], 10);
145 | var oldRow;
146 | sub.dispatchEvent('update', index, msg);
147 | switch (msg.msg) {
148 | case 'added':
149 | sub.splice(index, 0, msg.fields);
150 | sub.dispatchEvent(msg.msg, index, msg.fields, msg.collection);
151 | break;
152 | case 'changed':
153 | sub.splice(index, 0, msg.fields);
154 | sub.dispatchEvent(msg.msg, index, msg.fields, msg.collection);
155 | break;
156 | }
157 | }
158 | sub.changed();
159 | },
160 | endUpdate: function() {
161 | },
162 | saveOriginals: function() {
163 | },
164 | retrieveOriginals: function() {
165 | }
166 | });
167 | };
168 |
169 | // Inherit from Array and Tracker.Dependency
170 | SQL.Collection.prototype = new Array;
171 | _.extend(SQL.Collection.prototype, Tracker.Dependency.prototype);
172 | if (Meteor.isClient) {
173 | // extends the proto with miniSQL Methods
174 | _.extend(SQL.Collection.prototype, miniSQL.prototype);
175 | }
176 |
177 | if (Meteor.isServer){
178 | // extends the proto with serverSQL Methods
179 | _.extend(SQL.Collection.prototype, serverSQL.prototype);
180 | }
181 |
182 | SQL.Collection.prototype.publish = function(collname, pubFunc) {
183 | var methodObj = {};
184 | var context = this;
185 | methodObj[this.saveMethod] = function(input, dataArray) {
186 | context.save(input, dataArray);
187 | }
188 | methodObj[this.fetchMethod] = function(input, dataArray) {
189 | context.fetch(input, dataArray);
190 | }
191 | Meteor.methods(methodObj);
192 | Meteor.publish(collname, function () {
193 | // For this implementation to work you must call getCursor and provide a callback with the select
194 | // statement that needs to be reactive. The 'caboose' on the chain of calls must be autoSelect
195 | // and it must be passed the param 'sub' which is defining in the anon function.
196 | // This is a limitation of our implementation and will be fixed in later versions
197 | return {
198 | _publishCursor: function(sub){
199 | return pubFunc().autoSelect(sub);
200 | }
201 | }
202 | });
203 | };
204 |
205 | SQL.Collection.prototype._eventRoot = function(eventName) {
206 | return eventName.split('.')[0];
207 | };
208 |
209 | SQL.Collection.prototype._selectEvents = function(eventName, invert) {
210 | var self = this;
211 | var eventRoot, testKey, testVal;
212 | if (!(eventName instanceof RegExp)) {
213 | eventRoot = self._eventRoot(eventName);
214 | if (eventName === eventRoot) {
215 | testKey = 'root';
216 | testVal = eventRoot;
217 | } else {
218 | testKey = 'name';
219 | testVal = eventName;
220 | }
221 | }
222 | return _.filter(self._events, function(event) {
223 | var pass;
224 | if (eventName instanceof RegExp) {
225 | pass = event.name.match(eventName);
226 | } else {
227 | pass = event[testKey] === testVal;
228 | }
229 | return invert ? !pass : pass;
230 | });
231 | };
232 |
233 | SQL.Collection.prototype.addEventListener = function(eventName, listener) {
234 | var self = this;
235 | if (typeof listener !== 'function')
236 | throw new Error('invalid-listener');
237 | self._events.push({
238 | name: eventName,
239 | root: self._eventRoot(eventName),
240 | listener: listener
241 | });
242 | };
243 |
244 | SQL.Collection.prototype.initialValue = function(eventName, listener) {
245 | return Postgres.select(this.tableName);
246 | };
247 |
248 | // @param {string} eventName - Remove events of this name, pass without suffix
249 | // to remove all events matching root.
250 | SQL.Collection.prototype.removeEventListener = function(eventName) {
251 | var self = this;
252 | self._events = self._selectEvents(eventName, true);
253 | };
254 |
255 | SQL.Collection.prototype.dispatchEvent = function(eventName /* arguments */) {
256 | var self = this;
257 | var listenerArgs = Array.prototype.slice.call(arguments, 1);
258 | var listeners = self._selectEvents(eventName);
259 | // Newest to oldest
260 | for (var i = listeners.length - 1; i >= 0; i--) {
261 | // Return false to stop further handling
262 | if (listeners[i].listener.apply(self, listenerArgs) === false) return false;
263 | }
264 | return true;
265 | };
266 |
267 | SQL.Collection.prototype.reactive = function() {
268 | var self = this;
269 | self.depend();
270 | return self;
271 | };
272 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/postgres/sqlserver_tests.js:
--------------------------------------------------------------------------------
1 | // Currently all the tests based on ActiveRecord are running synchronously
2 | // Making test Stub using decorator
3 | var ActiveRecordStub = function(name) {
4 | var stub = serverSQL();
5 | stub.table = name;
6 | stub.wrapSave = Meteor.wrapAsync(stub.save.bind(stub));
7 | stub.wrapFetch = Meteor.wrapAsync(stub.fetch.bind(stub));
8 | return stub;
9 | };
10 |
11 | /**
12 | * Simple table test
13 | */
14 | var testTasksTable = {
15 | text: ['$string', '$notnull']
16 | };
17 |
18 | var testUserTable = {
19 | username: ['$string', '$notnull'],
20 | age: ['$number']
21 | };
22 |
23 | if (Meteor.isServer) {
24 | var testTasks = ActiveRecordStub('testTasks');
25 | testTasks.dropTable().wrapSave(null, null);
26 | testTasks.createTable(testTasksTable).wrapSave(null, null);
27 | testTasks.insert({ text: 'testing1' }).wrapSave(null, null);
28 | testTasks.insert({ text: 'testing2' }).wrapSave(null, null);
29 | testTasks.insert({ text: 'testing3' }).wrapSave(null, null);
30 | for (var i = 0; i < 5; i++) {
31 | testTasks.insert({ text: 'testing1' }).wrapSave(null, null);
32 | }
33 |
34 | var testUser = ActiveRecordStub('testUser');
35 | testUser.dropTable().wrapSave(null, null);
36 | testUser.createTable(testUserTable).wrapSave(null, null);
37 | for (var i = 0; i < 3; i++) {
38 | testUser.insert({ username: 'eddie' + i, age: 2 * i }).wrapSave(null, null);
39 | testUser.insert({ username: 'paulo', age: 27}).wrapSave(null, null);
40 | }
41 |
42 | //Should test the operation defined in the serverSQL and return result successfully
43 | Tinytest.addAsync('activerecord - basic - success', function(test, onComplete) {
44 | var findOneResult1 = testTasks.findOne().wrapFetch(null, null);
45 | var findOneResult2 = testTasks.findOne(1).wrapFetch(null, null);
46 | test.equal(typeof findOneResult1.rows[0], 'object');
47 | test.equal(findOneResult1.rows.length, 1);
48 | test.equal(findOneResult1.rows[0].text, 'testing1');
49 | test.equal(typeof findOneResult2.rows[0], 'object');
50 | test.equal(findOneResult2.rows.length, 1);
51 | test.equal(findOneResult2.rows[0].text, 'testing1');
52 |
53 | //select
54 | var result = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null);
55 | //select + limit
56 | var result2 = testTasks.select().where('text = ?', 'testing1').limit(3).wrapFetch(null, null);
57 | //select + limit + offset
58 | var result3 = testTasks.select().where('text = ?', 'testing1').limit(3).offset(2).wrapFetch(null, null);
59 | //select + offset
60 | var result4 = testTasks.select().where('text = ?', 'testing1').offset(2).wrapFetch(null, null);
61 | var result5 = testTasks.select().where('text = ?', 'testing1').offset(6).wrapFetch(null, null);
62 | var result6 = testTasks.select().where('text = ?', 'testing1').offset(8).wrapFetch(null, null);
63 | //order default and DESC/ASC
64 | var result7 = testTasks.select().order('text').wrapFetch(null, null);
65 | var result8 = testTasks.select().order('text ASC').wrapFetch(null, null);
66 | var result9 = testTasks.select().order('text DESC').wrapFetch(null, null);
67 | //chaining order
68 | var result10 = testTasks.select().where('text = ?', 'testing1').order('id DESC').offset(2).limit(3).wrapFetch(null, null);
69 | var result11 = testTasks.select().where('text = ?', 'testing1').offset(2).order('id DESC').limit(3).wrapFetch(null, null);
70 |
71 | test.equal(typeof result.rows, 'object');
72 | test.equal(result.rows.length, 6);
73 | _.each(result.rows, function(item) {
74 | test.equal(item.text, 'testing1');
75 | });
76 | test.equal(result2.rows.length, 3);
77 | _.each(result2.rows, function(item) {
78 | test.equal(item.text, 'testing1');
79 | });
80 | test.equal(result3.rows.length, 3);
81 | _.each(result3.rows, function(item) {
82 | test.equal(item.text, 'testing1');
83 | });
84 | test.equal(result4.rows.length, 4);
85 | _.each(result4.rows, function(item) {
86 | test.equal(item.text, 'testing1');
87 | });
88 | test.equal(result5.rows.length, 0);
89 | test.equal(result6.rows.length, 0);
90 | test.equal(result7.rows, result8.rows);
91 | test.equal(result7.rows[7], result9.rows[0]);
92 | test.equal(result10.rows, result11.rows);
93 |
94 | var result12 = testTasks.select().where('text = ?', ['testing1', 'testing2']).wrapFetch(null, null);
95 | var result13 = testTasks.select().where('text = ?', ['testing1']).wrapFetch(null, null);
96 | var result14 = testTasks.select().where('id = ? AND text = ?', 2, 'testing1').wrapFetch(null, null);
97 | var result15 = testTasks.select().where('id = ? AND text = ?', [1, 2, 3], ['testing1', 'testing2']).wrapFetch(null, null);
98 | test.equal(result12.rows.length, 7);
99 | test.equal(result12.rows[1].text, 'testing2');
100 | test.equal(result13.rows, result.rows);
101 | test.equal(result14.rows.length, 0);
102 | test.equal(result15.rows.length, 2);
103 | test.equal(result15.rows[0].id, 1);
104 | test.equal(result15.rows[1].id, 2);
105 | test.equal(result15.rows[0].text, 'testing1');
106 | test.equal(result15.rows[1].text, 'testing2');
107 | // Non-overreiden first, last, take
108 | var result1 = testTasks.select().offset(2).where('text = ?', 'testing1').order('id DESC').limit(3).first().wrapFetch(null, null);
109 | var result2 = testTasks.select().first(2).wrapFetch(null, null);
110 | var result3 = testTasks.select().last(4).wrapFetch(null, null);
111 | var result4 = testTasks.select().offset(2).where('text = ?', 'testing1').order('id DESC').limit(3).last().wrapFetch(null, null);
112 | var result5 = testTasks.select().offset(2).order('id DESC').limit(3).take().wrapFetch(null, null);
113 | var result6 = testTasks.select().take().wrapSave(null, null);
114 | //should consider chainging order for first, last, take?
115 | test.equal(result1.rows[0], result2.rows[0]);
116 | test.equal(result3.rows[0], result4.rows[0]);
117 | test.equal(result3.rows[1].id, 7);
118 | test.equal(result5.rows, result6.rows);
119 |
120 | //update and remove
121 | // update coverage should take another args, currently just 1 arg
122 | // should better add the rule that forbid changes in id?
123 | var origin = testTasks.select().where('text = ?', 'testing1').wrapSave(null, null);
124 | testTasks.update({ text: 'testing1' }).where('text = ?', 'testing2').wrapSave(null, null);
125 | var result1 = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null);
126 | test.equal(origin.rows.length + 1, result1.rows.length);
127 | testTasks.update( {text: 'testing3'} ).wrapSave(null, null);
128 | var result2 = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null);
129 | var result3 = testTasks.select().where('text = ?', 'testing3').wrapFetch(null, null);
130 | test.equal(result2.rows.length, 0);
131 | test.equal(result3.rows.length, 8);
132 |
133 | testTasks.where('id = ?', '2').remove().wrapSave(null, null);
134 | var result1 = testTasks.select().wrapFetch(null, null);
135 | test.equal(result1.rows.length, 7);
136 | testTasks.remove().wrapSave(null, null);
137 | var result2 = testTasks.select().wrapFetch(null, null);
138 | test.equal(result2.rows.length, 0);
139 |
140 | // branch coverage TODO
141 | // select args not empty branch
142 | // not empty and no distinct
143 | // var result1 = testUser.select('testUser.username', 'testUser.age').
144 | // not empty and has distinct
145 |
146 | // update args > 1 branch
147 | testUser.update({username: 'PaulOS', age: 100}).where('username = ?', 'notexist').wrapSave(null, null);
148 | var result1 = testUser.select().where('username = ?', 'PaulOS').wrapFetch(null, null);
149 | test.equal(result1.rows.length, 0);
150 |
151 | testUser.update({username: 'PaulOS', age: 100}).where('username = ?', 'paulo').wrapSave(null, null);
152 | var result2 = testUser.select().where('username = ?', 'PaulOS').wrapFetch(null, null);
153 | test.equal(result2.rows.length, 3);
154 | _.each(result2.rows, function(item) {
155 | test.equal(item.username, 'PaulOS');
156 | test.equal(item.age, 100);
157 | });
158 |
159 | onComplete();
160 | });
161 |
162 | //Should throw error for the test failed case
163 | Tinytest.addAsync('activerecord - basic - failure', function(test, onComplete) {
164 | // create already existed throw error
165 | test.throws(function() {
166 | testTasks.createTable(testTasks).wrapSave(null, null);
167 | });
168 | // throw error is schema different
169 | test.throws(function() {
170 | testTasks.insert({ text: 'failure', username: 'eric'}).wrapSave(null, null);
171 | });
172 | //update error
173 | test.throws(function() {
174 | testTasks.update( {username: 'kate'} ).where('text = ?', 'testing3').wrapSave(null, null);
175 | });
176 |
177 | // How should update behavior for non-existed where?
178 | // test.throws(function() {
179 | // testTasks.update( {text: 'testing2'} ).where('text = ?', 'testing2').wrapSave(null, null);
180 | // });
181 | // Should not throw error if drop an unexisted table
182 |
183 | try {
184 | var expectedError;
185 | testTasks.dropTable('notExistedTable').wrapSave(null, null);
186 | } catch(error) {
187 | expectedError = error;
188 | }
189 | test.isTrue(!expectedError);
190 | //findOne can only find id
191 | test.throws(function() {
192 | testTasks.findOne('testing1').wrapFetch(null, null);
193 | });
194 |
195 | //Clear the table after use
196 | testTasks.dropTable().wrapSave(null, null);
197 | testUser.dropTable().wrapSave(null, null);
198 | onComplete();
199 | });
200 |
201 | //Complex table
202 | // Todo: createRelationShip
203 | // Join table test
204 | var testTree = ActiveRecordStub('testTree');
205 | var testLocation = ActiveRecordStub('testLocation');
206 | var testSpecies = ActiveRecordStub('testSpecies');
207 |
208 | var testTreeTable = {
209 | id: ['$number', '$notnull'],
210 | treename: ['$string', '$notnull'],
211 | locationid: ['$number', '$notnull'],
212 | speciesid: ['$number', '$notnull']
213 | };
214 |
215 | var testLocationTable = {
216 | id: ['$number', '$notnull'],
217 | longitude: ['$float', '$notnull'],
218 | latitude: ['$float', '$notnull']
219 | };
220 |
221 | var testSpeciesTable = {
222 | id: ['$number', '$notnull'],
223 | species: ['$string', '$notnull']
224 | };
225 |
226 | testTree.dropTable().wrapSave(null, null);
227 | testLocation.dropTable().wrapSave(null, null);
228 | testSpecies.dropTable().wrapSave(null, null);
229 |
230 | var testTree = ActiveRecordStub('testTree');
231 | var testLocation = ActiveRecordStub('testLocationTable');
232 | var testSpecies = ActiveRecordStub('testSpeciesTable');
233 |
234 | Tinytest.addAsync('activerecord - advanced - success', function(test, onComplete) {
235 | testTree.dropTable().wrapSave(null, null);
236 | testLocation.dropTable().wrapSave(null, null);
237 | testSpecies.dropTable().wrapSave(null, null);
238 | onComplete();
239 | });
240 | }
241 |
242 | // Connection test, should be added after the default connect string removed
243 | Meteor.isServer && Tinytest.add('activerecord - connection failure',
244 | function(test) {
245 |
246 | }
247 | );
248 |
249 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/minisql/minisql.js:
--------------------------------------------------------------------------------
1 | miniSQL = function(Collection){
2 |
3 | Collection = Collection || Object.create(miniSQL.prototype);
4 | Collection.table = Collection.tableName;
5 |
6 | // inputString used by queries, overrides other strings
7 | // includes: create table, create relationship, drop table, insert
8 | Collection.inputString = '';
9 | Collection.inputString2 = '';
10 | Collection.autoSelectData = '';
11 | Collection.autoSelectInput = '';
12 | Collection.tableElements = {};
13 |
14 | // statement starters
15 | Collection.selectString = '';
16 | Collection.updateString = '';
17 | Collection.deleteString = '';
18 |
19 | // chaining statements
20 | Collection.joinString = '';
21 | Collection.whereString = '';
22 | Collection.clientWhereString = '';
23 | Collection.serverWhereString = '';
24 |
25 | // caboose statements
26 | Collection.orderString = '';
27 | Collection.limitString = '';
28 | Collection.offsetString = '';
29 | Collection.groupString = '';
30 | Collection.havingString = '';
31 |
32 | Collection.dataArray = [];
33 | Collection.dataArray2 = [];
34 | Collection.server = null;
35 |
36 | // error logging
37 | Collection.prevFunc = '';
38 | return Collection;
39 | };
40 |
41 | miniSQL.prototype.createTable = function(tableObj) {
42 | var _DataTypes = {
43 | $number: 'integer',
44 | $string: 'varchar(255)',
45 | $json: 'json',
46 | $datetime: 'date',
47 | $float: 'decimal',
48 | $seq: 'serial',
49 | $bool: 'boolean'
50 | };
51 |
52 | var _TableConstraints = {
53 | $unique: 'unique',
54 | $check: 'check ', // value
55 | $exclude: 'exclude',
56 | $notnull: 'not null',
57 | $default: 'default ', // value
58 | $primary: 'primary key'
59 | };
60 |
61 | alasql.fn.Date = Date;
62 |
63 | var startString = 'CREATE TABLE ' + this.table + ' (';
64 | var item, subKey, valOperator, inputString = '';
65 |
66 | for (var key in tableObj) {
67 | this.tableElements[key] = key;
68 | inputString += key + ' ';
69 | inputString += _DataTypes[tableObj[key][0]];
70 | if (Array.isArray(tableObj[key]) && tableObj[key].length > 1) {
71 | for (var i = 1, count = tableObj[key].length; i < count; i++) {
72 | item = tableObj[key][i];
73 | if (typeof item === 'object') {
74 | subKey = Object.keys(item);
75 | valOperator = _TableConstraints[subKey];
76 | inputString += ' ' + valOperator + item[subKey];
77 | } else {
78 | inputString += ' ' + _TableConstraints[item];
79 | }
80 | }
81 | }
82 | inputString += ', ';
83 | }
84 | // check to see if id already provided
85 | if (inputString.indexOf('id') === -1) {
86 | startString += 'id serial primary key,';
87 | }
88 |
89 | this.inputString = startString + inputString + " createdat Date); ";
90 | this.prevFunc = 'CREATE TABLE';
91 | alasql(this.inputString);
92 | this.clearAll();
93 | return this;
94 | };
95 |
96 | miniSQL.prototype.dropTable = function() {
97 | this.inputString = 'DROP TABLE IF EXISTS ' + this.table + ' CASCADE;';
98 | this.prevFunc = 'DROP TABLE';
99 | return this;
100 | };
101 |
102 | miniSQL.prototype.insert = function(serverInserts, clientInserts) {
103 | // server
104 | if(serverInserts['id'] === undefined){
105 | serverInserts['id'] = -1;
106 | }
107 | // client
108 | this.dataArray2 = [];
109 | var insertString2 = 'INSERT INTO ' + this.table + ' (';
110 | var valueString2 = ') VALUES (';
111 | for (var key2 in clientInserts) {
112 | insertString2 += key2 + ', ';
113 | this.dataArray2.push(clientInserts[key2]);
114 | valueString2 += '?, ';
115 | }
116 | for (var key3 in serverInserts) {
117 | insertString2 += key3 + ', ';
118 | this.dataArray2.push(serverInserts[key3]);
119 | valueString2 += '?, ';
120 | }
121 | this.server = true;
122 | this.inputString2 = insertString2.substring(0, insertString2.length - 2) + valueString2.substring(0, valueString2.length - 2) + ');';
123 |
124 |
125 | this.dataArray = [];
126 | if (serverInserts['id'] === -1){
127 | delete serverInserts['id'];
128 | }
129 | var insertString = 'INSERT INTO ' + this.table + ' (';
130 | var valueString = ') VALUES (', j = 1;
131 | for (var key in serverInserts) {
132 | insertString += key + ', '; // field
133 | this.dataArray.push(serverInserts[key]); // data
134 | valueString += '$' + j++ + ', '; // $1, $2, etc
135 | }
136 |
137 | this.inputString = insertString.substring(0, insertString.length - 2) + valueString.substring(0, valueString.length - 2) + ');';
138 |
139 |
140 |
141 | this.prevFunc = 'INSERT';
142 | return this;
143 | };
144 |
145 | miniSQL.prototype.update = function(updates) {
146 | this.updateString = 'UPDATE ' + this.table + ' SET ';
147 | for (var key in updates) {
148 | if (typeof updates[key] === 'number' && !isNaN(updates[key]) || typeof(updates[key]) === "boolean"){
149 | this.updateString += key + ' = ' + updates[key] + ', ';
150 | }
151 | else {
152 | this.updateString += key + ' = "' + updates[key] + '", ';
153 | }
154 | }
155 | this.updateString = this.updateString.substring(0,this.updateString.length-2);
156 | this.prevFunc = 'UPDATE';
157 | return this;
158 | };
159 |
160 | miniSQL.prototype.remove = function() {
161 | this.deleteString = 'DELETE FROM ' + this.table;
162 | this.prevFunc = 'DELETE';
163 | return this;
164 | };
165 |
166 | miniSQL.prototype.select = function(/*arguments*/) {
167 | var args = '';
168 | if (arguments.length >= 1) {
169 | for (var i = 0; i < arguments.length; i++) {
170 | if (arguments[i] === 'distinct') {
171 | args += 'DISTINCT ';
172 | } else {
173 | args += arguments[i] + ', ';
174 | }
175 | }
176 | args = args.substring(0, args.length - 2);
177 | } else {
178 | args += '*';
179 | }
180 | this.selectString = 'SELECT ' + args + ' FROM ' + this.table + " ";
181 | this.prevFunc = 'SELECT';
182 | return this;
183 | };
184 |
185 | miniSQL.prototype.findOne = function(/*arguments*/) {
186 | if (arguments.length === 2) {
187 | this.inputString = 'SELECT * FROM ' + this.table + ' WHERE ' + this.table + '.id = ' + args + ' LIMIT 1;';
188 | } else {
189 | this.inputString = 'SELECT * FROM ' + this.table + ' LIMIT 1';
190 | }
191 | this.prevFunc = 'FIND ONE';
192 | return this;
193 | };
194 |
195 | miniSQL.prototype.join = function(joinType, fields, joinTable) {
196 | if (Array.isArray(joinType)) {
197 | for (var x = 0, count = fields.length; x < count; x++) {
198 | this.joinString = " " + joinType[x] + " " + joinTable[x][0] + " ON " + this.table + "." + fields[x] + " = " + joinTable[x][0] + "." + joinTable[x][1];
199 | }
200 | } else {
201 | this.joinString = " " + joinType + " " + joinTable + " ON " + this.table + "." + fields + " = " + joinTable + "." + joinTable;
202 | }
203 | this.prevFunc = "JOIN";
204 | return this;
205 | };
206 |
207 | miniSQL.prototype.where = function(/*Arguments*/) {
208 |
209 | this.dataArray = [];
210 | this.dataArray2 = [];
211 | var where = '', redux, substring1, substring2;
212 |
213 | where += arguments[0];
214 | // replace ? with rest of array
215 | for (var i = 1, count = arguments.length; i < count; i++) {
216 | if (Array.isArray(arguments[i])) {
217 | if (arguments[i].length === 0) {
218 | throw new Error('Invalid input: array is empty');
219 | }
220 | redux = where.indexOf('?');
221 | substring1 = where.substring(0, redux);
222 | substring2 = where.substring(redux + 1, where.length);
223 | where = substring1 + 'ANY($' + i + ')'+ substring2;
224 | this.dataArray.push(arguments[i]);
225 | } else {
226 | redux = where.indexOf('?');
227 | substring1 = where.substring(0, redux);
228 | substring2 = where.substring(redux + 1, where.length);
229 | where = substring1 + '$' + i + substring2;
230 | this.dataArray.push(arguments[i]);
231 | }
232 | }
233 | this.serverWhereString = ' WHERE ' + where;
234 |
235 | where = '';
236 | where += arguments[0];
237 | for (var i = 1, count = arguments.length; i < count; i++) {
238 | if (Array.isArray(arguments[i])) {
239 | redux = where.indexOf('?');
240 | substring1 = where.substring(0, redux);
241 | substring2 = where.substring(redux + 1, where.length);
242 | where = substring1 + 'IN (' + arguments[i].join(',') + ')' + substring2;
243 | } else {
244 | this.dataArray2.push(arguments[i]);
245 | }
246 | }
247 | this.clientWhereString = ' WHERE ' + where;
248 |
249 | return this;
250 | };
251 |
252 | miniSQL.prototype.order = function(/*arguments*/) {
253 |
254 | var args = '';
255 | if (arguments.length > 1) {
256 | for (var i = 0; i < arguments.length; i++) {
257 | args += arguments[i] + ', ';
258 | }
259 | args = args.substring(0, args.length - 2);
260 | } else {
261 | args = arguments[0];
262 | }
263 | this.orderString = ' ORDER BY ' + args;
264 | return this;
265 | };
266 |
267 | miniSQL.prototype.limit = function(limit) {
268 | this.limitString = ' LIMIT ' + limit;
269 | return this;
270 | };
271 |
272 | miniSQL.prototype.offset = function(offset) {
273 | this.offsetString = ' OFFSET ' + offset;
274 | return this;
275 | };
276 |
277 | miniSQL.prototype.group = function(group) {
278 | this.groupString = 'GROUP BY ' + group;
279 | return this;
280 | };
281 |
282 | miniSQL.prototype.first = function(limit) {
283 | limit = limit || 1;
284 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id ASC LIMIT ' + limit + ';';
285 | this.prevFunc = 'FIRST';
286 | return this;
287 | };
288 |
289 | miniSQL.prototype.last = function(limit) {
290 | limit = limit || 1;
291 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id DESC LIMIT ' + limit + ';';
292 | this.prevFunc = 'LAST';
293 | return this;
294 | };
295 |
296 | miniSQL.prototype.take = function(limit) {
297 | limit = limit || 1;
298 | this.inputString += 'SELECT * FROM ' + this.table + ' LIMIT ' + limit + ';';
299 | this.prevFunc = 'TAKE';
300 | return this;
301 | };
302 |
303 | miniSQL.prototype.clearAll = function() {
304 | this.inputString = '';
305 | this.inputString2 = '';
306 | this.autoSelectData = '';
307 | this.autoSelectInput = '';
308 |
309 | // statement starters
310 | this.selectString = '';
311 | this.updateString = '';
312 | this.deleteString = '';
313 |
314 | // chaining statements
315 | this.joinString = '';
316 | this.whereString = '';
317 | this.clientWhereString = '';
318 | this.serverWhereString = '';
319 |
320 | // caboose statements
321 | this.orderString = '';
322 | this.limitString = '';
323 | this.offsetString = '';
324 | this.groupString = '';
325 | this.havingString = '';
326 |
327 | this.dataArray = [];
328 | this.dataArray2 = [];
329 | this.server = null;
330 |
331 | // error logging
332 | this.prevFunc = '';
333 | };
334 |
335 | miniSQL.prototype.fetch = function(server) {
336 |
337 | this.reactiveData.depend();
338 |
339 | var dataArray = this.dataArray;
340 | var starter = this.updateString || this.deleteString || this.selectString;
341 |
342 | var input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.clientWhereString + this.orderString + this.limitString +
343 | this.offsetString + this.groupString + this.havingString + ';';
344 |
345 |
346 | var result = alasql(input, dataArray);
347 |
348 | var name = this.table + 'fetch';
349 | if (server === "server") {
350 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.serverWhereString + this.orderString + this.limitString +
351 | this.offsetString + this.groupString + this.havingString + ';';
352 | Meteor.call(this.fetchMethod, input, dataArray);
353 | }
354 | this.clearAll();
355 | return result;
356 | };
357 |
358 | miniSQL.prototype.save = function(client) {
359 |
360 | var dataArray = this.dataArray;
361 | var dataArray2 = this.dataArray2;
362 | var starter = this.updateString || this.deleteString || this.selectString;
363 | var input = this.inputString2.length > 0 ? this.inputString2 : starter + this.joinString + this.clientWhereString + ';';
364 |
365 | var result = alasql(input, dataArray2);
366 | // postgres
367 | var name = this.table + 'save';
368 | if (client !== "client") {
369 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.serverWhereString + ';';
370 | this.unvalidated = true;
371 | Meteor.call(this.saveMethod, input, dataArray);
372 | }
373 | this.reactiveData.changed();
374 |
375 | this.clearAll();
376 | return result;
377 | };
--------------------------------------------------------------------------------
/packages/meteor-postgres/postgres/serversql.js:
--------------------------------------------------------------------------------
1 | pg = Npm.require('pg'); // Node-Postgres
2 | var clientHolder = {};
3 |
4 | function removeListeningConnections(){
5 | for (var key in clientHolder) {
6 | clientHolder[key].end();
7 | }
8 | }
9 |
10 | process.on('exit', removeListeningConnections);
11 | _.each(['SIGINT', 'SIGHUP', 'SIGTERM'], function (sig) {
12 | process.once(sig, function () {
13 | removeListeningConnections();
14 | process.kill(process.pid, sig);
15 | });
16 | });
17 |
18 | /**
19 | * @param Collection
20 | * @constructor
21 | */
22 | serverSQL = function (Collection) {
23 |
24 | Collection = Collection || Object.create(serverSQL.prototype);
25 | Collection.table = Collection.tableName;
26 |
27 | Collection.conString = process.env.MP_POSTGRES || process.env.DATABASE_URL;
28 | // inputString used by queries, overrides other strings
29 | // includes: create table, create relationship, drop table, insert
30 | Collection.inputString = '';
31 | Collection.autoSelectData = '';
32 | Collection.autoSelectInput = '';
33 |
34 | // statement starters
35 | Collection.selectString = '';
36 | Collection.updateString = '';
37 | Collection.deleteString = '';
38 |
39 | // chaining statements
40 | Collection.joinString = '';
41 | Collection.whereString = '';
42 |
43 | // caboose statements
44 | Collection.orderString = '';
45 | Collection.limitString = '';
46 | Collection.offsetString = '';
47 | Collection.groupString = '';
48 | Collection.havingString = '';
49 |
50 | Collection.dataArray = [];
51 |
52 | // error logging
53 | Collection.prevFunc = '';
54 | return Collection;
55 | };
56 |
57 | /**
58 | * Data Types
59 | * @type {{$number: string, $string: string, $json: string, $datetime: string, $float: string, $seq: string, $bool: string}}
60 | * @private
61 | */
62 | serverSQL.prototype._DataTypes = {
63 | $number: 'integer',
64 | $string: 'varchar(255)',
65 | $json: 'json',
66 | $datetime: 'date',
67 | $float: 'decimal',
68 | $seq: 'serial',
69 | $bool: 'boolean'
70 | };
71 |
72 | /**
73 | * Table Constraints
74 | * @type {{$unique: string, $check: string, $exclude: string, $notnull: string, $default: string, $primary: string}}
75 | * @private
76 | */
77 | serverSQL.prototype._TableConstraints = {
78 | $unique: 'unique',
79 | $check: 'check ', // value
80 | $exclude: 'exclude',
81 | $notnull: 'not null',
82 | $default: 'default ', // value
83 | $primary: 'primary key'
84 | };
85 |
86 | /**
87 | * SQL: CREATE TABLE field data_type constraint
88 | * Notes: Required for all SQL Collections, must use prescribed data types and table constraints
89 | * Type: Query
90 | * @param tableObj
91 | */
92 | serverSQL.prototype.createTable = function (tableObj) {
93 |
94 | var startString = 'CREATE TABLE ' + this.table + ' (';
95 | var item, subKey, valOperator, inputString = '';
96 |
97 | for (var key in tableObj) {
98 | inputString += key + ' ';
99 | inputString += this._DataTypes[tableObj[key][0]];
100 | if (Array.isArray(tableObj[key]) && tableObj[key].length > 1) {
101 | for (var i = 1, count = tableObj[key].length; i < count; i++) {
102 | item = tableObj[key][i];
103 | if (typeof item === 'object') {
104 | subKey = Object.keys(item);
105 | valOperator = this._TableConstraints[subKey];
106 | inputString += ' ' + valOperator + item[subKey];
107 | } else {
108 | inputString += ' ' + this._TableConstraints[item];
109 | }
110 | }
111 | }
112 | inputString += ', ';
113 | }
114 | // check to see if id already provided
115 | if (inputString.indexOf('id') === -1) {
116 | startString += 'id serial primary key,';
117 | }
118 |
119 | this.inputString = startString + inputString + " createdat TIMESTAMP default now()); " +
120 | "CREATE OR REPLACE FUNCTION notify_trigger_" + this.table + "() RETURNS trigger AS $$" +
121 | "BEGIN" +
122 | " IF (TG_OP = 'DELETE') THEN " +
123 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || OLD.id || '}, { operation: " +
124 | "\"' || TG_OP || '\"}]');" +
125 | "RETURN old;" +
126 | "ELSIF (TG_OP = 'INSERT') THEN " +
127 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || NEW.id || '}, { operation: " +
128 | "\"' || TG_OP || '\"}]');" +
129 | "RETURN new; " +
130 | "ELSIF (TG_OP = 'UPDATE') THEN " +
131 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || NEW.id || '}, { operation: " +
132 | "\"' || TG_OP || '\"}]');" +
133 | "RETURN new; " +
134 | "END IF; " +
135 | "END; " +
136 | "$$ LANGUAGE plpgsql; " +
137 | "CREATE TRIGGER watched_table_trigger AFTER INSERT OR DELETE OR UPDATE ON " + this.table +
138 | " FOR EACH ROW EXECUTE PROCEDURE notify_trigger_" + this.table + "();";
139 |
140 | this.prevFunc = 'CREATE TABLE';
141 | return this;
142 | };
143 |
144 | /**
145 | * Notes: Deletes cascade
146 | * SQL: DROP TABLE
147 | */
148 | serverSQL.prototype.dropTable = function () {
149 | this.inputString = 'DROP TABLE IF EXISTS ' + this.table + ' CASCADE; DROP FUNCTION IF EXISTS notify_trigger_' + this.table + '() CASCADE;';
150 | this.prevFunc = 'DROP TABLE';
151 | return this;
152 | };
153 |
154 | /**
155 | * SQL: INSERT INTO () VALUES ()
156 | * Type: Query
157 | * @param insertObj
158 | */
159 | serverSQL.prototype.insert = function (insertObj) {
160 | var valueString = ') VALUES (', keys = Object.keys(insertObj);
161 | var insertString = 'INSERT INTO ' + this.table + ' (';
162 | this.dataArray = [];
163 | // iterate through array arguments to populate input string parts
164 | for (var i = 0, count = keys.length; i < count;) {
165 | insertString += keys[i] + ', ';
166 | this.dataArray.push(insertObj[keys[i]]);
167 | valueString += '$' + (++i) + ', ';
168 | }
169 | this.inputString = insertString.substring(0, insertString.length - 2) + valueString.substring(0, valueString.length - 2) + ');';
170 | this.prevFunc = 'INSERT';
171 | return this;
172 | };
173 |
174 | /**
175 | * SQL: UPDATE SET () = ()
176 | * Type: Statement Starter
177 | * @param {object} updatesObj
178 | * @param {string} updatesObj Key (Field)
179 | * @param {string} updatesObj Value (Data)
180 | */
181 | serverSQL.prototype.update = function (updatesObj) {
182 | var updateField = '(', updateValue = '(', keys = Object.keys(updatesObj);
183 | if (keys.length > 1) {
184 | for (var i = 0, count = keys.length - 1; i < count; i++) {
185 | updateField += keys[i] + ', ';
186 | updateValue += "'" + updatesObj[keys[i]] + "', ";
187 | }
188 | updateField += keys[keys.length - 1];
189 | updateValue += "'" + updatesObj[keys[keys.length - 1]] + "'";
190 | } else {
191 | updateField += keys[0];
192 | updateValue += "'" + updatesObj[keys[0]] + "'";
193 | }
194 | this.updateString = 'UPDATE ' + this.table + ' SET ' + updateField + ') = ' + updateValue + ')';
195 | this.prevFunc = 'UPDATE';
196 | return this;
197 | };
198 |
199 | /**
200 | * SQL: DELETE FROM table
201 | * Type: Statement Starter
202 | * Notes: If not chained with where it will remove all rows
203 | */
204 | serverSQL.prototype.remove = function () {
205 | this.deleteString = 'DELETE FROM ' + this.table;
206 | this.prevFunc = 'DELETE';
207 | return this;
208 | };
209 |
210 | // Parameters: fields (arguments, optional)
211 | // SQL: SELECT fields FROM table, SELECT * FROM table
212 | // Special: May pass table, distinct, field to obtain a single record per unique value
213 | // STATEMENT STARTER/SELECT STRING
214 | /**
215 | * SQL: SELECT fields FROM table, SELECT * FROM table
216 | * Type: Statement Starter
217 | * Notes: May pass distinct, field (two separate arguments) to obtain a single record per unique value
218 | * @param {string} [arguments]
219 | * fields to select
220 | */
221 | serverSQL.prototype.select = function (/*arguments*/) {
222 | var args = '';
223 | if (arguments.length >= 1) {
224 | for (var i = 0; i < arguments.length; i++) {
225 | if (arguments[i] === 'distinct') {
226 | args += 'DISTINCT ';
227 | } else {
228 | args += arguments[i] + ', ';
229 | }
230 | }
231 | args = args.substring(0, args.length - 2);
232 | } else {
233 | args += '*';
234 | }
235 | this.selectString = 'SELECT ' + args + ' FROM ' + this.table + " ";
236 | this.prevFunc = 'SELECT';
237 | return this;
238 | };
239 |
240 | /**
241 | * SQL: SELECT * FROM table WHERE table.id = id LIMIT 1; SELECT * FROM table LIMIT 1;
242 | * Notes: If no id is passed will return random
243 | * Type: Query
244 | * @param {number} [id]
245 | */
246 | serverSQL.prototype.findOne = function (/*arguments*/) {
247 | if (arguments.length === 1) {
248 | var args = arguments[0];
249 | this.inputString = 'SELECT * FROM ' + this.table + ' WHERE ' + this.table + '.id = ' + args + ' LIMIT 1;';
250 | } else {
251 | this.inputString = 'SELECT * FROM ' + this.table + ' LIMIT 1';
252 | }
253 | this.prevFunc = 'FIND ONE';
254 | return this;
255 | };
256 |
257 | /**
258 | * SQL: JOIN joinTable ON field = field
259 | * Type: Statement
260 | * Notes: Parameters can also be all arrays
261 | * @param {String} joinType
262 | * @param {String} fields
263 | * @param {String} joinTable
264 | */
265 | serverSQL.prototype.join = function (joinType, fields, joinTable) {
266 | if (Array.isArray(joinType)) {
267 | for (var x = 0, count = fields.length; x < count; x++){
268 | this.joinString = " " + joinType[x] + " " + joinTable[x][0] + " ON " + this.table + "." + fields[x] + " = " + joinTable[x][0] + "." + joinTable[x][1];
269 | }
270 | } else {
271 | this.joinString = " " + joinType + " " + joinTable + " ON " + this.table + "." + fields + " = " + joinTable + "." + joinTable;
272 | }
273 | this.prevFunc = "JOIN";
274 | return this;
275 | };
276 |
277 | /**
278 | * SQL: WHERE field operator comparator, WHERE field1 operator1 comparator1 AND/OR field2 operator2 comparator2, WHERE field IN (x, y)
279 | * Type: Statement
280 | * Notes:
281 | * @param {string} directions
282 | * condition with ?'s for values
283 | * @param {string} values
284 | * values to be used
285 | */
286 | serverSQL.prototype.where = function (/*Arguments*/) {
287 | this.dataArray = [];
288 | var where = '', redux, substring1, substring2;
289 | where += arguments[0];
290 | for (var i = 1, count = arguments.length; i < count; i++) {
291 | if (Array.isArray(arguments[i])) {
292 | if (arguments[i].length === 0) {
293 | throw new Error('Invalid input: array is empty');
294 | }
295 | redux = where.indexOf('?');
296 | substring1 = where.substring(0, redux);
297 | substring2 = where.substring(redux + 1, where.length);
298 | where = substring1 + 'ANY($' + i + ')'+ substring2;
299 | this.dataArray.push(arguments[i]);
300 | } else {
301 | redux = where.indexOf('?');
302 | substring1 = where.substring(0, redux);
303 | substring2 = where.substring(redux + 1, where.length);
304 | where = substring1 + '$' + i + substring2;
305 | this.dataArray.push(arguments[i]);
306 | }
307 | }
308 | this.whereString = ' WHERE ' + where;
309 | return this;
310 | };
311 |
312 | /**
313 | * SQL: ORDER BY fields
314 | * Notes: ASC is default, add DESC after the field name to reverse
315 | * Type: Caboose
316 | * @param {string} fields
317 | */
318 | serverSQL.prototype.order = function (/*arguments*/) {
319 | var args = '';
320 | if (arguments.length > 1) {
321 | for (var i = 0; i < arguments.length; i++) {
322 | args += arguments[i] + ', ';
323 | }
324 | args = args.substring(0, args.length - 2);
325 | } else {
326 | args = arguments[0];
327 | }
328 | this.orderString = ' ORDER BY ' + args;
329 | return this;
330 | };
331 |
332 | /**
333 | * SQL: LIMIT number
334 | * Type: Caboose
335 | * @param {number} limit
336 | */
337 | serverSQL.prototype.limit = function (limit) {
338 | this.limitString = ' LIMIT ' + limit;
339 | return this;
340 | };
341 |
342 | /**
343 | * SQL: OFFSET number
344 | * Type: Caboose
345 | * @param {number} offset
346 | */
347 | serverSQL.prototype.offset = function (offset) {
348 | this.offsetString = ' OFFSET ' + offset;
349 | return this;
350 | };
351 |
352 | /**
353 | * SQL: GROUP BY field
354 | * Type: Caboose
355 | * @param {string} group
356 | */
357 | serverSQL.prototype.group = function (group) {
358 | this.groupString = 'GROUP BY ' + group;
359 | return this;
360 | };
361 |
362 | // TODO: HAVING
363 |
364 | /**
365 | * SQL: SELECT * FROM table ORDER BY table.id ASC LIMIT 1, SELECT * FROM table ORDER BY table.id ASC LIMIT limit
366 | * Type: Query
367 | * @param limit
368 | */
369 | serverSQL.prototype.first = function (limit) {
370 | limit = limit || 1;
371 | this.clearAll();
372 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id ASC LIMIT ' + limit + ';';
373 | this.prevFunc = 'FIRST';
374 | return this;
375 | };
376 |
377 | /**
378 | * SQL: SELECT * FROM table ORDER BY table.id DESC LIMIT 1, SELECT * FROM table ORDER BY table.id DESC LIMIT limit
379 | * Type: Query
380 | * @param {number} limit
381 | */
382 | serverSQL.prototype.last = function (limit) {
383 | limit = limit || 1;
384 | this.clearAll();
385 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id DESC LIMIT ' + limit + ';';
386 | this.prevFunc = 'LAST';
387 | return this;
388 | };
389 |
390 | /**
391 | * SQL: SELECT * FROM table LIMIT 1, SELECT * FROM table LIMIT limit
392 | * Type: Query
393 | * @param {number} limit
394 | * Defaults to 1
395 | */
396 | serverSQL.prototype.take = function (limit) {
397 | limit = limit || 1;
398 | this.clearAll();
399 | this.inputString += 'SELECT * FROM ' + this.table + ' LIMIT ' + limit + ';';
400 | this.prevFunc = 'TAKE';
401 | return this;
402 | };
403 |
404 | /**
405 | * Type: Data method
406 | * @param {string} input
407 | * @param {array} data
408 | * @param {function} cb
409 | */
410 | serverSQL.prototype.fetch = function (input, data, cb) {
411 | var table = this.table;
412 | var dataArray = data || this.dataArray;
413 | var prevFunc = this.prevFunc;
414 |
415 | var starter = this.updateString || this.deleteString || this.selectString;
416 |
417 | if (!input) {
418 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + this.orderString + this.limitString +
419 | this.offsetString + this.groupString + this.havingString + ';';
420 | }
421 |
422 | //cb = cb || function(prevFunc, table, results) {return console.log("results in " + prevFunc + ' ' + table, results.rows)};
423 | pg.connect(this.conString, function (err, client, done) {
424 | if (err) {
425 | console.log(err, "in " + prevFunc + ' ' + table);
426 | console.log('Input Statement: ', input);
427 | }
428 | client.query(input, dataArray, function (error, results) {
429 | if (cb) { cb(error, results); }
430 | done();
431 | });
432 | });
433 | this.clearAll();
434 | };
435 |
436 | /**
437 | * Type: Data method
438 | * @param {string} input
439 | * @param {array} data
440 | * @param {function} cb
441 | */
442 | serverSQL.prototype.save = function (input, data, cb) {
443 |
444 | var table = this.table;
445 | var dataArray = data || this.dataArray;
446 | var prevFunc = this.prevFunc;
447 |
448 | var starter = this.updateString || this.deleteString || this.selectString;
449 |
450 | if (!input) {
451 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + ';';
452 | }
453 |
454 | pg.connect(this.conString, function (err, client, done) {
455 | if (err) {
456 | console.log(err, "in " + prevFunc + ' ' + table);
457 | console.log('Input Statement: ', input);
458 | }
459 | client.query(input, dataArray, function (error, results) {
460 | if (cb) { cb(error, results); }
461 | });
462 | done();
463 | });
464 | this.clearAll();
465 | };
466 |
467 | /**
468 | * Type: Maintenance
469 | */
470 | serverSQL.prototype.clearAll = function() {
471 | this.inputString = '';
472 | this.autoSelectData = '';
473 | this.autoSelectInput = '';
474 |
475 | // statement starters
476 | this.selectString = '';
477 | this.updateString = '';
478 | this.deleteString = '';
479 |
480 | // chaining statements
481 | this.joinString = '';
482 | this.whereString = '';
483 |
484 | // caboose statements
485 | this.orderString = '';
486 | this.limitString = '';
487 | this.offsetString = '';
488 | this.groupString = '';
489 | this.havingString = '';
490 |
491 | this.dataArray = [];
492 |
493 | // error logging
494 | this.prevFunc = '';
495 | };
496 |
497 | /**
498 | * Type: Query
499 | * @param {string} relTable
500 | * @param {string} relationship
501 | */
502 | serverSQL.prototype.createRelationship = function(relTable, relationship){
503 | if (relationship === "$onetomany"){
504 | this.inputString = "ALTER TABLE " + this.table + " ADD " + relTable +
505 | "id INTEGER references " + relTable + "(id) ON DELETE CASCADE;";
506 | }
507 | else {
508 | this.inputString = "CREATE TABLE IF NOT EXISTS" +
509 | this.table + relTable + " (" + this.table + "id integer references " + this.table + "(id) ON DELETE CASCADE, " +
510 | relTable + "id integer references " + relTable + "(id) ON DELETE CASCADE, " +
511 | "PRIMARY KEY(" + this.table + "id, " + relTable + "id)); ";
512 | }
513 | return this;
514 | };
515 |
516 | /**
517 | *
518 | * @returns {string|*|string} input string
519 | */
520 | serverSQL.prototype.returnSql = function(){
521 | var table = this.table;
522 | var dataArray = this.dataArray;
523 | var prevFunc = this.prevFunc;
524 |
525 | var starter = this.updateString || this.deleteString || this.selectString;
526 |
527 | var input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + this.orderString + this.limitString +
528 | this.offsetString + this.groupString + this.havingString + ';';
529 |
530 | return input;
531 | };
532 |
533 | /**
534 | *
535 | * @param sub
536 | */
537 | serverSQL.prototype.autoSelect = function(sub) {
538 |
539 | // We need a dedicated client to watch for changes on each table. We store these clients in
540 | // our clientHolder and only create a new one if one does not already exist
541 | var table = this.table;
542 | var prevFunc = this.prevFunc;
543 | var newWhere = this.whereString;
544 | var newSelect = newSelect || this.selectString;
545 | var newJoin = newJoin || this.joinString;
546 |
547 | this.autoSelectInput = this.autoSelectInput !== "" ? this.autoSelectInput : this.selectString + this.joinString + newWhere + this.orderString + this.limitString + ';';
548 | this.autoSelectData = this.autoSelectData !== "" ? this.autoSelectData : this.dataArray;
549 | var value = this.autoSelectInput;
550 | this.clearAll();
551 |
552 |
553 | var loadAutoSelectClient = function(name, cb){
554 | // Function to load a new client, store it, and then send it to the function to add the watcher
555 | var context = this;
556 | var client = new pg.Client(process.env.MP_POSTGRES);
557 | client.connect();
558 | clientHolder[name] = client;
559 | cb(client);
560 | };
561 |
562 | var autoSelectHelper = function(client1){
563 | // Selecting all from the table
564 | client1.query(value, function(error, results) {
565 | if (error) {
566 | console.log(error, "in autoSelect top")
567 | } else {
568 | sub._session.send({
569 | msg: 'added',
570 | collection: sub._name,
571 | id: sub._subscriptionId,
572 | fields: {
573 | reset: false,
574 | results: results.rows
575 | }
576 | });
577 | }
578 | });
579 | // Adding notification triggers
580 | var query = client1.query("LISTEN notify_trigger_" + table);
581 | client1.on('notification', function(msg) {
582 | var returnMsg = eval("(" + msg.payload + ")");
583 | var k = sub._name;
584 | if (returnMsg[1].operation === "DELETE") {
585 | var tableId = parseInt(returnMsg[0][k]);
586 | sub._session.send({
587 | msg: 'changed',
588 | collection: sub._name,
589 | id: sub._subscriptionId,
590 | index: tableId,
591 | fields: {
592 | removed: true,
593 | reset: false,
594 | tableId:tableId
595 | }
596 | });
597 | }
598 | else if (returnMsg[1].operation === "UPDATE") {
599 | var selectString = newSelect + newJoin + " WHERE " + table + ".id = " + returnMsg[0][table];
600 | pg.connect(process.env.MP_POSTGRES, function (err, client, done) {
601 | if (err) {
602 | console.log(err, "in " + prevFunc + ' ' + table);
603 | }
604 | client.query(selectString, this.autoSelectData, function(error, results) {
605 | if (error) {
606 | console.log(error, "in autoSelect update");
607 | } else {
608 | done();
609 | sub._session.send({
610 | msg: 'changed',
611 | collection: sub._name,
612 | id: sub._subscriptionId,
613 | index: tableId,
614 | fields: {
615 | modified: true,
616 | removed: false,
617 | reset: false,
618 | results: results.rows[0]
619 | }
620 | });
621 | }
622 | });
623 | });
624 | }
625 | else if (returnMsg[1].operation === "INSERT") {
626 | var selectString = newSelect + newJoin + " WHERE " + table + ".id = " + returnMsg[0][table];
627 | pg.connect(process.env.MP_POSTGRES, function (err, client, done) {
628 | if (err) {
629 | console.log(err, "in " + prevFunc + ' ' + table);
630 | }
631 | client.query(selectString, this.autoSelectData, function(error, results) {
632 | if (error) {
633 | } else {
634 | done();
635 | sub._session.send({
636 | msg: 'changed',
637 | collection: sub._name,
638 | id: sub._subscriptionId,
639 | fields: {
640 | removed: false,
641 | reset: false,
642 | results: results.rows[0]
643 | }
644 | });
645 | }
646 | });
647 | });
648 | }
649 | });
650 | };
651 |
652 | // Checking to see if this table already has a dedicated client before adding the listener
653 | if(clientHolder[table]){
654 | autoSelectHelper(clientHolder[table]);
655 | } else{
656 | loadAutoSelectClient(table, autoSelectHelper);
657 | }
658 |
659 | };
660 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/minisql/alasql.js.map:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "file": "alasql.js",
4 | "sources": [
5 | "src/10start.js",
6 | "src/alasqlparser.js",
7 | "src/12pretty.js",
8 | "src/15utility.js",
9 | "src/16comments.js",
10 | "src/17alasql.js",
11 | "src/20database.js",
12 | "src/21transaction.js",
13 | "src/23table.js",
14 | "src/24view.js",
15 | "src/25queryclass.js",
16 | "src/28yy.js",
17 | "src/30statements.js",
18 | "src/38query.js",
19 | "src/39dojoin.js",
20 | "src/40select.js",
21 | "src/41exists.js",
22 | "src/420from.js",
23 | "src/421join.js",
24 | "src/422where.js",
25 | "src/423groupby.js",
26 | "src/424select.js",
27 | "src/425having.js",
28 | "src/426orderby.js",
29 | "src/43rollup.js",
30 | "src/44defcols.js",
31 | "src/45union.js",
32 | "src/46apply.js",
33 | "src/47over.js",
34 | "src/50expression.js",
35 | "src/52linq.js",
36 | "src/55functions.js",
37 | "src/56datetime.js",
38 | "src/57case.js",
39 | "src/58json.js",
40 | "src/59convert.js",
41 | "src/60createtable.js",
42 | "src/61date.js",
43 | "src/62droptable.js",
44 | "src/64altertable.js",
45 | "src/65createindex.js",
46 | "src/66dropindex.js",
47 | "src/67withselect.js",
48 | "src/68if.js",
49 | "src/69while.js",
50 | "src/70insert.js",
51 | "src/72delete.js",
52 | "src/74update.js",
53 | "src/75merge.js",
54 | "src/76usedatabase.js",
55 | "src/77declare.js",
56 | "src/78show.js",
57 | "src/79set.js",
58 | "src/80console.js",
59 | "src/81commit.js",
60 | "src/83into.js",
61 | "src/84from.js",
62 | "src/85help.js",
63 | "src/86print.js",
64 | "src/87source.js",
65 | "src/88require.js",
66 | "src/89assert.js",
67 | "src/90websql.js",
68 | "src/91indexeddb.js",
69 | "src/92localstorage.js",
70 | "src/93sqlite.js",
71 | "src/94filestorage.js",
72 | "src/97saveas.js",
73 | "src/FileSaver.js",
74 | "src/98finish.js",
75 | "src/99worker.js"
76 | ],
77 | "names": [],
78 | "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1sBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5pBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpSA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"
79 | }
--------------------------------------------------------------------------------